基于HA机制的Mycat高可用

环境

  • 操作系统:CentOS 7
  • Mycat版本:Mycat1.6.7.6
  • HAproxy版本:1.5.18
  • Keepalived版本:1.4.2

准备

高可用方案

在实际项目中,Mycat服务也需要考虑高可用性,如果Mycat所在服务器出现宕机,或Mycat服务故障,需要有备机提供服务,需要考虑Mycat集群,可以使用 HAProxy + Keepalived 配合两台+Mycat搭起Mycat集群实现高可用性。HAProxy实现了MyCat多节点的集群高可用和负载均衡,而HAProxy自身的高可用则可以通过Keepalived来实现


HAproxy配置

global
         log 127.0.0.1 local0
         #log 127.0.0.1 local1 notice
         #log loghost local0 info
         maxconn 4096
         chroot /usr/local/haproxy
         pidfile /usr/data/haproxy/haproxy.pid
         uid 99
         gid 99
         daemon
         #debug
         #quiet
defaults
         log global
         mode tcp
         option abortonclose
         option redispatch
         retries 3
         maxconn 2000
         timeout connect 5000
         timeout client 50000
         timeout server 50000
listen proxy_status 
     bind :8081
         mode tcp
         balance roundrobin
         server mycat_12 192.168.100.11:8066 check inter 10s
         server mycat_12 192.168.100.12:8066 check inter 10s
frontend admin_stats 
     bind :8082
         mode http
         stats enable
         option httplog
         maxconn 10
         stats refresh 30s
         stats uri /admin
         stats auth admin:123456
         stats hide-version
         stats admin if TRUE

配置完HAproxy,可以先验证一下负载均衡,把配置的Mycat服务都启动起来,我这里只配置了两台Mycat服务,根据实际需求可更改,启动Mycat,再启动HAproxy,以访问Mycat的形式访问,把端口号和IP改为HAproxy的,举例

mysql -umycat -p123456 -h192.168.100.13 -P8081

访问HAproxyWeb端页面地址:http://192.168.100.13:8082/admin 用户名:admin,密码:123456,界面截图略过
这里配置一台HAproxy之后,配置多台Mycat服务,到这里已经可以达到一定抗风险能力,此时就可以把原来操作Mycat服务链接改成HAproxy,让原来走Mycat服务操作数据库更改为通过HAproxy访问,此时流程应该是这样

经测试,手动模拟其中一台Mycat服务宕机,通过HAproxy依然能够访问数据

注意

如果以下Keepalived配置“IP漂移”不成功,只配置HAproxy也是可以的,网络上大多数配置Keepalived的“IP漂移”都是建立在虚拟机上,很少有文章讲在真实服务器上如何配置,至少作者是没遇到一个讲解在真实服务器如何配置,详情见下方Keepalived配置
注:如果需要继续配置使用Keepalived,两台HAproxy配置要保持一致

Keepalived配置

! Configuration File for keepalived
global_defs {
    notification_email {
        gitlab@111.com
    }
     notification_email_from gitlab@111.com
     smtp_server smtp.itze.cn
     smtp_connect_timeout 30
     router_id LVS_DEVEL
     vrrp_skip_check_adv_addr
     vrrp_garp_interval 0
     vrrp_gna_interval 0
}

vrrp_instance VI_1 {
     #主机配MASTER,备机配BACKUP
     state MASTER
     #所在机器网卡,通过:ifconfig 查看
     interface eth0
     virtual_router_id 51
     #数值越大优先级越高
     priority 100
     advert_int 1
     authentication {
         auth_type PASS
         auth_pass 1111
     }
     virtual_ipaddress {
         #虚拟IP
         192.168.100.20
     }
}
virtual_server 192.168.100.20 8081 {
     delay_loop 6
     lb_algo rr
     lb_kind NAT
     persistence_timeout 50
     protocol TCP
     real_server 192.168.100.13 8081 {
         weight 1
         TCP_CHECK {
             connect_timeout 3
             retry 3
             delay_before_retry 3
         }
    }
    real_server 192.168.100.14 8081 {
         weight 1
         TCP_CHECK {
             connect_timeout 3
             nb_get_retry 3
             delay_before_retry 3
         }
     }
}

按照在虚拟机上配置,这里配置完之后,启动Mycat,启动Haproxy,启动keepalived之后,就可以通过keepalived中配置的虚拟IP访问数据
举例,此时访问数据是如下

mysql -umycat -p123456 -h192.168.100.20 -P8081

关于虚拟IP

先说要实现的效果,一切顺利的话,到这里已经完成了文章开头插入的效果,应用服务通过虚拟IP访问数据,算了我还是上个图吧…

图解文字:MASTER主机没有挂掉之前,都是通过MASTER访问,只有MASTER宕机,IP才会飘移至BACKUP备机,此时我们的应用依旧是固定配置的虚拟IP,不需要改变

重点来了,在虚拟机上我们机器IP都是可以定的,如果是虚拟机做测试,虚拟IP要是和Keepalived中配置的服务在同一个网段,比如本文配置的是192.168.100.13和192.168.100.14,虚拟IP就需要配置192.168.100.xx ,但是在真实云服务器上怎么配置呢?比如使用的服务器是阿里云、腾讯、华为等等厂商的,大多是通过弹性公网IP绑定到云主机,通过固定的服务器IP来访问真实服务器

华为云服务器测试

起初没配置之前感觉这TM就是在扯淡,通过虚拟IP访问的通???怎么可能访问的通这不是把智商按在地上摩擦吗?
带着不可能的疑惑一顿操作,作者使用测试的是华为弹性云服务器,在真实服务器上做测试,keepalived配置中的虚拟IP不知道配置什么,只是知道要在同一网段,但是服务器买的时候弹性公网IP要挨着买?
于是就先ifconfig看一下网卡的地址,虚拟IP就随便设置了一个和网卡地址相同网段的IP,重启两台机器的Keepalived,访问测试,不通,两台机器更不用说通过虚拟IP通信了,最终经过摸索,能够在一台机器上通过虚拟IP访问数据,但是两台不能通信
一台真实服务器通过虚拟IP操作数据的情况配置
修改Keepalived配置中,虚拟IP和virtual_server后面的IP不要配置相同,但是要在一个网段,如下配置,仅能在安装Keepalived的这台本机通过虚拟IP访问数据,如果只能这样,Keepalived只起到了保护真实数据服务IP的作用,主备切换就没实现,倒还不如直接通过HAproxy访问数据

virtual_ipaddress {
         #虚拟IP
         192.168.100.20
     }

virtual_server 192.168.100.21 8081 {

最后经过探索查阅才知道,比如作者是华为云厂商的服务器,就需要到华为云控制台去手动申请一个虚拟IP地址,然后经过一系列操作才能达到以上在虚拟机中实现的能主备切换,达到高可用,最终因为缺少一个弹性公网IP没去实现真实服务器IP漂移,只能等到后续业务真正需要的时候再来实现,到时候再来更新

后记

如果想去捣鼓,这里奉上华为云申请虚拟IP的官方操作文档:虚拟私有云VPC
华为私有云VPC操作PDF版本下载:https://support.huaweicloud.com/usermanual-vpc/vpc-usermanual.pdf
建议查看PDF版本,PDF版本有实例更为详细,如果你真是服务器环境搞出来了,记得艾特我!至少给我发个邮件:satisfied:
:envelope:邮箱:gitlab@111.com 互相学习!