文章目录
一.基于HA机制的Mycat高可用
- 上述的主从复制,读写分离,分库,分表都是保证了mysql的高可用性,但是Mycat的高可用并没有保证.
- 在实际项目中,Mycat 服务也需要考虑高可用性,如果 Mycat 所在服务器出现宕机,或 Mycat 服务故障,需要有备机提供服务,需要考虑 Mycat 集群。
1.HAProxy+Keepalived+两台Mycat
我们可以使用 HAProxy + Keepalived 配合两台 Mycat 搭起 Mycat 集群,实现高可用性。HAProxy 实现了 MyCat 多节点的集群高可用和负载均衡,而 HAProxy 自身的高可用则可以通过 Keepalived 来 实现。
编号 | 角色 | IP地址 | 机器名 |
---|---|---|---|
1 | Mycat1 | 192.168.XXX.XX1 | host01 |
2 | Mycat2 | 192.168.XXX.XX2 | host02 |
3 | HAProxy(master) | 192.168.XXX.XX3 | host03 |
4 | Keepalived(master) | 192.168.XXX.XX3 | host03 |
5 | HAProxy(backup) | 192.168.XXX.XX4 | host04 |
6 | Keepalive(backup) | 192.168.XXX.XX4 | host04 |
2.安装HAProxy
1.安装
#1准备好HAProxy安装包,传到/opt目录下
#2解压到/usr/local/src
tar -zxvf haproxy-1.5.18.tar.gz -C /usr/local/src
#3进入解压后的目录,查看内核版本,进行编译
cd /usr/local/src/haproxy-1.5.18
uname -r
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安装路径。
#4编译完成后,进行安装
make install PREFIX=/usr/local/haproxy
#5安装完成后,创建目录、创建HAProxy配置文件
mkdir -p /usr/data/haproxy/
vim /usr/local/haproxy/haproxy.conf
#6向配置文件中插入以下配置信息,并保存
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 #存储进程ID的文件
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 #开启服务绑定的端口为48066
mode tcp
balance roundrobin
server mycat_1 192.168.XXX.XX1:8066 check inter 10s #指定Mycat机器
server mycat_2 192.168.XXX.XX2: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
2.启动
#1启动HAProxy
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.conf
#2查看HAProxy进程
ps -ef|grep haproxy
#3打开浏览器访问
http://192.168.XXX.XX4:7777/admin
#在弹出框输入用户名:admin密码:123123
#如果Mycat主备机均已启动,则可以看到如下图
#4验证负载均衡,通过HAProxy访问Mycat
mysql -umycat -p123456 -h 192.168.XXX.XX3 -P 48066
3.配置Keepalived
保证HAProxy的高可用性,检测服务器的状态
1.安装keepalived
#1准备好Keepalived安装包,传到/opt目录下
#2解压到/usr/local/src
tar -zxvf keepalived-1.4.2.tar.gz -C /usr/local/src
#3安装依赖插件
yum install -y gcc openssl-devel popt-devel
#3进入解压后的目录,进行配置,进行编译
cd /usr/local/src/keepalived-1.4.2
./configure --prefix=/usr/local/keepalived
#4进行编译,完成后进行安装
make && make install
#5运行前配置
cp /usr/local/src/keepalived-1.4.2/keepalived/etc/init.d/keepalived /etc/init.d/
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/src/keepalived-1.4.2/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
#6修改配置文件
vim /etc/keepalived/keepalived.conf
#修改内容如下
! Configuration File for keepalived
global_defs {
notification_email {
xlcocoon@foxmail.com #keepalived做了切换后发送的邮箱
}
notification_email_from keepalived@showjoy.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.140.200
}
}
virtual_server 192.168.140.200 48066 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.140.125 48066 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 192.168.140.126 48600 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
2.启动验证
#1启动Keepalived
service keepalived start
#2登录验证
mysql -umycat -p123456 -h 192.168.140.200 -P 48066
- 相当于keepalived保证了HAProxy的安全提供虚拟IP,同时监控HA的状态.
- HA保证了mycat的高可用集群
二.Mycat的安全设置
1.权限配置
1.user标签权限控制
目前 Mycat 对于中间件的连接控制并没有做太复杂的控制,目前只做了中间件逻辑库级别的读 写权限控制。是通过 server.xml 的 user 标签进行配置。
#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>
配置说明
标签属性 | 说明 |
---|---|
name | 应用连接中间逻辑库的用户名 |
password | 该用户对应的密码 |
TESTDB | 应用当前连接的逻辑库中对应的逻辑表.schemas中可以配置一个或多个 |
readOnly | 应用连接中间件逻辑库所具有的权限.true为只读,false为读写都有,默认为false |
测试
#测试案例一
# 使用user用户,权限为只读(readOnly:true)
# 验证是否可以查询出数据,验证是否可以写入数据
#1、用user用户登录,运行命令如下:
mysql -uuser -puser -h 192.168.140.128 -P8066
#2、切换到TESTDB数据库,查询orders表数据,如下:
use TESTDB
select * from orders;
#3、可以查询到数据
#4、执行插入数据sql,如下:
insert into orders(id,order_type,customer_id,amount) values(7,101,101,10000);
#5、可看到运行结果,插入失败,只有只读权限
2.privileges标签的权限控制
对于表的操作设置权限
在 user 标签下的 privileges 标签可以对逻辑库(schema)、表(table)进行精细化的 DML 权限控制.privileges 标签下的 check 属性,如为 true 开启权限检查,为 false 不开启,默认为 false. 由于 Mycat 一个用户的schemas 属性可配置多个逻辑库(schema),所以 privileges 的下级 节点 schema 节点同样可配置多个,对多库多表进行细粒度的 DML 权限控制。
#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>
配置说明
DML权限 | 增加 | 更新 | 查询 | 删除 |
---|---|---|---|---|
0000 | 禁止 | 禁止 | 禁止 | 禁止 |
0010 | 禁止 | 禁止 | 可以 | 禁止 |
1110 | 可以 | 禁止 | 禁止 | 禁止 |
1111 | 可以 | 可以 | 可以 | 可以 |
测试案例
#测试案例一
# 使用mycat用户,privileges配置orders表权限为禁止增删改查(dml="0000"
# 验证是否可以查询出数据,验证是否可以写入数据
#1、重启mycat,用mycat用户登录,运行命令如下:
mysql -umycat -p123456 -h 192.168.140.128 -P8066
#2、切换到TESTDB数据库,查询orders表数据,如下:
use TESTDB
select * from orders;
#3、禁止该用户查询数据
#4、执行插入数据sql,如下:
insert into orders(id,order_type,customer_id,amount) values(8,101,101,10000);
#5、可看到运行结果,禁止该用户插入数据
2.SQL拦截
firewall 标签用来定义防火墙;firewall 下 whitehost 标签用来定义 IP 白名单 ,blacklist 用来定义SQL黑名单。
1.白名单
可以通过设置白名单,实现某主机某用户可以访问 Mycat,而其他主机用户禁止访问。
#设置白名单
#server.xml配置文件firewall标签
#配置只有192.168.140.128主机可以通过mycat用户访问
<firewall>
<whitehost>
<host host="192.168.140.128" user="mycat"/>
</whitehost>
</firewall>
#重启Mycat后,192.168.140.128主机使用mycat用户访问
mysql -umycat -p123456 -h 192.168.140.128 -P 8066
#可以正常访问
#在此主机换user用户访问,禁止访问
#在192.168.140.127主机用mycat用户访问,禁止访问
2.黑名单
可以通过设置黑名单,实现 Mycat 对具体 SQL 操作的拦截,如增删改查等操作的拦截。
#设置黑名单
#server.xml配置文件firewall标签
#配置禁止mycat用户进行删除操作
<firewall>
<whitehost>
<host host="192.168.140.128" user="mycat"/>
</whitehost>
<blacklist check="true"> #true开启黑名单
<property name="deleteAllow">false</property>
</blacklist>
</firewall>
#重启Mycat后,192.168.140.128主机使用mycat用户访问
mysql -umycat -p123456 -h 192.168.140.128 -P 8066
#可以正常访问
#切换TESTDB数据库后,执行删除数据语句
delete from orders where id=7;
#运行后发现已禁止删除数据
设置的黑名单SQL拦截功能表
配置项 | 缺省值 | 描述 |
---|---|---|
selelctAllow | true/false | 是否允许执行 SELECT 语句 |
deleteAllow | true/false | 是否允许执行 DELETE 语句 |
updateAllow | true/false | 是否允许执行 UPDATE 语句 |
insertAllow | true/false | 是否允许执行 INSERT 语句 |
createTableAllow | true/false | 是否允许创建表 |
setAllow | true/false | 是否允许使用 SET 语法 |
alterTableAllow | true/false | 是否允许执行 Alter Table 语句 |
dropTableAllow | true/false | 是否允许修改表 |
commitAllow | true/false | 是否允许执行 commit 操作 |
rollbackAllow | true/false | 是否允许执行 roll back 操作 |
三.Mycat监控工具
1.Mycat-web简介
Mycat-web 是 Mycat 可视化运维的管理和监控平台,弥补了 Mycat 在监控上的空白。帮 Mycat 分担统计任务和配置管理任务。Mycat-web 引入了 ZooKeeper 作为配置中心,可以管理多个节点。Mycat-web 主要管理和监控 Mycat 的流量、连接、活动线程和内存等,具备 IP 白名单、邮件告警等模 块,还可以统计 SQL 并分析慢 SQL 和高频 SQL 等。为优化 SQL 提供依据。
2.Mycat-web配置使用
1.安装ZooKeeper
#1下载安装包http://zookeeper.apache.org/
#2 安装包拷贝到Linux系统/opt目录下,并解压
tar -zxvf zookeeper-3.4.11.tar.gz
#root下创建myzookeeper目录
cp -r zookeeper-XXXX /myzookeeper/
#3 进入解压后的配置目录(conf),复制配置文件并改名
cp zoo_sample.cfg zoo.cfg
#4 进入ZooKeeper的命令目录(bin),运行启动命令
./zkServer.sh start
#5 ZooKeeper服务端口为2181,查看服务已经启动
netstat -ant | grep 218
2.Mycat-web安装
#1下载安装包http://www.mycat.io/
#2 安装包拷贝到Linux系统/opt目录下,并解压
tar -zxvf Mycat-web-1.0-SNAPSHOT-20170102153329-linux.tar.gz
#3 拷贝mycat-web文件夹到/usr/local目录下
cp -r mycat-web /usr/local
#4 进入mycat-web的目录下运行启动命令
cd /usr/local/mycat-web/
./start.sh & #后台启动
#5 Mycat-web服务端口为8082,查看服务已经启动
netstat -ant | grep 8082
#6 通过地址访问服务
http://192.168.XXX.XXX:8082/mycat/
3.Mycat性能监控指标
http://192.168.XXX.XXX:8082/mycat/