本篇内容介绍了“基于docker的mysql5.7主从配置”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
docker下的mysql5.7数据库配置文件存在在多个文件下,入口文件是/etc/mysql/my.cnf
,其他文件是通过include方式进来。
为了能更直观的查看配置文件,所以主库的配置文件放在/etc/mysql/mysql.conf.d/master.cnf
# vi $PWD/master.cnf
[mysqld]
server-id=100
log-bin=mysql-bin
# vi $PWD/master.sql
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
不难理解的是mysql数据库里记录的一笔笔数据,最终还是以文件形式存在硬盘中的某几个文件里的
在docker镜像里的mysql5.7环境下,那些重要的数据文件是存在/var/lib/mysql
目录下,当然是在容器环境中
所以建议将这些文件从容器内部映射到容器外部,以便更方便的对其进行备份保存。 本列中,我将容器内部的/var/lib/mysql
映射到自己主机的master/db
目录,这个目录可以不建立,只要说明路径,docker会帮我们建立 ps:自己主机可以使用网盘路径,这样数据库的文件其实是存在远端的。
docker run -p 5001:3306 \
--name mymaster \
-v $PWD/master.cnf:/etc/mysql/mysql.conf.d/master.cnf \
-v $PWD/masterdb:/var/lib/mysql \
-v $PWD/master.sql:/docker-entrypoint-initdb.d/master.sql \
-e MYSQL_ROOT_PASSWORD=111111 \
-e MYSQL_DATABASE=waynedb \
-e MYSQL_USER=wayne \
-e MYSQL_PASSWORD=wayne \
-d mysql:5.7
逐行解释:
将docker中的3306端口映射到外面的5001端口
将外面的配置文件映射到内部
将数据库文件映射到外面某个目录下(可以省略)
设置root密码
设置一个初始数据库(可以省略)
设置用户,默认该用户对上述初始数据库有完全权限(可以省略)
设置上述用户密码(可以省略)
使用image为mysql的5.7版本
使用强大的docker,来模拟一个mysql客户端,直接连接已经运行的主库,注意填写真实的主库ip和端口号
docker run --rm -it --name mysql-client mysql:5.7 mysql -h20.2.11.97 --port=5001 -uroot -p
进入后先创建一个用于同步的账号slave,密码为123456,并赋予可同步权限
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
然后查询状态,为从库同步做准备
show master status\G;
# vi $PWD/slave.cnf
[mysqld]
server-id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
docker run -p 5002:3306 \
--name myslave \
-v $PWD/slave.cnf:/etc/mysql/mysql.conf.d/slave.cnf \
-v $PWD/slavedb:/var/lib/mysql \
-v $PWD/a.sql:/docker-entrypoint-initdb.d/a.sql \
-e MYSQL_ROOT_PASSWORD=111111 \
-e MYSQL_DATABASE=waynedb \
-e MYSQL_USER=wayne \
-e MYSQL_PASSWORD=wayne \
-d mysql:5.7
使用强大的docker,来模拟一个mysql客户端,直接连接已经运行的主库,注意填写真实的从库ip和端口号
docker run --rm -it --name mysql-client mysql:5.7 mysql -h20.2.11.97 --port=5002 -uroot -p
配置从库去连接主库
请注意填写真实的主库ip和端口号
请注意填写真实的master_log_file和master_log_pos,这个是从主库上使用show master status\G;
获得
mysql> change master to master_host='10.2.11.97',
master_user='slave',
master_password='123456',
master_port=5001,
master_log_file='mysql-bin.000001',
master_log_pos= 2830,
master_connect_retry=30;
解释:
master_host :Master的地址,指的是容器的独立ip,可以通过docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称|容器id查询容器的ip
master_port:Master的端口号,指的是容器的端口号
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
start slave;
使用docker的mysql来充当客户端,运行一次就退出(--rm),进入交互模式(-it),黑体是mysql连接命令 docker run --rm -it --name mysql-client mysql:5.7 mysql -h227.0.0.1 --port=3339 -uroot -p
这个脚本需要基于docker的环境,请先配置好docker
仅需修改#-------------------------------
上面的那部分内容
master_ip= 主库所在主机的真实ip
master_port= 主库所在主机的监听端口
master_MYSQL_ROOT_PASSWORD=主库的root账号密码
master_docker_name=主库在docker下的名字
master_root_path=主库的数据文件映射到主机的目录
#!/bin/bash
# master_ip和slave_ip如果相同的话,则master_port and slave_port不能相同,master_docker_name and slave_docker_name也不能相同
# 设置端口前,注意端口有没有被占用
# master_ip和slave_ip要能互相访问
# 主库相关设置
master_ip=10.2.11.97
master_port=5010
master_MYSQL_ROOT_PASSWORD=111111
master_docker_name=mymaster_new
master_root_path=/home/wayne/newnew
# 从库相关设置
slave_ip=10.2.11.97
slave_port=5011
slave_MYSQL_ROOT_PASSWORD=111111
slave_docker_name=myslave_new
slave_root_path=$master_root_path
# 从库使用以下用户去连接主库同步
sync_user=slave
sync_pass=123456
#-----------------------------------------------------------
reset() {
docker rm -f $master_docker_name
docker rm -f $slave_docker_name
}
master() {
if [ ! -d $master_root_path ]; then
mkdir -p $master_root_path
fi
cd $master_root_path
cat << EOF > master.sql
CREATE USER '${sync_user}'@'%' IDENTIFIED BY '${sync_pass}';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '${sync_user}'@'%';
EOF
cat << EOF > master.cnf
[mysqld]
server-id=100
log-bin=mysql-bin
EOF
docker run -p ${master_port}:3306 \
--name ${master_docker_name} \
-v $PWD/master.cnf:/etc/mysql/mysql.conf.d/master.cnf \
-v $PWD/masterdb:/var/lib/mysql \
-v $PWD/master.sql:/docker-entrypoint-initdb.d/master.sql \
-e MYSQL_ROOT_PASSWORD=${master_MYSQL_ROOT_PASSWORD} \
-e MYSQL_DATABASE=waynedb \
-e MYSQL_USER=wayne \
-e MYSQL_PASSWORD=wayne \
-d mysql:5.7
# rm master.sql
# rm master.cnf
}
slave() {
i=1
file=`docker run --rm -it --name mysql-client mysql:5.7 mysql -h ${master_ip} --port=${master_port} -uroot -p${master_MYSQL_ROOT_PASSWORD} -e "show master status\G;" 2>/dev/null|grep File |cut -f2 -d : | awk '$1=$1'`
while [ -z $file ]
do
echo $i times sleep 5
sleep 5
i=`expr ${i} + 1`
if [ $i -gt 10 ]; then
echo "连接主库失败,从库不建立并退出"
exit 0
fi
file=`docker run --rm -it --name mysql-client mysql:5.7 mysql -h ${master_ip} --port=${master_port} -uroot -p${master_MYSQL_ROOT_PASSWORD} -e "show master status\G;" 2>/dev/null|grep File |cut -f2 -d : | awk '$1=$1'`
done
pos=`docker run --rm -it --name mysql-client mysql:5.7 mysql -h ${master_ip} --port=${master_port} -uroot -p${master_MYSQL_ROOT_PASSWORD} -e "show master status\G;" 2>/dev/null|grep Pos |cut -f2 -d : | awk '$1=$1'`
echo $pos
if [ ! -d $slave_root_path ]; then
mkdir -p $slave_root_path
fi
cd $slave_root_path
cat << EOF > slavetmp.sql
stop slave;
change master to master_host='${master_ip}',
master_user='${sync_user}',
master_password='${sync_pass}',
master_port=${master_port},
master_log_file='$file',
master_log_pos= $pos,
master_connect_retry=30;
start slave;
EOF
cat -v slavetmp.sql |tr -d "^M" > slave.sql
cat << EOF > slave.cnf
[mysqld]
server-id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
EOF
docker run -p ${slave_port}:3306 \
--name ${slave_docker_name} \
-v $PWD/slave.cnf:/etc/mysql/mysql.conf.d/slave.cnf \
-v $PWD/slavedb:/var/lib/mysql \
-v $PWD/slave.sql:/docker-entrypoint-initdb.d/slave.sql \
-e MYSQL_ROOT_PASSWORD=${slave_MYSQL_ROOT_PASSWORD} \
-e MYSQL_DATABASE=waynedb \
-e MYSQL_USER=wayne \
-e MYSQL_PASSWORD=wayne \
-d mysql:5.7
# rm slave.sql
# rm slavetmp.sql
# rm slave.cnf
}
master
slave
#reset
“基于docker的mysql5.7主从配置”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
亿速云「云数据库 MySQL」免部署即开即用,比自行安装部署数据库高出1倍以上的性能,双节点冗余防止单节点故障,数据自动定期备份随时恢复。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/943306/blog/3094352