内容涉及
高可用原理
高可用配置文件
高可用服务常见问题
实现高可用服务双主功能
keepalivd----------->解决单点故障
作用:
01. 利用keepalived软件管理配置lvs
02. 利用keepalived软件可以配合lvs对后端节点进行健康检查(后端的服务)
03. 利用keepalived实现高可用功能
keepalived原理:
利用vrrp(虚拟路由冗余协议)协议实现高可用功能
vrrp抓包信息
原理图:
- 确保负载均衡服务器和后端web集群可以通信
- 安装keepalived软件后两台主机VRRP进行通讯
- 通过VRRP协议根据优先级去竞选主备
- 主不间断向所有备机发送组播包224.0.0.18(组播包可以加密,推荐不要加密。)
- 主机会生成一个vip,当主机宕机的话会飘逸到备机上。
- 如果主机恢复的话,根据优先级重新恢复为主机。
keepalived服务部署过程
第一个历程: web集群节点进行配置
www.conf
server {
listen 80;
server_name www.oldboy.com;
location / {
root /html/www;
index index.php oldboy.jpg index.html index.htm;
}
location ~ \.php$ {
root /html/www;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}
测试lb01lb02能否正常的文本
web01
echo "www.oldboy.com web01" >/html/www/oldboy.html
web02
echo "www.oldboy.com web02" >/html/www/oldboy.html
web03
echo "www.oldboy.com web03" >/html/www/oldboy.html
负载均衡 lb01 lb02 进行web集群节点测试
[root@lb01 ~]# curl -H host:www.oldboy.com 10.0.0.7/oldboy.html
www.oldboy.com web01
[root@lb01 ~]# curl -H host:www.oldboy.com 10.0.0.8/oldboy.html
www.oldboy.com web02
[root@lb01 ~]# curl -H host:www.oldboy.com 10.0.0.9/oldboy.html
www.oldboy.com web03
[root@lb02 ~]# curl -H host:www.oldboy.com 10.0.0.7/oldboy.html
www.oldboy.com web01
[root@lb02 ~]# curl -H host:www.oldboy.com 10.0.0.8/oldboy.html
www.oldboy.com web02
[root@lb02 ~]# curl -H host:www.oldboy.com 10.0.0.9/oldboy.html
www.oldboy.com web03
第二个历程: 安装部署keepalived服务
yum install -y keepalived
第三个历程: 编写keepalived配置文件
lb01 配置信息
vim /etc/keepalived/keepalived.conf
/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs { --- 全局配置区域
notification_email { --- 当主服务器发生变化进行邮件通知
330882721@qq.com
}
notification_email_from 17778058507@163.com
smtp_server smtp.163.com
smtp_connect_timeout 30
router_id lb01 --- 表示高可用集群中节点身份信息(相当于ospf router id )
}
vrrp_instance oldboy { --- vrrp实例配置区域 家族
state MASTER --- 说明标识服务器为主服务器 (MASTER BACKUP)
interface eth0 --- 指定vip地址出现在哪个网卡上
virtual_router_id 62 --- 家族标识 62
priority 150 --- 决定服务器是否是主服务器 优先级越高越有可能成为主
advert_int 1 --- 间隔1s钟发送一个组播包,主备要一致
authentication { --- 身份认证 认证主服务真实性
auth_type PASS
auth_pass 1234
}
virtual_ipaddress { --- 生成虚拟IP地址信息
10.0.0.3
}
}
实际配置
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id lb01
}
vrrp_instance oldboy {
state MASTER
interface eth0
virtual_router_id 62
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
10.0.0.3
}
}
lb02 配置信息
vim /etc/keepalived/keepalived.conf
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs { --- 全局配置区域
notification_email { --- 当主服务器发生变化进行邮件通知
330882721@qq.com
}
notification_email_from 17778058507@163.com
smtp_server smtp.163.com
smtp_connect_timeout 30
router_id lb02 --- 表示高可用集群中节点身份信息
}
vrrp_instance oldboy { --- vrrp实例配置区域 家族
state BACKUP --- 说明标识服务器为主服务器 (MASTER BACKUP)
interface eth0 --- 指定vip地址出现在哪个网卡上
virtual_router_id 62 --- 家族标识 62
priority 100 --- 决定服务器是否是主服务器 优先级越高越有可能成为主
advert_int 1 --- 间隔1s钟发送一个组播包
authentication { --- 身份认证 认证主服务真实性
auth_type PASS
auth_pass 1234
}
virtual_ipaddress { --- 生成虚拟IP地址信息
10.0.0.3
}
}
实际配置
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id lb02
}
vrrp_instance oldboy {
state BACKUP
interface eth0
virtual_router_id 62
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
10.0.0.3
}
}
测试:
将lb01将挂起,模仿lb01宕机,查看lb02能否正常提供负载服务。
高可用服务常见问题:
脑裂问题
出现原因:
- a 服务配置问题: vrrp实例配置 (组播包发送)
- b 有安全策略影响主备通讯:
- c 物理线路出现问题 连接线路(心跳线)
总结: 备服务器收不到主服务器发送的vrrp组播包
解决问题的方法:
- a. 利用系统日志查看主备通讯问题
tail -f /var/log/messages - b. 利用防火墙命令, 配置允许组播包通过策略
- c. 多个心跳线做冗余
- d .监控及时报警:()
备服务器有vip出现,几种情况:
1) 正常主备切换
2) 出现脑裂
编写脚本,当检测到备服务器有虚拟IP时及时报警
vi /server/scripts/inotify_vip.sh
#!/bin/bash
ip a s eth0|grep "10.0.0.3" &>/dev/null
if [ $? -eq 0 ]
then
echo "备服务器产生的vip地址,请关注"|mail -s "keepalived_error" 330882721@qq.com
fi
vi /etc/mail.rc进行设置
systemctl restart postfix.service
负载均衡服务出现异常,高可用服务无法实现切换
负载均衡服务活着---keepalived服务活着
负载均衡服务死了---keepalived殉情
编写脚本
vim check_lb.sh
#!/bin/bash
count=$(ps -ef|grep -c [n]ginx) #grep随便加一个[]就把grep过滤的行也给去掉
if [ $count -lt 2 ]
then
systemctl stop keepalived
fi
只要nginx服务停止, 就立即切换
/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id lb01
}
vrrp_script check_web { --- 定义监控脚本信息
script "/server/scripts/check_lb.sh" --- 指定监控执行的脚本
interval 2 --- 脚本执行间隔周期
weight 2
}
vrrp_instance oldboy {
state MASTER
interface eth0
virtual_router_id 62
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
10.0.0.3
}
track_script {
check_web ------调用这个脚本
}
}
确认脚本有执行权限
chmod +x /server/scripts/check_lb.sh
keepalived服务需要进行重启
keepalived权重配置
权重数值: 正数
- 判断脚本: 执行结果信息
脚本执行为真(成功) 脚本返回值为0
优先级+weight求和运算
脚本执行为假(失败) 脚本返回不为0
优先级不变
权重数值: 负数
-
判断脚本: 执行结果信息
脚本执行为真(成功) 脚本返回值为0
优先级不变
脚本执行为假(失败) 脚本返回不为0
优先级-weight 求差运算
需求01: 当lb01 nginx服务停止, 将资源切换到lb02, 当lb01 nginx恢复, 自动抢占资源
nginx服务停止 lb01<lb02
脚本为假
优先级-weight < lb02nginx服务恢复 lb01>lb02
脚本为真
优先级 > lb02
测试代码:
if [ $count -lt 2 ]
then
exit 1
else
exit 0
fi
调整权重值
01. 调整权重值
02. 调整优先级
提高负载均衡服务安全性
第一个历程: 修改lb01 lb02 nginx配置文件
lb01 -- 主
server {
listen 10.0.0.3:80;#监听地址必须为本地网卡监听地址
server_name localhost;
include proxy_params;
location / {
proxy_pass http://default;
}
}
systemctl restart nginx-------->不能reload重启服务
lb02 -- 备
server {
listen 10.0.0.3:80;
server_name localhost;
include proxy_params;
location / {
proxy_pass http://default;
}
}
systemctl restart nginx
可以修改内核,让服务监听没有的地址
解决方法:
echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf
##/etc/sysctl.conf 加上
sysctl -p
利用高可用服务实现双主配置
原因:解决多个网站都通过一个负载均衡设备增加了一台负载均衡设备的压力。
可以实现不同的网站走不同的负载设备。
第一个历程: 修改keepalived配置文件
lb01 修改
vrrp_instance oldboy {
state MASTER
interface eth0
virtual_router_id 62
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
10.0.0.3
}
}
vrrp_instance oldgirl {
state BACKUP
interface eth0
virtual_router_id 63
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
10.0.0.4
}
}
lb02 修改
vrrp_instance oldboy {
state BACKUP
interface eth0
virtual_router_id 62
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
10.0.0.3
}
}
vrrp_instance oldgirl {
state MASTER
interface eth0
virtual_router_id 63
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
10.0.0.4
}
}
第二个历程: 修改lb01/02nginx配置文件
26 server {
27 listen 10.0.0.3:80;
28 server_name www.oldboy.com;
29 include proxy_params;
30 location / {
31 proxy_pass http://default;
32 }
33 }
34 server {
35 listen 10.0.0.4:80;
36 server_name bbs.oldboy.com;
37 include proxy_params;
38 location / {
39 proxy_pass http://default;
40 }
41 }