SLB Haproxy Mycat代理mysql分库分表,读写分离

#随着业务增长,对于后端数据库的压力越来越大,尤其是个人信息中心等超级大表,超过千万级别的表,我们决定通过分库分表来减轻压力,这就需要在前面加代理,后来调研到mycat适合我们的业务,又由于跑在阿里云,通过slb直接代理mycat会报错,就想到了通过haproxy来做mycat的代理,由于阿里云不支持VIP,所以只能选用slb代理两个haproxy,再通过haproxy代理两个mycat达到高可用负载均衡的架构。

#haproxy的优点
1、HAProxy是支持虚拟主机的,可以工作在4、7层(支持多网段);
2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作;
3、支持url检测后端的服务器;
4、它跟LVS一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的;
5、HAProxy可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,不过在后端的MySQL slaves数量超过10台时性能不如LVS;
6、HAProxy的算法较多,达到8种;

#软件版本
平台:阿里云
操作系统:CentOS Linux release 7.0.1406 (Core)
haproxy:haproxy-1.5.18-3.el7_3.1.x86_64
Java:java version “1.8.0_112”
mycat:Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

#架构图

#软件版本
平台:阿里云
操作系统:CentOS Linux release 7.0.1406 (Core)
haproxy:haproxy-1.5.18-3.el7_3.1.x86_64
Java:java version “1.8.0_112”
mycat:Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

#配置MyCat状态检查服务(在MyCat节点主机上配置)
#增加mycat服务的状态检测脚本,并开放相应的检测端口,以提供给HAProxy对MyCat的服务状态进行检测判断。可以使用xinetd来实现,通过xinetd,HAProxy可以用httpchk来检测MyCat的存活状态。(xinetd即extended internet daemon,xinetd是新一代的网络守护进程服务程序,又叫超级Internet服务器。经常用来管理多种轻量级Internet服务。xinetd提供类似于inetd+tcp_wrapper的功能,但是更加强大和安全。xinetd为linux系统的基础服务)
#安装xinetd

yum install xinetd

#编辑mycat_statuswenjan

vi /etc/xinetd.d/mycat_status
service mycat_status
{
flags = REUSE
# 使用该标记的socket_type为stream,封包处理方式,Stream为TCP数据包,需要设置wait为no
socket_type = stream
# 服务监听端口
port = 48700
# 表示不需等待,即服务将以多线程的方式运行
wait = no
# 执行此服务进程的用户
user = root
# 需要启动的服务脚本
server = /opt/mycat_status
# 登录失败记录的内容
log_on_failure += USERID
# 要启动服务,将此参数设置为no
disable = no
}

#增加监测脚本

vi /opt/mycat_status
#!/bin/bash
#/opt/mycat_status.sh
# This script checks if a mycat server is healthy running on localhost.
# It will return:
# "HTTP/1.x 200 OK\r" (if mycat is running smoothly)
# "HTTP/1.x 503 Internal Server Error\r" (else)
mycat=`mysql -h 192.168.1.102 -P8066 --connect-timeout=2 -uhaproxy -e "show databases" |grep singleusercenter |wc -l`
if [ "$mycat" = "1" ]; then
/bin/echo -e "HTTP/1.1 200 OK\r\n"
else
/bin/echo -e "HTTP/1.1 503 Service Unavailable\r\n"
fi

#给新增脚本赋予可执行权限

chmod 755 /opt/mycat_status

#在/etc/services中加入mycat_status服务

vi /etc/services
mycat_status 48700/tcp # mycat_status

#保存后,重启xinetd服务

service xinetd restart

#验证mycat_status服务是否成功启动
[root@tomcat-test-2 conf]# /opt/mycat_status
HTTP/1.1 200 OK

#haproxy
#MyCat官方推荐使用HAProxy做MyCat的高可用负载均衡代理。
#HAProxy的安装

yum install haproxy -y

#编辑haproxy

vi /etc/haproxy/haproxy.cfg
# global配置中的参数为进程级别的参数,通常与其运行的操作系统有关
global
# 定义全局的syslog服务器,最多可以定义2个
log 127.0.0.1 local0 info
# 修改HAProxy的工作目录至指定的目录并在放弃权限之前执行
chroot /var/lib/haproxy
# 进程文件(默认路径 /var/run/haproxy.pid)
pidfile /var/run/haproxy.pid
# 同uid,但这里使用的为用户名
user haproxy
# 同gid,不过这里为指定的用户组名
group haproxy
# 指定启动的haproxy进程个数
nbproc 1
# 设定每个haproxy进程所接受的最大并发连接数
maxconn 4096
# 定义当前节点的名称,用于HA场景中多haproxy进程共享同一个IP地址时
node mycat-haproxy-01
# 当前实例的描述信息
description edu-haproxy-01

defaults
# 继承global中log的定义
log global
# mode:所处理的模式 (tcp:四层 , http:七层 , health:状态检查,只会返回OK)
# tcp: 实例运行于纯tcp模式,在客户端和服务器端之间将建立一个全双工的连接,
# 且不会对7层报文做任何类型的检查,此为默认模式
# http:实例运行于http模式,客户端请求在转发至后端服务器之前将被深度分析,
# 所有不与RFC模式兼容的请求都会被拒绝
# health:实例运行于health模式,其对入站请求仅响应“OK”信息并关闭连接,
# 且不会记录任何日志信息 ,此模式将用于相应外部组件的监控状态检测请求
mode http
# 启用日志记录HTTP请求
option httplog
retries 3
# serverId对应的服务器挂掉后,强制定向到其他健康的服务器
option redispatch
# 前端的最大并发连接数(默认为2000)
# 其不能用于backend区段,对于大型站点来说,可以尽可能提高此值以便让haproxy管理连接队列,
# 从而避免无法应答用户请求。当然,此最大值不能超过“global”段中的定义。
# 此外,需要留心的是,haproxy会为每个连接维持两个缓冲,每个缓存的大小为8KB,
# 再加上其他的数据,每个连接将大约占用17KB的RAM空间,这意味着经过适当优化后 ,
# 有着1GB的可用RAM空间时将维护40000-50000并发连接。
# 如果指定了一个过大值,极端场景中,其最终所占据的空间可能会超过当前主机的可用内存,
# 这可能会带来意想不到的结果,因此,将其设定一个可接受值放为明智绝对,其默认为2000
maxconn 2000
# 连接超时(默认是毫秒,单位可以设置us,ms,s,m,h,d)
timeout connect 5000ms
# 客户端超时
timeout client 50000ms
# 服务器超时
timeout server 50000ms

