基于MyCat部署HaProxy实现高可用

在实际项目中, Mycat 服务也需要考虑高可用性,如果 Mycat 所在服务器出现宕机,或 Mycat 服务故障,需要有备机提供服务,需要考虑 Mycat 集群。

一、高可用方案

可以使用 HAProxy+Keepalived配合两台MyCat搭起MyCat集群,实现高可用性。 HAProxy实现了MyCat多节点的集群高可用和负载均衡,而 HAProxy自身的高可用则可以通过Keepalived来实现.

架构图:

# IT明星不是梦 #MySQL高可用集群之基于MyCat部署HaProxy实现高可用_第1张图片

于上一个博客的环境部署(MySQL中间件之MyCat )

新添:

mycat02、haproxy01、haproxy02

主机 操作系统 IP地址
mysql01 Centos 7.3 192.168.1.1
mysql02(slave) Centos 7.3 192.168.1.8
mysql03 Centos 7.3 192.168.1.9
mycat Centos 7.3 192.168.1.3
mycat02 Centos 7.3 192.168.1.11
haproxy01(keepalived) Centos 7.3 192.168.1.4(VIP:192.168.1.100)
haproxy02(keepalived) Centos 7.3 192.168.1.5(VIP:192.168.1.100)

案例中关闭防火墙

启动两台mycat服务

[root@mycat mycat]# ./bin/mycat start
[root@mycat mycat2]# ./bin/mycat start

测试连接mycat(可以连接自己,并且可以连接到另一台mycat)

[root@mycat ~]# mysql -umycat -p123456 -P8066 -h 192.168.1.3
[root@mycat2 ~]# mysql -umycat -p123456 -P8066 -h 192.168.1.11
[root@mycat ~]# mysql -umycat -p123456 -P8066 -h 192.168.1.11
[root@mycat2 ~]# mysql -umycat -p123456 -P8066 -h 192.168.1.3

1、安装配置 HAProxy(haproxy01、haproxy02)

1)安装 HAProxy 准备好HAProxy安装包,传到/opt目录下 解压到/usr/local/src

[root@haproxy01 ~]# tar zxf haproxy-1.8.23.tar.gz -C /usr/local/src/

2)进入解压后的目录,查看内核版本, 进行编译

[root@haproxy01 ~]# cd /usr/local/src/haproxy-1.8.23/ 
[root@haproxy01 haproxy-1.8.23]# make TARGET=linux310 PREFIX=/usr/local/haproxy ARCH=x86_64

ARGET=linux310,内核版本,使用uname -r查看内核,如: 3.10.0-514.el7,此时该参数就为linux310;
ARCH=x86_64,系统位数;
PREFIX=/usr/local/haprpxy #/usr/local/haprpxy,为haprpxy安装路径。

3)编译完成后,进行安装

[root@haproxy01 haproxy-1.8.23]# make install PREFIX=/usr/local/haproxy

# IT明星不是梦 #MySQL高可用集群之基于MyCat部署HaProxy实现高可用
编辑配置文件(文件内容自己定义):

[root@haproxy01 haproxy-1.8.23]# vim /usr/local/haproxy/haproxy.conf
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/local/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 :48066
                mode tcp
                balance roundrobin
                server mycat_1 192.168.1.3:8066 check inter 10s  //mycat服务器IP地址
                server mycat_2 192.168.1.11:8066 check inter 10s  //mycat服务器IP地址
frontend admin_stats
        bind :7777
                mode http
                stats enable
                option httplog
                maxconn 10
                stats refresh 30s
                stats uri /admin   //访问web用户名
                stats auth admin:123123      //定义密码
                stats hide-version
                stats admin if TRUE

4)验证启动HAProxy

[root@haproxy01 haproxy-1.8.23]#  /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.conf

查看HAProxy进程

[root@haproxy01 haproxy-1.8.23]# ps -ef|grep haproxy

# IT明星不是梦 #MySQL高可用集群之基于MyCat部署HaProxy实现高可用
打开浏览器访问 http://192.168.1.4:7777/admin、http://192.168.1.5:7777/admin
在弹出框输入用户名: admin密码: 123123
访问第一台:

# IT明星不是梦 #MySQL高可用集群之基于MyCat部署HaProxy实现高可用_第2张图片
# IT明星不是梦 #MySQL高可用集群之基于MyCat部署HaProxy实现高可用_第3张图片
访问第二台:
# IT明星不是梦 #MySQL高可用集群之基于MyCat部署HaProxy实现高可用_第4张图片
# IT明星不是梦 #MySQL高可用集群之基于MyCat部署HaProxy实现高可用_第5张图片

