實驗拓撲
主機名 | 主機地址 | 角色 |
---|---|---|
node1 | 192.168.2.201 | Master |
node2 | 192.168.2.202 | Slave |
node3 | 192.168.2.203 | Slave |
本文使用CentOS7.1,數(shù)據(jù)庫:MariaDB-5.5.50
注意:本文關(guān)閉了selinux,以及iptables。
一、異步復(fù)制:
相關(guān)知識點:
- MySQL的異步復(fù)制是MySQL自帶的數(shù)據(jù)同步功能,在公司里面也是也就最為常見的。
- Master服務(wù)器中需要開啟二進制日志
binlog
,從服務(wù)器需要開啟中繼日志relay-log
。 - 二進制日志
binlog
的主要功能是:記錄令數(shù)據(jù)庫內(nèi)容產(chǎn)生改變的語句,如insert
語句;二進制日志在備份還原的時候至關(guān)重要。 - 中繼日志
relay-log
則是從服務(wù)器中開啟,作用是從主服務(wù)器的二進制日志中復(fù)制,并在在從服務(wù)器本地執(zhí)行一次,達到與主服務(wù)器內(nèi)容一致的效果。 - 一般MySQL復(fù)制是放在內(nèi)網(wǎng)中進行的,因為MySQL的同步并沒有進行加密。而且相比較于在公網(wǎng)傳輸,在內(nèi)網(wǎng)中丟包的概率較低,帶寬也高。
Master節(jié)點:Node1
(1) 啟動二進制日志;
[mysqld]
log_bin=mysql-bin
(2) 為當(dāng)前節(jié)點設(shè)置一個全局唯一的ID號;
[mysqld]
server_id=1
(3) 授權(quán)創(chuàng)建僅有復(fù)制權(quán)限的用戶賬號;
mysql> GRANT REPLCATION SLAVE, REPLICATION CLIENT ON *.* TO 'repuser'@'192.168.2.%' IDENTIFIED BY 'repuser';
(4)查看Master端的二進制日志記錄到哪里,用于決定Slave復(fù)制的起始位置
MariaDB [(none)]> show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| Master-log.000001 | 245 | | |
+-------------------+----------+--------------+------------------+
#Slave服務(wù)器如果是一個空的數(shù)據(jù)庫而主服務(wù)器不為空:
#在同步之前可以先用Master的全量備份,恢復(fù)到Slave數(shù)據(jù)庫中。
#然后再從備份那一刻記錄的Position開始復(fù)制。
#假設(shè)Master和Slave都為空,上面的情況就表示Slave從二進制日志Master-log.000001的245開始復(fù)制
從節(jié)點:Node2設(shè)置
(1) 啟動中繼日志;
[mysqld]
relay_log=relay-log
relay_log_index=relay-log.index
(2) 為當(dāng)前節(jié)點設(shè)置一個全局惟的ID號;
[mysqld]
server_id=2
#node3把這里改為3
(3) Slave服務(wù)器打開只讀模式;
[mysqld]
read_only = 1
(4) 使用有復(fù)制權(quán)限的用戶賬號連接至主服務(wù)器,并啟動復(fù)制線程;
#注意:上面的是在/etc/my.cnf的配置文件中添加,下面mysql>的則是在mysql服務(wù)器中運行的命令
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.2.201',
MASTER_USER='repuser',
MASTER_PASSWORD='repuser',
MASTER_LOG_FILE='Master-log.000001',
MASTER_LOG_POS=245;
(5)在從服務(wù)器中開啟復(fù)制線程
mysql> START SLAVE;
查看從服務(wù)器的狀態(tài)信息
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.2.201
Master_User: repuser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: Master-log.000003
Read_Master_Log_Pos: 1379
Relay_Log_File: relay-log.000002
Relay_Log_Pos: 1414
Relay_Master_Log_File: Master-log.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1379
Relay_Log_Space: 1702
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
1 row in set (0.00 sec)
插入幾條命令之后,從以上的狀態(tài)信息中可以看得到我們的Master服務(wù)器是192.168.2.201
擁有復(fù)制功能的賬號是repuser,現(xiàn)在復(fù)制到Master-log.000003的Position 1379這個位置;
上面的輸出結(jié)果中,我在復(fù)制完成之后使用了flush logs手動地滾動了二進制日志,所以二進制去到000003
二、半同步復(fù)制
相關(guān)知識點:
- 半同步復(fù)制是由谷歌研發(fā)的一種數(shù)據(jù)庫主從復(fù)制方式。
- 與傳統(tǒng)的異步復(fù)制相比,半同步復(fù)制在多個Slave節(jié)點中會選取一個節(jié)點進行半同步復(fù)制。也就是說,當(dāng)Master提交一個事務(wù)的時候,在這個半同步復(fù)制的Slave端返回一個同步完成的Ack包之后,服務(wù)器才會向用戶返回事務(wù)提交成功,而其他的節(jié)點則是采用傳統(tǒng)的異步復(fù)制方式進行同步。
- 半同步是復(fù)制是基于異步復(fù)制之上進行的,也就是說配置半同步復(fù)制之前需要先配置到異步復(fù)制。
- 半同步復(fù)制可以保證在主節(jié)點發(fā)生故障的時候,總有一個節(jié)點的數(shù)據(jù)與主節(jié)點一樣。這樣在進行切換的時候,可以更加快速地把這個Slave節(jié)點設(shè)置成主節(jié)點來使用。
Master節(jié)點:Node1
由于上面已經(jīng)進行了異步復(fù)制的配置,下面僅進行半同步復(fù)制的操作。
(1)Master安裝插件并修改變量:
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
插件的文件名字和路徑一般在rpm -ql mariadb-server那里查看。
這個插件的庫文件是安裝好之后就直接有的,只是沒有默認安裝。
(2)啟用選項
mysql> SET GLOBAL VARIABLES rpl_semi_sync_master_enabled=1;
Slave節(jié)點:Node2
(1)slave安裝插件并修改變量:
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> SET GLOBAL VARIABLES rpl_semi_sync_slave_enabled=1;
這里需要注意的是,node1作為主節(jié)點使用的是master模塊。node2,node3作為從節(jié)點使用slave模塊
(2)查看半同步復(fù)制的全局變量
mysql> SHOW GLOBAL VARIABLES LIKE '%semi%';
+------------------------------------+-------+
| Variable_name | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_no_slave | ON |
+------------------------------------+-------+
設(shè)置rpl_semi_sync_master_enabled=1的效果
第一行是ON則表示半同步復(fù)制已經(jīng)開啟。
(3)查看半同步復(fù)制的全局變量
mysql> SHOW GLOBAL STATUS LIKE '%semi%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_net_avg_wait_time | 645 |
| Rpl_semi_sync_master_net_wait_time | 645 |
| Rpl_semi_sync_master_net_waits | 1 |
| Rpl_semi_sync_master_no_times | 1 |
| Rpl_semi_sync_master_no_tx | 5 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 783 |
| Rpl_semi_sync_master_tx_wait_time | 783 |
| Rpl_semi_sync_master_tx_waits | 1 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 1 |
+--------------------------------------------+-------+
第一行Rpl_semi_sync_master_clients顯示1,表示有一臺主機是半同步復(fù)制的狀態(tài)。
最后需要說明的是,semi復(fù)制的MySQL5.7中性能有明顯的改善。
假如真的需要使用半同步復(fù)制,建議使用5.7的版本。
下一篇文章,我們將會講怎么使用MHA配合半同步復(fù)制高可用MariaDB