[toc]

为了方面社区用户体验GreatSQL,咱们同时还提供Docker镜像,本文具体介绍如何在Docker中部署GreatSQL,并且构建一个MGR集群。

本文波及的运行环境如下:

[root@greatsql]# cat /etc/redhat-releaseCentOS Linux release 7.9.2009 (Core)[root@greatsql]# uname -aLinux GreatSQL 3.10.0-1160.11.1.el7.x86_64 #1 SMP Fri Dec 18 16:34:56 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

1、装置Docker

间接用yum装置docker,十分省事

[root@greatsql]# yum install -y docker

之后启动 docker 服务,并设置开机自启动

[root@greatsql]# systemctl enable docker[root@greatsql]# systemctl start docker

2、拉取GreatSQL镜像,并创立容器

2.1 拉取镜像

拉取GreatSQL官网镜像

[root@greatsql]# docker pull greatsql/greatsqldocker pull greatsql/greatsqlUsing default tag: latestTrying to pull repository docker.io/greatsql/greatsql ...latest: Pulling from docker.io/greatsql/greatsql...Digest: sha256:e3c7b3dcebcbb6e2a1ab60993f0999c9ce7e1c85e4a87ab4022d2c1351840f6fStatus: Downloaded newer image for docker.io/greatsql/greatsql:latest

查看是否胜利

[root@greatsql]# docker imagesREPOSITORY                    TAG                 IMAGE ID            CREATED             SIZEdocker.io/greatsql/greatsql   latest              1130a28e310b        3 days ago          570 MB

2.2 创立新容器

之后,就能够间接创立一个新的容器了,先用惯例形式

[root@greatsql]# docker run -d \--name mgr1 --hostname=mgr1 \-p 3306:3306 -p 33060:33060 -p 33061:33061 \-e MYSQL_ALLOW_EMPTY_PASSWORD=1 \-e MYSQL_IBP=1G \-e MYSQL_MGR_NAME='aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa1' \-e MYSQL_MGR_LOCAL='172.17.0.2:33061' \-e MYSQL_MGR_SEEDS='172.17.0.2:33061,172.17.0.3:33061,172.17.0.4:33061' \-e MYSQL_INIT_MGR=1 \-e MYSQL_MGR_USER='repl' \-e MYSQL_MGR_USER_PWD='repl' \-e MYSQL_SID=330602greatsql/greatsql

几个参数别离解释如下

参数必选/可选默认值解释
-d必选申明以daemon守护过程形式运行,而不是一次性运行
--name mgr1可选随机生成指定容器名,不便前面调用
--hostname mgr1可选容器ID指定容器内的主机名,否则会用容器ID作为主机名
-p 3306:3306可选指定容器要裸露的端口号,不便用TCP形式近程连贯
-e MYSQL_ALLOW_EMPTY_PASSWORD=1必选容许root应用空明码(本案中启用该选项,为了不便),也能够指定明码,或者应用随机明码,上面介绍
-e MYSQL_IBP=1G可选128M设置 innodb_buffer_pool_size 的值
-e MYSQL_MGR_NAME='aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa1'可选aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa1设置MGR集群名
-e MYSQL_MGR_LOCAL='172.17.0.2:33061'可选172.17.0.2:33061设置MGR本地节点IP+PORT
-e MYSQL_MGR_SEEDS='172.17.0.2:33061,<br/>172.17.0.3:33061,<br/>172.17.0.4:33061'可选172.17.0.2:33061,172.17.0.3:33061设置MGR集群各节点列表
-e MYSQL_INIT_MGR=1可选0主动初始化MGR相干工作
-e MYSQL_MGR_USER='repl'可选repl设置MGR服务账户名
-e MYSQL_MGR_USER_PWD='repl'可选repl4MGR设置MGR服务账户明码
-e MYSQL_SID可选3306+3位随机数设置MySQL的server_id,利用MySQL Shell接管MGR时,要求每个实例的server_id要设置为不同值。如果不手动指定,则会主动生成随机数值

greatsql/greatsql,是镜像名,也能够指定为镜像的ID,例如 1130a28e310b

