简介:
Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。这段话是截取自百科。既然说到这里一定要说说,keepalived特性:
1,keepalived的是利用vip功能实现服务漂移,这是一种VRRP虚拟路由技术。VRRP协议在linux主机上以守护进程方式的实现;
2,keepalived的主备node服务都需要启动。默认是高可用自身和你需要检查的服务。
但是有些场景可能不适用,例如dhcp或dns。一个网络中不能有两个dhcp或dns,所以适用是要注意了。另外值得注意的是他的LVS功能,这是一个LVS加强版,keepalived具有LVS没有的状态检测功能。
keepalived本身是没有资源管理层,只有心跳状态层。它实现管理管理是由脚本实现的
注意:
所有高可用的通性:ntp时间同步,本地dns相互解析。
HA Cluster配置前提:
1,本机的主机名与hosts中定义额主机名保持一致,要与hostname(uname -n)获得的名称保持一致
contos 6: /etc/sysconfig/network
contos 7:hostnamectl set-hostname HOSTNAME
各节点要能互相解析主机名:一般建议通过hosts文件进行解析:
2,各节点时间同步:
3,确保iptables及seliux
准备工作
web1|web2
编辑hosts文件
172.16.90.130 web1.test.com web1
172.16.90.140 web2.test.com web2
查看hostname uname -n
date;ssh web2 ‘date’
高可用httpd示例:
global_defs {
notification_email {
nodesite1@163.com
}
notification_email_from nodesite1@163.com
smtp_server smtp.163.com
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.0.18
}
vrrp_script chk_httpd {
script "killall -0 httpd" #代码可以在复杂点
interval 2
weight -2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass JXLGOkFnS+8=
}
virtual_ipaddress {
192.168.100.10/24 dev eth0 label eth0:0
}
track_script {
chk_httpd
}
}
启动日志
两个节点各都要做响应的设置。启动服务后
1,查看进程
ps aux
root 2232 0.0 0.2 110744 1212 ? Ss 09:29 0:00 /usr/sbin/keepalived -D
root 2234 0.0 0.6 112980 2936 ? S 09:29 0:00 /usr/sbin/keepalived -D
root 2235 0.0 0.4 112848 2020 ? S 09:29 0:00 /usr/sbin/keepalived -D
2,查看ip
eth0:0 Link encap:Ethernet HWaddr 00:0C:29:B5:52:67
inet addr:172.16.200.20 Bcast:0.0.0.0 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
3,启动keepalived的日志文件 默认是LOG_DOMAIN这个级别是没有的
[root@web1 ~]# keepalived -help
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]
-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
-x, --snmp Enable SNMP subsystem
-v, --version Display the version number
-h, --help Display this help message
[root@web1 ~]#
编辑/etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -S 3"
添加日志级别3 vim /etc/rsyslog.conf
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
local3.* /var/log/keepalived
查看进程
tcp LISTEN 0 25 :::514 :::*
tcp LISTEN 0 25 *:514 *:*
4,指定检查脚本实现手动主备切换
定义脚本两种不同的形式
vrrp_script chk_schedown { #
script "[[ -f /etc/keepalived/down ] ] &&exit 1 || exit0 " #检查文件是否存在,存在返回为返回0权重-2
interval 2 每隔两秒钟执行一次
weight -2 一旦命令失败,权重降低2 (文件不存在返回1 就是失败)
}
vrrp_script chk_schedown {
script "/root/vpnjiance.sh"
interval 2
weight -2
}
#!/bin/bash
#
[[ -f /etc/keepalived/down ]] && exit 1 || exit 0
在虚拟路由实例中调用
vrrp_instance VI_1 {
track_script { #这是一个检测脚本的方法
chk_schedown
}
}
说明:
track_script指定检查脚本,定期运行它们来改变优先级,并最终引发主备切换。
下面是手册中未更新的两个小功能:
1、vrrp_script和track_script
track_script指定检查脚本,定期运行它们来改变优先级,并最终引发主备切换。如果配过交换机的vrrp/hsrp部分的话,应该对这个功能比较熟悉
2、notify_stop
keepalived停止运行前运行notify_stop指定的脚本
下面是我这边应用上面两个功能介绍:
1、两台双master台数据库,用keepalivd的vrrp模式给客户端提供一个HA的虚拟IP
这个要求检查mysql数据库的状态,如果mysql出现问题,就降低优先级,这样虽然机器正常,也会引发新一轮的master选举,以保证mysql服务的高可用性
先定义两个检查脚本
vrrp_script chk_mysqld {
script "/usr/bin/mysqladmin -u ganglia extended-status -pganglia_status | grep -q Slave_running"
interval 10 # check every 10 seconds
weight -40 # if failed, decrease 40 of the priority
fall 3 # require 2 failures for failures
rise 1 # require 1 sucesses for ok
}
vrrp_script chk_schedown { #chk_NAME名字可以自己定义
script "if [ -f /var/run/down ]; then exit 1; else exit 0; fi" 成功返回1 失败返回0
interval 10 # check every 10 seconds
weight -40 # if failed, decrease 40 of the priority
fall 1 # require 2 failures for failures
rise 1 # require 1 sucesses for ok
}
上面的chk_schedown脚本,给管理员提供一个切换的地方,如果管理员在master上手工touch /var/run/down,这样,流量会比这台机器上切走了。
在vrrp对应的地方使用它
vrrp_instance VI_1 {
track_script {
chk_mysqld
chk_schedown
}
}
2、为一些后台cron脚本提供高可用性
有些后台脚本,如给用户发短信或邮件,它需要在一台机器上运行,但是不能同时在多台机器上运行。如果只配在某台机器上,当它出现问题的时候,这些后台脚本就停止运行了。
这边的做法是,利用notify和notify_stop脚本,在MASTER机器上生成一个状态文件,所有机器都配同样的cron配置和定时运行同样的脚本,不同的是脚本在运行时首先检查是不是master,如果不是,则直接退出。这样多台机器都会定期运行后台脚本,但只有一台真正执行。
注意:做LVS时候一定要把把DIP和VIP统一接口,同时流动
LVS实现利用了同步组(同步组一般用于一次同步多个ip资源时)
定义同步组VRRP synchronization group
vrrp_sync_group VG_1 { #定义一个同步组
group { #这个组调用了哪些实例
VI_1
VI_2
...
}
}
vrrp_instance VI_1 {
eth0
VIP
}
vrrp_instance VI_2{
eth1
DIP
}
keeplived配置文件详解
VRRP协议在linux主机上以守护进程方式的实现;
能够根据配置文件自动生成ipvs规则
对各RS做健康状态检测
组件
vrrp stack
checkers 检查
ipvs wrapper
配置文件
global configuration全局配置
vrrpd configuration
vrrp intstance vrrp实例
vrrp synchonizayion group 同步组
lvs configuration
Global definitions
global_defs # Block id 全局配置
{
notification_email # 通知邮箱定义 三个邮箱
{
admin@example1.com
...
}
# From: from address that will be in header
notification_email_from admin@example.com 发件人
smtp_server 127.0.0.1 # IP 邮件服务器地址
smtp_connect_timeout 30 # integer, seconds
router_id my_hostname # string identifying the machine, 物理设备名称。一般设置成主机名.设备名相同是没有问题的。
# (doesn’t have to be hostname).
vrrp_mcast_group4 224.0.0.18 # optional, default 224.0.0.18 定义了多播组地址
vrrp_mcast_group6 ff02::12 # optional, default ff02::12
enable_traps # enable SNMP traps
}
vrrp_instance VI_NAME { #vrrp实例定义虚拟路由,如果有多个实例,实例名称应该不同
state MASTER #Initial state, MASTER|BACKUP定义初始状态。优先级最高的将成为master
interface eth0 #vip配置在哪个接口别名上
use_vmac <VMAC_INTERFACE> #指定VMAC.默认固定格式前五段+VRID后
virtual_router_id 51 #定义了虚拟路由器的id(VRID)一组实例虚拟路由器应该唯一
priority 100 #定义优先级
advert_int 1 #通告广播心跳每个多秒发送一次心跳
mcast_src_ip <IPADDR> #多播时指明多播源地址 224.0.0.0~239.255.255.255
unicast_src_ip <IPADDR>#单播时指明单播源地址
authentication { #认证
auth_type PASS #认证(简单字符认证)同一个实例密钥应该一样
auth_pass 1111 #8位密钥
}
track_interface { #多接口监控,接口出现故障也可以转移
eth0
eth1
...
}
virtual_ipaddress { #定义VRIP 多种不同的形式,可以定义多个 可以指定掩码 广播地址 设备 作用域 接口别名
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL> #scope <SCOPE>作用域
192.168.200.17/24 dev eth1
192.168.200.18/24 dev eth2 label eth2:1
192.16.200.19
}
virtual_ipaddress_excluded {#被排除的VRIP地址
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE>
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE>
...
}
virtual_routes {#定义虚拟路由
# src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR> [or <IPADDR>] dev <STRING> scope <SCOPE> tab
src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1
192.168.110.0/24 via 192.168.200.254 dev eth1
192.168.111.0/24 dev eth2
192.168.112.0/24 via 192.168.100.254 192.168.113.0/24 via 192.168.200.254 or 192.168.100.254 dev eth1 blackhole 192.168.114.0/24
}
nopreempt #工作在非抢占模式。默认是抢占模式
}
简单实现一个互为主备实例:
web1
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 8ab998cd
}
virtual_ipaddress {
172.16.200.20/16 dev eth0 label eth0:0
}
track_script {
chk_schedown1
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 50
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 8eb998cd
}
virtual_ipaddress {
172.16.200.30/16 dev eth0 label eth0:1
}
track_script {
chk_schedown2
}
}
--------------------
web2
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 8ab998cd
}
virtual_ipaddress {
172.16.200.20/16 dev eth0 label eth0:0
}
track_script {
chk_schedown1
}
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 8eb998cd
}
virtual_ipaddress {
172.16.200.30/16 dev eth0 label eth0:1
}
track_script {
chk_schedown2
}
}
注意:一定要设置一个状态检测方法,实现状态监管。
注意每一个实例要一个多播地址;如果你有两个实例,全局配置里面最好不要加多播地址,或者你在每一个实例里面设置一个多播地址。又或者不要设置多播地址,这样多播地址是会自动选择的。
web1 上监听web2 WRRv2报文
tcpdump -nn -i eth0 host web2 -n
邮件发送报警功能
可以定义通知组
VRRP synchronization group(s)
#string, name of group of IPs that failover together
vrrp_sync_group VG_1 {
# notify scripts and alerts are optional
#
# filenames of scripts to run on transitions
# can be unquoted (if just filename)
# or quoted (if has parameters)
# to MASTER transition
notify_master /path/to_master.sh
# to BACKUP transition
notify_backup /path/to_backup.sh
# FAULT transition
notify_fault "/path/fault.sh VG_1"
# for ANY state transition.
# "notify" script is called AFTER the
# notify_* script(s) and is executed
# with 3 arguments provided by keepalived
# (ie don’t include parameters in the notify line).
# arguments这个脚本能接受的三个参数
# $1 = "GROUP"|"INSTANCE"
# $2 = name of group or instance
# $3 = target state of transition
# ("MASTER"|"BACKUP"|"FAULT")
notify /path/notify.sh
# Send email notifcation during state transition,
# using addresses in global_defs above.
smtp_alert
}
在VI中的主机状态发生改变时发送通知
vrrp_instance VI_NAME {
# notify scripts, alert as above
notify_master <STRING>|<QUOTED-STRING> 只有当前节点转换成MASTER才发送指定信息
notify_backup <STRING>|<QUOTED-STRING>
notify_fault <STRING>|<QUOTED-STRING> fault出现故障
notify <STRING>|<QUOTED-STRING>只要状态发生改变就发送
smtp_alert
}
vrrp_instance VI_NAME {
# notify scripts, alert as above #通告信息
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalive/notify.sh backup"
notify_fault "/etc/keepalive/notify.sh fault"
}
LVS配置
LVS CONFIGURATION
contains subblocks of Virtual server group(s) and Virtual server(s)
Virtual server(s)
A virtual_server can be a declaration of one of
vip vport (IPADDR PORT pair) #ip+端口
fwmark <INT>#防火墙标记
(virtual server) group <STRING>
#setup service
virtual_server IP port |
virtual_server fwmark int |
virtual_server group string
{
delay_loop <INT>向RS发送健康状态多少次探查命令
lb_algo rr|wrr|lc|wlc|lblc|sh|dh
ops #Enable One-Packet-Scheduling for UDP#每一个UDP报文单独调度
lb_kind NAT|DR|TUN
persistence_timeout <INT> #持久时长。0就是不持久链接
protocol TCP #支持哪种协议 如果要使用UDP就要ops
ha_suspend如果没有设置VS IP就不做健康状态监测
virtualhost <STRING>#定义虚拟主机 VirtualHost string for HTTP_GET or SSL_GET
sorry_server <IPADDR> <PORT>
real_server <IPADDR> <PORT> 定义虚拟服务中的RS
{
weight <INT>
inhibit_on_failure
notify_up <STRING>|<QUOTED-STRING> #通告脚本
notify_down <STRING>|<QUOTED-STRING>
# pick one healthchecker几种健康状态监测
# HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK
# HTTP and SSL healthcheckers
HTTP_GET|SSL_GET #http|https
{
url {
#eg path / , or path /mrtg2/
path <STRING>
# healthcheck needs status_code
# or status_code and digest
# Digest computed with genhash
# eg digest 9b3a0c85a887a256d6939da88aabd8cd
digest <STRING> 通过获取资源的md5效验码,进行检测
# status code returned in the HTTP header
# eg status_code 200
status_code <INT> 通过响应报文状态码,进行检测
}
nb_get_retry <INT> 重试多少次
delay_before_retry <INT>每一次重试等待多少时间
connect_ip <IP ADDRESS> 指明对哪个ip做健康状态检测
connect_port <PORT> 指明检测端口
bindto <IP ADDRESS> 通过ipvs的哪个ip去检测健康状态
bind_port <PORT>通过ipvs的哪个端口
connect_timeout <INTEGER> 链接超时时间
fwmark <INTEGER> 定义fwmark检测
warmup <INT>分散检测,每一次检测多少个节点
}
TCP_CHECK 基于tcp的健康状态监测
{
connect_ip <IP ADDRESS>
connect_port <PORT>
bindto <IP ADDRESS>
bind_port <PORT>
connect_timeout <INTEGER>
fwmark <INTEGER>
warmup <INT>
}
注意 real_server <IPADDR> <PORT>是有指定ip和端口的。但是检测的时候还是要指定ip和端口是为了日志记录不混淆
57336
定义sorry server
virtual_server IP port | {
sorry_server <IPADDR> <PORT>
}
本文出自 “16期松鼠&青蛙” 博客,请务必保留此出处http://tlinux.blog.51cto.com/7288656/1733314
原文地址:http://tlinux.blog.51cto.com/7288656/1733314