白話MyCat——MyCat部署執行(Linux環境)與使用步驟詳解

工程師WWW發表於2016-08-16

MyCAT 可以視為“MySQL”叢集的企業級資料庫,用來替代昂貴的Oracle叢集,其背後是阿里曾經開源的知名產品Cobar。MyCAT的目標是:低成本的將現有的單機資料庫和應用平滑遷移到“雲”端,解決資料儲存和業務規模迅速增長情況下的資料瓶頸問題。

一、部署步驟詳解

  (1) 用命令列工具或圖形化客戶端,連線MYSQL,建立DEMO所用三個分片資料庫;
 CREATE database db1;
 CREATE database db2;
 CREATE database db3;

  (2) 修改my.inf新增以下語句,my.inf 一般會放在/etc/my.cnf 或 /etc/mysql/my.cnf,設定為Mysql大小寫不敏感,否則可能會發生表找不到的問題。
 lower_case_table_names = 1

  (3) 解壓Mycat-server-1.3.0.2-20150105144205-linux.tar.gz 到/usr/local/mycat

  (4) 解壓jdk-7u65-linux-i586.gz,拷貝jdk1.7.0_65 到/usr/local/mycat/

  (5) 修改/usr/local/conf/wrap.conf 修改wrapper.java.command=java為上一步存放路徑
 wrapper.java.command=/usr/local/mycat/jdk1.7.0/bin/java

  (6) 建立mycat 使用者,改變目錄許可權為mycat
 useradd mycat
 chown -R mycat.mycat /usr/local/mycat

  (7) 修改使用者密碼
 passwd mycat
 輸入:

  (8) 修改/usr/local/conf/schema.xml,URL、使用者名稱、密碼修改,其餘不變
 <writeHost host="hostM1" url="10.1.176.104:3306" user="root"
                        password="www.com.workssys">

二、執行步驟詳解

  (1) 進入 /usr/local/mycat/bin (預設資料埠為8066,管理埠為9066)
 執行./mycat start

  (2) 進入logs目錄,檢視日誌,如果wrapper.log 報錯 java.net.BindException: Address already in use 殺掉正在執行的相關java程式
 ps -ef|grep java
 kill -9 xxx

三、使用步驟詳解
  (1) 進入mysql bin目錄/usr/local/mysql/bin/

  (2) 登入mysql 執行以下命令
 ./mysql -utest -ptest -h10.1.176.104 -P8066 -DTESTDB
 
 (mycat的使用者賬號和授權資訊是在conf/server.xml檔案中配置)

  (3) 表建立測試:
 
 mysql> create table employee (id int not null primary key,name varchar(100),sharding_id int not null);
 Query OK, 0 rows affected (0.30 sec)

 mysql> explain create table employee (id int not null primary key,name varchar(100),sharding_id int not null);
 +-----------+------------------------------------------------------------------------------------------------+
 | DATA_NODE | SQL                                                                                            |
 +-----------+------------------------------------------------------------------------------------------------+
 | dn1       | create table employee (id int not null primary key,name varchar(100),sharding_id int not null) | 
 | dn2       | create table employee (id int not null primary key,name varchar(100),sharding_id int not null) | 
 +-----------+------------------------------------------------------------------------------------------------+
 2 rows in set (0.04 sec)


  (4) 客戶端軟體使用:navicat

 建立mycat新連線:ip:10.1.176.104,使用者名稱:test,密碼:test,埠:8066
 可看到TESTDB資料庫下已建立表:employee

 開啟db1,db2 資料庫也可看到已建立表employee

  (5) 插入資料測試
 mysql> insert into employee(id,name,sharding_id) values(1,'leader us',10000);
 ERROR 2006 (HY000): MySQL server has gone away
 No connection. Trying to reconnect...
 Connection id:    6
 Current database: TESTDB

 Query OK, 1 row affected (0.03 sec)

 mysql> explain insert into employee(id,name,sharding_id) values(1,'leader us',10000);
 +-----------+-----------------------------------------------------------------------+
 | DATA_NODE | SQL                                                                   |
 +-----------+-----------------------------------------------------------------------+
 | dn1       | insert into employee(id,name,sharding_id) values(1,'leader us',10000) | 
 +-----------+-----------------------------------------------------------------------+
 1 row in set (0.00 sec)
 
  (6) 根據規則auto-sharding-long(主鍵範圍)進行分片測試
 mysql> explain create table company(id int not null primary key,name varchar(100));
 +-----------+---------------------------------------------------------------------+
 | DATA_NODE | SQL                                                                 |
 +-----------+---------------------------------------------------------------------+
 | dn1       | create table company(id int not null primary key,name varchar(100)) | 
 | dn2       | create table company(id int not null primary key,name varchar(100)) | 
 | dn3       | create table company(id int not null primary key,name varchar(100)) | 
 +-----------+---------------------------------------------------------------------+
 3 rows in set (0.01 sec)

  (7) 三個分片上都插入了3條資料
 mysql> explain insert into company(id,name) values(1,'hp');
 +-----------+---------------------------------------------+
 | DATA_NODE | SQL                                         |
 +-----------+---------------------------------------------+
 | dn1       | insert into company(id,name) values(1,'hp') | 
 | dn2       | insert into company(id,name) values(1,'hp') | 
 | dn3       | insert into company(id,name) values(1,'hp') | 
 +-----------+---------------------------------------------+
 3 rows in set (0.00 sec)

  (8) 確認是分片儲存
 
 mysql> select * from employee;
 +----+-----------+-------------+
 | id | name      | sharding_id |
 +----+-----------+-------------+
 |  2 | me        |       10010 | 
 |  4 | mydog     |       10010 | 
 |  1 | leader us |       10000 | 
 |  3 | mycat     |       10000 | 
 +----+-----------+-------------+
 4 rows in set (0.01 sec)

 mysql> explain select * from employee;
 +-----------+----------------------------------+
 | DATA_NODE | SQL                              |
 +-----------+----------------------------------+
 | dn1       | SELECT * FROM employee LIMIT 100 | 
 | dn2       | SELECT * FROM employee LIMIT 100 | 
 +-----------+----------------------------------+
 2 rows in set (0.00 sec)

相關文章