如果不想让 root 账户应用空明码,能够把 MYSQL_ALLOW_EMPTY_PASSWORD=1 参数替换成诸如 MYSQL_ROOT_PASSWORD='GreatSQL3#)^' 或者指定随机明码 MYSQL_RANDOM_ROOT_PASSWORD=1 即可。

当启用选项 MYSQL_INIT_MGR=1 时,会主动创立MGR所需的账户,并执行 CHANGE MASTER TO 指定MGR复制通道。若没有同时指定 MYSQL_MGR_USERMYSQL_MGR_USER_PWD 的话,则采纳各自的默认值创立MGR账户。

这就胜利创立一个新的容器了,并且会主动实现GreatSQL的初始化并启动。

2.3 容器治理

先确认容器的状态

[root@greatsql]# docker ps -aCONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                       NAMES2e277c852f52        greatsql/greatsql        "/docker-entrypoin..."   4 minutes ago       Up 12 minutes        3306/tcp, 33060-33061/tcp   mgr1

看到容器状态是Up的,示意已失常启动了。

再进入容器查看

[root@greatsql]# docker exec -it mgr1 /bin/bash[root@mgr1 ~]# mysqladmin ver...Server version:         8.0.25-15 GreatSQL, Release 15, Revision c7feae175e0Protocol version    10Connection        Localhost via UNIX socketUNIX socket        /data/GreatSQL/mysql.sockUptime:            11 min 19 secThreads: 2  Questions: 2  Slow queries: 0  Opens: 120  Flush tables: 3  Open tables: 36  Queries per second avg: 0.002

看到容器曾经实现初始化,并且能够间接无明码登入。

查看MGR账户及相应复制通道

[root@GreatSQL][(none)]> show grants for repl;+----------------------------------------------+| Grants for repl@%                            |+----------------------------------------------+| GRANT REPLICATION SLAVE ON *.* TO `repl`@`%` || GRANT BACKUP_ADMIN ON *.* TO `repl`@`%`      |+----------------------------------------------+[root@GreatSQL][none]> select * from performance_schema.replication_group_members;+---------------------------+-----------+-------------+-------------+--------------+-------------+----------------+| CHANNEL_NAME              | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |+---------------------------+-----------+-------------+-------------+--------------+-------------+----------------+| group_replication_applier |           |             |        NULL | OFFLINE      |             |                |+---------------------------+-----------+-------------+-------------+--------------+-------------+----------------+

3、构建MGR集群

跨宿主机之间的docker容器网络通信绝对麻烦一些,为了简略起见,本次先在单机环境下构建由3个docker容器组成的MGR集群。

3.1 创立专用子网

首先创立一个用于MGR集群的网络:

[root@greatsql]# docker network create mgr-net[root@greatsql]# docker network lsNETWORK ID          NAME                DRIVER              SCOPE70c3ac08c7a9        bridge              bridge              local3a480a3ec570        host                host                local191d6d902b26        mgr-net             bridge              local1e3e6267dcda        none                null                local

查看这个子网的配置信息:

[root@greatsql]# docker inspect  mgr-net[    {        "Name": "mgr-net",...                    "Subnet": "172.18.0.0/16",   <-- 网段                    "Gateway": "172.18.0.1"   <-- 网关...

3.2 创立3个新容器

别离启动三个docker容器:

[root@greatsql]# docker run -d \--name mgr1 --hostname=mgr1 --net=mgr-net \-e MYSQL_ALLOW_EMPTY_PASSWORD=1 \-e MYSQL_MGR_LOCAL='172.18.0.2:33061' \-e MYSQL_MGR_SEEDS='172.18.0.2:33061,172.18.0.3:33061,172.18.0.4:33061' \-e MYSQL_INIT_MGR=1 \greatsql/greatsql

前面的两个实例,只把 --name 和 --hostname 参数中的mgr1改成mgr2、mgr3,并且把 -e MYSQL_MGR_LOCAL='172.18.0.2:33061' 参数的的IP地址递增,例如 -e MYSQL_MGR_LOCAL='172.18.0.3:33061'

查看容器运行状态:

