§ Docker 容器化安装


本文详细介绍如何在Docker中部署GreatSQL,并且构建一个MGR集群。

本文使用的 Docker 版本是 20.10.10

$ docker --version
Docker version 20.10.10, build b485636
1
2

docker-compose 版本是 2.15.0

$ docker-compose --version
Docker Compose version v2.15.0 
1
2

§ 安装Docker

直接用yum/dnf安装Docker,非常省事

yum install -y docker
1

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

systemctl enable docker
systemctl start docker
1
2

§ 拉取GreatSQL镜像,并创建容器

§ 拉取镜像

拉取GreatSQL官方镜像

docker pull greatsql/greatsql
1
查看运行结果
$ docker pull greatsql/greatsql

...
Using default tag: latest
Trying to pull repository docker.io/greatsql/greatsql ...
latest: Pulling from docker.io/greatsql/greatsql
...
Digest: sha256:27255f94207ceec4302d4fb6f83c4b610e177f57e66347766befb69d1bae91e8
Status: Downloaded newer image for greatsql/greatsql:latest
docker.io/greatsql/greatsql:latest
1
2
3
4
5
6
7
8
9
10

若由于网络原因无法从 docker.io 拉取 GreatSQL 镜像的话,可以改成从阿里云 ACR 拉取,方法如下:

docker pull registry.cn-beijing.aliyuncs.com/greatsql/greatsql
1

也可以从腾讯云 TCR 拉取:

docker pull ccr.ccs.tencentyun.com/greatsql/greatsql
1

检查是否成功拉取

$ docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
docker.io/greatsql/greatsql   latest              a930afc72d88        8 weeks ago         923 MB
1
2
3

§ 创建新容器

之后,就可以直接创建一个新的容器了,先用常规方式

docker run -d --name greatsql --hostname=greatsql -e MYSQL_ALLOW_EMPTY_PASSWORD=1 greatsql/greatsql
1

容器的命名和容器内主机名均为greatsql。

确认容器状态:

$ docker ps -a | grep greatsql

...
4f351e22cea9   greatsql/greatsql     "/docker-entrypoint.…"   About a minute ago   Up About a minute          3306/tcp, 33060-33061/tcp   greatsql
...
1
2
3
4
5

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

§ 容器管理

进入容器查看

$ docker exec -it greatsql /bin/bash
[root@greatsql /]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.32-26 GreatSQL, Release 26, Revision 444164cc78e
...
Server version:        8.0.32-26 GreatSQL, Release 26, Revision 444164cc78e
...

Threads: 2  Questions: 18  Slow queries: 0  Opens: 119  Flush tables: 3  Open tables: 36  Queries per second avg: 0.243
1
2
3
4
5
6
7
8
9
10

看到容器已经完成初始化,并且可以直接无密码登入。

§ 构建MGR集群(单主模式)

手工管理Docker比较麻烦,建议采用 docker-compose ,它可以更方便的管理docker容器。

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

$ yum install -y docker-compose

$ docker-compose --version
docker-compose version 1.29.2, build 5becea4c
1
2
3
4

编辑一个yaml文件,准备部署包含仲裁节点的三节点MGR集群:

mkdir -p /data/docker-compose
vim /data/docker-compose/mgr-3nodes.yml
1
2
mgr-3nodes.yml 文件详细内容
version: '2'

