Day18_keepalived
keepalived基础
介绍
- 他可以实现服务器之间的高可用,他会虚拟出一个ip,当一台服务挂掉后会自动将这个vip转移到另一台机器上,从而实现服务的高可用
- VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写,它出现的目的是为了解决静态路由出现的单点故障问题,通过VRRP可以实现⽹络不间断地、稳定地运行。因此,Keepalived具有服务器状态检测和故障隔离功能,另一方面也具有HA cluster功能。
安装与配置
- dnf install -y keepalived
- vim /etc/keepalived/keepalived.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60#全局配置
global_defs {
#邮件发送服务
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
#设置通知邮件发送来自于哪里,如果本地开启了sendmail的话,可以使用上面的默认值
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1 #指定发送邮件的smtp服务器
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict ##严格遵守VRRP协议,这个要注释掉
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER #角色
interface eth0 #网卡名
virtual_router_id 51 #组id,同一组的组id相同
priority 100 #优先级,优先级高的vip会优先,两个优先级之间间隔20
advert_int 1
authentication {#验证方式
auth_type PASS #密码验证
auth_pass 1111 #密码,两台server的密码要一致
}
#设置VIP,可以设置多个,⽤于切换时的地址绑定。格式:#<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL>
virtual_ipaddress { #设定的vip,要和server在同一网段(网络地址要相同),且ip没有被使用
192.168.200.16
}
}
#下面这段可以不要,直接删除
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 {
weight 1
SSL_GET {
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
抢占式和非抢占式
- 抢占式是在主节点重新开启服务后vip会自动回来
- 非抢占式(nopreempt)是启动后不会回来
- 他需要在配置文件中修改两个地方,一个是将主节点的角色state改成和从节点一样的backup,然后新增一行’nopreempt’
smtp邮件发送
- 在vip发生转移后可以邮件告知
- 安装发邮件的工具dnf install -y s-nail
- 在配置文件中添加邮箱信息,这里使用网易邮箱,要现在网友邮箱里开通smtp和授权码
1
2
3
4set from=15079322375@163.com
set smtp=smtp.163.com
set smtp-auth-user=15079322375@163.com
set smtp-auth-password=Usdkdf23jU - 在keepalived中vrrp_instance快后添加内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35#定义了一个脚本
notify_master "/root/mail_keepalived.sh master"
notify_backup "/root/mail_keepalived.sh backup"
notify_fault "/root/mail_keepalived.sh fault"
#脚本mail_keepalived.sh
#!/bin/bash
contact=(15079322375@163.com 940341920@qq.com)
HOST_IP=$(ip a|egrep 'inet.*ens33$' | awk '{print $2}'| egrep -o '([0-9]{1,3}\.){3}[0-9]{3}')
notify(){
mailSubject="Vip transition, $HOST_IP keepalived to be $1 "
mailbody="$(data +'%F %T'):vrrp transition, $HOST_IP keepalived change to be $1"
for receiver in ${contact[*]};do
echo "$mailbody" | mail -s "$mailSubject" $receiver
done
}
case $1 in
master)
notify $1
;;
backup)
notify $1
;;
fault)
notify $1
;;
*)
echo "Usage:(master|backup|fault)"
exit 1
;;
esac
LVS负载均衡
功能介绍
- LVS是Linux Virtual Server的简称,当用户的请求过来时,会直接将流量分到Dierector Server上,然后将流量转到后端的RS服务器上
- 基本工作原理

LVS工作模式
LVS NAT模式
工作原理,通过在ipvs内核空间工作

