美文网首页
mysql group replication 组复制

mysql group replication 组复制

作者: 陆阳226 | 来源:发表于2021-03-14 20:31 被阅读0次

环境

虚拟机中使用docker搭建mysql实例, 单主模式, 使用的是最新的mysql镜像版本:8.0.21, 按照官方文档弄的也踩了不少坑, 下面的配置有些跟官方文档有些不一样

mysql配置

[mysqld]                                                                          disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"

# 每个实例配置需要配置成不同的id
server_id=1

gtid-mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
default_authentication_plugin=mysql_native_password

# 不加loose前缀, mysql较新的版本初始化启动时会失败
loose-plugin_load_add='group_replication.so'
# 网上生成的uuid
loose-group_replication_group_name="a31e4bde-840c-11eb-8dcd-0242ac130003"
loose-group_replication_start_on_boot=off
# db1是本MySQL实例的容器名, 同一个docker bridge网络中的容器可以使用容器名互联
loose-group_replication_local_address= "db1:33061"
# 这里填写已经在group中运行的实例的地址, 非主服务器使用, 填写主服务器地址即可
loose-group_replication_group_seeds= "db1:33061"
loose-group_replication_bootstrap_group=off

[client]
default-character-set = utf8

docker-compose配置

文件结构如下: conf文件夹放置配置文件, data文件夹作为容器的数据挂载

.
├── db1
│   ├── conf
│   └── data
├── db2
│   ├── conf
│   └── data
├── db3
│   ├── conf
│   └── data
└── docker-compose.yml

docker-compose配置文件:

version:'3'                                                                                                                              
networks:
  mgr:
    name: mgr-net

services:
  db1:
    image: mysql
    container_name: db1
    volumes:
      - ./db1/conf:/etc/mysql/conf.d
      - ./db1/data:/var/lib/mysql
    ports:
      - 3310:3306
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes
  db2:
    image: mysql
    container_name: db2
    volumes:
      - ./db2/conf:/etc/mysql/conf.d
      - ./db2/data:/var/lib/mysql
    ports:
      - 3311:3306
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes
  db3:
    image: mysql
    container_name: db3
    volumes:
      - ./db3/conf:/etc/mysql/conf.d
      - ./db3/data:/var/lib/mysql
    ports:
      - 3312:3306
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes

启动mgr组复制

  • 启动db1 db2 db3三个mysql实例
docker-compose up -d
  • 分别进入这三个容器中执行命令:
    进入命令: docker exec -it db1 mysql
    创建用户用于分布式恢复
SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
  • 在主服务器中引导组复制
    在db1 db2 db3 中选择一个作为主服务器,执行以下命令
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
  • 创建数据用于验证组复制
    在主服务器中创建数据:
CREATE DATABASE test;
USE test;
CREATE TABLE t1 (c1 INT PRIMARY KEY NOT NULL AUTO_INCREMENT, c2 VARCHAR(10) NOT NULL);
INSERT INTO t1 VALUES (1, 'AAA');
  • 从服务器加入到复制组中
    这里就比较简单了, 一条命令就可以了
START GROUP_REPLICATION;

如果上面的命令报错:The member contains transactions not present in the group
可以执行下面的命令进行清理 (尝试部署了很多次这里每次都会报错, 官方文档上也没有说明)

reset master

然后就可以在从服务器中查看到在主服务器中创建的数据了, 如果继续新加服务器到组中, 继续上面的操作即可

查看复制组中的信息

mysql> select member_id, member_state, member_role from performance_schema.replication_group_members;
+--------------------------------------+--------------+-------------+
| member_id                            | member_state | member_role |
+--------------------------------------+--------------+-------------+
| 2de181db-847e-11eb-9524-0242ac190004 | ONLINE       | SECONDARY   |
| 2de2e0f1-847e-11eb-840d-0242ac190003 | ONLINE       | PRIMARY     |
| 2de387b8-847e-11eb-9846-0242ac190002 | ONLINE       | SECONDARY   |
+--------------------------------------+--------------+-------------+

其他注意

复制组中的服务器在重启之后, 需要手动命令恢复组

# 主服务器
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;

# 从服务器
START GROUP_REPLICATION;

相关文章

网友评论

      本文标题:mysql group replication 组复制

      本文链接:https://www.haomeiwen.com/subject/sksccltx.html