随着业务复杂度的增加,单台 MySQL 数据库服务器已不能满足实际的需求,取而代之的是数据库服务器集群。MySQL 具有支持分布式的特性,能轻松搭建一个支持高并发的 MySQL 数据库服务器集群。在集群中我们必须保证各个 MySQL 节点的数据是同步的。主从同步就是一种最为常见的同步方式。
主从同步是指,在数据同步过程中,一台服务器充当主服务器(Master),接收来自用户的内容更新,另一个或多个其它的服务器充当从服务器(Slave),接收来自主服务器的 binlog 内容,解析出 SQL 语句,更新到从数据库,使得主从服务器的数据达到一致。
从 MySQL5.6 版本开始,实现主从数据同步有两种方式:基于日志(binlog)和基于 GTID(全局事务标示符)。
要实现 MySQL 主从同步,首先必须打开 Master 端的 binlog 记录功能,否则就无法实现。因为整个同步过程实际上就是 Slave 端从 Master 端获取 binlog 日志,然后再在 Slave 上以相同的顺序执行从 binlog 日志中所记录的各种 SQL,如下图所示。

主从同步原理:
我们在此使用 docker 这样的容器技术在一台主机上实现 mysql 的主从同步。这里需要做一点解释,docker 中存在容器的概念,当启动一个 mysql 容器时,其实可以理解为启动了一台仅仅只安装了 mysql 的服务器。

这里可以看到,主容器已经启动起来了。
同样的方式,启动一个 Slave 容器,将其命名为 slaveMysql, 并设置 mysql 的 root 用户密码为 123456:

也可以使用查看正在运行容器时查看到的 CONTAINER ID 来启动,例如笔者使用这种方式的启动命令如下:


查看二进制日志状态信息,获取 position 的值,为从服务器配置做准备:

重新开启一个 Xfce Terminal,通过以下命令进入到 Slave 容器内部:

由于容器环境下没有安装 vim,所以使用以下命令安装 vim:

参数说明:
master_host:Master 的地址,指的是容器的独立 IP,可以通过docker inspect --format='{{.NetworkSettings.IPAddress}}' masterMysql 查询 Master 的 IP
master_user:Master 中设置的用户名
master_password:Master 中设置的用户名对应密码
master_port: Master 的端口号,指的是容器的端口号
master_log_file:二进制日志文件名(这里注意填写为实验者在之前使用 show master status 命令查询出来的值)
master_log_pos:二进制日志的 position 值(这里注意填写为实验者在之前使用 show master status 命令查询出来的值)
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是 60 秒
执行以下命令,启动主从操作:

可以看到我们在 Master 中新建的 world 数据库已经同步过来了。
再执行以下命令查看插入的数据是否也同步过来了:

可以看到插入的数据也已经同步过来了。
接下来再在 Master 删除一条数据:

此时主从复制情况良好。
本篇文章到此结束,如果您有相关技术方面疑问可以联系我们技术人员远程解决,感谢大家支持本站!