MySQL高可用方案之多级复制

在大部分场景中我们都是用MySQL主从复制来实现数据库的冗余,这里是用多级复制来处理,多级复制可以快速简单的处理数据库的故障,数据库有A、B、C服务器,正常情况下A为主、B为A的从、C为B的从。

A-->B-->C

当A出现问题时,将B设为主,C为B的从,A正常后就为C的从

B-->C-->A

当B出问题后,C为主,A为C的从,B为A的从,如此反复可以快速解决问题

角色 IP 主机名 数据库版本
192.168.2.241 db1 5.6.29
192.168.2.242 db2 5.6.29
192.168.2.243 db3 5.6.29

注意在这样的场景下数据库的版本必须为一致,否则会因为版本之间不兼容导致出现问题

  1. 创建复制账户
  2. 配置数据库配置
  3. 备份主库,然后导入到备库
  4. 配置主从

1.创建复制账户

mysql>grant repication slave on *.* to ‘repl‘@‘192.168.2.%‘ identified by ‘repl‘;
mysql>flush privileges;

2.开启数据库binlog,设置server-id和启用log_slave_updates

说明:log_slave_updates是将从服务器从主服务器收到的更新记入到从服务器自己的二进制日志文件中

如果没有开启log_slave_updates则在A-->B-->C场景中,C将无法从B中获取到数据

在MySQL配置文件/etc/my.cnf中的[mysqld]下添加如下语句

log-bin=mysqlbin
server-id=241      #这里每台服务器都必须不一致,最好是IP的末段
log_slave_updates=1
expire_logs_days=7

记得重启下数据库

3.备份主库,然后导入到备库中

锁表

mysql> flush tables with read lock;
mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File       | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000002 |    409 |         |             |             |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

注意:这里不能退出mysql命令行会话,另外再开一个窗口将数据库导出,因为锁表的时候,只要退出会话锁表自动解除

[[email protected] ~]# mysqldump -uroot -p --all-database --add-drop-table >all_database.sql

将上面导出的all_database.sql导入到其他的db2、db3中

[[email protected] ~]# mysql -uroot -p <all_database.sql
[[email protected] ~]# mysql -uroot -p <all_database.sql

4.开启主从复制

在db2上:

mysql> change master to master_host=‘192.168.2.241‘,master_user=‘repl‘,master_password=‘repl‘,master_log_file=‘binlog.000002‘,master_log_pos=409;
mysql> start slave;
mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File     | Position| Binlog_Do_DB| Binlog_Ignore_DB| Executed_Gtid_Set|
+---------------+----------+--------------+------------------+-------------------+
| binlog.000002| 647569 |       |         |          |
+---------------+----------+--------------+------------------+-------------------+

在db3上:

mysql> change master to master_host=‘192.168.2.242‘,master_user=‘repl‘,master_password=‘repl‘,master_log_file=‘binlog.000002‘,master_log_pos=647569;
mysql> start slave;

然后分别在db2和db3上执行show slave status\G;查看是否有错

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.2.242
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binlog.000002
          Read_Master_Log_Pos: 647569
               Relay_Log_File: db3-relay-bin.000002
                Relay_Log_Pos: 280
        Relay_Master_Log_File: binlog.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 647569
              Relay_Log_Space: 451
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 242
                  Master_UUID: 25a2315a-d9f0-11e5-9aa9-000c296e3855
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
1 row in set (0.00 sec)

可以看到

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

为yes,说明复制正常

接着测试一下:

在数据库中插入数据,然后在db1、db2、db3上查询即可

如有问题可以show slave status\G;查看是否有错误

如果遇到类似1062的错误的话可以忽略,则可以直接

mysql> stop slave;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
mysql> start slave;

在运行一段时间后,db1出现问题,导致无法恢复的故障,则只需要在db2上执行stop slave;

然后db1恢复后,从db3导出数据并记录点,然后change master到db3上

如果为了防止在从库意外写入,也可以在从数据库的配置文件中加入read_only = 1

时间: 2024-08-04 18:15:28

MySQL高可用方案之多级复制的相关文章

Heartbeat+DRBD+MySQL高可用方案

