MySQL組複製系列文章:html
在這一篇,我演示的是如何配置MySQL組複製的多主模型(multi-primary)。在配置上,多主模型的組複製和單主模型基本沒區別。mysql
本文僅爲搭建和維護多主模型組複製拋塊小磚,若對其間涉及的術語和理論有所疑惑,可參看:sql
使用組複製技術,必需要了解它的要求和侷限性。見:組複製的要求和侷限性。數據庫
MySQL組複製支持單主模型和多主模型,它們都能保證MySQL數據庫的高可用。bootstrap
如下是單主模型組複製的配置文件:安全
[mysqld] datadir=/data socket=/data/mysql.sock server-id=100 # 必須 gtid_mode=on # 必須 enforce_gtid_consistency=on # 必須 log-bin=/data/master-bin # 必須 binlog_format=row # 必須 binlog_checksum=none # 必須 master_info_repository=TABLE # 必須 relay_log_info_repository=TABLE # 必須 relay_log=/data/relay-log # 必須,若是不給,將採用默認值 log_slave_updates=ON # 必須 sync-binlog=1 # 建議 log-error=/data/error.log pid-file=/data/mysqld.pid transaction_write_set_extraction=XXHASH64 # 必須 loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" # 必須 loose-group_replication_start_on_boot=off # 建議設置爲OFF loose-group_replication_member_weigth = 40 # 非必需,mysql 5.7.20纔開始支持該選項 loose-group_replication_local_address="ABCDEFGHIJK" # 必須,下一行也必須 loose-group_replication_group_seeds="abcdefg"
其中每一行什麼意思,我在單主模型組複製中作了很是詳細的解釋。app
多主模型和單主模型的配置文件基本相同,除了須要加入:異步
group_replication_enforce_update_everywhere_checks=ON # 非必需,但強烈建議 group_replication_single_primary_mode=OFF # 必須,表示關閉單主模型,即便用多主
須要註釋權重行,由於多主模型下沒有master的概念,因此無需選舉的權重值。socket
# loose-group_replication_member_weigth = 40
此外,除非業務依賴於默認的repeatable read
,不然建議將事務隔離級別設置爲read committed
,且不能設置爲serializable
級別(強制要求)。因此,若是容許,還能夠加上:ide
transaction_isolation = 'read-committed'
本文打算配置5個節點的多主模型複製組。
具體環境細節以下:
節點名稱 | 系統版本 | MySQL版本 | 客戶端接口(eth0) | 組內通訊接口(eth0) | 數據狀態 |
---|---|---|---|---|---|
s1 | CentOS 7 | MySQL 5.7.22 | 192.168.100.21 | 192.168.100.21 | 全新實例 |
s2 | CentOS 7 | MySQL 5.7.22 | 192.168.100.22 | 192.168.100.22 | 全新實例 |
s3 | CentOS 7 | MySQL 5.7.22 | 192.168.100.23 | 192.168.100.23 | 全新實例 |
s4 | CentOS 7 | MySQL 5.7.22 | 192.168.100.24 | 192.168.100.24 | 全新實例 |
s5 | CentOS 7 | MySQL 5.7.22 | 192.168.100.25 | 192.168.100.25 | 全新實例 |
每一個節點向外提供MySQL服務和組內通訊都使用同一個接口。
1.修改主機名,添加DNS解析。
由於組內每一個節點都使用主機名進行解析其餘成員的地址,因此必須配置好主機名,並保證每一個節點都能正確解析主機名。
在s1上執行:
hostnamectl set-hostname s1.longshuai.com hostnamectl -H 192.168.100.22 set-hostname s2.longshuai.com hostnamectl -H 192.168.100.23 set-hostname s3.longshuai.com hostnamectl -H 192.168.100.24 set-hostname s4.longshuai.com hostnamectl -H 192.168.100.25 set-hostname s5.longshuai.com cat >>/etc/hosts<<eof 192.168.100.21 s1.longshuai.com 192.168.100.22 s2.longshuai.com 192.168.100.23 s3.longshuai.com 192.168.100.24 s4.longshuai.com 192.168.100.25 s5.longshuai.com eof scp /etc/hosts 192.168.100.22:/etc scp /etc/hosts 192.168.100.23:/etc scp /etc/hosts 192.168.100.24:/etc scp /etc/hosts 192.168.100.25:/etc
2.提供配置文件。
如下是s1節點配置文件。
[mysqld] datadir=/data socket=/data/mysql.sock server-id=100 # 必須 gtid_mode=on # 必須 enforce_gtid_consistency=on # 必須 log-bin=/data/master-bin # 必須 binlog_format=row # 必須 binlog_checksum=none # 必須 master_info_repository=TABLE # 必須 relay_log_info_repository=TABLE # 必須 relay_log=/data/relay-log # 必須,若是不給,將採用默認值 log_slave_updates=ON # 必須 sync-binlog=1 # 建議 log-error=/data/error.log pid-file=/data/mysqld.pid transaction_isolation = 'read-committed' # 建議項 transaction_write_set_extraction=XXHASH64 # 必須 loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" # 必須 loose-group_replication_enforce_update_everywhere_checks=ON # 非必需,但強烈建議 loose-group_replication_single_primary_mode=OFF # 必須,關閉單主模型,即便用多主 loose-group_replication_start_on_boot=off # 建議設置爲OFF loose-group_replication_local_address="192.168.100.21:20001" # 必須 # 下一行也必須,這裏我將全部節點都添加到種子節點列表中 loose-group_replication_group_seeds="192.168.100.21:20001,192.168.100.22:20002,192.168.100.23:20003,192.168.100.24:20004,192.168.100.25:20005"
s二、s三、s4和s5節點的配置文件和s1相似,但server_id
和loose-group_replication_local_address
必須改爲各節點對應的值。
s2的配置(未包括和s1相同的配置):
server_id=110 loose-group_replication_local_address="192.168.100.22:20002"
s3的配置(未包括和s1相同的配置):
server_id=120 loose-group_replication_local_address="192.168.100.23:20003"
s4的配置(未包括和s1相同的配置):
server_id=130 loose-group_replication_local_address="192.168.100.24:20004"
s5的配置(未包括和s1相同的配置):
server_id=140 loose-group_replication_local_address="192.168.100.25:20005"
配置結束後,啓動mysqld實例。
systemctl start mysqld
3.建立複製用戶,並設置恢復通道"group_replication_recovery"。
我這裏將s1做爲組內的第一個節點。因此只需在s1上建立複製用戶便可,之後其餘節點加入組時,會將該操做複製走。
在s1上執行:
mysql> create user repl@'192.168.100.%' identified by 'P@ssword1!'; mysql> grant replication slave on *.* to repl@'192.168.100.%';
設置恢復階段的異步複製通道:
在s1上執行:
mysql> change master to master_user='repl', master_password='P@ssword1!' for channel 'group_replication_recovery';
注意:後面的操做中,若是沒有明確指定在s二、s三、s4和s5上執行,那麼都是在s1上執行的。有些操做是不容許在多個節點上都執行的。
4.在s1上安裝組複製插件,並引導建立複製組。
安裝組複製插件,在s1上執行:
mysql> install plugin group_replication soname 'group_replication.so';
以s1節點組的引導節點,在s1上執行:
mysql> set @@global.group_replication_bootstrap_group=on; mysql> start group_replication; mysql> set @@global.group_replication_bootstrap_group=off;
執行完上面的語句後,本實驗所需的複製組就已經被節點s1建立了。之後s2-s5節點就能夠陸續地加入到組中。
在其餘節點加組以前,先看下組中的節點s1是否已ONLINE。
mysql> select * from performance_schema.replication_group_members\G *************************** 1. row *************************** CHANNEL_NAME: group_replication_applier MEMBER_ID: a659234f-6aea-11e8-a361-000c29ed4cf4 MEMBER_HOST: s1.longshuai.com MEMBER_PORT: 3306 MEMBER_STATE: ONLINE
5.向組中加入新節點:s二、s三、s四、s5。
在s二、s三、s4和s5上都執行:
change master to master_user='repl', master_password='P@ssword1!' for channel 'group_replication_recovery'; install plugin group_replication soname 'group_replication.so';
而後依次在s二、s三、s4和s5上執行下面的語句開啓組複製功能,開啓該功能後,將自動加入到組中。但注意,要依次執行,在每一個start語句返回成功後再去下一個節點執行:
start group_replication;
6.查看組中成員s一、s二、s三、s四、s5是否全都ONLINE。
在任意一個節點上執行:
mysql> select * from performance_schema.replication_group_members\G *************************** 1. row *************************** CHANNEL_NAME: group_replication_applier MEMBER_ID: 22e55db0-7604-11e8-b72d-000c29b06c3c MEMBER_HOST: s5.longshuai.com MEMBER_PORT: 3306 MEMBER_STATE: ONLINE *************************** 2. row *************************** CHANNEL_NAME: group_replication_applier MEMBER_ID: a5165443-6aec-11e8-a8f6-000c29827955 MEMBER_HOST: s2.longshuai.com MEMBER_PORT: 3306 MEMBER_STATE: ONLINE *************************** 3. row *************************** CHANNEL_NAME: group_replication_applier MEMBER_ID: a659234f-6aea-11e8-a361-000c29ed4cf4 MEMBER_HOST: s1.longshuai.com MEMBER_PORT: 3306 MEMBER_STATE: ONLINE *************************** 4. row *************************** CHANNEL_NAME: group_replication_applier MEMBER_ID: ba505889-6aec-11e8-a864-000c29b0bec4 MEMBER_HOST: s3.longshuai.com MEMBER_PORT: 3306 MEMBER_STATE: ONLINE *************************** 5. row *************************** CHANNEL_NAME: group_replication_applier MEMBER_ID: bf12fe97-6aec-11e8-a909-000c29e55287 MEMBER_HOST: s4.longshuai.com MEMBER_PORT: 3306 MEMBER_STATE: ONLINE 5 rows in set (0.00 sec)
多主模型下,全部節點均可以進行讀、寫操做。但請注意,組複製的幾個要求:表必須爲innodb表(雖然建立myisam表不報錯,但修改數據會報錯)、每一個表必須有主鍵、不能有級聯的外鍵等。
在任意節點上執行如下寫操做進行測試:
create database mut_gr; create table mut_gr.t1(id int primary key); insert into mut_gr.t1 values(1),(2),(3),(4);
在任意節點上繼續執行寫操做:
insert into mut_gr.t1 values(5);
查看數據是否都已同步到各節點上。
關於組複製更多維護操做,好比如何重啓組、如何安全退組、如何從新加組等等,仍是請參看單主模型的組複製,它們的維護是相似的,因此本文就不對重複內容作贅述了。