high availability 高可用入门
实现高可用集群常用的解决方案
1:VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议:keepalived
2:OpenAIS应用程序接口规范:Heartbeat、Corosync、Pacemaker
(三)
Keepalived 详解
安装Keepalived
1:RPM包安装
yum install -y keepalived
2:源码安装
yum install -y openssl-devel
wget
http:
//www.keepalived.org/software/keepalived-1.3.5.tar.gz
tar xf keepalived
-1.3
.5.ta
cd keepalived
-1.3
.5/
.
/configure --prefix=/usr
/local/keepalived
-1.3
.5 --sysconfdir=
/etc/keepalived
主从模型配置文件示例
(实现haproxy高可用)- 主节点配置文件示例
# 全局配置段
! Configuration File for keepalived
# 实现邮件报警功能,但是这里必须首先在/etc/mail.rc中配置好第三方的邮件代理服务器
global_defs {
notification_email {
307443272@qq.com
}
notification_email_from yinhuanyi_cn@
163.com
smtp_server smtp
.163.com
smtp_connect_timeout
30
# 给节点取一个id名
router_id haproxy1
# 指定传递心跳信息的多播地址,每个同学的心跳地址必须不一样
vrrp_mcast_group4
224.0
.100
.18
}
# 定义一个监控haproxy是否正常工作的脚本,监控脚本需要写在公共区,如果haproxy服务挂了,那么就将其优先级减去20,这样这个节点就会成为备节点,IP就会漂移
vrrp_script
check_haproxy_available {
# 检查haproxy是否工作正常
script
"killall -0 haproxy"
# 多长时间检测一次
interval
2
# 如果haproxy停止服务,将此节点的优先级减20
weight
-20
}
# 配置虚拟路由第一个实例
vrrp_instance
VI_1 {
# haproxy1为主
state MASTER
interface enp0s3
virtual_router_id
51
priority
100
# 检查间隔,默认1秒 VRRP心跳包的发送周期,单位为s 组播信息发送间隔,两个节点设置必须一样
advert_int
1
# 指定心跳信息传递过程中的认证方式
authentication {
auth_type PASS
auth_pass
1111
}
# 指定VIP
virtual_ipaddress {
# 这里最好给VIP取一个别名,这样就能够使用ifconfig命令查看VIP了
192.168
.23
.100/
24 dev enp0s3 label enp0s3:
0
}
# 下面三行的意义是当VIP发生漂移的时候调用,例如notify_master表示:当VIP漂移到master节点,调用后面的脚本
notify_master
"/root/notify.sh master"
notify_backup
"/root/notify.sh backup"
notify_fault
"/root/notify.sh fault"
# 这里就是调用在公共区定义的监控haproxy健康状态的脚本
track_script {
check_haproxy_available
}
}
- 从节点配置文件示例
! Configuration File for keepalived
global_defs {
notification_email {
307443272@qq.com
}
notification_email_from
yinhuanyi_cn@163.com
smtp_server smtp.163.com
smtp_connect_timeout 30
router_id haproxy2
# 需要修改
vrrp_mcast_group4 224.0.100.18
}
vrrp_script
check_haproxy_available {
script
"killall -0 haproxy"
interval
2
weight -
20
}
vrrp_instance
VI_1 {
state BACKUP
# 需要修改
interface enp0s3
virtual_router_id
51
priority
95
# 需要修改
advert_int
1
authentication {
auth_type PASS
auth_pass
1111
}
virtual_ipaddress {
192.168.
23.100/
24 dev enp0s3 label enp0s3:
0
}
notify_master "/root/notify.sh master
"
notify_backup "/root/notify.sh backup
"
notify_fault "/root/notify.sh fault
"
track_script {
check_haproxy_available
}
}
- 当VIP在haproxy1和haproxy2节点漂移的时候,调用的脚本
notify.sh
如下
#!/bin/bash
#
contact=
'307443272@qq.com'
notify() {
mailsubject=
"$(hostname) to be $1 and vip is floating "
mailbody=
"$(date +'%F %T'),$(hostname) change to be $1"
echo
"$mailbody" | mail
-s
"$mailsubject"
$contact
}
case
$1
in
master)
# 发送报警邮件
notify master
# 如果成为主节点,需要启动haproxy
systemctl start haproxy.service
echo
"send mail to $contact "
;;
backup)
# 发送报警邮件
notify backup
# 如果成为备节点,先强制重启一下haproxy
systemctl restart haproxy.service
echo
"send mail to $contact"
;;
fault)
notify fault
;;
*)
echo
"usage: $(basename $0) {master|backup|fault}"
;;
esac
- 既然是邮件报警提示,那么需要配置/etc/mail.rc文件
# 注意smtp-auth-password的值不是登入邮件服务器的密码,而是代理使用第三方邮件客户端发送邮件的授权码哦
set from=yinhuanyi_cn
@163.com smtp=smtp
.163.com
set smtp-auth-user=yinhuanyi_cn
@163.com smtp-auth-password=xxxxxxxx
set smtp-auth=login
主主模型配置文件示例
(实现haproxy高可用)- 主节点配置文件示例
! Configuration File
for keepalived
# 实现邮件报警功能,但是这里必须首先在/etc/mail.rc中配置好第三方的邮件代理服务器
global_defs {
notification_email {
307443272@qq.com
}
notification_email_from yinhuanyi_cn@
163.com
smtp_server smtp.
163.com
smtp_connect_timeout
30
# 给节点取一个id名
router_id haproxy1
# 指定传递心跳信息的多播地址
vrrp_mcast_group4
224.0.
100.18
}
# 定义一个监控haproxy是否正常工作的脚本,监控脚本需要写在公共区,如果haproxy服务挂了,那么就将其优先级减去20
# 这样这个节点就是备节点,IP就会漂移
vrrp_script check_haproxy_available {
script
"killall -0 haproxy"
interval
2
weight -
20
}
# 配置虚拟路由第一个实例
vrrp_instance VI_1 {
# haproxy1为主
state MASTER
interface enp0s3
virtual_router_id
51
priority
100
advert_int
1
authentication {
auth_type PASS
auth_pass
1111
}
virtual_ipaddress {
# 这里最好给VIP取一个别名,这样就能够使用ifconfig命令查看VIP了
192.168.
23.100/
24 dev enp0s3
label enp0s3:
0
}
# 下面三行的意义是当VIP发生漂移的时候调用,例如notify_master表示:当VIP漂移到master节点,调用后面的脚本
notify_master
"/root/notify.sh master"
notify_backup
"/root/notify.sh backup"
notify_fault
"/root/notify.sh fault"
# 这里就是调用在公共区定义的监控haproxy健康状态的脚本
track_script {
check_haproxy_available
}
}
# 配置虚拟路由第二个实例
vrrp_instance VI_2 {
# 第二个实例中,是从节点
state BACKUP
interface enp0s3
virtual_router_id
52
priority
95
advert_int
1
authentication {
auth_type PASS
auth_pass
2222
}
virtual_ipaddress {
192.168.
23.101/
24 dev enp0s3
label enp0s3:
1
}
# 下面三行的意义是当VIP发生漂移的时候调用,例如notify_master表示:当VIP漂移到master节点,调用后面的脚本
notify_master
"/root/notify.sh master"
notify_backup
"/root/notify.sh backup"
notify_fault
"/root/notify.sh fault"
track_script {
check_haproxy_available
}
}
- 从节点配置文件示例
! Configuration File
for keepalived
global_defs {
notification_email {
307443272@qq.com
}
notification_email_from yinhuanyi_cn@
163.com
smtp_server smtp.
163.com
smtp_connect_timeout
30
router_id haproxy2
# 需要修改
vrrp_mcast_group4
224.0.
100.18
}
vrrp_script check_haproxy_available {
script
"killall -0 haproxy"
interval
2
weight -
20
}
vrrp_instance VI_1 {
state BACKUP
# 需要修改
interface enp0s3
virtual_router_id
51
priority
95
# 需要修改
advert_int
1
authentication {
auth_type PASS
auth_pass
1111
}
virtual_ipaddress {
192.168.
23.100/
24 dev enp0s3
label enp0s3:
0
}
notify_master
"/root/notify.sh master"
notify_backup
"/root/notify.sh backup"
notify_fault
"/root/notify.sh fault"
track_script {
check_haproxy_available
}
}
vrrp_instance VI_2 {
state MASTER
# 需要修改
interface enp0s3
virtual_router_id
52
priority
100
# 需要修改
advert_int
1
authentication {
auth_type PASS
auth_pass
2222
}
virtual_ipaddress {
192.168.
23.101/
24 dev enp0s3
label enp0s3:
1
}
notify_master
"/root/notify.sh master"
notify_backup
"/root/notify.sh backup"
notify_fault
"/root/notify.sh fault"
track_script {
check_haproxy_available
}
}
(四)
Keepalived + haproxy 双主模型实现WordPress动静分离
配置Haproxy反代服务,实现动静分离
- 配置haproxy1的主配置文件/etc/haproxy/haproxy.cfg ,haproxy2的配置文件与haproxy1的一样
# 全局配置段
global
# 指定日志记录路径,这个local2和local3是需要在/etc/rsyslog.conf文件中指定的,指定了日志存储路径之后,需要重启rsyslog服务哦
log
127.0.
0.1 local2
log
127.0.
0.1 local3
chroot /var/
lib/haproxy
pidfile /var/run/haproxy.pid
maxconn
4000
user haproxy
group haproxy
daemon
# 设置后台运行4个haproxy进程会报出警告,所以注释
# nbproc 4
# turn on stats unix socket
stats socket /var/
lib/haproxy/stats
# 这里是默认的选项,如何在listen段,backend段,frontend段中将这些选项按需求重新制定
defaults
# 指定默认的模式mode,
mode http
# 调用全局的日志区
log global
option httplog
option dontlognull
option http-server-close
# 在后端的web服务中可以记录客户端的源IP地址
option forwardfor except
127.0.
0.0/
8
# 虽然使用cookie机制,但是当调度到后端的服务器不用时,强行调离至其他的后端服务器
option redispatch
retries
3
timeout http-request
10s
timeout queue
1m
timeout connect
10s
timeout client
1m
timeout server
1m
timeout http-keep-alive
10s
timeout check
10s
# 指定接受3000个并发
maxconn
30000
# haproxy的统计页面配置段
listen stats
bind *:
9001
mode http
stats enable
# 如果不设置URI,默认是/haproxy?stats
stats uri /stats
# 指定认证提示符
stats realm HAProxy\ statistics
# 指定用户名和密码
stats auth
yhy:xxxxxxxx
stats refresh
20
stats admin
if TRUE
#隐藏统计页面上HAProxy的版本信息
stats hide-version
# 指定后端php动态资源主机组,后端的动态资源不做缓存,直接将请求反代值后端的app servers中
backend phpservers_backend
# 这里使用了cookie粘性机制,当客户端没有被设置cookie值的时候,通过轮询调度到app servers主机上
balance roundrobin
# 指定我们需要插入的cookie的key为PHP,使用的是insert方法,indirect表示如何会话已经有cookie值了,将不会再次发送cookie到客户端,nocache表示如果客户端和haproxy之间有代理,那么指定nocache将不会将所有的请求都发往一台服务器,会清除缓存
cookie PHP insert indirect nocache
# server后面的cookie参数是给当前server指定cookie值,使得同一个用户的请求始终发往同一台服务器
server phpserver1
192.168.
23.23:
8000 check weight
1 cookie phpserver1 maxconn
300
server phpserver2
192.168.
23.24:
8000 check weight
2 cookie phpserver2 maxconn
600
# 指定后端varnish静态资源缓存主机组
backend httpd_backend
# 对用户请求的URL做哈希计算,使得同一URL的请求始终发往同一台服务器,基于URL做哈希计算,使得varnish缓存的命中率提高,uri算法适用于后端为缓存服务器的场景
balance uri
# 使用的的hash类型是动态hash,即一致性哈希算法
hash-
type consistent
# 使用http协议做健康状态检查,默认是tcp协议
option httpchk
server httpd_server1
192.168.
23.17:
7000 check maxconn
10000
server httpd_server2
192.168.
23.18:
7000 check maxconn
10000
# 指定当请求到达的时候,如果是静态资源的请求,将请求调度到varnish主机组,默认是发送给后端web动态资源主机组
frontend myservers_frontend
bind *:
80
# 设置一个访问控制规则,只要请求路径为静态资源的都会被匹配到,并且发往varnish主机组
acl httpd_page path_beg -i /static /images /javascript /stylesheets
acl httpd_page path_end -i .jpg .gif .png .jpeg .css .js .html .txt .htm .ico
use_backend httpd_backend
if httpd_page
# 没有被匹配到的请求全部发往phpservers_backend服务器
default_backend phpservers_backend
在静态服务器上将WordPress的动态文件全部删除
在动态服务器上将WordPress的静态文件全部删除
如果自己还有时间,可以试试将DNS服务绑定一个域名,使用DNS服务器的负载均衡功能,轮询调度到两台haproxy服务器上
1:独立实现Keepalived + haproxy 双主模型,将WordPress动静分离,将Discuz动静分离
温馨提示:Discuz源码下载地址:
http:
//www.discuz.net/forum.php(尽量下载低版本,高版本的PHP版本要求高)
2:在原有的架构基础之上,实现 Keepalived + MySQL 的高可用,且试着使用NFS提供共享目录,实现共享存储