Heartbeat+DRBD+MySQL高可用方案 =============================================================================== 概述: =============================================================================== 方案介绍  1.方案介绍及优缺点 ★方案介绍 本方案采用Heartbeat双机热备软件来保证数据库的高稳定性和连续性,数

[转载] MySQL高可用方案选型参考

原文: http://imysql.com/2015/09/14/solutions-of-mysql-ha.shtml?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io 本次专题是 MySQL高可用方案选型,这个专题想必有很多同学感兴趣. 高可用的意义以及各种不同高可用等级相应的停机时间我就不必多说了,直接进入主题. 可选MySQL高可用方案 MySQL的各种高可用方案,大多是基于以下几种基础来部署的: 基于主从复制:

MySQL高可用方案MHA自动Failover与手动Failover的实践及原理

集群信息 角色                             IP地址                 ServerID      类型 Master                         192.168.244.10   1                 写入 Candicate master          192.168.244.20   2                 读 Slave                           192.168.244.

Heartbeat+DRBD+MySQL高可用方案【转】

转自Heartbeat+DRBD+MySQL高可用方案 - yayun - 博客园 http://www.cnblogs.com/gomysql/p/3674030.html 1.方案简介 本方案采用Heartbeat双机热备软件来保证数据库的高稳定性和连续性,数据的一致性由DRBD这个工具来保证.默认情况下只有一台mysql在工作,当主mysql服务器出现问题后,系统将自动切换到备机上继续提供服务,当主数据库修复完毕,又将服务切回继续由主mysql提供服务. 2.方案优缺点 优点:安全性高.稳

五大常见的MySQL高可用方案【转】

1. 概述 我们在考虑MySQL数据库的高可用的架构时,主要要考虑如下几方面: 如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据库的故障而中断. 用作备份.只读副本等功能的非主节点的数据应该和主节点的数据实时或者最终保持一致. 当业务发生数据库切换时,切换前后的数据库内容应当一致,不会因为数据缺失或者数据不一致而影响业务. 关于对高可用的分级在这里我们不做详细的讨论,这里只讨论常用高可用方案的优缺点以及高可用方案的选型. 2. 高可用方

MySQL高可用方案选型参考

本次专题是 MySQL高可用方案选型,这个专题想必有很多同学感兴趣. 高可用的意义以及各种不同高可用等级相应的停机时间我就不必多说了,直接进入主题. 可选MySQL高可用方案 MySQL的各种高可用方案,大多是基于以下几种基础来部署的: 基于主从复制: 基于Galera协议: 基于NDB引擎: 基于中间件/proxy: 基于共享存储: 基于主机高可用: 在这些可选项中,最常见的就是基于主从复制的方案,其次是基于Galera的方案,我们重点说说这两种方案.其余几种方案在生产上用的并不多,我们只简单

MySQL高可用方案探究

来自 http://bbs.chinaunix.net/thread-3769165-1-1.html 最近花了点时间研究了一下mysql的高可用,总结成文档,希望对初学这有帮助. Lvs+Keepalived+Mysql单点写入主主同步高可用方案 http://blog.chinaunix.net/uid-20639775-id-3337448.html Lvs+Keepalived+Mysql单点写入读负载均衡主主同步高可用方案 http://blog.chinaunix.net/uid-2

[转]MYSQL高可用方案探究(总结)

前言 http://blog.chinaunix.net/uid-20639775-id-3337432.htmlLvs+Keepalived+Mysql单点写入主主同步高可用方案 http://blog.chinaunix.net/uid-20639775-id-3337448.htmlLvs+Keepalived+Mysql单点写入读负载均衡主主同步高可用方案http://blog.chinaunix.net/uid-20639775-id-3337471.htmlHeartbeat高可用M

mysql高可用方案MHA介绍

概述 MHA是一位日本MySQL大牛用Perl写的一套MySQL故障切换方案,来保证数据库系统的高可用.在宕机的时间内(通常10-30秒内),完成故障切换,部署MHA,可避免主从一致性问题,节约购买新服务器的费用,不影响服务器性能,易安装,不改变现有部署. 还支持在线切换,从当前运行master切换到一个新的master上面,只需要很短的时间(0.5-2秒内),此时仅仅阻塞写操作,并不影响读操作,便于主机硬件维护. 在有高可用,数据一致性要求的系统上,MHA 提供了有用的功能,几乎无间断的满足维