#随着业务增长,对于后端数据库的压力越来越大,尤其是个人信息中心等超级大表,超过千万级别的表,我们决定通过分库分表来减轻压力,这就需要在前面加代理,后来调研到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