基于 Docker 离线部署 MYSQL MGR 高可用生产集群
# -----临时禁用所有接口 ipv6. -----
for f in $(ls /proc/sys/net/ipv6/conf/*/disable_ipv6); do sudo su - root -c "echo 1 >$f"; done
# 再次查看所有接口 ipv6 启用状态
cat /proc/sys/net/ipv6/conf/*/disable_ipv6
# ----- 永久禁用所有接口 ipv6. -----
sudo cat <<-'EOF' >/etc/sysctl.d/99-ipv6-disable.conf
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
EOF
# 禁用每个接口 ipv6 (虽然设置了 net.ipv6.conf.all.disable_ipv6=1
# 但默认对每个接口, 如: net.ipv6.conf.enp3s0.disable_ipv6=0) 还是启用的.
for i in $(ifconfig | awk -F'[ :]+' '!NF{if(eth!=""&&ip=="")print eth;eth=ip4=""}/^[^ ]/{eth=$1}/inet addr:/{ip=$4}'); do echo "net.ipv6.conf.$i.disable_ipv6=1" >>/etc/sysctl.d/99-ipv6-disable.conf; done
sudo sysctl -p
1. 部署单节点伪集群
创建的三个节点分布在单台宿主机上,所有操作均在1台宿主机上,不存在在跨主机通信的情况 (使用 subnet 网络端口转发),适合快速测试。
Container IP | Container Host | MGR Role |
---|---|---|
172.8.8.111 | rds-mgr-0 | Group Repplication Master |
172.8.8.112 | rds-mgr-1 | Group Repplication Slave1 |
172.8.8.113 | rds-mgr-2 | Group Repplication Salve2 |
- 1.1 准备配置
[展开] /mnt/disk1/mysql-pseudo/conf1/my.cnf
# 下载配置模版 sudo curl -sSL -o /tmp/my.cnf.tpl https://gitee.com/wl4g/blogs/raw/master/docs/articles/database/hosts-mysql-mgr-deployment/resources/my.cnf.tpl # 生成3个节点的配置(***按实际自行修改***) export mysqlIp0='172.8.8.111' export mysqlIp1='172.8.8.112' export mysqlIp2='172.8.8.113' export seeds="$mysqlIp0:23366,$mysqlIp1:23366,$mysqlIp2:23366" sudo cat /tmp/my.cnf.tpl | sed "s/HOST/$mysqlIp0/g" | sed 's/SERVER_ID/1/g' | sed "s/SEEDS/$seeds/g" > /tmp/my0.cnf sudo cat /tmp/my.cnf.tpl | sed "s/HOST/$mysqlIp1/g" | sed 's/SERVER_ID/2/g' | sed "s/SEEDS/$seeds/g" > /tmp/my1.cnf sudo cat /tmp/my.cnf.tpl | sed "s/HOST/$mysqlIp2/g" | sed 's/SERVER_ID/3/g' | sed "s/SEEDS/$seeds/g" > /tmp/my2.cnf # 创建本地目录 sudo \rm -rf /mnt/disk1/mysql/mysql-pseudo/* sudo mkdir -p /mnt/disk1/mysql-pseudo/{node0/conf,node0/data,node1/conf,node1/data,node2/conf,node2/data} # 拷贝多个伪节点 sudo cp /tmp/my0.cnf /mnt/disk1/mysql-pseudo/node0/conf/my.cnf sudo cp /tmp/my1.cnf /mnt/disk1/mysql-pseudo/node1/conf/my.cnf sudo cp /tmp/my2.cnf /mnt/disk1/mysql-pseudo/node2/conf/my.cnf # 授权 sudo chmod -R 755 /mnt/disk1/mysql-pseudo/
- 1.2 创建 mysql 伪集群容器节点
[展开] run mysql pseudo containers
# 拉取镜像 docker pull mysql:5.7.30 # 创建虚拟网络(仅限本机, 跨宿主机生产环境应使用 k8s 部署) docker network create --subnet=172.8.8.0/24 mysqlnet # 若已创建则重置 docker stop mysql0 mysql1 mysql2 docker rm mysql0 mysql1 mysql2 # mysql node0 docker run -d \ --name mysql0 \ --network mysqlnet \ --ip $mysqlIp0 \ --hostname rds-mgr-0 \ --restart no \ -p 33060:3306 \ -v /mnt/disk1/mysql-pseudo/node0/conf/:/etc/mysql/conf.d/ \ -v /mnt/disk1/mysql-pseudo/node0/data/:/var/lib/mysql/ \ -e MYSQL_ROOT_PASSWORD=123456 \ -e TZ=Asia/Shanghai \ mysql:5.7.30 # mysql node1 docker run -d \ --name mysql1 \ --network mysqlnet \ --ip $mysqlIp1 \ --hostname rds-mgr-1 \ --restart no \ -p 33061:3306 \ -v /mnt/disk1/mysql-pseudo/node1/conf/:/etc/mysql/conf.d/ \ -v /mnt/disk1/mysql-pseudo/node1/data/:/var/lib/mysql/ \ -e MYSQL_ROOT_PASSWORD=123456 \ -e TZ=Asia/Shanghai \ mysql:5.7.30 # mysql node2 docker run -d \ --name mysql2 \ --network mysqlnet \ --ip $mysqlIp2 \ --hostname rds-mgr-2 \ --restart no \ -p 33062:3306 \ -v /mnt/disk1/mysql-pseudo/node2/conf/:/etc/mysql/conf.d/ \ -v /mnt/disk1/mysql-pseudo/node2/data/:/var/lib/mysql/ \ -e MYSQL_ROOT_PASSWORD=123456 \ -e TZ=Asia/Shanghai \ mysql:5.7.30 # 查看伪集群容器列表 docker ps # 客户端连接测试 export localIp=$(ifconfig|grep -A 4 -E '^em*|^eno*|^enp*|^ens*|^eth*|^wlp*'|grep 'inet'|awk '{print $2}'|head -1 2>/dev/null) mysql -h$localIp -uroot -P33060 -p123456
-
1.3 配置 MGR 及引导启动
-
或使用工具 mgrctl 操作
sudo curl -sSL -o /bin/mgrctl https://gitee.com/wl4g/blogs/raw/master/docs/articles/database/docker-mysql-mgr-simple-deployment/resources/mgrctl.sh
2. 部署跨节点生产集群
创建的三个节点分布在三台宿主机上,所有操作分别在三台不同的宿主机上,存在跨主机通信的情况 (使用 host 网络),适合简单生产环境。
Host IP | MGR Role | Description |
---|---|---|
10.0.0.161 | Group Repplication Master | node0 mgr |
10.0.0.162 | Group Repplication Slave1 | node1 mgr |
10.0.0.163 | Group Repplication Salve2 | node2 mgr |
-
2.1 创建 mysql 集群容器节点
-
2.2.1 准备配置
[展开] /mnt/disk1/mysql/conf.d/my.cnf
# 下载配置模版 sudo curl -sSL -o /tmp/my.cnf.tpl https://gitee.com/wl4g/blogs/raw/master/docs/articles/database/hosts-mysql-mgr-deployment/resources/my.cnf.tpl # 生成3个节点的配置(***按实际自行修改***) export mysqlIp0='10.0.0.161' export mysqlIp1='10.0.0.162' export mysqlIp2='10.0.0.163' export seeds="$mysqlIp0:23366,$mysqlIp1:23366,$mysqlIp2:23366" sudo cat /tmp/my.cnf.tpl | sed "s/HOST/$mysqlIp0/g" | sed 's/SERVER_ID/1/g' | sed "s/SEEDS/$seeds/g" > /tmp/my0.cnf sudo cat /tmp/my.cnf.tpl | sed "s/HOST/$mysqlIp1/g" | sed 's/SERVER_ID/2/g' | sed "s/SEEDS/$seeds/g" > /tmp/my1.cnf sudo cat /tmp/my.cnf.tpl | sed "s/HOST/$mysqlIp2/g" | sed 's/SERVER_ID/3/g' | sed "s/SEEDS/$seeds/g" > /tmp/my2.cnf # 分发配置 sudo mkdir -p /mnt/disk1/mysql/conf.d/ sudo cp -Rf /tmp/my0.cnf /mnt/disk1/mysql/conf.d/my.cnf sudo ssh root@$mysqlIp1 'mkdir -p /mnt/disk1/mysql/conf.d/' sudo scp /tmp/my1.cnf $mysqlIp1:/mnt/disk1/mysql/conf.d/my.cnf sudo ssh root@$mysqlIp2 'mkdir -p /mnt/disk1/mysql/conf.d/' sudo scp /tmp/my2.cnf $mysqlIp2:/mnt/disk1/mysql/conf.d/my.cnf
- 2.1.2 在宿主机 node0 上执行
[展开] run node0 mgr container
docker pull mysql:5.7.30 # 如果已创建过,则需重置 docker stop $(docker ps|grep 'mysql'|awk '{print $1}') docker rm $(docker ps -a|grep 'mysql'|awk '{print $1}') sudo \rm -rf /mnt/disk1/mysql/data/; mkdir -p /mnt/disk1/mysql/data docker run -d \ --name mysql0 \ --hostname mysql0 \ --add-host mysql0:$mysqlIp0 \ --add-host mysql1:$mysqlIp1 \ --add-host mysql2:$mysqlIp2 \ --network host \ --restart always \ -v /mnt/disk1/mysql/conf.d/:/etc/mysql/conf.d \ -v /mnt/disk1/mysql/data/:/var/lib/mysql/ \ -v /mnt/disk1/log/mysql/:/var/log/mysql/ \ -e MYSQL_ROOT_PASSWORD=123456 \ -e TZ=Asia/Shanghai \ mysql:5.7.30
- 2.1.3 在宿主机 node1 上执行
[展开] run node1 mgr container
docker pull mysql:5.7.30 # 如果已创建过,则需重置 docker stop $(docker ps|grep 'mysql'|awk '{print $1}') docker rm $(docker ps -a|grep 'mysql'|awk '{print $1}') sudo \rm -rf /mnt/disk1/mysql/data/; mkdir -p /mnt/disk1/mysql/data docker run -d \ --name mysql1 \ --hostname mysql1 \ --add-host mysql0:$mysqlIp0 \ --add-host mysql1:$mysqlIp1 \ --add-host mysql2:$mysqlIp2 \ --network host \ --restart always \ -v /mnt/disk1/mysql/conf.d/:/etc/mysql/conf.d \ -v /mnt/disk1/mysql/data/:/var/lib/mysql/ \ -v /mnt/disk1/log/mysql/:/var/log/mysql/ \ -e MYSQL_ROOT_PASSWORD=123456 \ -e TZ=Asia/Shanghai \ mysql:5.7.30
- 2.1.4 在宿主机 node2 上执行
[展开] run node2 mgr container
docker pull mysql:5.7.30 # 如果已创建过,则需重置 docker stop $(docker ps|grep 'mysql'|awk '{print $1}') docker rm $(docker ps -a|grep 'mysql'|awk '{print $1}') sudo \rm -rf /mnt/disk1/mysql/data/; mkdir -p /mnt/disk1/mysql/data docker run -d \ --name mysql2 \ --hostname mysql2 \ --add-host mysql0:$mysqlIp0 \ --add-host mysql1:$mysqlIp1 \ --add-host mysql2:$mysqlIp2 \ --network host \ --restart always \ -v /mnt/disk1/mysql/conf.d/:/etc/mysql/conf.d \ -v /mnt/disk1/mysql/data/:/var/lib/mysql/ \ -v /mnt/disk1/log/mysql/:/var/log/mysql/ \ -e MYSQL_ROOT_PASSWORD=123456 \ -e TZ=Asia/Shanghai \ mysql:5.7.30
- 先简单测试一下每个实例
# 查看伪集群容器列表
docker ps
# 客户端连接测试
export localIp=$(ifconfig|grep -A 4 -E '^em*|^eno*|^enp*|^ens*|^eth*|^wlp*'|grep 'inet'|awk '{print $2}'|head -1 2>/dev/null)
mysql -h$localIp -uroot -P3306 -p123456
-
2.2 配置 MGR 及引导启动
-
同理参见: 基于主机离线部署 MySQL MGR 高可用生产集群#7.1,也与 1.2 类似,只是分布在三台宿主机。
-
或使用工具 mgrctl 操作
sudo curl -sSL -o /bin/mgrctl https://gitee.com/wl4g/blogs/raw/master/docs/articles/database/docker-mysql-mgr-simple-deployment/resources/mgrctl.sh
-