keepalived介绍
Keepalived软件期初是专为LVS负载均衡软件设计的,用来管理并监控LVS几区系统汇总各个服务节点的状态,后来油加入了可以实现高可用的VRRP功能。因此Keepalived除了能管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、Mysql等)的高可用解决方案软件。
Keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router Redundancy Protocol(虚拟路由冗余协议)的缩写,VRRP协议出现的目的就是为了解决静态路由单点故障问题的。它能够保证当个别节点宕机时,整个网络可以不间断的运行。所以,Keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。
Keepalived软件的官方站点为http://www.keepalived.org
1.1 通过keepalived软件可实现的功能
1) 管理LVS负载均衡软件(keep和lvs配合)
2) 实现对LVS集群节点健康检查(lvs没有健康检查,需要keep)
3) 作为系统网络服务的高可用功能
4) 注意:通过man keepalived.conf ---获取keepalived软件功能功能说明信息
1.2 keepalived软件工作原理(如何实现一台负载坏了,keepalived自动切换)
vip地址:将多台主机逻辑组成一台,客户端访问逻辑vip地址
VRRP协议,全称是(Virtual router redundancy protocol)中文名为虚拟路由冗余协议,VRRP的出现是为了解决静态路由单点故障
VRRP是用ip组播的方式(默认组播地址224.0.0.18)实现高可用对之间通信的
工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的资源。备节点可以有多个,通过优先级竞选,但一般keepalived系统运维工作中都是一对的。
keepalived软件配置过程
1.3 环境准备说明
主机名 |
ip地址 |
lb01 |
10.0.0.5 |
lb02 |
10.0.0.6 |
web01 |
10.0.0.82 |
web02 |
10.0.0.83 |
web03 |
10.0.0.9 |
1.4 web集群服务器配置文件环境统一(web01,web02,web03配置均一致)
1.4.1 web集群配置如下
1.web01 web02 web03 配置相同
[root@ks_web01 conf]# vim nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
server {
listen 80;
server_name bbs.etiantian.org;
root html/bbs;
index index.html index.htm;
access_log logs/www_access.log main;
}
server {
listen 80;
server_name www.etiantian.org;
root html/www;
index index.html index.htm;
access_log logs/www_access.log main;
}
}
同步web02上的配置文件
同步web03上的配置文件
scp -rp /application/nginx/conf/nginx.conf 172.16.1.8:/application/nginx/conf/nginx.conf
scp -rp /application/nginx/conf/nginx.conf 172.16.1.9:/application/nginx/conf/nginx.conf
测试结果:
[root@bl01 conf]# curl -H host:www.etiantian.org 10.0.0.83/bingbing.html
www web02
[root@bl01 conf]# curl -H host:www.etiantian.org 10.0.0.82/bingbing.html
www web01
1.4.2 nginx反向代理负载均衡集群服务器配置文件环境统一
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream server_pools {
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80;
}
server {
listen 80;
server_name www.etiantian.org;
location / {
proxy_pass http://server_pools;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
server {
listen 80;
server_name bbs.etiantian.org;
location / {
proxy_pass http://server_pools;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
}
同步bl02 的nginx.conf配置文件
[root@bl01 conf]# scp -rp nginx.conf 172.16.1.6:/application/nginx/conf/nginx.conf
172.16.1.6:/application/nginx/conf/nginx.conf
测试访问bl01和bl02实现负载均衡:
[root@bl01 conf]# curl -H host:www.etiantian.org 10.0.0.5/bingbing.html
[root@bl01 conf]# curl -H host:www.etiantian.org 10.0.0.6/bingbing.html
部署Keepalived软件
1.5 keepalived软件安装部署
1. keepalived软件安装部署
### lb01 lb02负载服务器上均安装
yum install -y keepalived
rpm -qa keepalived
keepalived包含的主要配置:
[root@lb01 conf]# rpm -ql keepalived
/etc/keepalived --- keepalived主目录
/etc/keepalived/keepalived.conf --- keepalived服务主配置文件
/etc/rc.d/init.d/keepalived --- keepalived服务启动脚本文件
2. 进行默认配置测试
### 启动lb01 lb02的keepalived服务
/etc/init.d/keepalived start
[root@lb01 nginx]# ip a
说明:存在默认配置虚IP地址信息
通过抓包可以看到vrrp数据包信息
1.5.1 配置文件说明
### 前提需要了解配置文件内容信息(man keepalived.conf)
### 配置文件的组成部分
· GLOBAL CONFIGURATION ###全局定义(默认配置文件的01-13行)
· VRRPD CONFIGURATION ###虚拟ip的配置(默认配置文件15-30行)
· LVS CONFIGURATION ###配置与管理lvs
! Configuration File for keepalived ——注释信息
====================================================================================
global_defs { --- 全局配置标题
notification_email { --- 定义管理员邮箱信息,
976060283@qq.com
976060283@qq.com
}
notification_email_from [email protected] --- 定义利用什么邮箱发送邮件(如:163)
smtp_server smtp.163.com --- 定义邮件服务器信息
smtp_connect_timeout 30 --- 定义邮件发送超时时间
router_id oldboy01 --- (重点参数)局域网keepalived主机身份标识信息
#每一个keepalived主机身份标识信息唯一
}
====================================================================================
vrrp_instance VI_1 { --- vrrp协议相关配置(vip地址设置)
state MASTER --- keepalived角色描述(状态)信息,可以配置参数(MASTER BACKUP)
interface eth0 --- 表示将生成虚IP地址,设置在指定的网卡上(一般为外网卡)
virtual_router_id 51 --- 表示keepalived家族标识信息
priority 100 --- keepalived服务竞选主备服务器优先级设置(越大越优先)
advert_int 1 --- 主服务组播包发送间隔时间
authentication { --- 主备主机之间通讯认证机制,
auth_type PASS --- 采用明文认证机制
auth_pass 1111 --- 编写明文密码(用于主备认证)
}
virtual_ipaddress { --- 设置虚拟IP地址信息
10.0.0.3
}
}
1.5.2 搭建基础的keepalived配置文件
#主lb01 的配置:
global_defs {
router_id lb01
}
vrrp_instance oldboy_43 {
state MASTER
interface eth0
virtual_router_id 43
priority 150
advert_int 1 ——必须与备服务器保持一致
authentication {
auth_type PASS
auth_pass 6666
}
virtual_ipaddress {
10.0.0.3
}
}
虚拟IP地址显示信息:
默认显示信息:inet 10.0.0.3/32 scope global eth0
修改显示信息为:inet 10.0.0.3/24 scope global secondary eth0:1
#lb02 的配置:
global_defs {
router_id lb02
}
vrrp_instance oldboy_43 {
state BACKUP
interface eth0
virtual_router_id 43
priority 100
advert_int 1 ——必须与主服务器保持一致
authentication {
auth_type PASS
auth_pass 6666
}
virtual_ipaddress {
10.0.0.3
}
}
说明:主备服务器配置文件区别
01. router_id 不同
02. state BACKUP 不同
03. priority 不同
说明:进行抓包观察配置效果;并且对比两个负载均衡服务器的配置文件
1.5.3 主备服务器都启动keepalived服务
[root@bl01 conf]# /etc/init.d/keepalived start
Starting keepalived: [ OK ]
[root@bl02 conf]# /etc/init.d/keepalived start
Starting keepalived: [ OK ]
/etc/init.d/keepalived restart ——重启
/etc/init.d/keepalived stop ——停止
/etc/init.d/keepalived reload ——重新加载(如果服务stop后,reload是起不来的)
1.5.4 裂脑概念,原因,解决方法
===========================================================================================
编写脚本解决脑裂:
编写脚本的思路:
# 如何进行监控脑裂情况?
# 01. 在什么服务器上进行监控?
# 在备服务器上进行监控
# 02. 监控什么信息?
# 备上面出现vip(虚ip)情况
1) 脑裂情况会出现
2) 正常主备切换也会出现
===========================================================================================
方法一:
#!/bin/bash
IP_info=$(ip a|grep -c eth0)
while true
do
if [ $IP_info -gt 2 ]
then
echo "keepalived error!!!"
fi
sleep 3;
done
===================================================================================
方法二:
#!/bin/bash
#desc: jiankong lb02 vip
if [ `ip a s eth0 |grep -c "10.0.0.3"` == 1 ];then
echo "baojing"
fi
1.6 拍错过程思路(最小化拍错)
拍错过程:
1. 利用负载均衡服务器,在服务器上curl所有节点信息
2. curl负载均衡服务器地址,可以实现负载均衡
3. windows绑定虚拟ip,浏览器上进行测试
查看keepalived日志文件:
tail -f /var/log/messages
PS:所有服务通用拍错方法:
1. 对服务非常了解
2. 没有办法的解决办法
01. 重启服务
02. 重新部署
03. 重装系统
1.7 更改nginx反向代理只监听vip地址
#提高安全性:
通过nginx反向代理只监听vip地址,不监听物理地址
通过修改配置文件监听窗口,lb02k无法监听(没有vip),需要修改内核文件
# 更改nginx反向代理只监听vip地址 :
10.0.0.3
第一个里程碑:修改反向代理服务配置文件,只监听vip地址
####lb01 lb02 nginx.conf (1 和2 都配置监听地址)
vim nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
upstream server_pools {
server 10.0.0.7;
server 10.0.0.8;
server 10.0.0.9;
}
server {
listen 10.0.0.3:80;
server_name www.etiantian.org;
location / {
proxy_pass http://server_pools;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
access_log logs/access_www.log main;
}
server {
listen 10.0.0.3:80;
server_name blog.etiantian.org;
location / {
proxy_pass http://server_pools;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
access_log logs/access_blog.log main;
}
}
说明(安全性问题):在修改反向代理服务器配置文件监听地址时,多个server都需要配置监听地址,否则仍旧使用默认监听所有
第二个里程碑:lb02上不存在vip地址,无法监听,解决方法:需要修改内核文件(见下面)
[root@lb02 conf]# /application/nginx/sbin/nginx -t
nginx: the configuration file /application/nginx-1.10.2/conf/nginx.conf syntax is ok
nginx: [emerg] bind() to 10.0.0.3:80 failed (99: )
nginx: configuration file /application/nginx-1.10.2/conf/nginx.conf test failed
说明:nginx 没有办法监听本地不存在的vip地址
解决方法:
方法一:echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf ---实现监听本地不存在的vip地址
##/etc/sysctl.conf 加上
sysctl -p
方法二: echo "1" >/proc/sys/net/ipv4/ip_nonlocal_bind
第三个里程碑:进行测试
curl -H host:www.etiantian.org 10.0.0.3/bingbing.html
web403报错原因:
01 服务端阻止客户端访问
02 服务端首页文件不存在
1.8 让keepalived监控nginx反向代理服务
###vip什么时候 什么条件 才会飘走 ?
1.当服务器宕机
2.防火墙
#### nginx挂了
如何让keepalived监控nginx nginx挂了,keepalived跟着殉情
####第一个里程碑-keepalived监控nginx条件
1.如何nginx挂了---我如何知道nginx挂了?
1)端口
2)进程
netstat -lnptu|grep nginx|wc -1
如果统计结果不等于1,说明nginx没起来
那么就 /etc/init.d/keepalived stop
##> -gt greater than
##>= -ge greater equal
##< -lt less than
##<= -le less equal
##== -eq equal
##!= -ne no equal
####第二个里程碑-根据条件-书写脚本
vim check_web.sh
#!/bin/bash
#name: check_web.sh
#desc: check nginx and kill keepalived
if [ `netstat -lntpu |grep nginx |wc -l` -ne 1 ];then
/etc/init.d/keepalived stop
fi
####第三个里程碑-添加执行权限
[root@lb02 conf]# chmod +x /server/scripts/check_web.sh
[root@lb02 conf]# ll /server/scripts/check_web.sh
-rwxr-xr-x 1 root root 174 Mar 30 17:47 /server/scripts/check_web.sh
####第四个里程碑-测试
执行脚本
停止nginx,看keepalived是否停止
并查看vip是否飘到lb02
####第五个里程碑-放入到keepalived.conf
####下面是lb02的配置文件 lb01上面自己修改下。
global_defs {
router_id LVS_02
}
vrrp_script check_web {
script "/server/scripts/check_web.sh" --- 表示将一个脚本信息赋值给变量check_web
interval 2 --- 执行监控脚本的间隔时间
weight 2 --- 利用权重值和优先级进行运算,从而降低主服务器优先级
使之变为备服务器
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3/24 dev eth0 label eth0:1
}
track_script {
check_web
}
}
####第六个里程碑-测试
/etc/init.d/keepalived reload
先确定当前nginx服务已开启,并且可以查看到vip信息
然后停止 nginx服务,在查看vip是否飘到lb02
1.9 双实例双主模式的配置(互为主备)
原理图:
lb01 双主配置文件信息
[root@lb01 scripts]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb01
}
vrrp_instance oldboy_43_1 {
state MASTER
interface eth0
virtual_router_id 43
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 6666
}
virtual_ipaddress {
10.0.0.3
}
}
vrrp_instance oldboy_43_2 {
state BACKUP
interface eth0
virtual_router_id 44
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 6666
}
virtual_ipaddress {
10.0.0.4
}
}
lb02 双主配置信息
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb02
}
vrrp_instance oldboy_43_1 {
state BACKUP
interface eth0
virtual_router_id 43
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 6666
}
virtual_ipaddress {
10.0.0.3
}
}
vrrp_instance oldboy_43_2 {
state MASTER
interface eth0
virtual_router_id 44
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 6666
}
virtual_ipaddress {
10.0.0.4
}
}
测试抓包进行分析:
www.etiantian.org
可以实现负载均衡,而且主服务器宕掉后, vip会飘到备服务器继续工作
小伙伴们可以关注我的微信公众号:linux运维菜鸟之旅
关注“中国电信天津网厅”公众号,首次绑定可免费领2G流量,为你的学习提供流量!