1. 程式人生 > >Mysql主從複製、半同步複製、並行複製

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同樣的操作

[[email protected] ~]# 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 [[email protected] ~]# 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 [email protected]'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:

[[email protected] 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:

[[email protected] 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複製(非同步方式同步方式GTID)總結

這是之前做的筆記,整體有些凌亂,後續有時間再整理一下格式!!!! 非同步複製:在主節點寫入日誌即返回成功,預設情況下MySQL5.5/5.6/5.7和mariaDB10.0/10.1的複製功能是非

MySQL主從復制同步復制原理及搭建

至少 但是 mysql5 ima 調整 width 一個 事務 完整 在MySQL5.5之前的版本中,MySQL的復制是異步復制,主庫和從庫的數據之間存在一定的延遲,比如網絡故障等各種原因,這樣子容易存在隱患就是:當在主庫寫入一個事務成功後並提交了,但是由於從庫延遲沒有及時

MySQL主從複製原理同步操作步驟及原理

1.1 企業Linux運維場景資料同步方案 1.1.1 檔案級別的異機同步方案 1、scp/sftp/nc 命令可以實現遠端資料同步。  2、搭建ftp/http/svn/nfs 伺服器,然後在客戶端上也可以把資料同步到伺服器。  3、搭建sa

mysql主從複製,基於GTID的主從同步複製並行複製

環境: 實驗環境: rhel6.5 , selinux和iptables均為disabled狀態,mysql均為5.7.17,或者slave比master版本高 實驗主機: 172.25.254.2 server2:master 172.25.254.3 server3:s

Mysql主從複製同步複製並行複製

一、主從複製 1.主從複製原理 MySQL之間資料複製的基礎是二進位制日誌檔案(binary log file)。一臺MySQL資料庫一旦啟用二進位制日誌後,其作為master,它的資料庫中所有操作都會以“事件”的方式記錄在二進位制日誌中,其他資料庫作為

配置mysql5.5主從複製同步複製主主複製

mysql主伺服器 192.168.8.40 mysql從伺服器 192.168.8.41 全新配置過程(主和從資料庫都沒有資料):    主從複製主伺服器設定:      1.改server-id      2.啟用二進位制日誌      # mkdir /data/b

mysql總結3(複製:M/S(非同步,同步M/M,複製過濾器)

對於mysql複製一般來講只有一個節點即能讀又能寫,其餘節點只能讀 複製的功用: 資料分佈 負載均衡 備份 高可用和故障切換 mysql的升級測試 主從複製: 最基本條件:開啟二進位制日誌 原理: 1、slave將

MySQL非同步複製同步複製同步複製

這裡雖然說的是Mysql資料庫,但對應其他資料庫,原理沒有什麼差異。只是在具體實現和配置上不同。 一、非同步複製(Asynchronous replication) 1、邏輯上 MySQL預設的複製即是非同步的,主庫在執行完客戶端提交的事務後會立即將結果返

MySQL5.7主從複製,基於GTID主從複製同步複製同步解析

一、主從複製 1.環境 系統:redhat6.5 防火牆:保持關閉 selinux=disabled mysql主機:server1 172.25.32.4/24 mysql從機:server2 172.25.32.5/24 2.MySQL

MySQL主從複製並行複製同步複製和組複製

主從複製 主從複製過程存在三個執行緒,Master端的I/O執行緒,Slave的I/O執行緒與SQL執行緒。Master端需要開啟binlog日誌,Slave端需要開啟relaylog。 1、Slave端的I/O讀取master.info檔案,獲取binlog檔名和位置點,然後向Mast

mysql 主從複製 基於gtid的同步複製並行複製同步複製

一、mysql 主從複製 1.主從形式 mysql主從複製 靈活 一主一從 主主複製 一主多從---擴充套件系統讀取的效能,因為讀是在從庫讀取的; 多主一從---5.7開始支援 聯級複製--- 2.主從複製的用途及部署條件 mysql主從複製用途 實時災備,

mysql主從複製,基於GTID主從複製並行複製同步複製

複製方式: 主–從複製(A-B一主一從或者A-BC一主多從) 基於GTID複製 非同步複製 半同步複製 複製原理: Mysql中有一種日誌叫做bin日誌(二進位制日誌)。這個日誌會記錄下所有修改了資料庫的SQL語句 主從複製的原理其實就是把主伺服器上的bin日

MYSQL 完全備份主從復制級聯復制同步

-a 不返回 數據庫分離 rm -rf 是否 sin ice 備份數據庫 var mysql 完全備份 1,啟用二進制日誌,並於數據庫分離,單獨存放 vim /etc/my.cnf 添加 log_bin=/data/bin/mysql

Mysql實現數據庫主從復制主主復制同步復制

mysql 數據庫復制 主主復制 主從復制 半同步復制 --------------Mysql實現數據庫主從復制架構----------------一、環境準備:centos系統服務器2臺、一臺用戶做Mysql主服務器,一臺用於做Mysql從服務器,配置好yum源、防火墻關閉、各節點時鐘服

MySQL 5.7的同步複製

環境 角色 IP port master 192.168.80.136 3310 slave 192.168.80.137 3310 master [mysqld] rpl_semi_sync_master_enabled=1 rp

mysql5.7的主從複製,基於GTID複製並行複製同步複製

一 最簡單的AB主從複製 MySQL之間資料複製的基礎是二進位制日誌檔案(binary log file)。一臺MySQL資料庫一旦啟用二進位制日誌後,其作為master,它的資料庫中所有操作都會以“事件”的方式記錄在二進位制日誌中,其他資料庫作為slave通

MySQL5.7安裝+基於GTID主從複製+並行複製+增強同步複製+讀寫分離+M-S-S架構(聯級複製

實驗環境: Centos7.2 角色 主機IP server_id 資料狀態 Proxysql 192.168.148.62 nul

資料傳輸方式(並行/序列通訊;同步/非同步;單工雙工全雙工)

資料傳輸主要有三種不同的劃分方式。 並行/序列通訊; 同步/非同步傳輸; 按資料的不同傳輸方向可分為單工、半雙工、全雙工。 1.並行通訊和序列通訊 (1)並行通訊 並行通訊是同時傳送資料的各個位進行傳送or接收的通訊方式。 傳輸率比序列介面快8倍,理論值為1Mbits/s. 傳輸的資訊不

關於無人機的自穩自穩手動模式的區別

strong ron 打了 控制 繼續 區別 關於 可能 就是 手動模式:在此模式下,飛行器不會隨著Roll、Pitch、Yaw的搖桿後回中的時候自動恢復中間位置。例如打了Roll搖桿向左後,再把Roll搖桿回中,而飛行器還是繼續向左橫滾而不會恢復水平,只有把Roll搖桿打

MySQL--主從數據庫同步原理

http info img 技術分享 位置 分享 ima bin-log 同時 主從數據庫的復制原理:摘自MySQL官網 1. 異步 * 主在執行sql之後,記錄二進制bin-log文件。 * 同時從連接主服務器,並從主獲取binlog,存於本地relay-l