Mysql主從復制、半同步復制、并行復制
一、主從復制
1.主從復制原理
MySQL之間數據復制的基礎是二進制日志文件(binary log file)。一臺MySQL數據庫一旦啟用二進制日志后,其作為master,它的數據庫中所有操作都會以“事件”的方式記錄在二進制日志中,其他數據庫作為slave通過一個I/O線程與主服務器保持通信,并監控master的二進制日志文件的變化,如果發現master二進制日志文件發生變化,則會把變化復制到自己的中繼日志中(relay_log),然后slave的一個SQL線程會把相關的“事件”執行到自己的數據庫中,以此實現從數據庫和主數據庫的一致性,也就實現了主從復制。
1.主數據庫(Master)將變更信息寫入到二進制日志文件中,這里需要注意的是舊版本的MySQL數據庫默認是不開啟二進制日志的,強烈建議在安裝好數據庫啟動之前一定要先檢查一下二進制日志文件是否開啟,即使不做主從復制架構也要開啟,否則當數據庫啟動之后再開啟二進制日志時需要重新啟動數據庫。
2.從數據庫(Slave)開啟一個IO工作線程,通過該IO線程與主數據庫建立一個普通客戶端連接,主數據庫會啟動一個二進制日志轉儲線程(binglog dump thread),從數據庫的IO線程通過這個轉儲線程讀取主庫上的變更事件,并將變更事件記錄到中繼日志中(relay_log),如果從數據庫的IO線程讀取速度追趕上主庫的事件變更,在沒有得到新變更的通知時,IO線程會進入Sleep狀態。
3.從數據庫還會啟動一個SQL Thread線程,這個線程從中繼日志(relay_log)中讀取變更事件,并將變更同步到從數據庫中。同時,可以通過配置選項,除了將變更存儲到數據庫中,也可以將變更事件同時存儲在從數據庫的二進制日志中
2.主從復制的部署
Master :server1 slave:server2
1.安裝數據庫:master和slave同樣的操作
[root@server1 ~]# ls
mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar
mysql-community-client-5.7.17-1.el6.x86_64.rpm
mysql-community-common-5.7.17-1.el6.x86_64.rpm
mysql-community-libs-5.7.17-1.el6.x86_64.rpm
mysql-community-libs-compat-5.7.17-1.el6.x86_64.rpm
[root@server1 ~]# tar xf mysql-5.7.17-1.el6.x86_64.rpm-bundle.ta
[root@server1 ~]# yum install mysql-community-client-5.7.17-1.el6.x86_64.rpm mysql-community-common-5.7.17-1.el6.x86_64.rpm mysql-community-libs-5.7.17-1.el6.x86_64.rpm mysql-community-libs-compat-5.7.17-1.el6.x86_64.rpm mysql-community-server-5.7.17-1.el6.x86_64.rpm -y
2、mysql初始化配置
master和slave
[root@server1 ~]# /etc/init.d/mysqld start
Initializing MySQL database: [ OK ]
Installing validate password plugin: [ OK ]
Starting mysqld:
[root@server1 ~]# grep password /var/log/mysqld.log ##mysql開啟時會生成在臨時密碼,可在日志中找到
安全初始化,并設置新的密碼
[root@server1 ~]# mysql_secure_installation
3.對master進行配置
[root@server1 ~]# vim /etc/my.cnf
#在最后一行加入:
server-id=1
log-bin=mysql-bin
[root@server1 ~]# /etc/init.d/mysqld restart
Stopping mysqld: [ OK ]
Starting mysqld: [ OK ]
為slave授權用戶
[root@server1 ~]# mysql -p
mysql> grant replication slave on *.* to repl@'172.25.62.%' identified by 'Hello007=';
mysql> flush privileges;
查看master狀態:
mysql> show master status;
4.對slave進行配置
[root@server2 mysql]# vim /etc/my.cnf
server-id=2
[root@server2 mysql]# /etc/init.d/mysqld restart
Stopping mysqld: [ OK ]
Starting mysqld: [ OK ]
在slave添加master
[root@server2 ~]# mysql -p
mysql> change master to master_host='172.25.62.1',master_user='repl',master_password='Hello007=',master_log_file='mysql-bin.000001',master_log_pos=599;
mysql> start slave;
mysql> show slave status\G;
5.測試:在master寫入數據在slave查看
master:
mysql> create database test;
Query OK, 1 row affected (0.15 sec)
mysql> use test;
Database changed
mysql> create table userlist(
-> name varchar(15) not null,
-> passwd varchar(25) not null);
Query OK, 0 rows affected (0.82 sec)
mysql> insert into userlist values ('kobe','242424');
Query OK, 1 row affected (0.23 sec)
mysql> select * from userlist;
+------+--------+
| name | passwd |
+------+--------+
| kobe | 242424 |
+------+--------+
1 row in set (0.00 sec)
slave:
數據同步,主從設置成功
二、基于gtid的主從同步
1.初始gtid
GTID (Global Transaction ID) 是對于一個已提交事務的編號,并且是一個全局唯一的編號。 GTID 實際上 是由 UUID+TID 組成的。其中 UUID 是一個 MySQL 實例的唯一標識。TID 代表了該實例上已經提交的事務數量,并且隨著事務提交單調遞增。
從 MySQL 5.6.5 開始新增了一種基于 GTID 的復制方式。通過 GTID 保證了每個在主庫上提交的事務在集群中有一個唯一的ID。這種方式強化了數據庫的主備一致性,故障恢復以及容錯能力。
在原來基于二進制日志的復制中,從庫需要告知主庫要從哪個偏移量進行增量同步,如果指定錯誤會造成數據的遺漏,從而造成數據的不一致。借助GTID,在發生主備切換的情況下,MySQL的其它從庫可以自動在新主庫上找到正確的復制位置,這大大簡化了復雜復制拓撲下集群的維護,也減少了人為設置復制位置發生誤操作的風險。另外,基于GTID的復制可以忽略已經執行過的事務,減少了數據發生不一致的風險。
2.配置文件的修改
master機的設置
[root@server1 ~]# vim /etc/my.cnf
server_id=1
log-bin=mysql-bin
gtid_mode = ON
enforce-gtid-consistency = true
[root@server1 ~]# /etc/init.d/mysqld restart
slave機的設置
[root@server2 mysql]# vim /etc/my.cnf
server_id=2
gtid_mode = ON
enforce-gtid-consistency = true
[root@server2 mysql]# /etc/init.d/mysqld restart
3.slave機做認證配置
[root@server2 mysql]# mysql -p
mysql> change master to master_host='172.25.62.1',master_user='repl',master_password='Hello007=',master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.25 sec)
mysql> start slave;
Query OK, 0 rows affected (0.11 sec)
mysql> show slave status\G;
4.測試
在master寫入數據
mysql> insert into userlist values ('james','232323');
Query OK, 1 row affected (0.27 sec)
mysql> select * from userlist;
+-------+--------+
| name | passwd |
+-------+--------+
| kobe | 242424 |
| james | 232323 |
+-------+--------+
2 rows in set (0.00 sec)
在slave查看
三、半同步復制
1.半同步模式
異步復制即是master數據庫把binlog日志發送給 slave數據庫,當slave服務器發生故障了,那么肯定會導致主從數據庫服務器的數據不一致。
為了解決上面的問題,MySQL5.5引入一種叫做半同步復制模式。開啟這種模式,可以保證slave數據庫接收完master數據庫發送過來的binlog日志并寫入自己的中繼日志中,然后反饋給master數據庫,告知已經復制完畢。
開啟這種模式后,當出現超時,主數據庫將會自動轉為異步復制模式,直到至少有一臺從服務器接受到主數據庫的binlog,并且反饋給主數據庫。這時主數據庫才會切換回半同步復制模式
2.導入半同步模塊
master:
[root@server1 mysql]# mysql -p
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.17 sec)
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
-> FROM INFORMATION_SCHEMA.PLUGINS
-> WHERE PLUGIN_NAME LIKE '%semi%';
+----------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE |
+----------------------+---------------+
1 row in set (0.00 sec)
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
Query OK, 0 rows affected (0.01 sec)
系統變量反映了半同步復制是如何配置的。若要檢查它們的值,請使用SHOW VARIABLES:
狀態變量能夠監視半同步復制的操作。若要檢查它們的值,請使用SHOW STATUS:
slave:
[root@server2 mysql]# mysql -p
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.13 sec)
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
-> FROM INFORMATION_SCHEMA.PLUGINS
-> WHERE PLUGIN_NAME LIKE '%semi%';
+---------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+---------------------+---------------+
| rpl_semi_sync_slave | ACTIVE |
+---------------------+---------------+
1 row in set (0.01 sec)
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
Query OK, 0 rows affected (0.00 sec)
mysql> STOP SLAVE IO_THREAD; ##重新開啟io線程,使它完全打開
Query OK, 0 rows affected (0.11 sec)
mysql> START SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)
查看半同步復制變量和它們的狀態:
mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';
mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
3、測試
master機寫入數據,并接受到slave機返回的ack值
mysql> insert into userlist values ('T-mac','1111111');
mysql> SHOW STATUS LIKE 'Rpl%';
將slave機的io線程停掉,master機寫入數據,會默認等待10s,如果超時還未等到slave機的ack,將自動切換到異步復制,如果slave機的io線程再次開啟,復制將自動切換到半同步方式
slave:
mysql> stop slave io_thread;
然后在master上執行數據庫操作,比如插入等,結果就是操作會等待10s返回結果,這時候退回異步復制,slave上沒有接收到數據,這時候我們去查看master上的相關狀態:
master:
mysql> insert into userlist values ('Duncan','212121');
mysql> SHOW STATUS LIKE 'Rpl%';
數據并未同步slave
然后我們開啟io_thread再去查看數據庫的變化,發現數據同步了
四、并行復制
1.查看進程表
mysql> show processlist;
2.對my.cnf進行配置
[root@server2 mysql]# vim /etc/my.cnf
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16 ##線程數
master_info_repository=TABLE ##master_info存儲方式為:table
relay_log_info_repository=TABLE ##relay_log_info存儲方式為:table
relay_log_recovery=ON
[root@server2 mysql]# /etc/init.d/mysqld restart
3.再次登錄查看進程列表
mysql> mysql> show processlist;
智能推薦
mysql半同步復制與并行復制
####################################相關概念################################################### (1)異步復制:主庫上的事務不會等待從庫的確認即返回客戶端提交成功! (2)同步復制:主庫上提交的事務向客戶端返回成功之前,需要收到所有從庫提交事務的確認信息。 (3)半同步復制:異步復制和同步復制的折中,主庫上提交...
mysql 主從復制優化、并行復制
實驗環境: server2 為 server3 的 master server3 為 server1 的 master 即server1、2、3的身份如下: server2:master server3:master / slave server2:slave 由于先前做過其他數據庫實驗,環境是server2為master, server1和server3為slave 實驗操作: server1、...
mysql主從復制 半同步復制
當單臺MYSQL服務器無法滿足當前網站流量時的優化方案。需要搭建mysql集群技術。 復制方式:(同步方式) 主–從復制 主–主復制 半同步復制 復制原理: Mysql中有一種日志叫做bin日志(二進制日志)。這個日志會記錄下所有修改了數據庫的SQL語句(insert,update,delete,ALTER TABLE,grant等等)。 主從復制的原理其實就是把主服務器上...
linux mysql的主從復制(GTID)/并行復制/無損復制
安裝mysql 本次使用五個rpm包安裝 安裝后修改密碼即可 密碼默認在log中 初始化修改即可 開啟mysql二進制日志 可以設定徐亞同步的數據庫或不需要的數據庫 進入mysql創建備份賬戶 查看日至位置以及pos在備份機使用 grant replication slave on *.* to 'bobo'@'172.25.15....
mysql的主從復制,基于gtid的主從復制,半同步復制,組復制
主從復制原理: 1.傳統的實現數據庫同步 # [root@server1 mysql5.7]# grep password /var/log/mysqld.log #獲取初始密碼 2018-08-07T14:06:55.029406Z 1 [Note] A temporary password is generated for root@localhost: aG!a*sUs>3#) #初始...
猜你喜歡
mysql的主從復制和半同步復制
一.主從復制 MySQL數據庫自身提供的主從復制功能可以方便的實現數據的多處自動備份,實現數據庫的拓展。多個數據備份不僅可以加強數據的安全性,通過實現讀寫分離還能進一步提升數據庫的負載性能。 Mysql主從復制的實現原理圖大致如下(來源網絡): MySQL之間數據復制的基礎是二進制日志文件(binary log file)。一臺MySQL數據庫一旦啟用二進制日志后,其作為master,它的數據庫中...
mysql的主從復制:半同步復制
文章目錄 mysql的主從復制(二)半同步復制 1.異步復制、全同步復制和半同步復制 2.半同步的實現步驟 server1(主庫)上 server2(從庫)上 測試 半同步失敗的情況 半同步正常情況 mysql的主從復制(二)半同步復制 1.異步復制、全同步復制和半同步復制 異步復制( Asynchronous replication ) MySQL默認的復制即是異步的,主庫在執行完客戶端提交的事...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...