容器化安装
本文详细介绍如何在Docker中部署GreatSQL,并且构建一个MGR集群。
1. 安装Docker
直接用yum/dnf安装Docker,非常省事
1. $ yum install -y docker
之后启动 Docker 服务,并设置开机自启动
1. $ systemctl enable docker
2. $ systemctl start docker
2. 拉取GreatSQL镜像,并创建容器
2.1 拉取镜像
拉取GreatSQL官方镜像
1. $ docker pull greatsql/greatsql
2. docker pull greatsql/greatsql
3. Using default tag: latest
4. Trying to pull repository docker.io/greatsql/greatsql ...
5. latest: Pulling from docker.io/greatsql/greatsql
6. ...
7. Digest: sha256:03969daaaaaeb0f51dde0c9e92ef327302607cdde3afbe5c2b071098000c52c1
8. Status: Downloaded newer image for greatsql/greatsql:latest
9. docker.io/greatsql/greatsql:latest
若是arm的架构拉取请使用docker pull greatsql/greatsql:8.0.32-25-aarch64
检查是否成功拉取
1. $ docker images
2. REPOSITORY TAG IMAGE ID CREATED SIZE
3. docker.io/greatsql/greatsql latest a930afc72d88 8 weeks ago 923 MB
2.2 创建新容器
之后,就可以直接创建一个新的容器了,先用常规方式
1. $ docker run -d --name greatsql --hostname=greatsql -e MYSQL_ALLOW_EMPTY_PASSWORD=1 greatsql/greatsql
容器的命名和容器内主机名均为greatsql。
确认容器状态:
1. $ docker ps -a | grep greatsql
2. ...
3. 4f351e22cea9 greatsql/greatsql "/docker-entrypoint.…" About a minute ago Up About a minute 3306/tcp, 33060-33061/tcp greatsql
4. ...
看到容器状态是Up的,表示已正常启动了。
2.3 容器管理
进入容器查看
1. $ docker exec -it greatsql /bin/bash
2. [root@greatsql /]# mysql
3. Welcome to the MySQL monitor. Commands end with ; or \g.
4. Your MySQL connection id is 12
5. Server version: 8.0.32-25 GreatSQL, Release 25, Revision db07cc5cb73
6. ...
7. Server version: 8.0.32-25 GreatSQL, Release 25, Revision db07cc5cb73
8. ...
10. Threads: 2 Questions: 18 Slow queries: 0 Opens: 119 Flush tables: 3 Open tables: 36 Queries per second avg: 0.243
看到容器已经完成初始化,并且可以直接无密码登入。
3. 利用Docker-compose创建Docker容器并构建MGR集群(单主模式)
手工管理Docker比较麻烦,建议采用 docker-compose ,它可以更方便的管理docker容器。
先用yum安装docker-compose,并确认版本号
1. $ yum install -y docker-compose
3. $ docker-compose --version
4. docker-compose version 1.29.2, build 5becea4c
编辑一个yaml文件,准备部署包含仲裁节点的三节点MGR集群:
1. $ mkdir -p /data/docker-compose
2. $ cat /data/docker-compose/mgr-3nodes.yml
3. version: '2'
5. services:
6. mgr2:
7. image: greatsql/greatsql #指定镜像
8. container_name: mgr2 #设定容器名字
9. hostname: mgr2 #设定容器中的主机名
10. networks: #指定容器使用哪个专用网络
11. mgr_net:
12. ipv4_address: 172.18.0.2 #设置容器使用固定IP地址,避免重启后IP变化
13. restart: unless-stopped #设定重启策略
14. environment: #设置多个环境变量
15. TZ: Asia/Shanghai #时区
16. MYSQL_ALLOW_EMPTY_PASSWORD: 1 #允许root账户空密码
17. MYSQL_INIT_MGR: 1 #初始化MGR集群
18. MYSQL_MGR_LOCAL: '172.18.0.2:33061' #当前MGR节点的local_address
19. MYSQL_MGR_SEEDS: '172.18.0.2:33061,172.18.0.3:33061,172.18.0.4:33061' #MGR集群seeds
20. MYSQL_MGR_START_AS_PRIMARY: 1 #指定当前MGR节点为Primary角色
21. MYSQL_MGR_ARBITRATOR: 0
22. #MYSQL_MGR_VIEWID: "aaaaaaaa-bbbb-bbbb-aaaa-aaaaaaaaaaa1"
23. mgr3:
24. image: greatsql/greatsql
25. container_name: mgr3
26. hostname: mgr3
27. networks:
28. mgr_net:
29. ipv4_address: 172.18.0.3
30. restart: unless-stopped
31. depends_on:
32. - "mgr2"
33. environment:
34. TZ: Asia/Shanghai
35. MYSQL_ALLOW_EMPTY_PASSWORD: 1
36. MYSQL_INIT_MGR: 1
37. MYSQL_MGR_LOCAL: '172.18.0.3:33061'
38. MYSQL_MGR_SEEDS: '172.18.0.2:33061,172.18.0.3:33061,172.18.0.4:33061'
39. MYSQL_MGR_START_AS_PRIMARY: 0
40. MYSQL_MGR_ARBITRATOR: 0 #既非Primary,也非Arbitrator,那么就是Secondary角色了
41. #MYSQL_MGR_VIEWID: "aaaaaaaa-bbbb-bbbb-aaaa-aaaaaaaaaaa1"
42. mgr4:
43. image: greatsql/greatsql
44. container_name: mgr4
45. hostname: mgr4
46. networks:
47. mgr_net:
48. ipv4_address: 172.18.0.4
49. restart: unless-stopped
50. depends_on:
51. - "mgr3"
52. environment:
53. TZ: Asia/Shanghai
54. MYSQL_ALLOW_EMPTY_PASSWORD: 1
55. MYSQL_INIT_MGR: 1
56. MYSQL_MGR_LOCAL: '172.18.0.4:33061'
57. MYSQL_MGR_SEEDS: '172.18.0.2:33061,172.18.0.3:33061,172.18.0.4:33061'
58. MYSQL_MGR_START_AS_PRIMARY: 0
59. MYSQL_MGR_ARBITRATOR: 1 #指定当前MGR节点为Arbitrator角色,此时不能同时指定其为Primary/Secondary角色
60. #MYSQL_MGR_VIEWID: "aaaaaaaa-bbbb-bbbb-aaaa-aaaaaaaaaaa1"
61. networks:
62. mgr_net: #创建独立MGR专属网络
63. ipam:
64. config:
65. - subnet: 172.18.0.0/24
关于GreatSQL容器启动选项说明,详见GreatSQL For Docker文档
(opens new window)。
如果不想要仲裁节点,则可以修改最后一个节点的属性 MYSQL_MGR_ARBITRATOR: 0 就行了。
另外,利用 docker-compose 方式暂时无法构建多主模式的MGR集群,需要手动部署。
启动三个实例:
1. $ docker-compose -f /data/docker-compose/mgr-3nodes.yml up -d
2. Creating network "docker-compose_mgr_net" with the default driver
3. Creating mgr2 ... done
4. Creating mgr3 ... done
5. Creating mgr4 ... done
查看运行状态:
1. $ docker-compose -f /data/docker-compose/mgr-3nodes.yml up -d
2. Name Command State Ports
3. ----------------------------------------------------------------------------
4. mgr2 /docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp, 33061/tcp
5. mgr3 /docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp, 33061/tcp
6. mgr4 /docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp, 33061/tcp
容器刚创建完还需要过一小段时间才能完成GreatSQL的初始化以及MGR集群自动构建,视服务器性能不同而定,一般需要30秒至四分钟左右。
进入被选为PRIMARY节点的容器mgr2,查看MGR集群状态:
1. $ docker exec -it mgr2 bash
2. [root@mgr2 /]# mysql
3. Welcome to the MySQL monitor. Commands end with ; or \g.
4. Your MySQL connection id is 30
5. Server version: 8.0.32-25 GreatSQL, Release 25, Revision db07cc5cb73
6. ...
7. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
9. (Tue Jul 12 14:28:00 2022)[root@GreatSQL][(none)]> \s
10. --------------
11. mysql Ver 8.0.32-25 for Linux on x86_64 (GreatSQL, Release 25, Revision db07cc5cb73)
12. ...
13. Uptime: 1 min 38 sec
15. Threads: 11 Questions: 52 Slow queries: 0 Opens: 145 Flush tables: 3 Open tables: 62 Queries per second avg: 0.530
16. --------------
18. (Tue Jul 12 14:28:05 2022)[root@GreatSQL][(none)]> SELECT * FROM performance_schema.replication_group_members;
19. +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
20. | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
21. +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
22. | group_replication_applier | 396465ad-01ab-11ed-9c1a-0242ac120002 | 172.18.0.2 | 3306 | ONLINE | PRIMARY | 8.0.32 |
23. | group_replication_applier | 3a4eabbd-01ab-11ed-a7ea-0242ac120003 | 172.18.0.3 | 3306 | ONLINE | SECONDARY | 8.0.32 |
24. | group_replication_applier | 3c707b56-01ab-11ed-969b-0242ac120004 | 172.18.0.4 | 3306 | ONLINE | ARBITRATOR | 8.0.32 |
25. +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
26. 3 rows in set (0.01 sec)
可以看到,包含仲裁节点的三节点MGR集群已自动构建完毕。
4. 利用Docker-compose创建Docker容器并构建MGR集群(多主模式)
下面是一个docker-compose的配置文件参考 /data/docker/mgr-multi-primary.yml:
1. version: '2'
3. services:
4. mgr2:
5. image: greatsql/greatsql
6. container_name: mgr2 #设定容器名字
7. hostname: mgr2 #设定容器中的主机名
8. networks: #指定容器使用哪个专用网络
9. mgr_net:
10. ipv4_address: 172.18.0.2 #设置容器使用固定IP地址,避免重启后IP变化
11. restart: unless-stopped #设定重启策略
12. environment: #设置多个环境变量
13. TZ: Asia/Shanghai #时区
14. MYSQL_ALLOW_EMPTY_PASSWORD: 1 #允许root账户空密码
15. MYSQL_INIT_MGR: 1 #初始化MGR集群
16. MYSQL_MGR_LOCAL: '172.18.0.2:33061' #当前MGR节点的local_address
17. MYSQL_MGR_SEEDS: '172.18.0.2:33061,172.18.0.3:33061,172.18.0.4:33061' #MGR集群seeds
18. MYSQL_MGR_START_AS_PRIMARY: 1 #指定当前MGR节点为Primary角色
19. MYSQL_MGR_MULTI_PRIMARY: 1 #指定是否采用多主模式
20. MYSQL_MGR_ARBITRATOR: 0
21. #MYSQL_MGR_VIEWID: "aaaaaaaa-bbbb-bbbb-aaaa-aaaaaaaaaaa1"
22. mgr3:
23. image: greatsql/greatsql
24. container_name: mgr3
25. hostname: mgr3
26. networks:
27. mgr_net:
28. ipv4_address: 172.18.0.3
29. restart: unless-stopped
30. depends_on:
31. - "mgr2"
32. environment:
33. TZ: Asia/Shanghai
34. MYSQL_ALLOW_EMPTY_PASSWORD: 1
35. MYSQL_INIT_MGR: 1
36. MYSQL_MGR_LOCAL: '172.18.0.3:33061'
37. MYSQL_MGR_SEEDS: '172.18.0.2:33061,172.18.0.3:33061,172.18.0.4:33061'
38. MYSQL_MGR_START_AS_PRIMARY: 0
39. MYSQL_MGR_MULTI_PRIMARY: 1
40. MYSQL_MGR_ARBITRATOR: 0 #既非Primary,也非Arbitrator,那么就是Secondary角色了
41. #MYSQL_MGR_VIEWID: "aaaaaaaa-bbbb-bbbb-aaaa-aaaaaaaaaaa1"
42. mgr4:
43. image: greatsql/greatsql
44. container_name: mgr4
45. hostname: mgr4
46. networks:
47. mgr_net:
48. ipv4_address: 172.18.0.4
49. restart: unless-stopped
50. depends_on:
51. - "mgr3"
52. environment:
53. TZ: Asia/Shanghai
54. MYSQL_ALLOW_EMPTY_PASSWORD: 1
55. MYSQL_INIT_MGR: 1
56. MYSQL_MGR_LOCAL: '172.18.0.4:33061'
57. MYSQL_MGR_SEEDS: '172.18.0.2:33061,172.18.0.3:33061,172.18.0.4:33061'
58. MYSQL_MGR_START_AS_PRIMARY: 0
59. MYSQL_MGR_MULTI_PRIMARY: 1
60. MYSQL_MGR_ARBITRATOR: 0 #指定当前MGR节点为Arbitrator角色,此时不能同时指定其为Primary/Secondary角色
61. #MYSQL_MGR_VIEWID: "aaaaaaaa-bbbb-bbbb-aaaa-aaaaaaaaaaa1"
62. networks:
63. mgr_net: #创建独立MGR专属网络
64. ipam:
65. config:
66. - subnet: 172.18.0.0/24
启动所有容器:
1. $ docker-compse -f /data/docker/mgr-multi-primary.yml up -d
容器启动后,会自行进行MySQL实例的初始化并自动构建MGR集群。
进入第一个容器,确认实例启动并成为MGR的Primary节点:
1. $ docker exec -it mgr2 bash
2. $ mysql
3. ...
4. [root@GreatSQL][(none)]> SELECT * FROM performance_schema.replication_group_members;
5. +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
6. | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
7. +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
8. | group_replication_applier | 9831bac0-30d4-11ee-8b65-0242ac120002 | 172.18.0.2 | 3306 | ONLINE | PRIMARY | 8.0.32 | XCom |
9. | group_replication_applier | 9907b1ae-30d4-11ee-8c66-0242ac120003 | 172.18.0.3 | 3306 | ONLINE | PRIMARY | 8.0.32 | XCom |
10. | group_replication_applier | 9a1ee7ca-30d4-11ee-8b93-0242ac120004 | 172.18.0.4 | 3306 | ONLINE | PRIMARY | 8.0.32 | XCom |
11. +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
可以看到,一个三节点的MGR集群已自动构建完毕,运行模式为多主模式。
5. 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)。
问题反馈
联系我们
扫码关注微信公众号

