zoukankan      html  css  js  c++  java
  • LVS+Keepalived搭建MyCAT高可用负载均衡集群

    LVS+Keepalived 介绍

    LVS

    LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR),十种调度算法(rrr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq)。

    Keepalvied

    Keepalived在这里主要用作RealServer的健康状态检查以及Master主机和BackUP主机之间failover的实现

    下面,搭建基于LVS+Keepalived的MyCAT高可用负载均衡集群,其中,LVS实现MyCAT的负载均衡,但是,简单的LVS不能监控后端节点是否健康,它只是基于具体的调度算法对后端服务节点进行访问。同时,单一的LVS又存在单点故障的风险。在这里,引进了Keepalived,可以实现以下几个功能:

    1. 检测后端节点是否健康。

    2. 实现LVS本身的高可用。

    配置环境:

    角色                                    主机IP                    主机名               操作系统版本     软件版本

    VIP                                    192.168.244.10

    LVS-DR-Master                   192.168.244.146    keepalived01     CentOS7.1        Keepalived v1.2.13,LVS 1.2.1

    LVS-DR-Backup                  192.168.244.147    keepalived02     CentOS7.1        Keepalived v1.2.13,LVS 1.2.1

    mycat-Realserver                192.168.244.148    mycat01            CentOS7.1       mycat v1.5 

    mycat-Realserver                192.168.244.149    mycat02            CentOS7.1       mycat v1.5 

    一、安装keepalived和ipvsadm

          注意:ipvsadm并不是lvs,它只是lvs的配置工具,因lvs在3.10(CentOS7.1的内核版本)的内核中是默认支持的。所以在这里就不需要重新安装。

          为了方便起见,在这里我们使用yum的安装方式

          分别在keepalived01和keepalived02两台主机上安装keepalived和ipvsadm

          # yum install -y keepalived ipvsadm

          除了这种简易方式外,也可直接编译官方的源码包。

          LVS:http://www.linuxvirtualserver.org/software/index.html

          Keepalived:http://www.keepalived.org/download.html

          安装步骤可参考:http://www.cnblogs.com/mchina/archive/2012/05/23/2514728.html

    二、配置Keepalived

         keepalived01,即LVS-DR-Master上,其配置如下:

         [root@keepalived01 ~]# vim /etc/keepalived/keepalived.conf

    ! Configuration File for keepalived
    
    global_defs {
       notification_email {
         acassen@firewall.loc     #设置报警邮件地址,可以设置多个,每行一个。
         failover@firewall.loc    #需开启本机的sendmail服务
         sysadmin@firewall.loc
       }
       notification_email_from Alexandre.Cassen@firewall.loc  #设置邮件的发送地址
       smtp_server 127.0.0.1      #设置smtp server地址
       smtp_connect_timeout 30    #设置连接smtp server的超时时间
       router_id LVS_DEVEL        #表示运行keepalived服务器的一个标识。发邮件时显示在邮件主题的信息
    }
    
    vrrp_instance VI_1 {
        state MASTER              #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器
        interface eno16777736     #指定HA监测网络的接口
        virtual_router_id 51      #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的
        priority 100              #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级
        advert_int 1              #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
        authentication {          #设置验证类型和密码
            auth_type PASS        #设置验证类型,主要有PASS和AH两种
            auth_pass 1111        #设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
        }
        virtual_ipaddress {       #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
            192.168.244.10 
        }
    }
    
    virtual_server 192.168.244.10 8066 {  #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开
        delay_loop 6              #设置运行情况检查时间,单位是秒
        lb_algo rr                #设置负载调度算法,这里设置为rr,即轮询算法
        lb_kind DR                #设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选
        nat_mask 255.255.255.0 
        persistence_timeout 50    #会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的session共享提供了一个很好的解决方案。
                                  #有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话的保持时间。
                                  #需要注意的是,这个会话保持时间是最大无响应超时时间,也就是说,用户在操作动态页面时,如果50秒内没有执行任何操作
                                  #那么接下来的操作会被分发到另外的节点,但是如果用户一直在操作动态页面,则不受50秒的时间限制
        protocol TCP              #指定转发协议类型,有TCP和UDP两种
    
        real_server 192.168.244.148 8066 { #配置服务节点1,需要指定real server的真实IP地址和端口,IP与端口之间用空格隔开
            weight 1              #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器
                                  #分配不同的负载,可以为性能高的服务器设置较高的权值,而为性能较低的服务器设置相对较低的权值,这样才能合理地利用和分配系统资源
            TCP_CHECK {           #realserver的状态检测设置部分,单位是秒
                connect_timeout 3    #表示3秒无响应超时
                nb_get_retry 3       #表示重试次数
                delay_before_retry 3 #表示重试间隔
                connect_port 8066
            } 
        }
        real_server 192.168.244.149 8066 {
            weight 1
            TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
                connect_port 8066
            }
        }
    }

          将该文件scp到keepalived02上,修改如下:

    ! 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 127.0.0.1
       smtp_connect_timeout 30
       router_id LVS_DEVEL
    }
    
    vrrp_instance VI_1 {
        state BACKUP   #将state从MASTER改为BACKUP
        interface eno16777736
        virtual_router_id 51
        priority 99  #修改优先级
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.244.10
        }
    }
    
    virtual_server 192.168.244.10 8066 {
        delay_loop 6
        lb_algo rr
        lb_kind DR
        nat_mask 255.255.255.0
        persistence_timeout 50
        protocol TCP
    
        real_server 192.168.244.148 8066 {
            weight 1
            TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
                connect_port 8066
            }
        }
        real_server 192.168.244.149 8066 {
            weight 1
            TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
                connect_port 8066
            }
        }
    }

    在上面这两个配置文件中,有一个地方尤其需要注意,即interface,网上的相关部署文档都是eth0,在CentOS7之前,网络接口的确都是eth0,但在CentOS7中,该接口为eno16777736。所以需要根据生产实际情况进行相应的修改。

    三、安装,配置,启动MyCAT

         分别在mycat01和mycat02两台主机上部署MyCAT,具体可参考:

         http://www.cnblogs.com/ivictor/p/5111495.html

         注意:为了便于观察后续MyCAT负载均衡的效果,MyCAT的配置文件并没有进行修改,均是指向本地的MySQL实例。

    四、在MyCAT服务器上为lo:0绑定VIP地址、抑制ARP广播

          分别在mycat01和mycat02两台主机上执行以下脚本。

          [root@mycat01 ~]# cat realserver.sh

    #!/bin/bash
    #description: Config realserver
    
    VIP=192.168.244.10
     
    /etc/rc.d/init.d/functions
     
    case "$1" in
    start)
           /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
           /sbin/route add -host $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)
           /sbin/ifconfig lo:0 down
           /sbin/route del $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

          [root@mycat01 ~]# sh realserver.sh start

          [root@mycat02 ~]# sh realserver.sh start

          执行ip addr查看VIP是否绑定成功

         

    五、分别在keepalived01和keepalived02上启动Keepalived服务

          [root@keepalived01 keepalived]# service keepalived start

          [root@keepalived02 keepalived]# service keepalived start

          通过ipvsadm -L命令查看VIP是否能成功映射到后端mycat服务。如果失败了,可通过/var/log/messages日志定位keepalived启动失败的原因。      

    [root@keepalived01 ~]# ipvsadm -L
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.168.244.10:8066 rr persistent 50
      -> 192.168.244.148:8066         Route   1      0          0         
      -> 192.168.244.149:8066         Route   1      0          0
    [root@keepalived02 keepalived]# ipvsadm -L
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.168.244.10:8066 rr persistent 50
      -> 192.168.244.148:8066         Route   1      0          0         
      -> 192.168.244.149:8066         Route   1      0          0

    从输出的结果来看,VIP已成功映射到后端mycat服务,下面,具体测试一下

    六、测试MyCAT高可用负载均衡集群的可用性。

         测试MyCAT集群的负载均衡

         通过mysql -h192.168.244.10 -P8066 -utest -ptest -DTESTDB  -e 'select @@hostname'命令来判断当前访问的是哪个mycat节点。

         但是很奇怪的时,连续执行三次,每次都是访问mycat02节点。  

    [root@mysql-server1 ~]# mysql -h192.168.244.10 -P8066 -utest -ptest -DTESTDB  -e 'select @@hostname'
    Warning: Using a password on the command line interface can be insecure.
    +------------+
    | @@hostname |
    +------------+
    | mycat02    |
    +------------+
    [root@mysql-server1 ~]# mysql -h192.168.244.10 -P8066 -utest -ptest -DTESTDB  -e 'select @@hostname'
    Warning: Using a password on the command line interface can be insecure.
    +------------+
    | @@hostname |
    +------------+
    | mycat02    |
    +------------+
    [root@mysql-server1 ~]# mysql -h192.168.244.10 -P8066 -utest -ptest -DTESTDB  -e 'select @@hostname'
    Warning: Using a password on the command line interface can be insecure.
    +------------+
    | @@hostname |
    +------------+
    | mycat02    |
    +------------+

       通过ipvsadm -L命令查看这三个连接确实都被转发到mycat02上了。

    [root@keepalived01 ~]# ipvsadm -L
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.168.244.10:8066 rr persistent 50
      -> 192.168.244.148:8066         Route   1      0          0         
      -> 192.168.244.149:8066         Route   1      0          3 

       原来,这个与配置文件中的persistence_timeout有关,指的是在一定的时间内来自同一IP的连接将会被转发到同一realserver中。而不是严格意义上的轮询。默认为50s,具体的失效时间还是比较复杂,可参考:lvs持久性工作原理和配置

       在这里,为了观察到明显的轮询效果。将该值设为0。重启keepalived服务。

       重新测试,结果如下

    [root@mysql-server1 ~]#  mysql -h192.168.244.10 -P8066 -utest -ptest -DTESTDB  -e 'select @@hostname'
    Warning: Using a password on the command line interface can be insecure.
    +------------+
    | @@hostname |
    +------------+
    | mycat02    |
    +------------+
    [root@mysql-server1 ~]#  mysql -h192.168.244.10 -P8066 -utest -ptest -DTESTDB  -e 'select @@hostname'
    Warning: Using a password on the command line interface can be insecure.
    +------------+
    | @@hostname |
    +------------+
    | mycat01    |
    +------------+
    [root@mysql-server1 ~]#  mysql -h192.168.244.10 -P8066 -utest -ptest -DTESTDB  -e 'select @@hostname'
    Warning: Using a password on the command line interface can be insecure.
    +------------+
    | @@hostname |
    +------------+
    | mycat02    |
    +------------+
    [root@mysql-server1 ~]#  mysql -h192.168.244.10 -P8066 -utest -ptest -DTESTDB  -e 'select @@hostname'
    Warning: Using a password on the command line interface can be insecure.
    +------------+
    | @@hostname |
    +------------+
    | mycat01    |
    +------------+

      实现了严格意义上的轮询,ipvsadm -L的输出结果如下:

    [root@keepalived01 ~]# ipvsadm -L
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.168.244.10:8066 rr
      -> 192.168.244.148:8066         Route   1      0          2         
      -> 192.168.244.149:8066         Route   1      0          2 

      每个节点对应2个连接,与上述通过mysql客户端得到的结果相符。

      测试LVS的高可用

      手动断开LVS-DR-Master节点的Keepalived服务

    [root@keepalived01 ~]# service keepalived stop
    Redirecting to /bin/systemctl stop  keepalived.service
    [root@keepalived01 ~]# ipvsadm -L
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

     可以发现,mysql客户端依旧可以通过mycat连接到mysql服务端

    [root@mysql-server1 ~]#  mysql -h192.168.244.10 -P8066 -utest -ptest -DTESTDB  -e 'select @@hostname'
    Warning: Using a password on the command line interface can be insecure.
    +------------+
    | @@hostname |
    +------------+
    | mycat02    |
    +------------+

      重启LVS-DR-Master节点的Keepalived服务后,不难检测出keepalived01又重新作为了Master节点(因为BACKUP节点的persistence_timeout没有修改,所以可根据轮询的特点来判断哪个节点是master节点)。

      测试Keepalived对于MyCAT服务的监控检测

      手动关闭mycat01节点的mycat服务

    [root@mycat01 ~]# cd /usr/local/mycat/
    [root@mycat01 mycat]# bin/mycat stop
    Stopping Mycat-server...
    Stopped Mycat-server.

     通过LVS-DR-Master节点节点上的ipvsadm -L可以看出VIP的映射关系中已剔除了mycat01节点。

    [root@keepalived01 ~]# ipvsadm -L
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  192.168.244.10:8066 rr
      -> 192.168.244.149:8066         Route   1      0          0 

    至此,基于LVS+Keepalived的MyCAT集群搭建完毕。

    在整个搭建过程中,有以下几点需要注意:

    1. VIP的端口,必须和后端服务的端口是对应的,我在测试的过程中,将VIP的端口改为7066,结果无法连接上mycat。

    [root@mysql-server1 ~]#  mysql -h192.168.244.10 -P7066 -utest -ptest -DTESTDB
    Warning: Using a password on the command line interface can be insecure.
    ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.244.10' (111)
    [root@mysql-server1 ~]#  mysql -h192.168.244.10 -P8066 -utest -ptest -DTESTDB
    Warning: Using a password on the command line interface can be insecure.
    ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.244.10' (111

    2. LVS和后端的realserver还是要物理上分开,刚开始是放到一个机器上测试,但无法得到预期的效果。

    3. interface eno16777736这里是个坑,刚开始写的是eth0,结果,ping都ping不通,所以还是要与网卡的实际名称相对应。

    4. Keepalived还是蛮强大的,即便不使用LVS,也可基于它做高可用集群。譬如,常见的MySQL的双主高可用集群。

    5. 关于是否要启动Linux内核中的路由转发功能,经测试,无论是LVS还是后端MyCAT服务节点,均可不启动。

  • 相关阅读:
    使用NBU进行oracle异机恢复
    mycat偶尔会出现JVM报错double free or corruption并崩溃退出
    exp导出数据时丢表
    service_names配置不正确,导致dg创建失败
    XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax
    HTTP协议简介详解 HTTP协议发展 原理 请求方法 响应状态码 请求头 请求首部 java模拟浏览器客户端服务端
    java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类
    【JAVA集合框架一 】java集合框架官方介绍 Collections Framework Overview 集合框架总览 翻译 javase8 集合官方文档中文版
    java内部类深入详解 内部类的分类 特点 定义方式 使用
    再谈包访问权限 子类为何不能使用父类protected方法
  • 原文地址:https://www.cnblogs.com/ivictor/p/5261445.html
Copyright © 2011-2022 走看看