什么是keepAlived
keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived是自动完成,不需人工干涉。
简介
Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
工作原理
Layer3,4,5工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下: Layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。 Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。 Layer5:Layer5对指定的URL执行HTTP GET。然后使用MD5算法对HTTP GET结果进行求和。如果这个总数与预期值不符,那么测试是错误的,服务器将从服务器池中移除。该模块对同一服务实施多URL获取检查。如果您使用承载多个应用程序服务器的服务器,则此功能很有用。此功能使您能够检查应用程序服务器是否正常工作。MD5摘要是使用genhash实用程序(包含在keepalived软件包中)生成的。 SSL_GET与HTTP_GET相同,但使用SSL连接到远程Web服务器。 MISC_CHECK:此检查允许用户定义的脚本作为运行状况检查程序运行。结果必须是0或1.该脚本在导演盒上运行,这是测试内部应用程序的理想方式。可以使用完整路径(即/path_to_script/script.sh)调用可以不带参数运行的脚本。那些需要参数的需要用双引号括起来(即“/path_to_script/script.sh arg 1 … arg n”)
作用
主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。 高可用web架构: LVS+keepalived+nginx+apache+php+eaccelerator(+nfs可选 可不选)
为什么要使用
当我们的服务器意外挂了之后,我们要怎么做? 当然是找一台新的机器,替代现有的机器,然后做新的环境部署,端口映射,域名解析等等一系列的工作,再将服务重新启动;但是如果这一系列的操作都是手动完成的,那么等你把这些工作搞好,可能服务已经停止个把小时了,这会儿估计运营早就提着菜刀架在你脖子上了; 但是如果使用了KeepAlived之后,然后提前将备用机准备好,当主的机器挂掉之后,自动将VIP给你切换到备用机,并且以邮件的形式告诉你说主服务已经挂了,你得赶紧恢复起来;这时候你就可以慢慢的去找主服务的问题,这时候并不会影响到你的正常业务运行。
IP规划:
42.51.78.140------虚拟VIP
42.51.78.141------Nginx-1
42.51.78.142------Nginx-2
42.51.78.143------Keepalived-1
42.51.78.144------Keepalived-2
设置主机名:
42.51.78.141------hostnamectl set-hostname web01
42.51.78.142------hostnamectl set-hostname web02
42.51.78.143------hostnamectl set-hostname lb01
42.51.78.144------hostnamectl set-hostname lb02
设置个性主机名颜色:
echo "PS1='\[\e[37;1m\][\[\e[36;40m\]\[\e[32;40m\]\u\[\e[33;40m\]@\[\e[31;40m\]\h \[\e[34;40m\]\w\[\e[37;1m\]]\\$\[\e[m\]'" >>.bashrc
在各节点执行—修改DNS
cat <<EOF> /etc/resolv.conf
nameserver 114.114.114.114
nameserver 8.8.8.8
EOF
在各节点执行—添加阿里yum源和清理yum缓存和生成新的yum缓存
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && yum clean all && yum makecache fast
在各节点执行—关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config && setenforce 0
在各节点执行—关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
在各节点都采用网络时间服务器 安装时间服务器软件
yum install -y chrony
修改配置文件/etc/chrony.conf
sed -i -e '/^server/d' -e '1aserver ntp.aliyun.com iburst\nserver tw.pool.ntp.org iburst' -e '/local stratum 10/clocal stratum 10\nbindcmdaddress 127.0.0.1\nbindcmdaddress ::1' /etc/chrony.conf
chronyd服务启动并自启
systemctl start chronyd && systemctl enable chronyd
检查323 udp端口的监听是否是:323*
ss -ntlup | grep 323
检查时间同步状态
chronyc sources
在42.51.78.141,42.51.78.142,42.51.78.143,42.51.78.144
机器上安装Nginx
yum install nginx -y
设置开机自启并启动
systemctl enable nginx --now
在42.51.78.141,42.51.78.142机器上修改index.html,方便访问nginx测试 在42.51.78.141机器上
echo This is Server 42.51.78.141 >/usr/share/nginx/html/index.html
在42.51.78.142机器上
echo This is Server 42.51.78.142 >/usr/share/nginx/html/index.html
官方格式:
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
}
server {
location / {
proxy_pass http://backend;
}
}
参数说明:
backend这个是一个名称,可以更改
server后边写IP默认是80端口,为了规范我们写上80端口
weight是权重,权重越大得到的请求比例就越多
下面为可用参数:
max_fails=5; 尝试连接后端主机失败的次数,最多尝试连接后端主机5次。
fail_timeout=10; 失败的超时时间,比如设置为10秒,那么就是每10秒去尝试连接一次。
max_conns=10; 限制最大连接数
在lb01和lb02机器上复制粘贴如下改好的nginx配置文件—< 负载均衡 >
vim /etc/nginx/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream web_pools {
server 42.51.78.141:80 weight=5;
server 42.51.78.142:80 weight=5;
#server 42.51.78.142:80 weight=5 backup; #这个为主备,不是负载均衡
}
server {
listen 80; #这是我们的web端口
server_name gky.myit.icu; #这是我们的域名
location / {
root html;
index index.html index.htm;
proxy_pass http://web_pools;
}
}
}
重启nginx服务:
systemctl restart nginx
在lb01机器上进行访问—nginx负载均衡已经轮询
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.141
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
以下功能测试—要修改lb01和lb02机器上的配置文件才可用于生产环境
一:如果两台Nginx主机硬件配置不一样,可以进行设置权重来进行均衡请求
我们这里测试把server 42.51.78.141:80 weight=5;的weight值改为1
重启nginx服务
systemctl restart nginx
在lb01机器上进行访问—nginx负载均衡已经有了效果
测试结论:
一个权重为5,一个权重为1,这样请求5次权重为5的机器,会请求一次权重为1的机器
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.141
二:其他场景可使用ip_hash算法 说明: 当使用ip_hash算法时,不能使用backup功能,权重功能也会失效,这样的效果主要用于会话保持,单台客户端一直保持某个IP连接。
$ vim /etc/nginx/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream web_pools {
ip_hash; #ip_hash算法
server 42.51.78.141:80 weight=5;
server 42.51.78.142:80 weight=5;
#server 42.51.78.142:80 weight=5 backup; #使用ip_hash算法不允许使用backup
}
server {
listen 80; #这是我们的web端口
server_name gky.myit.icu; #这是我们的域名
location / {
root html;
index index.html index.htm;
proxy_pass http://web_pools;
}
}
在lb01机器上进行访问—nginx的ip_hash算法已经有了效果
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
三:使用backup热备功能—当主nginx关掉,会立即切换到备nginx上
vim /etc/nginx/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream web_pools {
server 42.51.78.141:80 weight=5;
server 42.51.78.142:80 weight=5 backup; #这里是备
}
server {
listen 80; #这是我们的web端口
server_name gky.myit.icu; #这是我们的域名
location / {
root html;
index index.html index.htm;
proxy_pass http://web_pools;
}
}
}
重启nginx服务
systemctl restart nginx
在lb01机器上进行访问Nginx—发现请求都在主Nginx上
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.141
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.141
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.141
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.141
在42.51.78.141机器上停止主Nginx
systemctl stop nginx
在lb01机器上再次进行访问Nginx—发现已经切换到备Nginx上
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
在42.51.78.141机器上启动主Nginx
systemctl start nginx
在lb01机器上再次进行访问Nginx—发现已经切换到主Nginx上
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.141
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.141
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.141
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.141
在42.51.78.143和42.51.78.144机器上安装Keepalived 安装基础软件:
yum install -y gcc openssl-devel libnl libnl-devel libnfnetlink-devel net-tools vim wget pcre socat conntrack
安装keepalived
yum install -y keepalived
配置MASTER 在42.51.78.143服务器上操作 备份默认的keepalived配置
mv /etc/keepalived/keepalived.conf /tmp/keepalived-back.conf
编辑配置 vim /etc/keepalived/keepalived.conf 添加以下配置:
global_defs {
router_id LVS_01 # 设置lvs的id,在一个网络内应该是唯一的
}
vrrp_instance VI_1 {
state MASTER #指定Keepalived的角色,MASTER为主,BACKUP为备 记得大写
interface eth0 #网卡id 不同的电脑网卡id会有区别 可以使用:ip a查看
virtual_router_id 51 #虚拟路由编号,主备要一致
priority 150 #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
advert_int 1 #检查间隔,默认为1s
authentication { #这里配置的密码最多为8位,主备要一致,否则无法正常通讯
auth_type PASS
auth_pass 1997
}
virtual_ipaddress {
42.51.78.140/24 #定义虚拟IP(VIP)为42.51.78.140,可多设,每行一个
}
}
配置BACKUP 在42.51.78.144服务器上操作 备份默认的keepalived配置
mv /etc/keepalived/keepalived.conf /tmp/keepalived-back.conf
编辑配置 vim /etc/keepalived/keepalived.conf
添加以下配置:
global_defs {
router_id LVS_02 # 设置lvs的id,在一个网络内应该是唯一的
}
vrrp_instance VI_1 {
state BACKUP #指定Keepalived的角色,MASTER为主,BACKUP为备 记得大写
interface eth0 #网卡id 不同的电脑网卡id会有区别 可以使用:ip a查看
virtual_router_id 51 #虚拟路由编号,主备要一致
priority 100 #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
advert_int 1 #检查间隔,默认为1s
authentication { #这里配置的密码最多为8位,主备要一致,否则无法正常通讯
auth_type PASS
auth_pass 1997
}
virtual_ipaddress {
42.51.78.140/24 #定义虚拟IP(VIP)为42.51.78.140,可多设,每行一个
}
}
设置开机自启并启动和查看状态
systemctl enable keepalived --now && systemctl status keepalived
配置注意项 router_id
后面跟的自定义的ID在同一个网络下是一致的
state
state后跟的MASTER和BACKUP必须是大写;否则会造成配置无法生效的问题
interface
网卡ID;这个值不能完全拷贝我的配置,要根据自己的实际情况来看,可以使用
Priority
主备优先级
MASTER中配置的priority必须比BACKUP大;差值最好>=50
Authentication
主备之间的认证方式
一般使用PASS即可;主备配置必须一致;否则无法通讯,会导致裂脑;密码不能大于8位
virtual_ipaddress
配置的VIP;允许配置多个
检查lb01机器上主keepalived 启动后的配置情况
ip a
如果网卡下出现42.51.78.140(VIP)说明主已经启动成功
检查lb02机器上备keepalived 启动后的配置情况
ip a
备服务器的网卡下没有出现42.51.78.140(VIP)的ip,说明备服务正常
注:如果这里也出现了VIP,那么说明裂脑了,需要检查防火墙是否配置正确;是否允许了vrrp的多播通讯
问题回顾:
1:我在hyper-集群上,VIP的ip一直出现脑裂,用esxi集群就没问题
2:我在esxi集群上使用的VIP的ip出现不通,
原因一:arp没清理,
原因二:iptables -L查看规则,发现存在一个规则,这个可能是跟我安装了ipvsadm有关。 使用iptables -X和iptables -F进行清除即可。
-F 是清空指定某个 chains 内所有的 rule 设定。比方 iptables -F -t filter,那就是把 filter table 内所有的INPUT/OUTPUT/FORWARD chain 设定的规则都清空。
-X 是删除使用者自订 table 项目,一般使用 iptables -N xxx 新增自订 chain 后,可以使用 iptables -X xxx 删除之。
给Keepalived设置日志文件 原日志在此文件,比较杂乱
tail -f /var/log/messages
设置日志的配置信息
vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -S 0 -d"
设置syslog日志配置文件
vim /etc/syslog.conf
local0.* /var/log/keepalived.log
重启rsyslog
systemctl restart rsyslog
重启keepalived
systemctl restart keepalived
查看Keepalived日志信息
tail -f /var/log/keepalived.log
Keepalived高可用测试 停掉主keepalived
systemctl stop keepalived
VIP漂移至备keepalived
在lb02机器上通过命令:ip a|grep 42.51.78.140 可以查看到
此时网页访问:42.51.78.140依然能够正常访问;却分发依然正常 启动主keepalived
主服务恢复之后;VIP又会自动漂移回主keepalived服务
在lb01机器上通过命令:ip a|grep 42.51.78.140 可以查看到