This commit is contained in:
2021-11-14 14:32:08 +08:00
parent f75ad8bedd
commit b0f6120151
152 changed files with 22219 additions and 8 deletions

View File

@@ -0,0 +1,195 @@
---
title: "Keepalived 基础"
date: 2019-10-30T11:26:18+08:00
lastmod: 2019-10-30T11:26:18+08:00
tags: ["keepalived"]
categories: ["ha/lb"]
---
# VRRP 简介
- VRRP通过一种竞选协议动态地将路由任务交给LAN中**虚拟路由器**中的某台**VRRP路由器**
- VRRP路由器是一台实现了VRRP协议(运行VRRPD程序)的物理路由器
- 虚拟路由器是由多台VRRP物理路由器组成的逻辑路由器对外看起来就像一台路由器
- 虚拟路由器中只有一台MASTER物理路由器工作其他都是BACKUP
- MASTER路由器一直发送VRRP广播MASTER不可用后(BACKUP收不到广播)其余BACKUP会根据优先级竞选出一台MASTER
- MASTER拥有虚拟路由器IP地址及其它路由配置
# 全局配置
- 全局定义
```
global_defs {
notification_email {
admin@exammple.com #keepalived发生事件时通知该email
...
}
notification_email_from admin@example.com
smtp_server 127.0.0.1 #smtp服务器
smtp_connect_timeout 30
router_id my_hostname #机器标识
default_interface eth0 #设置静态地址默认绑定的端口默认是eth0
vrrp_mcast_group4 #VRRP 的组播IPV4地址默认224.0.0.18
vrrp_mcast_group6 #VRRP 的组播IPV4地址默认ff02::12
vrrp_version 2|3 #设置默认的VRRP版本默认是2
script_user <username> [groupname] #设置运行脚本默认用户和组如果没有指定则默认用户为keepalived_script(需要该用户存在)否则为root用户默认groupname同username
enable_script_security #如果脚本路径的任一部分对于非root用户来说都具有可写权限则不会以root身份运行脚本
}
```
- 静态地址和路由,不随 vrrpd instance 的开/关变化
```
static_ipaddress {
$ip/$mask dev $interface #ip命令规则
...
}
static_routes {
$dest_ip/$dest_mask via $dest_gateway dev $interface #ip命令规则
...
}
```
- 一般服务器都配置了网络信息,所以通常无需配置静态地址和路由,如果不指定 dev则使用 default_interface
# VRRPD 配置
- VRRP检查脚本(vrrp_script)
```
vrrp_script <SCRIPT_NAME> {
scrip "/path/to/script-file" #可执行的脚本的绝对路径
interval <INTEGER> #脚本执行的间隔单位是秒默认为1s
timeout <INTEGER> #指定在多少秒后,脚本被认为执行失败
weight <-254 --- 254> #调整优先级默认为2
#如果脚本执行成功(退出状态码为0)weight大于0则priority增加
#如果脚本执行失败(退出状态码为非0)weight小于0则priority减少
#其他情况下priority不变
rise <INTEGER> #执行成功多少次才认为是成功
fall <INTEGER> #执行失败多少次才认为失败
user <USERNAME> [GROUPNAME] #运行脚本的用户和组
init_fail #假设脚本初始状态是失败状态
}
```
- VRRP同步组(sync group)
```
vrrp_sync_group VG_1 {
group {
inside_network #实例名
...
}
notify_master /path/to/master.sh #切换到master时执行该脚本
notify_backup /path/to/backup.sh #切换到backup时执行该脚本
notify_fault /path/to/fault.sh #出错时执行该脚本
notify /path/to/notify.sh #该脚本会在notify_*脚本后执行默认3个参数:$1(GROUP|INSTANCE),$2(group或instance名字),$3(MASTER|BACKUP|FAULT)
smtp_alert #发送邮件通知
}
```
- VRRP实例(instance)配置
```
vrrp_instance inside_network {
state MASTER #初始状态
interface eth0 #绑定的网卡
dont_track_primary #忽略VRRP的interface错误(默认不设置)
track_interface { #这里的任一网卡出现问题都会进入FAULT状态
eth0
eth1 weight <-254 - 254>
...
}
track_script { #这里的任一脚本返回码非0都会进入FAULT状态
<SCRIPT_NAME>
<SCRIPT_NAME> weight <-254-254>
...
}
mcast_src_ip <IPADDR> #多播包发送源地址默认网卡当前ip
garp_master_delay 10 #切换到MASTER后延迟arp请求
virtual_router_id 1 #VRID标记(0..255)
priority 100 #高优先级竞选为MASTERMASTER高于BACKUP至少50
advert_int 1 #检查间隔默认1秒
authentication {
auth_type PASS #密码认证
auth_pass 1111
}
virtual_ipaddress { #漂移地址符合ip命令规则
$vip/$vmask dev $interface
...
}
virtual_routes { #随地址一同漂移的路由符合ip命令规则
$dest_ip/$dest_mask via $dest_gateway dev $interface
...
}
nopreempt #BACKUP配置且优先级比其他高
preempt_delay 300 #抢占延迟默认5分钟
debug #Debug级别
lvs_sync_daemon_interface #lvn syncd绑定的网卡
}
```
# LVS配置(不涉及lvs时无需下面配置)
- 虚拟主机组
```
virtual_server_group <STRING> {
#VIP VPORT
<IPADDR> <PORT>
<IPADDR> <PORT>
...
fwmark <INT>
}
```
- 虚拟主机3中配置
```
#virtual_server IP port
#virtual_server fwmark int
#virtual_server group string
virtual_server 192.168.1.229 80 { #配置一个virtual server
delay_loop 3 #每隔3秒检查一次RealServer是否可用
lb_algo rr|wrr|lc|wlc|lblc|sh|dh #LVS调度算法
lb_kind NAT|DR|TUN #LVS集群模式
persistence_timeout 120 #同一个客户端IP在120秒内分到同一个RealServer
persistence_granularity <NETMASK> #会话保持粒度默认255.255.255.255即根据每个客户端IP做会话保持
protocol TCP #协议
ha_suspend
virtualhost <string> #HTTP_GET健康检查时使用的HOST}
sorry_server <IPADDR> <PORT> #所有RS失效后连接该备用机
real_server <IPADDR> <PORT> {
weight 1 #默认1,0失效
inhibit_on_failure #健康检查失败后将weight置0,不从IPVS中删除
notify_up <STRING> #检测到service up后执行的脚本
notify_down <STRING> #检测到service down后执行的脚本
#检查方式HTTP_GET|SSL_GET|TCP_CHECK
HTTP_GET|SSL_GET {
url {
path /
digest <STRING> #SSL检查返回的摘要信息
status_code 200 #HTTP检查返回的状态码
}
connect_port 80 #检查端口
bindto <IPADDR> #使用该地址发送健康检查
connect_timeout #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 2 #重连间隔(秒)
}
TCP_CHECK {
connect_port 80
bindto <IPADDR>
connect_timeout 4
}
}
}
```
# 配置日志文件
- 修改服务启动参数
```bash
sed -i '/^KEEPALIVED_OPTIONS/d' /etc/sysconfig/keepalived
echo 'KEEPALIVED_OPTIONS="-D -d -S 2"' >> /etc/sysconfig/keepalived
```
- 修改 rsyslog 配置文件
```bash
echo "local2.* /var/log/keepalived.log" >> /etc/rsyslog.conf
```
- 重启 rsyslog 服务
```bash
systemctl restart rsyslog
```
- 重启 keepalived 服务
```bash
systemctl restart keepalived
```
# 其他参考
- [详细解释](https://blog.csdn.net/wos1002/article/details/56483325)