使用HaProxy实现Mycat的高可用
需要增加 mycat 服务的状态检测脚本
开放相应的检测端口,以提供给 HAProxy 对 MyCat 的服务状态进行检测判断
第一步:安装xinetd( 实现MyCat心跳检测 端口48700)
通过 xinetd,HAProxy 可以用 httpchk 来检测 MyCat 的存活状态。
xinetd 即 extended internet daemon,xinetd 是新一代的网络守护进程服务程序,又叫超级 Internet 服务器。经常用来管理多种轻量级 Internet 服务。
1、如果 xinetd 还没有安装,可使用如下命令安装:
# yum install xinetd
2、检查/etc/xinetd.conf 的末尾是否有 includedir /etc/xinetd.d ,没有就加上
# vi /etc/xinetd.conf
3、检查 /etc/xinetd.d 目录是否存在,不存在刚创建
# mkdir /etc/xinetd.d/
4、增加 MyCat 存活状态检测服务配置
# touch /etc/xinetd.d/mycat_status
# vi /etc/xinetd.d/mycat_status
增加以下内容(chmod 777 /etc/xinetd.d/mycat_status)
service mycat_status
{
flags = REUSE
socket_type = stream
port = 48700
wait = no
user = root
server =/usr/local/bin/mycat_status
log_on_failure += USERID
disable = no
}
5、添加 /usr/local/bin/mycat_status 服务脚本
# touch /usr/local/bin/mycat_status
# vi /usr/local/bin/mycat_status
增加以下内容:
#!/bin/bash
#/usr/local/bin/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=`/usr/local/mycat/bin/mycat status | grep 'not running' | wc -l`
if [ "$mycat" = "0" ]; then
/bin/echo -e "HTTP/1.1 200 OK\r\n"
else
/bin/echo -e "HTTP/1.1 503 Service Unavailable\r\n"
fi
6、给新增脚本赋予可执行权限
# chmod 777 /usr/local/bin/mycat_status
7、在 /etc/services 中加入 mycat_status 服务
# vi /etc/services
在末尾加入:(vim 使用shift +g 到文本末尾)
mycat_status 48700/tcp # mycat_status
保存后,重启 xinetd 服务
# service xinetd restart
8、验证 mycat_status 服务是否成功启动
# netstat -antup|grep 48700
第二步:安装HAProxy( 实现MyCat负载均衡)
HAProxy 支持 TCP(第四层)和 HTTP(第七层)应用的代理,本节课程我们使用 HAProxy 来做 MyCat的负载均衡代理使用的是 TCP 模式。
在 4 层模式下 HAProxy 仅在客户端和服务器之间转发双向流量。HAProxy配置简单,拥有非常不错的服务器健康检查功能,当其代理的后端服务器出现故障,HAProxy 会自动将该服务器摘除,故障恢复后会自动将该服务器加入进来。
HAProxy 的安装
1、下载(或上传) haproxy-1.5.16.tar.gz 到 /usr/local,解压安装
[root@edu-haproxy-01 src]# tar -zxvf haproxy-1.5.16.tar.gz
[root@edu-haproxy-01 src]# cd haproxy-1.5.16
2、如需了解安装注意点,可查看 HAProxy 的软件说明
[root@edu-haproxy-01 haproxy-1.5.16]# less README
3、安装编译所需的依赖包
# yum install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
4、编译
# make TARGET=linux2628 ARCH=x86_64 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 PREFIX=/usr/local/haproxy
## TARGET 是指定内核版本,高于 2.6.28 的建议设置为 linux2628,Linux 操作系统内核版本查看命令# uname -r, ARCH 指定
系统架构,openssl pcre zlib 这三个包需要安装不然不支持
5、创建安装目录 /usr/local/haproxy
# mkdir /usr/local/haproxy
6、执行安装
[root@edu-haproxy-01 haproxy-1.5.16]# make install PREFIX=/usr/local/haproxy
7、创建配置文件目录
# mkdir -p /usr/local/haproxy/conf
# mkdir -p /etc/haproxy/
8、从配置文件模版复制配置文件,并添加配置文件软连接
# cp /usr/local/haproxy-1.5.16/examples/haproxy.cfg /usr/local/haproxy/conf/
# ln -s /usr/local/haproxy/conf/haproxy.cfg /etc/haproxy/haproxy.cfg
9、拷贝错误页面,并添加目录软连接(HTTP 模式选配)
# cp -r /usr/local/haproxy-1.5.16/examples/errorfiles /usr/local/haproxy/
# ln -s /usr/local/haproxy/errorfiles /etc/haproxy/errorfiles
10、拷贝开机启动文件,并赋予可执行权限
# cp /usr/local/haproxy-1.5.16/examples/haproxy.init /etc/rc.d/init.d/haproxy
# chmod +x /etc/rc.d/init.d/haproxy
11、添加 haproxy 命令脚本软连接
# ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin
12、设置 HAProxy 开机启动
# chkconfig --add haproxy
# chkconfig haproxy on
HaProxy的配置
conf/haproxy.cfg
## global配置中的参数为进程级别的参数,通常与其运行的操作系统有关
global
log 127.0.0.1 local0 info ## 定义全局的syslog服务器,最多可以定义2个
### local0是日志设备,对应于/etc/rsyslog.conf中的配置,默认回收info的日志级别
#log 127.0.0.1 local1 info
chroot /usr/share/haproxy ## 修改HAProxy的工作目录至指定的目录并在放弃权限之前执行
### chroot() 操作,可以提升 haproxy 的安全级别
#group haproxy ## 同gid,不过这里为指定的用户组名
#user haproxy ## 同uid,但这里使用的为用户名
daemon ## 设置haproxy后台守护进程形式运行
nbproc 1 ## 指定启动的haproxy进程个数,
### 只能用于守护进程模式的haproxy;默认为止启动1个进程,
### 一般只在单进程仅能打开少数文件描述符的场中中才使用多进程模式
maxconn 4096 ## 设定每个haproxy进程所接受的最大并发连接数,
### 其等同于命令行选项"-n","ulimit-n"自动计算的结果正式参照从参数设定的
# pidfile /var/run/haproxy.pid ## 进程文件(默认路径 /var/run/haproxy.pid)
node edu-haproxy-01 ## 定义当前节点的名称,用于HA场景中多haproxy进程共享同一个IP地址时
description edu-haproxy-01 ## 当前实例的描述信息
## defaults:用于为所有其他配置段提供默认参数,这默认配置参数可由下一个"defaults"所重新设定
defaults
log global ## 继承global中log的定义
mode http ## mode:所处理的模式 (tcp:四层 , http:七层 , health:状态检查,只会返回OK)
### tcp: 实例运行于纯tcp模式,在客户端和服务器端之间将建立一个全双工的连接,
#### 且不会对7层报文做任何类型的检查,此为默认模式
### http:实例运行于http模式,客户端请求在转发至后端服务器之前将被深度分析,
#### 所有不与RFC模式兼容的请求都会被拒绝
### health:实例运行于health模式,其对入站请求仅响应“OK”信息并关闭连接,
#### 且不会记录任何日志信息 ,此模式将用于相应外部组件的监控状态检测请求
option httplog
retries 3
option redispatch ## serverId对应的服务器挂掉后,强制定向到其他健康的服务器
maxconn 2000 ## 前端的最大并发连接数(默认为2000)
### 其不能用于backend区段,对于大型站点来说,可以尽可能提高此值以便让haproxy管理连接队列,
### 从而避免无法应答用户请求。当然,此最大值不能超过“global”段中的定义。
### 此外,需要留心的是,haproxy会为每个连接维持两个缓冲,每个缓存的大小为8KB,
### 再加上其他的数据,每个连接将大约占用17KB的RAM空间,这意味着经过适当优化后 ,
### 有着1GB的可用RAM空间时将维护40000-50000并发连接。
### 如果指定了一个过大值,极端场景中,其最终所占据的空间可能会超过当前主机的可用内存,
### 这可能会带来意想不到的结果,因此,将其设定一个可接受值放为明智绝对,其默认为2000
timeout connect 5000ms ## 连接超时(默认是毫秒,单位可以设置us,ms,s,m,h,d)
timeout client 50000ms ## 客户端超时
timeout server 50000ms ## 服务器超时
## HAProxy的状态信息统计页面
listen admin_stats
bind :48800 ## 绑定端口
stats uri /admin-status ## 统计页面URI
stats auth admin:admin ## 设置统计页面认证的用户和密码,如果要设置多个,另起一行写入即可
mode http
option httplog ## 启用日志记录HTTP请求
## listen: 用于定义通过关联“前端”和“后端”一个完整的代理,通常只对TCP流量有用
listen mycat_servers
bind :3388 ## 绑定端口
mode tcp
option tcplog ## 记录TCP请求日志
option tcpka ## 是否允许向server和client发送keepalive
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www ## 后端服务状态检测
### 向后端服务器的48700端口(端口值在后端服务器上通过xinetd配置)发送 OPTIONS 请求
### (原理请参考HTTP协议) ,HAProxy会根据返回内容来判断后端服务是否可用.
### 2xx 和 3xx 的响应码表示健康状态,其他响应码或无响应表示服务器故障。
balance roundrobin ## 定义负载均衡算法,可用于"defaults"、"listen"和"backend"中,默认为轮询方式
server mycat_01 192.168.25.100:8066 check port 48700 inter 2000ms rise 2 fall 3 weight 10
server mycat_02 192.168.25.101: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:指定此服务器接受的最大并发连接数,如果发往此服务器的连接数目高于此处指定的值,
#####其将被放置于请求队列,以等待其他连接被释放
创建 chroot 运行的路径
mkdir /usr/share/haproxy
开启Haproxy的日志记录功能
默认情况下 haproxy 是不记录日志的,如果需要记录日志,还需要配置系统的 syslog,在 linux 系
统中是 rsyslog 服务。
# yum install rsyslog
# vi /etc/rsyslog.conf
添加以下
$ModLoad imudp ## 是模块名,支持 UDP 协议
$UDPServerRun 514
$IncludeConfig /etc/rsyslog.d/*.conf
# cd /etc/rsyslog.d/ ## rsyslog 服务会来此目录加载配置
# touch haproxy.conf ## 创建 haproxy 的日志配置文件
# vi /etc/rsyslog.d/haproxy.conf
增加以下内容:(等到 HAProxy 服务启动后,就能在/var/log/haproxy.log 中看到日志了)
local0.* /var/log/haproxy.log
&~
配置保存后重启 rsyslog 服务
# service rsyslog restart
配置系统内核的 IP 包转发功能
# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
使配置生效
# sysctl -p
HaProxy的命令
监控:http://192.168.25.100:48800/admin-status (请求负载均衡端口3388自配)
测试启动:/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg(这种方式 只能通过kill关闭)
连接测试:mysql -p -h 192.168.25.100 -P 3388
service haproxy start 启动
service haproxy stop 停止
service haproxy restart 重启