[root@greatsql]# docker ps -aCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                       NAMES1bcd23c6f378        1130a28e310b        "/docker-entrypoin..."   2 minutes ago       Up 2 minutes        3306/tcp, 33060-33061/tcp   mgr39d12ab273d81        1130a28e310b        "/docker-entrypoin..."   2 minutes ago       Up 2 minutes        3306/tcp, 33060-33061/tcp   mgr256fd564a1789        1130a28e310b        "/docker-entrypoin..."   4 minutes ago       Up 4 minutes        3306/tcp, 33060-33061/tcp   mgr1

别离查看3个容器的IP地址:

[root@greatsql]# docker inspect mgr1 | grep IPAddress            "SecondaryIPAddresses": null,            "IPAddress": "172.18.0.2",                    "IPAddress": "172.18.0.2",

第一个容器的IP地址是 172.18.0.2,另外两个容器别离是 172.18.0.3172.18.0.4(递增关系)。因为我启动容器时指定的新创建的网络 mgr-net,所以是 172.18.0.0/24 网段。如果不指定新创建的网络,则默认应该是 172.17.0.0/24 网段,留神区别。

编辑三个容器下的 /etc/hosts 文件,退出所有节点的hostname配置:

172.18.0.2    mgr1172.18.0.3    mgr2172.18.0.4    mgr3

揭示:docker容器重启后,容器里的 /etc/hosts 文件内容会重置,所以倡议用映射volumes的形式挂进来。

在宿主机上编辑好一个文件 /data/docker/hosts

[root@greatsql]# cat /data/docker/hosts127.0.0.1 localhost.localdomain localhost127.0.0.1 localhost4.localdomain4 localhost4::1 localhost.localdomain localhost::1 localhost6.localdomain6 localhost6172.18.0.2    mgr1172.18.0.3    mgr2172.18.0.4    mgr3

在创立docker容器时映射挂载到容器的 /etc/hosts 文件:

[root@greatsql]# docker run -d \...-v /data/docker/hosts:/etc/hosts \...greatsql/greatsql

也能够在创立容器时,间接用 --add-host 指定,例如:

[root@greatsql]# docker run -d \...--add-host "mgr1:172.18.0.2" --add-host "mgr2:172.18.0.3" --add-host "mgr3:172.18.0.4"\...greatsql/greatsql

3.3 初始化MGR集群

接下来筹备初始化MGR集群。

抉择第一个容器 mgr1 作为 PRIMARY节点,设置该容器的MGR的疏导,而后启动MGR服务:

[root@greatsql]# docker exec -it mgr1 /bin/bash[root@mgr1 ~]# mysql -S/data/GreatSQL/mysql.sock...#设置本节点为MGR疏导启动节点,【留神】其余节点无需执行本操作SET GLOBAL group_replication_bootstrap_group=ON;#启动MGR服务START GROUP_REPLICATION;#启动完MGR服务后,敞开疏导参数SET GLOBAL group_replication_bootstrap_group=OFF;

因为在创立容器时曾经实现了创立账户及受权等操作,所以能够间接启动MGR服务。如果在创立容器时未指定 -e MYSQL_INIT_MGR=1 选项,则还须要手动执行上面的命令创立账户,受权,并创立MGR复制通道:

SET SQL_LOG_BIN=0;CREATE USER repl IDENTIFIED with mysql_native_password BY 'repl4MGR';GRANT REPLICATION SLAVE, BACKUP_ADMIN ON *.* TO repl;CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl4MGR' FOR CHANNEL 'group_replication_recovery';

3.4 启动MGR服务

在另外的两个docker容器里,记住不要设置 group_replication_bootstrap_group=ON,间接启动 MGR服务即可。查看所有节点都启动后的MGR服务状态:

[root@GreatSQL][(none)]> select * from performance_schema.replication_group_members;+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+| group_replication_applier | 63b55594-da80-11eb-94bf-0242ac120003 | mgr2        |        3306 | ONLINE       | SECONDARY   | 8.0.25         || group_replication_applier | 6d33eb83-da80-11eb-91ed-0242ac120004 | mgr3        |        3306 | ONLINE       | SECONDARY   | 8.0.25         || group_replication_applier | 7b1e33b1-da7f-11eb-8157-0242ac120002 | mgr1        |        3306 | ONLINE       | PRIMARY     | 8.0.25         |+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+

