1.什么是Haproxy
HAProxy是一个使用C语言编写的自由及开放源代码软件[1],其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上
2.什么是KeepAlived
keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived是自动完成,不需人工干涉。
Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器
3.什么是Mycat
MyCat 是目前最流行的基于 java 语言编写的数据库中间件,是一个实现了 MySQL 协议 的服务器,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问, 而其后端可以用 MySQL 原生协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数 主流数据库服务器通信,其核心功能是分库分表。配合数据库的主从模式还可实现读写分离。 MyCat 是基于阿里开源的 Cobar 产品而研发,Cobar 的稳定性、可靠性、优秀的架构和 性能以及众多成熟的使用案例使得 MyCat 变得非常的强大。
4.Haproxy+KeepAlived+Mycat结构图
5.搭建 xinetd 服务
配置 MyCat 状态检查服务 在所有 MyCat(192.168.199.184/192.168.199.116)服务所在主机中增加状态检查服务脚 本。此操作为 HaProxy 提供对 MyCat 服务状态检查的依据。通过 xinetd,HAProxy 可以用 httpchk 来检测 Mycat 的存活状态。(xinetd 即 extended internet daemon,xinetd 是新一代的网络守护进程服务程序,又叫超级 Internet 服务器。经常用来管 理多种轻量级 Internet 服务。xinetd 提供类似于 inetd+tcp_wrapper 的功能,但是更加强大和 安全。xinetd 为 linux 系统的基础服务)
1.安装 xinetd
yum install -y xinetd
2.检查/etc/xinetd.conf 的末尾是否有 includedir /etc/xinetd.d ,没有就加上
vi /etc/xinetd.conf
3.创建/etc/xinetd.d 目录
检查 /etc/xinetd.d 目录是否存在,不存在则创建
mkdir /etc/xinetd.d/
4.增加 Mycat 存活状态检测服务配置
vi /etc/xinetd.d/mycat_status
service
说明:
service
6.添加 /usr/local/bin/mycat_status 服务脚本
vi /usr/local/bin/mycat_status
!
7. 给新增脚本赋予可执行权限
chmod 755 /usr/local/bin/mycat_status
8.在 /etc/services 中加入 mycat_status 服务
vi /etc/services
在末尾加入:
mycat_status 48700/tcp # mycat_status
保存后,重启 xinetd 服务 service xinetd restart
9.验证 mycat_status 服务是否成功启动
netstat -antup|grep 48700
10.测试脚本是否有效
/usr/local/bin/mycat_status
6.安装 HAProxy
1.上传 haproxy-1.7.1.tar.gz 到 Linux 并解压安装包
tar -zxf haproxy-1.7.1.tar.gz
2.安装编译依赖
yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
3.编译
cd haproxy-1.7.1
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 这三个包需要安装不然不支持
4.创建安装目录
mkdir /usr/local/haproxy
5.执行安装
make install PREFIX=/usr/local/haproxy
6.创建配置文件目录
mkdir -p /usr/local/haproxy/conf
mkdir -p /etc/haproxy/
7.添加配置文件并创建软连接
vi /usr/local/haproxy/conf/haproxy.cfg
global
ln -s /usr/local/haproxy/conf/haproxy.cfg /etc/haproxy/haproxy.cfg
8.拷贝错误页面资源并创建软连接(可选)
cp -r /root/upload/haproxy-1.7.1/examples/errorfiles /usr/local/haproxy/
ln -s /usr/local/haproxy/errorfiles /etc/haproxy/errorfiles
9.拷贝开机启动文件,并赋予权限
cp /root/upload/haproxy-1.7.1/examples/haproxy.init /etc/rc.d/init.d/haproxy
chmod +x /etc/rc.d/init.d/haproxy
10.添加 HAProxy 命令脚本软连接
ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin
11.设置 HAProxy 开机启动
chkconfig --add haproxy
chkconfig haproxy on
HAProxy 配置 MyCat 负载均衡集群:
haproxy.cfg说明:
vi /usr/local/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 haproxy1 ## 定义当前节点的名称,用于 HA 场景中多 haproxy 进程共享同一个 IP
地址时
description haproxy1 ## 当前实例的描述信息
## 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 ##统计页面
stats auth admin:admin ## 设置统计页面认证的用户和密码,如果要设置多个,另起一
行写入即可
mode http
option httplog ## 启用日志记录 HTTP 请求
## listen: 用于定义通过关联“前端”和“后端”一个完整的代理,通常只对 TCP 流量有用
listen mycat_servers
bind :3307 ## 绑定端口
mode tcp
option tcplog ## 记录 TCP 请求日志
option tcpka ## 是否允许向 server 和 client 发送 keepalive
option httpchk OPTIONS * HTTP/1.1rnHost: www ## 后端服务状态检测
### 向后端服务器的 48700 端口(端口值在后端服务器上通过 xinetd 配置)发送
OPTIONS 请求
### (原理请参考 HTTP 协议) ,HAProxy 会根据返回内容来判断后端服务是否可用. ### 2xx 和 3xx 的响应码表示健康状态,其他响应码或无响应表示服务器故障。
balance roundrobin ## 定义负载均衡算法,可用于"defaults"、"listen"和"backend"中,默
认为轮询方式
server mycat_01 192.168.199.184:8066 check port 48700 inter 2000ms rise 2 fall 3 weight
10
server mycat_02 192.168.199.116: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 的值要做相应调整
2.为 HAProxy 添加 Linux 系统用户
groupadd haproxy
useradd -g haproxy haproxy
3.创建 chroot 运行的路径
mkdir /usr/share/haproxy
4.开启 rsyslog 的 haproxy 日志记录功能
默认情况下 haproxy 是不记录日志的,如果需要记录日志,还需要配置系统的 syslog,
在 linux 系统中是 rsyslog 服务。syslog 服务器可以用作一个网络中的日志监控中心,rsyslog
是一个开源工具,被广泛用于 Linux 系统以通过 TCP/UDP 协议转发或接收日志消息。安装配
置 rsyslog 服务:
yum install -y rsyslog ## 没安装的情况下执行安装
vi /etc/rsyslog.conf
把 $ModLoad imudp 和 $UDPServerRun 514 前面的 # 去掉
$ModLoad imudp ## 是模块名,支持 UDP 协议
$UDPServerRun 514
##允许 514 端口接收使用 UDP 和 TCP 协议转发过来的日志,
##而 rsyslog 在默认情况下,正是在 514 端口监听 UDP
确认 #### GLOBAL DIRECTIVES #### 段中是否有 $IncludeConfig /etc/rsyslog.d/*.conf 没
有则增加上此配置。
rsyslog 服务会来此目录加载配置
cd /etc/rsyslog.d/
创建 haproxy 的日志配置文件
vi /etc/rsyslog.d/haproxy.conf
local0.* /var/log/haproxy.log
&~
注意:如果不加上面的的"&~"配置则除了在/var/log/haproxy.log 中写入日志外,也会 写入/var/log/message 文件中
配置保存后重启 rsyslog 服务 service rsyslog restart 等到 HAProxy 服务启动后,就能在/var/log/haproxy.log 中看到日志了
5.配置系统内核 IP 包转发规则
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
使配置生效
sysctl -p
6.启动 HAProxy
service haproxy start
ps -ef | grep haproxy
查看 HAProxy 提供的 WEB 统计应用
http://192.168.199.157:48800/admin-status
http://192.168.199.102:48800/admin-status
用户名和密码都是 admin,参考/usr/local/haproxy/conf/haproxy.cfg 配置文件。
注意:安装完一个 HAProxy 之后,可以通过 mysql 命令控制台直接测试访问 HAProxy。
命令为:mysql -uroot -p123456 -h192.168.199.157 -P3307
7.安装 Keepalived
官网: http://www.keepalived.org/
1.上传 Keepalived 到 Linux 服务器
2.安装依赖
yum install -y curl gcc openssl-devel libnl3-devel net-snmp-deve
3.解压并安装
tar -zxf keepalived-1.2.18.tar.gz
cd keepalived-1.2.18
mkdir /usr/local/keepalived
./configure --prefix=/usr/local/keepalived
make && make install
4.将 Keepalived 安装成 Linux 系统服务
因为没有使用 keepalived 的默认路径安装(默认是/usr/local) ,安装完成之后,需要做
一些工作复制默认配置文件到默认路径
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
复制 keepalived 服务脚本到默认的地址
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
设置 keepalived 服务开机启动
chkconfig keepalived on
5.修改 Keepalived 配置文件
5.1修改 haproxy1 服务器中的配置文件
vi /usr/local/keepalived/etc/keepalived/keepalived.conf
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {router_id haproxy1
}
vrrp_script chk_haproxy {script "/etc/keepalived/haproxy_check.sh"interval 2weight 2
}
vrrp_instance VI_1 {state BACKUP interface eth0 virtual_router_id 35 priority 120nopreempt advert_int 1 authentication {auth_type PASSauth_pass 1111 }track_script {chk_haproxy}virtual_ipaddress {192.168.199.190}
}
说明:
! Configuration File for keepalived
global_defs {
## keepalived 自带的邮件提醒需要开启 sendmail 服务。建议用独立的监控或第三方
SMTP
router_id haproxy1 ## 标识本节点的字符串,通常为 hostname,需要修改/etc/hosts
}
## 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 BACKUP ## 默认主设备(priority 值大的)和备用设备(priority 值小的)都
设置为 BACKUP,
## 由 priority 来控制同时启动情况下的默认主备,否则先启动的为主设备
interface eth0 ## 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同,
我的是 eth0
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.199.190 ## 虚拟 ip,可以定义多个,每行一个
}
}
5.2修改 haproxy2 服务器中的配置文件
vi /usr/local/keepalived/etc/keepalived/keepalived.conf
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {router_id haproxy2
}
vrrp_script chk_haproxy {script "/etc/keepalived/haproxy_check.sh"interval 2weight 2
}
vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 35priority 110advert_int 1authentication {auth_type PASSauth_pass 1111}track_script {chk_haproxy}virtual_ipaddress {192.168.199.190}
}
注意: 如果非抢占模式不生效, 在 Keepalived 的故障节点恢复后会再次导抢占
vip,从而因 vip 切换而闪断带来的风险(视频解说)。 按以上配置,配置了 Keepalived 非
抢占模式, 配置及注意点如下:
(1) 主设备、 从设备中的 state 都设置为 BACKUP
(2) 主设备、从设备中都不要配置 mcast_src_ip (本机 IP 地址)
(3) 默认主设备(priority 值大的 Keepalived 节点) 配置一定要加上 nopreempt,否
则非抢占不起作用
(4) 防火墙配置允许组播(主、备两台设备上都需要配置, keepalived 使用 224.0.0.18
作为 Master 和 Backup 健康检查的通信 IP)
6.提供 HAProxy 状态检查脚本
如果 haproxy 停止运行,尝试启动,如果无法启动则杀死本机的 keepalived 进 程,keepalied 将虚拟 ip 绑定到 BACKUP 机器上。
mkdir -p /usr/local/keepalived/log
vi /etc/keepalived/haproxy_check.sh
#!/bin/bash
START_HAPROXY="/etc/rc.d/init.d/haproxy start" STOP_HAPROXY="/etc/rc.d/init.d/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
chmod +x /etc/keepalived/haproxy_check.sh
7.启动 Keepalived
service keepalived start
关闭后,Keepalived 会自动启动 HAProxy。
关闭 Keepalived 命令 : service haproxy stop
查看 vip 命令: ip add
查看进程命令: ps -ef | grep haproxy
通过 VIP 访问 MYSQL:
8.MyCat 配置数据库集群
数据库集群负载策略:
第一种配置方案:
schema.xml
<?xml version="1.0"?>
缺陷:可能有 IO 延迟问题。
第二种配置方案:
<?xml version="1.0"?>
属性说明:
1.balance 属性
balance=”0”, 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上
balance=”1”,全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡
balance=”2”,所有读操作都随机的在 writeHost、 readhost 上分发。
balance=”3”, 所有读请求随机的分发到 writeHost 对应的 readhost 执行,writerHost
不负担读压力
2 writeType 属性
writeType=”0”, 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第
二个 writeHost,重新启动后已切换后的为准,切换记录在配置文件中:conf/dnindex.properties
(datanode index)
writeType=”1”,所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐
3 switchType 属性
也涉及到读写分离问题,可以解决 IO 延迟问题。
switchType='-1' 表示不自动切换
switchType='1' 默认值,表示自动切换
switchType='2' 基于 MySQL 主从同步的状态决定是否切换读写主机,心跳语句为 show
slave status。 当心跳监测获取的数据发现了 IO 的延迟,则读操作自动定位到 writeHost
中。如果心跳监测获取的数据没有 IO 延迟,则读操作自动定位到 readHost 中。建议为
不同的表格定位不同的 dataHost 节点。