文章目录
一、MyCat高可用
1.MyCat高可用概述
-
通过MyCat来实现MySQL的读写分离,从而完成MySQL集群的负载均衡
但是以上架构存在问题,由于MyCat中间件时单节点的服务,前端客户端所有的压力过来都直接请求这一台MyCat,存在单点故障。这时就需要考虑MyCat的集群。 -
MyCat集群架构,通过MyCat来实现后端MySQL的负载均衡,再通过HAProxy来实现MyCat集群的负载均衡。
HAProxy负责将请求分发到MyCat上,起到负载均衡的作用,同时HAProxy也能检测到MyCat是否存活,HAProxy只会将请求转发到存活的MyCat上。如果一台MyCat服务器宕机,那么HAProxy转发请求时不会转发到该宕机的MyCat上,所以MyCat依然可用。 -
HAProxy是一个开源的、高性能的基于TCP(第四层)和HTTP(第七层)应用的负载均衡软件。使用HAProxy可以快速、可靠地实现基于TCP和HTTP应用的负载均衡解决方案。
因为客户端请求都是先到达HAProxy,再由HAProxy将请求向下转发,如果HAProxy宕机的话,就会造成整个MyCat集群不能正常运行,依然存在单点故障。 -
实现原理
- HAProxy实现了MyCat多节点的集群高可用和负载均衡,而HAProxy自身的高可用则可以通过Keepalived来实现。因此,HAProxy主机上要同时安装HAProxy和Keepalived,Keepalived负责为该服务器抢占vip(虚拟ip),抢占到vip后,对该主机的访问可以通过原来的ip访问,也可以直接通过vip访问。
- HAProxy负责将对vip的请求分发到MyCat集群节点上,起到负载均衡的作用。同时HAProxy也能检测到MyCat是否存活,HAProxy只会将请求转发给存活的MyCat。
- 如果Keepalived+HAProxy高可用集群中的一台服务器宕机,集群中另外一台服务器上的Keepalived会理科抢占vip并接管服务,此时抢占了vip的HAProxy节点可以继续提供服务。
- 如果一台MyCat服务器宕机,HAProxy转发请求时不会转发给宕机的MyCat上,索引MyCat依然可用。
-
keepalived,是一种基于VRRP协议来实现的高可用方案,可以利用其避免单点故障。通常有两台甚至多台服务器运行Keepalived,一台为主服务器(Master),其他为备份服务器,但是对外表现为一个虚拟IP(VIP),主服务器会发送特定的消息给备份服务器,当备份服务器接收不到这个消息时,即认为主服务器宕机,备份服务器就会接管虚拟IP,继续提供服务,从而保证了整个集群的高可用。
2.搭建HAProxy
- 将MySQL服务master1上的JDK和MyCat发送到MySQL服务master2上,进入/usr/local/目录下:
scp -r jdk-11.0.15.1/ 192.168.126.19:$PWD
,
scp -r mycat/ 192.168.126.19:$PWD
$PWD,即跟随master1当前目录 - 配置环境变量,编辑/etc/profile
export JAVA_HOME=/usr/local/jdk-11.0.15.1 export MYCAT_HOME=/usr/local/mycat export PATH=$PATH:$JAVA_HOME/bin:$MYCAT_HOME/bin
- 生效环境变量:
source /etc/profile
- 如果出现OpenJDK,则进行如下操作:
- 查看OpenJDK相关文件:rpm -qa |grep java
- 卸载所有相关文件:rpm -e --nodeps 文件名
- 生效profile文件:source /etc/profile
- 查看jdk的版本号:java -version
- 启动mycat:
mycat start
- 查看列表:
yum list | grep haproxy
- 在两台有mycat的服务器中,安装haproxy:
yum -y install haproxy
- 进入到 /etc/haproxy/目录下,备份haproxy.cfg:
cp haproxy.cfg haproxy.cfg.bak
- HAProxy配置文件主要由全局设定和代理设定两部分组成,包含5个域:global、default、frontend、backend、listen。
- global,即全局配置,通常是一些进程级别的配置,与操作系统相关。
- default,即默认参数配置,主要是涉及公共配置,在defaults中一次性添加。frontend、backend、listen未配置时,都可以默认使用defaults中的参数配置,若配置了则覆盖。
- frontend可以看做是前端接收请求的部分,内部指定后端。
- backend可以看作是后端服务接收请求的部分。
- listen是frontend和backend的组合,haproxy的监控ui可以通过这个进行配置。
- 修改配置文件haproxy.cfg,删除原配置:
vim haproxy.cfg
,添加如下配置
global
log 127.0.0.1 local0
#log 127.0.0.1 local1 notice
#log loghost local0 info
maxconn 4096
chroot /var/lib/haproxy
pidfile /var/run/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.126.17:8066 check inter 10s
server mycat_2 192.168.126.19: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
- 启动HAProxy:
haproxy -f /etc/haproxy/haproxy.cfg
- 查看是否启动成功:
lsof -i:7777
- 通过浏览器访问HAProxy:
192.168.126.17:7777/admin
在弹出框输入账号密码即可访问
- 通过HAProxy访问MyCat:
mysql -uroot -p123456 -h 192.168.126.17 -P 48066
3.搭建Keepalived
-
启动另外一台HAProxy:
haproxy -f /etc/haproxy/haproxy.cfg
此时如果另外一台没有安装HAProxy,也可以通过远程拷贝,进入到etc目录:scp -r haproxy/ 192.168.126.19:$PWD
-
查看列表:
yum list | grep keepalived
-
通过yum指令安装keepalived:
yum install -y keepalived
-
查看通过yum安装的keepalived配置文件:
rpm -ql keepalived
-
进入到/etc/keepalived目录,修改主节点192.168.126.17的配置文件:
vim keepalived.conf
,修改如下:! Configuration File for keepalived global_defs { ## keepalived 自带的邮件提醒需要开启 sendmail 服务。建议用独立的监控或第三方 SMTP router_id mysql## 标识本节点的字条串,通常为 hostname } ## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。 ## 如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加。 ## 如果脚本执行结果非 0,并且 weight 配置的值小于 0,则优先级相应的减少。 ## 其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。 vrrp_script chk_haproxy { script "/etc/keepalived/haproxy_check.sh" ## 检测 haproxy 状态的脚本路径 interval 2 ## 检测时间间隔 weight 2 ## 如果条件成立,权重+2 } ## 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称 vrrp_instance VI_1 { state MASTER ## 默认主设备(priority 值大的)和备用设备(priority 值小的)都设置为 BACKUP, ## 由 priority 来控制同时启动情况下的默认主备,否则先启动的为主设备 interface ens33 ## 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同,我的是 eth3 virtual_router_id 35 ## 虚拟路由的 ID 号,两个节点设置必须一样,可选 IP 最后一段使用, ## 相同的 VRID 为一个组,他将决定多播的 MAC 地址 priority 120 ## 节点优先级,值范围 0-254, MASTER 要比 BACKUP 高 nopreempt ## 主设备(priority 值大的)配置一定要加上 nopreempt,否则非抢占也不起作用 advert_int 1 ## 组播信息发送间隔,两个节点设置必须一样,默认 1s ## 设置验证信息,两个节点必须一致 authentication { auth_type PASS auth_pass 1111 ## 真实生产,按需求对应该过来 } ## 将 track_script 块加入 instance 配置块 track_script { chk_haproxy ## 检查 HAProxy 服务是否存活 } ## 虚拟 IP 池, 两个节点设置必须一样 virtual_ipaddress { 192.168.126.200 } }
-
进入到/etc/keepalived目录,修改主节点192.168.126.19的配置文件:
vim keepalived.conf
,修改如下:! Configuration File for keepalived global_defs { router_id mysql3 } vrrp_script chk_haproxy { script "/etc/keepalived/haproxy_check.sh" interval 2 weight 2 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 35 priority 110 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_haproxy } virtual_ipaddress { 192.168.126.200 } }
-
在两台haproxy服务器上,编写HAProxy状态检测脚本haproxy_check.sh:
#!/bin/bash START_HAPROXY="/usr/sbin/haproxy start" STOP_HAPROXY="/usr/sbin/haproxy stop" LOG_FILE="/usr/local/keepalived/log/haproxy-check.log" HAPS=`ps -C haproxy --no-header |wc -l` date "+%Y-%m-%d %H:%M:%S" >> $LOG_FILE echo "check haproxy status" >> $LOG_FILE if [ $HAPS -eq 0 ];then echo $START_HAPROXY >> $LOG_FILE $START_HAPROXY >> $LOG_FILE 2>&1 sleep 3 if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then echo "start haproxy failed, killall keepalived" >> $LOG_FILE killall keepalived fi fi
即haproxy 如果停止运行,尝试启动,如果无法启动则杀死本机的 keepalived 进程,keepalied将虚拟 ip 绑定到 BACKUP 机器上。
-
给脚本加权限:
chmod +x haproxy_check.sh
-
在两台haproxy服务器上,创建keepalived日志文件夹:
mkdir -p /usr/local/keepalived/log
-
在两台haproxy服务器上,启动keepalived:
service keepalived start
二、MyCat安全设置(server.xml)
1.user标签权限控制
- 目前MyCat对于中间件的连接控制并没有做太复杂的控制,目前只做了中间件逻辑库级别的读写权限控制。是通过server.xml的user标签进行配置。
user标签参数- name:应用连接中间件逻辑库的用户名
- paasword:该用户对应的密码
- schemas:应用当前连接的逻辑库中的其中一个;schemas可以配置一个或多个
- readOnly:应用连接中间件逻辑库所具有的权限。true为只读,false为读写都有,默认为false。
2.privileges标签权限控制
- 在user标签下的privileges标签可以对逻辑库(schema)、表(table)进行精细化的DML(数据库操作语言)权限控制。
- DML权限(insert、update、select、delete)
0代表禁止,1代表可以;分别有4种,对应上面的权限- 0000,全禁止
- 0010,仅查询
- 1000,仅插入
- 1111,全可以
可以对指定的逻辑库及下面的表做增删改查的权限控制。
3.SQL拦截白名单(针对主机IP)
- firewall标签用来定义防火墙;firewall下的whitehost标签用来定义IP白名单,blacklist用来定义SQL黑名单。
- 设置了白名单,那么只有白名单内的主机IP能够访问MyCat
4.SQL拦截黑名单(针对SQL操作)
- 所有操作的默认值为true;通过blacklist下的property标签的name属性来指定对应的拦截功能。
- 黑名单拦截功能
- selectAllow:是否允许执行select语句
- selectColumnAllow:是否允许执行select *操作
- selectIntoAllow:是否允许select语句中包含into子句
- deleteAllow:是否允许执行delete语句
- updateAllow:是否允许执行update语句
- insertAllow:是否允许执行insert语句
- replaceAllow:是否允许执行replace语句
- createTableAllow:是否允许创建表
- setAllow:是否允许使用set语法
- truncateAllow:是否允许执行truncate语句
- alterTableAllow:是否允许执行alter table语句
- dropTableAllow:是否允许修改表
- commitAllow:是否允许执行commit操作
- rollbackAllow:是否允许执行rollback操作
- useAllow:是否允许执行use语句
- describeAllow:是否允许执行describe操作
- showAllow:是否允许执行show语句
三、MyCat性能监控及优化
1.Mycat-web安装使用
- Mycat-web是MyCat可视化运维的管理和监控平台。Mycat-web引入了Zookeeper作为配置中心,可以管理多个节点。
- Mycat-web主要管理和监控Mycat的流量、连接、活动线程和内存等,具备IP白名单、邮件告警等模块,还可以统计SQL并分析慢SQL和高频SQL等。为优化SQL提供依据。
- 通过Docker安装Zookeeper:
docker run --name zk -d -p 2181:2181 zookeeper:3.7.0
- 在mycat官网下载Mycat-web:http://dl.mycat.org.cn/mycat-web-1.0/
- 上传该压缩包到/opt目录下,解压Mycat-web:
tar -zxvf Mycat-web-1.0-SNAPSHOT-20170102153329-linux.tar.gz -C /usr/local/
- 修改Zookeeper的地址:
vim /usr/local/mycat-web/mycat-web/WEB-INF/classes/mycat.properties
,zookeeper=192.168.126.17:2181
- 进入到/usr/local/mycat-web目录下,启动mycat-web:
./start.sh &
- 因为是jdk11,需要修改start.sh脚本的jvm参数:
nohup java -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -XX:+UseG1GC -XX:SurvivorRatio=8 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar start.jar
- 查看8082端口服务状态:
lsof -i:8082
- 通过浏览器访问mycat-web:
http://192.168.126.17:8082/mycat/
- 在mycat-web中新增mycat实例,如下
2.MyCat性能调优
JVM调优
- JAVA堆内存和直接内存映射,建议堆内存大小适度,直接映射的内存尽可能大,总计占用操作系统50%~67%的内存。
- 示例,16G内存的服务器,MyCat堆内存为4G,直接内存映射为6G,修改文件/usr/local/mycat/bin/startup_nowrap.sh:
JAVA_OPTS="-server -Xms4G -Xmx2G -XX:MaxPermSize=64m -XX:+AggressiveOpts -XX:MaxDirectMemorySize=6G"
MyCat调优
- MyCat的所有调优参数都可以在server.xml文件中找到。
- processors数值的影响范围。
参数- processors:CPU核心数越多,可以越大,当发现系统CPU压力很小的情况下,可以适当调大此参数,如4核心的4CPU,可以设置为16;24核心的可以最大设置为128
- processorExecutor:每个processor的线程池大小,建议是16~64,根据系统能力来测试和确定。
- 设置连接数,最大连接数maxCon的值可以改为1000~2000,同一个MySQL实例上的所有dataNode节点共享本dataHost上的所有物理连接。
3.MyCat实施指南
-
分库分表原则
- 原则一:能不分就部分;
- 原则二:分片数量尽量少
- 原则三:分片规则需要慎重选择
- 原则四:SQL尽量不要在一个事务中跨越多个分片
- 原则五:查询条件尽量优化
-
分片规则的选择,例如某个表的数据有明显的时间特征,比如订单、交易记录等,则它们通常比较适合用时间范围分片,因为它们是具有时效性的数据。
-
数据拆分原则
- 达到一定数量级才拆分(800W)
- 不到800W但跟大表(超800W的表)有关联查询的表也要拆分,在此成为大表关联表
- 小于100W的使用全局表
- 大于100W小于800W跟大表使用同样的拆分策略
总结
- MyCat高可用,通过HAProxy来实现MyCat高可用。
即Keepalived对外提供一个虚拟IP(VIP),并检测HAProxy是否宕机;Keepalived使用主从的架构,如果Keepalived的主节点宕机,则从节点会抢占虚拟IP,让抢占的从节点的HAProxy顶上;当主节点好了以后,VIP又回到主节点。如果是HAProxy宕机,则会尝试启动HAProxy,启动失败则会杀死本机的keepalived进程。
HAProxy则检测MyCat是否存活,转发请求时会避开宕机的。MyCat则实现MySQL的读写分离、负载均衡、高可用,同时也会检测MySQL的主节点是否宕机,宕机则会进行主从切换。
HAProxy技术的主要作用是实现MyCat的负载均衡;Keepalived技术的主要作用是对外提供一个虚拟IP(VIP)。
即通过keepalived+HAProxy的架构来实现MyCat的高可用。 - 使用user标签设置用户名和密码,以及指定逻辑库和逻辑库的读写权限。
而privileges标签可以更细粒度的做DML权限控制,即对逻辑库及下面的表做增删改查的权限控制。
check=“true”,是指对连接的参数或者主机的信息进行检查,false则不检查。
白名单是对指定的IP地址放行;黑名单则是对具体的SQL操作进行拦截并处理。 - 通过JVM调优映射的内存,总计占用操作系统50%~67%的内存。
MyCat的分表分库技术最重要的原则是能不分就不分;达到800W数量级才拆分。