keepalived高可用mysql一:判斷服務並vip

簡介: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>


}

相關文章
相關標籤/搜索