Mysql系列:高可用(HA)-keeplived

转自:晓叹星沉 https://my.oschina.net/blueSky4Java/blog/1572905

摘要: 随着项目的发展,为了提高程序的性能,数据库层面或多或少的会用到HA、读写分离、集群等功能,在选型时可以考虑使用现成的云服务,或者一些高可用软件,亦或是利用一些开源软件实现上述功能。此次将针对上述功能分篇幅进行整理,内容涉及HA、读写分离、集群,以期使用时达到快速部署之效果。

一、keepalived简介

Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除。其使用 VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议,可以通过在一个路由器组(一个VRRP组)之间共享一个虚拟IP(VIP), 即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个MASTER和多个BACKUP 。当master宕掉后, 根据VRRP的优先级来选举一个BACKUP当MASTER,及时将业务切换到其它设备,从而保持通讯的连续性和可靠性 。

    Mysql HA的实现原理(此处以两台为例),两台Mysql主主复制,使数据时刻保持一致,同时使用两个keepalived监听各自机器上的Mysql,当Mysql服务停掉后,执行脚本关掉keepalived服务,由另一台机器的keepalived接替。

实现此功能需要两个步骤:

  1. 配置Mysql主主复制
  2. keepalived安装配置

环境信息:

    master:192.168.102.129(CentOS6.8,hostname为master)

    slave:192.168.102.130(CentOS6.8,hostname为salve)

    VIP:192.168.102.128

二、Mysql主主复制

(1)修改mysql配置文件,开启二进制文件

    master的my.cnf

[mysqld]
server_id = 1  #服务id,保证两台mysql唯一,不重复即可
log-bin = mysql-bin  #开启二进制日志
relay-log = mysql-relay-bin  
replicate-wild-ignore-table=mysql.%  #配置不需要复制的库
replicate-wild-ignore-table=test.%  
replicate-wild-ignore-table=information_schema.% 

    slave的my.cnf

[mysqld]
server_id = 2  
log-bin = mysql-bin  
relay-log = mysql-relay-bin  
replicate-wild-ignore-table=mysql.%  
replicate-wild-ignore-table=test.%  
replicate-wild-ignore-table=information_schema.%

    配置完成后,重启两个mysql。

(2)配置主主复制

连接mysql,使用show master status查看master和slave两个mysql的二进制文件名称和位置

master(192.168.102.129)如下:

slave(192.168.102.130)如下:

根据上述file和position互相配置主从

master(192.168.102.129)如下:

change master to master_host='192.168.102.130', 
master_user='root',master_password='123456',master_port=3306,master_log_file='mysql-
bin.000002',master_log_pos=472;
start slave;

slave(192.168.102.130)如下:

change master to  master_host='192.168.102.129', 
master_user='root',master_password='123456',master_port=3306,master_log_file='mysql-
bin.000002',master_log_pos=724;  
start slave; 

(3)测试验证是否同步

连接master,在jz.test中添加记录m1

连接salve,在jz.test中添加记录s1,结果如下

三、keepalived安装配置

(1)keepalived安装

使用yum可以直接安装yum install keepalived

网络不允许的情况下可以下载tar或rpm进行离线安装。本文使用yum直接安装,安装过程不再赘述。

(2)keepalived配置

配置keepalived.conf文件

[root@master ~]# vi /etc/keepalived/keepalived.conf

master配置

! Configuration File for keepalived
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state BACKUP   #master和slave都设置为BACKUP,
    interface eth0
    virtual_router_id 51
    priority 100  #master和slave设置不同值,启动时会将priority大的设置为master
    advert_int 1
    nopreempt  #设置为不抢占模式,仅master配置。当master挂掉后,slave当选为master,恢复后不再切换                 
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.102.128 #虚拟ip
    }
}

virtual_server 192.168.102.128 3306 {
    delay_loop 2  #轮训real_server时间间隔,此处设为2秒
    lb_algo rr
    lb_kind NAT
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.102.129 3306 {
        weight 1
	notify_down /usr/local/mysql/checkMysql.sh #mysql挂掉时执行的脚本,需具备执行权限
        TCP_CHECK {  
	    connect_timeout 10
	    bingto 192.168.102.128  
            nb_get_retry 3  
            delay_before_retry 3  
            connect_port 3306  
        }
    }
}

slave配置

! Configuration File for keepalived
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.102.128
    }
}

virtual_server 192.168.102.128 3306 {
    delay_loop 2
    lb_algo rr
    lb_kind NAT
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.102.130 3306 {
        weight 1
        notify_down /usr/local/mysql/checkMysql.sh  
        TCP_CHECK {  
            connect_timeout 10  
            bingto 192.168.102.128              
            nb_get_retry 3  
            delay_before_retry 3  
            connect_port 3306  
        }  
    }
}

在/usr/local/mysql/下增加checkMysql.sh,脚本如下(留意脚本权限,需具备执行权限):

pkill keepalived

keepalived加入开机启动

chkconfig keepalived on

(3)测试keepalived是否生效

启动master和slave的mysql、keepalived,

连接192.168.102.128的数据库,查询hostname,此时vip在master机器上

停掉master的mysql服务(service mysql stop)后,vip飘到了slave上。

四、总结

    通过上述配置可初步实现数据库的高可用性,在Mysql服务出问题时实现自动切换,但在实际应用中应考虑服务宕掉时,应实现邮件通知功能,文中尚未涉及,后期实现后再做更新。此外Mysql之间出现数据不同步问题,也要谨慎处理,暂停数据同步功能,将数据处理后,方可重新开启同步。

© 著作权归作者所有

posted @ 2017-11-20 15:06  机甲战士  阅读(418)  评论(0编辑  收藏  举报