验证负载均衡,通过HAProxy访问Mycat

[root@mysql03 ~]# scp /usr/local/mysql/bin/mysql 192.168.1.4:/usr/local/sbin/
[root@mysql03 ~]# scp /usr/local/mysql/bin/mysql 192.168.1.5:/usr/local/sbin/

[root@haproxy01 haproxy-1.8.23]# mysql -umycat -p123456 -h 192.168.1.4 -P 48066
[root@haproxy01 haproxy-1.8.23]# mysql -umycat -p123456 -h 192.168.1.5 -P 48066

# IT明星不是梦 #MySQL高可用集群之基于MyCat部署HaProxy实现高可用_第6张图片

2、安装配置keepalived(两台haproxy)

1)安装 Keepalived 准备好Keepalived安装包,传到/opt目录下 解压到/usr/local/src

[root@haproxy01 ~]# tar zxf keepalived-2.0.20.tar.gz -C /usr/local/src/

安装依赖插件

[root@haproxy01 ~]# yum -y install gcc openssl-devel popt-devel

进入解压后的目录, 进行配置, 进行编译

[root@haproxy01 ~]# cd /usr/local/src/keepalived-2.0.20/
[root@haproxy01 keepalived-2.0.20]# ./configure --prefix=/usr/local/keepalived

完成后进行安装

[root@haproxy01 keepalived-2.0.20]# make && make install

运行前配置

[root@haproxy01 keepalived-2.0.20]#  cp /usr/local/src/keepalived-2.0.20/keepalived/etc/init.d/keepalived /etc/init.d/
[root@haproxy01 keepalived-2.0.20]# mkdir /etc/keepalived
[root@haproxy01 keepalived-2.0.20]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/[root@haproxy01 keepalived-2.0.20]# cp /usr/local/src/keepalived-2.0.20/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@haproxy01 keepalived-2.0.20]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

修改配置文件

[root@haproxy01 keepalived-2.0.20]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived   //注释

global_defs {
   router_id LVS_DEVEL      //keepalived服务器的一个标识
}

vrrp_instance VI_1 {
    state MASTER     //指定keepalived的角色, 两台配置此处均是BACKUP,设为BACKUP将根据优先级决定主或从
    interface ens33     //指定HA监测网络的接口
    virtual_router_id 51   //虚拟路由标识,这个标识是一个数字(取值在0-255之间,用来区分多个instance的VRRP组播),同一个vrrp实例使用唯一的标识,确保和master2相同,同网内不同集群此项必须不同,否则发生冲突。
    priority 100   //用来选举master的,要成为master,该项取值范围是1-255(在此范围之外会被识别成默认值100),此处master2上设置为50
    advert_int 1    //发VRRP包的时间间隔,即多久进行一次master选举(可以认为是健康查检时间间隔)
    authentication {     //认证区域,认证类型有PASS和HA(IPSEC),推荐使用PASS(密码只识别前8位)
        auth_type PASS
        auth_pass 1111
    }   
    virtual_ipaddress {      //VIP区域,指定vip地址
        192.168.1.100 
    }   
}   

virtual_server 192.168.1.100 48066 {    //设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开
    delay_loop 6     //设置运行情况检查时间,单位是秒
    lb_algo rr          //设置后端调度算法,这里设置为rr,即轮询算法
    lb_kind NAT      //设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选
    persistence_timeout 50    //会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的session共享提供了一个很好的解决方案。有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话的保持时间。
    protocol TCP    //指定转发协议类型,有TCP和UDP两种

    real_server 192.168.1.4 48066 {    //配置服务节点1,需要指定real server的真实IP地址和端口,IP与端口之间用空格隔开
        weight 1     //配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小为了区分不同性能的服务器
        TCP_CHECK {
            connect_timeout 3    //连接超时时间
            retry 3    //重连次数
            delay_before_retry 3   //重连间隔时间
        }   
    }   
    real_server 192.168.1.5 48066 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
}

拷贝到第二台haproxy

[root@haproxy01 keepalived-2.0.20]# scp /etc/keepalived/keepalived.conf 192.168.1.5:/etc/keepalived/keepalived.conf

做一些简单修改

[root@haproxy02 keepalived-2.0.20]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL
}

vrrp_instance VI_2 {   //改
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 50     //降低
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.100
    }
}

virtual_server 192.168.1.100 48066 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.1.4 48066 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.1.5 48066 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }   
    }   
}   

2)启动验证

