Mycat核心教程--基于HA 机制的Mycat 高可用
六、基于HA 机制的Mycat 高可用
在实际项目中,Mycat 服务也需要考虑高可用性,如果 Mycat 所在服务器出现宕机,或 Mycat 服务故障,需要有备机提供服务,需要考虑Mycat 集群。
6.1.高可用方案
我们可以使用HAProxy + Keepalived 配合两台 Mycat 搭起 Mycat 集群,实现高可用性。
HAProxy 实现了 MyCat 多节点的集群高可用和负载均衡, 而 HAProxy 自身的高可用则可以通过Keepalived 来实现。
编号 | 角色 | IP地址 | 机器名 |
---|---|---|---|
1 | Mycat1 | 192.168.147.128 | host128 |
2 | Mycat2 | 192.168.147.129 | host129 |
3 | HAProxy(master) | 192.168.147.130 | host130 |
4 | Keepalived(master) | 192.168.147.130 | host130 |
5 | HAProxy(backup) | 192.168.147.131 | host131 |
6 | Keepalived(backup) | 192.168.147.131 | host131 |
6.2.安装配置HAProxy
6.2.1.准备好HAProxy安装包,传到/opt目录下
cd /opt/
wget https://www.haproxy.org/download/1.5/src/haproxy-1.5.19.tar.gz
6.2.2.解压到/usr/local/src
tar -xzvf haproxy-1.5.19.tar.gz -C /usr/local/src/
6.2.3.进入解压后的目录,查看内核版本,进行编译
cd /usr/local/src/haproxy-1.5.19
# 查看内核版本
uname -r
# 3.10.0-1160.71.1.el7.x86_64
# 执行Linux的make命令进行编译
make TARGET=linux310 PREFIX=/usr/local/haproxy ARCH=x86_64
# ARGET=linux310,内核版本,使用uname -r查看内核,如:3.10.0-1160.71.1.el7,此时该参数就为linux310
# ARCH=x86_64,系统位数
# PREFIX=/usr/local/haprpxy
# /usr/local/haprpxy,为haprpxy安装路径。
6.2.4.编译完成后,进行安装
make install PREFIX=/usr/local/haproxy
6.2.5.安装完成后,创建目录、创建HAProxy配置文件
# 将解压后目录下的配置模版文件拷贝到程序运行目录的配置文件目录下
cp /usr/local/src/haproxy-1.5.19/examples/haproxy.cfg /usr/local/haproxy/haproxy.cfg
# 创建目录
mkdir -p /usr/data/haproxy/
vim /usr/local/haproxy/haproxy.conf
6.2.6.向配置文件中插入以下配置信息,并保存
# 全局配置,定义haproxy进程的工作特性和全局配置
global
# 定义全局的 syslog 服务器,最多可以定义两个
log 127.0.0.1 local0
#log 127.0.0.1 local1 notice
#log loghost local0 info
maxconn 4096
# chroot运行的路径,,当前目录为指定目录,设置超级用户权限启动进程,提高安全性
chroot /usr/local/haproxy
# haproxy pid的存放位置
pidfile /usr/data/haproxy/haproxy.pid
uid 99
gid 99
# 守护进程的方式在后台工作
daemon
#debug
#quiet
# 默认配置
defaults
# 日志继承全局配置段的设置
log global
mode tcp
option abortonclose
option redispatch
# 重试次数为3次,失败3次以后则表示服务不可用
retries 3
maxconn 2000
# 连接超时时间,表示客户端请求转发至服务器所等待的时长
timeout connect 5000
# 客户端超时时间,表示客户端非活跃状态的时间
timeout client 50000
# 服务器超时时间,表示客户端与服务器建立连接后,等待服务器的超时时间
timeout server 50000
listen proxy_status
# bind后面必须有空格然后加冒号,否则会报错
bind :48066
mode tcp
balance roundrobin
server mycat_1 192.168.147.128:8066 check inter 10s
server mycat_2 192.168.147.129:8066 check inter 10s
frontend admin_stats
bind :7777
mode http
stats enable
option httplog
maxconn 10
stats refresh 30s
stats uri /admin
stats auth admin:123123
stats hide-version
stats admin if TRUE
# 控制台的用户名admin 密码123123
6.2.7.放行8066端口
systemctl status firewalld
# --add-port=8066/tcp,表示添加指定8066端口,格式为:端口/通讯协议
# --permanent表示设置为持久
# --zone 表示作用域
firewall-cmd --zone=public --add-port=8066/tcp --permanent
# --remove-port表示移除指定端口
firewall-cmd --zone=public --remove-port=8066/tcp --permanent
# 重新加载防火墙
firewall-cmd --reload
# 再次查询开放端口
firewall-cmd --list-ports
# 查看已配置规则
firewall-cmd --list-all
6.2.8.启动验证–启动HAProxy
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.conf
6.2.9.查看HAProxy进程
ps -ef | grep haproxy
6.2.10.haproxy安装成系统服务
# 创建脚本
vi /usr/lib/systemd/system/haproxy.service
# 重新加载系统服务
systemctl daemon-reload
systemctl start haproxy
systemctl stop haproxy
systemctl status haproxy
[Unit]
Description=HAProxy Load Balancer
Documentation=https://www.haproxy.org/
After=network.target
[Service]
Type=forking
PIDFile=/usr/data/haproxy/haproxy.pid
ExecStart=/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true
[Install]
WantedBy=default.target
6.2.11.Mycat主备机均启动
mycat console
6.2.12.打开浏览器访问
http://192.168.147.130:7777/admin
#在弹出框输入用户名:admin密码:123123
6.2.13.验证负载均衡,通过HAProxy访问Mycat
mysql -umycat -p -P 48066 -h 192.168.147.130
123456
6.3.配置Keepalived
keepalived官网地址:https://keepalived.org/
6.3.1.准备好Keepalived安装包,传到/opt目录下
cd /opt/
wget https://keepalived.org/software/keepalived-2.2.8.tar.gz
6.3.2.解压到/usr/local/src
tar -zxvf keepalived-2.2.8.tar.gz -C /usr/local/src
6.3.3.安装依赖插件
yum install -y gcc openssl-devel popt-devel libnl libnl-devel
6.3.4.进入解压后的目录,进行配置,进行编译
cd /usr/local/src/keepalived-2.2.8
./configure --prefix=/usr/local/keepalived
6.3.5.进行编译,完成后进行安装
make && make install
6.3.6.运行前配置
cp /usr/local/src/keepalived-2.2.8/keepalived/etc/init.d/keepalived /etc/init.d/
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf
cp /usr/local/src/keepalived-2.2.8/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
6.3.7.修改配置文件
vim /etc/keepalived/keepalived.conf
#修改内容如下
! Configuration File for keepalived
global_defs {
notification_email {
coon@foxmail.com
}
notification_email_from keepalived@joy.com
smtp_server 127.0.0.1
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
#所在机器网卡
interface ens33
virtual_router_id 51
#数值越大优先级越高
priority 100
advert_int 1
authentication{
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
#虚拟IP
192.168.147.200
}
}
virtual_server 192.168.147.200 48066 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
# HAProxy主机
real_server 192.168.147.130 48066 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
# HAProxy从机
real_server 192.168.147.131 48600 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
6.3.8.启动验证–启动Keepalived
systemctl start keepalived
systemctl stop keepalived
systemctl status keepalived
6.3.9.登录验证
mysql -umycat -p -P 48066 -h 192.168.147.200
123456
6.4.测试高可用
6.4.1.关闭mycat
6.4.2.通过虚拟ip查询数据
mysql -umycat -p123456 -h 192.168.147.200 -P 48066
七、Mycat 安全设置
7.1.权限配置
7.1.1.user 标签权限控制
目前Mycat 对于中间件的连接控制并没有做太复杂的控制,目前只做了中间件逻辑库级别的读写权限控制。
是通过server.xml 的user 标签进行配置。
7.1.1.1.修改配置文件server.xml
vi /usr/local/mycat/conf/server.xml
#server.xml配置文件user部分
<user name="mycat">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
7.1.1.2.配置说明
标签属性 | 说明 |
---|---|
name | 应用连接中间件逻辑库的用户名 |
password | 该用户对应的密码 |
TESTDB | 应用当前连接的逻辑库中所对应的逻辑表。schemas 中可以配置一个或多个 |
readOnly | 应用连接中间件逻辑库所具有的权限。true 为只读,false 为读写都有,默认为 false |
7.1.2.测试案例一
- 使用
user
用户,权限为只读(readOnly:true)
- 验证是否可以查询出数据,验证是否可以写入数据
7.1.2.1.用user用户登录,运行命令如下
mysql -uuser -puser -h 192.168.147.128 -P8066
7.1.2.2.切换到TESTDB数据库,查询orders表数据
use TESTDB;
select * from orders;
7.1.2.3.查询到数据,如图
7.1.2.4.执行插入数据sql
insert into orders(id,order_type,customer_id,amount) values(7,101,101,10000);
7.1.2.5.可看到运行结果,插入失败,只有只读权限
7.1.3.测试案例二
- 使用
mycat
用户,权限为可读写(readOnly:false)
- 验证是否可以查询出数据,验证是否可以写入数据
7.1.3.1.用mycat用户登录,运行命令如下
mysql -umycat -p123456 -h 192.168.147.128 -P8066
7.1.3.2.切换到TESTDB数据库,查询orders表数据
use TESTDB;
select * from orders;
7.1.3.3.查询到数据
7.1.3.4.执行插入数据sql
insert into orders(id,order_type,customer_id,amount) values(7,101,101,10000);
insert into orders(id,order_type,customer_id,amount) values(next value for MYCATSEQ_ORDERS,101,101,10000);
7.1.3.5.看到运行结果,插入成功
7.1.4.privileges 标签权限控制
在user 标签下的privileges 标签可以对逻辑库(schema)、表(table)进行精细化的DML 权限控制。
privileges 标签下的check 属性,如为true 开启权限检查,为 false 不开启,默认为 false。
由于 Mycat 一个用户的 schemas 属性可配置多个逻辑库(schema) ,所以 privileges 的下级节点 schema 节点同样可配置多个,对多库多表进行细粒度的 DML 权限控制。
7.1.4.1.修改server.xml配置文件privileges部分
vi /usr/local/mycat/conf/server.xml
#server.xml配置文件privileges部分
#配置orders表没有增删改查权限
<user name="mycat">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<!-- 表级 DML 权限设置 -->
<privileges check="true">
<schema name="TESTDB" dml="1111" >
<table name="orders" dml="0000"></table>
<!--<table name="tb02" dml="1111"></table>-->
</schema>
</privileges>
</user>
7.1.4.2.配置说明
DML 权限 | 增加(insert) | 更新(update) | 查询(select) | 删除(select) |
---|---|---|---|---|
0000 | 禁止 | 禁止 | 禁止 | 禁止 |
0010 | 禁止 | 禁止 | 可以 | 禁止 |
1110 | 可以 | 禁止 | 禁止 | 禁止 |
1111 | 可以 | 可以 | 可以 | 可以 |
7.1.5.测试案例一
- 使用mycat用户,privileges配置orders表权限为禁止增删改查(dml=“0000”)
- 验证是否可以查询出数据,验证是否可以写入数据
7.1.5.1.重启mycat,用mycat用户登录,运行命令
mysql -umycat -p123456 -h 192.168.147.128 -P8066
7.1.5.2.切换到TESTDB数据库,查询orders表数据
use TESTDB;
select * from orders;
7.1.5.3.禁止该用户查询数据
7.1.5.4.执行插入数据sql
insert into orders(id,order_type,customer_id,amount) values(8,101,101,10000);
insert into orders(id,order_type,customer_id,amount) values(next value for MYCATSEQ_ORDERS,105,102,10000);
7.1.5.5.可看到运行结果,禁止该用户插入数据
7.1.6.测试案例二
- 使用mycat用户,privileges配置orders表权限为禁止增删改查(dml=“1111”)
- 验证是否可以查询出数据,验证是否可以写入数据
vi /usr/local/mycat/conf/server.xml
7.1.6.1.重启mycat,用mycat用户登录,运行命令
mysql -umycat -p123456 -h 192.168.147.128 -P8066
7.1.6.2.切换到TESTDB数据库,查询orders表数据
use TESTDB;
select * from orders;
7.1.6.3.可以查询到数据,如图
7.1.6.4.执行插入数据sql
insert into orders(id,order_type,customer_id,amount) values(8,101,101,10000);
7.1.6.5.运行结果,插入成功
7.1.6.6.执行删除数据sql
delete from orders where id in (7,8);
7.1.6.7.运行结果,删除成功
7.2.SQL 拦截
firewall 标签用来定义防火墙;firewall 下 whitehost 标签用来定义 IP 白名单 ,blacklist 用来定义 SQL 黑名单。
7.2.1.白名单
可以通过设置白名单,实现某主机某用户可以访问Mycat,而其他主机用户禁止访问。
7.2.1.1.设置白名单
vi /usr/local/mycat/conf/server.xml
#设置白名单
#server.xml配置文件firewall标签
#配置只有192.168.140.129主机可以通过mycat用户访问
<firewall>
<whitehost>
<host host="192.168.147.129" user="mycat"/>
</whitehost>
</firewall>
7.2.1.2.重启Mycat后,192.168.147.129主机使用mycat用户访问
mysql -umycat -p123456 -h 192.168.140.128 -P 8066
7.2.1.3.可以正常访问
7.2.1.4.在此主机换user用户访问,禁止访问
mysql -uuser -puser -h 192.168.147.128 -P8066
7.2.1.5.在192.168.147.130主机用mycat用户访问,禁止访问
mysql -umycat -p -h 192.168.147.128 -P 8066
123456
7.2.2.黑名单
可以通过设置黑名单,实现Mycat 对具体 SQL 操作的拦截,如增删改查等操作的拦截。
7.2.2.1.设置黑名单
vi /usr/local/mycat/conf/server.xml
#设置黑名单
#server.xml配置文件firewall标签
#配置禁止mycat用户进行删除操作
<firewall>
<whitehost>
<host host="192.168.147.129" user="mycat"/>
</whitehost>
<blacklist check="true">
<property name="deleteAllow">false</property>
</blacklist>
</firewall>
7.2.2.2.重启Mycat后,192.168.147.129主机使用mycat用户访问
mysql -umycat -p -h 192.168.147.128 -P 8066
123456
7.2.2.3.可以正常访问
7.2.2.4.切换TESTDB数据库后,执行删除数据语句
use TESTDB;
select * from orders;
delete from orders where id = 6;
7.2.2.5.运行后发现已禁止删除数据
7.2.3.可以设置的黑名单SQL 拦截功能列表
配置项 | 缺省值 | 描述 |
---|---|---|
selelctAllow | 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 操作 |