站点图标 Linux-技术共享

Linux & Centos 7 & Mysql 主从同步的作用、搭建

20210318235713205

1、什么是主从同步

  1. 将一台服务器(主)的 Mysql 数据同步到另外一台服务器(从)的 Mysql 这一过程就叫主从同步。
  2. 一个主服务器可以对应 N 台从(子)服务器

同步同步、跟云同步的道理一样,起到一个备份、实时更新的作用而已。

2、主从同步的好处与缺陷

好处

  1. 读写分离,减轻数据库压力,其主服务器负责写数据,从服务器负责读数据。
  2. 去中心化,多台服务器保证了不用在担心某台服务器的 Mysql 挂掉而导致整个系统奔溃。

缺陷

  1. 操作不但就容易出现主从不同步情况,对于有强制数据的一致性的需求来说是不适用的。

3、主从同步的工作原理

主服务器:

  1. 启动 io 线程并将 sql 命令写入 binlog 文件。

从服务器:

  1. 启动 io 线程、sql 线程。
  2. io 线程读取主服务器里的 binlog 文件并把内容写到从服务器的 relay 日志中。
  3. sql 线程读取 relay 日志然后执行同步到 mysql。

只需记住主从同步的处理分别启动了 3 个线程来完成,至于主从之间是怎么进行通信的下面我会开始讲解。

4、开始搭建主从同步

介绍了主从同步的一些基本概念与原理后,现在我们来开始进行配置。

4.1 准备工作

  1. 本文不采用在同一台主机上来搭建主从同步,其目的是个人觉得这样学起来不易于理解,在实际应用中也不会共用一台主机,所以这里我已经准备好两台服务器,一个作为主,一个作为从。
    假设我的主服务器 ip 是 106.14.15.1
    从服务器 ip 地址是 106.11.11.2
    记住好这主从服务器的 ip 啊,可别混淆了。

  2. 确保主从服务器都已下载好 mysql,本文用的 mysql 版本是 5.7,如果你还不知道怎么下载 mysql,可以参考我前面写过的 Centos 7 下载 Mysql 完整详细步骤

  3. 下载一个 ssh 远程控制服务器工具,这里我用的是 MobaXterm

  4. 接下来我将把主称为 master ,从称为 slave,毕竟主从原文就是 master&slave 老外起的名字,不然总是主从从主的,看起来怪别扭。

4.2 配置 master 服务器

  1. 修改配置文件 /etc/my.cnf
# 绑定 ip 地址,其目的是可以让其它服务器连接上该数据库。
bind-address = 0.0.0.0
# 唯一标识符,主设为 1,子设为 2 3 4 5 ...
server-id    = 1
# 启动 login 也就是主会将所有操作都写进 binlog 文件里面。
log-bin=/var/lib/mysql/log-bin.log
  1. 创建用户,好让 slave 服务器连接,以及一些必要同步参数数据
mysql -u root -p
# 新建 slave 用户。
CREATE USER 'slave'@'106.14.15.1' IDENTIFIED BY 'secret__1';
# 开始授权,也就是创建 slave 用户后还要指定哪台服务器能使用此账号进行登录 mysql 。
# 如果指定 'slave''@'% 则代表任意服务器可以登录进来。
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'106.11.11.2' IDENTIFIED BY 'secret__1';
# 刷新权限,不刷新的话上面的创建不会立即生效的。
FLUSH PRIVILEGES;
# 开始锁表:在锁表期间无法对进行写,其目的是保证主从同步期间没有其它额外数据写进来。
FLUSH TABLES WITH READ LOCK;
# 获取主服务器的 logbin 文件索引 和 偏移量。(每个 mysql 打印都是不一样的)
# 注意:这是主从同步最关键的两个值,同步就靠它俩了,所以务必记住,在从服务器配置的时候会用到。
SHOW MASTER STATUS\G
*************************** 1. row ***************************
             File: log-bin.000735
         Position: 154
  1. 打开一个新的窗口开始拷贝数据库,以便传递给 slave 服务器,注意:上面的窗口继续保留着
# 拷贝所有数据库,并放到 /root/all-databases.sql 下面。
mysqldump -u root -p --all-databases --master-data > /root/all-databases.sql
  1. 拷贝完成后,原来的窗口可以解锁并退出窗口了
UNLOCK TABLES;
exit;
  1. 通过 scp 将拷贝好的 sql 文件上传到 slave 服务器
# 如果你的 ssh 端口默认不是 22 则可以通过 -P 指定端口。
scp /root/all-databases.sql root@106.11.11.2:/tmp/

主服务器的配置就这样完成了啦,是不是很简单?

4.3 配置 slave 服务器

  1. 修改配置文件 /etc/my.cnf
servier-id = 2
log-bin = /var/lib/mysql/log-bin.log
  1. 将上传过来的 sql 即数据库导入进去
mysql -u root -p  < /tmp/all-databases.sql

如果提示: This operation cannot be performed with a running slave io thread; run STOP SLAVE IO_THREAD FOR CHANNEL ‘’ first.
需要进入 mysql -u root -p 然后输入:STOP SLAVE; 停掉 SLAVE

  1. 开始同步配置,最关键就在这里了
mysql -u root -p
# 停掉 SLAVE
STOP SLAVE;
# 还记得上面 master 创建的用户吗?这里就可以用到了。
CHANGE MASTER TO MASTER_HOST='106.13.226.62',
MASTER_USER='slave',
MASTER_PASSWORD='Guanli1_',
# 还记得 SHOW MASTER STATUS\G 的两个重要参数吗?,这里就可以用到了。
MASTER_LOG_FILE='log-bin.000733',
MASTER_LOG_POS=5752;
# 启动 SLAVE 表示开始连接主服务器数据库进行同步工作。
START SLAVE;
# 查看 SLAVE 状态,如果出现 IO 与 SQL 均为 yes 那么你整个主从同步就已经完成并正在运行了。
# IO / SQL 就是线程,还记得上面说过的【工作原理】吗?
SHOW SLAVE STATUS \G
*************************** 1. row ***************************
 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes

如果出现 IO / SQL 状态为 no,可以通过 SHOW SLAVE STATUS \G 里面的输出比如 Last_Error 来排除问题

现在我们来实验一下,在 master 服务器中新建一个数据库,看看 slave 服务器是否同步成功。
Master

mysql -u root -p
CREATE DATABASE products;

Slave

mysql -u root -p
SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| products           |
+--------------------+

可以看到 slave 已经同步过来了,至此主从同步的搭建就完成了,也没有那么难嘛对不对?

另外, my.cnf 可以配置一些主从的其它配置选项,比如 sync_binlog = 1 时表示遇到意外情况时是否强制写入硬盘确保同步正常,又比如 slave-skip-errors = all 表示在同步的过程中,如果出现 sql 报错是否忽略强制执行,避免 SQL 线程过掉等。
具体详细配置不是本文范畴,可自行搜索或参考文档。

退出移动版