通过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集群不能正常运行,依然存在单点故障。
实现原理
keepalived,是一种基于VRRP协议来实现的高可用方案,可以利用其避免单点故障。通常有两台甚至多台服务器运行Keepalived,一台为主服务器(Master),其他为备份服务器,但是对外表现为一个虚拟IP(VIP),主服务器会发送特定的消息给备份服务器,当备份服务器接收不到这个消息时,即认为主服务器宕机,备份服务器就会接管虚拟IP,继续提供服务,从而保证了整个集群的高可用。
scp -r jdk-11.0.15.1/ 192.168.126.19:$PWD,scp -r mycat/ 192.168.126.19:$PWDexport 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/profilemycat startyum list | grep haproxyyum -y install haproxycp haproxy.cfg haproxy.cfg.bakvim 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 -f /etc/haproxy/haproxy.cfglsof -i:7777192.168.126.17:7777/admin
mysql -uroot -p123456 -h 192.168.126.17 -P 48066启动另外一台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
可以对指定的逻辑库及下面的表做增删改查的权限控制。
docker run --name zk -d -p 2181:2181 zookeeper:3.7.0tar -zxvf Mycat-web-1.0-SNAPSHOT-20170102153329-linux.tar.gz -C /usr/local/vim /usr/local/mycat-web/mycat-web/WEB-INF/classes/mycat.properties,zookeeper=192.168.126.17:2181./start.sh &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
lsof -i:8082http://192.168.126.17:8082/mycat/
JVM调优
JAVA_OPTS="-server -Xms4G -Xmx2G -XX:MaxPermSize=64m -XX:+AggressiveOpts -XX:MaxDirectMemorySize=6G"MyCat调优
分库分表原则
分片规则的选择,例如某个表的数据有明显的时间特征,比如订单、交易记录等,则它们通常比较适合用时间范围分片,因为它们是具有时效性的数据。
数据拆分原则