MySQL的複製方式(基於二進制日誌文件位置的主從複製、基於GTID的主從複製、半同步複製、組複製)

1.MySQL

Mysql是一種關係型數據庫,特點是將這些數據保存在不同的二維表中,並將這些表放入數據庫,這樣可以增加它的讀取速度。

1.1 MySQL的事務

事務就是一組原子性的SQL查詢,或者說一個獨立的工作單元
如果數據庫引擎能夠成功地對數據庫進行該組查詢的全部語句,那麼就執行該組查詢,如果其中有任何一條語句因爲崩潰或者其他原因無法執行,那麼所有的語句都不會執行,也就是說,事務內的語句,要麼全部執行成功,要麼全部執行失敗。


2.MySQL的複製方式

實驗環境:
server1:192.168.43.10
server2:192.168.43.20
server3:192.168.43.320

2.1 MySQL的異步複製——基於二進制日誌文件位置的主從複製

傳統的MySQL複製提供了一種簡單的主次複製方法。 有一個主服務器(主服務器),有一個或多個輔助服務器(從服務器)。 主數據庫執行事務,將其提交,然後將它們稍後(因此異步)發送給第二數據庫,以重新執行或應用。 它是無共享系統,默認情況下所有服務器均具有數據的完整副本。
在這裏插入圖片描述

基於二進制日誌文件位置的複製(Binary Log File Position Based Replication)
1.在主庫上把數據更改記錄到二進制日誌(BinaryLog)中(這些記錄被稱爲二進制日誌事件)
2.備庫上的IO線程與master進行通信,將主庫上的日誌複製到自己的中繼(RelayLog)日誌中
3.備庫上SQL線程會讀取中繼日誌中的事件,將其重放到備數據庫之上
在這裏插入圖片描述


實驗環境: server1與server2上裝有MySQL,且均完成安全初始化
在server1中:在這裏插入圖片描述


在server2中:
在這裏插入圖片描述


實驗步驟:
在server1(主節點中)
1.配置主節點,啓用複製主節點:
vim /etc/my.cnf

log-bin=mysql-bin ##主節點中的配置
server-id=1

systemctl start mysqld啓動數據庫
cat /var/log/mysqld.log | grep password查看臨時密碼
mysql_secure_installation進行安全初始化


在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述


2.創建用戶並授權

mysql> CREATE USER 'repl'@'192.168.43.%' IDENTIFIED BY 'My12345.';##創建用戶
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.43.%';##對用戶授權

在這裏插入圖片描述


3.獲取主節點上二進制文件名稱和位置

mysql> SHOW MASTER STATUS;

在這裏插入圖片描述


在server2(從節點中)
1.配置從節點:
vim /etc/my.cnf

server-id=2 ##從節點中的配置

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述


2.在從節點slave上配置主節點master的信息,並開啓複製:
mysql -uroot -pMy12345.從節點slave上配置主節點master的信息

mysql> CHANGE MASTER TO
    ->     MASTER_HOST='master_host_name',
    ->     MASTER_USER='replication_user_name',
    ->     MASTER_PASSWORD='replication_password',
    ->     MASTER_LOG_FILE='recorded_log_file_name',
    ->     MASTER_LOG_POS=recorded_log_position;
mysql> START SLAVE;##開啓複製
mysql> SHOW SLAVE STATUS\G ##查看slave狀態

在這裏插入圖片描述
在這裏插入圖片描述


測試:
注意:寫操作要在master上做,slave會同步master信息,反正則不會。
在server1中創建數據:
mysql -uroot -pMy12345.

mysql> CREATE DATABASE test;
mysql> USE test;
mysql> CREATE TABLE testtable(
    -> username varchar(10) not null,
    -> password varchar(15) not null);
mysql> desc testtable;
mysql> INSERT INTO testtable VALUES('user1','123');
mysql> SELECT * FROM testtable;

在這裏插入圖片描述


在server2中查看數據:
mysql -uroot -pMy12345.
在這裏插入圖片描述


查看server1中的日誌
cd /var/lib/mysql
mysqlbinlog mysql-bin.000002

在這裏插入圖片描述
在這裏插入圖片描述