services:
  mgr2:
    image: greatsql/greatsql         #指定镜像
    container_name: mgr2    #设定容器名字
    hostname: mgr2          #设定容器中的主机名
    networks:               #指定容器使用哪个专用网络
      mgr_net:
        ipv4_address: 172.18.0.2    #设置容器使用固定IP地址,避免重启后IP变化
    restart: unless-stopped         #设定重启策略
    environment:                    #设置多个环境变量
      TZ: Asia/Shanghai             #时区
      MYSQL_ALLOW_EMPTY_PASSWORD: 1                 #允许root账户空密码
      MYSQL_INIT_MGR: 1                             #初始化MGR集群
      MYSQL_MGR_LOCAL: '172.18.0.2:33061'           #当前MGR节点的local_address
      MYSQL_MGR_SEEDS: '172.18.0.2:33061,172.18.0.3:33061,172.18.0.4:33061'     #MGR集群seeds
      MYSQL_MGR_START_AS_PRIMARY: 1                 #指定当前MGR节点为Primary角色
      MYSQL_MGR_ARBITRATOR: 0
      #MYSQL_MGR_VIEWID: "aaaaaaaa-bbbb-bbbb-aaaa-aaaaaaaaaaa1"
  mgr3:
    image: greatsql/greatsql
    container_name: mgr3
    hostname: mgr3
    networks:
      mgr_net:
        ipv4_address: 172.18.0.3
    restart: unless-stopped
    depends_on:
      - "mgr2"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ALLOW_EMPTY_PASSWORD: 1
      MYSQL_INIT_MGR: 1
      MYSQL_MGR_LOCAL: '172.18.0.3:33061'
      MYSQL_MGR_SEEDS: '172.18.0.2:33061,172.18.0.3:33061,172.18.0.4:33061'
      MYSQL_MGR_START_AS_PRIMARY: 0
      MYSQL_MGR_ARBITRATOR: 0                       #既非Primary,也非Arbitrator,那么就是Secondary角色了
      #MYSQL_MGR_VIEWID: "aaaaaaaa-bbbb-bbbb-aaaa-aaaaaaaaaaa1"
  mgr4:
    image: greatsql/greatsql
    container_name: mgr4
    hostname: mgr4
    networks:
      mgr_net:
        ipv4_address: 172.18.0.4
    restart: unless-stopped
    depends_on:
      - "mgr3"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ALLOW_EMPTY_PASSWORD: 1
      MYSQL_INIT_MGR: 1
      MYSQL_MGR_LOCAL: '172.18.0.4:33061'
      MYSQL_MGR_SEEDS: '172.18.0.2:33061,172.18.0.3:33061,172.18.0.4:33061'
      MYSQL_MGR_START_AS_PRIMARY: 0
      MYSQL_MGR_ARBITRATOR: 1                   #指定当前MGR节点为Arbitrator角色,此时不能同时指定其为Primary/Secondary角色
      #MYSQL_MGR_VIEWID: "aaaaaaaa-bbbb-bbbb-aaaa-aaaaaaaaaaa1"
networks:
  mgr_net:  #创建独立MGR专属网络
    ipam:
      config:
        - subnet: 172.18.0.0/24
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

关于GreatSQL容器启动选项说明,详见GreatSQL For Docker文档 (opens new window)

如果不想要仲裁节点,则可以修改最后一个节点的属性 MYSQL_MGR_ARBITRATOR: 0 就行了。

启动三个实例:

docker-compose -f /data/docker-compose/mgr-3nodes.yml up -d
1
查看运行结果
Creating network "docker-compose_mgr_net" with the default driver
Creating mgr2 ... done
Creating mgr3 ... done
Creating mgr4 ... done
1
2
3
4

查看运行状态:

docker-compose -f /data/docker-compose/mgr-3nodes.yml ps
1
查看运行结果
Name             Command              State               Ports
----------------------------------------------------------------------------
mgr2   /docker-entrypoint.sh mysqld   Up      3306/tcp, 33060/tcp, 33061/tcp
mgr3   /docker-entrypoint.sh mysqld   Up      3306/tcp, 33060/tcp, 33061/tcp
mgr4   /docker-entrypoint.sh mysqld   Up      3306/tcp, 33060/tcp, 33061/tcp
1
2
3
4
5

容器刚创建完还需要过一小段时间才能完成GreatSQL的初始化以及MGR集群自动构建,视服务器性能不同而定,一般需要30秒至四分钟左右。

进入被选为PRIMARY节点的容器mgr2,查看MGR集群状态。

查看运行结果
$ docker exec -it mgr2 bash
[root@mgr2 /]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 30
Server version: 8.0.32-26 GreatSQL, Release 26, Revision 444164cc78e
...
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

[root@GreatSQL][(none)]> \s
--------------
mysql  Ver 8.0.32-26 for Linux on x86_64 (GreatSQL, Release 26, Revision 444164cc78e)
...
Uptime:            1 min 38 sec

Threads: 11  Questions: 52  Slow queries: 0  Opens: 145  Flush tables: 3  Open tables: 62  Queries per second avg: 0.530
--------------

