MySQL 是一个小型关系型数据库管理系统,被广泛用于各种中小 Web 应用中。常见的应用架构有:

1、单点(Single):适合小规模应用;
2、复制(Replication):适合中小规模应用;
3、集群(Cluster):适合大规模应用。

曾写过 httpd 服务端与 MySQL 数据库分开部署的情况的文章,那属于单点应用的范畴。而随着业务需求的不断增长,更高的负载量、更安全的系数、更可靠的存储,这一切都会让依然停留在单点应用的你举步维艰。

令人高兴的是,MySQL 早在 3.23.15 版本开始就提供了单向的异步复制功能。利用该功能可以实现两种数据库异步复制:主从模式(A -> B,或 A -> B、C、D)、互相备份模式(A <=> B)。后者也称“双向热备”或“双机热备”,是前者的扩展与补充。

值得注意的是,这种复制是异步的,有别于 MySQL 的同步复制实现(也称做 MySQL 集群、MySQL Cluster,本文不作讨论,感兴趣的话可参见这里)。

相关原理:当主库有更新的时候,主库会把更新操作的 SQL 写入二进制日志 (Bin log),并维护一个二进制日志文件的索引,以便于日志文件轮回(Rotate)。在从库启动异步复制的时候,从库会开启两个 I/O 线程,其中一个线程连接主库,要求主库把二进制日志的变化部分传给从库,并把传回的日志写入本地磁盘。另一个线程则负责读取本地写入的二进制日志,并在本地执行,以反映出这种变化。较老的版本在复制的时候只启用一个 I/O 线程,实现这两部分的功能。

需要注意的地方:

1、主库必须启用 Bin log,主库和从库必须有唯一的 Server Id;
2、从库必须清楚了解从主库的哪一个 Bin log 文件的哪一个偏移位置起开始复制;
3、从库可以从主库只复制指定的数据库,或者数据库的某些数据表;
4、主库和从库的数据库名称可以不一样,不过还是推荐使用一样的名称;
5、主库和从库的 MySQL 版本需保持一致。

由于 MySQL 复制功能的设置都在其配置文件 my.cnf 中体现,因此互相备份模式与主从模式大同小异。本文所涉方案为后者。

首先分别在两台服务器上下载、解压缩版本相同的 MySQL 源码包,并编译安装。此过程在此略过,并假设:

1、两台机器在同一子网内,且 IP 地址分别为 192.168.0.31(以下简称 A 机器) 与 192.168.0.15(以下简称 B 机器);
2、两台机器的数据库版本、目录、初始的库、表均一致;
3、MySQL 配置文件都位于 /etc/my.cnf;
4、需要同步的库:dbname,不需要同步的库:mysql、test。

在 A 机器上添加 mysqlrepl 为同步帐号:

GRANT REPLICATION SLAVE ON *.* TO 'mysqlrepl'@'192.168.0.15' IDENTIFIED BY '密码'; 然后:

vi /etc/my.cnf 修改:

# 日志的名称
log-bin=mysql-bin
# 主服务器 ID
server-id=1
# 需要备份的库
binlog-do-db=dbname
# 忽略的库
binlog-ignore-db=mysql
binlog-ignore-db=test
在 B 机器上:

vi /etc/my.cnf 修改:

# 日志的名称
log-bin=mysql-bin
# 从服务器 ID
server-id=2
# 主服务器的 IP 地址或者域名
master-host=192.168.0.31
# 主数据库的端口号
master-port=3306
# 同步数据库的用户
master-user=mysqlrepl
# 同步数据库的密码
master-password=
# 如果从服务器发现主服务器断开,重新连接的时间差(秒)
master-connect-retry=30
# 需要同步的库
replicate-do-db=dbname
# 忽略的库
replicate-ignore-db=mysql
replicate-ignore-db=test
重启两边的 MySQL,在 B 机器上登入 mysqld,执行:

mysql>slave start; 然后可以查看同步配置情况。在 A 机器上执行:

mysql>show master status; 在 B 机器上执行:

mysql>show slave status; 截止这里,我们只实现了 A -> B 的复制,要实现双向热备,仅需要将上面的步骤倒过来执行一遍即可。

标签: mysql, replication, slave

添加新评论