在这个阶段,MGR服务无奈启动常见起因有:

  • 没有在 /etc/hosts中正确设置各节点的 hostname,会提醒无奈连贯近程主机。
  • 利用docker创立的子网超过了RFC 1918定义的保留公有网络地址范畴(A 类:10.0.0.0~10.255.255.255,B 类:172.16.0.0~172.31.255.255,C 类:192.168.0.0~192.168.255.255)。
  • 除去在抉择作为PRIMARY节点上设置 group_replication_bootstrap_group=ON 外,其余节点上也设置了,会造成启动一个新的PRIMARY节点。
  • 各节点创立MGR账号后,会产生BINLOG,因而要执行 SET SQL_LOG_BIN=0 或者创立账号后再执行 RESET MASTER,否则会提醒本地节点比近程节点的事务数更多,无奈退出集群。

上述几种场景我都遇到过,可能还有其余更多状况,欢送补充。

3.5 写入测试数据

这就构建结束了,能够尝试在 PRIMARY节点 中创立库表并写入测试数据:

#揭示:从这里开始要重新启动binlog记录[root@GreatSQL][(none)]> SET SQL_LOG_BIN=1;[root@GreatSQL][(none)]> create database mymgr;[root@GreatSQL][(none)]> use mymgr;[root@GreatSQL][(mymgr)]> create table t1(id int primary key);[root@GreatSQL][(mymgr)]> insert into t1 select rand()*10240;[root@GreatSQL][mymgr]>select * from t1;+------+| id   |+------+| 3786 |+------+

4、利用Docker-compose创立Docker容器

如果感觉手工治理麻烦,也能够选用 docker-compose ,它能够更不便的治理docker容器。

先用yum装置docker-compose,并确认版本号

[root@greatsql]# yum install -y docker-compose[root@greatsql]# docker-compose --versiondocker-compose version 1.18.0, build 8dd22a9

编辑docker-compose的配置文件,其实就是把创立docker容器的命令行参数固化到配置文件而已:

[root@greatsql]# mkdir -p /data/docker-compose[root@greatsql]# vi /data/docker-compose/compose-mgr.ymlversion: '3'services:  mgr1:    image: greatsql/greatsql    container_name: mgr1    hostname: mgr1    network_mode: bridge    restart: unless-stopped    environment:      TZ: Asia/Shanghai      MYSQL_ALLOW_EMPTY_PASSWORD: 1      MYSQL_INIT_MGR: 1      MYSQL_MGR_LOCAL: '172.17.0.2:33061'      MYSQL_MGR_SEEDS: '172.17.0.2:33061,172.17.0.3:33061,172.17.0.4:33061'    extra_hosts:      - "mgr1:172.17.0.2"      - "mgr2:172.17.0.3"      - "mgr3:172.17.0.4"  mgr2:    image: greatsql/greatsql    container_name: mgr2    hostname: mgr2    network_mode: bridge    restart: unless-stopped    depends_on:      - "mgr1"    environment:      TZ: Asia/Shanghai      MYSQL_ALLOW_EMPTY_PASSWORD: 1      MYSQL_INIT_MGR: 1      MYSQL_MGR_LOCAL: '172.17.0.3:33061'      MYSQL_MGR_SEEDS: '172.17.0.2:33061,172.17.0.3:33061,172.17.0.4:33061'    extra_hosts:      - "mgr1:172.17.0.2"      - "mgr2:172.17.0.3"      - "mgr3:172.17.0.4"  mgr3:    image: greatsql/greatsql    container_name: mgr3    hostname: mgr3    network_mode: bridge    restart: unless-stopped    depends_on:      - "mgr2"    environment:      TZ: Asia/Shanghai      MYSQL_ALLOW_EMPTY_PASSWORD: 1      MYSQL_INIT_MGR: 1      MYSQL_MGR_LOCAL: '172.17.0.4:33061'      MYSQL_MGR_SEEDS: '172.17.0.2:33061,172.17.0.3:33061,172.17.0.4:33061'    extra_hosts:      - "mgr1:172.17.0.2"      - "mgr2:172.17.0.3"      - "mgr3:172.17.0.4"