2.2 MySQL的異步複製——基於全局事務標識(GTID)的主從複製

基於全局事務標識的複製——Replication with Global Transaction Identifiers
使用GTID時,每個事務都可以在提交到原始服務器上並由任何從屬應用時進行標識和跟蹤。這意味着在啓動新的從屬服務器或故障轉移到新的主服務器時,不必使用GTID來引用日誌文件或這些文件中的位置,從而極大地簡化了這些任務。由於基於GTID的複製完全基於事務,因此可以輕鬆確定主服務器和從服務器是否一致。只要在主服務器上提交的所有事務也都在從服務器上提交,則可以保證兩者之間的一致性。

實驗步驟:
注意:兩個服務器已經使用MySQL的基於二進制日誌位置的複製協議作爲主服務器和從服務器運行

在server1(主節點中)
1.配置主節點:啓用複製主節點,開啓gtid服務
vim /etc/my.cnf

log-bin=mysql-bin ##基於二進制日誌位置的主從複製
server-id=1
gtid_mode=ON ##打開gtid
enforce-gtid-consistency=ON

systemctl restart mysqld啓動數據庫


在server2(從節點中)
1.配置從站slave開啓GTID的服務。
vim /etc/my.cnf

server-id=2   ##基於二進制日誌位置的主從複製
gtid_mode=ON  ##打開gtid
enforce-gtid-consistency=ON

systemctl restart mysqld啓動數據庫


2.配置從站slave使用基於GTID的自動定位。

mysql> stop slave; ##停止基於二進制位置的複製

mysql> CHANGE MASTER TO
    -> MASTER_HOST = '192.168.43.10',
    -> MASTER_USER = 'repl',
    -> MASTER_PASSWORD = 'My12345.',
    -> MASTER_AUTO_POSITION = 1;
    
mysql> START SLAVE; ##開啓gtid的主從複製
mysql> SHOW SLAVE STATUS\G ##查看複製狀態

在這裏插入圖片描述


測試:
在主節點server1中插入數據
mysql -uroot -pMy12345.

在這裏插入圖片描述


在從節點server2中查看
mysql -uroot -pMy12345.

在這裏插入圖片描述


mysql> SHOW SLAVE STATUS\G ##再次查看狀態

在這裏插入圖片描述


USE mysql;
SHOW TABLES;
SELECT * FROM gtid_executed;

在這裏插入圖片描述
在這裏插入圖片描述


異步複製的缺點:
默認情況下,MySQL複製是異步的。主機將事件寫入其二進制日誌,但不知道從機是否或何時檢索並處理了它們。使用異步複製,如果主服務器崩潰,則它提交的事務可能不會傳輸到任何從服務器。因此,在這種情況下,從主服務器到從服務器的故障轉移可能會導致故障轉移到缺少相對於主服務器的事務的服務器。


2.3 MySQL的半同步複製

半同步複製可以用作異步複製的替代方法:
從屬設備在連接到主設備時指示其是否具有半同步功能。
如果在主服務器端啓用了半同步複製,並且至少有一個半同步從服務器,則在主服務器上執行事務提交的線程將阻塞並等待,直到至少一個半同步從服務器確認已接收到該事務的所有事件爲止,或者直到發生超時。
從屬僅在將事件寫入其中繼日誌並刷新到磁盤後,才確認接收到事務的事件。如果發生超時而沒有任何從屬服務器確認該事務,則主服務器將還原爲異步複製。當至少有一個半同步從屬服務器趕上時,主服務器將返回到半同步複製。
必須在主服務器和從服務器上都啓用半同步複製。如果在主服務器上禁用了半同步複製,或者在主服務器上但沒有從屬服務器上啓用了半同步複製,則主服務器將使用異步複製。
在這裏插入圖片描述

半同步複製的優點:
與異步複製相比,半同步複製提供了改進的數據完整性,因爲當提交成功返回時,已知數據至少存在兩個位置。在半同步主服務器收到來自rpl_semi_sync_master_wait_for_slave_count配置的從服務器數量的確認之前,該事務處於保留狀態且未提交。

實驗步驟:
注意:複製必須已經可以正常工作

