高性能MySQL读书笔记 — MySQL配置复制

为MySQL服务器配置复制非常简单。最基本的场景是新安装的主库和备库,可以分为以下几个步骤:

  • 在每台服务器上创建复制帐号;
  • 配置主库和备库;
  • 通知备库连接到主库并从主库复制数据。

假设现在我们有服务器node04(192.168.159.103)和服务器node05(192.168.159.104)。下面将演示如何配置主备。

创建复制帐号

MySQL会赋予一些特殊的权限给复制线程。在备库运行的I/O线程会建立一个到主库的TCP/IP连接,这意味着必须在主库创建一个用户,并赋予其合适的权限。备库I/O线程以该用户名连接到主库并读取其二进制日志。通过如下语句创建用户帐号:

mysql> create user 'repl'@'192.168.159.%' identified by 'p4ssword';
Query OK, 0 rows affected (0.02 sec)

mysql> select user, host from mysql.user;
+---------------+---------------+
| user          | host          |
+---------------+---------------+
| repl          | 192.168.159.% |
| mysql.session | localhost     |
| mysql.sys     | localhost     |
| root          | localhost     |
+---------------+---------------+
4 rows in set (0.00 sec)

mysql> grant replication slave, replication client on *.* to repl@'192.168.159.%' identified by 'p4ssword';
Query OK, 0 rows affected, 1 warning (0.01 sec)

我们在主库和备库上都创建该帐号,注意我们把这个帐号限制在本地网络,因为这是个特殊帐号(尽管该帐号无法执行select或修改数据,但仍然能从二进制日志中获取一些数据)。
注:
复制帐号事实上只需要有主库的replication slave权限,并不一定需要每一端服务器都有replication client权限,那为什么我们要把这两种权限给主/备库都赋予呢?这有两个原因:

  • 用来监控和管理复制的帐号需要replication client权限。并且针对这两种目的使用同一个帐号更加容易(而不是为每个目的单独创建一个帐号);
  • 如果在主库上建立了帐号,然后从主库将数据克隆到备库上时,备库也就设置好了变成主库所需要的配置。这样后续有需要可以方便地交换主备库角色。
配置主库和备库

假设主库是服务器node01(MySQL安装过程可以参考我的另一篇文章),在主库的my.cnf文件中添加或修改如下内容:

log-bin=mysql-bin
server-id=10

必须明确的指定一个唯一的服务器ID,默认服务器ID通常为1。使用默认值可能会和其他服务器的ID冲突,因此这里我们选择10作为服务器ID。
如果之前没有在MySQL的配置文件中指定log-bin选项,就需要重新启动MySQL。为了确认二进制日志文件是否已经在主库上创建,使用show master status命令检查输出是否与如下一致。MySQL会为文件名增加一些数字,所以这里看到的文件名和你定义的可能会有点不一样。

mysql>show master status;
启动复制

配置从节点
vim /etc/my.cnf

server-id=11
relay_log=/var/lib/mysql/relay-bin

启动复制

mysql> change master to master_host='192.168.159.103', master_user='repl', master_password='p4ssword', master_log_file='mysql-bin.000001', master_log_pos=0;

启动从节点

mysql> start slave;

Last_IO_Errno: 1593
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
这个错误需要修改从节点/var/lib/mysql 目录下auto.cnf 的 server-uuid 值,之所以值一样是因为我们在里的从节点是从主节点克隆过来的。

[auto]
server-uuid=cb323b2b-9a26-11e9-9429-000c2908cd5c

查看从节点状态

mysql> show slave status\G;

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

你可能感兴趣的:(数据库)