启动三个实例:

[root@greatsql]# docker-compose -f /data/docker-compose/compose-mgr.yml up -dName   Command   State   PortsCreating mgr1 ... doneCreating mgr2 ... doneCreating mgr3 ... doneCreating mgr2 ...Creating mgr3 ...

查看运行状态:

[root@greatsql]# docker-compose -f /data/docker-compose/compose-mgr.yml up -dName             Command              State               Ports----------------------------------------------------------------------------mgr1   /docker-entrypoint.sh mysqld   Up      3306/tcp, 33060/tcp, 33061/tcpmgr2   /docker-entrypoint.sh mysqld   Up      3306/tcp, 33060/tcp, 33061/tcpmgr3   /docker-entrypoint.sh mysqld   Up      3306/tcp, 33060/tcp, 33061/tcp

进入被选为PRIMARY节点的容器mgr1,启动MGR服务:

[root@greatsql]# docker exec -it mgr1 bash[root@mgr1 /]# mysql...[root@GreatSQL][(none)]> set global group_replication_bootstrap_group=ON;[root@GreatSQL][(none)]> start group_replication;

进入其余SECONDARY节点的容器,间接启动MGR服务:

[root@greatsql]# docker exec -it mgr2 bash[root@mgr2 /]# mysql...[root@GreatSQL][(none)]> start group_replication;Query OK, 0 rows affected (2.76 sec)#查看MGR服务状态[root@GreatSQL][(none)]>select * from performance_schema.replication_group_members;+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+| group_replication_applier | f0bd73d4-dbcb-11eb-99ba-0242ac110002 | mgr1        |        3306 | ONLINE       | PRIMARY     | 8.0.25         || group_replication_applier | f1010499-dbcb-11eb-9194-0242ac110003 | mgr2        |        3306 | ONLINE       | SECONDARY   | 8.0.25         |+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+

依旧,持续启动mgr3节点,一个三节点的MGR集群就实现了。

GreatSQL-Docker相干文档曾经公布到 https://gitee.com/GreatSQL/GreatSQL-Docker,欢送关注。

此外,GreatSQL Docker镜像文件也已公布到 https://hub.docker.com/r/greatsql/greatsql 欢送下载体验。

5. 小结

本文介绍了如何在Docker下运行GreatSQL,以及构建MGR集群的办法,并且也介绍了利用docker-compose疾速构建MGR集群的办法。当初生产环境中利用容器乃至在K8S环境中运行MySQL的场景越来越多了,有趣味的同学也能够自行构建Docker镜像包。

参考资料、文档

  • MySQL 8.0 Reference Manual
  • 数据库内核开发 - 温正湖
  • Group Replication原理 - 宋利兵

免责申明

因集体程度无限,专栏中不免存在错漏之处,请勿间接复制文档中的命令、办法间接利用于线上生产环境。请读者们务必先充沛了解并在测试环境验证通过前方可正式施行,防止造成生产环境的毁坏或侵害。

Enjoy GreatSQL :)

文章举荐:

GreatSQL季报(2021.12.26)

https://mp.weixin.qq.com/s/FZ...

技术分享|sysbench 压测工具用法浅析

https://mp.weixin.qq.com/s/m1...

故障剖析 | linux 磁盘io利用率高,剖析的正确姿态

https://mp.weixin.qq.com/s/7c...

技术分享|闪回在MySQL中的实现和改良

https://mp.weixin.qq.com/s/6j...

万答#20,索引下推如何进行数据过滤

https://mp.weixin.qq.com/s/pt...

对于 GreatSQL

GreatSQL是由万里数据库保护的MySQL分支,专一于晋升MGR可靠性及性能,反对InnoDB并行查问个性,是实用于金融级利用的MySQL分支版本。

Gitee:

https://gitee.com/GreatSQL/Gr...

GitHub:

https://github.com/GreatSQL/G...

Bilibili:

https://space.bilibili.com/13...

微信&QQ群:

可搜寻增加GreatSQL社区助手微信好友,发送验证信息“加群”退出GreatSQL/MGR交换微信群

QQ群:533341697

微信小助手:wanlidbc

本文由博客一文多发平台 OpenWrite 公布!