keepalived是Linux下一個(gè)輕量級(jí)的高可用解決方案,keepalived主要通過(guò)虛擬路由冗余(VRRP)來(lái)實(shí)現(xiàn)高可用功能,防止因?yàn)閱吸c(diǎn)故障導(dǎo)致整個(gè)系統(tǒng)架構(gòu)的不可用的發(fā)生??梢詫?shí)現(xiàn)諸如“服務(wù)器狀態(tài)檢測(cè)”、“故障隔離”、“高可用集群”的功能。
創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),北辰企業(yè)網(wǎng)站建設(shè),北辰品牌網(wǎng)站建設(shè),網(wǎng)站定制,北辰網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,北辰網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。keepalived最主要的目的是能夠自己調(diào)用ipvsadm命令來(lái)生成規(guī)則,并且能夠自動(dòng)實(shí)現(xiàn)將用戶(hù)需求的訪(fǎng)問(wèn)地址轉(zhuǎn)移到其他節(jié)點(diǎn)上。
keepalived在一個(gè)節(jié)點(diǎn)上提供VIP向外提供服務(wù),將用戶(hù)的請(qǐng)求轉(zhuǎn)發(fā)到后端的real servel上去。
keepalived自身啟動(dòng)一個(gè)服務(wù),它能夠工作在兩個(gè)節(jié)點(diǎn)上也可以是多個(gè)節(jié)點(diǎn),其中當(dāng)前持有資源的節(jié)點(diǎn)稱(chēng)為活動(dòng)節(jié)點(diǎn)Master,另一個(gè)稱(chēng)為備用節(jié)點(diǎn)backup;對(duì)于Master和backup來(lái)講,Master這個(gè)節(jié)點(diǎn)會(huì)不停的向backup這個(gè)節(jié)點(diǎn)通告心跳,但他的通告是基于VRRP這種機(jī)制來(lái)實(shí)現(xiàn)的,Master這個(gè)節(jié)點(diǎn)會(huì)一直處于存活狀態(tài)的,備用節(jié)點(diǎn)backup一旦接收不到主節(jié)點(diǎn)的心跳傳遞過(guò)來(lái)的VRRP信息之后,他就會(huì)把資源搶過(guò)來(lái)在本地使用并在本地生效規(guī)則;這個(gè)規(guī)則的生效是:本地有個(gè)服務(wù),它只需要把本地的keepalived的那個(gè)生效服務(wù)中的某個(gè)模塊把他生效起來(lái)就可以了,所以keepalived自身是模塊化設(shè)計(jì)的,它有著諸多模塊;有些模塊是監(jiān)控生效ipvs的,去監(jiān)控配置文件中跟ipvs相關(guān)的一些應(yīng)用;他的主要目的是為ipvs提供高可用性,keepalived除了能實(shí)現(xiàn)資源轉(zhuǎn)移之外,還能自身調(diào)用ipvs命令來(lái)生成規(guī)則;而且還能夠?qū)崿F(xiàn)后端realserver的健康狀態(tài)檢測(cè)。
keepalived是輕量級(jí),適用于節(jié)點(diǎn)少的場(chǎng)景;支持多個(gè)節(jié)點(diǎn),但是對(duì)于同一組服務(wù)來(lái)講,仍然跟此前的法則一樣,只能有一個(gè)節(jié)點(diǎn)是活動(dòng)的,因?yàn)閂IP只能在一個(gè)節(jié)點(diǎn)上運(yùn)行,所以他是一主多從的模式;可以有一個(gè)主Master多個(gè)backup;但是backup越大浪費(fèi)越大,資源占用越大。
需要注意的是:virtual_server_group、virtual_server是用來(lái)配置LVS。LVS配置是專(zhuān)門(mén)為keepalived+LVS集成準(zhǔn)備的。這里L(fēng)VS配置并不是指真的安裝LVS然后用ipvsadm來(lái)配置他,而是用keepalived的配置文件來(lái)代替ipvsadm來(lái)配置LVS,這樣會(huì)方便很多,一個(gè)配置文件搞定這些,維護(hù)方便,配置方便。
二、keepalived的部署 2.1、軟件安裝1、系統(tǒng)內(nèi)核參數(shù)修改
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1 --把0改為1。功能:設(shè)置或重新設(shè)置聯(lián)網(wǎng)功能,如IP轉(zhuǎn)發(fā)、IP碎片去除以及源路由檢查等。
使配置生效:sysctl -p
2、下載keepalived安裝軟件包
wgethttp://www.keepalived.org/software/keepalived-1.2.12.tar.gz
tar xzf keepalived-1.2.12.tar.gz
cd keepalived-1.2.12
yum install -y gcc openssl-devel popt-devel
yum -y install libnl*
./configure
make && make install
3、把keepalived對(duì)應(yīng)文件拷貝到相應(yīng)目錄,并把執(zhí)行文件加入到服務(wù)啟動(dòng)
cp /usr/local/etc/rc.d/init.d/keepalived/etc/init.d/
cp /usr/local/etc/sysconfig/keepalived/etc/sysconfig/
chmod +x /etc/init.d/keepalived
chkconfig --add keepalived
chkconfig keepalived on
mkdir /etc/keepalived
ln -s /usr/local/sbin/keepalived /usr/sbin/
4、測(cè)試keepalived啟動(dòng)
service keepalived start
service keepalived status
ps -ef | grep keep
5、下載ipvsadm
yum install -y ipvsadm
2.2、日志文件配置4、配置日志文件:
vi /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -d -S 0"
vi /etc/rsyslog.conf
local0.* /var/log/keepalived.log
--重啟系統(tǒng)日志服務(wù)
/etc/init.d/rsyslog restart
--重啟keepalived服務(wù)
service keepalived restart
--查看keepalived日志
more /var/log/keepalived.log
2.3、keepalived配置5、編寫(xiě)mysql.sh腳本
對(duì)于為什么需要使用這個(gè)腳本的解釋?zhuān)?/p>
因?yàn)閗eepalived本身(在此種配置方法里)監(jiān)控不到除自己之外的其他服務(wù)(mysql)的運(yùn)行情況,所以在自己的keepalived服務(wù)不停止的情況下,另一個(gè)節(jié)點(diǎn)一直認(rèn)為對(duì)方仍在存活,導(dǎo)致vip不會(huì)被切換,而不能通過(guò)另外一臺(tái)keepalived服務(wù)器訪(fǎng)問(wèn)綁定在他上的mysql(此種配置是一個(gè)keepalived對(duì)應(yīng)一個(gè)mysql,只能訪(fǎng)問(wèn)綁定到自己的mysql,沒(méi)有做負(fù)載均衡)。所以在這里把自己的服務(wù)停下再啟動(dòng),以把VIP飄過(guò)去。當(dāng)然還可使用另外的方法配置,比如:vrrp_script(可參考“六、其他場(chǎng)景”的小節(jié)2)。
另外,需要說(shuō)明的是,如果配置為MASTER、BACKUP,那么VIP的漂移是通過(guò)權(quán)重判斷的
vi /usr/local/script/mysql.sh
[root@hadoops2 script]#vi /usr/local/script/mysql.sh
#!/bin/bash
/etc/init.d/keepalived restart #注:在數(shù)據(jù)庫(kù)為另外單獨(dú)的真實(shí)機(jī)時(shí),不能分開(kāi)停啟,否則停了啟不來(lái)。
并賦予可執(zhí)行權(quán)限:
chmod u+x /usr/local/script/mysql.sh
6、在當(dāng)前主203上配置keepalived.conf
vi /etc/keepalived/keepalived.conf
[root@hadoops3 keepalived-1.2.12]#vi /etc/keepalived/keepalived.conf
#! Configuration File for keepalived
global_defs {
router_id hadoops3 #修改為自己的主機(jī)名
}
vrrp_instance VI_1 {
state BACKUP #都修改成BACKUP
interface eth0
virtual_router_id 60 #默認(rèn)51 主從都修改為60
priority 100 #初始優(yōu)先級(jí)(1-254之間),另一臺(tái)改為80,備用節(jié)點(diǎn)必須比主節(jié)點(diǎn)優(yōu)先級(jí)低。
advert_int 1 #通告幾個(gè)
nopreempt #不搶占資源,意思就是它活了之后也不會(huì)再把主搶回來(lái)
authentication { #認(rèn)證機(jī)制
#設(shè)置驗(yàn)證信息,兩個(gè)節(jié)點(diǎn)必須一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.171.200
}
}
virtual_server 192.168.171.200 3306 {
delay_loop 6 #每隔6秒檢測(cè)Realserver健康狀況
lb_algo wrr #LVS算法,其他算法請(qǐng)參考ipvsadm十大算法
lb_kind DR #LVS模式,DR模式即直接路由,其他還有TUN和NAT兩種模式。
nat_mask 255.255.255.0
persistence_timeout 50 #會(huì)話(huà)保持時(shí)間
protocol TCP
real_server 192.168.171.203 3306 { #真實(shí)ip轉(zhuǎn)發(fā)端口,請(qǐng)注意80和后面{之間有個(gè)空格!
weight 1 # 權(quán)重
notify_down /usr/local/script/mysql.sh #檢測(cè)到服務(wù)down后執(zhí)行的腳本
TCP_CHECK {
connect_timeout 10 #連接超時(shí)時(shí)間
nb_get_retry 3 #重連次數(shù)
connect_port 3306 #健康檢查端口
}
}
}
7、在當(dāng)前從202上配置keepalived.conf
改優(yōu)先級(jí)、state改為BACKUP,優(yōu)先級(jí)priority改為比MASTER小
[root@hadoops2 script]#vi /etc/keepalived/keepalived.conf
#! Configuration File for keepalived
global_defs {
router_id hadoops2 #修改為自己的主機(jī)名
}
vrrp_instance VI_1 {
state BACKUP #都修改成BACKUP
interface eth0
virtual_router_id 60 #默認(rèn)51 主從都修改為60
priority 80 #在hadoops3上LVS上修改成100
advert_int 1
nopreempt #不搶占資源,意思就是它活了之后也不會(huì)再把主搶回來(lái)
authentication {
#設(shè)置驗(yàn)證信息,兩個(gè)節(jié)點(diǎn)必須一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.171.200
}
}
virtual_server 192.168.171.200 3306 {
delay_loop 6
lb_algo wrr #LVS算法
lb_kind DR #LVS模式
nat_mask 255.255.255.0
persistence_timeout 50 #會(huì)話(huà)保持時(shí)間
protocol TCP
real_server 192.168.171.202 3306 {#真實(shí)ip轉(zhuǎn)發(fā)端口
weight 1
notify_down /usr/local/script/mysql.sh #檢測(cè)到服務(wù)down后執(zhí)行的腳本
TCP_CHECK {
connect_timeout 10 #連接超時(shí)時(shí)間
nb_get_retry 3 #重連次數(shù)
connect_port 3306 #健康檢查端口
}
}
}
2.4、配置發(fā)送郵件功能(可選)1、下載環(huán)境依賴(lài)
yum-y install perl-CPAN
cpanNet::SMTP_auth
2、編寫(xiě)如下腳本:標(biāo)黃處對(duì)應(yīng)修改下
#!/usr/bin/perl -w
use Net::SMTP_auth;
use strict;
my $mailhost = \'smtp.163.com\';
my $mailfrom = \'shanshan20060801@163.com\';
my @mailto = (\'619901002@qq.com\');
my $subject = \'keepalived up on 202;
my $text = "郵件n從linux發(fā)來(lái)的。";
my $user = \'shanshan20060801@163.com\';
my $passwd = \'xxxxxxxx\';
&SendMail();
##############################
# Send notice mail
##############################
sub SendMail() {
my $smtp = Net::SMTP_auth->new( $mailhost, Timeout => 120, Debug => 1 )
or die "Error.n";
$smtp->auth( \'LOGIN\', $user, $passwd );
foreach my $mailto (@mailto) {
$smtp->mail($mailfrom);
$smtp->to($mailto);
$smtp->data();
$smtp->datasend("To: $mailton");
$smtp->datasend("From:$mailfromn");
$smtp->datasend("Subject: $subjectn");
$smtp->datasend("n");
$smtp->datasend("$textnn");
$smtp->dataend();
}
$smtp->quit;
}
執(zhí)行測(cè)試,發(fā)現(xiàn)郵件發(fā)送成功。
[root@hadoops3script]#/etc/keepalived/sendmail.pl
在如下位置添加:notify_master /etc/keepalived/sendmail.pl
在主從vip切換的時(shí)候即會(huì)發(fā)送郵件。
2.5、測(cè)試8、先重啟主hadoops3,在重啟hadoops2,可以看到現(xiàn)在vip在hadoops3上
然后停止主hadoops3上的mysql服務(wù),發(fā)現(xiàn)vip又飄到了hadoops2上。
期間,在hadoops3上綁定的mysql服務(wù)未啟動(dòng)時(shí),hadoops3的日志會(huì)顯示反復(fù)重啟keepalived服務(wù),直至綁定在其上的mysql正常啟動(dòng)后。
如下:
tail -f/var/log/messages
到此,部署完畢!