您好,登錄后才能下訂單哦!
下文內容主要給大家帶來MGR的入門,這里所講到的知識,與書籍略有不同,都是億速云專業技術人員在與用戶接觸過程中,總結出來的,具有一定的經驗分享價值,希望給廣大讀者帶來幫助。
MySQL組復制是MySQL server的插件,組中的每個server都需要配置和安裝該插件。本節提供了一個詳細的教程,其中包含創建至少三臺server的復制組所需的步驟。
18.2.1在單主模式下部署組復制
組中的每個server實例可以在獨立的物理機器上運行,也可以在同一臺機器上運行。本節介紹如何在一臺物理機上創建具有三個MySQL Server實例的復制組。這意味著需要三個數據目錄,每個server實例一個,每個實例都需要單獨配置。
圖18.4組架構
本教程介紹如何使用組復制插件獲取和部署MySQL Server,如何在創建組之前配置每個server實例以及如何使用Performance Schema來驗證一切是否正常。
第一步是部署MySQL云服務器的三個實例。組復制是MySQL Server 8.0提供的內置MySQL插件。有關MySQL插件的更多背景信息,請參見第5.6節“MySQL服務器插件”。下載MySQL服務器包后,需要解壓縮并安裝二進制文件。此過程假定MySQL服務器已下載并解壓縮到當前目錄,該目錄需要在mysql-8.0的目錄下。由于本教程使用一個物理機,每個MySQL實例都需要一個特定的數據目錄,用于存儲實例的數據。在名為data
的目錄中創建數據目錄,并初始化每個目錄。
mkdir data
mysql-8.0/bin/mysqld --initialize-insecure --basedir=$PWD/mysql-8.0 --datadir=$PWD/data/s1
mysql-8.0/bin/mysqld --initialize-insecure --basedir=$PWD/mysql-8.0 --datadir=$PWD/data/s2
mysql-8.0/bin/mysqld --initialize-insecure --basedir=$PWD/mysql-8.0 --datadir=$PWD/data/s3
里面data/s1
,data/s2
, data/s3
是一個初始化的數據目錄,包含了MySQL系統數據庫和相關表等。要了解有關初始化過程的更多信息,請參見 第2.10.1節“初始化數據目錄”。
Warning
不要在生產環境中使用--initialize-insecure,它只用于簡化教程。有關安全設置的更多信息,請參見第18.5節“組復制安全性”。
本節介紹要用于組復制的MySQL Server實例所需的配置設置。有關背景信息,請參見 第18.8.2節“組復制限制”。
要安裝和使用組復制插件,必須正確配置MySQL server實例。建議將配置存儲在my.cnf文件中。有關詳細信息,請參見第4.2.7節“文件的使用”。如沒有特殊說明,以下是組中第一個實例的配置,在此節中稱為s1。以下部分展示server的示例配置。
[mysqld]
# server configuration
datadir=<full_path_to_data>/data/s1
basedir=<full_path_to_bin>/mysql-8.0/
port=24801
socket=<full_path_to_sock_dir>/s1.sock
這些設置對MySQL server進行了配置,使其使用先前已創建的數據目錄,并配置server應打開哪個端口,并開始偵聽傳入連接。
Note
在此使用非默認端口24801,因為在本教程中,三個服務器實例使用相同的主機名。在具有三個不同機器的環境中,這種設置不是必需的。
組復制需要成員之間網絡互通,這意味著每個成員必須能夠解析所有其他成員的網絡地址。例如,在本教程中,所有的三個實例都在一臺機器上運行,因此為了確保成員可以相互聯系,您還可以在配置文件中添加一行,例如 report_host=127.0.0.1
。
以下設置根據MySQL組復制要求配置復制。
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
這些設置將server配置為使用唯一標識號1,以啟用全局事務標識符,以允許僅執行基于GTID安全記錄的語句并禁用二進制日志事件校驗和。
如果您使用的是低于8.0.3的MySQL版本,其中默認值已針對復制進行了改進,則需要將這些行添加到成員的配置文件中。
log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
這些設置指定server打開二進制日志記錄,使用基于行的格式,將復制元數據存儲在系統表而不是文件中,并禁用二進制日志事件校驗和。有關更多詳細信息,請參見 第18.8.1節“組復制要求”。
確保server中my.cnf文件此時已按要求配置,且server按配置實例化復制基礎結構。以下部分是server組復制的配置。
transaction_write_set_extraction=XXHASH64
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address= "127.0.0.1:24901"
group_replication_group_seeds= "127.0.0.1:24901,127.0.0.1:24902,127.0.0.1:24903"
group_replication_bootstrap_group=off
transaction_write_set_extraction
指示服務器對于每個事務,它必須收集寫集并使用XXHASH64哈希算法將其編碼為散列。從MySQL 8.0.2開始,此設置是默認設置,因此可以省略此行。group_replication_group_name
告訴插件它正在加入或創建的組被命名為“aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa”<br />值 group_replication_group_name
必須是有效的UUID。在二進制日志中為組復制事件設置GTID時,將在內部使用此UUID。可使用SELECT UUID()
生成一個UUID。group_replication_start_on_boot
指示插件在server啟動時不自動啟動組復制。這在設置組復制時很重要,因為它確保您可以在手動啟動插件之前配置server。配置成員后,您可以設置 group_replication_start_on_boot
為on,以便在server重啟時自動啟動Group Replication。group_replication_local_address
告訴插件使用IP地址127.0.0.1和端口24901與組中的其他成員進行內部通信。Important
server在此端口上偵聽組成員之間的連接。此端口不能用于用戶應用程序,它必須保留,用于在運行組復制時組的不同成員之間的通信。
由 group_replication_local_address
配置的本地地址必須可供所有組成員訪問。例如,如果每個server實例位于不同的計算機上,則可以使用計算機的IP地址,例如10.0.0.1。如果使用主機名,則必須使用完全限定名稱,并確保它可以通過DNS解析,并且配置正確的 /etc/hosts
文件或其他域名解析過程。從MySQL 8.0.14開始,可以使用IPv6地址(或可以解析到它的主機名)以及IPv4地址。一個組可以包含使用IPv6的成員和使用IPv4的成員的混合。有關IPv6網絡以及混合IPv4和IPv6組的組復制支持的更多信息,請參見 第18.4.5節“支持IPv6以及混合IPv6和IPv4組”。
建議的端口 group_replication_local_address
是33061.在本教程中,我們使用在一臺計算機上運行的三個server實例,因此使用端口24901到24903用于內部通信。 group_replication_local_address
Group Replication使用它作為復制組中組成員的唯一標識符。只要主機名或IP地址都不同,您就可以為組復制的所有成員使用相同的端口,并且如本教程所示,只要具有相同的主機名或IP地址,就可以使用相同的主機名或IP地址。只是端口都不一樣。
group_replication_group_seeds
設置組成員的主機名和端口,新成員使用它們建立與組的連接。這些成員稱為種子成員。建立連接后,組成員身份信息在 performance_schema.replication_group_members
表中。通常, group_replication_group_seeds
列表包含hostname:port
每個組成員的列表 group_replication_local_address
,但這不是強制性的,可以選擇組成員的子集作為種子。Important
該hostname:port
列在group_replication_group_seeds
是種子成員的內部IP地址,基于配置group_replication_local_address
,而不是SQLhostname:port
用于客戶端連接,并且顯示在performance_schema.replication_group_members
表中。
啟動組的server不使用此選項,因為它是初始server,因此它負責引導組。第二個加入的server向組中的唯一成員申請加入,然后組得以擴容。第三個加入的server可以向這兩個server中的任意一個申請加入,然后組再次擴容。后續server在加入時重復此過程。
Warning
當多個server同時加入時,請確保它們已在組中的種子成員。不要使用同時正在申請加入組的種子成員,因為他們可能在訪問時尚未加入群組。
首先啟動引導成員并讓它創建組, 然后使其成為正在加入的其余成員的種子成員。這確保了當加入其余成員時已有一個組。
不支持創建組并同時加入多個成員。在操作競爭時,這種情況可能會發生,但是加入組的行為最終會出現錯誤或超時。
要加入的成員必須使用種子成員在group_replication_group_seeds
選項中通告的相同協議(IPv4或IPv6)與種子成員通信 。出于組復制的IP地址白名單的目的,種子成員上的白名單必須包含種子成員提供的協議的加入成員的IP地址,或者解析為該協議的地址的主機名。除了加入成員之外,還必須設置此地址或主機名并列入白名單 group_replication_local_address
如果該地址的協議與種子成員的通告協議不匹配。如果加入成員沒有適當協議的白名單地址,則拒絕其連接嘗試。有關更多信息,請參見 第18.5.1節“IP地址白名單”。
group_replication_bootstrap_group
指示插件是否是引導組。Important
此選項在任何時候只能在一個server實例上使用,通常是首次引導組時(或在整個組被崩潰然后恢復的情況下)。如果您多次引導組,例如,當多個server實例設置了此選項,則它們可能會人為地造成腦裂的情況,其中存在兩個具有相同名稱的不同組。在第一個server實例加入組后禁用此選項。
組中的所有server成員的配置都非常相似。您需要更改每個server的詳細信息(例如server_id
, datadir
,group_replication_local_address
)。這將在本教程的后面進行介紹。
組復制使用異步復制協議來實現分布式恢復,在將組成員加入組之前將其同步。分布式恢復過程依賴于group_replication_recovery復制通道,該復制通道用于在組成員之間傳輸事務。因此,您需要設置具有正確權限的復制用戶,以便組復制可以直接建立成員到成員的恢復復制通道。
使用配置文件啟動服務器:
mysql-8.0/bin/mysqld --defaults-file=data/s1/s1.cnf
創建具有REPLICATION-SLAVE權限的MySQL用戶。此操作不應記錄到二進制日志中,以避免將更改傳遞到其他server實例。連接到server s1并執行以下語句:
mysql> SET SQL_LOG_BIN=0;
以下示例演示了創建用戶rpl_user的過程,密碼為rpl_pass。配置服務器時需要使用正確的用戶名和密碼。
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;
用戶進行上述配置后,需要使用CHANGE MASTER TO語句將server配置為,在下次需要從其他成員恢復其狀態時,使用group_replication_recovery復制通道的給定憑據。執行以下命令,將rpl_user和rpl_pass替換為創建用戶時使用的值。
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' \\
FOR CHANNEL 'group_replication_recovery';
分布式恢復是加入組的server執行的第一步。如果未正確設置這些憑據,server將無法執行恢復過程并獲得與其他組成員同步,因此最終將無法加入組。
類似地,如果成員無法通過server的主機名正確識別其他成員,則恢復過程可能會失敗。建議運行MySQL的操作系統都正確地配置唯一主機名,使用DNS或本地設置。可以在performance_schema.replication_group_members表的Member_host列中驗證此主機名。如果多個組成員使用操作系統設置的默認主機名,則會出現有成員無法解析到正確的成員地址且無法加入組的情況。在這種情況下,可以使用report_host來配置每個server唯一主機名。
默認情況下,在MySQL 8中創建的用戶使用 第6.5.1.3節“緩存SHA-2插件身份驗證”。如果您配置的用于分布式恢復的用戶_rpl_user
_使用緩存SHA-2認證插件并沒有使用 第18.5.2,“安全套接字層支持(SSL)” 的group_replication_recovery
復制通道,RSA密鑰用于密碼交換,看第6.4.3節“創建SSL和RSA證書和密鑰”。您可以將rpl_user
應該從組中恢復其狀態的成員的公鑰復制到該組,也可以將捐贈者配置為在請求時提供公鑰。
更安全的方法是將公鑰復制 rpl_user
到應該從捐贈者恢復組狀態的成員。然后,您需要group_replication_recovery_public_key_path
在加入組的成員上配置 系統變量,并為其提供公鑰的路徑rpl_user
。
可選地,不×××全的方法是設置 group_replication_recovery_get_public_key=ON
捐贈者,以便他們rpl_user
在加入組時提供成員的公鑰 。無法驗證服務器的身份,因此只有group_replication_recovery_get_public_key=ON
在您確定沒有服務器身份被泄露的風險時才會設置 ,例如通過中間人***。
配置并啟動server s1后,安裝組復制插件。然后連接到server并執行以下命令:
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Important
在加載組復制之前 ,mysql.session用戶必須存在。 mysql.session用戶在MySQL 8.0.2版中添加了。如果使用早期版本需要初始化數據字典,則必須執行MySQL升級過程(請參見第2.11節“升級MySQL”)。如果未運行升級,則組復制啟動時會報錯如下:There was an error when trying to access the server with user: mysql.session@localhost. Make sure the user is present in the server and that mysql_upgrade was ran after a server update..
要檢查插件是否已成功安裝,請執行SHOW PLUGINS并檢查輸出。它應該顯示如下:
mysql> SHOW PLUGINS;
+----------------------------+----------+--------------------+----------------------+-------------+
| Name | Status | Type | Library | License |
+----------------------------+----------+--------------------+----------------------+-------------+
| binlog | ACTIVE | STORAGE ENGINE | NULL | PROPRIETARY |
(...)
| group_replication | ACTIVE | GROUP REPLICATION | group_replication.so | PROPRIETARY |
+----------------------------+----------+--------------------+----------------------+-------------+
要啟動組,請指示server s1引導組,然后啟動組復制程序。此引導應僅由單個sever獨立完成,該server啟動組并且只啟動一次。這就是為什么引導配置選項的值不保存在配置文件中的原因。如果將其保存在配置文件中,則在重新啟動時,server會自動引導具有相同名稱的第二個組。這將導致兩個不同的組具有相同的名稱。同樣的道理適用于停止和重新啟動插件,并且此選項設置為ON。
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
START GROUP_REPLICATION語句返回后,組就已啟動了。您可以檢查該組現在是否已創建并且其中已經有一個成員:
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+---------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+---------------+
| group_replication_applier | ce9be252-2b71-11e6-b8f4-00212844f856 | myhost | 24801 | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+---------------+
此表中的信息確認了組中有一個成員并且具有唯一的標識符ce9be252-2b71-11e6-b8f4-00212844f856,它是在線的并且在myhost偵聽端口24801上的客戶端連接。
為了演示server確實在一個組中,并且能夠處理加載,創建一個表并向其中添加一些內容。
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');
檢查表t1和二進制日志的內容。
mysql> SELECT * FROM t1;
+----+------+
| c1 | c2 |
+----+------+
| 1 | Luis |
+----+------+
mysql> SHOW BINLOG EVENTS;
+---------------+-----+----------------+-----------+-------------+--------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+---------------+-----+----------------+-----------+-------------+--------------------------------------------------------------------+
| binlog.000001 | 4 | Format_desc | 1 | 123 | Server ver: 8.0.2-gr080-log, Binlog ver: 4 |
| binlog.000001 | 123 | Previous_gtids | 1 | 150 | |
| binlog.000001 | 150 | Gtid | 1 | 211 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1' |
| binlog.000001 | 211 | Query | 1 | 270 | BEGIN |
| binlog.000001 | 270 | View_change | 1 | 369 | view_id=14724817264259180:1 |
| binlog.000001 | 369 | Query | 1 | 434 | COMMIT |
| binlog.000001 | 434 | Gtid | 1 | 495 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:2' |
| binlog.000001 | 495 | Query | 1 | 585 | CREATE DATABASE test |
| binlog.000001 | 585 | Gtid | 1 | 646 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:3' |
| binlog.000001 | 646 | Query | 1 | 770 | use `test`; CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL) |
| binlog.000001 | 770 | Gtid | 1 | 831 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:4' |
| binlog.000001 | 831 | Query | 1 | 899 | BEGIN |
| binlog.000001 | 899 | Table_map | 1 | 942 | table_id: 108 (test.t1) |
| binlog.000001 | 942 | Write_rows | 1 | 984 | table_id: 108 flags: STMT_END_F |
| binlog.000001 | 984 | Xid | 1 | 1011 | COMMIT /* xid=38 */ |
+---------------+-----+----------------+-----------+-------------+--------------------------------------------------------------------+
如上所示,創建了數據庫和表對象,并且將其對應的DDL語句寫入二進制日志。此外,數據被插入到表中并被寫入二進制日志。當組成員增長并且由于新成員嘗試加入并變為在線而執行分布式恢復時,二進制日志條目的重要性將在以下部分中說明。
此時,組中有一個成員,已經有一些數據存在的server s1。此時就可以通過添加先前配置的其他兩個server來擴展組了。
為了添加第二個實例server s2,首先為它創建配置文件。該配置類似于用于server s1的配置,除了諸如數據目錄的位置,s2將要監聽的端口或其server_id之類的事情之外。這些不同的行已在下面的列表中突出顯示。
[mysqld]
# server configuration
datadir=<full_path_to_data>/data/s2
basedir=<full_path_to_bin>/mysql-8.0/
port=24802
socket=<full_path_to_sock_dir>/s2.sock
#
# Replication configuration parameters
#
server_id=2
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
#
# Group Replication configuration
#
transaction_write_set_extraction=XXHASH64
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address= "127.0.0.1:24902"
group_replication_group_seeds= "127.0.0.1:24901,127.0.0.1:24902,127.0.0.1:24903"
group_replication_bootstrap_group= off
server s1的過程類似,在配置文件就位的情況下啟動server。
mysql-8.0/bin/mysqld --defaults-file=data/s2/s2.cnf
然后按如下所示配置恢復憑據。由于用戶在組中共享,該命令與設置server s1時使用的命令相同。在s2上執行以下語句。
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' \\
FOR CHANNEL 'group_replication_recovery';
Tip
如果您使用的是緩存SHA-2身份驗證插件(MySQL 8中的默認設置),請參閱 使用組復制和緩存SHA-2用戶憑據插件。
安裝組復制插件,并啟動將server加入組的程序。以下示例使用與部署server s1時相同的方式安裝插件。
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
將server s2添加到組。
mysql> START GROUP_REPLICATION;
與之前的步驟不同,這里與s1上執行的那些步驟有一個區別,就是不執行SET GLOBAL group_replication_bootstrap_group = ON的操作; 在啟動組復制之前,因為該組已由server s1創建和引導。此時,server s2只需要添加到已經存在的組中。
Tip
當組復制成功啟動并且服務器加入組時,它會檢查super_read_only
變量。通過super_read_only
在成員的配置文件中設置為ON,可以確保因任何原因啟動組復制時出現故障的服務器不接受事務。如果服務器應將該組作為讀寫實例加入,例如作為單主組中的主要組或多主組的成員,則當該super_read_only
變量設置為ON時,則在加入時會將其設置為OFF。
再次檢查performance_schema.replication_group_members表,可以看出組中現在有兩個ONLINE的server。
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+---------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+---------------+
| group_replication_applier | 395409e1-6dfa-11e6-970b-00212844f856 | myhost | 24801 | ONLINE |
| group_replication_applier | ac39f1e6-6dfa-11e6-a69d-00212844f856 | myhost | 24802 | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+---------------+
由于server s2也被標記為ONLINE,它必須已經與server s1同步。按照如下方式驗證它確實與server s1同步。
mysql> SHOW DATABASES LIKE 'test';
+-----------------+
| Database (test) |
+-----------------+
| test |
+-----------------+
mysql> SELECT * FROM test.t1;
+----+------+
| c1 | c2 |
+----+------+
| 1 | Luis |
+----+------+
mysql> SHOW BINLOG EVENTS;
+---------------+------+----------------+-----------+-------------+--------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+---------------+------+----------------+-----------+-------------+--------------------------------------------------------------------+
| binlog.000001 | 4 | Format_desc | 2 | 123 | Server ver: 8.0.3-log, Binlog ver: 4 |
| binlog.000001 | 123 | Previous_gtids | 2 | 150 | |
| binlog.000001 | 150 | Gtid | 1 | 211 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1' |
| binlog.000001 | 211 | Query | 1 | 270 | BEGIN |
| binlog.000001 | 270 | View_change | 1 | 369 | view_id=14724832985483517:1 |
| binlog.000001 | 369 | Query | 1 | 434 | COMMIT |
| binlog.000001 | 434 | Gtid | 1 | 495 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:2' |
| binlog.000001 | 495 | Query | 1 | 585 | CREATE DATABASE test |
| binlog.000001 | 585 | Gtid | 1 | 646 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:3' |
| binlog.000001 | 646 | Query | 1 | 770 | use `test`; CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL) |
| binlog.000001 | 770 | Gtid | 1 | 831 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:4' |
| binlog.000001 | 831 | Query | 1 | 890 | BEGIN |
| binlog.000001 | 890 | Table_map | 1 | 933 | table_id: 108 (test.t1) |
| binlog.000001 | 933 | Write_rows | 1 | 975 | table_id: 108 flags: STMT_END_F |
| binlog.000001 | 975 | Xid | 1 | 1002 | COMMIT /* xid=30 */ |
| binlog.000001 | 1002 | Gtid | 1 | 1063 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:5' |
| binlog.000001 | 1063 | Query | 1 | 1122 | BEGIN |
| binlog.000001 | 1122 | View_change | 1 | 1261 | view_id=14724832985483517:2 |
| binlog.000001 | 1261 | Query | 1 | 1326 | COMMIT |
+---------------+------+----------------+-----------+-------------+--------------------------------------------------------------------+
如上所示,第二個server已添加到組中,并且已自動從server s1復制了更改。按照分布式恢復過程,這意味著加入組之后并且在即將被聲明在線之前,server s2自動地連接到server s1并且從其獲取丟失的數據。換句話說,它從s1的二進制日志中復制了它在加入組的時間節點之前缺少的事務。
向組添加其他實例與添加第二個server基本上是相同的步驟,除了配置必須更改為對應的server。總結所需的命令如下:
1.創建配置文件
[mysqld]
# server configuration
datadir=<full_path_to_data>/data/s3
basedir=<full_path_to_bin>/mysql-8.0/
port=24803
socket=<full_path_to_sock_dir>/s3.sock
#
# Replication configuration parameters
#
server_id=3
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
#
# Group Replication configuration
#
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address= "127.0.0.1:24903"
group_replication_group_seeds= "127.0.0.1:24901,127.0.0.1:24902,127.0.0.1:24903"
group_replication_bootstrap_group= off
2.啟動server
mysql-8.0/bin/mysqld --defaults-file=data/s3/s3.cnf
_3.配置group_replicationrecovery通道的恢復憑據。
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' \\
FOR CHANNEL 'group_replication_recovery';
4.安裝Group Replication插件并啟動它。
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
START GROUP_REPLICATION;
此時,server s3被引導并且正在運行,并且已經加入組且已與組中的其他server成員同步。訪問performance_schema.replication_group_members表再次確認真實情況確實如此。
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+---------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+---------------+
| group_replication_applier | 395409e1-6dfa-11e6-970b-00212844f856 | myhost | 24801 | ONLINE |
| group_replication_applier | 7eb217ff-6df3-11e6-966c-00212844f856 | myhost | 24803 | ONLINE |
| group_replication_applier | ac39f1e6-6dfa-11e6-a69d-00212844f856 | myhost | 24802 | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+---------------+
在server s2或server s1上發出此相同的查詢會產生相同的結果。此外,您可以驗證server s3已經同步:
mysql> SHOW DATABASES LIKE 'test';
+-----------------+
| Database (test) |
+-----------------+
| test |
+-----------------+
mysql> SELECT * FROM test.t1;
+----+------+
| c1 | c2 |
+----+------+
| 1 | Luis |
+----+------+
mysql> SHOW BINLOG EVENTS;
+---------------+------+----------------+-----------+-------------+--------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+---------------+------+----------------+-----------+-------------+--------------------------------------------------------------------+
| binlog.000001 | 4 | Format_desc | 3 | 123 | Server ver: 8.0.3-log, Binlog ver: 4 |
| binlog.000001 | 123 | Previous_gtids | 3 | 150 | |
| binlog.000001 | 150 | Gtid | 1 | 211 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1' |
| binlog.000001 | 211 | Query | 1 | 270 | BEGIN |
| binlog.000001 | 270 | View_change | 1 | 369 | view_id=14724832985483517:1 |
| binlog.000001 | 369 | Query | 1 | 434 | COMMIT |
| binlog.000001 | 434 | Gtid | 1 | 495 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:2' |
| binlog.000001 | 495 | Query | 1 | 585 | CREATE DATABASE test |
| binlog.000001 | 585 | Gtid | 1 | 646 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:3' |
| binlog.000001 | 646 | Query | 1 | 770 | use `test`; CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL) |
| binlog.000001 | 770 | Gtid | 1 | 831 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:4' |
| binlog.000001 | 831 | Query | 1 | 890 | BEGIN |
| binlog.000001 | 890 | Table_map | 1 | 933 | table_id: 108 (test.t1) |
| binlog.000001 | 933 | Write_rows | 1 | 975 | table_id: 108 flags: STMT_END_F |
| binlog.000001 | 975 | Xid | 1 | 1002 | COMMIT /* xid=29 */ |
| binlog.000001 | 1002 | Gtid | 1 | 1063 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:5' |
| binlog.000001 | 1063 | Query | 1 | 1122 | BEGIN |
| binlog.000001 | 1122 | View_change | 1 | 1261 | view_id=14724832985483517:2 |
| binlog.000001 | 1261 | Query | 1 | 1326 | COMMIT |
| binlog.000001 | 1326 | Gtid | 1 | 1387 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:6' |
| binlog.000001 | 1387 | Query | 1 | 1446 | BEGIN |
| binlog.000001 | 1446 | View_change | 1 | 1585 | view_id=14724832985483517:3 |
| binlog.000001 | 1585 | Query | 1 | 1650 | COMMIT |
+---------------+------+----------------+-----------+-------------+--------------------------------------------------------------------+
對于以上關于MGR的入門,如果大家還有更多需要了解的可以持續關注我們億速云的行業推新,如需獲取專業解答,可在官網聯系售前售后的,希望該文章可給大家帶來一定的知識更新。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。