10592字,475行!帶你玩轉 MyCat 讀寫分離!

一、MySQL主從複製原理

複製是指將主數據庫的 DDLDML 操作通過二進制日誌傳到從庫服務器中,然後在從庫上對這些日誌重新執行(也叫重做),從而使得從庫和主庫的數據保持同步。

MySQL支持一臺主庫同時向多臺從庫進行復制, 從庫同時也可以作爲其他從服務器的主庫,實現鏈狀複製。

MySQL主從複製的原理如下 :

從上層來看,複製分成三步:

  • Master 主庫在事務提交時,會把數據變更作爲時間 Events 記錄在二進制日誌文件 Binlog中。
  • 主庫推送二進制日誌文件 Binlog 中的日誌事件到從庫的中繼日誌 Relay Log 。
  • slave重做中繼日誌中的事件,將改變反映它自己的數據。

MySQL 複製的優點:

  • 主庫出現問題,可以快速切換到從庫提供服務。
  • 可以在從庫上執行查詢操作,從主庫中更新,實現讀寫分離,降低主庫的訪問壓力。
  • 可以在從庫中執行備份,以避免備份期間影響主庫的服務。

二、MySQL一主一從搭建

準備的兩臺機器:

1.master

  1. 在master 的配置文件(/usr/my.cnf)中,配置如下內容:
#mysql 服務ID,保證整個集羣環境中唯一 
server-id=1 

#mysql binlog 日誌的存儲路徑和文件名 
log-bin=/var/lib/mysql/mysqlbin 

#設置logbin格式 
binlog_format=STATEMENT 

#是否只讀,1 代表只讀, 0 代表讀寫 
read-only=0 

#忽略的數據, 指不需要同步的數據庫 
#binlog-ignore-db=mysql 

#指定同步的數據庫 
binlog-do-db=db01
  1. 執行完畢之後,需要重啓Mysql:
service mysql restart ;
  1. 創建同步數據的賬戶,並且進行授權操作:
grant replication slave on *.* to 'itcast'@'192.168.192.158' identified by 'itcast'; 

flush privileges;
  1. 查看master狀態:
show master status;


字段含義:

File : 從哪個日誌文件開始推送日誌文件 
Position : 從哪個位置開始推送日誌 
Binlog_Ignore_DB : 指定不需要同步的數據庫

2.slave

  1. 在 slave 端配置文件/usr/my.cnf中,配置如下內容:
#mysql服務端ID,唯一 
server-id=2 

#指定binlog日誌 
log-bin=/var/lib/mysql/mysqlbin 

#啓用中繼日誌 
relay-log=mysql-relay
  1. 執行完畢之後,需要重啓Mysql:
service mysql restart;
  1. 執行如下指令 :
change master to master_host= '192.168.192.157', master_user='itcast', 
master_password='itcast', master_log_file='mysqlbin.000001', master_log_pos=413;

指定當前從庫對應的主庫的IP地址,用戶名,密碼,從哪個日誌文件開始的那個位置開始同步推送日誌。

  1. 開啓同步操作
start slave; 

show slave status;


5. 停止同步操作

stop slave;

3.驗證主從同步

  1. 在主庫中創建數據庫,創建表,並插入數據 :
create database db01; 

user db01; 

create table user( 
	id int(11) not null auto_increment, 
	name varchar(50) not null, 
	sex varchar(1), 
	primary key (id) 
)engine=innodb default charset=utf8; 

insert into user(id,name,sex) values(null,'Tom','1');
insert into user(id,name,sex) values(null,'Trigger','0'); 
insert into user(id,name,sex) values(null,'Dawn','1');
  1. 在從庫中查詢數據,進行驗證 :

在從庫中,可以查看到剛纔創建的數據庫:

在該數據庫中,查詢user表中的數據:




參考資料:《開源數據庫中間件MyCat實戰筆記》
想要快速獲取資料的同學:請添加助理VX:C18173184271,備註一下CSDN+工作年限!免費獲取
不要再猶猶豫豫了,不然就要錯過金三銀四春招了!



三、MyCat一主一從讀寫分離

1.讀寫分離原理


讀寫分離,簡單地說是把對數據庫的讀和寫操作分開,以對應不同的數據庫服務器。主數據庫提供寫操作,從數據庫提供讀操作,這樣能有效地減輕單臺數據庫的壓力。

通過MyCat即可輕易實現上述功能,不僅可以支持MySQL,也可以支持OracleSQL Server

MyCat控制後臺數據庫的讀寫分離負載均衡schema.xml文件datahost標籤balance屬性控制。

2.讀寫分離配置

