MySQL主從配置與Mycat讀寫分離

MySQL主從配置與Mycat讀寫分離

一、主數據庫配置

  1. 編輯配置文件

    添加如下內容

    server-id=1
    binlog-do-db=master_db1 #備份的數據庫
    log-bin=mysql-bin
    binlog-ignore-db=mysql
    

    image-20200523133136523

  2. 重啓mysql

  3. 創建一個允許從服務器來訪問的用戶(主服務器):

    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

  4. 查看配置的信息

    show master status \G;
    

    如圖:

    image-20200522155203831

    記住 File和Position的值,後面會用到

二、從數據庫配置

  1. 編輯配置文件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
  1. 關聯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的值

  1. 查看狀態
show slave status \G;

image-20200522170042277

只有Slave_IO_Running與Slave_SQL_Running都爲Yes才配置成功。

三、主從複製測試

  1. 在從服務器中創建數據庫master_db1

image-20200523131328951

  1. 在主MySQL服務器創建test表,測試結果是從MySQL的服務器會自動複製主MySQL服務器的test表。
  2. 添加500w條數據進行測試,可以使用jdbc插入,也可以使用dataFactory。(可以先手動插入一條數據查看效果)image-20200603111431707

image-20200603111537557

四、啓用Mycat讀寫分離

主機名 IP和端口 操作 引擎
主MySQL服務器 master 192.168.1.20:3306 InnoDB
從MySQL服務器 node-1 192.168.1.21:3306 MyISAM
  1. 修改從數據庫的表

    將表的引擎改爲MyISAM

    image-20200523135553033

  2. 配置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>

image-20200523145846248

五、Mycat讀寫分離測試

測試分爲啓用讀寫分離測試和不啓用讀寫分離的情況賴測試

啓用讀寫分離的查詢

配置schema.xml

image-20200603092525583

在mycat中查詢

count關鍵字查詢

select count(id) from test;

image-20200603093857376

like關鍵字查詢

select * from test where name like '%alanlee%';

image-20200603094541570

=查詢

select * from test where name = 'alanlee';

image-20200603094709481

insert

insert into test(name) values('libuguan');

image-20200603095335013

update

update test set name = 'libuguan-007' where name = 'libuguan';

image-20200603095728778

delete

delete from test where name = 'libuguan-007';

image-20200603100214050

不啓用讀寫分離的查詢

配置schema.xml

image-20200529152232726

在mycat中查詢

count關鍵字查詢

select count(*) from test;

image-20200529151832264

like關鍵字查詢

select * from test where name like '%alanlee%';

image-20200529153145449

=查詢

select * from test where name = 'alanlee';

image-20200529153440308

insert

insert into test(name) values('libuguan-01');

image-20200603104934708

update

update test set name = 'libuguan-02' where name = 'libuguan-01';

image-20200603105102926

delete

delete from test where name = 'libuguan-02';

image-20200603105351203

統計

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秒

image-20200603110848207

總結

**啓用mycat讀寫分離,查詢操作的速度比不啓用讀寫分離快很多。**原因是查詢時使用的是MyISAM引擎。而插入、更新、刪除的操作基本上沒有變化,因爲執行這3個操作時都是使用的InnoDB引擎。

六、遇到的問題

問題1

[ERROR] unknown variable ‘master-host=192.168.1.20’

image-20200522162243354

原因

MySQL5.6和之後的版本沒有master-host參數了

解決

解決方案:

  1. 在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

image-20200522165424009

  1. 重啓mysql

  2. 命令行輸入

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

image-20200522164835461

問題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的參數值等等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章