Database,  Kubernetes

基于 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


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

3. 参考

留言

您的电子邮箱地址不会被公开。