环境

  • 操作系统: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 互相学习!