Docker部署Mysql主从

拉取镜像

首先搞个服务器,装好docker

可以用

docker search mysql

查看有哪些mysql的镜像,列表中第一个是官方镜像

然后使用

docker pull mysql:5.7.29

拉取mysql5.7版本的镜像,本文以mysql5.7版本为例

准备配置文件

之后我们需要分别启动主从两个容器,因主从配置项有区别,我更推荐将配置文件外挂出来的方式,否则我们要在启动容器后进入容器中对配置项进行vim编辑,这样会有两个问题,一个是mysql默认的镜像中使用的Linux系统非常精简,是不带vim和vi指令的,需要安装,而且直接安装也是装不上的,需要先

apt-get update

之后再

apt-get install vim

才能安装vim

这样会导致我们的容器变大,众所周知虽然大部分时候变大挺好但对容器来说变大不是什么好事,更不要说这句install需要翻墙才能链接到debian.org这个域名

第二个问题是我们本身就不应当在容器里面做修改,容器应当是轻量型的,随用随启,随删随走的,而启动容器后还需要进去改设置这种行为本身不符合docker的轻量化思想

综上,我们采用配置文件外挂的方式

建议专门建一个文件夹在你的常用目录中,用来存放容器中mysql的配置文件

新建一个格式为.cnf的文件,作为主库的配置文件,写入以下内容

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

[mysqld]
## 同一局域网内注意要唯一
server-id=001
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin

其中server-id在一个mysql集群中不可重复

然后我们再新建一个格式同样为.cnf的文件,作为备库的配置文件,写入以下内容

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

[mysqld]
## 设置server_id,注意要唯一
server-id=010
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin

保存好,这样,我们就完成了mysql主备的配置文件的准备

启动容器

先启动主库

docker run -p 3339:3306 --name master-node -e MYSQL_ROOT_PASSWORD=123456 --restart="always" -v /home/dockermysqlconf/masterconf.cnf:/etc/mysql/my.cnf -v 宿主机存储路径:/var/lib/mysql  -v /etc/localtime:/etc/localtime -d mysql:5.7.29
参数 作用
-p 宿主机ip:容器内ip 设置端口
--name 容器名 设置容器名,随便起
-e 环境变量key=环境变量value 设置环境变量,本句中设置了mysql的密码
--restart="always" 自动持久化,死了自动拉起来
-v 宿主机绝对路径:容器内绝对路径 文件挂载,本句中先将配置文件挂载进容器,然后将数据库的文件存储文件夹挂载出来,最后是将时区文件挂载进去
-d 跑起来以后不打印镜像日志/类似于nohup跑
mysql:5.7.29 使用的镜像为mysql:5.7.29

后启动从库

docker run -p 3340:3306 --name slave-node -e MYSQL_ROOT_PASSWORD=123456 --restart="always" -v /home/dockermysqlconf/slaveconf.cnf:/etc/mysql/my.cnf -v 宿主机存储路径:/var/lib/mysql -v /etc/localtime:/etc/localtime -d mysql:5.7.29

主库是3339端口,从库是3340端口

现在可以先用navicat连接一下数据库,确认一下数据库服务是否正常

主从配置

配置主库

docker ps

查看主库的容器id,或着使用刚才命名的容器名来指定也可以

docker exec -it 主库容器id/容器名 /bin/bash

进入主库的容器

mysql -uroot -p
123456/你的密码

进入主库容器中的mysql

然后执行下列两个指令

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

如果使用的是mysql8.0以上版本的话,需要指定密码插件,执行

CREATE USER slave@'%'IDENTIFIED WITH 'mysql_native_password'  BY '123456';
grant replication slave on *.* to   slave@'%';
flush privileges;

在Master数据库创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据

接着在主库的mysql中执行

show master status;
mysql.png

查看主库的binlog进度,用于待会告诉从库从主库的binlog的哪里开始进行同步

从现在开始到主从设置好之前,主库不要有变动,否则会影响Position的值,同步前就需要重新查询

获取主库容器ip

配置从库前,我们需要先查询一下主库的容器ip

在宿主机执行

docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称/容器id

可以知道指定容器的ip,配置从库的时候需要用到

配置从库

现在进入从库,同上流程进入容器后进入mysql,执行

change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 2830, master_connect_retry=30;
参数 作用
master_host Master的地址,就是刚才我们查到的容器ip
master_port Master的端口号,容器内端口号
master_user 用于同步的账号
master_password 同步用账号的密码
master_log_file 指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos 从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry 如果连接失败,重试的时间间隔,单位是秒,默认是60秒

然后我们再在从库执行

show slave status \G;

查看主从同步状态

mysql1.png

正常情况下,SlaveIORunning 和 SlaveSQLRunning 都是No,因为我们还没有开启主从同步过程

执行

start slave;

开启主从同步,之后我们再次执行

show slave status \G;

查看主从同步状态

mysql2.png

SlaveIORunning 和 SlaveSQLRunning 都是Yes,说明主从复制已经开启。此时可以测试数据同步是否成功

测试就很简单啦,在主库建个数据库建个表写个数据什么的都可以

参考文章

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容