« 上一篇下一篇 »

centos系统下MySQL数据库利用Slave+LVS+Keepalived 进行主从复制

    MySQL数据库同步复制的功能主要体现在它的配置文件(liunx 下为/etc/my.cnf)上,其工作原理为slave端记录并且执行master端的操作日志。mysql主从复制相信已经用得很多了,但是由于工作原因一直没怎么用过。趁着这段时间相对空闲,也就自己实现一遍。尽管互联网上已有大把类似的文章,但是自身实现的仍然值得记录。

 

首先我们来了解一下数据库复制常遇到的问题:

一、 第一就是性能上的问题

1、向上拓展(硬件方面) scale up 个体本身 容易达到极限

 2、向外拓展 scale out

    第二就是可用性的问题

1、数据库服务中断

2、误操作数据损坏

3、硬件故障

4、数据库升级测试遭遇bug

5、******

    基于以上这些问题就有了一个比较好的解决方案,那就是实现数据库的主从复制。MySQL主从复制技术可以提高服务器的性能。除此之外MySQL复制还可以解决以下几个问题:

    1、数据分布 (Data distribution )

    2、负载平衡(load balancing)

    3、备份(Backups)

    4、高可用性和容错性 High availability and failover

    在开始实验前我们先来了解几个概念:异步复制、全同步复制和异步复制。

    异步复制

MySQL默认的是异步复制,就是主库在执行完客户端提交的事务后立即将结果返回给客户端,并不关系从库是否已经接受处理,这样如果主挂掉,主上提交的事务可能并没有完全传到从上,如果此时强行把从提升为主,可能会导致新主上的数据不完整。

全同步复制

指当主库执行完一个事务,等到所有从库都执行完该事务才将结果返回给客户端。因为需要等待所有从库都执行完下能返回,所以全同步复制的性能必然会受到影响,需要有超时时间。

半同步复制

    介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立即返回给客户端,而是等到至少一个从库接收到并写到realy log中才返回给客户端。相对于异步复制,半同步复制提高了数据库的安全性,同时也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。

如果想更好地实现MySQL的主从复制,必须首先要想清楚它的复制原理,这样在工作中才能熟练的操作和应用。

二、MySQL复制的工作原理:

1、主服务器(master)将改变记录写入到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events) ,在事件 写入二进制日志完成后,master通知存储引擎提交事务。此后可接收slave的请求

2、从服务器(slave)将主服务器master的binary log events拷贝到自己的中继日志(relay log) 。Slave的I/O线程在master上打开一个普通的连接,并将这些二进制事件写入中继日志。

3、SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。

MySQL还提供了一种复制过滤器:就是指在数据库复制的过程中,仅复制一个或几个数据库相关的数据,并非所有,它提供了两种复制方法:一种是在主服务器的配置文件中添加配置文件,另一种是在从服务器中添加配置文件。

1、在主服务器中

主服务器仅向二进制日志中记录有关特定数据库相关的写操作。

  binlog_do_db= #要复制的数据库

    binlog_ignore_db=#要忽略的数据库

2、在从服务器中

从服务器的SQL THREAD仅重放关注的数据库或表相关的事件,并将其应用于本地;

Replicate_Do_DB= #要复制过来的数据库

Replicate_Ignore_DB=#不要复制过来的数据库

 

三、复制常用类型

3.1 复制的常用体系结构基本原则

1.每个 Slave 只能有一个 Master;
2.每个 Slave 只能有一个唯一的服务器ID;
3.每个 Master 可以有很多 Slave;
如果你设置了 log_slave_updates,Slave 可以是其他 Slave 的 Master,从而扩散 Master 的更新
MySQL 不支持多主服务器复制---即一个 Slave 可以有多个 Master,但是,通过一些简单的组合,我们却可以建立灵活而强大的复制体系结构。
3.2 一主多从复制架构

场景:在主库读取请求压力非常大的场景下,可以通过配置一主多从复制架构实现读写分离,把大量对实时性要求不是特别高的读请求通过负载均衡到多个从库上,降低主库的读取压力。在主库出现异常宕机的情况下,可以把一个从库切换为主库继续提供服务;
建议:
1.当 Slave 增加到一定数量时,Slave 对 Master 的负载以及网络带宽都会成为一个严重的问题。
2.不同的 Slave 扮演不同的作用(例如使用不同的索引,或者不同的存储引擎)
3.用一个 Slave 作为备用 Master,只进行复制
4.用一个远程的 Slave,用于灾难恢复。
3.3 多级复制架构

场景:一主多从的架构能够解决大部分读请求压力特别大的场景需求,但主库的I/O压力和网络压力会随着从库的增加而增长,而使用多级复制架构就可以解决一主多从场景下,主库额外的I/O和网络压力。 但要注意的是,多级复制场景下主库的数据是经历两次才到达读取的从库,期间的延时比一主多从复制场景下只经历一次复制的要大。
建议:
1.可能存在延时较长的风险
2.这种方案可以与第三方软件结合使用,例如Slave+LVS+Keepalived 实现高可用。
3.4 双主复制/Dual Master架构