1.在要半同步的主服務器和每個從屬服務器上安裝插件
mysql -uroot -pMy12345.

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; ##主服務器安裝插件
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; ##從服務器安裝插件
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS ##檢測插件是否安好
    ->        FROM INFORMATION_SCHEMA.PLUGINS
    ->        WHERE PLUGIN_NAME LIKE '%semi%';

在這裏插入圖片描述
在這裏插入圖片描述


2.激活插件
mysql -uroot -pMy12345.

mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;##激活主服務器的插件
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;##激活從服務器的插件

在這裏插入圖片描述
在這裏插入圖片描述


3.重啓從服務器上的IO線程
mysql -uroot -pMy12345.

mysql> STOP SLAVE IO_THREAD;
mysql> START SLAVE IO_THREAD;

mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';查看從服務器插件狀態

在這裏插入圖片描述
在這裏插入圖片描述


測試:
在這裏插入圖片描述
在這裏插入圖片描述


在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述


2.4 MySQL的全同步複製(組複製)

組複製是一種可用於實施容錯系統的技術。複製組是一組服務器,每個服務器都有自己的完整數據副本(無共享複製方案),並通過消息傳遞相互交互。
複製組由多個服務器組成,該組中的每個服務器都可以隨時獨立執行事務。但是,所有讀寫事務只有在組批准後才提交。換句話說,對於任何讀寫事務,組都需要確定是否提交,因此提交操作不是來自原始服務器的單方面決定。只讀事務不需要組內的協調並立即提交。
當讀寫事務準備好在原始服務器上提交時,服務器自動廣播寫值(已更改的行)和相應的寫集(已更新的行的唯一標識符)。由於事務是通過原子廣播發送的,因此該組中的所有服務器都將接收該事務,否則將不會。如果他們收到了,那麼相對於之前發送的其他事務,他們都將以相同的順序收到它。因此,所有服務器都以相同的順序接收相同的交易集,並且爲交易建立了全局總訂單。

MySQL組複製爲分佈式狀態機複製提供了服務器之間的強大協調。服務器屬於同一組時,它們會自動進行協調。該組可以在具有自動主要選舉的單主要模式下運行,其中一次僅一個服務器接受更新。或者,對於更高級的用戶,可以在多主要模式下部署組,在該模式下,所有服務器都可以接受更新,即使它們是同時發佈的。這種功能的代價是應用程序必須解決此類部署所施加的限制。

在這裏插入圖片描述


實驗步驟:
注意:組複製的三臺主機必須要有互相的地址解析。
在server1中
1.配置基本框架及組複製設置

vim /etc/my.cn配置組複製
systemctl stop mysqld.service停止服務
rm -fr /var/lib/mysql/*清空數據
systemctl start mysqld開啓服務
cat /var/log/mysqld.log |grep temporary password獲得臨時密碼

server_id=1  ##配置基本框架
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW

plugin_load_add='group_replication.so' ##組複製設置
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="8acb9904-9452-11ea-b4ac-000c29bb3e1d"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "192.168.43.10:33061"
loose-group_replication_group_seeds= "192.168.43.10:33061,192.168.43.20:33061,192.168.43.30:33061"
loose-group_replication_bootstrap_group=off
loose-group_replication_ip_whitelist='127.0.0.1,192.168.43.0/24'
loose-group_replication_enforce_update_everywhere_checks=ON
loose-group_replication_single_primary_mode=OFF

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述


2.創建一個具有REPLICATION-SLAVE特權的MySQL用戶
mysql -uroot -pMy12345.

mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='My12345.' FOR CHANNEL 'group_replication_recovery';
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
mysql> SELECT * FROM performance_schema.replication_group_members;

在這裏插入圖片描述
在這裏插入圖片描述


對server1測試:

mysql> CREATE DATABASE test;
mysql> USE test;
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
mysql> INSERT INTO t1 VALUES (1, 'Luis');
mysql> SELECT * FROM t1;

在這裏插入圖片描述


在server2中同樣配置基本框架及組複製設置,並設定用戶並授權
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述


在server3中同樣配置基本框架及組複製設置,並設定用戶並授權
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述


測試:
在server3(任意主機)上插入數據
在這裏插入圖片描述
在這裏插入圖片描述

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