注意:以下内容是1.3.0以前的版本
第01节 Keepalived 的安装
yum -y install keepalived
第02节 Keepalived工作原理
keepalived 是一个类似于 layer3, 4 & 5 交换机制的软件:
Layer3: Keepalived 使用 Layer3 的方式工作式时, Keepalived 会定期向服务器群中的服务器发送一个 ICMP 的数据包(既我们平时用的 Ping 程序) , 如果发现某台服务的 IP 地址没有激活,Keepalived 便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。 Layer3 的方式是以服务器的 IP 地址是否有效作为服务器工作正常与否的标准。
Layer4:主要以 TCP 端口的状态来决定服务器工作正常与否。如 web server 的服务端口一般是80,如果 Keepalived 检测到 80 端口没有启动,则 Keepalived 将把这台服务器从服务器群中删除。
Layer7:Layer5 就是工作在具体的应用层了,比 Layer3,Layer4 要复杂一点,在网络上占用的带宽也要大一些。 Keepalived 将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则 Keepalived 将把服务器从服务器群中剔除。
Keepalived的作用与构建
1.管理 VIP。 VIP 会在 LVS 之间漂移
2.监控 LVS分发器
运行在主分发的 Keepalived 会以组播的形式向网络中宣告自己,即主分发器还活着,备用节点能收到。当备用节点,在一个时间单位中收不到组播,备用节点会认为主 LVS 挂了,开始接手主分发器工作,把 VIP 配给自己。
3.管理 RS
Keepalived 会每隔一个时间段去做一次类似于访问的操作如:
探针: elinks http://192.168.3.64 –dump
VRRP/HSRP工作原理
虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是由IETF提出的解决局域网中配置静态网关出现单点失效现象的路由协议。使用组播方式通信。
VRRP是一种路由容错协议,也可以叫做备份路由协议。一个局域网络内的所有主机都设置缺省路由(默认网关),当网内主机发出的目的地址不在本网段时,报文将被通过缺省路由发往外部路由器,从而实现了主机与外部网络的通信。当缺省路由器down掉(即端口关闭)之后,内部主机将无法与外部通信,如果路由器设置了VRRP时,那么这时,虚拟路由将启用备份路由器,从而实现全网通信。
HSRP是思科私有协议。VRRP中只有三种状态----初始状态(Initialize)、主状态(Master)、备份状态(Backup),而HSRP 有六种状态。
第03节 keepalived.conf
keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。
keepalived只有一个配置文件keepalived.conf,里面主要包括以下几个配置区域,分别是global_defs、static_ipaddress、static_routes、vrrp_script、vrrp_instance和virtual_server。
static_ipaddress和static_routes区域
static_ipaddress 和 static_routes 配置的是本节点的IP和路由信息。如果你的机器上已经配置了IP和路由,那么这两个区域可以不用配置。其实,一般情况下你的机器都会有IP地址和路由信息的,因此没必要再在这两个区域配置。
static_ipaddress {
10.210.214.163/24 brd 10.210.214.255 dev eth0
...
}
static_routes {
10.0.0.0/8 via 10.210.214.1 dev eth0
...
}
以上分别表示启动/关闭keepalived时在本机执行的如下命令:
/sbin/ip addr add 10.210.214.163/24 brd 10.210.214.255 dev eth0
/sbin/ip route add 10.0.0.0/8 via 10.210.214.1 dev eth0
/sbin/ip addr del 10.210.214.163/24 brd 10.210.214.255 dev eth0
/sbin/ip route del 10.0.0.0/8 via 10.210.214.1 dev eth0
注意: 请忽略这两个区域,因为我坚信你的机器肯定已经配置了IP和路由。
1、全局定义部分:
global_defs {
notification_email {
#email --root@localhost
#email --root@localhost
}
notification_email_from #email --root@localhost
smtp_server #host --localhost
smtp_connect_timeout #num --30
lvs_id #string --与lvs有关
router_id #string --标识当前节点名字,两个节点的此项需要不相同。故障发生时,邮件通知会用到该值
vrrp_mcast_group4 224.0.0.18 # optional, default 224.0.0.18
}
#默认的配置文件中,使用第三方 smtp 服务器,但这在现实中几乎没有意义,发不出邮件,我们将其挃定为 localhost, 我们也可以将通知信息的发送交给本地 sendmail 服务处理。
2、VRRP实例定义部分
包含 vrrp_instance 和 vrrp_sync_group 区域。
vrrp_rsync_group用来定义vrrp_intance组,使得这个组内成员动作一致。举个例子来说明一下其功能:
两个vrrp_instance同属于一个vrrp_rsync_group,那么其中一个vrrp_instance发生故障切换时,另一个vrrp_instance也会跟着切换(即使这个instance没有发生故障)。
vrrp_sync_group string {
group {
string
string
}
notify_master /path_to_script/script_master.sh # 表示当切换到master状态时,要执行的脚本
(or notify_master “ /path_to_script/script_master.sh <arg_list>”)
notify_backup /path_to_script/script_backup.sh # 表示当切换到backup状态时,要执行的脚本
(or notify_backup “/path_to_script/script_backup.sh <arg_list>”)
notify_fault /path_to_script/script_fault.sh # 表示切换出现故障时要执行的脚本
(or notify_fault “ /path_to_script/script_fault.sh <arg_list>”)
notify /path_to_script/script_fault.sh #notify 表示任何一状态切换时都会调用该脚本,并且该脚本在以上三个脚本执行完成之后进行调用,keepalived会自动传递三个参数($1 = "GROUP"|"INSTANCE",$2 = name of group or instance,$3 = target state of transition(MASTER/BACKUP/FAULT))。
}
vrrp_instance string { # 定义一个实例,一个集群就是一个实例。string可以改
state MASTER|BACKUP # 指定keepalived的角色,主节点和备用节点
interface eth0 # 绑定虚拟 IP 的网络接口 ,并用来发VRRP包。
#mcast_src_ip @IP
#use_vmac # 是否使用VRRP的虚拟MAC地址。
track_interface { # 监控以下网卡,如果任何一个不通就会切换到FALT状态(可选)
eth0
eth1
}
#lvs_sync_daemon_interface string
#garp_master_delay 10 # 当切为主状态后多久更新ARP缓存,默认5秒。
virtual_router_id num # VRRP 组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
priority num # 主节点的优先级(1-254 之间),备用节点必须比主节点优先级低
advert_int num # 组播信息发送间隔,两个节点设置必须一样
smtp_alert
authentication { # 设置验证信息,两个节点必须一致
auth_type PASS|AH # 认证类型有PASS和HA(IPSEC),推荐使用PASS(密码只识别前8位)。
auth_pass string
}
virtual_ipaddress { # 最多可以设置20个IP。指定虚拟 IP, 两个节点设置必须一样
10.210.214.253/24 brd 10.210.214.255 dev eth0
192.168.1.11/24 brd 192.168.1.255 dev eth1
}
virtual_ipaddress_excluded { # Unlimited IP addresses
@IP
@IP
@IP
}
virtual_routes {
172.16.0.0/12 via 10.210.214.1
192.168.1.0/24 via 192.168.1.1 dev eth1
default via 202.102.152.1
}
notify_master /path_to_script/script_master.sh # 表示当切换到master状态时,要执行的脚本
(or notify_master “ /path_to_script/script_master.sh <arg_list>”)
notify_backup /path_to_script/script_backup.sh # 表示当切换到backup状态时,要执行的脚本
(or notify_backup “ /path_to_script/script_backup.sh <arg_list>”)
notify_fault /path_to_script/script_fault.sh # 表示切换出现故障时要执行的脚本
(or notify_fault “ /path_to_script/script_fault.sh <arg_list>”)
}
vrrp_script区域
检测脚本一定要写在vrrp_instance的前面也就是上面,而且花括号一定要有空格,追踪trace_script要定在vip的后面,多少人栽在了这上面好多小时
先定义脚本
vrrp_script check_running {
script "/usr/local/bin/check_running"
interval 10 # 脚本执行间隔
weight 10 # 脚本结果导致的优先级变更:10表示优先级+10;-10则表示优先级-10
fall 2 # 检测两次都失败才失败
rise 1 # 检测一次成功就成功
}
然后在实例(vrrp_instance)里面引用,有点类似脚本里面的函数引用一样:先定义,后引用函数名。
track_script {
check_running
# check_running weight 20 会修改权重
}
注意:VRRP脚本(vrrp_script)和VRRP实例(vrrp_instance)属于同一个级别
案例1
vrrp_script chk_http_port {
script "</dev/tcp/127.0.0.1/80"
interval 1
weight -10
}
案例2
vrrp_script chk_nginx {
script "killall -0 nginx"
# kill -0 pid 不发送任何信号,检查一个进程是否存在,存在返回0;不存在返回1
interval 2 # 每2s检测一次
weight -5 # 检测失败(脚本返回非0)则优先级减少5
fall 2 # 连续2次失败才会用weight减少优先级(1-255之间)
rise 1 # 检测 1 次成功就算成功。但不修改优先级
}
3、LVS虚拟服务器定义部分
virtual_server_group和virtual_server区域。此部分只与LVS结合。
virtual_server_group一般在超大型的LVS中用到,一般LVS用不过这东西,因此不多说。
# 定义对外提供服务的LVS的VIP以及port
virtual_server (@IP PORT)|(fwmark num) {
delay_loop #num --Keepalived 多长时间监测一次
lb_algo #rr|wrr|lc|wlc|sh|dh|lblc --分发算法
lb_kind #NAT|DR|TUN --模式
(nat_mask @IP) # 在Linux kernel 2.2下使用
persistence_timeout #num --同一 IP 50秒内的请求都发到同个real server ,这个会影响LVS的 rr 调度算法, 同一 IP 超过 50 秒后,再次访问,才会被转发到另一台 real server 上。 persistence 持久性的意思
persistence_granularity @IP
virtualhost #string
protocol #TCP|UDP
sorry_server @IP PORT # 如果后端服务器都挂了,就转到此服务。
real_server @IP PORT {
weight #num --配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器
TCP_CHECK {
connect_port #num --检测端口
connect_timeout 2 # 表示 3 秒无响应超时
nb_get_retry 2 # 表示重试次数
delay_before_retry 2 # 表示重试间隔
}
}
real_server @IP PORT {
weight #num
MISC_CHECK {
misc_path /path_to_script/script.sh
(or misc_path “ /path_to_script/script.sh <arg_list>”)
}
}
}
# 默认配置文件中还有两个 virtual_server 模版,把剩下的都删除了,就可以。 如:
# virtual_server 10.10.10.2 1358 { 。。。 }
# virtual_server 10.10.10.3 1358 { 。。。 }
real_server @IP PORT {
weight #num
HTTP_GET|SSL_GET {
url { # You can add multiple url block
path alphanum
digest alphanum
}
connect_port #num
connect_timeout #num
retry #num
delay_before_retry #num
}
}
4、LVS虚拟服务器健康检查方式
健康检查方式一共有HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC_CHECK
1、HTTP_GET
real_server @IP PORT {
weight #num
HTTP_GET { # 设置检测后端realserver的方式为获取http协议报文
url {
path /
status_code 200 # 状态码为200则证明后端服务器是在线的
}
connect_timeout 3 # 设置超时时间
nb_get_retry 3 # 设置超时时候重试几次
delay_before_retry 3 # 在重试的时候的时间间隔
}
}
2、 SSL_GET
real_server @IP PORT {
weight #num
SSL_GET
{
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c #digest需要genhash程序得到MD5自字串。
}
connect_timeout 3
retry 3
delay_before_retry 2
}
}
genhash –s 192.168.100.2 –p 80 –u /testurl/test.jsp
--------------------------[ HTTP Header Buffer ]--------------------------
0000 48 54 54 50 2f 31 2e 31 - 20 34 30 31 20 55 6e 61 HTTP/1.1 401 Una
0010 75 74 68 6f 72 69 7a 65 - 64 0d 0a 44 61 74 65 3a uthorized..Date:
0020 20 4d 6f 6e 2c 20 32 33 - 20 41 70 72 20 32 30 30 Mon, 23 Apr 200
0030 31 20 31 35 3a 34 31 3a - 35 34 20 47 4d 54 0d 0a 1 15:41:54 GMT..
0040 41 6c 6c 6f 77 3a 20 47 - 45 54 2c 20 48 45 41 44 Allow: GET, HEAD
0050 0d 0a 53 65 72 76 65 72 - 3a 20 4f 72 61 63 6c 65 ..Server: Oracle
0060 5f 57 65 62 5f 4c 69 73 - 74 65 6e 65 72 2f 34 2e _Web_Listener/4.
0070 30 2e 38 2e 31 2e 30 45 - 6e 74 65 72 70 72 69 73 0.8.1.0Enterpris
0080 65 45 64 69 74 69 6f 6e - 0d 0a 43 6f 6e 74 65 6e eEdition..Conten
0090 74 2d 54 79 70 65 3a 20 - 74 65 78 74 2f 68 74 6d t-Type: text/htm
00a0 6c 0d 0a 43 6f 6e 74 65 - 6e 74 2d 4c 65 6e 67 74 l..Content-Lengt
00b0 68 3a 20 31 36 34 0d 0a - 57 57 57 2d 41 75 74 68 h: 164..WWW-Auth
00c0 65 6e 74 69 63 61 74 65 - 3a 20 42 61 73 69 63 20 enticate: Basic
00d0 72 65 61 6c 6d 3d 22 41 - 43 43 45 53 20 20 20 20 realm="ACCES
00e0 22 0d 0a 43 61 63 68 65 - 2d 43 6f 6e 74 72 6f 6c "..Cache-Control
00f0 3a 20 70 75 62 6c 69 63 - 0d 0a 0d 0a : public....
------------------------------[ HTML Buffer ]-----------------------------
0000 3c 48 54 4d 4c 3e 3c 48 - 45 41 44 3e 3c 54 49 54 <HTML><HEAD><TIT
0010 4c 45 3e 55 6e 61 75 74 - 68 6f 72 69 7a 65 64 3c LE>Unauthorized<
0020 2f 54 49 54 4c 45 3e 3c - 2f 48 45 41 44 3e 0d 0a /TITLE></HEAD>..
0030 3c 42 4f 44 59 3e 54 68 - 69 73 20 64 6f 63 75 6d <BODY>This docum
0040 65 6e 74 20 69 73 20 70 - 72 6f 74 65 63 74 65 64 ent is protected
0050 2e 20 20 59 6f 75 20 6d - 75 73 74 20 73 65 6e 64 . You must send
0060 0d 0a 74 68 65 20 70 72 - 6f 70 65 72 20 61 75 74 ..the proper aut
0070 68 6f 72 69 7a 61 74 69 - 6f 6e 20 69 6e 66 6f 72 horization infor
0080 6d 61 74 69 6f 6e 20 74 - 6f 20 61 63 63 65 73 73 mation to access
0090 20 69 74 2e 3c 2f 42 4f - 44 59 3e 3c 2f 48 54 4d it.</BODY></HTM
00a0 4c 3e 0d 0a - L>..
-----------------------[ HTML MD5 final resulting ]-----------------------
MD5 Digest : ec90a42b99ea9a2f5ecbe213ac9eba03
3、TCP_CHECK
TCP_CHECK {
connect_port 80
bindto 192.168.1.1
connect_timeout 4
}
4、SMTP方式,这个可以用来给邮件服务器做集群
SMTP_CHECK {
host {
connect_ip <IP ADDRESS>
connect_port <PORT> #默认检查25端口
14 KEEPALIVED
bindto <IP ADDRESS>
}
connect_timeout <INTEGER>
retry <INTEGER>
delay_before_retry <INTEGER>
helo_name <STRING>|<QUOTED-STRING>
}
5、MISC方式,这个可以用来检查很多服务器只需要自己会些脚本即可
MISC_CHECK {
misc_path <STRING>|<QUOTED-STRING> #外部程序或脚本
misc_timeout <INT> #脚本或程序执行超时时间
misc_dynamic #这个就很好用了,可以非常精确的来调整权重,是后端每天服务器的压力都能均衡调配,这个主要是通过执行的程序或脚本返回的状态代码来动态调整weight值,使权重根据真实的后端压力来适当调整,不过这需要有过硬的脚本功夫才行哦
#返回0:健康检查没问题,不修改权重
#返回1:健康检查失败,权重设置为0
#返回2-255:健康检查没问题,但是权重却要根据返回代码修改为返回码-2,例如如果程序或脚本执行后返回的代码为200,#那么权重这回被修改为 200-2
}
第04节 keepalived运行参数
keepalived -h
keepalived -h
Usage: keepalived [OPTION...]
-f, --use-file=FILE Use the specified configuration file
-P, --vrrp Only run with VRRP subsystem
-C, --check Only run with Health-checker subsystem
-l, --log-console Log messages to local console
-D, --log-detail Detailed log messages
-S, --log-facility=[0-7] Set syslog facility to LOG_LOCAL[0-7]
-X, --release-vips Drop VIP on transition from signal.
-V, --dont-release-vrrp Don't remove VRRP VIPs and VROUTEs on daemon stop
-I, --dont-release-ipvs Don't remove IPVS topology on daemon stop
-R, --dont-respawn Don't respawn child processes
-n, --dont-fork Don't fork the daemon process
-d, --dump-conf Dump the configuration data
-p, --pid=FILE Use specified pidfile for parent process
-r, --vrrp_pid=FILE Use specified pidfile for VRRP child process
-c, --checkers_pid=FILE Use specified pidfile for checkers child process
-a, --address-monitoring Report all address additions/deletions notified via netlink
-x, --snmp Enable SNMP subsystem
-A, --snmp-agent-socket=FILE Use the specified socket for master agent
-s, --namespace=NAME Run in network namespace NAME (overrides config)
-m, --core-dump Produce core dump if terminate abnormally
-M, --core-dump-pattern=PATN Also set /proc/sys/kernel/core_pattern to PATN (default 'core')
-i, --config_id id Skip any configuration lines beginning '@' that don't match id
-v, --version Display the version number
-h, --help Display this help message
gehash
GEHASH二进制用于生成摘要字符串。GeHASH命令行参数是:
--use-ssl -S Use SSL connection to remote server.
--server -s Use the specified remote server address.
--port -p Use the specified remote server port.
--url -u Use the specified remote server url.
--use-virtualhost -V Use the specified virtualhost in GET query.
--hash -H Use the specified hash algorithm.
--verbose -v Use verbose mode output.
--help -h Display this short inlined help screen.
--release -r Display the release number.
--fwmark -m Use the specified FW mark.
第05节 keepalived运行日志
在 /var/log/messages 里查看:
Keepalived: Starting Keepalived v0.6.1 (06/13, 2002)
Keepalived: Configuration is using : 92013 Bytes
Keepalived: ------< Global definitions >------
Keepalived: LVS ID = LVS_PROD
Keepalived: Smtp server = 192.168.200.1
Keepalived: Smtp server connection timeout = 30
Keepalived: Email notification from = [email protected]
Keepalived: Email notification = [email protected]
Keepalived: Email notification = [email protected]
Keepalived: ------< SSL definitions >------
Keepalived: Using autogen SSL context
Keepalived: ------< LVS Topology >------
Keepalived: System is compiled with LVS v0.9.8
Keepalived: VIP = 10.10.10.2, VPORT = 80
Keepalived: VirtualHost = www.domain1.com
Keepalived: delay_loop = 6, lb_algo = rr
Keepalived: persistence timeout = 50
Keepalived: persistence granularity = 255.255.240.0
Keepalived: protocol = TCP
Keepalived: lb_kind = NAT
Keepalived: sorry server = 192.168.200.200:80
Keepalived: RIP = 192.168.200.2, RPORT = 80, WEIGHT = 1
Keepalived: RIP = 192.168.200.3, RPORT = 80, WEIGHT = 2
Keepalived: VIP = 10.10.10.3, VPORT = 443
Keepalived: VirtualHost = www.domain2.com
Keepalived: delay_loop = 3, lb_algo = rr
Keepalived: persistence timeout = 50
Keepalived: protocol = TCP
Keepalived: lb_kind = NAT
Keepalived: RIP = 192.168.200.4, RPORT = 443, WEIGHT = 1
Keepalived: RIP = 192.168.200.5, RPORT = 1358, WEIGHT = 1
Keepalived: ------< Health checkers >------
Keepalived: 192.168.200.2:80
Keepalived: Keepalive method = HTTP_GET
Keepalived: Connection timeout = 3
Keepalived: Nb get retry = 3
Keepalived: Delay before retry = 3
Keepalived: Checked url = /testurl/test.jsp,
Keepalived: digest = 640205b7b0fc66c1ea91c463fac6334d
Keepalived: 192.168.200.3:80
Keepalived: Keepalive method = HTTP_GET
Keepalived: Connection timeout = 3
Keepalived: Nb get retry = 3
Keepalived: Delay before retry = 3
Keepalived: Checked url = /testurl/test.jsp,
Keepalived: digest = 640205b7b0fc66c1ea91c463fac6334c
Keepalived: Checked url = /testurl2/test.jsp,
Keepalived: digest = 640205b7b0fc66c1ea91c463fac6334c
Keepalived: 192.168.200.4:443
Keepalived: Keepalive method = SSL_GET
Keepalived: Connection timeout = 3
Keepalived: Nb get retry = 3
Keepalived: Delay before retry = 3
Keepalived: Checked url = /testurl/test.jsp,
Keepalived: digest = 640205b7b0fc66c1ea91c463fac6334d
Keepalived: Checked url = /testurl2/test.jsp,
Keepalived: digest = 640205b7b0fc66c1ea91c463fac6334d
Keepalived: 192.168.200.5:1358
Keepalived: Keepalive method = TCP_CHECK
Keepalived: Connection timeout = 3
Keepalived: Registering Kernel netlink reflector
修改日志路径
Keepalived默认所有的日志都是写入到/var/log/message下的,由于message的日志太多了,而Keepalived的日志又很难分离出来,所以本文提供了一个调整Keepalived日志输出路径的方法。 具体操作步骤如下:
一、修改 /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D"
# 修改为
KEEPALIVED_OPTIONS="-D -d -S 0"
# 其中-S指定syslog的facility
二、设置syslog,修改/etc/rsyslog.conf,添加内容如下
local0.* /var/log/keepalived.log
注意:local0是l是字符L的小写
三、重启服务
service keepalived restart
service rsyslog restart
第06节 主备角色选举策略
在Keepalived中使用vrrp_script模块时整个集群角色的选举算法,由于“weight”值可以是正数也可以是负数,因此,要分两种情况进行说明。
1. weight值为正数时
在vrrp_script中指定的脚本如果检测成功,那么Master节点的权值将是“weight值与”priority“值之和,如果脚本检测失败,那么Master节点的权值保持为“priority”值,因此切换策略为:
-
Master节点“vrrp_script”脚本检测失败时,如果Master节点“priority”值小于Backup节点“weight值与”priority“值之和,将发生主、备切换。
-
Master节点“vrrp_script”脚本检测成功时,如果Master节点“weight”值与“priority”值之和大于Backup节点“weight”值与“priority”值之和,主节点依然为主节点,不发生切换。
2. weight值为负数时
在“vrrp_script”中指定的脚本如果检测成功,那么Master节点的权值仍为“priority”值,当脚本检测失败时,Master节点的权值将是“priority“值与“weight”值之差,因此切换策略为:
-
Master节点“vrrp_script”脚本检测失败时,如果Master节点“priority”值与“weight”值之差小于Backup节点“priority”值,将发生主、备切换。
-
Master节点“vrrp_script”脚本检测成功时,如果Master节点“priority”值大于Backup节点“priority”值时,主节点依然为主节点,不发生切换。
在熟悉了Keepalived主、备角色的选举策略后,再来分析一下,如果A、B两个节点设置的“weight”值都为10,而A的“priority”为100,B的“priority”为80,因此符合选举策略的第一种,在A节点停止Mysql服务后,A节点的脚本检测将失败,此时A节点的权值将保持为A节点上设置的“priority”值,即为100,而B节点的权值将变为“weight”值与“priority”值之和,也就是90(10+80),这样就出现了A节点权值仍然大于B节点权值的情况,因此不会发生主、备切换。
对于“weight”值的设置,有一个简单的标准,即“weight”值的绝对值要大于Master和Backup节点“priority”值之差。对于上面A、B两个节点的例子,只要设置“weight”值大于20即可保证集群正常运行和切换。由此可见,对于“weight值的设置,要非常谨慎,如果设置不好,将导致集群角色选举失败,使集群陷于瘫痪状态。
3. 抢占模式介绍
1、抢占模式配置(默认)
global_defs {
router_id nginx_01 #标识本节点的名称,通常为hostname
vrrp_mcast_group4 224.0.67.67
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2 #每2秒检测一次nginx的运行状态
weight -20 #失败一次,将自己的优先级-20
}
vrrp_instance VI_1 {
state MASTER # 状态,主节点为MASTER,备份节点为BACKUP
interface enp0s3 # 绑定VIP的网络接口,通过ifconfig查看自己的网络接口
virtual_router_id 51 # 虚拟路由的ID号,两个节点设置必须一样,可选IP最后一段使用,相同的VRID为一个组,他将决定多播的MAC地址
mcast_src_ip 192.168.1.201 # 本机IP地址
priority 100 # 节点优先级,值范围0~254,MASTER要比BACKUP高
advert_int 1 # 组播信息发送时间间隔,两个节点必须设置一样,默认为1秒
# 设置验证信息,两个节点必须一致
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟IP,两个节点设置必须一样。可以设置多个,一行写一个
virtual_ipaddress {
192.168.1.210
}
track_script {
chk_nginx # nginx存活状态检测脚本
}
}
分别在主备服务器/etc/keepalived
目录下创建nginx_check.sh
脚本,并为其添加执行权限 chmod +x /etc/keepalived/nginx_check.sh 。用于keepalived定时检测nginx的服务状态,如果nginx停止了,会尝试重新启动nginx,如果启动失败,会将keepalived进程杀死,将vip漂移到备份机器上。
#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then
/opt/nginx/sbin/nginx #尝试重新启动nginx
sleep 2 #睡眠2秒
if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
killall keepalived #启动失败,将keepalived服务杀死。将vip漂移到其它备份节点
fi
fi
2、非抢占模式
global_defs {
router_id nginx_01 #标识本节点的名称,通常为hostname
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface enp0s3
virtual_router_id 51
mcast_src_ip 192.168.1.201
priority 100
advert_int 1
nopreempt #增加的部分
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.210
}
track_script {
chk_nginx # nginx存活状态检测脚本
}
}
和抢占模式的配置相比,只改了两个地方:
1> 在vrrp_instance块下两个节点各增加了nopreempt指令,表示不争抢vip
2> 节点的state都为BACKUP
两个keepalived节点都启动后,默认都是BACKUP状态,双方在发送组播信息后,会根据优先级来选举一个MASTER出来。由于两者都配置了nopreempt,所以MASTER从故障中恢复后,不会抢占vip。这样会避免VIP切换可能造成的服务延迟。
第07节 LVS配置
注意了,这里LVS配置并不是指真的安装LVS然后用ipvsadm来配置他,而是用keepalived的配置文件来代替ipvsadm来配置LVS,这样会方便很多,一个配置文件搞定这些,维护方便,配置方便是也!
这里LVS配置也有两个配置
1,虚拟主机组配置文件详解 这个配置是可选的,根据需求来配置吧,这里配置主要是为了让一台realserver上的某个服务可以属于多个Virtual Server,并且只做一次健康检查
virtual_server_group <STRING> {
# VIP port
<IPADDR> <PORT>
<IPADDR> <PORT>
fwmark <INT>
group string
}
2,虚拟主机配置
virtual server可以以下面三种的任意一种来配置
1. virtual_server IP port{}
2. virtual_server fwmark int{}
3. virtual_server group string{}
下面以第一种比较常用的方式来配详细解说一下
virtual_server 192.168.1.2 80 {
delay_loop 3 # service polling的delay时间,即服务轮询的时间间隔
lb_algo rr|wrr|lc|wlc|lblc|sh|dh #LVS调度算法
lb_kind NAT|DR|TUN #LVS集群模式
persistence_timeout 120 #会话保持时间(秒),即用户在120秒内被分配到同一个后端
persistence_granularity <NETMASK> #LVS会话保持粒度,ipvsadm中的-M参数,默认是0xffffffff,即每个客户端都做会话保持
protocol TCP #健康检查用的是TCP还是UDP
ha_suspend #suspendhealthchecker’s activity
virtualhost <string> #HTTP_GET做健康检查时,检查的web服务器的虚拟主机(即host:头)
sorry_server <IPADDR> <PORT> #备用机,就是当所有后端realserver节点都不可用时,就用这里设置的,也就是临时把所有的请求都发送到这里啦
real_server <IPADDR> <PORT> { #后端真实节点主机的权重等设置
weight 1 #给每台的权重,0表示失效,默认是1
inhibit_on_failure #表示在节点失败后,把他权重设置成0,而不是冲IPVS中删除
notify_up <STRING> | <QUOTED-STRING> #检查服务器正常(UP)后,要执行的脚本
notify_down <STRING> | <QUOTED-STRING> #检查服务器失败(down)后,要执行的脚本
HTTP_GET { #健康检查方式
url { #要坚持的URL,可以有多个
path / #具体路径
digest <STRING>
status_code 200 #返回状态码
}
connect_port 80 #监控检查的端口
bindto <IPADD> #健康检查的IP地址
connect_timeout 3 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 2 #重连间隔
} # END OF HTTP_GET
} # END OF Realserver
} # END OF Virtual Server
注意:1.3.0以后的版本
1.3.0之前的配置
global_defs {
router_id ngnix_B
}
vrrp_script chk_nginx {
script "</dev/tcp/127.0.0.1/81"
interval 3
weight -40
}
1.3.0之后的配置
-
新建一个keepalived_script的用户,和新建/etc/keepalived/check.sh文件,把”</dev/tcp/127.0.0.1/81“复制进去。
-
设置/etc/keepalived/check.sh的属主用户是keepalived_script,并且用户keepalived_script有可执行权限
-
然后修改keepalived的配置文件
global_defs {
router_id ngnix_A
enable_script_security # 添加此行
}
vrrp_script chk_nginx {
script "/etc/keepalived/check.sh"
interval 3
weight -40
}