场景:双主/Dual Master架构适用于写压力比较大的场景,或者DBA做维护需要主从切换的场景,通过双主/Dual master架构避免了重复搭建从库的麻烦。
建议:
1.最大问题就是更新冲突。
2.可以采用MySQL Cluster,以及将Cluster和Replication结合起来,可以建立强大的高性能

 

下面我们开始基于上边的理论来完成我们今天的实验。

 

一、环境准备:

centos系统服务器2台、一台用户做Mysql主服务器,一台用于做 Mysql从服务器,配置好yum源、防火墙关闭、各节点时钟服务同步、各节点之间可以通过主机名互相通信

二、准备步骤:

1、iptables -F && setenforce 清空防火墙策略,关闭selinux

2、拿两台服务器都使用yum方式安装Mysql服务,要求版本一致

3、分别启动两台服务器mysql服务,确保服务正常

   三、实现步骤:

配置master主服务器:

1、对master进行配置,包括打开二进制日志,指定唯一的servr ID。在配置文件加入如下值:


   server-id=1 #配置server-id,让主服务器有唯一ID号
     
   log-bin=mysql-bin #打开Mysql日志,日志格式为二进制
     
   skip-name-resolve#关闭名称解析,(非必须)


2、创建复制帐号 在Master的数据库中建立一个备份帐户:每个slave使用标准的MySQL用户名和密码连接master 。进行复制操作的用户会授予REPLICATION SLAVE权限。

 

1
   grant replication slave,replication client on *.* to identified by '111111';


3.查看主服务器状态,在Master的数据库执行show master status,查看主服务器二进制日志状态


   MariaDB [(none)]> show master status;
   +------------------+----------+--------------+------------------+
   | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
   +------------------+----------+--------------+------------------+
   | mysql-bin.000001 |      414 |              |                  |
   +------------------+----------+--------------+------------------+
   1 row in set (0.00 sec)
配置slave从服务器:

1、对slave进行配置,打开中继日志,指定唯一的servr ID,设置只读权限。在配置文件加入如下值

    server-id=2 #配置server-id,让从服务器有唯一ID号
    
    relay_log = mysql-relay-bin #打开Mysql日志,日志格式为二进制
    
    read_only = 1 #设置只读权限
    
    log_bin = mysql-bin #开启从服务器二进制日志
    
    log_slave_updates = 1 #使得更新的数据写进二进制日志中


2、启动从服务器复制线程 让slave连接master,并开始重做master二进制日志中的事件。



    MariaDB [(none)]> change master to
    
    master_host='172.17.253.210',master_user='slave',master_password='111111',master_log_file='mysql-bin.000001',master_log_pos=245;
   
    Query OK, 0 rows affected (0.01 sec)
    
    执行start slave;# 启动复制线程。
      

3、查看从服务器状态 可使用SHOW SLAVE STATUS\G查看从服务器状态,如下所示,也可用show processlist \G查看当前复制状态:

Slave_IO_Running: Yes #IO线程正常运行

Slave_SQL_Running: Yes #SQL线程正常运行

实现半同步复制:

主节点:


16
    MariaDB [(none)]> install plugin rpl_semi_sync_master soname 'semisync_master.so';
    Query OK, 0 rows affected (0.00 sec)
 
    MariaDB [(none)]> show global variables like 'rpl_semi%';
    +------------------------------------+-------+
    | Variable_name                      | Value |
    +------------------------------------+-------+
    | rpl_semi_sync_master_enabled       | OFF   |
    | rpl_semi_sync_master_timeout       | 10000 |
    | rpl_semi_sync_master_trace_level   | 32    |
    | rpl_semi_sync_master_wait_no_slave | ON    |
    +------------------------------------+-------+
    4 rows in set (0.01 sec)
 
    MariaDB [(none)]> set global rpl_semi_sync_master_enabled=on;
    Query OK, 0 rows affected (0.00 sec)
从节点:


    MariaDB [(none)]> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';    
    Query OK, 0 rows affected (0.01 sec)
     
    MariaDB [(none)]> show global variables like 'rpl_semi%';
    +---------------------------------+-------+
    | Variable_name                   | Value |
    +---------------------------------+-------+
    | rpl_semi_sync_slave_enabled     | OFF   |
    | rpl_semi_sync_slave_trace_level | 32    |
    +---------------------------------+-------+
    2 rows in set (0.01 sec)
     
     MariaDB [(none)]> stop slave io_thread;
    Query OK, 0 rows affected (0.00 sec)
     
    MariaDB [(none)]> set global rpl_semi_sync_slave_enabled =on;
    Query OK, 0 rows affected (0.01 sec)
     
    MariaDB [(none)]> show global variables like 'rpl_semi%';   
    +---------------------------------+-------+
    | Variable_name                   | Value |
    +---------------------------------+-------+
    | rpl_semi_sync_slave_enabled     | ON    |
    | rpl_semi_sync_slave_trace_level | 32    |
    +---------------------------------+-------+
    2 rows in set (0.00 sec)
     
    MariaDB [(none)]> start slave io_thread;             
    Query OK, 0 rows affected (0.00 sec)
    四、测试

    在master上创建数据库和数据表,观察slave数据库中的数据,是否和master同步。