配置如下:

  1. 檢查MySQL的主從複製是否運行正常 .
  2. 修改MyCat 的conf/schema.xml 配置如下:
<?xml version="1.0"?> 
<!DOCTYPE mycat:schema SYSTEM "schema.dtd"> 
<mycat:schema xmlns:mycat="http://io.mycat/"> 
	<schema name="ITCAST" checkSQLschema="true" sqlMaxLimit="100"> 
		<table name="user" dataNode="dn1" primaryKey="id"/> 
	</schema> 
	
	<dataNode name="dn1" dataHost="localhost1" database="db01" /> 
	
	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> 
		<heartbeat>select user()</heartbeat> 
		<writeHost host="hostM1" url="192.168.192.157:3306" user="root" password="itcast"> 
			<readHost host="hostS1" url="192.168.192.158:3306" user="root" password="itcast" /> 
		</writeHost> 
	</dataHost> 
</mycat:schema>
  1. 修改conf/server.xml
<user name="root" defaultAccount="true"> 
	<property name="password">123456</property> 
	<property name="schemas">ITCAST</property> 
</user> 

<user name="test"> 
	<property name="password">123456</property>
	<property name="schemas">ITCAST</property> 
</user> 

<user name="user"> 
	<property name="password">123456</property> 
	<property name="schemas">ITCAST</property> 
	<property name="readOnly">true</property> 
</user>
  1. 配置完畢之後, 重啓MyCat服務;

屬性含義說明:

checkSQLschema 
	當該值設置爲true, 如果我們執行語句"select * from test01.user ;" 語句時, MyCat則會 把schema字符去掉 , 
	可以避免後端數據庫執行時報錯 ; 

balance 
	負載均衡類型, 目前取值有4: 
	
	balance="0" : 不開啓讀寫分離機制 , 所有讀操作都發送到當前可用的writeHost上. 
	
	balance="1" : 全部的readHost 與 stand by writeHost (備用的writeHost) 都參與 select 語句的負載均衡,
	簡而言之,就是採用雙主雙從模式(M1 --> S1 , M2 --> S2, 正常情況下, M2,S1,S2 都參與 select 語句的負載均衡。); 
	
	balance="2" : 所有的讀寫操作都隨機在writeHost , readHost上分發 
	
	balance="3" : 所有的讀請求隨機分發到writeHost對應的readHost上執行, writeHost不負擔 讀壓力 ;balance=3 只在MyCat1.4 之後生效 .

3.驗證讀寫分離

修改balance的值, 查詢MyCat中的邏輯表中的數據變化;

四、MySQL雙主雙從搭建

1.架構

一個主機 Master1 用於處理所有寫請求,它的從機 Slave1 和另一臺主機 Master2 還有它的從機 Slave2 負責所有讀請求。當 Master1 主機宕機後,Master2 主機負責寫請求,Master1Master2 互爲備機。架構圖如下:

2.雙主雙從配置

準備的機器如下:

  1. 雙主機配置

Master1配置:

#主服務器唯一ID 
server-id=1 

#啓用二進制日誌 
log-bin=mysql-bin 

# 設置不要複製的數據庫(可設置多個) 
# binlog-ignore-db=mysql 
# binlog-ignore-db=information_schema 

#設置需要複製的數據庫 
binlog-do-db=db02 
binlog-do-db=db03 
binlog-do-db=db04 

#設置logbin格式 
binlog_format=STATEMENT 

# 在作爲從數據庫的時候,有寫入操作也要更新二進制日誌文件 
log-slave-updates

Master2配置:

#主服務器唯一ID 
server-id=3 

#啓用二進制日誌 
log-bin=mysql-bin 

# 設置不要複製的數據庫(可設置多個) 
#binlog-ignore-db=mysql 
#binlog-ignore-db=information_schema 

#設置需要複製的數據庫 
binlog-do-db=db02 
binlog-do-db=db03
binlog-do-db=db04 

#設置logbin格式 
binlog_format=STATEMENT 

# 在作爲從數據庫的時候,有寫入操作也要更新二進制日誌文件 
log-slave-updates
  1. 雙從機配置

Slave1配置:

#從服務器唯一ID 
server-id=2 

#啓用中繼日誌 
relay-log=mysql-relay

Salve2配置:

#從服務器唯一ID 
server-id=4 

#啓用中繼日誌 
relay-log=mysql-relay
  1. 雙主機、雙從機重啓 mysql 服務
  2. 主機從機都關閉防火牆
  3. 在兩臺主機上建立帳戶並授權 slave
#在主機MySQL裏執行授權命令 
GRANT REPLICATION SLAVE ON *.* TO 'itcast'@'%' IDENTIFIED BY 'itcast'; 

