
在Docker中部署GreatSQL并构建MGR集群
内容提纲
• 1、安装Docker
• 2、拉取GreatSQL镜像,并创建容器
▪ 2.1 拉取镜像
▪ 2.2 创建新容器
▪ 2.3 容器管理
▪ 2.4 容器销毁
• 3、构建MGR集群
▪ 3.1 创建专用子网
▪ 3.2 创建3个新容器
▪ 3.3 初始化MGR集群
▪ 3.4 启动MGR服务
▪ 3.5 写入测试数据
• 4、利用Docker-compose创建Docker容器
为了方面社区用户体验GreatSQL,我们同时还提供Docker镜像,本文详细介绍如何在Docker中部署GreatSQL,并且构建一个MGR集群。
本文涉及的运行环境如下:
1、安装Docker
直接用yum安装docker,非常省事。
之后启动 docker 服务,并设置开机自启动。
2、拉取GreatSQL镜像,并创建容器
2.1 拉取镜像
拉取GreatSQL官方镜像:
检查是否成功:
2.2 创建新容器
之后,就可以直接创建一个新的容器了,先用常规方式。
几个参数分别解释如下:
greatsql/greatsql,是镜像名,也可以指定为镜像的ID,例如 d1963ef0c403。
如果不想让 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_USER 或 MYSQL_MGR_USER_PWD 的话,则采用各自的默认值创建MGR账户。
这就成功创建一个新的容器了,并且会自动完成GreatSQL的初始化并启动。
2.3 容器管理
先确认容器的状态:
看到容器状态是Up的,表示已正常启动了。
再进入容器查看:
看到容器已经完成初始化,并且可以直接无密码登入。
查看MGR账户及相应复制通道:
还可以把这个容器当做服务对其进行关闭、启动、重启、挂起等操作:
可以自行挨个尝试。
2.4 容器销毁
如果想要销毁该容器,需要先停止该容器后,再执行 docker rm [容器ID|容器名] 命令即可:
如果是想销毁某个镜像,运行 docker rmi [镜像ID|镜像名] 命令即可,不过要先确保该镜像目前没有被其他容器所使用后,方可删除:
销毁容器、镜像之后,相应的数据目录也不再需要了,可以执行下面的命令清除:
3、构建MGR集群
跨宿主机之间的docker容器网络通信相对麻烦一些,为了简单起见,本次先在单机环境下构建由3个docker容器组成的MGR集群。
3.1 创建专用子网
首先创建一个用于MGR集群的网络:
查看这个子网的配置信息:
3.2 创建3个新容器
分别启动三个docker容器:
后面的两个实例,只把 --name 和 --hostname 参数中的mgr1改成mgr2、mgr3,并且把 -e MYSQL_MGR_LOCAL='172.18.0.2:33061' 参数的的IP地址递增,例如 -e MYSQL_MGR_LOCAL='172.18.0.3:33061'。
查看容器运行状态:
分别查看3个容器的IP地址:
第一个容器的IP地址是 172.18.0.2,另外两个容器分别是 172.18.0.3、172.18.0.4(递增关系)。
因为我启动容器时指定的新创建的网络 mgr-net,所以是 172.18.0.0/24 网段。如果不指定新创建的网络,则默认应该是 172.17.0.0/24 网段,注意区别。
编辑三个容器下的 /etc/hosts 文件,加入所有节点的hostname配置:
提醒:docker容器重启后,容器里的 /etc/hosts 文件内容会重置,所以建议用映射volumes的方式挂进来。
在宿主机上编辑好一个文件 /data/docker/hosts:
在创建docker容器时映射挂载到容器的 /etc/hosts 文件:
也可以在创建容器时,直接用 --add-host 指定,例如:
3.3 初始化MGR集群
接下来准备初始化MGR集群。
选择第一个容器 mgr1 作为 PRIMARY节点,设置该容器的MGR的引导,然后启动MGR服务:
因为在创建容器时已经完成了创建账户及授权等操作,所以可以直接启动MGR服务。
如果在创建容器时未指定 -e MYSQL_INIT_MGR=1 选项,则还需要手动执行下面的命令创建账户,授权,并创建MGR复制通道:
3.4 启动MGR服务
在另外的两个docker容器里,记住不要设置 group_replication_bootstrap_group=ON,直接启动 MGR服务即可。
查看所有节点都启动后的MGR服务状态:
在这个阶段,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节点 中创建库表并写入测试数据:
4、利用Docker-compose创建Docker容器
如果觉得手工管理麻烦,也可以选用 docker-compose ,它可以更方便的管理docker容器。
先用yum安装docker-compose,并确认版本号:
编辑docker-compose的配置文件,其实就是把创建docker容器的命令行参数固化到配置文件而已:
启动三个实例:
查看运行状态:
进入被选为PRIMARY节点的容器mgr1,启动MGR服务:
进入其他SECONDARY节点的容器,直接启动MGR服务:
照旧,继续启动mgr3节点,一个三节点的MGR集群就完成了。
GreatSQL-Docker相关文档已经发布到https://gitee.com/GreatSQL/GreatSQL-Docker,欢迎关注。
此外,GreatSQL Docker镜像文件也已发布到 https://hub.docker.com/r/greatsql/greatsql欢迎下载体验。
水平有限,也请各位读者大人帮忙看看哪些可以优化的地方,感谢。
最后要特别感谢近期在折腾docker、ansible中提供帮助的多位朋友,分别是谢恒忠、吕保成、Fan()、Coral、戴先森等(排名不分先后)。
本文转载自公共号GreatSQL社区。
