docker-compose值mysql集群模式(MGR)

  一、之前也提过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、测试数据同步,新建数据库测试

  

 

   三、工程目录需要的文件

  

  

  

posted @ 2022-11-23 20:06  小不点丶  阅读(795)  评论(0编辑  收藏  举报