MySQL主從配置與Mycat讀寫分離
一、主數據庫配置
-
編輯配置文件
添加如下內容
server-id=1 binlog-do-db=master_db1 #備份的數據庫 log-bin=mysql-bin binlog-ignore-db=mysql
-
重啓mysql
-
創建一個允許從服務器來訪問的用戶(主服務器):
grant replication slave on *.* to 'root'@'%' identified by '123456'; GRANT FILE ON *.* TO 'root'@'%' IDENTIFIED BY '123456'; FLUSH PRIVILEGES;
grant replication slave on . to ‘root’@’%’ identified by ‘123456’;
說明:
-
root:Slave使用的賬號
-
IDENTIFIED BY 123456:Slave使用的密碼
-
%:Slave數據庫IP
-
-
查看配置的信息
show master status \G;
如圖:
記住 File和Position的值,後面會用到
二、從數據庫配置
- 編輯配置文件my.cnf,在[mysqld]下面添加這段內容
log-bin=mysql-bin
server-id=2
# 忽略日誌的db
binlog-ignore-db=information_schema
binlog-ignore-db=cluster
binlog-ignore-db=mysql
# 需要備份的db
replicate-do-db=master_db1
# 忽略備份的db
replicate-ignore-db=mysql
log-slave-updates
slave-skip-errors=all
slave-net-timeout=60
- 關聯Master信息
stop slave;
CHANGE MASTER TO MASTER_HOST='192.168.1.20',MASTER_USER='root',MASTER_PASSWORD='123456',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000001',MASTER_CONNECT_RETRY=60,MASTER_LOG_POS=154;
start slave;
這裏的MASTER_LOG_POS=154的154就是配置主服務器的時候說要記住的那個,
MASTER_LOG_FILE的值就是之前的Position的值
- 查看狀態
show slave status \G;
只有Slave_IO_Running與Slave_SQL_Running都爲Yes才配置成功。
三、主從複製測試
- 在從服務器中創建數據庫master_db1
- 在主MySQL服務器創建test表,測試結果是從MySQL的服務器會自動複製主MySQL服務器的test表。
- 添加500w條數據進行測試,可以使用jdbc插入,也可以使用dataFactory。(可以先手動插入一條數據查看效果)
四、啓用Mycat讀寫分離
主機名 | IP和端口 | 操作 | 引擎 | |
---|---|---|---|---|
主MySQL服務器 | master | 192.168.1.20:3306 | 寫 | InnoDB |
從MySQL服務器 | node-1 | 192.168.1.21:3306 | 讀 | MyISAM |
-
修改從數據庫的表
將表的引擎改爲
MyISAM
-
配置mycat讀寫分離
編輯schema.xml文件
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
<schema name="zdxh" checkSQLschema="false" sqlMaxLimit="100">
<!-- 測試讀寫分離 -->
<table name="test" primaryKey="ID" dataNode="dn4" />
</schema>
<!-- 測試讀寫分離 -->
<dataNode name="dn4" dataHost="local-master-rw" database="master_db1" />
<!-- 測試讀寫分離 -->
<dataHost name="local-master-rw" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- 寫入配置-->
<writeHost host="hostM4" url="192.168.1.20:3306"
user="root" password="123456">
<!-- 添加只讀庫配置-->
<readHost host="hostS1" url="192.168.1.21:3306"
user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
五、Mycat讀寫分離測試
測試分爲啓用讀寫分離測試和不啓用讀寫分離的情況賴測試
啓用讀寫分離的查詢
配置schema.xml
在mycat中查詢
count關鍵字查詢
select count(id) from test;
like關鍵字查詢
select * from test where name like '%alanlee%';
=查詢
select * from test where name = 'alanlee';
insert
insert into test(name) values('libuguan');
update
update test set name = 'libuguan-007' where name = 'libuguan';
delete
delete from test where name = 'libuguan-007';
不啓用讀寫分離的查詢
配置schema.xml
在mycat中查詢
count關鍵字查詢
select count(*) from test;
like關鍵字查詢
select * from test where name like '%alanlee%';
=查詢
select * from test where name = 'alanlee';
insert
insert into test(name) values('libuguan-01');
update
update test set name = 'libuguan-02' where name = 'libuguan-01';
delete
delete from test where name = 'libuguan-02';
統計
Sql語句 | 啓用讀寫分離機制(讀庫使用MyISAM) | 取消讀寫分離機制(讀使用的是Innodb) |
---|---|---|
count | 0.00秒 | 1.68秒 |
like | 2.36秒 | 3.01秒 |
= | 0.92秒 | 1.30秒 |
insert | 0.11秒 | 0.05秒 |
update | 3.27秒 | 3.02秒 |
delete | 2.93秒 | 3.31秒 |
總結
**啓用mycat讀寫分離,查詢操作的速度比不啓用讀寫分離快很多。**原因是查詢時使用的是MyISAM引擎。而插入、更新、刪除的操作基本上沒有變化,因爲執行這3個操作時都是使用的InnoDB引擎。
六、遇到的問題
問題1
[ERROR] unknown variable ‘master-host=192.168.1.20’
原因
MySQL5.6和之後的版本沒有master-host參數了
解決
解決方案:
- 在my.cnf文件的[mysqld]下面添加以下配置
log-bin=mysql-bin
server-id=2
# 忽略日誌的db
binlog-ignore-db=information_schema
binlog-ignore-db=cluster
binlog-ignore-db=mysql
# 需要備份的db
replicate-do-db=master_db
# 忽略備份的db
replicate-ignore-db=mysql
log-slave-updates
slave-skip-errors=all
slave-net-timeout=60
-
重啓mysql
-
命令行輸入
CHANGE MASTER TO MASTER_HOST='192.168.1.20',MASTER_USER='root',MASTER_PASSWORD='123456',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000001',MASTER_CONNECT_RETRY=60,MASTER_LOG_POS=154;
需根據自己的機子修改參數值
- MASTER_HOST
- MASTER_LOG_FILE
- MASTER_LOG_POS
問題2
配置好了主從服務器之後,主服務器創建表後,從服務器不會複製
原因
沒有賦予Slave機器有File權限,沒有刷新權限。
解決
在主MySQL服務器中命令行執行
# 賦予Slave機器有File權限
GRANT FILE ON *.* TO 'root'@'%' IDENTIFIED BY '123456';
# 刷新權限
FLUSH PRIVILEGES;
重啓主MySQL服務器
還要檢查其他的配置是否準確,例如MASTER_HOST,MASTER_LOG_FILE,MASTER_LOG_POS的參數值等等。