一.场景需求
1.通用场景如下:
如图场景是通常使用nginx代理负载均衡来实现web服务的负载均衡的,但是单个nginx会存在单点的隐患,如果nginx挂掉,那么后端的服务都将无法被访问,这样就导致用户体验度极差。所以实现反向代理负载均衡的nginx服务的高可用是必不可少的。
2.实现高可用的场景如下:
实现高可用的方案如下:
1.阿里云的slb
注意:阿里云目前已经不再提供vip,目前使用阿里云的云服务器实现高可用,只能通过云解析DNS对访问进行调度,或通过全球负载均衡解决方案实现跨地域容灾备份来实现slb的单点问题。
最佳实践:
您可以在一个地域内的多个可用区或多个地域内部署负载均衡实例和后端ECS实例,然后使用云解析DNS对访问进行调度。
2.硬件负载均衡器(如:F5、Radware)
3.软件方式实现高可用或负载均衡 例如:keepalived、LVS...
二.keepalived简介
1.keepalived介绍
keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点状态,后来又加入了可以实现高可用的VRRP功能.此,keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx,Haproxy,MySQL等)的高可用解决方案软件.
keepalived软件主要是通过VRRP协议实现高可用功能的.VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,他能够保证当个别节点宕机时,整个网络可以不间断地运行.Keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能
介绍来源链接:https://www.jianshu.com/p/ab6735606178
2.keepalived的工作原理
Keepalived 是一种高性能的服务器高可用或热备解决方案,Keepalived 可以用来防止服务器单点故障的发生,通过配合 Nginx 可以实现 web 前端服务的高可用。
Keepalived 以 VRRP 协议为实现基础,用 VRRP 协议来实现高可用性(HA)。VRRP(Virtual RouterRedundancy Protocol)协议是用于实现路由器冗余的协议,
VRRP 协议将两台或多台路由器设备虚拟成一个 设备,对外提供虚拟路由器 IP(一个或多个),而在路由器组内部,如果实际拥有这个对外 IP 的路由器如果工作正常的话就是 MASTER,
或者是通过算法选举产生,MASTER 实现针对虚拟路由器 IP 的各种网络功能, 如 ARP 请求,ICMP,以及数据的转发等;其他设备不拥有该虚拟 IP,状态是 BACKUP,
除了接收 MASTER 的 VRRP 状态通告信息外,不执行对外的网络功能。当主机失效时,BACKUP 将接管原先 MASTER 的网络功能。
VRRP 协议使用多播数据来传输 VRRP 数据,VRRP 数据使用特殊的虚拟源 MAC 地址发送数据而不是自身 网卡的 MAC 地址,VRRP 运行时只有 MASTER 路由器定时发送 VRRP 通告信息,
表示 MASTER 工作正常以及虚 拟路由器 IP(组),BACKUP 只接收 VRRP 数据,不发送数据,如果一定时间内没有接收到 MASTER 的通告信 息,各 BACKUP 将宣告自己成为 MASTER,
发送通告信息,重新进行 MASTER 选举状态。
总结来源链接:https://www.jianshu.com/p/da26df4f7d60
3.VRRP协议简介
VRRP,全称Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议
VRRP的出现就是为了解决静态路由的单点故障问题
VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的.
VRRP通过竞选机制来实现虚拟路由器的功能,所有的协议报文都是通过IP多播(Multicast)包(默认的多播地址224.0.0.18)形式发送的
虚拟路由器由VRID(范围0-255)和一组IP地址组成,对外表现为一个周知的MAC地址,:00-00-5E-00-01-{VRID}.
所以,在一个虚拟路由器中,不管谁是Master,对外都是相同的MAC和IP(称之为VIP).
客户端主机并不需要因Master的改变修改自己的路由配置.对它们来说,这种切换是透明的.
在一组虚拟路由器中,只有作为Master的VRRP路由器会一直发送VRRP广播包,此时Backup不会抢占Master
当Master不可用时,Backup就收不到来自Master的广播包了,此时多台Backup中优先级最高的路由器会抢占为Master.
这种抢占是非常快速的(可能只有1秒甚至更少),以保证服务的连续性,处于安全性考虑,VRRP数据包使用了加密协议进行了加密.
协议简介来源链接:https://www.jianshu.com/p/ab6735606178
三.场景规划及ip地址分配
四.服务安装
1.安装nginx
注意:两台负载服务器都需要安装
1)nginx官方源安装nginx
[root@lb01 ~]# cd /etc/yum.repos.d/
[root@lb01 /etc/yum.repos.d]# vim nginx.repo
这里使用vim nginx.repo创建nginx.repo源文件,按i输入如下内容:
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
按ECS输入:wq保存文件并退出
[root@lb01 ~]# yum -y install nginx
2)配置nginx代理负载均衡
[root@lb01 /etc/yum.repos.d]# cd
[root@lb01 ~]# cd /etc/nginx/conf.d/
[root@lb01 /etc/nginx/conf.d]# vim ssl.conf
这里配置了证书,使用vim ssl.conf创建ssl.conf文件,按i输入如下内容:
upstream ssl_pools {
server 172.16.1.7:80;
server 172.16.1.8:80;
server 172.16.1.9:80;
}
upstream jpress_pools {
server 172.16.1.7:8080;
server 172.16.1.8:8080;
server 172.16.1.9:8080;
}
server {
listen
server_name blog.oldboy.com;
rewrite ^(.*) https://$server_name$1 redirect;
}
server {
listen 443 ssl;
server_name blog.oldboy.com;
ssl_certificate ssl_key/server.crt;
ssl_certificate_key ssl_key/server.key;
location / {
proxy_pass http://ssl_pools;
include proxy_params;
}
}
server {
listen 80;
server_name zh.oldboy.com;
rewrite ^(.*) https://$server_name$1 redirect;
}
server {
listen 443 ssl;
server_name zh.oldboy.com;
ssl_certificate ssl_key/server.crt;
ssl_certificate_key ssl_key/server.key;
location / {
proxy_pass http://ssl_pools;
include proxy_params;
}
}
server {
listen 80;
server_name jpress.oldboy.com;
rewrite ^(.*) https://$server_name$1 redirect;
}
server {
listen 443 ssl;
server_name jpress.oldboy.com;
ssl_certificate ssl_key/server.crt;
ssl_certificate_key ssl_key/server.key;
location / {
proxy_pass http://jpress_pools;
include proxy_params;
}
}
按ESC输入:wq保存文件并退出
3)启动nginx
[root@lb01 /etc/nginx/conf.d]# cd
[root@lb01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 ~]# systemctl start nginx
2.安装keepalived
注意:两台负载服务器都需要安装
1)yum安装keepalived
[root@lb01 ~]# yum -y insatll keepalived
2)配置keepalived配置文件
注意:keepalived是自带监控执行脚本模块的,用户可以根据需求进行定义和监控对应的服务。这里keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。如果 脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加。如果脚本执行结果非 0,并且 weight 配置的值小于 0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。
1.主负载服务器配置
[root@lb01 ~]# cd /etc/keepalived/
[root@lb01 /etc/keepalived]# vim keepalived.conf
global_defs {
router_id lb01 # 标识本节点的字符串,通常为 hostname
}
vrrp_script check_web {
script "/server/scripts/check_web.sh"#检测nginx状态的脚本
interval 5 #检测的间隔时间
weight 50 #条件成立的权重,权重50
}
global_defs {
interval 5
vrrp_instance VI_1 {
#主机名lb01的使用如下配置
state BACKUP # 主节点默认一般设置为 MASTER,对应的备份节点为BACKUP默认的是抢占式的,生产环境中使用的是非抢占式。这里设置的事非抢占式的。
nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
priority 150 ##节点优先级,值范围 0-254,MASTER 要比 BACKUP 高
interface eth0 # 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同,我的是 eth0
virtual_router_id 51 # 虚拟路由的 ID 号,两个节点设置必须一样,可选 IP 最后一段使用, 相同的 VRID 为一个组,他将决定多播的 MAC 地址,eth0值的获取可以在机器上执行ifconfig命令得到
advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认1s
#以下为公共配置
authentication {
auth_type PASS
auth_pass 1111 # 真实生产,按需求对应该过来
}
virtual_ipaddress {
10.0.0.3 #虚拟ip两个节点都需要设置
}
#将 track_script 块加入 instance 配置块
track_script {
check_nginx #执行nginx监控的脚本
}
}
2.备负载均衡器配置
[root@lb02 ~]# cd /etc/keepalived/
[root@lb02 /etc/keepalived]# vim keepalived.conf
global_defs {
router_id lb02
}
vrrp_script check_nginx {
script "/server/scripts/check_nginx.sh"
interval 5
weight 50
}
vrrp_instance VI_1 {
#如果主机名为lb02则使用如下配置
state BACKUP
nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
priority 100
interface eth0
virtual_router_id 51
advert_int 1
#以下为公共配置
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
#将 track_script 块加入 instance 配置块
track_script {
check_nginx #执行nginx监控的脚本
}
}
脚本内容如下:
[root@lb01 ~]# cat /server/scripts/check_nginx.sh
#!/bin/bash
nginxpid=$(ps -C nginx --no-header|wc -l)
#1.判断 Nginx 是否存活,如果不存活则尝试启动 Nginx
if [ $nginxpid -eq 0 ];then
systemctl start nginx
sleep 3
#2.等待 3 秒后再次获取一次 Nginx 状态
nginxpid=$(ps -C nginx --no-header|wc -l)
#3.再次进行判断, 如 Nginx 还不存活则停止 Keepalived,让地址进行漂移,并退出脚本
if [ $nginxpid -eq 0 ];then
systemctl stop keepalived
fi
fi
3)启动keepalived
[root@lb01 /etc/keepalived]# systemctl start keepalived
[root@lb02 /etc/keepalived]# systemctl start keepalived
5.高可用测试
1.测试vip的漂移
1)正常情况如下:
[root@lb01 ~]# ip add
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:5c:d9:68 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet 10.0.0.3/32 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe5c:d968/64 scope link
valid_lft forever preferred_lft forever
3: eth1: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:5c:d9:72 brd ff:ff:ff:ff:ff:ff
inet 172.16.1.5/24 brd 172.16.1.255 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe5c:d972/64 scope link
valid_lft forever preferred_lft forever
[root@lb02 ~]# ip add
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e0:49:94 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.6/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fee0:4994/64 scope link
valid_lft forever preferred_lft forever
3: eth1: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e0:49:9e brd ff:ff:ff:ff:ff:ff
inet 172.16.1.6/24 brd 172.16.1.255 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fee0:499e/64 scope link
valid_lft forever preferred_lft forever
2)关闭lb01的keepalived查看ip的漂移
[root@lb01 ~]# systemctl stop keepalived.service
[root@lb01 ~]# ip add
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:5c:d9:68 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe5c:d968/64 scope link
valid_lft forever preferred_lft forever
3: eth1: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:5c:d9:72 brd ff:ff:ff:ff:ff:ff
inet 172.16.1.5/24 brd 172.16.1.255 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe5c:d972/64 scope link
valid_lft forever preferred_lft forever
[root@lb02 ~]# ip add
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e0:49:94 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.6/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet 10.0.0.3/32 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fee0:4994/64 scope link
valid_lft forever preferred_lft forever
3: eth1: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e0:49:9e brd ff:ff:ff:ff:ff:ff
inet 172.16.1.6/24 brd 172.16.1.255 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fee0:499e/64 scope link
valid_lft forever preferred_lft forever
2.实际场景测试
1)正常的vip是在lb01,访问的结果如下:
验证vip所在位置:
[root@lb01 ~]# ip add
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:5c:d9:68 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet 10.0.0.3/32 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe5c:d968/64 scope link
valid_lft forever preferred_lft forever
3: eth1: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:5c:d9:72 brd ff:ff:ff:ff:ff:ff
inet 172.16.1.5/24 brd 172.16.1.255 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe5c:d972/64 scope link
valid_lft forever preferred_lft forever
2)修改文件导致nginx挂掉
说明:这里修改lb01节点的nginx的配置文件设置语法错误,之后重启nginx导致nginx故障,之后测试vip漂移,以及真实站点的访问。
nginx故障如下:
[root@lb01 ~]# systemctl restart nginx
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.
查看vip的漂移情况:
[root@lb01 ~]# ip add
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:5c:d9:68 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe5c:d968/64 scope link
valid_lft forever preferred_lft forever
3: eth1: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:5c:d9:72 brd ff:ff:ff:ff:ff:ff
inet 172.16.1.5/24 brd 172.16.1.255 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe5c:d972/64 scope link
valid_lft forever preferred_lft forever
[root@lb02 ~]# ip add
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e0:49:94 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.6/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet 10.0.0.3/32 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fee0:4994/64 scope link
valid_lft forever preferred_lft forever
3: eth1: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e0:49:9e brd ff:ff:ff:ff:ff:ff
inet 172.16.1.6/24 brd 172.16.1.255 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fee0:499e/64 scope link
valid_lft forever preferred_lft forever
刷新访问测试结果:
jpress部署请参照链接文档:
https://www.jianshu.com/p/d9bf3283b7c8
wordpress部署请参考:
https://www.jianshu.com/p/75589a125252