keepalived相关说明
Keepalived是基于vrrp协议的一款高可用软件。Keepailived有一台主服务器和多台备份服务器,在主服务器和备份服务器上面部署相同的服务配置,使用一个虚拟IP地址对外提供服务,当主服务器出现故障时,虚拟IP地址会自动漂移到备份服务器。
VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议),VRRP是为了解决静态路由的高可用。VRRP的基本架构
虚拟路由器由多个路由器组成,每个路由器都有各自的IP和共同的VRID(0-255),其中一个VRRP路由器通过竞选成为MASTER,占有VIP,对外提供路由服务,其他成为BACKUP,MASTER以IP组播(组播地址:224.0.0.18)形式发送VRRP协议包,与BACKUP保持心跳连接,若MASTER不可用(或BACKUP接收不到VRRP协议包),则BACKUP通过竞选产生新的MASTER并继续对外提供路由服务,从而实现高可用。
vrrp协议的相关术语:
虚拟路由器:Virtual Router
虚拟路由器标识:VRID(0-255)
物理路由器:
master :主设备
backup :备用设备
priority:优先级
VIP:Virtual IP
VMAC:Virutal MAC (00-00-5e-00-01-VRID)
GraciousARP
安全认证:
简单字符认证、HMAC机制,只对信息做认证
MD5(leepalived不支持)
工作模式:
主/备:单虚拟路径器;
主/主:主/备(虚拟路径器),备/主(虚拟路径器)
工作类型:
抢占式:当出现比现有主服务器优先级高的服务器时,会发送通告抢占角色成为主服务器
非抢占式:
keepalived
核心组件
vrrp stack:vrrp协议的实现
ipvs wrapper:为集群内的所有节点生成IPVS规则
checkers:对IPVS集群的各RS做健康状态检测
控制组件:配置文件分析器,用来实现配置文件的分析和加载
IO复用器
内存管理组件,用来管理keepalived高可用是的内存管理
注意:
- 各节点时间必须同步
- 确保各节点的用于集群服务的接口支持MULTICAST通信(组播)
实验部分
实验任务
1、使用keepalived实现NAT模式的负载均衡集群的部署
2、使用keepalived实现DR模式的负载均衡集群的部署
3、使用keepalived实现TUN模式的负载均衡集群的部署
4、优化keepalived集群部署,实现keepalived无法连接到真实服务时,失去VIP占有能力
5、优化keepalived配置,实现VRRP状态变化时,通过邮件通知系统管理员
6、 优化keepalived配置,实现真实服务器状态变化时,通过微信消息通知系统管理员
环境准备
主机 | 内网ip | mac | 外网ip | mac |
---|---|---|---|---|
lvs1 | ens34:172.16.0.100/24 | mac:00:0c:29:52:6e:9f | ens33:10.0.0.100/24 | mac:00:0c:29:52:6e:8b |
lvs2 | ens34:172.16.0.101/24 | mac:00:0c:29:ad:07:71 | ens33:10.0.0.101/24 | mac:00:0c:29:ad:07:5d |
real_server1 | ens34:172.16.0.102/24 | mac:00:0c:29:60:f9:ef | ens33:10.0.0.102/24 | mac:00:0c:29:60:f9:db |
real_server2 | ens34:172.16.0.103/24 | mac:00:0c:29:a7:98:f0 | ens33:10.0.0.103/24 | mac:00:0c:29:a7:98:dc |
客户端 | 10.0.0.1/24 | mac:00:50:56:c0:00:08 |
#关闭防火墙
[root@lvs1 ~]# systemctl stop firewalld
#设置selinux模式为permissive
[root@lvs1 ~]# setenforce 0
#其余主机做同样操作
ipvsadm用法
语法格式:ipvsadm [参数]
-A/--add-service 添加一条新的虚拟服务
-E/--edit-service 编辑虚拟服务
-D/--delete-service 删除虚拟服务
-C/--clear 清除所有的虚拟服务规则
-R/--restore 恢复虚拟服务规则
-S/--save 保存虚拟服务器规则
-a/--add-server 在一个虚拟服务中添加一个新的真实服务器
-e/--edit-server 编辑某个真实服务器
-d/--delete-server 删除某个真实服务器
-L/-l/--list 显示内核中的虚拟服务规则
-Z/--zero 将转发消息的统计清零
--set tcp/tcpfin/udp 配置三个超时时间(tcp/tcpfin/udp)
--start-daemon 启动同步守护进程。
--stop-daemon 停止同步守护进程
-h/--help 显示帮助信息
-t/--tcp-service service-address TCP协议的虚拟服务
-u/--udp-service service-address UDP协议的虚拟服务
-f/--fwmark-service fwmark 说明是经过iptables 标记过的服务类型。
-s/--scheduler scheduler 使用的调度算法,有这样几个选项rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默认的调度算法是: wlc.
-p/--persistent [timeout] 持久稳固的服务。
-M/--netmask 指定客户地址的子网掩码
-r/--real-serverserver-address 真实的服务器
-g/--gatewaying 指定LVS 的工作模式为直接路由模式
-i/--ipip 指定LVS 的工作模式为隧道模式
-m/--masquerading 指定LVS 的工作模式为NAT 模式
-w/--weightweight 真实服务器的权值
--mcast-interface interface 指定组播的同步接口
-c/--connection 显示ipvs中目前存在的连接
-6: 如果fwmark用的是ipv6地址需要指定此选项。
tcpdump用法
tcpdump [ -DenNqvX ] [ -c count ] [ -F file ] [ -i interface ] [ -r file ]
[ -s snaplen ] [ -w file ] [ expression ]
抓包选项:
-c:指定要抓取的包数量。注意,是最终要获取这么多个包。例如,指定"-c 10"将获取10个包,但可能已经处理了100个包,只不过只有10个包是满足条件的包。
-i interface:指定tcpdump需要监听的接口。若未指定该选项,将从系统接口列表中搜寻编号最小的已配置好的接口(不包括loopback接口,要抓取loopback接口使用tcpdump -i lo),
:一旦找到第一个符合条件的接口,搜寻马上结束。可以使用'any'关键字表示所有网络接口。
-n:对地址以数字方式显式,否则显式为主机名,也就是说-n选项不做主机名解析。
-nn:除了-n的作用外,还把端口显示为数值,否则显示端口服务名。
-N:不打印出host的域名部分。例如tcpdump将会打印'nic'而不是'nic.ddn.mil'。
-P:指定要抓取的包是流入还是流出的包。可以给定的值为"in"、"out"和"inout",默认为"inout"。
-s len:设置tcpdump的数据包抓取长度为len,如果不设置默认将会是65535字节。对于要抓取的数据包较大时,长度设置不够可能会产生包截断,若出现包截断,
:输出行中会出现"[|proto]"的标志(proto实际会显示为协议名)。但是抓取len越长,包的处理时间越长,并且会减少tcpdump可缓存的数据包的数量,
:从而会导致数据包的丢失,所以在能抓取我们想要的包的前提下,抓取长度越小越好。
输出选项:
-e:输出的每行中都将包括数据链路层头部信息,例如源MAC和目标MAC。
-q:快速打印输出。即打印很少的协议相关信息,从而输出行都比较简短。
-X:输出包的头部数据,会以16进制和ASCII两种方式同时输出。
-XX:输出包的头部数据,会以16进制和ASCII两种方式同时输出,更详细。
-v:当分析和打印的时候,产生详细的输出。
-vv:产生比-v更详细的输出。
-vvv:产生比-vv更详细的输出。
其他功能性选项:
-D:列出可用于抓包的接口。将会列出接口的数值编号和接口名,它们都可以用于"-i"后。
-F:从文件中读取抓包的表达式。若使用该选项,则命令行中给定的其他表达式都将失效。
-w:将抓包数据输出到文件中而不是标准输出。可以同时配合"-G time"选项使得输出文件每time秒就自动切换到另一个文件。可通过"-r"选项载入这些文件以进行分析和打印。
-r:从给定的数据包文件中读取数据。使用"-"表示从标准输入中读取。
安装软件:
#lvs1软件安装 keepalived是一个管理工具,通过操作ipvsadm对linux内核进行相应操作
[root@lvs1 ~]# yum -y install ipvsadm
[root@lvs1 ~]# yum install -y gcc.x86_64
[root@lvs1 ~]# yum install -y openssl-devel.x86_64
[root@lvs1 ~]# yum install -y wget
[root@lvs1 ~]# yum install -y tcpdump
[root@lvs1 ~]# wget https://www.keepalived.org/software/keepalived-2.0.18.tar.gz #下载源码包
[root@lvs1 ~]# tar -zxvf keepalived-2.0.18.tar.gz #解压源码包
[root@lvs1 ~]# cd keepalived-2.0.18/
[root@lvs1 keepalived-2.0.18]# ls
aclocal.m4 AUTHOR build_setup compile configure.ac COPYING doc INSTALL keepalived lib Makefile.in README.md TODO
ar-lib bin_install ChangeLog configure CONTRIBUTORS depcomp genhash install-sh keepalived.spec.in Makefile.am missing snap
[root@lvs1 keepalived-2.0.18]# ./configure --prefix=/ --datarootdir=/usr/local --pdfdir=/usr/local/share/keepalived --with-systemdsystemunitdir=/usr/lib/systemd/system
[root@lvs1 keepalived-2.0.18]# make install
#lvs2操作相同
real_server1和real_server2安装httpd和抓包软件
[root@real_server1 ~]# yum -y install httpd
[root@real_server1 ~]# yum -y install tcpdump
[root@real_server2 ~]# yum -y install httpd
[root@real_server2 ~]# yum -y install tcpdump
NAT模式创建
nat模式说明
NAT 工作模式
(a)当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(b). PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
(c). IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP
(d). POSTROUTING链通过选路,将数据包发送给Real Server
(e). Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP
(f). Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP(a)当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(b). PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
(c). IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP
(d). POSTROUTING链通过选路,将数据包发送给Real Server
(e). Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP
(f). Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP
配置环节
配置lvs中的keepalived配置文件:
[root@lvs1 ~]# 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 LV1 #不能相同
vrrp_skip_check_adv_addr
#vrrp_strict #将严格遵守vrrp协议这一项关闭,否则会自动创建防火墙规则
vrrp_iptables #加入这条配置,不添加任何iptables规则
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER #设置成主节点
interface ens33 #指定vip的绑定网卡
virtual_router_id 51 #设置虚拟路由id,lvs1和lvs2必须相同
priority 100 #设置vrrp的优先级为100
advert_int 1 #组播包发送间隔
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.150 #指定vip
}
}
virtual_server 10.0.0.150 80 {
#创建虚拟服务器ip与真实服务器的映射关系
delay_loop 6
lb_algo rr
lb_kind NAT #设置模式为nat模式
persistence_timeout 50
protocol TCP
real_server 172.16.0.102 80 {
weight 1
HTTP_GET {
#设置检测模式为http,检测真实服务器的web的根路径,如果返回码为200则为正常
url {
path /
state_code 200
}
}
connect_timeout 3
retry 3
delay_before_retry 3
}
real_server 172.16.0.103 80 {
weight 1
HTTP_GET {
url {
path /
state_code 200
}
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}
[root@lvs2 ~]# 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 LVS2
vrrp_skip_check_adv_addr
#vrrp_strict #将严格遵守vrrp协议这一项关闭,否则会自动创建防火墙规则
vrrp_iptables #加入这条配置,不添加任何iptables规则
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP #设置成备节点
interface ens33 #指定vip的绑定网卡
virtual_router_id 51 #设置虚拟路由id,lvs1和lvs2必须相同
priority 90 #设置vrrp的优先级为90
advert_int 1 #组播包发送间隔
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.150 #指定vip
}
}
virtual_server 10.0.0.150 80 {
#创建虚拟服务器ip与真实服务器的映射关系
delay_loop 6
lb_algo rr
lb_kind NAT #设置模式为nat模式
persistence_timeout 50
protocol TCP
real_server 172.16.0.102 80 {
weight 1
HTTP_GET {
#设置检测模式为http,检测真实服务器的web的根路径,如果返回码为200则为正常
url {
path /
state_code 200
}
}
connect_timeout 3
retry 3
delay_before_retry 3
}
real_server 172.16.0.103 80 {