关于IT运维技术的
最佳实践博客网站

MySQL数据库:主主(被动模式的主)复制

企业级MYSQL集群必须具备高可用、可扩展、易管理、低成本的特点。MySQL的主主互备备架构是企业环境中经常应用的一个解决方案,主要设计思路是通过MySQL Replication技术将两台MySQL Server互相将对方作为自己的(主库)Master,自己又同时作为 对方的(备库)Slave来进行复制。这样就实现了高可用架构中的数据同步功能。

主主(被动的主)复制的服务器配置步骤。

1、确保两台服务器上有相同的数据。(全新安装的MYSQL主机不需要这一步)

确保数据一致性先锁表(确定一台mysql为主库)

mysql> FLUSH TABLES WITH READ LOCK; Query OK, 0 rows affected (0.04 sec)

新建一个SSH渠道链接,进行备份

mysqldump --all-databases --lock-all-tables > masterdata.sql

使用scp命令把备份的sql文件远程传输给另一台mysql主库机(被动的主库机)

[root@c65mini ~]# scp -r masterdata.sql root@192.168.163.129:/root/
root@192.168.163.129's password: 
masterdata.sql 100% 605KB 605.2KB/s 00:01

在这台被动主库机上进行恢复数据。

mysql -u root -p < masterdata.sql

然后解锁

UNLOCK TABLES;

2、启用二进制日志,选择唯一的服务器ID,并且创建复制账号。

两台机器都有类似的配置:
主库master-db1

#主库
log_bin = mysql-bin
server_id = 128
sync_binlog=1
auto-increment-increment=2 # 应设为整个架构中服务器的总数
auto-increment-offset	=1 # 设定数据库中自动增长的起点,避免两台服务器数据同步时出现主键冲突

被动主库master-db2

#被动的主库(只读)
log_bin = mysql-bin
server_id = 129
sync_binlog=1
auto-increment-increment=2 # 应设为整个架构中服务器的总数
auto-increment-offset	=1 # 设定数据库中自动增长的起点,避免两台服务器数据同步时出现主键冲突

为两台MySQL主机创建repl账号

GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO repl@'192.168.163.%' IDENTIFIED BY 'replication_password';

3、在被动的主库(master-db2)中开启更新日志记录,这是故障转移和故障恢复的关键所在。

log_bin = /var/log/mysql/somelog-bin
log_bin_index = /var/log/mysql/somelog-bin.index

使用Mysql复制的另一个用途就是创建没有数据的日志服务器。它唯一的目的就是更加容易重放并且过滤掉二进制日志事件。对于崩溃后重启复制,是有很大的帮助的。同时对基于时间点的恢复也很有帮助。后面会写一篇关于mysql备份与恢复的文档。

4、把被动的主库(master-db2)配置成只读模式,防止可能与主动服务器上的更新产生冲突,这也就是被动模式的主复制与双主动模式的复制不同。也是构建容错性和高可用系统的非常强大的方式。

read_only         = 1

5、重启每个服务器的MySQL实例。

/etc/init.d/mysql restart

6、将每个主库设置为对方的备库,使用新创建的二进制日志开始工作。

先查看master-db1的位置信息

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000018 |      583 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

然后在master-db2上连接到master-bd1主库(让master-db1成为master-db2的主库)

mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.163.128',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='replication_password',
-> MASTER_LOG_FILE='mysql-bin.000018',
-> MASTER_LOG_POS=583;

在被动的主库master-db2上也执行一样的步骤。先查位置信息

SHOW MASTER STATUS;

然后在master-db1 上链接 master-db2主库(让 master-db2 成为 master-db1的主库)

mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.163.129',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='replication_password',
-> MASTER_LOG_FILE='mysql-bin.000018',
-> MASTER_LOG_POS=583;

测试方法:

先在 master-db1 上创建一个数据库。然后在 master-db2 上查看是否有,刚创建的这个数据库。

开启了read_only = 1 repl账号是不能再db2上创建的。如果不开启这个,可以测试db2上创建数据库,db1上查看是否有。

总结:这种 主主复制 在一定程度上满足了MYSQL的高可用。但是出现问题了,需要人工去修改被动主库配置(master-db2)。去掉只读read_only = 1

然后在web 应用端修改mysql主机地址,进行链接,开始提供读写服务。这种架构不够聪明,应用范围也相对较小。

未经允许不得转载:菜鸟HOW站长 » MySQL数据库:主主(被动模式的主)复制
分享到: 更多 (0)

评论 2

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    在测 master-db2 上创建一个数据库。然后在 master-db1 上查看是否有,刚创建的这个数据库。
    配置成read-only 还能写数据吗?

    阿斌3年前 (2015-03-31)回复
    • 开启了read_only = 1
      repl账号是不能再db2上创建的。

      bingoku3年前 (2015-04-01)回复