业务背景
唉,最近和同事吃饭,大家都觉得每天吃饭路上都在讨论一些八卦,既没营养,又无聊!于是乎,有个开发大牛想了想提出了一个问题:最近服务器单机MySQL怕有问题,所以想搭建主从,但又不想再另外一台服务器上直接装mysql(装太多太乱)!樊*,你不是会Docker嘛!麻烦你用docker在我的两台服务器上搭建一个主从呗!
难点分析
- MYSQL 容器里不能使用vim
- 两台服务器跨区,需要使用公网IP
安装步骤
一、主库安装
- 参照dockerhub描述创建一个mysql基础容器
方法一:
可以创建一个最简单myql容器,然后再修改配置
docker run --name fanrui_mysql_master -e MYSQL_ROOT_PASSword=my-secret-pw -d mysql:tag
方法二:
创建一个带映射配置文件的容器(请注意下面在一行执行)
docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
**注: 之所以介绍两种方式是因为第一种方法需要进入容器内编辑配置文件,从而导致not foud vim
解决方法:1 apt-get update 2 apt-get install vim 这两个步骤都有可能会失败,而且特别慢,只能耐心等待,或者去喝杯咖啡了, 失败的话,重新执行一次或几次还是可以成功的(我暂时没有加速的办法)****注:第二种方法需要重点注意映射的的宿主机路径与容器路径的关系,可能导致映射失败
解决方法:1 映射前宿主机chmod 777 宿主机目录 2 目录一定要映射到足够深的目录**注:下图1是我按照dockehub上的介绍,映射到1的位置,编辑mysql配置文件mysql.cnf不生效
下图2是我按照dockehub上的介绍,映射到2的位置,编辑mysql配置文件mysqld.cnf可生效
- 编辑mysqld.cnf
在[mysqld]下添加
# 这里的 server-id 相对于从库唯一即可
server-id = 1
log-bin = mysql-bin
- 重启mysql服务,停止容器,再重启动容器即可
docker stop mysql容器
docker start mysql容器
- 进入主mysql,查看master信息
二、从库安装
1.从库容器创建:参照主库容器
2. 修改配置文件
路径:/etc/mysql/mysql.cnf.d/mysql.cnf
在[mysqld]下添加
# 这里的 server-id 相对于主库唯一即可
server-id = 13
log-bin = mysql-slave-bin
relay-log =edu-mysql-replay-bin
3. 重启mysql服务,停止容器,再重启动容器即可
docker stop mysql容器
docker start mysql容器
4. 进入mysql从库,执行下面语句
该语句功能为给从库指定同步目标
change master to master_host='公网IP', master_user='root', master_password='123456', master_port=3306, master_log_file='mysql-bin.000003主库刚才查到的', master_log_pos= 2830同步位置, master_connect_retry=30;
- 注:正常情况不应该用root去同步,为了试验方便就暂时用root吧
5.检查配置状态
执行:show slave status G;
在没有执行start slave的时候,两个yes,应该是两个No,不过没有问题,不是错误
执行:start slave,再执行 show slave status G;
如果一个yes,一个一直是connectioning,那么恭喜你,只差最后一步了!
三、公网配置
- 关闭主从库容器,并打包成新的镜像
镜像打包请参照:镜像打包
- 创建新的主从容器,并分别将2375端口映射到3306
docker run -d --name new_main -p 2375:3306 新主库镜像:tag
docker run -d --name new_slave -p 2375:3306 新从库镜像:tag
- 重新进入从库容器,执行步骤二的第4,5操作
执行:start slave,再执行 show slave status G;之后如果两项都是yes,则说明已经可正常同步!
- 如果是云服务器,一定要在安全组打开2375端口
- 如果是云服务器,一定要在安全组打开2375端口
- 如果是云服务器,一定要在安全组打开2375端口四、测试
- 通过工具主库创建一个测试数据库,刷新从库 create database testDockerPublic;
总结:这种方式其实并不是可以上生产环境的,因为2375本身存在安全隐患,如果哪位博友对docker网络比较熟悉,也希望能再评论区留下您的地址,不剩感激!
相关参考
https://www.cnblogs.com/songwenjie/p/9371422.html
https://www.jianshu.com/p/3eb1e178f51b
https://blog.csdn.net/qq_38423105/article/details/88385673
https://www.cnblogs.com/xiohao/p/9059256.html