[root@haproxy01 keepalived-2.0.20]# service keepalived start
Starting keepalived (via systemctl):                       [  OK  ]
[root@haproxy01 keepalived-2.0.20]# ip a

# IT明星不是梦 #MySQL高可用集群之基于MyCat部署HaProxy实现高可用_第7张图片
开启第二台的服务

[root@localhost keepalived-2.0.20]# service keepalived start
Starting keepalived (via systemctl):                       [  OK  ]

登录验证(访问VIP地址)

[root@haproxy01 keepalived-2.0.20]# mysql -umycat -p123456 -h192.168.1.100 -P 48066

# IT明星不是梦 #MySQL高可用集群之基于MyCat部署HaProxy实现高可用_第8张图片

模拟第一台mycat宕机:

[root@mycat ~]# ./mycat/bin/mycat stop

# IT明星不是梦 #MySQL高可用集群之基于MyCat部署HaProxy实现高可用_第9张图片

继续通过haproxy(VIP)访问:

[root@haproxy01 keepalived-2.0.20]# mysql -umycat -p123456 -h 192.168.1.100 -P 48066

# IT明星不是梦 #MySQL高可用集群之基于MyCat部署HaProxy实现高可用_第10张图片
依然可以访问到

模拟第一台haproxy宕机
断开网卡连接

可以看到VIP跳到了第二台服务器

[root@localhost keepalived-2.0.20]# ip a

# IT明星不是梦 #MySQL高可用集群之基于MyCat部署HaProxy实现高可用_第11张图片

继续通过haproxy(VIP)访问:

[root@localhost keepalived-2.0.20]# mysql -umycat -p123456 -h 192.168.1.5 -P 48066

# IT明星不是梦 #MySQL高可用集群之基于MyCat部署HaProxy实现高可用_第12张图片
依然能够访问到服务

[root@mycat ~]# ./mycat/bin/mycat start     //将第一台mycat启动

# IT明星不是梦 #MySQL高可用集群之基于MyCat部署HaProxy实现高可用_第13张图片

高可用已经部署完成

二、MyCat 安全设置

1、权限配置

1)user 标签权限控制目前 Mycat 对于中间件的连接控制并没有做太复杂的控制,目前只做了中间件逻辑级别的读写权限控制。是通过server.xml的user标签进行配置。

#server.xml配置文件user部分
# IT明星不是梦 #MySQL高可用集群之基于MyCat部署HaProxy实现高可用_第14张图片

2)privileges 标签权限控制 在 user 标签下的 privileges 标签可以对逻辑库(schema)、表(table)进行精细化的DML权限控制。privileges 标签下的check属性,如为 true 开启权限检查,为false不开启,默认为 false。由于Mycat一个用户的 schemas 属性可配置多个逻辑库(schema),所以 privileges 的下级节点schema节点同样可配置多个,对多库多表进行细粒度的 DML 权限控制.

#server.xml配置文件privileges部分
#配置orders表没有增删改查权限
# IT明星不是梦 #MySQL高可用集群之基于MyCat部署HaProxy实现高可用_第15张图片

配置说明:

DML权限 增加(insert) 更新(update) 查询(select) 删除(select)
0000 禁止 禁止 禁止 禁止
0010 禁止 禁止 可以 禁止
1110 可以 可以 可以 禁止
1111 可以 可以 可以 可以

2、SQL 拦截

firewall 标签用来定义防火墙:
firewall下whitehost标签用来定义IP白名单, blacklist用来定义SQL 黑名单。

1)白名单 可以通过设置白名单, 实现某主机某用户可以访问 Mycat,而其他主机用户禁止访问。

设置白名单
#server.xml配置文件firewall标签
#配置只有192.168.1.4主机可以通过mycat用户访问
         
           
              
           
        

2)黑名单可以通过设置黑名单,实现Mycat对具体SQL操作的拦截,如增删改查等操作的拦截。

设置黑名单
#server.xml配置文件firewall标签
#配置禁止mycat用户进行删除操作
         
           
              
           
       
       false
       
        

可以设置的黑名单 SQL 拦截功能列表

配置项 缺省值 描述
selectAllow true 是否允许执行SELECT语句
deleteAllow true 是否允许执行DELETE语句
updateAllow true 是否允许执行UPDATE语句
insertAllow true 是否允许执行INSERT语句
createTableAllow true 是否允许创建表
setAllow true 是否允许使用SET语法
alterTableAllow true 是否允许执行Alter table语句
dropTableAllow true 是否允许修改表
commitAllow true 是否允许执行commit操作
rollbackAllow true 是否允许执行roll back操作