一、簡介
MySQL Group Replication(簡稱MGR)字面意思是mysql組復制的意思,但其實他是一個高可用的集群架構,暫時只支持mysql5.7和mysql8.0版本.
是MySQL官方於2016年12月推出的一個全新的高可用與高擴展的解決方案,提供了高可用、高擴展、高可靠的MySQL集群服務.
也是mysql官方基於組復制概念並充分參考MariaDB Galera Cluster和Percona XtraDB Cluster結合而來的新的高可用集群架構.
MySQL Group Replication是建立在基於Paxos的XCom之上的,正因為有了XCom基礎設施,保證數據庫狀態機在節點間的事務一致性,才能在理論和實踐中保證數據庫系統在不同節點間的事務一致性。
由一般主從復制概念擴展,多個節點共同組成一個數據庫集群,事務的提交必須經過半數以上節點同意方可提交,在集群中每個節點上都維護一個數據庫狀態機,保證節點間事務的一致性。
優點:
高一致性,基於原生復制及paxos協議的組復制技術.
高容錯性,有自動檢測機制,當出現宕機后,會自動剔除問題節點,其他節點可以正常使用(類似zk集群),當不同節點產生資源爭用沖突時,會按照先到先得處理,並且內置了自動化腦裂防護機制.
高擴展性,可隨時在線新增和移除節點,會自動同步所有節點上狀態,直到新節點和其他節點保持一致,自動維護新的組信息.
高靈活性,直接插件形式安裝(5.7.17后自帶.so插件),有單主模式和多主模式,單主模式下,只有主庫可以讀寫,其他從庫會加上super_read_only狀態,只能讀取不可寫入,出現故障會自動選主.
缺點:
還是太新,不太穩定,暫時性能還略差於PXC,對網絡穩定性要求很高,至少是同機房做.
二、環境介紹
MySQL版本:8.0.15
數據庫端口:3306
集群復制端口:33006
MGR插件:group_replication.so
10.115.88.18:單主
10.115.88.19:從
10.115.88.20:從
三、安裝MySQL 8.0.15
3.1.1 下載地址:
https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.15-linux-glibc2.12-x86_64.tar
3.1.2: 安裝數據庫
- 解壓
tar -xf mysql-8.0.15-linux-glibc2.12-x86_64.tar -C /home/work
- 進入解壓目錄
cd /home/work tar xf mysql-8.0.15-linux-glibc2.12-x86_64.tar.gz mv mysql-8.0.15-linux-glibc2.12-x86_64 mysql rm -rf *.xz
- 授予權限並創建數據目錄
cd /home/work tar xf mysql-8.0.15-linux-glibc2.12-x86_64.tar.gz mv mysql-8.0.15-linux-glibc2.12-x86_64 mysql rm -rf *.xz
chown -R work:work mysql
mkdir data
chown work:work data
cd /home/work/mysql
cd /home/work
mkdir /home/work/relaylog
chown -R work:work relaylog
cd /home/work/mysql
mkdir run
chown -R work:work run
- 添加my.cnf文件
[client] default-character-set=utf8 socket=/home/work/mysql/run/mysql.sock [mysqld] user = work port = 3306 basedir=/home/work/mysql datadir=/home/work/data socket=/home/work/mysql/run/mysql.sock pid-file=/home/work/mysql/run/mysqld.pid # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 lower_case_table_names = 1 server-id = 183306 log-bin = mysql-bin log-bin-index = binlogs.index binlog_format = row binlog_rows_query_log_events = on binlog_checksum = none slave-parallel-type = LOGICAL_CLOCK slave-parallel-workers = 4 slave_preserve_commit_order = 1 #GITD gtid_mode = on enforce_gtid_consistency = 1 log-slave-updates = 1 binlog_gtid_simple_recovery = 1 relay_log = /home/work/relaylog/relay.log relay-log-index = /home/work/relaylog/relay.index master_info_repository = table relay_log_info_repository = table plugin_load="group_replication=group_replication.so" #MGR #GR配置項 基中loose前綴表示若group Replication plugin未加載 mysql server仍明治維新啟動 transaction_write_set_extraction = XXHASH64 #對每個事務獲取write set,並且用XXHASH64算法獲取hash值 loose-group_replication_group_name = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" #組名,此處可拿select.uuid()生成 loose-group_replication_start_on_boot = off #在mysqld啟動時不自動啟動組復制 loose-group_replication_local_address = "10.115.88.18:33006" #本節點的IP地址和端口,注意該端口是組內成員之間通信的端口,而不是MySQL對外提供服務的端口 loose-group_replication_group_seeds = "10.115.88.18:33006,10.115.88.19:33006,10.115.88.20:33006" #種子節點的IP和端口號,新成員加入到集群的時候需要聯系種子節點,啟動集群的節點不使用該選項 loose-group_replication_bootstrap_group = off #關閉,如果打開會造成腦裂 #是否啟動集群,注意,該選項任何時候只能用於一個節點,通常情況下啟動集群的時候使用,啟動之后需要關閉該選項 loose-group_replication_member_weight = 50 #權重選擇 skip-host-cache skip-name-resolve skip-external-locking character-set-server=utf8 lower_case_table_names=1 event_scheduler=on log_bin_trust_function_creators=on max_connections = 3000 external-locking = FALSE max_allowed_packet = 32M sort_buffer_size = 8M join_buffer_size = 2M thread_cache_size = 300 #query_cache_size = 64M #query_cache_limit = 4M read_rnd_buffer_size = 8M innodb_buffer_pool_size = 8096M innodb_log_file_size = 128M innodb_log_files_in_group = 2 innodb_log_buffer_size = 2M innodb_flush_log_at_trx_commit = 1 sync_binlog = 1 [mysqld_safe] log-error=/home/work/data/err.log
- 初始化數據庫
bin/mysqld --initialize --basedir=/home/work/mysql --lower-case-table-names=1 --datadir=/home/work/data/ --user=work
- 拷貝啟動文件
cp support-files/mysql.server /etc/init.d/mysqld
- 添加環境變量
echo 'export PATH=/home/work/mysql/bin:$PATH' >>/etc/profile source /etc/profile
- 數據庫啟動
/etc/init.d/mysqld start
- 修改數據庫密碼
alter user'root'@'localhost' IDENTIFIED BY 'dashuaige'; flush privileges;
四、配置MGR主
4.1.1 配置my.cnf文件
修改binlog如下:
server-id = 103306 log-bin = mysql-bin log-bin-index = binlogs.index binlog_format = row binlog_rows_query_log_events = on binlog_checksum = none slave-parallel-type = LOGICAL_CLOCK slave-parallel-workers = 4 slave_preserve_commit_order = 1
修改GTID如下:
gtid_mode = on enforce_gtid_consistency = 1 log-slave-updates = 1 binlog_gtid_simple_recovery = 1 relay_log = /home/work/relaylog/relay.log relay-log-index = /home/work/relaylog/relay.index master_info_repository = table relay_log_info_repository = table
添加MGR插件
plugin_load="group_replication=group_replication.so"
修改MGR參數
#GR配置項 基中loose前綴表示若group Replication plugin未加載 mysql server仍明治維新啟動 transaction_write_set_extraction = XXHASH64 #對每個事務獲取write set,並且用XXHASH64算法獲取hash值 loose-group_replication_group_name = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" #組名,此處可拿select.uuid()生成 loose-group_replication_start_on_boot = off #在mysqld啟動時不自動啟動組復制 loose-group_replication_local_address = "10.115.88.18:33006" #本節點的IP地址和端口,注意該端口是組內成員之間通信的端口,而不是MySQL對外提供服務的端口 loose-group_replication_group_seeds = "10.115.88.18:33006,10.115.88.19:33006,10.115.88.20:33006" #種子節點的IP和端口號,新成員加入到集群的時候需要聯系種子節點,啟動集群的節點不使用該選項 loose-group_replication_bootstrap_group = off #關閉,如果打開會造成腦裂 #是否啟動集群,注意,該選項任何時候只能用於一個節點,通常情況下啟動集群的時候使用,啟動之后需要關閉該選項 loose-group_replication_member_weight = 50 #權重選擇
啟動數據庫
/etc/init.d/mysqld restart
4.1.2 配置每台hosts主機解析
[root@bj1-10-115-88-18 mysql]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.115.88.18 bj1-10-115-88-18 10.115.88.19 bj1-10-115-88-19 10.115.88.20 bj1-10-115-88-20
4.1.3 配置mgr第一個主節點
以下步驟在10.115.88.18主機上的mysql中執行
第一步:創建用於復制的用戶
set sql_log_bin=0; create user repuser@'%' identified by 'repuser123'; grant replication slave,replication client on *.* to repuser@'%'; create user repuser@'127.0.0.1' identified by 'repuser123'; grant replication slave,replication client on *.* to repuser@'127.0.0.1'; create user repuser@'localhost' identified by 'repuser123'; grant replication slave,replication client on *.* to repuser@'localhost'; set sql_log_bin=1;
第二步:配置復制所使用的用戶
change master to master_user='repuser',master_password='repuser123' for channel 'group_replication_recovery';
第三步:安裝mysql group replication這個插件
備注:如果在my.cnf里寫寫入plugin_load="group_replication=group_replication.so" 這步就可以不用操作 install plugin group_replication soname 'group_replication.so'; 通過show plugins;查看是否安裝成功
第四步:建個群(官方點的說法就是初始化一個復制組
set global group_replication_bootstrap_group=on; start group_replication; set global group_replication_bootstrap_group=off; select * from performance_schema.replication_group_members;

五、配置另外兩節點,從
以下步驟在所有從主機上的mysql中執行
第一步:創建用於復制的用戶
set sql_log_bin=0; create user repuser@'%' identified by 'repuser123'; grant replication slave,replication client on *.* to repuser@'%'; create user repuser@'127.0.0.1' identified by 'repuser123'; grant replication slave,replication client on *.* to repuser@'127.0.0.1'; create user repuser@'localhost' identified by 'repuser123'; grant replication slave,replication client on *.* to repuser@'localhost'; set sql_log_bin=1;
第二步:配置復制所使用的用戶
change master to master_user='repuser',master_password='repuser123' for channel 'group_replication_recovery';
第三步:安裝mysql group replication這個插件
備注:如果在my.cnf里寫寫入plugin_load="group_replication=group_replication.so" 這步就可以不用操作 install plugin group_replication soname 'group_replication.so'; 通過show plugins;查看是否安裝成功
第四步:加入前面創建好的復制組
start group_replication; select * from performance_schema.replication_group_members;
如下出現以下報錯

這是binlog導致的錯誤,執行以下
reset master; start group_replication; select * from performance_schema.replication_group_members;
查看是MGR狀態:

查看MGR主的讀寫狀態

查看MGR兩台從的讀寫狀態

