基于Docker的MySQL主从复制环境搭建

1. 前言

之前的程序架构可能是这样的一种形式:

当程序体量扩大后,我们进行扩展,可能会扩展多个后台服务实例,但数据库还是只有一个,所以系统的瓶颈还是在数据库上面,所以这次的主要任务就是对数据库进行扩展,主要形式为:扩展多台数据库实例,实现读写分离,对于一些写的任务分配到主数据库,对于读的任务使用子数据库进行读取。从而提高系统性能。

修改后的架构如下所示:

2. 环境预搭建

这次使用docker来进行这个环境的搭建,使用MySQL版本为5.7.13。

docker pull mysql:5.7.13

整体结构为:

  • 1个master主节点,作为写的节点。

  • 2个slave从节点,作为读的节点。

先分别将这几个节点启动,映射到不同的端口。在本机使用数据库连接工具连接,测试是否正常启动且正常连接。

docker run -p 3307:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.13
docker run -p 3308:3306 --name mysql-slave1 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.13
docker run -p 3309:3306 --name mysql-slave2 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.13

我这里分别将主节点(mysql-master)映射为3307端口,两个从节点(mysql-slave1,2)分别为33083309端口。然后设置MySQL的root密码为123456

然后可以使用navicat等工具连接测试MySQL。

分别进入这几个节点,编辑配置文件。

docker exec -it mysql-master /bin/bash

我使用的是name来进入容器,也可以根据id来选择,即docker exec -it 对应容器的id /bin/bash

由于没有预先安装vivim程序,然后要下载时需要执行apt update命令,这时会从国外源进行下载。由于众所周知的原因,速度很慢。我就将下载源更改为国内源。

进入到/etc/apt文件夹中,首先将原有的文件进行备份:

mv sources.list sources.list.bak

然后使用如下命令新建文件并输入内容:

echo deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse > sources.list

然后我们再执行apt update等操作,最后安装vim即可。

3. 进行主从配置

  1. 主节点(master)配置

进入主节点容器后,进入/etc/mysql文件夹中,会有一个my.cnf文件,主要对它进行修改。

编辑这个文件,找到[mysqld],在这个下面添加如下命令:

[mysqld]
...
...
## 唯一的编号
server-id=101
## 这个是关键配置项
log-bin=mysql-bin

配置完成后,需要重启MySQL服务使配置生效。使用service mysql restart命令进行重启,重启完成后会关闭MySQL的容器,我们还要重启容器docker restart mysql-master

  1. 从节点(slave)配置

同主节点一样,编辑/etc/mysql/my.cnf文件

[mysqld]
...
...
## 唯一的编号
server-id=103
## 选,如果需要将该节点作为其他节点的主节点则需要添加
# log-bin=mysql-bin
  1. 链接主节点和从节点

主节点

在主节点容器中进入MySQLmysql -u root -p,密码就是启动容器时设置的123456

进入MySQL后执行show master status;

从这里我们得到两个信息FilePosition的值,我这里分别是mysql-bin.000001154

从节点

进入MySQL,执行如下的命令:

change master to master_host='***', master_port=3306, master_user='root', master_password='123456',  master_log_file='****', master_log_pos= ***;


分别解释一下这几个参数代表的意思:

  • master_host:主节点的ip地址,可以在本机使用中如下命令来查看容器的ip地址

    docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称|容器id
    
  • master_port:mysql的端口号,不是对外映射的端口号

  • master_user:mysql中的用户,要有权限,我直接使用了root,也可以新建用户来使用

  • master_password:用于同步的mysql帐户密码

  • master_log_file:用于同步的文件,就是从主节点查询到的文件,我这里是mysql-bin.000001

  • master_log_pos:binlog文件开始同步的位置, 就是从主节点查询到的位置,我这里是154

执行刚刚的命令后在MySQL终端执行show slave status \G;来查看主从同步状态。

<img src="https://raw.githubusercontent.com/liunaijie/images/master/20200131101232.png" style="zoom:50%;" />

我们可以从这里查看配置的信息来进行核查,然后可以看到两个属性slave_io_runningslave_sql_running都是no,也就是关闭状态。

我们可以执行start slave来开启主从复制,执行后再次执行show slave status \G;命令可以看到两个属性都变成了yes,则说明主从复制已经开启。

如果启动未成功,我们可以检查网络是否连通,同步用到的mysql密码是否正确,还有就是同步文件名称和位置是否正确!

测试

我们可以在主库中新建一个数据库,到从库中如果看到这个库的存在就表示主从同步完成。

4. 级联配置

我想再加一个备份节点,并且这个节点是从slave1节点进行备份的,也就是slave1节点作为backup节点的主节点。这就构成了master->slave->backup这样一个级联关系。

我本来是按照上面的步骤,先在slave的my.cnf中添加了

log-bin=mysql-slave-bin #为了区分,我对文件名进行了修改 

接着在backup节点执行的

change master to master_host='***', master_user='root', master_password='123456', master_port=3306, master_log_file='****', master_log_pos= ***;

命令换成对应slave节点的ip等属性。结果发现不行。在主节点有更改后,备份节点并没有变更!

于是我开始了排查,发现在slave节点中的binlog文件并没有更改信息的记录,而backup节点相当于监听这个文件变更,这个文件没有变更所以backup节点也就不会有更改。这里延伸一点,mysql的binlog记录了我们所有更改的操作,所以理论上我们可以通过binlog来恢复任一时间刻的数据库内容。

于是问题就转变成,主节点变更后如何让从节点的binlog日志有记录。

我们可以在编辑my.cnf文件时再添加一行:log_slave_updates=1即可,让slave在接到master同步后也将二进制日志写到自己的binlog中。

这样就可以完成,主节点进行更改后,从节点和备份节点都会进行变更,备份节点的数据是从从节点备份过去的。

参考

本文由博客一文多发平台 OpenWrite 发布!
博主邮箱:liunaijie1996@163.com,有问题可以邮箱交流。

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

推荐阅读更多精彩内容