NAT模式他是将client请求的数据包访问DS的vip,然后内部会先经过似进非进的状态(iptables链PREROUTING)然后数据会真正进入ds,将原先的vip指向rip,转到iptables链POSTROUTING,然后rs收到后会将原先的地址互换,就和寄快递一样,对方寄回来后双方的地址就是互相转换
配置方法(提前将防火墙和selinux关闭)
- 环境清单
DS:桥接ip:192.168.1.129/22 仅主机ip:192.168.222.135/24
RS1:192.168.222.136/24
RS2:192.168.222.137/24 - 三台服务器,一台作为DS/LB,两台作为RS。DS需要两张网卡,一张桥接,一张仅主机,RS都为仅主机模式,DS的桥接的IP要和宿主机的IP同网段、网关,仅主机的话就随便设一个ip
- RS的ip要和ds的仅主机网络同网段,网关指向ds的仅主机ip,这样的话,当client的流量过来,ds转到rs,rs就通过ds返回给client
- ds下载ipvsadm工具,用于做流量转发与端口监听
- 在ds上配置/etc/sysctrl.conf,配置完后刷新sysctrl -p
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61#永久生效配置/etc/sysctl.conf 添加如下内容:
#配置路由转发
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
#sysctl.conf配置详解
1、 kernel.shmall = 4294967296
含义:系统中共享内存页总数
2、kernel.panic = 1
含义:当出现系统内核崩溃的时候系统等待1秒钟,然后自动重启。
3、 net.ipv4.conf.all.accept_redirects = 0
含义:处于对网络的安全考虑关闭 ICMP 路由重定向
4、 net.ipv4.tcp_timestamps = 0
含义:如果前端有F5之类的负载均衡设备的话需要关闭此参数,否则会造成丢链接。
5、net.ipv4.conf.all.send_redirects = 0
含义:发送重定向,处于安全考虑关闭此选项。
6、net.ipv4.conf.default.send_redirects = 0
含义:同上
7、net.ipv4.conf.default.arp_ignore = 1
含义:确定不同的方式发送的回应收到 ARP 协议要求
0-(默认)代表任何地方的目标 IP地址,配置任何接口。
1-答复只有目标IP地址是本地地址上配置传入接口。
8、net.ipv4.conf.all.arp_ignore = 1
含义:同上
9、net.ipv4.ip_no_pmtu_disc = 1
含义:禁止“沿途 MTU 发现”。“沿途 MTU 发现”是一种技术,可以在传输路径上检测出
最大的MTU值。
10、net.ipv4.tcp_tw_reuse = 1
含义:默认值是 0,该文件表示是否允许重新应用处于 TIME-WAIT 状态的 socket 用于新
的TCP连接(这个对快速重启动某些服务,而启动后提示端口已经被使用的情形非常有帮助)
11、net.ipv4.tcp_tw_recycle = 1
含义:能够更快的回收 TIME-WAIT。默认值为1。
12、net.ipv4.ip_local_port_range = 10240 65000
含义:本地端口使用范围
13、net.ipv4.tcp_keepalive_time = 1800
含义:当启用keepalive 的时候,TCP发送keepalive消息的频度
14、net.ipv4.tcp_max_syn_backlog = 8192 含义:记录的那些尚未收到客户端确认信息的链接请求的最大值。 默认值为4096 如果设置这个值大于 4096 最好同时调整 include/net/tcp.h 中的 TCP_SYNQ_HSIZE,保证TCP_SYNQ_HSIZE*16 小于或等于tcp_max_syn_backlo,然后重新编译内核。
15、net.ipv4.tcp_syncookies = 1
含义:默认值是0,只有在内核编译时选择了 CONFIG_SYNCOOKIES时才会发生作用。当
出现syn等候队列,并出现溢出时,对方发送syncookies。目的是为了防止 syn flood 攻击。
16、net.ipv4.tcp_synack_retries = 3
含义:为了打开对端的链接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。
也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃链接前发送 SYN+ACK 包的
数量。 - 配置ipvsadm
1
2
3
4ipvsadm -C 清空配置 -L 查看配置
ipvsadm -A -t 192.168.1.129:80 -s wrr #桥接ip,s执行模式为加权轮询wrr
ipvsadm -a -t 192.168.1.129:80 -r 192.168.222.136:80 -m -w 1 #m为nat模式,w为权重
ipvsadm -a -t 192.168.1.129:80 -r 192.168.222.137:80 -m -w 1 - 在rs上安装nginx
- 然后就可以在宿主机上curl 192.168.1.129,就可以看到效果了
LVS DR模式
- 工作原理

- DR模式与NAT模式有点相反,NAT模式是通过在内部重新指向IP,且数据的出入都需要经过DS,DR模式是通过重新指向MAC,且数据从RS返回不需要经过DS,直接返回client
- 三台server都设成NAT模式,三台都绑定vip,ds绑定在ens网卡上,rs绑定在loop回环口上,用于认识ds传过来的vip,不至于拒绝数据包
配置方法
- 环境清单
DS:192.168.146.135/24 vip:192.168.146.250/24
RS1:192.168.146.136/24 vip:192.168.146.250/32
RS2:192.168.146.137/24 vip:192.168.146.250/32 - 在rs上安装工具net-tools,用于在回环口添加vip
- 设定vip为192.168.146.250,vip需要和正常ip同网段,因为ds的vip是设在ens网卡上
1
2
3
4
5
6#ds
nmcli con mod ens33 +ipv4.addresses 192.168.146.250/24
nmcli con up ens33
#rs,两台rs都需要添加
ifconfig lo:0 192.168.146.250/32 broadcast 192.168.146.250 up - rs上添加配置/etc/sysctrl.conf,对ARP进行限制
1
2
3
4net.ipv4.conf.ens33.arp_ignore = 1 #忽略arp广播
net.ipv4.conf.ens33.arp_announce = 2 #精确匹配ip地址回包
net.ipv4.conf.all.arp_announce = 2 #精确匹配ip地址回包
net.ipv4.conf.all.arp_ignore = 1 #忽略arp广播包 也就是只有发个接口地址是它本身的才接收 - ds上创建集群
1
2
3
4ipvsadm -C 清空配置 -L 查看配置
ipvsadm -A -t 192.168.146.250:80 -s rr #桥接ip,s执行模式为轮询rr
ipvsadm -a -t 192.168.146.250:80 -r 192.168.146.136:80 -g #g为dr模式
ipvsadm -a -t 192.168.146.250:80 -r 192.168.146.137:80 -g - 现在可以直接在宿主机curl 192.168.146.250了