[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 | 396465ad-01ab-11ed-9c1a-0242ac120002 | 172.18.0.2  |        3306 | ONLINE       | PRIMARY     | 8.0.32         |
| group_replication_applier | 3a4eabbd-01ab-11ed-a7ea-0242ac120003 | 172.18.0.3  |        3306 | ONLINE       | SECONDARY   | 8.0.32         |
| group_replication_applier | 3c707b56-01ab-11ed-969b-0242ac120004 | 172.18.0.4  |        3306 | ONLINE       | ARBITRATOR  | 8.0.32         |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
3 rows in set (0.01 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

可以看到,包含仲裁节点的三节点MGR集群已自动构建完毕。

§ 构建MGR集群(多主模式)

下面是一个docker-compose的配置文件参考 /data/docker/mgr-multi-primary.yml:

mgr-multi-primary.yml 文件详细内容
version: '2'

services:
  mgr2:
    image: greatsql/greatsql
    container_name: mgr2    #设定容器名字
    hostname: mgr2          #设定容器中的主机名
    networks:               #指定容器使用哪个专用网络
      mgr_net:
        ipv4_address: 172.18.0.2    #设置容器使用固定IP地址,避免重启后IP变化
    restart: unless-stopped         #设定重启策略
    environment:                    #设置多个环境变量
      TZ: Asia/Shanghai             #时区
      MYSQL_ALLOW_EMPTY_PASSWORD: 1                 #允许root账户空密码
      MYSQL_INIT_MGR: 1                             #初始化MGR集群
      MYSQL_MGR_LOCAL: '172.18.0.2:33061'           #当前MGR节点的local_address
      MYSQL_MGR_SEEDS: '172.18.0.2:33061,172.18.0.3:33061,172.18.0.4:33061'     #MGR集群seeds
      MYSQL_MGR_START_AS_PRIMARY: 1                 #指定当前MGR节点为Primary角色
      MYSQL_MGR_MULTI_PRIMARY: 1             #指定是否采用多主模式
      MYSQL_MGR_ARBITRATOR: 0                       
      #MYSQL_MGR_VIEWID: "aaaaaaaa-bbbb-bbbb-aaaa-aaaaaaaaaaa1"
  mgr3:
    image: greatsql/greatsql
    container_name: mgr3
    hostname: mgr3
    networks: 
      mgr_net:
        ipv4_address: 172.18.0.3
    restart: unless-stopped
    depends_on:
      - "mgr2"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ALLOW_EMPTY_PASSWORD: 1
      MYSQL_INIT_MGR: 1
      MYSQL_MGR_LOCAL: '172.18.0.3:33061'
      MYSQL_MGR_SEEDS: '172.18.0.2:33061,172.18.0.3:33061,172.18.0.4:33061'
      MYSQL_MGR_START_AS_PRIMARY: 0
      MYSQL_MGR_MULTI_PRIMARY: 1
      MYSQL_MGR_ARBITRATOR: 0                       #既非Primary,也非Arbitrator,那么就是Secondary角色了                 
      #MYSQL_MGR_VIEWID: "aaaaaaaa-bbbb-bbbb-aaaa-aaaaaaaaaaa1"
  mgr4:
    image: greatsql/greatsql
    container_name: mgr4
    hostname: mgr4
    networks: 
      mgr_net:
        ipv4_address: 172.18.0.4
    restart: unless-stopped
    depends_on:
      - "mgr3"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ALLOW_EMPTY_PASSWORD: 1
      MYSQL_INIT_MGR: 1
      MYSQL_MGR_LOCAL: '172.18.0.4:33061'
      MYSQL_MGR_SEEDS: '172.18.0.2:33061,172.18.0.3:33061,172.18.0.4:33061'
      MYSQL_MGR_START_AS_PRIMARY: 0
      MYSQL_MGR_MULTI_PRIMARY: 1
      MYSQL_MGR_ARBITRATOR: 0                   #指定当前MGR节点为Arbitrator角色,此时不能同时指定其为Primary/Secondary角色
      #MYSQL_MGR_VIEWID: "aaaaaaaa-bbbb-bbbb-aaaa-aaaaaaaaaaa1"
networks:
  mgr_net:  #创建独立MGR专属网络
    ipam:
      config:
        - subnet: 172.18.0.0/24
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66

启动所有容器:

docker-compse -f /data/docker/mgr-multi-primary.yml up -d
1

容器启动后,会自行进行MySQL实例的初始化并自动构建MGR集群。

进入第一个容器,确认实例启动并成为MGR的Primary节点:

$ docker exec -it mgr2 bash
$ mysql

...
[root@GreatSQL][(none)]> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 9831bac0-30d4-11ee-8b65-0242ac120002 | 172.18.0.2  |        3306 | ONLINE       | PRIMARY     | 8.0.32         | XCom                       |
| group_replication_applier | 9907b1ae-30d4-11ee-8c66-0242ac120003 | 172.18.0.3  |        3306 | ONLINE       | PRIMARY     | 8.0.32         | XCom                       |
| group_replication_applier | 9a1ee7ca-30d4-11ee-8b93-0242ac120004 | 172.18.0.4  |        3306 | ONLINE       | PRIMARY     | 8.0.32         | XCom                       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
1
2
3
4
5
6
7
8
9
10
11
12

可以看到,一个三节点的MGR集群已自动构建完毕,运行模式为多主模式。

§ Docker-Compose环境变量/参数介绍

  • MYSQL_ROOT_PASSWORD 设置MySQL root账号的密码。如果下面指定了MYSQL_ALLOW_EMPTY_PASSWORD=1,则本参数无效。

  • MYSQL_DATABASE 是否初始化一个新的数据库。

  • MYSQL_ALLOW_EMPTY_PASSWORD 是否设置MySQL root账号使用空密码,因为安全原因,不推荐这么做。

  • MYSQL_RANDOM_ROOT_PASSWORD 设置MySQL root账号的密码采用随机生成方式。

  • MYSQL_IBP 设置innodb_buffer_pool_size,默认值:128M。

  • MYSQL_INIT_MGR 是否初始化MGR相关设置,默认值:0(否)。如果设置为1(是),则会创建MGR服务所需账号,并设定运行 CHANGE MASTER TO 设置好MGR复制通道。 非必选项。

  • MYSQL_MGR_NAME 设置group_replication_group_name,默认值:"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa1"。 非必选项。

  • MYSQL_MGR_LOCAL 设置 group_replication_local_address,默认值:"172.17.0.2:33061"。 如果 MYSQL_INIT_MGR=1 则为必选项。

  • MYSQL_MGR_SEEDS 设置 group_replication_group_seeds,默认值:"172.17.0.2:33061,172.17.0.3:33061"。 如果 MYSQL_INIT_MGR=1 则为必选项。

  • MYSQL_MGR_USER 设置MGR服务所需账号,默认值:repl。 非必选项。

  • MYSQL_MGR_USER_PWD 设置MGR服务所需账号的密码,默认值:repl4MGR。 非必选项。

  • MYSQL_SID 设置server_id选项,构建MGR集群时要求每个节点的server_id是唯一的,默认值:3306+随机数 非必选项。

  • MYSQL_MGR_START_AS_PRIMARY 指定当前节点在MGR中以PRIMARY角色启动,每次都会进行MGR初始化引导操作。默认值:0。 如果 MYSQL_INIT_MGR=1 则至少要有一个节点指定为PRIMARY角色。

  • MYSQL_MGR_MULTI_PRIMARY 设置是否采用多主模式运行。默认值:0。 如果 MYSQL_MGR_MULTI_PRIMARY=1,则【有且只能选择一个节点】设置 MYSQL_MGR_START_AS_PRIMARY=1,该节点会采用引导模式启动,其余节点不设置引导模式。

  • MYSQL_MGR_ARBITRATOR 指定当前节点在MGR中以ARBITRATOR角色启动,该选项和MYSQL_MGR_START_AS_PRIMARY是互斥的,不能同时设置为1。默认值:0。 非必选项。

  • MYSQL_MGR_VIEWID MySQL 8.0.26开始,可以为view change单独指定一个GTID前缀,避免和正常的事务GTID混杂一起,产生问题。默认值:AUTOMATIC。 非必选项。

更多关于如何利用Docker/Docker-Compose完成GreatSQL初始化并构建MGR集群的详情请查看 GreatSQL-Docker项目 (opens new window)

扫码关注微信公众号

greatsql-wx