两个脚本完成docker中mysql主从的简单配置

前提条件:首先我们要有docker这个工具在虚拟机中可以拉取镜像以及查看版本等等。

通过docker images;进行查看

两个脚本完成docker中mysql主从的简单配置_第1张图片

 也可以进行版本的查看

接下来我们查看第一步,首先我们需要在本地创建一个配置文件

这里我创建了一个目录为:mkdir -p /xz

之后创建vim my.cnf

[mysqld]
server-id=1
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema

#设置logbin格式
binlog_format=STATEMENT

接下来我们编写第一个脚本文件(create_mysql.sh),注意创建之后我们需要增加当前用户的可执行的权限:chmod 755 create_mysql.sh  之后通过sh create_mysql.sh 运行脚本

当前脚本是在/xz目录下

#!/bin/bash
master_name="mysql_master"
master_port=3308  #这里可以改用除了3306之外的其他端口号
node1_name="mysql_node1"
node1_port=4001  #这里可以改用除了3306之外的其他端口号
node2_name="mysql_node2"
node2_port=4002  #这里可以改用除了3306之外的其他端口号
mysql_passwd="123456" #这里的密码可以进行一个自己喜欢的设置
#开启docker镜像
systemctl restart docker

echo "停止并删除mysql集群容器"
docker stop ${master_name} ${node1_name} ${node2_name} > /dev/null
docker rm ${master_name} ${node1_name} ${node2_name} > /dev/null
echo "rm -rf mysql目录"
rm -rf /root/{${master_name},${node1_name},${node2_name}} > /dev/null
echo "执行完成"
echo "创建被mysql容器挂载的目录"
mkdir -p /root/{${master_name},${node1_name},${node2_name}}/conf > /dev/null
echo "删除完毕"
echo "复制之前创建配置文件的内容:注意路径"
cp /xz/my.cnf /root/${master_name}/conf/
cp /xz/my.cnf /root/${node1_name}/conf/
cp /xz/my.cnf /root/${node2_name}/conf/
sed -i 's/server-id=1/server-id=2/' /root/${node1_name}/conf/my.cnf
sed -i 's/server-id=1/server-id=3/' /root/${node2_name}/conf/my.cnf
sed -i '$a\relay_log=mall-mysql-relay-bin\nlog_slave_updates=1\nread_only=1' /root/${node1_name}/conf/my.cnf
sed -i '$a\relay_log=mall-mysql-relay-bin\nlog_slave_updates=1\nread_only=1' /root/${node2_name}/conf/my.cnf
echo "创建完毕"
docker run -d -p ${master_port}:3306 \
-v /root/${master_name}/conf:/etc/mysql/conf.d \
-v/root/${master_name}/data:/var/lib/mysql  \
-e MYSQL_ROOT_PASSWORD=${mysql_passwd} --name ${master_name} mysql:5.7
docker run -d -p ${node1_port}:3306 \
-v /root/${node1_name}/conf:/etc/mysql/conf.d \
-v/root/${node1_name}/data:/var/lib/mysql  \
-e MYSQL_ROOT_PASSWORD=${mysql_passwd} --name ${node1_name} mysql:5.7
docker run -d -p ${node2_port}:3306 \
-v /root/${node2_name}/conf:/etc/mysql/conf.d \  
-v/root/${node2_name}/data:/var/lib/mysql  \
-e MYSQL_ROOT_PASSWORD=${mysql_passwd} --name ${node2_name} mysql:5.7
echo "mysql容器的创建已完成"

当容器创建完毕之后我们可以通过docker ps -a 查看容器是否创建成功,并且是否在后台运行

两个脚本完成docker中mysql主从的简单配置_第2张图片

创建成功之后我们需要创建第二个脚本文件(replication.sh),同样需要脚本的执行权限。

当前脚本是在/xz目录下

#!/bin/bash
#变量的配置如何上面对照
master_name="mysql_master"
master_port=3308  
node1_name="mysql_node1"
node1_port=4001
node2_name="mysql_node2"
node2_port=4002
replication_user="slave"
mysql_user="root"
mysql_passwd=123456
mysql_address=8.130.45.217

echo "master开始进行配置"
echo "创建一个slave用户并且进行授权"
docker exec -it ${master_name} /bin/bash -c "mysql -u${mysql_user} -p${mysql_passwd} << eof 
grant replication slave on *.* to '${replication_user}'@'%' identified by '${mysql_passwd}'; 
eof"
echo "刷新权限"
docker exec -it ${master_name} /bin/bash -c "mysql -u${mysql_user} -p${mysql_passwd} -e 'flush privileges;'"
echo "重置状态"
docker exec -it ${master_name} /bin/bash -c "mysql -u${mysql_user} -p${mysql_passwd} -e 'reset master;'"
echo "master截取bin_log"
bin_log=`docker exec -it ${master_name} /bin/bash -c "mysql -u${mysql_user} -p${mysql_passwd} << eof 
show master status;
eof" | sed -n '/mysql-bin/p' | awk '{print $1}'`
echo "master截取Position"
bin_Position=`docker exec -it ${master_name} /bin/bash -c "mysql -u${mysql_user} -p${mysql_passwd} << eof 
show master status;
eof" | sed -n '/mysql-bin/p' | awk '{print $2}'`
echo "${bin_log}"
echo "${bin_Position}"
echo "master配置完毕"

echo "node1从库开始配置"
docker exec -it ${node1_name} /bin/bash -c "mysql -u${mysql_user} -p${mysql_passwd} -e 'stop slave;'"
docker exec -it ${node1_name} /bin/bash -c "mysql -u${mysql_user} -p${mysql_passwd} -e 'reset slave;'"
docker exec -it ${node1_name} /bin/bash -c "mysql -u${mysql_user} -p${mysql_passwd} << eof
change master to master_host='${mysql_address}',
master_user='${replication_user}',
master_password='${mysql_passwd}',
master_port=${master_port},
master_log_file='${bin_log}',
master_log_pos=${bin_Position};
eof"
echo "node1从库配置完毕"
docker exec -it ${node1_name} /bin/bash -c "mysql -u${mysql_user} -p${mysql_passwd} -e 'start slave;'"
docker exec -it ${node1_name} /bin/bash -c "mysql -u${mysql_user} -p${mysql_passwd} -e 'show slave status \G;'"

echo "node2从库开始配置"
docker exec -it ${node2_name} /bin/bash -c "mysql -u${mysql_user} -p${mysql_passwd} -e 'stop slave;'"
docker exec -it ${node2_name} /bin/bash -c "mysql -u${mysql_user} -p${mysql_passwd} -e 'reset slave;'"
docker exec -it ${node2_name} /bin/bash -c "mysql -u${mysql_user} -p${mysql_passwd} << eof
change master to master_host='${mysql_address}',
master_user='${replication_user}',
master_password='${mysql_passwd}',
master_port=${master_port},
master_log_file='${bin_log}',
master_log_pos=${bin_Position};
eof"
echo "node2从库配置完毕"
docker exec -it ${node2_name} /bin/bash -c "mysql -u${mysql_user} -p${mysql_passwd} -e 'start slave;'"
docker exec -it ${node2_name} /bin/bash -c "mysql -u${mysql_user} -p${mysql_passwd} -e 'show slave status \G;'"

当运行完成之后就会如果是如下情况就说明配置成功了

两个脚本完成docker中mysql主从的简单配置_第3张图片

 说明配置成功

本文章参考详解使用shell脚本实现Docker搭建MySQL主从复制(同步)_碧蓝幻想的博客-CSDN博客

你可能感兴趣的:(docker,运维,容器)