簡介:node
Keepalived的做用是檢測web服務器的狀態,若是有一臺web服務器死機,或工做出現故障,Keepalived將檢測到,並將有故障的web服務器從系統中剔除,當web服務器工做正常後Keepalived自動將web服務器加入到服務器羣中,這些工做所有自動完成,不須要人工干涉,須要人工作的只是修復故障的web服務器。這段話是截取自百科。既然說到這裏必定要說說,keepalived特性:mysql
1,keepalived的是利用vip功能實現服務漂移,這是一種VRRP虛擬路由技術。VRRP協議在linux主機上以守護進程方式的實現;linux
2,keepalived的主備node服務都須要啓動。默認是高可用自身和你須要檢查的服務。web
可是有些場景可能不適用,例如dhcp或dns。一個網絡中不能有兩個dhcp或dns,因此適用是要注意了。另外值得注意的是他的LVS功能,這是一個LVS增強版,keepalived具備LVS沒有的狀態檢測功能。sql
keepalived自己是沒有資源管理層,只有心跳狀態層。它實現管理管理是由腳本實現的數據庫
注意:vim
全部高可用的通性:ntp時間同步,本地dns相互解析。bash
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 mysql" #代碼能夠在複雜點
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_mysql
}
}
啓動日誌
兩個節點各都要作響應的設置。啓動服務後
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/***jiance.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指定檢查腳本,按期運行它們來改變優先級,並最終引起主備切換。
下面是手冊中未更新的兩個小功能:
一、vrrp_script和track_script
track_script指定檢查腳本,按期運行它們來改變優先級,並最終引起主備切換。若是配過交換機的vrrp/hsrp部分的話,應該對這個功能比較熟悉
二、notify_stop
keepalived中止運行前運行notify_stop指定的腳本
下面是我這邊應用上面兩個功能介紹:
一、兩臺雙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
}
}
二、爲一些後臺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>
}