flush privileges;

查詢Master1的狀態 :

查詢Master2的狀態 :
在這裏插入圖片描述

  1. 在從機上配置需要複製的主機

Slave1 複製 Master1Slave2 複製 Master2

slave1 指令:

CHANGE MASTER TO MASTER_HOST='192.168.192.157', 
MASTER_USER='itcast', 
MASTER_PASSWORD='itcast', 
MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=409;

slave2 指令:

CHANGE MASTER TO MASTER_HOST='192.168.192.159', 
MASTER_USER='itcast', 
MASTER_PASSWORD='itcast', 
MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=409;
  1. 啓動兩臺從服務器複製功能 , 查看主從複製的運行狀態
start slave; 

show slave status\G;



  1. 兩個主機互相複製

Master2 複製 Master1Master1 複製 Master2

Master1 執行指令:

CHANGE MASTER TO MASTER_HOST='192.168.192.159', 
MASTER_USER='itcast', 
MASTER_PASSWORD='itcast', 
MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=409;

Master2 執行指令:

CHANGE MASTER TO MASTER_HOST='192.168.192.157', 
MASTER_USER='itcast', 
MASTER_PASSWORD='itcast', 
MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=409;
  1. 啓動兩臺主服務器複製功能 , 查看主從複製的運行狀態
start slave; 

show slave status\G;



  1. 驗證
create database db03; 

use db03; 

create table user( 
	id int(11) not null auto_increment, 
	name varchar(50) not null, 
	sex varchar(1), 
	primary key (id) 
)engine=innodb default charset=utf8; 

insert into user(id,name,sex) values(null,'Tom','1'); 
insert into user(id,name,sex) values(null,'Trigger','0'); 
insert into user(id,name,sex) values(null,'Dawn','1'); 

insert into user(id,name,sex) values(null,'Jack Ma','1'); 
insert into user(id,name,sex) values(null,'Coco','0'); 
insert into user(id,name,sex) values(null,'Jerry','1');

在Master1上創建數據庫:

在Master1上創建表 :



  1. 停止從服務複製功能
stop slave;
  1. 重新配置主從關係
stop slave; 
reset master;

五、MyCat雙主雙從讀寫分離

1.配置

修改<dataHost>balance屬性,通過此屬性配置讀寫分離的類型 ;

<?xml version="1.0"?> 
<!DOCTYPE mycat:schema SYSTEM "schema.dtd"> 
<mycat:schema xmlns:mycat="http://io.mycat/"> 

	<schema name="ITCAST" checkSQLschema="true" sqlMaxLimit="100"> 
		<table name="user" dataNode="dn1" primaryKey="id"/>
	</schema> 
	
	<dataNode name="dn1" dataHost="localhost1" database="db03" /> 
	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> 
		<heartbeat>select user()</heartbeat> 
		<writeHost host="hostM1" url="192.168.192.147:3306" user="root" password="itcast"> 
			<readHost host="hostS1" url="192.168.192.149:3306" user="root" password="itcast" /> 
		</writeHost> 
			
		<writeHost host="hostM2" url="192.168.192.150:3306" user="root" password="itcast"> 
			<readHost host="hostS2" url="192.168.192.151:3306" user="root" password="itcast" /> 
		</writeHost> 
	</dataHost> 
</mycat:schema>
  1. balance

1 : 代表 全部的 readHoststand by writeHost 參與 select 語句的負載均衡,簡單的說,當雙主雙從模式(M1->S1,M2->S2,並且 M1 與 M2 互爲主備),正常情況下,M2,S1,S2都參與 select 語句的負載均衡 ;

  1. writeType

0 : 寫操作都轉發到第1臺writeHost, writeHost1掛了, 會切換到writeHost2上;
1 : 所有的寫操作都隨機地發送到配置的writeHost上 ;

  1. switchType

-1 : 不自動切換
1 : 默認值, 自動切換
2 : 表示基於MySQL的主從同步狀態決定是否切換, 心跳語句 : show slave status

2. 讀寫分離驗證

查詢數據 : select * from user;


插入數據 : insert into user(id,name,sex) values(null,'Dawn','1');


3.可用性驗證

關閉Master1 , 然後再執行寫入的SQL語句 , 通過日誌查詢當前寫入操作, 操作的是那臺服務器 ;


如果你需要這份完整版的《開源數據庫中間件MyCat實戰筆記》,只需你多多支持我這篇文章。

多多支持,即可免費獲取資料——三連之後(承諾:100%免費)

快速入手通道:添加助理VX:C18173184271,備註一下CSDN+工作年限! 免費獲取!誠意滿滿!!!

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