目錄
一、MySQL主從複製原理
複製是指將主數據庫的 DDL
和 DML
操作通過二進制日誌傳到從庫服務器中,然後在從庫上對這些日誌重新執行(也叫重做),從而使得從庫和主庫的數據保持同步。
MySQL支持一臺主庫同時向多臺從庫進行復制, 從庫同時也可以作爲其他從服務器的主庫,實現鏈狀複製。
MySQL主從複製的原理如下 :
從上層來看,複製分成三步:
- Master 主庫在事務提交時,會把數據變更作爲時間 Events 記錄在二進制日誌文件 Binlog中。
- 主庫推送二進制日誌文件 Binlog 中的日誌事件到從庫的中繼日誌 Relay Log 。
- slave重做中繼日誌中的事件,將改變反映它自己的數據。
MySQL 複製的優點:
- 主庫出現問題,可以快速切換到從庫提供服務。
- 可以在從庫上執行查詢操作,從主庫中更新,實現讀寫分離,降低主庫的訪問壓力。
- 可以在從庫中執行備份,以避免備份期間影響主庫的服務。
二、MySQL一主一從搭建
準備的兩臺機器:
1.master
- 在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
- 執行完畢之後,需要重啓Mysql:
service mysql restart ;
- 創建同步數據的賬戶,並且進行授權操作:
grant replication slave on *.* to 'itcast'@'192.168.192.158' identified by 'itcast';
flush privileges;
- 查看master狀態:
show master status;
字段含義:
File : 從哪個日誌文件開始推送日誌文件
Position : 從哪個位置開始推送日誌
Binlog_Ignore_DB : 指定不需要同步的數據庫
2.slave
- 在 slave 端配置文件
/usr/my.cnf
中,配置如下內容:
#mysql服務端ID,唯一
server-id=2
#指定binlog日誌
log-bin=/var/lib/mysql/mysqlbin
#啓用中繼日誌
relay-log=mysql-relay
- 執行完畢之後,需要重啓Mysql:
service mysql restart;
- 執行如下指令 :
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地址,用戶名,密碼,從哪個日誌文件開始的那個位置開始同步推送日誌。
- 開啓同步操作
start slave;
show slave status;
5. 停止同步操作
stop slave;
3.驗證主從同步
- 在主庫中創建數據庫,創建表,並插入數據 :
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');
- 在從庫中查詢數據,進行驗證 :
在從庫中,可以查看到剛纔創建的數據庫:
在該數據庫中,查詢user表中的數據:
參考資料:
《開源數據庫中間件MyCat實戰筆記》
想要快速獲取資料的同學:請添加助理VX:C18173184271,備註一下CSDN+工作年限!
免費獲取
不要再猶猶豫豫了,不然就要錯過金三銀四春招了!
三、MyCat一主一從讀寫分離
1.讀寫分離原理
讀寫分離,簡單地說是把對數據庫的讀和寫操作分開,以對應不同的數據庫服務器。主數據庫提供寫操作,從數據庫提供讀操作,這樣能有效地減輕單臺數據庫的壓力。
通過MyCat即可輕易實現上述功能,不僅可以支持MySQL,也可以支持Oracle
和SQL Server
。
MyCat控制後臺數據庫的讀寫分離和負載均衡 由 schema.xml文件datahost標籤 的balance屬性控制。
2.讀寫分離配置
配置如下:
- 檢查MySQL的主從複製是否運行正常 .
- 修改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>
- 修改
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>
- 配置完畢之後, 重啓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
主機負責寫請求,Master1
、Master2
互爲備機。架構圖如下:
2.雙主雙從配置
準備的機器如下:
- 雙主機配置
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
- 雙從機配置
Slave1配置:
#從服務器唯一ID
server-id=2
#啓用中繼日誌
relay-log=mysql-relay
Salve2配置:
#從服務器唯一ID
server-id=4
#啓用中繼日誌
relay-log=mysql-relay
- 雙主機、雙從機重啓 mysql 服務
- 主機從機都關閉防火牆
- 在兩臺主機上建立帳戶並授權 slave
#在主機MySQL裏執行授權命令
GRANT REPLICATION SLAVE ON *.* TO 'itcast'@'%' IDENTIFIED BY 'itcast';
flush privileges;
查詢Master1的狀態 :
查詢Master2的狀態 :
- 在從機上配置需要複製的主機
Slave1
複製 Master1
,Slave2
複製 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;
- 啓動兩臺從服務器複製功能 , 查看主從複製的運行狀態
start slave;
show slave status\G;
- 兩個主機互相複製
Master2
複製 Master1
,Master1
複製 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;
- 啓動兩臺主服務器複製功能 , 查看主從複製的運行狀態
start slave;
show slave status\G;
- 驗證
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上創建表 :
- 停止從服務複製功能
stop slave;
- 重新配置主從關係
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>
balance
1 : 代表 全部的 readHost
與 stand by writeHost
參與 select
語句的負載均衡,簡單的說,當雙主雙從模式(M1->S1,M2->S2,並且 M1 與 M2 互爲主備),正常情況下,M2,S1,S2都參與 select 語句的負載均衡 ;
writeType
0 : 寫操作都轉發到第1臺writeHost
, writeHost1
掛了, 會切換到writeHost2
上;
1 : 所有的寫操作都隨機地發送到配置的writeHost
上 ;
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+工作年限!
免費獲取!誠意滿滿!!!