nginx负载均衡高可用
1.高可用
一般是指2台服务器启动着相同的业务系统,如果有一台服务器死机了,另外一台服务器能快速的接管,对于用户是无感知的。
2.高可用的软件
硬件
F5
软件
keepalived
heartbeat
MySQL指定的高可用软件
MGR
MHA
Redis指定的高可用软件
Redis-Cluster
Sentinel
3.Keepalived概述
keepalived是一个高可用软件,可以和任何应用配合使用
Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
4.keepalived实现原理
keepalived软件是基于VRRP协议实现,VRRP(虚拟路由冗余协议)主要用于解决单点故障
5.keepalived核心概念
1.选举:
通过选举投票,决定谁是主节点和备节点
2.抢占式、非抢占式:
当Master故障,Backup自动接管,那么Master恢复后夺权就是抢占式,没有夺权就是非抢占式
3.脑裂:
当两台服务器都认为自己是master,那么就会出现这种现象
脑裂的原因
1.服务器网线松动等网络故障
2.服务器硬件故障发生损坏现象而崩溃
3.主节点和备节点都开启了防火墙
## 解决脑裂故障的脚本
#!/bin/sh
vip=10.0.0.3
lb01_ip=10.0.0.5
while true;do
ping -c 2 $lb01_ip &>/dev/null
if [ $? -eq 0 -a `ip add|grep "$vip"|wc -l` -eq 1 ];then
echo "ha is split brain.warning."
else
echo "ha is ok"
fi
sleep 5
done
6.keepalived安装配置
环境准备
主机名 |
WanIP |
LanIP |
角色 |
应用 |
lb01 |
10.0.0.5 |
172.16.1.5 |
Master keepalived主节点 |
keepalived |
lb02 |
10.0.0.6 |
172.16.1.6 |
Backup keepalived备节点 |
keepalived |
部署keepalived(lb01 lb02)
1.安装keepalived
yum install -y keepalived
2.修改master配置文件
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs { #全局配置
router_id lb01 #标识身份->名称
}
vrrp_instance VI_1 {
state MASTER #标识角色状态
interface eth0 #网卡绑定接口
virtual_router_id 50 #虚拟路由id
priority 150 #优先级
advert_int 1 #监测间隔时间
authentication { #认证
auth_type PASS #认证方式
auth_pass 1111 #认证密码
}
virtual_ipaddress {
10.0.0.3 #虚拟的VIP地址
}
}
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
global_defs { #全局配置
router_id lb02 #标识身份->名称
}
vrrp_instance VI_1 {
state BACKUP #标识角色状态
interface eth0 #网卡绑定接口
virtual_router_id 50 #虚拟路由id
priority 100 #优先级
advert_int 1 #监测间隔时间
authentication { #认证
auth_type PASS #认证方式
auth_pass 1111 #认证密码
}
virtual_ipaddress {
10.0.0.3 #虚拟的VIP地址
}
}
keepalived配置区别 |
Master节点配置 |
Backup节点配置 |
router_id |
lb01 |
lb02 |
state |
MASTER |
BACKUP |
priority |
150 |
100 |
3.启动master和backup上的keepalived
systemctl start keepalived.service
4.查看master虚拟ip地址
5.停掉master上的keepalived查看虚拟ip是否到backup服务器上
[root@lb01 ~]# systemctl stop keepalived.service
非抢占式配置
1、两个节点的state都必须配置为BACKUP
2、两个节点都必须加上配置 nopreempt
3、其中一个节点的优先级必须要高于另外一个节点的优先级。
# keepalived配置
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
global_defs { #全局配置
router_id lb01 #标识身份->名称
}
vrrp_instance VI_1 {
state BACKUP #标识角色状态
interface eth0 #网卡绑定接口
nopreempt
virtual_router_id 50 #虚拟路由id
priority 150 #优先级
advert_int 1 #监测间隔时间
authentication { #认证
auth_type PASS #认证方式
auth_pass 1111 #认证密码
}
virtual_ipaddress {
10.0.0.3 #虚拟的VIP地址
}
}
[root@lb02 ~]# vim /etc/keepalived/keepalived.conf
global_defs { #全局配置
router_id lb02 #标识身份->名称
}
vrrp_instance VI_1 {
state BACKUP #标识角色状态
interface eth0 #网卡绑定接口
nopreempt
virtual_router_id 50 #虚拟路由id
priority 150 #优先级
advert_int 1 #监测间隔时间
authentication { #认证
auth_type PASS #认证方式
auth_pass 1111 #认证密码
}
virtual_ipaddress {
10.0.0.3 #虚拟的VIP地址
}
}
keepalived结合nginx做高可用
主机名 |
WanIP |
LanIP |
角色 |
应用 |
lb01 |
10.0.0.5 |
172.16.1.5 |
Master keepalived主节点、nginx负载均衡 |
keepalived、nginx |
lb02 |
10.0.0.6 |
172.16.1.6 |
Backup keepalived备节点、nginx负载均衡 |
keepalived、nginx |
web01 |
10.0.0.7 |
172.16.1.7 |
web网站 |
nginx、php |
web02 |
10.0.0.8 |
172.16.1.8 |
web网站 |
nginx、php |
关联nginx
1.编写脚本
nginx_count=$(ps -ef|grep [n]ginx|wc -l)
#1.判断Nginx是否存活,如果不存活则尝试启动Nginx
if [ $nginx_count -eq 0 ];then
systemctl start nginx
sleep 3
#2.等待3秒后再次获取一次Nginx状态
nginx_count=$(ps -ef|grep [n]ginx|wc -l)
#3.再次进行判断, 如Nginx还不存活则停止Keepalived,让地址进行漂移,并退出脚本
if [ $nginx_count -eq 0 ];then
systemctl stop keepalived
fi
fi
简化脚本
[root@lb01 ~]# vim check_web.sh
# /bin/sh
nginx_count=$(ps -ef |grep [n]ginx}|wc -l)
if [ $nginx_count -eq 0 ];then
systemctl stop keepalived
fi
2.配置两台负载均衡
[root@lb01 ~]# vim /etc/nginx/conf.d/wordpress.jl.com.conf
upstream blog.jl.com{
server 172.16.1.7;
server 172.16.1.8;
}
server {
listen 80;
server_name wordpress.jl.com;
location / {
proxy_pass http://blog.jl.com;
include proxy_params;
}
}
[root@lb02 ~]# vim /etc/nginx/conf.d/wordpress.jl.com.conf
upstream blog.jl.com{
server 172.16.1.7;
server 172.16.1.8;
}
server {
listen 80;
server_name wordpress.jl.com;
location / {
proxy_pass http://blog.jl.com;
include proxy_params;
}
}
keepalived关联nginx
1.修改keepalived配置文件
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
global_defs { #全局配置
router_id lb01 #标识身份->名称
}
vrrp_script check_web {
script "/root/check_web.sh"
interval 5
}
vrrp_instance VI_1 {
state BACKUP #标识角色状态
interface eth0 #网卡绑定接口
virtual_router_id 50 #虚拟路由id
priority 150 #优先级
advert_int 1 #监测间隔时间
authentication { #认证
auth_type PASS #认证方式
auth_pass 1111 #认证密码
}
virtual_ipaddress {
10.0.0.3 #虚拟的VIP地址
}
track_script {
check_web
}
}
2.给脚本添加执行权限
chmod +x check_web
3.将域名解析到vip上
10.0.0.3 wordpress.jl.com
4.浏览器访问网站
5.停掉lb01的nginx服务
systemctl stop nginx
6.继续访问网站