(一)主機操作
(1)主機信息
主機名稱 | IP地址 | 操作系統版本 | 數據庫版本 |
mgr-node1 | 192.168.10.11 | centos 7.4 ,64-bit | mysql社區版 5.7.24 |
mgr-node2 | 192.168.10.12 | centos 7.4 , 64-bit | mysql社區版 5.7.24 |
mgr-node3 | 192.168.10.13 | centos 7.4 ,64-bit | mysql社區版 5.7.24 |
配置所有主機的hosts文件:
[root@mgr-node1 data]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.10.11 mgr-node1 192.168.10.12 mgr-node2 192.168.10.13 mgr-node3
(2)關閉所有節點的防火牆和selinux
# 關閉防火牆
# 查看防火牆狀態,正在運行 [root@mgr-node1 ~]# firewall-cmd --state running
# 關閉防火牆 [root@mgr-node1 ~]# service firewalld stop Redirecting to /bin/systemctl stop firewalld.service [root@mgr-node1 ~]# firewall-cmd --state not running
# 永久關閉防火牆 [root@mgr-node1 ~]# systemctl disable firewalld.service Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. #禁用selinux [root@mgr-node1 ~]# vi /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of three two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted
(二)安裝MySQL數據庫
這里在每個節點安裝MySQL軟件,過程見:https://www.cnblogs.com/lijiaman/p/10743102.html
參數文件:/etc/my.cnf
# 設置mysql的安裝目錄
basedir=/mysql
# 設置mysql數據庫的數據的存放目錄
datadir=/mysql/data
(三)組復制的要求
如果要啟用組復制,數據庫需要滿足以下要求:
(1)基礎要求
- innodb存儲引擎:組復制表必須放在innodb存儲引擎中;
- 主鍵:組復制的每個表必須有主鍵或者等效的主鍵(列非空且唯一);
- IPv4網絡:組復制僅支持IPv4網絡;
- 網絡性能:組復制最好部署在非常近的集群環境中。
(2)參數配置要求
- 二進制日志處於活動狀態(--log-bin)。組復制依賴於二進制日志 ,需要開啟;
- 副本集跟新日志(--log-slave-updates) 。如果不設置該參數,那么bin-log只會記錄直接在該庫上執行的SQL語句,由replication機制的SQL線程讀取relay-log而執行的SQL語句並不會記錄到bin-log。由於組復制日志來源不一定是主節點,也可能日志來源於其它節點,所以即使不是在服務器本身上啟動的那些事務,每個事務的副本也必須存在於每個服務器上;
- 二進制日志格式(--binlog-format=row) ;
- 關閉日志校驗(--binlog-checksum=none) ;
- 全局事物打開(gtid_mode=on) 。組復制使用全局事務標識符來精確跟蹤已在每個服務器實例上提交了哪些事務,從而能夠推斷出哪些服務器執行了可能與其他位置已提交的事務發生沖突的事務;
- 復制信息存儲庫(master_info_repository=TABLE 和 relay_log_info_repository=TABLE) 。復制應用程序需要將源和副本元數據寫入 mysql.slave_master_info和 mysql.slave_relay_log_info表。這樣可以確保組復制插件對復制元數據具有一致的可恢復性和事務管理;
- 事物寫集提取(--transaction-write-set-extraction=XXHASH64) 。以便在收集行以將其記錄到二進制日志時,服務器也收集寫集。寫集基於每行的主鍵,並且是標簽的簡化且緊湊的視圖,該標簽唯一地標識已更改的行。然后,該標簽用於檢測沖突。
- 小寫表格名稱(--lower-case-table-names) 。 在所有組成員上設置為相同的值。設置1對於使用InnoDB存儲引擎是正確的 ,這對於組復制是必需的。請注意,該設置並非在所有平台上都是默認設置。
- 多線程應用程序(Set slave_parallel_workers=N (where N is the number of parallel applier threads), slave_preserve_commit_order=1, and slave_parallel_type=LOGICAL_CLOCK) 。
(四)配置組復制(Group Replication)--采用多主模式
創建binlog日志存放路徑,三個節點都要創建:
[root@mgr-node1 etc]# mkdir -p /mysql/binlog/ [root@mgr-node1 etc]# chown -R mysql:mysql /mysql/binlog
(1)節點1配置組復制
(1.1)在節點1上添加如下參數,重啟實例
# 復制參數 server_id = 1 gtid_mode = on enforce_gtid_consistency = on master_info_repository=TABLE relay_log_info_repository=TABLE binlog_checksum=NONE log_bin = /mysql/binlog/mgr-node1-bin log-slave-updates = 1 binlog_format = row sync-master-info = 1 sync_binlog = 1 skip_slave_start = 1 #group replication參數 transaction_write_set_extraction=XXHASH64 #以便在server收集寫集合的同時將其記錄到二進制日志。寫集合基於每行的主鍵,並且是行更改后的唯一標識此標識將用於檢測沖突。 loose-group_replication_group_name="dc04ba77-bcf2-11ea-85bf-000c295111ae" #組的名字可以隨便起,但不能用主機的GTID! 所有節點的這個組名必須保持一致! loose-group_replication_start_on_boot=off #啟動mysql時不自動啟動組復制 loose-group_replication_local_address= "192.168.10.11:24901" #本機IP地址,24901用於接收來自其他組成員的傳入連接 loose-group_replication_group_seeds= "192.168.10.11:24901,192.168.10.12:24901,192.168.10.13:24901" # 當前主機成員需要加入組時,Server先訪問這些種子成員中的一個,然后它請求重新配置以允許它加入組,
# 需要注意的是,此參數不需要列出所有組成員,只需列出當前節點加入組需要訪問的節點即可。 loose-group_replication_bootstrap_group=off # 是否自動引導組。此選項只能在一個server實例上使用,通常是首次引導組時(或在整組成員關閉的情況下),如果多次引導,可能出現腦裂。 loose-group_replication_single_primary_mode=off #關閉單主模式的參數(本例測試時多主模式,所以關閉該項) loose-group_replication_enforce_update_everywhere_checks=on #開啟多主模式的參數 loose-group_replication_ip_whitelist="192.168.10.0/24,127.0.0.1/8" # 允許加入組復制的客戶機來源的ip白名單
(1.2)創建組復制的用戶
組復制使用異步復制協議來實現分布式恢復,在將組成員加入組之前對其進行同步,分布式恢復過程依賴於group_replication_recovery通道,該通道用於組成員之間傳輸數據。因此,需要設置具有正確權限的復制用戶,以便組復制可以建立成員到成員的數據恢復。
用於數據復制的用戶需要有REPLICATION_SLAVE特權,用戶的創建有2種方法:
方法一:第一個節點創建復制用戶,二進制日志中捕獲創建用戶的過程,然后依靠分布式恢復來復制創建用戶的語句。[注:奇怪的是,網上都不使用這種方法
方法二:禁用二進制日志,避免將創建用戶傳播到其它實例,然后在每一個節點創建復制用戶。
這里演示第二種方法:
[root@mgr-node1 etc]# mysql -uroot -p123456 mysql> SET SQL_LOG_BIN=0; # 關閉binlog Query OK, 0 rows affected (0.00 sec) mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_slave@'%' IDENTIFIED BY '123456'; # 創建組復制的用戶 Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) mysql> reset master; Query OK, 0 rows affected (0.01 sec) mysql> SET SQL_LOG_BIN=1; # 開啟binlog Query OK, 0 rows affected (0.00 sec)
(1.3)配置節點1上的組復制並安裝組復制插件
mysql> CHANGE MASTER TO MASTER_USER='rpl_slave', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery'; Query OK, 0 rows affected, 2 warnings (0.02 sec) mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so'; Query OK, 0 rows affected (0.01 sec) mysql> SHOW PLUGINS; +----------------------------+----------+--------------------+----------------------+---------+ | Name | Status | Type | Library | License | +----------------------------+----------+--------------------+----------------------+---------+ | binlog | ACTIVE | STORAGE ENGINE | NULL | GPL | | ... ... ... ... ... | | group_replication | ACTIVE | GROUP REPLICATION | group_replication.so | GPL | +----------------------------+----------+--------------------+----------------------+---------+ 45 rows in set (0.00 sec)
(1.4)開啟節點1上的組復制
首次啟動組的過程稱為引導,使用group_replication_bootstrap_group系統變量來引導組,引導程序只能由一台服務器執行一次,且只能執行一次,這就是group_replication_bootstrap_group參數不保存在配置文件中的原因。假如將該參數保存在配置文件中,則在重啟時,server會自動引導具有相同名稱的第二個組,這將導致兩個不同的組具有相同的名稱。因此,為了安全的引導組,請連接到第一個節點執行:
mysql> SET GLOBAL group_replication_bootstrap_group=ON; Query OK, 0 rows affected (0.00 sec) mysql> START GROUP_REPLICATION; Query OK, 0 rows affected (2.10 sec) mysql> SET GLOBAL group_replication_bootstrap_group=OFF; Query OK, 0 rows affected (0.00 sec)
在執行組引導及啟動組復制后,組已經創建出來了,我們可以使用下面命令查看組信息
mysql> SELECT * FROM performance_schema.replication_group_members; +---------------------------+--------------------------------------+-------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ | group_replication_applier | 533fe6ba-bcdf-11ea-9516-000c295111ae | mgr-node1 | 3306 | ONLINE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ 1 row in set (0.00 sec)
(2)節點2配置組復制
(2.1)在節點2上添加如下參數,重啟實例
# 復制參數 server_id = 2 gtid_mode = on enforce_gtid_consistency = on master_info_repository=TABLE relay_log_info_repository=TABLE binlog_checksum=NONE log_bin = /mysql/binlog/mgr-node2-bin log-slave-updates = 1 binlog_format = row sync-master-info = 1 sync_binlog = 1 skip_slave_start = 1 #group replication參數 transaction_write_set_extraction=XXHASH64 #以便在server收集寫集合的同時將其記錄到二進制日志。寫集合基於每行的主鍵,並且是行更改后的唯一標識此標識將用於檢測沖突。 loose-group_replication_group_name="dc04ba77-bcf2-11ea-85bf-000c295111ae" #組的名字可以隨便起,但不能用主機的GTID! 所有節點的這個組名必須保持一致! loose-group_replication_start_on_boot=off #為了避免每次啟動自動引導具有相同名稱的第二個組,所以設置為OFF。 loose-group_replication_local_address= "192.168.10.12:24901" loose-group_replication_group_seeds= "192.168.10.11:24901,192.168.10.12:24901,192.168.10.13:24901" loose-group_replication_bootstrap_group=off loose-group_replication_single_primary_mode=off #關閉單主模式的參數(本例測試時多主模式,所以關閉該項) loose-group_replication_enforce_update_everywhere_checks=on #開啟多主模式的參數 loose-group_replication_ip_whitelist="192.168.10.0/24,127.0.0.1/8" # 允許加入組復制的客戶機來源的ip白名單
(2.2)創建組復制的用戶
[root@mgr-node2 etc]# mysql -uroot -p123456 mysql> SET SQL_LOG_BIN=0; # 關閉binlog Query OK, 0 rows affected (0.00 sec) mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_slave@'%' IDENTIFIED BY '123456'; # 創建組復制的用戶 Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) mysql> reset master; Query OK, 0 rows affected (0.01 sec) mysql> SET SQL_LOG_BIN=1; # 開啟binlog Query OK, 0 rows affected (0.00 sec)
(2.3)配置節點2上的組復制並安裝組復制插件
mysql> CHANGE MASTER TO MASTER_USER='rpl_slave', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery'; Query OK, 0 rows affected, 2 warnings (0.02 sec) mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so'; Query OK, 0 rows affected (0.01 sec) mysql> SHOW PLUGINS; +----------------------------+----------+--------------------+----------------------+---------+ | Name | Status | Type | Library | License | +----------------------------+----------+--------------------+----------------------+---------+ | binlog | ACTIVE | STORAGE ENGINE | NULL | GPL | | ... ... ... ... ... | | group_replication | ACTIVE | GROUP REPLICATION | group_replication.so | GPL | +----------------------------+----------+--------------------+----------------------+---------+ 45 rows in set (0.00 sec)
(2.4)開啟節點2上的組復制
在第二個節點開啟組復制的時候,不用再設置引導參數
mysql> START GROUP_REPLICATION; Query OK, 0 rows affected (2.10 sec)
查看組成員,此時有2個節點已經加入了組
mysql> SELECT * FROM performance_schema.replication_group_members; +---------------------------+--------------------------------------+-------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ | group_replication_applier | 533fe6ba-bcdf-11ea-9516-000c295111ae | mgr-node1 | 3306 | ONLINE | | group_replication_applier | 5ca45641-bcdd-11ea-918e-000c29fa726d | mgr-node2 | 3306 | ONLINE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ 2 rows in set (0.00 sec)
(3)節點3配置組復制
(3.1)在節點3上添加如下參數,重啟實例
# 復制參數 server_id = 3 gtid_mode = on enforce_gtid_consistency = on master_info_repository=TABLE relay_log_info_repository=TABLE binlog_checksum=NONE log_bin = /mysql/binlog/mgr-node3-bin log-slave-updates = 1 binlog_format = row sync-master-info = 1 sync_binlog = 1 skip_slave_start = 1 #group replication參數 transaction_write_set_extraction=XXHASH64 #以便在server收集寫集合的同時將其記錄到二進制日志。寫集合基於每行的主鍵,並且是行更改后的唯一標識此標識將用於檢測沖突。 loose-group_replication_group_name="dc04ba77-bcf2-11ea-85bf-000c295111ae" #組的名字可以隨便起,但不能用主機的GTID! 所有節點的這個組名必須保持一致! loose-group_replication_start_on_boot=off #為了避免每次啟動自動引導具有相同名稱的第二個組,所以設置為OFF。 loose-group_replication_local_address= "192.168.10.13:24901" loose-group_replication_group_seeds= "192.168.10.11:24901,192.168.10.12:24901,192.168.10.13:24901" loose-group_replication_bootstrap_group=off loose-group_replication_single_primary_mode=off #關閉單主模式的參數(本例測試時多主模式,所以關閉該項) loose-group_replication_enforce_update_everywhere_checks=on #開啟多主模式的參數 loose-group_replication_ip_whitelist="192.168.10.0/24,127.0.0.1/8" # 允許加入組復制的客戶機來源的ip白名單
(3.2)創建組復制的用戶
[root@mgr-node3 etc]# mysql -uroot -p123456 mysql> SET SQL_LOG_BIN=0; # 關閉binlog Query OK, 0 rows affected (0.00 sec) mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_slave@'%' IDENTIFIED BY '123456'; # 創建組復制的用戶 Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) mysql> reset master; Query OK, 0 rows affected (0.01 sec) mysql> SET SQL_LOG_BIN=1; # 開啟binlog Query OK, 0 rows affected (0.00 sec)
(3.3)配置節點3上的組復制並安裝組復制插件
mysql> CHANGE MASTER TO MASTER_USER='rpl_slave', MASTER_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery'; Query OK, 0 rows affected, 2 warnings (0.02 sec) mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so'; Query OK, 0 rows affected (0.01 sec) mysql> SHOW PLUGINS; +----------------------------+----------+--------------------+----------------------+---------+ | Name | Status | Type | Library | License | +----------------------------+----------+--------------------+----------------------+---------+ | binlog | ACTIVE | STORAGE ENGINE | NULL | GPL | | ... ... ... ... ... | | group_replication | ACTIVE | GROUP REPLICATION | group_replication.so | GPL | +----------------------------+----------+--------------------+----------------------+---------+ 45 rows in set (0.00 sec)
(3.4)開啟節點3上的組復制
mysql> START GROUP_REPLICATION; Query OK, 0 rows affected (2.10 sec)
查看組成員,此時所有成員已經加入到了組
mysql> SELECT * FROM performance_schema.replication_group_members; +---------------------------+--------------------------------------+-------------+-------------+--------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ | group_replication_applier | 533fe6ba-bcdf-11ea-9516-000c295111ae | mgr-node1 | 3306 | ONLINE | | group_replication_applier | 5ca45641-bcdd-11ea-918e-000c29fa726d | mgr-node2 | 3306 | ONLINE | | group_replication_applier | 62ad32e3-bcdd-11ea-9bbb-000c2978d7f6 | mgr-node3 | 3306 | ONLINE | +---------------------------+--------------------------------------+-------------+-------------+--------------+ 3 rows in set (0.00 sec)
【完】