一、之前也提過MGR的方式,侷限很多,但是畢竟是集羣的方式還是存在使用場景的。
1、必須使用InnoDB
2、每個表必須定義主鍵,主要用於事務衝突判斷。
3、必須使用IPV4網絡。
4、最多隻支持 9 個節點。
5、網絡問題會影響性能。
6、死鎖問題等。
二、這裏介紹MGR的部署安裝過程,僅供參考
1、dockerfile
FROM mysql:8.0.19 MAINTAINER xbd RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime COPY ./config/db/xbd_cluster.sql /docker-entrypoint-initdb.d
xbd_cluster.sql
SET SQL_LOG_BIN=0; CREATE USER 'xbd'@'%' IDENTIFIED BY 'xbd'; GRANT REPLICATION SLAVE ON *.* TO 'xbd'@'%'; FLUSH PRIVILEGES; CHANGE MASTER TO MASTER_USER='xbd', MASTER_PASSWORD='xbd' FOR CHANNEL 'group_replication_recovery'; SET SQL_LOG_BIN=1;
2、docker-compose.yml
version: "2" services: xbd-cluster-1: build: context: ./ dockerfile: ./config/Dockerfile/Dockerfile-cluster image: xbd-cluster-1 restart: always container_name: xbd-cluster-1 volumes: - /var/lib/mysql/xbd-cluster-1:/var/lib/mysql ports: - 3306:3306 environment: - TZ=Asia/Shanghai - MYSQL_ROOT_PASSWORD=root privileged: true command: ['--server-id=1', '--gtid_mode=ON', '--enforce_gtid_consistency=ON', '--master_info_repository=TABLE', '--relay_log_info_repository=TABLE', '--binlog_checksum=NONE', '--log_slave_updates=ON', '--log-bin=xbd-cluster-1-bin', '--binlog_format=ROW', '--transaction_write_set_extraction=XXHASH64', '--plugin_load_add=group_replication.so', '--loose-group_replication_group_name=aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', '--loose-group_replication_start_on_boot=off', '--loose-group_replication_local_address=xbd-cluster-1:33061', '--loose-group_replication_group_seeds=xbd-cluster-1:33061,xbd-cluster-2:33062,xbd-cluster-3:33063', '--loose-group_replication_bootstrap_group=off', '--loose-group_replication_single_primary_mode=off', '--loose-group_replication_enforce_update_everywhere_checks=on', '--lower_case_table_names=1', '--character-set-server=utf8', '--collation-server=utf8_general_ci', '--sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'] xbd-cluster-2: build: context: ./ dockerfile: ./config/Dockerfile/Dockerfile-cluster image: xbd-cluster-2 restart: always container_name: xbd-cluster-2 volumes: - /var/lib/mysql/xbd-cluster-2:/var/lib/mysql ports: - 3307:3306 environment: - TZ=Asia/Shanghai - MYSQL_ROOT_PASSWORD=root privileged: true command: ['--server-id=2', '--gtid_mode=ON', '--enforce_gtid_consistency=ON', '--master_info_repository=TABLE', '--relay_log_info_repository=TABLE', '--binlog_checksum=NONE', '--log_slave_updates=ON', '--log-bin=xbd-cluster-2-bin', '--binlog_format=ROW', '--transaction_write_set_extraction=XXHASH64', '--plugin_load_add=group_replication.so', '--loose-group_replication_group_name=aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', '--loose-group_replication_start_on_boot=off', '--loose-group_replication_local_address=xbd-cluster-2:33062', '--loose-group_replication_group_seeds=xbd-cluster-1:33061,xbd-cluster-2:33062,xbd-cluster-3:33063', '--loose-group_replication_bootstrap_group=off', '--loose-group_replication_single_primary_mode=off', '--loose-group_replication_enforce_update_everywhere_checks=on', '--lower_case_table_names=1', '--character-set-server=utf8', '--collation-server=utf8_general_ci', '--sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'] xbd-cluster-3: build: context: ./ dockerfile: ./config/Dockerfile/Dockerfile-cluster image: xbd-cluster-3 restart: always container_name: xbd-cluster-3 volumes: - /var/lib/mysql/xbd-cluster-3:/var/lib/mysql ports: - 3308:3306 environment: - TZ=Asia/Shanghai - MYSQL_ROOT_PASSWORD=root privileged: true command: ['--server-id=3', '--gtid_mode=ON', '--enforce_gtid_consistency=ON', '--master_info_repository=TABLE', '--relay_log_info_repository=TABLE', '--binlog_checksum=NONE', '--log_slave_updates=ON', '--log-bin=xbd-cluster-3-bin', '--binlog_format=ROW', '--transaction_write_set_extraction=XXHASH64', '--plugin_load_add=group_replication.so', '--loose-group_replication_group_name=aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', '--loose-group_replication_start_on_boot=off', '--loose-group_replication_local_address=xbd-cluster-3:33063', '--loose-group_replication_group_seeds=xbd-cluster-1:33061,xbd-cluster-2:33062,xbd-cluster-3:33063', '--loose-group_replication_bootstrap_group=off', '--loose-group_replication_single_primary_mode=off', '--loose-group_replication_enforce_update_everywhere_checks=on', '--lower_case_table_names=1', '--character-set-server=utf8', '--collation-server=utf8_general_ci', '--sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION']
配置說明:
# 服務ID,必須唯一 server-id=1 # 開啓GTID,必須開啓 gtid_mode=ON # 強制GTID的一致性 enforce_gtid_consistency=ON # 基於安全的考慮,MGR集羣要求複製模式要改成slave記錄記錄到表中,不然就報錯 master_info_repository=TABLE # 基於安全的考慮,MGR集羣要求複製模式要改成slave記錄記錄到表中,不然就報錯 relay_log_info_repository=TABLE # binlog校驗規則,8.0.21以後不需要設置 binlog_checksum=NONE # 因爲集羣會在故障恢復時互相檢查binlog的數據, 所以需要記錄下集羣內其他服務器發過來已經執行過的binlog,按GTID來區分是否執行過. log_slave_updates=ON # binlog前綴 log-bin=xbd-cluster-1-bin # binlog格式,MGR要求必須是ROW binlog_format=ROW # 記錄事務的算法,官網建議設置該參數使用 XXHASH64 算法 transaction_write_set_extraction=XXHASH64 # 預裝插件 plugin_load_add=group_replication.so # 主要是用來區分整個內網裏邊的各個不同的GROUP,而且也是這個group內的GTID值的UUID loose-group_replication_group_name=aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa # 是否隨服務器啓動而自動啓動組複製,不建議直接啓動,怕故障恢復時有擾亂數據準確性的特殊情況 loose-group_replication_start_on_boot=off # 本地MGR的IP地址和端口,host:port,是MGR的端口,不是數據庫的端口 loose-group_replication_local_address=xbd-cluster-1:33061 # 需要接受本MGR實例控制的服務器IP地址和端口,是MGR的端口,不是數據庫的端口 loose-group_replication_group_seeds=xbd-cluster-1:33061,xbd-cluster-2:33062,xbd-cluster-3:33063 # 開啓引導模式,添加組成員,用於第一次搭建MGR或重建MGR的時候使用,只需要在集羣內的其中一臺開啓 loose-group_replication_bootstrap_group=off # 是否啓動單主模式,如果啓動,則本實例是主庫,提供讀寫,其他實例僅提供讀,如果爲off就是多主模式了 loose-group_replication_single_primary_mode=off # 多主模式下,強制檢查每一個實例是否允許該操作,如果不是多主,可以關閉 loose-group_replication_enforce_update_everywhere_checks=on
3、啓動部署
1)完成docker-compose的部署
docker-compose up &
2)在其中的一個節點執行,這裏選擇xbd-cluster-1
SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF;
3)其他節點執行,xbd-cluster-2,xbd-cluster-3
RESET MASTER; SET GLOBAL group_replication_recovery_get_public_key=ON; START GROUP_REPLICATION;
4、測試查看
SELECT * FROM `performance_schema`.replication_group_members;
5、測試數據同步,新建數據庫測試
三、工程目錄需要的文件