likes
comments
collection
share

docker (一)- MySQL主从

作者站长头像
站长
· 阅读数 35

服务器环境

  • ubuntu 18
  • CPU 1核
  • 内存 2GiB
  • 系统盘 40GiB
  • 带宽 1Mbit/s

跟着这篇文章搭这个主从,不得立省一个小时查问题的时间么(开玩笑啦)

安装docker(很多种方法随便用哪种都可以啦)

apt-get update
apt-get install docker-ce docker-ce-cli containerd.io

docker -v 能看到版本号就装好了的

启动docker并设置为开机自启动

systemctl start docker && systemctl enable docker

MySQL主从:一主两丛

使用Docker拉取MySQL镜像

这里我下载的是5.7版本的

docker pull mysql:5.7.13

如果你需要其他版本直接替换版本号就好,这里可以查到docker支持的所有的版本号。不写的话默认的版本号是最新的那版。

运行mysql主容器

docker run --name mysql-master -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.13
解释:
--name 后面跟的 master 是自己设置的容器名
-p 将容器的指定端口映射到主机的指定端口,这里是将容器的3306端口映射到主机的3308端口
-e 设置环境变量,这里是指定root账号的密码为root
-d 指将在后台运行容器,并返回容器ID

mysql:5.7.13 指定运行的是mysql:5.7.13这个镜像

检验是否启动成功

docker ps -a 显示所有的容器,包括未运行的

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
7782adcbfb98        mysql:5.7.13        "docker-entrypoint..."   27 seconds ago      Up 26 seconds       0.0.0.0:3308->3306/tcp   mysql-master

注意,是UP状态,表示正在运行中。

使用Navicat连接测试,如果连不成功,超时啥的,可能是端口权限的问题,一般云服务器都有他自己的安全策略,都需要在后台在配置端口

tips: navicat 测试连接的时候,host写宿主机的外网ip,也就是你这台云服务器的公网ip

创建主容器的复制账号

使用Navicat或者进到刚建的容器里mysql-master执行SQL

GRANT REPLICATION SLAVE ON *.* TO 'backup'@'%' identified by 'backup';
show grants for 'backup'@'%';

docker (一)- MySQL主从

docker (一)- MySQL主从

修改MySQL配置环境

创建配置文件目录,这一步主要为了将容器中的配置文件复制到宿主机上,修改配置的话,就不需要再进到每个容器中做修改。 你当然也可以不做这个映射,直接去容器里改配置就好了,但是在我多次尝试之后想说算了吧,问题在下面合集一里

目录结构如下

mkdir /usr/local/mysql/docker

mysql-master容器中的/etc/mysql/my.cnf复制到/usr/local/mysql/docker/my.cnf

docker cp mysql-master:/etc/mysql/my.cnf /usr/local/mysql/docker/my.cnf

在宿主机修改my.cnf,在 [mysqld] 节点最后加上后保存

log-bin=mysql-bin #使用binary logging,mysql-bin是log文件名的前缀
server-id=1 #唯一服务器ID,非0整数,不能和其他服务器的server-id重复

再将修改后的文件覆盖Docker容器中MySQL中的配置文件

docker cp /usr/local/mysql/docker/my.cnf mysql-master:/etc/mysql/my.cnf

重启mysql-master

docker restart mysql-master

重新测试连接试下,能连上就没问题,连不上就用文章最后面的命令去看日志

运行MySQL从容器

如果在同一台机器上直接运行就好,如果不同机器,就重新把docker装下,镜像拉下,再装就好了

docker run --name slave1 -p 3309:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.13
docker run --name slave2 -p 3310:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.13

和配置主容器相似,拷贝配置文件到slave1目录修改后覆盖回Docker中[slave2同]

如果是同台机器,咱们本着能懒则懒的心态,我们可以直接编辑刚才的配置文件vi /usr/local/mysql/docker/my.cnf,把server-id改一下就好了嘛

log-bin=mysql-bin
server-id=2
docker cp /usr/local/mysql/docker/my.cnf slave1:/etc/mysql/my.cnf
docker restart slave1

记得配置端口权限

配置主从复制

slave1容器里mysql执行下面的sql语句,也可以在Navicat里执行

CHANGE MASTER TO MASTER_HOST='你的外网ip', MASTER_PORT=3308, MASTER_USER='backup', MASTER_PASSWORD='backup'; 
START SLAVE;

MASTER_HOST 外网ip可以;直接用容器名加3306的端口号不行

MASTER_PORT 主数据库对外端口

MASTER_USER 刚才在主数据库里设置的用户名

MASTER_PASSWORD 主数据库密码

检查是否配置成功 show slave status;

成功的标志:Waiting for master to send event。 docker (一)- MySQL主从

失败的标志:Connecting to master,失败就去看日志(下面有汇总的命令),多半是配的有问题,端口访问不通啦啥的

docker (一)- MySQL主从

tips:

1、MASTER_HOST 用容器名 ,MASTER_PORT 3306,不行的 docker (一)- MySQL主从

2、如果两个容器在同一个宿主机中,MASTER_HOST 用内网ip,MASTER_PORT 3306,可以的。但是这个ip后面要是重启变了怎么办,我觉得还是直接用外网ip和映射出去的端口更稳妥一点。

测试

成功之后,去主数据库建个库,等个几十秒的去瞅瞅从库有新加的这个库了没。有了这不就成功了

问题合集

一、mysql容器中装个vim,就是装不上【没解决】 docker (一)- MySQL主从

docker (一)- MySQL主从

apt-key del 5072E1F
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 5072E1F
apt-key list

docker (一)- MySQL主从 在一番查找之后放弃了

二、映射到宿主机的端口重复了

映射到主机的端口是不能重复的,如果重了就会提示下面这样的错 failed: port is already allocated

docker (一)- MySQL主从 把刚刚建的这个容器删掉,再改个端口重跑就好了

docker rm mysql-slave1

三、正在运行的容器不能直接删

需要先停掉容器后再删

docker stop master
docker rm master

四、在容器里想安装东西,下载的超慢

sed -i "s/deb.debian.org/mirrors.aliyun.com/g" /etc/apt/sources.list
apt update
apt install -y 啥啥啥

命令合集

一、查看所有容器docker ps

二、启动容器 docker start 容器名

三、暂停容器 docker stop 容器名

四、删除容器 docker rm 容器名(此容器不能是正在运行的容器,stop掉后再删)

五、查看容器日志 docker logs 容器名 -f

参考文章

cloud.tencent.com/developer/a…

转载自:https://juejin.cn/post/7216358562498838583
评论
请登录