zoukankan      html  css  js  c++  java
  • linux keepalived+LVS 实现mysql 从库负载均衡

    前情提要:

    参考链接:

    http://www.osyunwei.com/archives/7464.html

    ps:以上为本次操作的主要参考资料,非常感谢此文作者的贡献,我的随笔的主要目的是

    说明在使用以上资料参考部署的过程中,遇到的一些问题以及补充。

    目的:

      1、解决web读写分离功能缺陷,实现数据库从库负载均衡与高可用

      2、简化web与主要功能模块的配置,使用vip接管

    实验环境:

      操作系统:redhat6.4 64位   #目前主流的版本应该在6.4以上,主要是硬件要求

           DB版本:mysql5.6           #这个没什么可说的,选择版本主要看应用需求

           lvs主机:192.168.1.180   #部署lvs+keepalived,用于管理VIP,并分发数据库读写请求

         从库IP:192.168.20.182、192.168.20.183   #mysql_slave 一主两从

            测试机:192.168.20.181   #用于测试整套架构的功能

                VIP:192.168.20.253   #虚拟IP,用于请求的分发

    一、环境安装配置  

    数据库mysql5.6安装(20.182、20.183

    rpm -ivh

    MySQL-server-5.6.16-1.el6.x86_64.rpm

    MySQL-devel-5.6.16-1.el6.x86_64.rpm

    MySQL-shared-5.6.16-1.el6.x86_64.rpm

    MySQL-client-5.6.16-1.el6.x86_64.rpm

    MySQL-shared-compat-5.6.16-1.el6.x86_64.rpm

    mysql5.6的安全性有所提高,安装完成后会有如下提示:

    You will find that password in '/root/.mysql_secret'

    cat /root/.mysql_secret

    # The random password set for the root user at Mon Aug 31 08:28:44 2015 (local time): 06tIwUud

    通过密码进入mysql之后:通过:SET PASSWORD = password('xxxxxx'); 重置密码即可。 其他跟正常的mysql安装相同。

    数据库主从搭建(

      恩......不是我偷懒,主要是网上这块的内容太多了,一抓一大把,没有什么可写的价值,之后如果有兴趣可能单开一个随笔,这就不写了。

          大家随意的搜一下。

    网络环境配置(所有机器)

      由于我的生产环境有单独的思科防火墙,所以我所有的服务器的系统防火墙都是关闭的,包括selinux,不然太麻烦。

    有些莫名其妙的报错可能都是iptable和selinux引起的,为了方便一般默认关闭

    1、关闭selinux:

       修改/etc/selinux/config文件中的SELINUX="" 为 disabled ,然后重启。
       如果不想重启系统,使用命令setenforce 0

    2、关闭iptables:

      service iptables stop
      chkconfig iptables off
     

    二、LVS+keepalive主机搭建(192.168.1.180)

    为了简化步骤,这里不做管理机器的高可用配置,
     

     1、安装LVS

    yum install ipvsadm  #当前版本的linux内核已经集成lvs,此为管理模块
    modprobe ip_vs  #加载模块
    执行ipvsadm 测试是否安装成功
     

    2、安装keepalived

    yum install  gcc gcc-c++ make openssl-devel kernel-devel ncurses-devel

    下载keeplived:http://www.keepalived.org/download.html

    cd /usr/local/src

    wget http://www.keepalived.org/software/keepalived-1.2.19.tar.gz

    ps:由于安装时间的不同,我新的生产环境是centos6.5  而测试环境是redhat6.4,并且我的生产之前一直都是redhat系列,一直使用的都是手动rpm以及编译安装,虽然很苦逼,但是着实锻炼动手能力以及一些说不清道不明的对系统的理解能力,并且yum本身并不是非常的安全,没有手动安装那么放心(俺的感受),我的建议是如果非用不可的话,安装可以用yum,但是卸载需要手动,这是我的底线。

    tar -zxvf keepalived-1.2.19.tar.gz

    cd keepalived-1.2.19

    ./configure  #配置,必须看到以下提示,说明配置正确,才能继续安装

    Use IPVS Framework : Yes

    IPVS sync daemon support : Yes

    Use VRRP Framework       : Yes

    make #编辑

    make install  #安装

    cp /usr/local/etc/sysconfig/keepalived  /etc/sysconfig/

    mkdir /etc/keepalived

    cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/

    cp /usr/local/sbin/keepalived /usr/sbin/

    cp /usr/local/etc/rc.d/init.d/keepalived  /etc/rc.d/init.d/

    chmod +x /etc/rc.d/init.d/keepalived  #添加执行权限

    chkconfig keepalived on  #设置开机启动

    service keepalived start #启动

    service keepalived stop  #关闭

    service keepalived restart  #重启

     ps:以上直接辅助的原作者的命令,主要是没什么可写的,按照命令操作即可。

     ps2:参考资料在这会安装perl的相关环境,因为他的从库状态监测脚本需要用到,但是我并没有在这添加,主要考虑到如下的情况

      1、我有单独的数据库从库状态监测告警脚本(见上两篇原创随笔)

          2、keeplived本身有对3306端口的检测,如果数据库出现异常可以发现并处理。

          3、我希望即便从库同步出现问题,也能够继续提供服务,因为线上环境需要的是服务畅通,短暂不同步的代价我是能够接受的。

    3、配置keepalived

    cp /etc/keepalived/keepalived.conf  /etc/keepalived/keepalived.conf-bak

    >/etc/keepalived/keepalived.conf   #清空配置文件

    vi /etc/keepalived/keepalived.conf  #以下内容直接全部粘贴即可

    ======================================
    ! Configuration File for keepalived
     
    global_defs {
            router_id LVS_DEVEL
    }
     
    vrrp_instance VI_1 {
     
            state MASTER
            interface eth0
            virtual_router_id 51
            priority 100
            advert_int 1
            authentication {
            auth_type PASS
            auth_pass 1111
            }
     
            virtual_ipaddress {
                    192.168.20.253
            }
    }
     
    virtual_server 192.168.20.253 3306 {
     
                    delay_loop 6
                    lb_algo wlc
                    lb_kind DR
                    #persistence_timeout 120
                    protocol TCP
     
            real_server 192.168.20.182 3306 {
     
                    weight 1
                    TCP_CHECK {
                            connect_timeout 3 
                            nb_get_retry 3 
                            delay_before_retry 3 
                            connect_port 3306
                    }
            }
     
            real_server 192.168.20.183 3306 {
     
                    weight 1
                    TCP_CHECK {
                            connect_timeout 3
                            nb_get_retry 3
                            delay_before_retry 3
                            connect_port 3306
            }
    }
    }
    ==============================================
    #wp    #保存退出
    注:最好在使用以上内容前,复制到编辑器,检查括号是否齐全与匹配,这很重要。
     

    三、数据库从库配置(192.168.20.182、183)

    1、绑定LVS虚拟服务器(VIP):192.168.20.253到lo:0

     #编辑增加如下代码:

    vi  /etc/rc.d/init.d/realserver
    ==================================================
    #!/bin/sh
    # chkconfig: - 80 90
    # description:realserver
    # mysql_vip start realserver
    mysql_vip=192.168.20.253 
    . /etc/rc.d/init.d/functions
    case "$1" in
    start)
    ifconfig lo:0 $mysql_vip netmask 255.255.255.255 broadcast $mysql_vip
    /sbin/route add -host $mysql_vip dev lo:0
    echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
    sysctl -p >/dev/null 2>&1
    echo "RealServer Start OK"
    ;;
    stop)
    ifconfig lo:0 down
    route del $mysql_vip >/dev/null 2>&1
    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
    echo "RealServer Stoped"
    ;;
    *)
    echo "Usage: $0 {start|stop}"
    exit 1
    esac
    exit 0
    ==========================================================

    chmod +x /etc/rc.d/init.d/realserver  #添加脚本执行权限

    chkconfig realserver on                    #添加开机启动

    /etc/rc.d/init.d/realserver start         #开启,参数stop为关闭

     2、配置允许ARP转发

     
    vi /etc/sysctl.conf
    ============================
    net.ipv4.ip_forward = 1   #修改原有配置
    # MYSQL-VIP-NewAdd    #此为新增配置
    net.ipv4.conf.lo.arp_ignore= 1
    net.ipv4.conf.lo.arp_announce= 2
    net.ipv4.conf.all.arp_ignore= 1
    net.ipv4.conf.all.arp_announce= 2
    ============================
    /sbin/sysctl -p  #使配置及时生效

    四、负载均衡功能测试

     1、LVS主机(20.180)执行:

    service keepalived start  #启动keepalived

    ipvsadm -Ln  #检查lvs运行状态

    2、数据库从库(20.182、20.183)

    /etc/rc.d/init.d/realserver start  

    VIP已经绑定到lo:0

    3、负载均衡功能测试

    20.182:执行service mysql stop

    在20.180(LVS主机)上执行

    ipvsadm -Ln  #检查lvs运行状态

    可以看到20.182服务器已经被去掉。同理再次启动之后此服务器会被再次加入服务。

    4、VIP数据库功能测试

    在测试服务器(1.181)上执行数据库连接命令

    mysql -uroot -pXXXXXX -h192.168.20.253

     或者使用telnet 192.168.20.253 3306 命令去尝试连接,如果提示输入密码,说明连接正常。

    FAQ:

      1、能够ping通,但是telnet不通,不知道是为什么?

            答:网上看到很多人,包括我自己,都遇到了这个问题,VIP能够ping通,但是telnet以及mysql连接命令不通,怎么着也找不到问题。

              这个问题困扰了我很长时间,中间试验停止了两个月,因为实在找不到原因,但是后来实在是啼笑皆非,原因竟然是:没有使用测试机,

              我所有的测试命令都是在LVS主机上执行的,而LVS主机上绑定了VIP,并且没有mysql服务,肯定能ping通,但是在没有转发请求的

              情况下,肯定服务不通。

      2、原资料中的一些命令的困扰?

        答:比如ipvsadm -L   在我的服务器上是不显示具体IP的,只显示localhost,一度让我以为服务不通跟这个有联系,但实际上执行ipvsadm -Ln就ok了。

      3、数据库从库状态检测脚本是否使用?

       答:我觉得这个应该根据具体的业务系统的需求去考虑,我的系统要求的是能够持续提供服务,对数据一致性的要求没有那么高,所以我只需要对同步状态进行

             告警,并保证能及时处理即可,并不需要停止服务这么严苛。另外脚本使用perl或者shell实际上应该没有什么不同。

    ok!整个方案就这样了,中间省略了一些步骤,比如数据库主从服务的搭建,LVS高可用的搭建,这两个服务我在很久之前就搭建了无数次,实在是懒得再写,并且这种单独的服务在网上已经有了无数个攻略,写的价值不是很大,大家各种研究下吧。

      另外水平有限,如果有所遗漏和错误请大家指出,我及时修改,如果有更完善的方案,大家能分享就更好了。

  • 相关阅读:
    Python3基础 try-except 几个异常采取同样的处理方法
    Python3基础 try-except else进行配合
    客户端(Winform窗体)上传文件到服务器(web窗体)简单例子
    运用Microsoft.DirectX.DirectSound和Microsoft.DirectX实现简单的录音功能
    Microsoft.DirectX.DirectSound.dll和Microsoft.DirectX.dll引用,导致项目无法调试问题
    asp.net.mvc 中form表单提交控制器的2种方法和控制器接收页面提交数据的4种方法
    系统中怎么删除右键新建菜单中多余的选项
    win10家庭版无法打开系统内置应用(录音机、日历等),如何解决“内置管理员无法打开此应用”的问题
    div中背景图片自动适应屏幕高度无效原因和例子
    asp.net.web如何简单生成和保存二维码图片的例子
  • 原文地址:https://www.cnblogs.com/liujian001/p/5082867.html
Copyright © 2011-2022 走看看