zoukankan      html  css  js  c++  java
  • 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之间出现数据不同步问题,也要谨慎处理,暂停数据同步功能,将数据处理后,方可重新开启同步。

    © 著作权归作者所有

  • 相关阅读:
    常用函数
    PostgreSql那点事(文件读取写入、命令执行的办法)
    如何检测Windows中的横向渗透攻击
    小米笔记本pro版bios经常找不到硬盘
    grunt教程
    nodejs廖雪峰大神教程
    ClickOnce是什么?如何使用?
    asp.net中的ORA-12154: TNS: 无法解析指定的连接标识符
    未能加载文件或程序集 ICSharpCode.SharpZipLib
    PL/SQL 循环
  • 原文地址:https://www.cnblogs.com/liulei-LL/p/7866383.html
Copyright © 2011-2022 走看看