一.前言

主从复制的流程:

在这里插入图片描述

1. 主服务器上面的任何修改都会通过自己的 I/O tread(I/O 线程)保存在二进制日志 Binary log 里面。

2. 从服务器上面也启动一个 I/O thread,通过配置好的用户名和密码, 连接到主服务器上面请求读取二进   制日志,然后把读取到的二进制日志写到本地的一个Realy log(中继日志)里面。

3. 从服务器上面同时开启一个 SQL thread 定时检查 Realy log(这个文件也是二进制的),如果发现有更新立即把更新的内容在本机的数据库上面执行一遍。

小结: 借助于docker的容器化技术,我们只需要创建两个MySQL容器,并且占用主机的两个端口即可,对主机没有其他额外的影响。这种方式非常的轻量,而且也容易复制。本文则主要讲解如何通过docker来搭建MySQL集群。

二.主从集群搭建

2.1.master 主服务器的搭建

1.启动容器

docker run --name mysql-master --privileged=true -v /home/mysql/master-data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=a123456. -d xiaochunping/mysql-master

在执行上述命令之后,docker首先会检测本地有没有目标镜像,即xiaochunping/mysql-master(这个镜像内部的cnf是配好的),如果没有,则会下载该镜像,然后根据配置的参数运行该镜像。

上述命令中各个参数的含义如下:

--name指定运行之后的容器的名称为mysql-master;

​ -- privileged指定了当前容器是否真正的具有root权限,所谓的root权限是指具有宿主机的root权限,而不仅仅只是在容器内部有root权限;

-v 指定了容器中指定目录挂载到宿主机上的某个目录,这样做的目的在于防止容器中配置的数据丢失,因为docker容器在重启之后是不会保留前一次在其内部运行的相关数据的; ​

-p 表示宿主机上的某个端口映射到docker容器内的某个端口,这里也就是将宿主机的3306端口映射到容器内部的3306端口; ​

-e 表示指定当前容器运行的环境变量,该变量一般在容器内部程序的配置文件中使用,而在外部运行容器指定该参数。这里的MYSQL_ROOT_PASSWORD表示容器内部的MySQL的启动密码; ​

-d 参数指定了当前容器是在后台运行。

docker ps命令即可看到这个运行的容器

[root@zyy ~]# docker ps

CONTAINER ID   IMAGE        COMMAND    CREATED       STATUS    PORTS        NAMES

746e43a06fbf   xiaochunping/mysql-master   "docker-entrypoint.s…"   15 minutes ago   Up 15 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   mysql-master ​

2.进入该容器:

docker exec -it 746e43a06fbf /bin/bash ​

# 通过容器id方式,这里的id就是上面docker ps中展示的id

3.进入容器后,我们需要连接其MySQL服务:

mysql -uroot -pa123456.

# 这里的密码就是最开始创建容器时指定的密码

4.创建一个专门用来复制binlog的账号,并且赋予该账号复制权限,其命令如下:

grant replication slave on *.* to 'test'@'%' identified by '123456'; flush privileges;

#这里的grant replication slave是一个命令格式,表示赋予后面的账户以复制的权限,这样slave节点就能够获取到master节点对数据的更新。上述命令中创建的账户的用户名为test,密码为123456

5.查看master节点的binlog状态:

mysql> show master status; #这里需要记住这个File和Position属性的值,因为下面在配置slave的时候需要用到

+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

2.2 slave服务器准备 

1.启动容器

docker run --name mysql-slave --privileged=true -v /home/mysql/slave1-data:/var/lib/mysql -p 3307:3306 --link mysql-master:master -e MYSQL_ROOT_PASSWORD=a123456. -d xiaochunping/mysql-slave​

2.进入容器

docker exec -it mysql-slave /bin/bash ​

3.输入用户名密码

mysql -uroot -pa123456.

4.连接连接主服务器信息

change master to master_host='master', master_user='test', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=589, master_connect_retry=30;

5.开启主从复制

mysql> start slave;

Query OK, 0 rows affected (0.00 sec)

6.查看从服务器的连接状态

show slave status\G;

#这里只要看到两个参数Slave_IO_Running和Slave_SQL_Running都为true,则表示复制是正常进行的,到这里我们的主从结构也就搭建完成了。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