您好,登錄后才能下訂單哦!
下文內(nèi)容主要給大家?guī)鞰GR的入門,這里所講到的知識,與書籍略有不同,都是億速云專業(yè)技術(shù)人員在與用戶接觸過程中,總結(jié)出來的,具有一定的經(jīng)驗(yàn)分享價(jià)值,希望給廣大讀者帶來幫助。
MySQL組復(fù)制是MySQL server的插件,組中的每個server都需要配置和安裝該插件。本節(jié)提供了一個詳細(xì)的教程,其中包含創(chuàng)建至少三臺server的復(fù)制組所需的步驟。
18.2.1在單主模式下部署組復(fù)制
組中的每個server實(shí)例可以在獨(dú)立的物理機(jī)器上運(yùn)行,也可以在同一臺機(jī)器上運(yùn)行。本節(jié)介紹如何在一臺物理機(jī)上創(chuàng)建具有三個MySQL Server實(shí)例的復(fù)制組。這意味著需要三個數(shù)據(jù)目錄,每個server實(shí)例一個,每個實(shí)例都需要單獨(dú)配置。
圖18.4組架構(gòu)
本教程介紹如何使用組復(fù)制插件獲取和部署MySQL Server,如何在創(chuàng)建組之前配置每個server實(shí)例以及如何使用Performance Schema來驗(yàn)證一切是否正常。
第一步是部署MySQL云服務(wù)器的三個實(shí)例。組復(fù)制是MySQL Server 8.0提供的內(nèi)置MySQL插件。有關(guān)MySQL插件的更多背景信息,請參見第5.6節(jié)“MySQL服務(wù)器插件”。下載MySQL服務(wù)器包后,需要解壓縮并安裝二進(jìn)制文件。此過程假定MySQL服務(wù)器已下載并解壓縮到當(dāng)前目錄,該目錄需要在mysql-8.0的目錄下。由于本教程使用一個物理機(jī),每個MySQL實(shí)例都需要一個特定的數(shù)據(jù)目錄,用于存儲實(shí)例的數(shù)據(jù)。在名為data
的目錄中創(chuàng)建數(shù)據(jù)目錄,并初始化每個目錄。
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
是一個初始化的數(shù)據(jù)目錄,包含了MySQL系統(tǒng)數(shù)據(jù)庫和相關(guān)表等。要了解有關(guān)初始化過程的更多信息,請參見 第2.10.1節(jié)“初始化數(shù)據(jù)目錄”。
Warning
不要在生產(chǎn)環(huán)境中使用--initialize-insecure,它只用于簡化教程。有關(guān)安全設(shè)置的更多信息,請參見第18.5節(jié)“組復(fù)制安全性”。
本節(jié)介紹要用于組復(fù)制的MySQL Server實(shí)例所需的配置設(shè)置。有關(guān)背景信息,請參見 第18.8.2節(jié)“組復(fù)制限制”。
要安裝和使用組復(fù)制插件,必須正確配置MySQL server實(shí)例。建議將配置存儲在my.cnf文件中。有關(guān)詳細(xì)信息,請參見第4.2.7節(jié)“文件的使用”。如沒有特殊說明,以下是組中第一個實(shí)例的配置,在此節(jié)中稱為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
這些設(shè)置對MySQL server進(jìn)行了配置,使其使用先前已創(chuàng)建的數(shù)據(jù)目錄,并配置server應(yīng)打開哪個端口,并開始偵聽傳入連接。
Note
在此使用非默認(rèn)端口24801,因?yàn)樵诒窘坛讨?,三個服務(wù)器實(shí)例使用相同的主機(jī)名。在具有三個不同機(jī)器的環(huán)境中,這種設(shè)置不是必需的。
組復(fù)制需要成員之間網(wǎng)絡(luò)互通,這意味著每個成員必須能夠解析所有其他成員的網(wǎng)絡(luò)地址。例如,在本教程中,所有的三個實(shí)例都在一臺機(jī)器上運(yùn)行,因此為了確保成員可以相互聯(lián)系,您還可以在配置文件中添加一行,例如 report_host=127.0.0.1
。
以下設(shè)置根據(jù)MySQL組復(fù)制要求配置復(fù)制。
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
這些設(shè)置將server配置為使用唯一標(biāo)識號1,以啟用全局事務(wù)標(biāo)識符,以允許僅執(zhí)行基于GTID安全記錄的語句并禁用二進(jìn)制日志事件校驗(yàn)和。
如果您使用的是低于8.0.3的MySQL版本,其中默認(rèn)值已針對復(fù)制進(jìn)行了改進(jìn),則需要將這些行添加到成員的配置文件中。
log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
這些設(shè)置指定server打開二進(jìn)制日志記錄,使用基于行的格式,將復(fù)制元數(shù)據(jù)存儲在系統(tǒng)表而不是文件中,并禁用二進(jìn)制日志事件校驗(yàn)和。有關(guān)更多詳細(xì)信息,請參見 第18.8.1節(jié)“組復(fù)制要求”。
確保server中my.cnf文件此時已按要求配置,且server按配置實(shí)例化復(fù)制基礎(chǔ)結(jié)構(gòu)。以下部分是server組復(fù)制的配置。
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
指示服務(wù)器對于每個事務(wù),它必須收集寫集并使用XXHASH64哈希算法將其編碼為散列。從MySQL 8.0.2開始,此設(shè)置是默認(rèn)設(shè)置,因此可以省略此行。group_replication_group_name
告訴插件它正在加入或創(chuàng)建的組被命名為“aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa”<br />值 group_replication_group_name
必須是有效的UUID。在二進(jìn)制日志中為組復(fù)制事件設(shè)置GTID時,將在內(nèi)部使用此UUID??墒褂?code>SELECT UUID()生成一個UUID。group_replication_start_on_boot
指示插件在server啟動時不自動啟動組復(fù)制。這在設(shè)置組復(fù)制時很重要,因?yàn)樗_保您可以在手動啟動插件之前配置server。配置成員后,您可以設(shè)置 group_replication_start_on_boot
為on,以便在server重啟時自動啟動Group Replication。group_replication_local_address
告訴插件使用IP地址127.0.0.1和端口24901與組中的其他成員進(jìn)行內(nèi)部通信。Important
server在此端口上偵聽組成員之間的連接。此端口不能用于用戶應(yīng)用程序,它必須保留,用于在運(yùn)行組復(fù)制時組的不同成員之間的通信。
由 group_replication_local_address
配置的本地地址必須可供所有組成員訪問。例如,如果每個server實(shí)例位于不同的計(jì)算機(jī)上,則可以使用計(jì)算機(jī)的IP地址,例如10.0.0.1。如果使用主機(jī)名,則必須使用完全限定名稱,并確保它可以通過DNS解析,并且配置正確的 /etc/hosts
文件或其他域名解析過程。從MySQL 8.0.14開始,可以使用IPv6地址(或可以解析到它的主機(jī)名)以及IPv4地址。一個組可以包含使用IPv6的成員和使用IPv4的成員的混合。有關(guān)IPv6網(wǎng)絡(luò)以及混合IPv4和IPv6組的組復(fù)制支持的更多信息,請參見 第18.4.5節(jié)“支持IPv6以及混合IPv6和IPv4組”。
建議的端口 group_replication_local_address
是33061.在本教程中,我們使用在一臺計(jì)算機(jī)上運(yùn)行的三個server實(shí)例,因此使用端口24901到24903用于內(nèi)部通信。 group_replication_local_address
Group Replication使用它作為復(fù)制組中組成員的唯一標(biāo)識符。只要主機(jī)名或IP地址都不同,您就可以為組復(fù)制的所有成員使用相同的端口,并且如本教程所示,只要具有相同的主機(jī)名或IP地址,就可以使用相同的主機(jī)名或IP地址。只是端口都不一樣。
group_replication_group_seeds
設(shè)置組成員的主機(jī)名和端口,新成員使用它們建立與組的連接。這些成員稱為種子成員。建立連接后,組成員身份信息在 performance_schema.replication_group_members
表中。通常, group_replication_group_seeds
列表包含hostname:port
每個組成員的列表 group_replication_local_address
,但這不是強(qiáng)制性的,可以選擇組成員的子集作為種子。Important
該hostname:port
列在group_replication_group_seeds
是種子成員的內(nèi)部IP地址,基于配置group_replication_local_address
,而不是SQLhostname:port
用于客戶端連接,并且顯示在performance_schema.replication_group_members
表中。
啟動組的server不使用此選項(xiàng),因?yàn)樗浅跏約erver,因此它負(fù)責(zé)引導(dǎo)組。第二個加入的server向組中的唯一成員申請加入,然后組得以擴(kuò)容。第三個加入的server可以向這兩個server中的任意一個申請加入,然后組再次擴(kuò)容。后續(xù)server在加入時重復(fù)此過程。
Warning
當(dāng)多個server同時加入時,請確保它們已在組中的種子成員。不要使用同時正在申請加入組的種子成員,因?yàn)樗麄兛赡茉谠L問時尚未加入群組。
首先啟動引導(dǎo)成員并讓它創(chuàng)建組, 然后使其成為正在加入的其余成員的種子成員。這確保了當(dāng)加入其余成員時已有一個組。
不支持創(chuàng)建組并同時加入多個成員。在操作競爭時,這種情況可能會發(fā)生,但是加入組的行為最終會出現(xiàn)錯誤或超時。
要加入的成員必須使用種子成員在group_replication_group_seeds
選項(xiàng)中通告的相同協(xié)議(IPv4或IPv6)與種子成員通信 。出于組復(fù)制的IP地址白名單的目的,種子成員上的白名單必須包含種子成員提供的協(xié)議的加入成員的IP地址,或者解析為該協(xié)議的地址的主機(jī)名。除了加入成員之外,還必須設(shè)置此地址或主機(jī)名并列入白名單 group_replication_local_address
如果該地址的協(xié)議與種子成員的通告協(xié)議不匹配。如果加入成員沒有適當(dāng)協(xié)議的白名單地址,則拒絕其連接嘗試。有關(guān)更多信息,請參見 第18.5.1節(jié)“IP地址白名單”。
group_replication_bootstrap_group
指示插件是否是引導(dǎo)組。Important
此選項(xiàng)在任何時候只能在一個server實(shí)例上使用,通常是首次引導(dǎo)組時(或在整個組被崩潰然后恢復(fù)的情況下)。如果您多次引導(dǎo)組,例如,當(dāng)多個server實(shí)例設(shè)置了此選項(xiàng),則它們可能會人為地造成腦裂的情況,其中存在兩個具有相同名稱的不同組。在第一個server實(shí)例加入組后禁用此選項(xiàng)。
組中的所有server成員的配置都非常相似。您需要更改每個server的詳細(xì)信息(例如server_id
, datadir
,group_replication_local_address
)。這將在本教程的后面進(jìn)行介紹。
組復(fù)制使用異步復(fù)制協(xié)議來實(shí)現(xiàn)分布式恢復(fù),在將組成員加入組之前將其同步。分布式恢復(fù)過程依賴于group_replication_recovery復(fù)制通道,該復(fù)制通道用于在組成員之間傳輸事務(wù)。因此,您需要設(shè)置具有正確權(quán)限的復(fù)制用戶,以便組復(fù)制可以直接建立成員到成員的恢復(fù)復(fù)制通道。
使用配置文件啟動服務(wù)器:
mysql-8.0/bin/mysqld --defaults-file=data/s1/s1.cnf
創(chuàng)建具有REPLICATION-SLAVE權(quán)限的MySQL用戶。此操作不應(yīng)記錄到二進(jìn)制日志中,以避免將更改傳遞到其他server實(shí)例。連接到server s1并執(zhí)行以下語句:
mysql> SET SQL_LOG_BIN=0;
以下示例演示了創(chuàng)建用戶rpl_user的過程,密碼為rpl_pass。配置服務(wù)器時需要使用正確的用戶名和密碼。
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
如果禁用了二進(jìn)制日志記錄,則在創(chuàng)建用戶后再次啟用它。
mysql> SET SQL_LOG_BIN=1;
用戶進(jìn)行上述配置后,需要使用CHANGE MASTER TO語句將server配置為,在下次需要從其他成員恢復(fù)其狀態(tài)時,使用group_replication_recovery復(fù)制通道的給定憑據(jù)。執(zhí)行以下命令,將rpl_user和rpl_pass替換為創(chuàng)建用戶時使用的值。
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' \\
FOR CHANNEL 'group_replication_recovery';
分布式恢復(fù)是加入組的server執(zhí)行的第一步。如果未正確設(shè)置這些憑據(jù),server將無法執(zhí)行恢復(fù)過程并獲得與其他組成員同步,因此最終將無法加入組。
類似地,如果成員無法通過server的主機(jī)名正確識別其他成員,則恢復(fù)過程可能會失敗。建議運(yùn)行MySQL的操作系統(tǒng)都正確地配置唯一主機(jī)名,使用DNS或本地設(shè)置??梢栽趐erformance_schema.replication_group_members表的Member_host列中驗(yàn)證此主機(jī)名。如果多個組成員使用操作系統(tǒng)設(shè)置的默認(rèn)主機(jī)名,則會出現(xiàn)有成員無法解析到正確的成員地址且無法加入組的情況。在這種情況下,可以使用report_host來配置每個server唯一主機(jī)名。
默認(rèn)情況下,在MySQL 8中創(chuàng)建的用戶使用 第6.5.1.3節(jié)“緩存SHA-2插件身份驗(yàn)證”。如果您配置的用于分布式恢復(fù)的用戶_rpl_user
_使用緩存SHA-2認(rèn)證插件并沒有使用 第18.5.2,“安全套接字層支持(SSL)” 的group_replication_recovery
復(fù)制通道,RSA密鑰用于密碼交換,看第6.4.3節(jié)“創(chuàng)建SSL和RSA證書和密鑰”。您可以將rpl_user
應(yīng)該從組中恢復(fù)其狀態(tài)的成員的公鑰復(fù)制到該組,也可以將捐贈者配置為在請求時提供公鑰。
更安全的方法是將公鑰復(fù)制 rpl_user
到應(yīng)該從捐贈者恢復(fù)組狀態(tài)的成員。然后,您需要group_replication_recovery_public_key_path
在加入組的成員上配置 系統(tǒng)變量,并為其提供公鑰的路徑rpl_user
。
可選地,不×××全的方法是設(shè)置 group_replication_recovery_get_public_key=ON
捐贈者,以便他們rpl_user
在加入組時提供成員的公鑰 。無法驗(yàn)證服務(wù)器的身份,因此只有group_replication_recovery_get_public_key=ON
在您確定沒有服務(wù)器身份被泄露的風(fēng)險(xiǎn)時才會設(shè)置 ,例如通過中間人***。
配置并啟動server s1后,安裝組復(fù)制插件。然后連接到server并執(zhí)行以下命令:
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Important
在加載組復(fù)制之前 ,mysql.session用戶必須存在。 mysql.session用戶在MySQL 8.0.2版中添加了。如果使用早期版本需要初始化數(shù)據(jù)字典,則必須執(zhí)行MySQL升級過程(請參見第2.11節(jié)“升級MySQL”)。如果未運(yùn)行升級,則組復(fù)制啟動時會報(bào)錯如下: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..
要檢查插件是否已成功安裝,請執(zhí)行SHOW PLUGINS并檢查輸出。它應(yīng)該顯示如下:
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引導(dǎo)組,然后啟動組復(fù)制程序。此引導(dǎo)應(yīng)僅由單個sever獨(dú)立完成,該server啟動組并且只啟動一次。這就是為什么引導(dǎo)配置選項(xiàng)的值不保存在配置文件中的原因。如果將其保存在配置文件中,則在重新啟動時,server會自動引導(dǎo)具有相同名稱的第二個組。這將導(dǎo)致兩個不同的組具有相同的名稱。同樣的道理適用于停止和重新啟動插件,并且此選項(xiàng)設(shè)置為ON。
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
START GROUP_REPLICATION語句返回后,組就已啟動了。您可以檢查該組現(xiàn)在是否已創(chuàng)建并且其中已經(jīng)有一個成員:
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 |
+---------------------------+--------------------------------------+-------------+-------------+---------------+
此表中的信息確認(rèn)了組中有一個成員并且具有唯一的標(biāo)識符ce9be252-2b71-11e6-b8f4-00212844f856,它是在線的并且在myhost偵聽端口24801上的客戶端連接。
為了演示server確實(shí)在一個組中,并且能夠處理加載,創(chuàng)建一個表并向其中添加一些內(nèi)容。
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和二進(jìn)制日志的內(nèi)容。
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 */ |
+---------------+-----+----------------+-----------+-------------+--------------------------------------------------------------------+
如上所示,創(chuàng)建了數(shù)據(jù)庫和表對象,并且將其對應(yīng)的DDL語句寫入二進(jìn)制日志。此外,數(shù)據(jù)被插入到表中并被寫入二進(jìn)制日志。當(dāng)組成員增長并且由于新成員嘗試加入并變?yōu)樵诰€而執(zhí)行分布式恢復(fù)時,二進(jìn)制日志條目的重要性將在以下部分中說明。
此時,組中有一個成員,已經(jīng)有一些數(shù)據(jù)存在的server s1。此時就可以通過添加先前配置的其他兩個server來擴(kuò)展組了。
為了添加第二個實(shí)例server s2,首先為它創(chuàng)建配置文件。該配置類似于用于server s1的配置,除了諸如數(shù)據(jù)目錄的位置,s2將要監(jiān)聽的端口或其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
然后按如下所示配置恢復(fù)憑據(jù)。由于用戶在組中共享,該命令與設(shè)置server s1時使用的命令相同。在s2上執(zhí)行以下語句。
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身份驗(yàn)證插件(MySQL 8中的默認(rèn)設(shè)置),請參閱 使用組復(fù)制和緩存SHA-2用戶憑據(jù)插件。
安裝組復(fù)制插件,并啟動將server加入組的程序。以下示例使用與部署server s1時相同的方式安裝插件。
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
將server s2添加到組。
mysql> START GROUP_REPLICATION;
與之前的步驟不同,這里與s1上執(zhí)行的那些步驟有一個區(qū)別,就是不執(zhí)行SET GLOBAL group_replication_bootstrap_group = ON的操作; 在啟動組復(fù)制之前,因?yàn)樵摻M已由server s1創(chuàng)建和引導(dǎo)。此時,server s2只需要添加到已經(jīng)存在的組中。
Tip
當(dāng)組復(fù)制成功啟動并且服務(wù)器加入組時,它會檢查super_read_only
變量。通過super_read_only
在成員的配置文件中設(shè)置為ON,可以確保因任何原因啟動組復(fù)制時出現(xiàn)故障的服務(wù)器不接受事務(wù)。如果服務(wù)器應(yīng)將該組作為讀寫實(shí)例加入,例如作為單主組中的主要組或多主組的成員,則當(dāng)該super_read_only
變量設(shè)置為ON時,則在加入時會將其設(shè)置為OFF。
再次檢查performance_schema.replication_group_members表,可以看出組中現(xiàn)在有兩個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也被標(biāo)記為ONLINE,它必須已經(jīng)與server s1同步。按照如下方式驗(yàn)證它確實(shí)與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復(fù)制了更改。按照分布式恢復(fù)過程,這意味著加入組之后并且在即將被聲明在線之前,server s2自動地連接到server s1并且從其獲取丟失的數(shù)據(jù)。換句話說,它從s1的二進(jìn)制日志中復(fù)制了它在加入組的時間節(jié)點(diǎn)之前缺少的事務(wù)。
向組添加其他實(shí)例與添加第二個server基本上是相同的步驟,除了配置必須更改為對應(yīng)的server??偨Y(jié)所需的命令如下:
1.創(chuàng)建配置文件
[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通道的恢復(fù)憑據(jù)。
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被引導(dǎo)并且正在運(yùn)行,并且已經(jīng)加入組且已與組中的其他server成員同步。訪問performance_schema.replication_group_members表再次確認(rèn)真實(shí)情況確實(shí)如此。
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上發(fā)出此相同的查詢會產(chǎn)生相同的結(jié)果。此外,您可以驗(yàn)證server s3已經(jīng)同步:
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 |
+---------------+------+----------------+-----------+-------------+--------------------------------------------------------------------+
對于以上關(guān)于MGR的入門,如果大家還有更多需要了解的可以持續(xù)關(guān)注我們億速云的行業(yè)推新,如需獲取專業(yè)解答,可在官網(wǎng)聯(lián)系售前售后的,希望該文章可給大家?guī)硪欢ǖ闹R更新。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。