# HAProxy的状态信息统计页面
listen admin_stats
# 绑定端口
bind 192.168.1.102:48800
#统计页面
stats uri /admin-status
# 设置统计页面认证的用户和密码,如果要设置多个,另起一行写入即可
stats auth admin:admin
mode http
# 启用日志记录HTTP请求
option httplog

# listen: 用于定义通过关联“前端”和“后端”一个完整的代理,通常只对TCP流量有用
listen mycat_servers
# 绑定端口
bind 192.168.1.102:3309
mode tcp
# 记录TCP请求日志
option tcplog
# 是否允许向server和client发送keepalive
option tcpka
# 后端服务状态检测
option httpchk OPTIONS * HTTP/1.1\r\n192.168.1.102:48700\ www
# 定义负载均衡算法
balance roundrobin
server mycat_01 10.44.173.30:8066 check port 48700 inter 2000ms rise 2 fall 3 weight 10
server mycat_02 10.51.92.145:8066 check port 48700 inter 2000ms rise 2 fall 3 weight 10
# 格式:server <name> <address>[:[port]] [param*]
# serser 在后端声明一个server,只能用于listen和backend区段。
# <name>为此服务器指定的内部名称,其将会出现在日志及警告信息中
# <address>此服务器的IPv4地址,也支持使用可解析的主机名,但要在启动时需要解析主机名至响应的IPV4地址
# [:[port]]指定将客户端连接请求发往此服务器时的目标端口,此为可选项
# [param*]为此server设定的一系列参数,均为可选项,参数比较多,下面仅说明几个常用的参数:
# weight:权重,默认为1,最大值为256,0表示不参与负载均衡
# backup:设定为备用服务器,仅在负载均衡场景中的其他server均不可以启用此server
# check:启动对此server执行监控状态检查,其可以借助于额外的其他参数完成更精细的设定
# inter:设定监控状态检查的时间间隔,单位为毫秒,默认为2000,
# 也可以使用fastinter和downinter来根据服务器端专题优化此事件延迟
# rise:设置server从离线状态转换至正常状态需要检查的次数(不设置的情况下,默认值为2)
# fall:设置server从正常状态转换至离线状态需要检查的次数(不设置的情况下,默认值为3)
# cookie:为指定server设定cookie值,此处指定的值将会在请求入站时被检查,
# 第一次为此值挑选的server将会被后续的请求所选中,其目的在于实现持久连接的功能
# maxconn:指定此服务器接受的最大并发连接数,如果发往此服务器的连接数目高于此处指定的值,
# 其将被放置于请求队列,以等待其他连接被释放
# 注意:多节点部署时node 、 description的值要做相应调整。

#启动服务

systemctl start haproxy.service

#编写haproxy健康守护进程避免程序假死造成的问题

#编写haproxy_status脚本

vi /opt/haproxy_status
while :
do
mycat=`mysql -h 192.168.1.102 -P3309 --connect-timeout=2 -uhaproxy -e "show databases" |grep singleusercenter |wc -l`
time=`date +%F_%T`
if [ "$mycat" = "1" ]; then
/bin/echo -e "HTTP/1.1 200 OK at $time" >> /tmp/haproxy_status.log
else
if [ "$mycat" = "1" ]; then
/bin/echo -e "HTTP/1.1 200 OK at $time" >> /tmp/haproxy_status.log
else
/bin/echo -e "HTTP/1.1 503 Service Unavailable at $time" >> /tmp/haproxy_status.log
systemctl stop haproxy
sleep 600
fi
fi
sleep 2
done

#赋予执行权限

chmod 755 /opt/haproxy_status

#安装screen

yum install screen -y

#执行守护进程

screen
/opt/haproxy_status &

#开启rsyslog的haproxy日志记录功能

#默认情况下 haproxy是不记录日志的,如果需要记录日志,还需要配置系统的syslog,在linux系统中是rsyslog服务。syslog服务器可以用作一个网络中的日志监控中心,rsyslog是一个开源工具,被广泛用于Linux系统以通过TCP/UDP协议转发或接收日志消息。
#安装rsyslog

yum install rsyslog -y

#配置rsyslog

#$ModLoad imudp 和 $UDPServerRun 514前面的 # 去掉
$ModLoad imudp
$UDPServerRun 514
#允许514端口接收使用UDP和TCP协议转发过来的日志

#创建haproxy.conf接受日志

vi /etc/rsyslog.d/haproxy.conf
local0.* /var/log/haproxy.log

#启动rsyslog服务

systemctl start rsyslog.service

#配置系统内核的IP包转发功能

vi /etc/sysctl.conf
net.ipv4.ip_forward = 1

#使配置生效

sysctl -p

#重启haproxy并设置开机启动

systemctl restart haproxy.service
systemctl enable haproxy.service

 

 

此条目发表在高可用负载均衡分类目录。将固定链接加入收藏夹。

发表评论

您的电子邮箱地址不会被公开。