keepalived配置详解



high availability 高可用入门


  • 实现高可用集群常用的解决方案

 
 
1:VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议:keepalived
2:OpenAIS应用程序接口规范:Heartbeat、Corosync、Pacemaker

(三)Keepalived 详解

Alt text


  • 安装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提供共享目录,实现共享存储
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值