查找文件
文件名
root@ubuntu:~# find / -name "keepalived.service"
/data/softs/keepalived-2.2.4/keepalived/keepalived.service
/usr/lib/systemd/system/keepalived.service
安装
所有应用都在data下边
服务在/data/server下边
相关配置文件在/data/conf下边
docker应用在/data/docker下边
mysql为啥有两个日志系统
二进制安装三步走
1.config
2.make
3.修改服务配置文件
4.修改服务启动文件
nginx中用proxy_pass,+location实现路由跳转功能
为什莫开发运维环境中错误
命令解释器中无此命令
nginx
503是一种HTTP状态码。英文名503 Service Unavailable与404(404 Not Found)是同属一种网页状态出错码。前者是服务器不可访问时给客户端的一种状态,后者是访问了服务器不存在的资源。
404服务器不存在
503是第一次运行nginx时的报错,是文件找不到,是nginx首页文件找不到
虚拟IP要绑定在物理网卡上
ubuntu默认网卡名称是en0开头
centos默认网卡是enu66667
vim /etc/netplan/01-netcfg.yaml#k
1高可用keepalives
1.1、集群简介
类型 | 解析 |
高扩展集群 | 在当前业务环境集群中,所有的主机节点都处于正常的工作活动状态,它们共同承担起用户的请求带来的工作负载压力,保证用户的正常访问。 |
高可用集群 | 在当前业务环境集群中,所有的主机节点都处于正常的工作活动状态,它们共同承担起用户的请求带来的工作负载压力,保证用户的正常访问。 |
高性能集群 | 基于前两种技术实现的集群基础上,高效利用这些主机资源,结合某些特有的技术方案,提供的强大的计算能力,从而实现特定用户 |
1.1.2高可用指标
高可用集群是基于高扩展基础上的一个更高层次的网站稳定性解决方案。网站的稳定性体现在两个方面:网站可用性和恢复能力
网站可用性
对于网站可用性来说,它主要有这么一个指标来评判:
A = MTBF/(MTBF+MTTR)
MTBF(Mean Time Between Failure),即平均故障间隔时间,表示产品多长时间出现一次问题。
MTTR(Mean Time To Restoration),即平均恢复时间,表示产品从故障状态到稳定状态的维修花费时间。
A值是一个介于0~1的值,我们用这个值来表示网站正常运行时间的百分比,业界用 N 个9 来量化可用
性, 最常说的就是类似 “4个9(也就是99.99%)” 的可用性。常见的级别如下:
恢复能力
所谓的恢复能力,指的是一个网站从发生故障到故障修复这个过程的能力,而这个能力涉及到两个子内容:数
据恢复能力和业务恢复能力。
数据恢复能力 RPO(Recovery Point Obejective)
是指业务系统所允许的在灾难过程中的最大数据丢失量,用来衡量高可用系统的数据冗余备份能力。
例如,恢复到灾难发生前最后一次数据备份的数据状态。
系统恢复能力 RTO(Recovery Time Objective)
是指应用系统从灾难状态恢复到物理系统环境可运行状态所需的时间,用来衡量高可用系统的恢复能力。
例如,服务器重启、数据库重启、数据恢复、应用回归正常运行。
网络恢复能力 NRO(Network Recovery Objective)
是指网络系统从灾难状态恢复到网络可连接状态所需的时间,用来衡量高可用系统的网络恢复能力。
例如,用户在灾难后可以连接到灾备中心的时间。
业务恢复能力 RAO(Recovery Access Objective)
是指业务系统从灾难状态恢复到可运行状态所需的时间,用来衡量高可用系统的业务恢复能力。
例如,用户在灾难后,可以感受到灾难前的业务应用状态。
1.1.2高可用方式
基础知识
高可用保证网站接口的稳定性,通过虚拟接入口,将真实请求转发到不同地址(主从)进尔将请求转发到后续高扩展集群中。
VIP虚拟网卡接口技术,在高可用的时候,虚拟网卡附加在后端真是接口上边,这两个接口一个做主一个做从,共同接受VIP打过来的信息。
集群模式一般有:主备,双主模式,集群模式
1.1.2.1主备模式
后端高可用结点运行一致的服务实例,正常情况下,VIP配置在主节点上,只有作为主的Active结点响应用户的请求,当主节点故障,备用结点Passive自动接管一切,当主节点恢复后,通过自动或者手动方式,用户的请求重新有主节点来接管,整个过程用户感受不到任何影响。
1.1.2.2双主模式
后端的高可用结点运行各自的服务实例,都可以正常接收用户访问请求,当A结点故障,他会将访问请求自动转移到正常运行的B结点上,从而保证不对用户产生影响。
1.1.2.3集群模式
在这种模式下,当主节点故障时候,后备结点主机会通过某些策略,从中选择一个结点,作为临时主节点,接管所有请求。原来的主节点恢复的时候,通过多种策略来响应。
以上模式均会用到的时间同步ntp与心跳检测 vrrp
VRRP:
虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是由IETF提出的解决局域网中配置静态网关出现单点故障现象的路由协议,其本质上是一种路由容错协议。VRRP将局域网内的一组路由器虚拟为单个路由器。我们称该路由器组为VRRP备份组,它根据优先级选择一个Master主路由器,承担网关功能,其他路由器称为Backup从路由器。基于VRRP虚拟出来是路由我们称之为虚拟路由,该虚拟路由有独立的IP地址(VIP)。
1.1.3LVS简介
LVS是Linux Virtual Server的简称,即Linux虚拟服务器,它是由国内的章文松博士于1998年发起的源软件项目,目前已被纳入到Linux内核中,进行统一管理。目前LVS项目已经非常成熟了,被应用于ge种高扩展的服务中,有13中算法。
它主要有三部分组成: 最前端的负载均衡层、中间的应用服务层、后端的数据共享层。
在整个LVS负载均衡架构中,尽管整个机器内部有非常多的应用服务主机结点组成,并相应用户的请求,但是在用户看来,所有的内部应用服务都是透明的,用户只是在使用一个虚拟服务器提供的高扩展服务,这也是LVS项目核心目标所在
lvs模式 :NAT,DR.
LVS结合IPVS内核模块实现为中间层的应用集群服务提供负载均衡
1.2、keepalived
Keepalived其实就是通过整合和加强LVS和VRRP软件,从而得到的一套适用于高扩展和高可用的软件整合解决方案。
1.2.1核心模块:
这两个内核模块却是keepalived实现负载均衡和高可用性功能的核心模块,其中NETLINK主要用于提供高可用性的路由及网络功能,IPVS主要实现虚拟主机的负载均衡功能。
1.2.2工作流程
keepalived一般部署与两台机器上,服务启动后,加载专用的配置文件,调用LVS创建服务器,并更具配置启用对外统一访问接口并基于相关脚本服务进行监控。
为保证服务对外的统一接口的高可用,vrrp协议将物理的route进行统一管理,并创建一个虚拟路由地址,作为外网的统一出口,物理Router内部通过VRRP机制进行内部通信,保证虚拟路由地址永远可用。
Keepalived其实就是通过整合和加强LVS和VRRP软件,从而得到的一套适用于高扩展和高可用的软件整合解决方案,们要实现Keepalived的功能,需要在用户空间安装相应的软件才可以。
Keepalived软件是有C语言编写的一个开源软件项目,其本质是一个路由软件。
Keepalived基于ipvs功能进行二次整合实现负载均衡功能。(nginx中upstram)
Keepalived基于VRRP协议进行二次整合实现高可用性功能。(nginx中location+proxy——pass)
Keepalived借助于大量的功能脚本实现高质量的状态检查功能。
Keepalived框架可以单独使用,也可以和其他软件进行整合使用。
1.3 keeplived简介
安装:
Ubuntu系统 apt info keepalived
centos系统dnf info keepalived
服务的管理
systemctl start keepalived.service
systemctl status keepalived.service
systemctl restart keepalived.service
systemctl enable keepalived.service
配置文件目录
[root@ubuntu1804 ~]#dpkg -L keepalived
/etc/default/keepalived #服务启动生成启动参数
/etc/keepalived #配置文件应该所在目录,默认没有配置文件
/lib/systemd/system/keepalived.service#服务配置文件目录
/usr/share/doc/keepalived/samples #模板文件目录,包含大量的配置文件,模板文件有坑,centos默认网卡是enu66667虚拟IP要绑定在物理网卡上
ubuntu默认网卡名称是en0开头
[root@ubuntu1804 keepalived]#cat /lib/systemd/system/keepalived.service
[Unit]
Description=Keepalive Daemon (LVS and VRRP)
After=syslog.target network-online.target
Wants=network-online.target
# Only start if there is a configuration file
ConditionFileNotEmpty=/etc/keepalived/keepalived.conf#默认没有配置文件,所以服务起不来
1.3.1keepalived配置文件详解
根据我们对 /usr/share/doc/keepalived/samples 目录下的模板文件查看,keepalived的配置文件结构如下
global
vrrp : -state-virtual_roult_id -priority-viryual_ipadresses
virtual_server
realserver
root@ububtu:/etc/keepalived# cat 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 LVS_DEVEL #vip的基本配置
vrrp_skip_check_adv_addr
vrrp_strict #与防火墙方法
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 { #vip配置
state MASTER #状态角色
interface ens33
virtual_router_id 51 #虚拟路由的id,与村节点认证
priority 100
advert_int 1
authentication {
auth_type PASS # 通讯认证
auth_pass 1111 # 通讯认证
}
virtual_ipaddress { #虚拟IP地址
192.168.200.16
192.168.200.17
192.168.200.18
}
}
virtual_server 192.168.200.100 443 { #虚拟主机定制
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.201.100 443 { #个虚拟主机都有自己的realserver,每个realderver有自己的算法
weight 1
SSL_GET { #多住检测机制
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
结果显示
我们的keepalived默认配置文件主要有三部分组成,global_defs、vrrp_instance、virtual_server
其中最重要的配置内容是vrrp_instance,在这个配置段中,设置了我们keepalived对外提供的统一入口
配置简介
作为快速入门阶段来说,此时它的配置信息没有那么的复杂,我们这里只需要修改两台keepalived主机的
global_defs和vrrp_instance部分的属性内容,就可以让keepalived正常启动了。
在这里我们来简单的看一下这里面的基础重要的属性配置:
global_defs - 全局配置段
在这部分的配置段中,我们暂时只需要关心router_id即可
router_id 设定当前keepalived提供的路由标识,它在keepalived集群中必须唯一
vrrp_instance - vrrp配置段
在这部分的配置段中,我们选优关心以下几处的配置信息:
state 描述keepalived主机间的角色定位的,一般只有两个值MASTER、BACKUP
interface 指定在哪个网卡上绑定VIP
virtual_router_id 指定VIP的唯一标识,在keepalived集群中,此配置必须一致。
priority 被VRRP协议来判断那个router_id作为主路由,值越大,优先级越高
authentication 多个路由之间通信的认证
virtual_ipaddress 指定VIP的地址,可以是多个。
virtual_server - vs配置段
在这部分的配置段中,我们主要关系一下几处的配置信息:
lb_algo 定制算法信息
protocol 数据通信协议的定制
real_server 后端真实主机的定制
include子配置
当生产环境复杂时, /etc/keepalived/keepalived.conf 文件中内容过多,不易管理,可以将不同集群的配置,比如:不同集群的VIP配置放在独立的子配置文件中, 然后利用 include 指令可以实现包含子配置文件
include /etc/keepalived/conf.d/*.conf
root@ubuntu:#mkdir /etc/keepalived/conf.d/ #创建专属的子配置文件目录
root@ubuntu:#cd /etc/keepalived
root@ubuntu:/etc/keepalived# cat keepalived.conf -n #查看到19行以后
root@ubuntu:#sed -nr '19,$p' keepalived.conf > /etc/keepalived/conf.d/cluster1.conf #将19行以后文件内容转移到子文件
root@ubuntu:#sed -i '19,$d' /etc/keepalived/keepalived.conf #主配置删除19行以后内容
root@ubuntu:/etc/keepalived/conf.d# echo 'include /etc/keepalived/conf.d/*.conf' >> /etc/keepalived/keepalived.conf#写入include
root@ubuntu:~# cat /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 LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
include /etc/keepalived/conf.d/*.conf
主文件
root@ubuntu:/etc/keepalived# cat 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 LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
include /etc/keepalived/conf.d/*.conf
2.编译安装
三步:
config:生成配置文件,生成安装软件的目录
make:编译makefile文件
make install
修改服务配置文件,服务启动文件
2.1环境准备
Ubuntu环境
apt-get -y install libssl-dev libpopt-dev daemon build essential libssl-dev openssl libpopt-dev libsnmp-dev libnl-3-dev libnl-genl-3-dev
centos环境
yum install -y gcc curl openssl-devel libnl3-devel net-snmp-devel
2.2软件准备
获取软件
mkdir /data/softs && cd /data/softs
wget https://www.keepalived.org/software/keepalived-2.2.4.tar.gz
解压文件
tar xf keepalived-2.2.4.tar.gz
cd keepalived-2.2.4
2.3配置文件
./configure --prefix=/data/server/keepalived --disable-fwmark
注意: 无此选项默认会启用 ipatbles规则
2.4编译安装
make && make install
编译后生成大量配置文件
2.5服务管理
定制环境变量 /etc/profile.d/keepalived.sh
#!/bin/bash
# set keepalived environment
export KEEPALIVED_HOME=/data/server/keepalived
export PATH=$PATH:$KEEPALIVED_HOME/sbin
应用环境变量文件
source /etc/profile.d/keepalived.sh
chmod +x /etc/profile.d/keepalived.sh
配置目录
创建专用配置目录
mkdir /etc/keepalived
拷贝配置文件
cp /data/server/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
准备启动参数文件
ln -s /data/server/keepalived/etc/sysconfig/keepalived /etc/default/keepalived
服务文件
我们在编译keepalived的时候,自动创建了对应的服务配置文件/usr/lib/systemd/system/keepalived.service ,我们要修改一下该文件,让他使用我们定制的配置文件。
在 [unit] 部分的最后,添加一条配置
ConditionFileNotEmpty=/etc/keepalived/keepalived.conf
配置解析:
该条配置表示,只有该文件存在的时候,才会正常启动keepalived
在 [Service] 部分修改默认的keepalive的配置参数位置
EnvironmentFile=-/etc/default/keepalived
修改配置文件
默认的配置文件用到的网卡端口是eth0,不满足我们当前ubuntu环境的使用,所以我要修改一下
root@python-auto:~# grep -C2 ens33 /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
注意:
如果网卡设备名称不正确的话,会导致服务无法启动
服务管理
启动服务并查看状态
systemctl daemon-reload
systemctl daemon-reload
systemctl status keepalived
设置为开机自启动
systemctl enable keepalived
查看效果
查看网卡效果
ip addr show ens33
ping -c 1 192.168.200.17
查看进程效果
pstree -p | egrep 'systemd\(1\)|keepali'·
2.6编译安装centos
[root@centous8 ~]#yum install -y gcc curl openssl-devel libnl3-devel net-snmp-devel
[root@centous8 ~]# mkdir /data/softs && cd /data/softs
[root@centous8 softs]# wget https://www.keepalived.org/software/keepalived-2.2.4.tar.gz
[root@centous8 softs]# tar xf keepalived-2.2.4.tar.gz
[root@centous8 softs]# cd keepalived-2.2.4
[root@centous8 keepalived-2.2.4]# ./configure --prefix=/data/server/keepalived --disable-fwmark
checking for a BSD-compatible install... /usr/bin/install -c
Default runtime options : -D
[root@centous8 keepalived-2.2.4]# make && make install
Making all in lib
[root@centous8 keepalived-2.2.4]# tree /data/server/keepalived/
/data/server/keepalived/
├── bin
│ └── genhash -> ../sbin/keepalived
[root@centous8 keepalived-2.2.4]# ls /usr/lib/systemd/system/keepalived.service
/usr/lib/systemd/system/keepalived.service
[root@centous8 keepalived-2.2.4]# cat /usr/lib/systemd/system/keepalived.service
[Unit]
Description=LVS and VRRP High Availability Monitor
After=network-online.target syslog.target
[root@centous8 keepalived-2.2.4]# cd /data/server/keepalived/
[root@centous8 keepalived]# ls
bin etc sbin share
[root@centous8 keepalived]# cd etc/keepalived/
[root@centous8 keepalived]# ls
keepalived.conf samples
[root@centous8 keepalived]# cp keepalived.conf /etc/keepalived/
[root@centous8 keepalived]# vim /etc/keeplived/keepalived.conf
[root@centous8 etc]# cd /data/server/keepalived/etc/sysconfig/
[root@centous8 sysconfig]# ls
keepalived
[root@centous8 sysconfig]# cp keepalived /etc/default/
[root@centous8 sysconfig]# cat /etc/default/keepalived
[root@centous8 sysconfig]# vim /usr/lib/systemd/system/keepalived.service
[root@centous8 sysconfig]# systemctl daemon-reload
[root@centous8 sysconfig]# systemctl start keepalived.service
[root@centous8 sysconfig]# systemctl status keepalived.service
Active: active (running)
3.日志拆分
日志有八各级别
日志管理
3.1启用rsyslog
开启rsyslog功能在linux系统中是rsyslog服务。syslog服务器可以用作一个网络中的日志监控中心,rsyslog是一个开源工具,被广泛用于Linux系统以通过TCP/UDP协议转发或接收日志消息。
apt-get install -y rsyslog
在/etc/rsyslog.d/目录下创建 keepalived的日志配置文件keepalived.conf
# vim /etc/rsyslog.d/keepalived.conf
local6.* /var/log/keepalived.log
&~
注意:
&~ 表示keepalived日志仅仅写入/var/log/keepalived.log中,不写入/var/log/syslog文
件。
重启rsyslog服务
systemctl restart rsyslog.service
3.2keepalived启用日志功能
修改keepalived服务的启动参数
# vim /etc/default/keepalived
KEEPALIVED_OPTIONS="-D -S 6"
重启keepalived服务
systemctl restart keepalived.service
查看日志效果
tail -f /var/log/keepalived.log
3.3 日志分离实践
root@slave:~# apt-get install -y rsyslog
root@slave:~# vim /etc/rsyslog.d/keepalived.conf
root@master:~# cat /etc/rsyslog.d/keepalived.log
local6.* /var/log/keepalived.log
&~
root@slave:~# systemctl restart rsyslog.service
root@slave:~# vim /etc/default/keepalived
root@slave:~# systemctl restart keepalived.service
root@slave:~# tail -f /var/log/keepalived.log
# Options for keepalived. See `keepalived --help' output and keepalived(8) and
# keepalived.conf(5) man pages for a list of all options. Here are the most
# common ones :
#
# --vrrp -P Only run with VRRP subsystem.
# --check -C Only run with Health-checker subsystem.
# --dont-release-vrrp -V Dont remove VRRP VIPs & VROUTEs on daemon stop.
# --dont-release-ipvs -I Dont remove IPVS topology on daemon stop.
# --dump-conf -d Dump the configuration data.
# --log-detail -D Detailed log messages.
# --log-facility -S 0-7 Set local syslog facility (default=LOG_DAEMON)
#
KEEPALIVED_OPTIONS="-D -S 6"
root@master:~# tail -f /var/log/keepalived.log
4.集群搭建
4.1负载均衡
3.1简单实践
配置文件
root@ububtu:/etc/apt# apt install keepalived -y
Reading package lists... Done
将配置文件移动到、/etc/keepalived/.....conf
root@ububtu:/etc/keepalived# systemctl start keepalived.service
root@ububtu:/etc/keepalived# systemctl status keepalived.service
● keepalived.service - Keepalive Daemon (LVS and VRRP)
Loaded: loaded (/lib/systemd/system/keepalived.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2021-12-25 03:21:47 UTC; 3s ago
Main PID: 21734 (keepalived)
10.0.0.15
root@ububtu:~# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id kpmaster#25设置为slave
}
vrrp_instance VI_1 {
state MASTER#25设置为BACKUP
interface ens33
virtual_router_id 50
nopreempt
priority 100#25设置优先值比master低
advert_int 1
virtual_ipaddress {
10.0.0.20 dev ens33 label ens33:0
}
}
root@ububtu:~# scp /etc/keepalived/keepalived.conf 10.0.0.25:/etc/keepalived/keepalived.conf
root@ububtu:~# tail -f /var/log/syslog
Dec 25 04:06:09 ububtu Keepalived_vrrp[23021]: (VI_1) Entering MASTER STATE #主节点可以漂移,主节点挂从节点代替主节点
后端配置
10.0.0.35
root@ububtu:/etc/apt# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
root@ububtu:/etc/apt# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
root@ububtu:/etc/apt# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
root@ububtu:/etc/apt# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
root@ububtu:/etc/apt# ifconfig lo:0 10.0.0.20 netmask 255.255.255.255 broadcast 10.0.0.20
root@ububtu:/etc/apt# ifconfig
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 10.0.0.20 netmask 255.255.255.255
loop txqueuelen 1000 (Local Loopback)
root@ububtu:~# apt install nginx -y
Reading package lists... Done
oot@ububtu:~# echo 'realserver-nginx-35' > /var/www/html/index.nginx-debian.html
root@ububtu:~# curl 10.0.0.20
realserver-nginx-35
10.0.0.45
root@ububtu:/etc/apt# apt install apache2
Reading package lists... Done
root@ububtu:/etc/apt# echo 'realserver-apache2-15' > /var/www/html/index.html
root@ububtu:/etc/apt# curl 10.0.0.20
realserver-apache2-15
10.0.0.55 #访问节点必须没有与虚拟主机或者回环网卡相同的ip如本机是10.0.0.20
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.20:80 rr
-> 10.0.0.35:80 Route 1 0 0
-> 10.0.0.45:80 Route 1 0 0
root@ububtu:~# curl 10.0.0.20
realserver-apache2-15
root@ububtu:~# curl 10.0.0.20
realserver-nginx-35
root@ububtu:~# curl 10.0.0.20
realserver-apache2-15
root@ububtu:~# curl 10.0.0.20
realserver-nginx-35
root@ububtu:~# curl 10.0.0.20
realserver-apache2-15
主集
丛集
时间同步最重要,最好差距时间在0.0几秒
3.2主机反向代理
10.0.0.15
root@master:/etc/keepalived# cat keepalived.conf
! Configuration File for keepalived
global_defs {
router_id kpmaster
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 50
nopreempt
priority 100
advert_int 1
virtual_ipaddress {
10.0.0.100 dev ens33 label ens33:0
}
}
virtual_server 10.0.0.100 80 {
delay_loop 2 #用于服务轮询的延迟计时器
lb_algo rr #设定访问后端服务的调度策略
lb_kind DR #设定数据转发的模型
protocol TCP # 设定数据通信的协议
real_server 10.0.0.35 80 {
}
real_server 10.0.0.45 80 {
}
}
10.0.0.25
root@slave:/etc/keepalived# cat keepalived.conf
! Configuration File for keepalived
global_defs {
router_id kpslave
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 50
nopreempt
priority 90
advert_int 1
virtual_ipaddress {
10.0.0.100 dev ens33 label ens33:0
}
}
virtual_server 10.0.0.100 80 {
delay_loop 2 # 用于服务轮询的延迟计时器
lb_algo rr #设定访问后端服务的调度策略
lb_kind DR #设定数据转发的模型
protocol TCP #设定数据通信的协议
real_server 10.0.0.35 80 {在此处可以添加权重weight,相应的rr改为wrr
}
real_server 10.0.0.45 80 {
} #设定后端主机的信息
}
root@slave:~# ipvsadm -ln#主机一样
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.100:80 rr
-> 10.0.0.35:80 Route 1 0 0
-> 10.0.0.45:80 Route 1 0 0
后端主机nginx10.0.0.30
root@ububtu:~# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
root@ububtu:~# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
root@ububtu:~# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
root@ububtu:~# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
root@ububtu:~# ifconfig lo:0 10.0.0.100 netmask 255.255.255.255 broadcast 10.0.0.100
root@ububtu:~# echo 'realserver-nginx-35' > /var/www/html/index.nginx-debian.html
root@ububtu:~# curl 10.0.0.100
realserver-nginx-3
10.0.0.45
root@ububtu:~# ifconfig lo:0 10.0.0.100 netmask 255.255.255.255 broadcast 10.0.0.100
root@ububtu:~# apt install apache2
Reading package lists... Done
root@ububtu:~# echo 'realserver-apache2-45' >/var/www/html/index.html
root@ububtu:~# curl 10.0.0.100
realserver-apache2-45
测试机
root@ububtu:~# curl 10.0.0.100
realserver-apache2-45
root@ububtu:~# curl 10.0.0.100
realserver-nginx-35
root@ububtu:~# curl 10.0.0.100
realserver-apache2-45
root@ububtu:~# curl 10.0.0.100
realserver-nginx-35
root@ububtu:~# curl 10.0.0.100
3.3状态检测
根据我们对keepalived的了解,我们知道它基于VRRP协议不但实现了高可用性的功能,而且还实现了基于脚本文件实现了状态监测的功能,而这个功能使用的场景非常多。拓展开来,只要我们掌握这个状态监测的方法,我们就可以对keepalived管理的所有内容统统进行状态监测,而且还可以基于本身的邮件通知功能实现更为精细化的服务管理。
我们的需求就是:keepalived采用脚本的方式动态方式来检查keepalived服务的状态,然后通过手工操作模拟keepalived故障,检查keepalived的服务检查状态。
3.3.1步骤与重点
为了满足上面的场景需求,我们需要通过以下几个步骤来完成整个动作 3 效果检查
3.3.1.1配置脚本的检查流程。
1 配置 VRRP script(s) 的状态检查命令2 在VRRP实例中使用指定的检查命令
3.3.1.2官方解析
根据 man keepalived.conf 方式来查看VRRP script的配置信息显示:vrrp_script配置是专门用于设定监控VRRP实例用的配置,格式效果如下:
vrrp_script <SCRIPT_NAME> {
script <STRING>|<QUOTED-STRING> # 设定执行脚本的路径,也可以是命令行的检测命令
interval <INTEGER> # 设定脚本执行的间隔时间,默认1s
timeout <INTEGER> # 设定脚本失败的超时时间
weight <INTEGER:-254..254> # 设定脚本的权重,默认是0
rise <INTEGER> # 执行多少次,表示成功OK
fall <INTEGER> # 执行多少次,表示失败KO
user USERNAME [GROUPNAME] # 设定脚本的用户/组属性信息
init_fail # 假设脚本最初处于失败状态
}
注意:我们一般使用前面的两条属性, 检测命令的<SCRIPT_NAME>是VRRP专用的,一定要保证在VRRP场景下是唯一的script 属性要求尽量使用脚本格式,不包含特殊字符和表达式的简单命令也可以,如果命令里包含特殊字符 就不能执行,比如"[[ ]]"符号,报错效果如下Mar 27 23:09:51 [localhost] Keepalived_vrrp[1422]: Unable to access script [[
VRRP script配置
配置示例:
vrrp_script chk_keepalived { # 创建检测执行脚本
script "/bin/bash /path/to/script.file" #脚本文件执行
interval 1 #间隔时间1秒一次
weight -10
}
注意:
此处的weight很重要,它与vrrp_instance的priority属性共同决定了集群中MASTER和BACKUP角色切换动作,这个值一般有正数和负数之分,最终功能都是一样的,我们一般用负数。weight为负(-n):
脚本执行失败,主节点的"priority-weight值",若差值小于BACKUP节点的priority,则切换备为主,否 则不切换角色状态
编写脚本实例
创建专用脚本目录
mkdir /data/scripts/ -p
创建脚本
]# vim /data/scripts/keepalived_check.sh
#!/bin/bash
if [ -f /tmp/keepalived.fail ];then
weight -2
fi
注意:
脚本中的 "weight -2" 表示,当我们存在keepalived的fail文件的时候,表明该软件已经故障,需要降低本主机的优先级,便于BACKUP主机提升为主角色 -2 的值,需要根据MASTER和BACKUP的优先级进行规划,保证 "MASTER优先级-2 < BACKUP优先级"
实践:机台主机改写几次
global_defs {
router_id kpmaster
} #下方加入脚本scipt_chk
vrrp_script chk_keepalived {
script "/bin/bash /data/scripts/keepalived_check.sh"
interval 1
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 50
nopreempt
priority 100
advert_int 1
virtual_ipaddress {
10.0.0.100 dev ens33 label ens33:0
}
track_script {
chk_keepalived
}
}
root@ububtu:~# vim /data/scripts/keepalived_check.sh
#!/bin/bash
if [ -f /tmp/keepalived.fail ];then
weight -2
fi
要写失败的脚本
3.4健康检查
3.4.1默认配置
virtual_server 10.10.10.2 1358 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
sorry_server 192.168.200.200 1358
real_server 192.168.200.2 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
...
}
3.4.1.1属性详解
基本属性
delay_loop 用于服务轮询的延迟计时器
lb_algo 设定访问后端服务的调度策略
在当前的keepalived版本下,它支持7种调度算法 rr|wrr|lc|wlc|lblc|sh|dh
lb_kind 设定数据转发的模型
因为是基于IPVS进行负载均衡的,所以数据转发的模型与LVS一致 NAT|DR|TUN
persistence_timeout 设定数据持久性的超时时间,默认为6分钟
protocol 设定数据通信的协议,默认支持三种 TCP|UDP|SCTP
这一项是必备的,因为我们使用ipvsadm 创建集群的时候,必须指定通信协议
sorry_server 备用真实主机,当所有RS失效后,开始启用该后备主机。
real_server 设定后端主机的信息
真实主机详解
weight 设定真实主机的权重,默认是1
HTTP_GET 以HTTP方式来检查后端主机
TCP_CHECK 以TCP方式来检查后端主机
SMTP_CHECK 以SMTP方式来检查后端主机
DNS_CHECK 以DNS方式来检查后端主机
MISC_CHECK 以MISC方式来检查后端主机
http检测属性
url {
path <path/to/url> 指定要检查的URL的路径
digest <STRING> 校验码验证,校验计算:genhash -s <IP> -p <port> -u
/path/to/url
status_code <INT> 状态码方式验证,推荐使用这种方法
}
注意:
由于digest方式太繁琐,而且文件一旦变动,老的digest就不能用了,所以不推荐
connect_timeout 连接超时时间,默认5s
nb_get_retry get方式获取检测url页面的重试次数
delay_before_retry 重试的间隔时间,默认1s
tcp检测属性
connect_ip 测试目标的ip,默认是RS的ip,可省略
connect_port 测试目标的端口,默认是RS的port,可省略
connect_timeout 连接超时时间
retry 重试次数,刻省略
delay_before_retry 重试间隔时间,默认1s
3.4.2健康检查配置实践
3.4.3双主实践
在实际的工作中,我们的网站服务一般都是以域名的方式对外提供服务,对于这种情况下一般有这么两种现象:
- 一个域名对应一个ip地址,万一域名解析的ip地址故障,就出现单点故障现象
- 一个域名可以解析不同的后端服务,我们可以基于同域名解析多个不同服务的ip地址,更精确的响应用户
也就是说,我们在实现keepalived的高可用时候,需要在同一组高可用集群中,设置多个对外的VIP即多组VRRP实例,任意一组失误,都不影响用户的访问体验。
主机配置文件
! Configuration File for keepalived
global_defs {
router_id kpmaster
}
vrrp_script chk_keepalived {
script "/bin/bash /data/scripts/keepalived_check.sh"
interval 1
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 50 #必须特殊的标识
nopreempt
priority 100
advert_int 1
virtual_ipaddress {
10.0.0.100 dev ens33 label ens33:0
}
track_script {
chk_keepalived
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 51
priority 99
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.200 dev ens33 label ens33:1
}
track_script {
chk_keepalived
}
}
virtual_server 10.0.0.100 80 {
delay_loop 2
lb_algo rr
lb_kind DR
protocol TCP
real_server 10.0.0.19 80 {
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 10.0.0.20 80 {
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
virtual_server 10.0.0.200 80 {
delay_loop 2
lb_algo rr
lb_kind DR
protocol TCP
real_server 10.0.0.19 80 {
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 10.0.0.20 80 {
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
从节点配置文件
! Configuration File for keepalived
global_defs {
router_id kpslave
}
vrrp_script chk_keepalived {
script "/bin/bash /data/scripts/keepalived_check.sh"
interval 1
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 50
nopreempt
priority 90
advert_int 1
virtual_ipaddress {
10.0.0.100 dev ens33 label ens33:0
}
track_script {
chk_keepalived
}
}
vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.200 dev ens33 label ens33:1
}
track_script {
chk_keepalived
}
}
virtual_server 10.0.0.100 80 {
delay_loop 2
lb_algo rr
lb_kind DR
protocol TCP
real_server 10.0.0.19 80 {
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 10.0.0.20 80 {
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
virtual_server 10.0.0.200 80 {
delay_loop 2
lb_algo rr
lb_kind DR
protocol TCP
real_server 10.0.0.19 80 {
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 10.0.0.20 80 {
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
效果
检查两台主机的ip
ip addr
检查ipvs规则
[root@kpmaster ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.8.100:80 rr
-> 192.168.8.16:80 Route 1 0 4
-> 192.168.8.17:80 Route 1 1 4
TCP 192.168.8.200:80 rr
-> 192.168.8.16:80 Route 1 0 0
-> 192.168.8.17:80 Route 1 0 0
可以看到:
这里存在两个lvs集群,管理的内容是一致的。
访问效果
单独找一台客户端来验证效果
[root@client ~]# for i in {1..8}; do curl 192.168.8.100;done
nginx-RS1
nginx-RS2
nginx-RS1
nginx-RS2
nginx-RS1
nginx-RS2
nginx-RS1
nginx-RS2
- 对于多应用场景或者请求入口高可用的场景,我们可以基于vrrp多实例的样式来完成,完成步骤如下
1 规划服务的检测内容
2 后端服务的正常运行
3 keepalived使用配置多vrrp实例
4 效果测试
- keepalived在配置多vrrp实例的时候,一定要注意:同一实例间的优先级和state必须写清楚不同实例的名称和VIP一定要合理的规划