爲何要配置讀寫分離,我想我就不須要再贅述了,那麼在mycat下如何進行讀寫分離的配置,配置以後的實際效率又如何呢?我上午根據文檔搗鼓和測試了一下,這裏作一下記錄:mysql
最開始,咱們仍是要配置mysql自己的主從複製。sql
首先,配置主服務器:數據庫
1.編輯數據庫配置文件,/etc/my.cnf服務器
在[mysqld]下加入代碼:測試
log-bin=mysql-bin
server-id=1
innodb_flush_log_at_trx_commit=1
sync_binlog=1
binlog-do-db=db1
binlog_ignore_db=mysql
server-id 用於區分各自服務器,須要全局惟一。優化
binlog-ignore_db爲忽略的庫,即不復制該項設置的庫。url
binlog-do-db爲須要複製的數據庫,若是不要,則爲複製除了binlog-ignore_db設置的庫以外的全部庫spa
2.重啓mysql:rest
service mysqld restart
3.登陸mysql: mysql -uroot -pcode
能夠爲slave端單獨創建一個帳戶,方便權限管理,而後把這個帳戶的權限賦予slave端:
mysql>CREATE USER 'user'@ 'X.X.X.X' IDENTIFIED BY 'XXXXXX'; mysql>GRANT REPLICATION SLAVE ON *.* TO 'user'@'X.X.X.X' IDENTIFIED BY 'XXXXXX';
X.X.X.X爲slave端的IP地址
4.防止在複製期間,數據庫有新數據寫入致使數據不一樣步:
mysql>FLUSH TABLES WITH READ LOCK;
5.把數據庫導出並傳送到從服務器端:
#mysqldump -u root -pXXXXXX --all-databases --lock-tables=false -- > /root/all.sql #scp /root/all.sql root@X.X.X.X:/root
X.X.X.X爲從服務器IP地址。
6.進入主服務器數據庫查看並記錄狀態,待會兒會用到:
mysql>SHOW MASTER STATUS\G;
記錄File和position
7.解鎖數據表
mysql>UNLOCK TABLES;
而後配置從服務器:
1.登陸從服務器,導入主服務器的數據庫:
#mysql -u root -p123456 < /root/all.sql
2.編輯/etc/my.cnf,在[mysqld]下加入:
server-id=11 //服務Id,注意要和master的server-id不同
log-bin=mysql-bin
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
sync_master_info=1
sync_relay_log=1
sync_relay_log_info=1
3.重啓數據庫並登陸,執行下面的命令
mysql>CHANGE MASTER TO
MASTER_HOST='X.X.X.X', //主服務器的ip地址
MASTER_USER='user', //剛纔在主服務器建立的帳號和密碼
MASTER_PASSWORD='XXXXXX',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001', //剛纔主服務器的file
MASTER_LOG_POS=120, //主服務器的position
MASTER_CONNECT_RETRY=10;
4.啓動slave進程:
mysql>START SLAVE;
若是沒有報錯,應該就設置好了。
小小的優化方案:
雖然MyISAM引擎不支持事務處理和行級鎖,可是它的查詢效率相比innoDB要好的多,而做爲從數據庫,並不須要事務處理和行級鎖,因此建議把客戶端的表從新刪除並創建爲InnoDB。
啓動mycat的讀寫分離:
配置schema.xml文件:
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="localhost:3306" user="root" password="XXXXXX"> <!-- can have multi read hosts --> <readHost host="hostS1" url="X.X.X.X:3306" user="user" password="XXXXXX" /> </writeHost> </dataHost>