環境
CentOS 7
MySQL 8.0
數據庫節點:
192.168.6.151 node1 server-id為1
192.168.6.152 node2 server-id為2
192.168.6.153 node3 server-id為3
安裝MySQL8.0
yum localinstall -y https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm yum install -y mysql-community-server systemctl start mysqld systemctl status mysqld systemctl enable mysqld grep 'temporary password' /var/log/mysqld.log mysql -u root -p
修改密碼
set global validate_password.policy=0; set global validate_password.length=1; ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; flush privileges; exit;
配置Host
vim /etc/hosts
192.168.6.151 node1 192.168.6.152 node2 192.168.6.153 node3
修改My.cnf配置文件
在node1節點,/etc/my.cnf 修改
[mysqld] datadir = /var/lib/mysql socket = /var/lib/mysql/mysql.sock symbolic-links = 0 log-error = /var/log/mysqld.log pid-file = /var/run/mysqld/mysqld.pid #開啟GTID,必須開啟 gtid_mode=ON #強制GTID的一致性 enforce_gtid_consistency=ON #binlog格式,MGR要求必須是ROW,不過就算不是MGR,也最好用row binlog_format=row #server-id必須是唯一的 server-id = 1 #MGR使用樂觀鎖,所以官網建議隔離級別是RC,減少鎖粒度 transaction_isolation = READ-COMMITTED #因為集群會在故障恢復時互相檢查binlog的數據, #所以需要記錄下集群內其他服務器發過來已經執行過的binlog,按GTID來區分是否執行過. log-slave-updates=1 #binlog校驗規則,5.6之后的高版本是CRC32,低版本都是NONE,但是MGR要求使用NONE binlog_checksum=NONE #基於安全的考慮,MGR集群要求復制模式要改成slave記錄記錄到表中,不然就報錯 master_info_repository=TABLE #同上配套 relay_log_info_repository=TABLE #組復制設置 #記錄事務的算法,官網建議設置該參數使用 XXHASH64 算法 transaction_write_set_extraction = XXHASH64 #相當於此GROUP的名字,是UUID值,不能和集群內其他GTID值的UUID混用,可用uuidgen來生成一個新的, #主要是用來區分整個內網里邊的各個不同的GROUP,而且也是這個group內的GTID值的UUID loose-group_replication_group_name = '5dbabbe6-8050-49a0-9131-1de449167446' #IP地址白名單,默認只添加127.0.0.1,不會允許來自外部主機的連接,按需安全設置 loose-group_replication_ip_whitelist = '127.0.0.1/8,192.168.6.0/24' #是否隨服務器啟動而自動啟動組復制,不建議直接啟動,怕故障恢復時有擾亂數據准確性的特殊情況 loose-group_replication_start_on_boot = OFF #本地MGR的IP地址和端口,host:port,是MGR的端口,不是數據庫的端口 loose-group_replication_local_address = '192.168.6.151:33081' #需要接受本MGR實例控制的服務器IP地址和端口,是MGR的端口,不是數據庫的端口 loose-group_replication_group_seeds = '192.168.6.151:33081,192.168.6.152:33081,192.168.6.153:33081' #開啟引導模式,添加組成員,用於第一次搭建MGR或重建MGR的時候使用,只需要在集群內的其中一台開啟, loose-group_replication_bootstrap_group = OFF #是否啟動單主模式,如果啟動,則本實例是主庫,提供讀寫,其他實例僅提供讀,如果為off就是多主模式了 loose-group_replication_single_primary_mode = ON #多主模式下,強制檢查每一個實例是否允許該操作,如果不是多主,可以關閉 loose-group_replication_enforce_update_everywhere_checks = on
將node1的文件發送到node2和node3
rsync -e "ssh -p22" -avpgolr /etc/my.cnf root@192.168.6.152:/etc/ rsync -e "ssh -p22" -avpgolr /etc/my.cnf root@192.168.6.153:/etc/
修改server-id和loose-group_replication_local_address的相關值
重啟mysql
systemctl restart mysqld
安裝插件
mysql -uroot -p123456
install PLUGIN group_replication SONAME 'group_replication.so'; show plugins;
配置賬號
SET SQL_LOG_BIN=0; SET GLOBAL validate_password.policy=0; SET GLOBAL validate_password.length=1; CREATE USER repl@'%' IDENTIFIED BY 'repl'; GRANT REPLICATION SLAVE ON *.* TO repl@'%'; FLUSH PRIVILEGES; SET SQL_LOG_BIN=1; CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';
啟動MGR單主模式
在node1節點,啟動引導,進入mysql服務端
SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF; SELECT * FROM performance_schema.replication_group_members;
在node2\node3節點,進入mysql服務端
START GROUP_REPLICATION; SELECT * FROM performance_schema.replication_group_members;
切換到MGR多主模式
在所有數據庫節點,執行
stop group_replication; set global group_replication_single_primary_mode=OFF; set global group_replication_enforce_update_everywhere_checks=ON;
在node1節點,執行
SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF;
在node2、node3節點,執行
START GROUP_REPLICATION;
查看MGR信息
SELECT * FROM performance_schema.replication_group_members;
故障切換
多主模式
在node3上模擬故障
systemctl stop mysqld
在其它節點,如node1上,查詢MGR信息
可以看到其它節點正常進行同步。
在node3節點故障恢復
systemctl start mysqld
需要手動激活該節點的組復制功能(注意配置文件my.cnf中相關設置
START GROUP_REPLICATION;
單主模式
切換回單主模式
所有數據庫節點停止MGR
stop group_replication; set global group_replication_enforce_update_everywhere_checks=OFF; set global group_replication_single_primary_mode=ON;
選擇node1節點,作為主庫
SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF;
其它節點(node2、node3),執行
START GROUP_REPLICATION;
查詢MGR狀態
SELECT * FROM performance_schema.replication_group_members;
在主節點node1模擬故障,在node2查詢MGR狀態
可以看到主節點掛了,通過選舉程序從從庫節點中選擇一個作為主節點。
node1故障恢復之后,需要手動激活該節點的組復制功能
START GROUP_REPLICATION;