keepalived+mysql双主高可用配置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了keepalived+mysql双主高可用配置相关的知识,希望对你有一定的参考价值。

具体架构图如下

两个节点一主一从(从库上面也可以再挂一个从库),或者是双主,再利用keepalived在出现容灾时进行高可用切换。

技术分享

 

Keepalived原理说明:

     其实这个原理可以很简单的用一个故事说明。

     以前有一个帮派,像其他所有的帮派一样,有老大。这个老大活的也很憋屈,不仅自己做所有的活,还要隔一段时间就要告诉所有小弟我是老大,你们老实点。所有的小弟也是很乖的,只要老大不死,他们肯定不会抢夺老大的地位,但是一旦他们都收不到老大的通信的话,他们就确信老大死了,他们就开始抢夺老大的地位了。不过他们抢夺老大的地位也是有规则的,他们都发出通告,等级高的人才可以变成老大。又肩负起所有的任务,并且定时通告下面小弟,我是老大,都给我老实点。这个老大也是当得累啊,但是大家还是很喜欢当老大啊。

    这里有一篇讲解很详细的文档,地址为http://blog.chinaunix.net/uid-27003384-id-3870083.html

具体实现:

这里mysql的复制不再做阐述(主要是做双主),主要进行keepalived配置的讲解。

我的环境是:

           Centos6.7

           Mysql5.6.27

安装keepalived

     yum –y install keepalived。

配置keepalived

     Keepalived的配置文件是默认在/etc/keepalived/目录下

配置文件详情如下

Keepalived简单配置说明(很简单的配置)

vrrp_script vs_mysql_82 {

    script "/etc/keepalived/checkMySQL.py -h 192.168.11.82 -P 3306"  --检测是否需要切换的脚本

    interval  30 检测时间,30s

}

vrrp_instance VI_82 {

state BACKUP  状态(主要使用master,backup 两种)

    nopreempt  表示master死了以后活过来了,不会主动抢占当前master地位的

    interface eth0

    virtual_router_id 82 组名

    priority 100 等级

    advert_int 5

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    track_script {

       vs_mysql_82

    }

    virtual_ipaddress {

        192.168.11.100

    } 虚拟ip的设置

checkMySQL.py脚本解析

#!/usr/bin/python
#coding: utf-8#
import sys
import os
import getopt
import MySQLdb
import logging

dbhost=localhost‘   #主机地址
dbport=3306          #端口号
dbuser=monitor‘     #账号
dbpassword=m0n1tor‘ #密码

def checkMySQL():
    global dbhost
    global dbport
    global dbuser
    global dbpassword
    shortargs=h:P:
    opts, args=getopt.getopt(sys.argv[1:],shortargs)
    for opt, value in opts:
        if opt==-h:
            dbhost=value
        elif opt==-P:
            dbport=value
    #print "host : %s, port: %d, user: %s, password: %s" % (dbhost, int(dbport), dbuser, dbpassword)
    db = instanceMySQL(dbhost, dbport, dbuser, dbpassword)
    st = db.ishaveMySQL()#主要调用这个函数
    return st

class instanceMySQL:
    conn = None
    def __init__(self, host=None,port=None, user=None, passwd=None):
        self.dbhost= host
        self.dbport = int(port)
        self.dbuser = user
        self.dbpassword = passwd

    def ishaveMySQL(self):
        cmd="ps -ef | egrep -i \"mysqld\" | grep %s | egrep -iv \"mysqld_safe\" | grep -v grep | wc -l" % self.dbport #查看mysql进程是不是活着,这里需要注意的是,如果你用mysqld启动的数据库,需要对上面的命令进行修改。把egrep -iv \"mysqld_safe\"这个去掉
mysqldNum = os.popen(cmd).read() cmd ="netstat -tunlp | grep \":%s\" | wc -l" % self.dbport #检查mysql端口号是不是正常接收 mysqlPortNum= os.popen(cmd).read() #print mysqldNum, mysqlPortNum if ( int(mysqldNum) <= 0): print "error" return 1 if ( int(mysqldNum) > 0 and mysqlPortNum <= 0): return 1 return 0if __name__== "__main__": st=checkMySQL() sys.exit(st)

 

需要注意的问题:

      总结起来需要注意三个方面:

      1:复制延迟

         对于延迟的问题的话,可以从两个方面进行优化:

         1:硬件方面

            两台主机配置应该相差不大,一方面防止切换过来直接把一个干死,另一方面可以减少延迟。

         2:软件方面

            可以直接使用半同步(性能上会有很大损失)或者是直接上5.7(5.7有多线程复制),还有使用mariadb分支,该分支有一个多线程复制的特性。比5.6的官方mysql好很多,mysql5.6官方多线程复制是schema级别的。

      2:单边写在切换的时候需要注意的问题

         需要注意的问题

         1:防止脑裂(什么是脑裂?)

             两个节点都设置成keepalived配置文件都配置成backup状态,配置nopreempt。

           2:再延迟的情况下切换的话,可能会产生查不到信息或者是写重复的情况(比如自增长id可能会产生重复。可以通过设置auto_increment_incrementauto_increment_offset来防止

      3:keepalived探测的准则确定

         最简单的规则就是探测数据库实例是不是存在,用ps,还有数据库端口通不通。

         需要在具体业务环境下进行适当的添加。还需要添加延迟的探测,在进行决定是不是直接切换,或者是另作处理。

以上是关于keepalived+mysql双主高可用配置的主要内容,如果未能解决你的问题,请参考以下文章

配置MySQL实现主主互备模式并利用keepalived实现双主高可用

基于keepalived搭建mysql双主高可用

MySQL集群之keepalived实现mysql双主高可用

Keepalived+Nginx实现双主高可用负载均衡

Keepalived+MariaDB10配置双主高可用数据库

keepalived+MySQL主主高可用