MyCat 1.6.7(二)高可用及权限
高可用
官方建议是采用基于硬件的负载均衡器或者软件方式的HAproxy,HAProxy相比LVS的使用要简单很多,功能方面也很丰富,免费开源,稳定性也是非常好,可以与LVS相媲美,根据官方文档,HAProxy可以跑满10Gbps-New benchmark of HAProxy at 10 Gbps using Myricom’s 10GbE NICs (Myri-10G PCI-Express),这个作为软件级负载均衡,也是比较惊人的,下图是HAproxy+Mycat集群+MySQL主从所组成的高可用性方案
如果还担心HAproxy的稳定性和单点问题,则可以用keepalived的VIP的浮动功能,加以强化
安装
- keepalived和haproxy必须装在同一台机器上(如172.17.210.210.83机器上,keepalived和haproxy都要安装),keepalived负责为该服务器抢占vip(虚拟ip),抢占到vip后,对该主机的访问可以通过原来的ip(172.17.210.210.83)访问,也可以直接通过vip(172.17.210.210.103)访问。
- 172.17.210.64上的keepalived也会去抢占vip,抢占vip时有优先级,配置keepalived.conf中的(priority 150 #数值愈大,优先级越高,172.17.210.64上改为120,master和slave上该值配置不同)决 定。但是一般哪台主机上的keepalived服务先启动就会抢占到vip,即使是slave,只要先启动也能抢到。
- haproxy负责将对vip的请求分发到mycat上。起到负载均衡的作用,同时haproxy也能检测到mycat是否存活,haproxy只会将请求转发到存活的mycat上。
- 如果一台服务器(keepalived+haproxy服务器)宕机,另外一台上的keepalived会立刻抢占vip并接管服务。
如果一台mycat服务器宕机,haporxy转发时不会转发到宕机的mycat上,所以mycat依然可用。
haproxy安装
# 下载解压并安装
wget http://haproxy.1wt.eu/download/1.5/src/haproxy-1.5.18.tar.gz
tar zxvf haproxy-1.5.18.tar.gz
cd haproxy-1.5.18
# 查看READ,里面有描述 TARGET版本,安装参数等
less README
# linux26=linux 2.6(内核),linux 2628=linux2.6.28,ARCH 代表架构
make TARGET=linux310 PREFIX=/usr/local/haproxy ARCH=x86_64
make install PREFIX=/usr/local/haproxy
# pid文件存放目录
mkdir -p /usr/data/haproxy/
vim /usr/local/haproxy/haproxy.conf
haproxy.conf
global
log 127.0.0.1 local3 #定义haproxy日志输出设置
log 127.0.0.1 local1 notice
#log loghost local0 info # 定义haproxy 日志级别
ulimit-n 82000 # 设置每个进程的可用的最大文件描述符
maxconn 20480 # 默认最大连接数
chroot /usr/local/haproxy # chroot运行路径
uid 99 # 运行haproxy 用户 UID
gid 99 # 运行haproxy 用户组gid
daemon # 以后台形式运行harpoxy
nbproc 1 # 设置进程数量
pidfile /usr/local/haproxy/haproxy.pid # haproxy 进程PID文件
#debug # haproxy调试级别,建议只在开启单进程的时候调试
#quiet
defaults
log global #引入global定义的日志格式
mode tcp #所处理的类别(7层代理http,4层代理tcp)
maxconn 50000 #最大连接数
option abortonclose # 当haproxy负载很高时,自动结束掉当前队列处理比较久的链接
option redispatch #当与上游服务器的会话失败(服务器故障或其他原因)时,
# 把会话重新分发到其他健康的服务器上,当原来故障的服务器恢复时,
# 会话又被定向到已恢复的服务器上。还可以用”retries”关键字来设定在判定会话失败时的尝试连接的次数。
retries 3 #3次连接失败就认为服务器不可用,也可以通过后面设置
timeout connect 10s #默认连接超时时间
timeout client 1m #默认客户端超时时间
timeout server 1m #默认服务器超时时间
balance roundrobin # 设置负载算法为:轮询算法rr
listen mycat_status # Frontend和Backend的组合体,监控组的名称,按需自定义名称
bind 0.0.0.0:48066 #监听端口
mode tcp # http的7层模式 tcp4层
balance roundrobin # 设置负载算法为:轮询算法rr
server mycat_1 IP1:8066 check inter 10s
server mycat_2 IP2:8066 check inter 10s
frontend admin_stats
bind 0.0.0.0:7777 #设置监听端口,即haproxy提供的web服务端口,和lvs的vip 类似
mode http #http 的7层模式
log 127.0.0.1 local3 err #错误日志记录
stats refresh 5s #每隔5秒自动刷新监控页面
stats uri /admin?stats #监控页面的url访问路径
stats realm itnihao\ welcome #监控页面的提示信息
stats auth admin:admin #监控页面的用户和密码admin,可以设置多个用户名
stats auth admin1:admin1 #监控页面的用户和密码admin1
stats hide-version #隐藏统计页面上的HAproxy版本信息
stats admin if TRUE #手工启用/禁用,后端服务器(haproxy-1.4.9以后版本)
启动
/usr/data/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.conf
验证负载均衡
mysql 0umycat -p123456 -h IP -P 48066
除了以上 haproxy 做 Mysql 的负载均衡,其实 Nginx 也可以做,Nginx1.9 以上支持 TCP 协议,需要装一个插件,具体的 Nginx 安装可以看 nginx-1.18.0 安装,至于 keepalived 大家可以参考 keepalived(一) 安装教程。对于 haproxy 和 Nginx 性能对比,大家可以看这篇博客 https://zhuanlan.zhihu.com/p/41354937。
keepalived 的配置
# 全局配置
global_defs {
# 同一组的广播地址
vrrp_mcast_group4 224.0.0.18
router_id LVS_DEVEL
}
#vrrp 实例部分定义,VI_1自定义名称
vrrp_instance VI_1 {
# 指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP
state MASTER
# 网卡设置,lvs需要绑定在网卡上,RealServer 绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息
interface eth0
# 虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
virtual_router_id 51
# 定义优先级,数字越大,优先级越高。
priority 100
# 设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样
advert_int 1
# 设置验证类型和密码,两个节点必须一致
authentication {
auth_type PASS
auth_pass 1111
}
# 设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
virtual_ipaddress {
192.168.200.16
}
}
# 定义RealServer 对应的VIP及服务端口,IP和端口之间用空格隔开
virtual_server 192.168.200.16 48066 {
# 健康检查时间间隔
delay_loop 6
# lvs调度算法rr wrr lc wlc lblc sh dh
lb_algo rr
# 负载均衡转发规则 NAT DR RUN
lb_kind NAT
# 同一IP的连接50秒内被分配到同一台realserver
persistence_timeout 50
# 使用的协议
protocol TCP
# 备用机,所有realserver失效后启用
sorry_server 192.168.200.200 48066
real_server 192.168.200.2 48066 {
# 权重,最大越高,lvs就越优先访问
weight 1
# keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
TCP_CHECK {
# 3秒无响应超时
connect_timeout 3
# 重连次数3次
retry 3
# 重连间隔时间
delay_before_retry 3
}
}
real_server 192.168.200.3 48066 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
权限
user标签权限控制
目前Mycat对于中间件的连续控制并没有做太复杂的控制,目前只做了中间件逻辑库级别的读写权限控制。是通过 server.xml 的 user 标签进行配置
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<!-- 只读权限,默认false,可读可写 -->
<property name="readOnly">true</property>
</user>
privileges 标签权限控制
在 user 标签下的 privileges 标签可以对逻辑库(schema)、表(table)进行精细化的DML权限控制。
privileges 标签下的 check 属性,如为 true 开启权限检查,为 false 不开启,默认为 false。
由于 Mycat 一个用户的 schemas 属性可配置多个逻辑库(schema),所以 privileges 的下级节点 schema 节点同样可配置多个,对多库多表进行细粒度的 DML 权限控制。
<user name="mycat" defaultAccount="true">
<!-- 密码 -->
<property name="password">123456</property>
<!-- 逻辑库名称 -->
<property name="schemas">TESTDB</property>
<!-- 默认逻辑库 -->
<property name="defaultSchema">TESTDB</property>
<!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->
<!-- 表级 DML 权限设置 -->
<privileges check="true">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
</user>
CML权限 | 增加(insert) | 修改(update) | 查询(select) | 删除(delete) |
---|---|---|---|---|
0000 | 禁止 | 禁止 | 禁止 | 禁止 |
0010 | 禁止 | 禁止 | 可以 | 禁止 |
1110 | 可以 | 可以 | 可以 | 禁止 |
1111 | 可以 | 可以 | 可以 | 可以 |
SQL拦截
firewall 标签用来定义防火墙;firewall 下 whitehost 标签用来定义 IP 白名单,blacklist 用来定义 SQL 黑名单。
白名单
可以通过设置白名单,实现某主机某用户可以访问Mycat,而其他主机用户禁止访问
<!-- 全局SQL防火墙设置 -->
<!--白名单可以使用通配符%或着*-->
<!--例如<host host="127.0.0.*" user="root"/>-->
<!--例如<host host="127.0.*" user="root"/>-->
<!--例如<host host="127.*" user="root"/>-->
<!--例如<host host="1*7.*" user="root"/>-->
<!--这些配置情况下对于127.0.0.1都能以root账户登录-->
<firewall>
<whitehost>
<host host="1*7.0.0.*" user="mycat"/>
</whitehost>
</firewall>
黑名单
可以设置黑名单,实现Mycat对具体SQL操作的拦截,如增删改查等操作的拦截
<firewall>
<whitehost>
<host host="1*7.0.0.*" user="mycat"/>
</whitehost>
<!-- 黑名单开启 -->
<blacklist check="true">
<!-- 不允许使用删除操作 -->
<property name="deleteAllow">false</property>
</blacklist>
</firewall>
配置项 | 缺省值 | 描述 |
---|---|---|
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 | 是否允许执行rollback操作 |