MySQL replication 是一个进程,它允许你自动从一个数据库服务器拷贝数据到另外一个或者更多的服务器。
MySQL 支持许多复制拓扑结构,其中,主从拓扑结构是最著名的。在主从拓扑结构中,一个数据库服务器扮演 master(主要服务器),其他一个或者多个数据库服务器扮演 slaves(从服务器)。默认情况下,主要数据库将数据库修改封装成二进制的形式作为事件发送出去,而从服务器在准备好的情况下,请求这些事件。
在本篇指南中,我们将会讲解在 CentOS 7 上如何建立 MySQL 主从复制,其中一个作为主服务器,一个作为从服务器。对于 MariaDB 来说,步骤是一样的。
这种类型的复制拓扑最适合部署读复制。对于线上数据库进行读复制,以便灾备和分析任务。
在这个例子中,我们假设你有两台运行 CentOS 7 的服务器。它们在同一个局域网中,可以相互通信。如果你的服务器不能提供局域网 ip,你可以使用公网 IP,并且配置防火墙,允许来自可信源的流量通过 3306 端口。
这个例子中的服务器有下面的 IP:
Master IP: 192.168.121.59
Slave IP: 192.168.121.14
默认的 CentOS7 源没有包括 MySQL 软件包,因此我们需要从他们的官方 YUM 软件源安装 MySQL。为了避免出现问题,我们将在两台服务器上都安装 MySQL5.7。
在主从服务器上都安装 MySQL:
sudo yum localinstall https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
sudo yum install mysql-community-server
一旦安装完成,启动 MySQL 服务并且启用开机启动:
sudo systemctl enable mysqld
sudo systemctl start mysqld
当 MySQL 服务器第一次启动时,会给 MySQL 的 root 用户一个临时密码。想要查找这个密码,使用 grep 命令:
sudo grep 'temporary password' /var/log/mysqld.log
运行mysql_secure_installation
命令设置你的新 root 密码并且提高 MySQL 实例的安全性:
mysql_secure_installation
输入临时 root 密码并且对所有的问题都回答Y
(yes)。
新密码需要至少 8 位,并且包含至少一个大写字母,一个小写字母,一个数字和一个特殊符号。
首先,我们将配置主要的 MySQL 服务器,并且做下面的修改:
想要这样做,打开 MySQL 配置文件,并且讲下面的行添加到[mysqld]
段:
sudo nano /etc/my.cnf
bind-address = 192.168.121.59
server-id = 1
log_bin = mysql-bin
一旦设置完成,重启 MySQL 服务,使修改生效。
sudo systemctl restart mysqld
下一步骤就是创建新的复制用户。以 root 用户登录 MySQL 服务器:
mysql -uroot -p
从 MySQL 提示内部,运行下面的 SQL 查询语句,将会创建replica
用户,并且授予该用户REPLICATION SLAVE
权限:
CREATE USER 'replica'@'192.168.121.14' IDENTIFIED BY 'strong_password';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'192.168.121.14';
确保你修改了这个IP为你的从服务器IP地址。你可以使用你想要的名字。
当你还在 MySQL 提示符下,运行下面的命令,将会打印出二进制文件和位置:
SHOW MASTER STATUS\G
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 1427
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
注意文件名mysql-bin.000001
和位置1427
。在配置从服务器的时候,你可能要用到它们。这些值在你的服务器上可能是不同的。
像上面的主服务器一样,我们将会对从服务器做以下修改:
打开 MySQL 配置文件,编辑下面的行:
sudo nano /etc/my.cnf
bind-address = 192.168.121.14
server-id = 2
log_bin = mysql-bin
重启 MySQL 服务:
sudo systemctl restart mysqld
下一个步骤,是配置将要连接主服务器的从服务器参数。登录 MySQL shell:
mysql -uroot -p
首先,停止从服务器线程:
STOP SLAVE;
运行下面的查询,这将会简历从服务器复制主服务器:
CHANGE MASTER TO
MASTER_HOST='192.168.121.59',
MASTER_USER='replica',
MASTER_PASSWORD='strong_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=1427;
确保你使用了正确的 IP 地址,用户名和密码。日志文件名和位置必须和你从主服务器上获取的值一样。
一旦完成,开启从服务器线程:
START SLAVE;
此时,你已经设置好了主从复制。
想要验证一切按期望进行,我们将在主服务器上创建一个新的数据库:
mysql -uroot -p
CREATE DATABASE replicatest;
登录从服务器 MySQL shell:
mysql -uroot -p
运行下面的命令,列出所有的数据库:
SHOW DATABASES;
你将会看到你创建在主服务器上的数据库也在从服务器上:
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| replicatest |
| sys |
+--------------------+
5 rows in set (0.00 sec)
在这篇指南中,我们向你展示在 CentOS 7 上创建一个 MySQL 主从复制。