GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 作者:蟹黃瓜子 文章來源:社區投稿 1.前言 在集群當中離不開的一個詞就是是高可用,用本文來簡單聊聊Keepalived是什麼、Keepalived如何 ...
- GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。
- GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。
- 作者:蟹黃瓜子
- 文章來源:社區投稿
1.前言
在集群當中離不開的一個詞就是是高可用,用本文來簡單聊聊Keepalived是什麼、Keepalived如何實現高可用、Keepalived的使用場景。
- 首先,假設一個應用場景,內網有一臺tomcat伺服器,隨著業務的增加、流量的增加一臺tomcat伺服器就變得不夠用了,因此需要增加多台tomcat伺服器,他們擁有相同的業務處理能力,為了可以統一對這些tomcat的訪問同時更好地調度到不同的tomcat完成業務,可以添加一臺nginx伺服器。它的作用是為內網中的多台tomcat伺服器提供負載均衡的動態訪問,通過nginx,我們可以以不同的調度方式來到不同的tomcat來進行下一步的操作。
- 但這種模式是十分脆弱的,如果此時nginx宕機了,tomcat伺服器就都訪問不了了,假設也增加一臺nginx賦予這台nginx相同的業務能力,那就又涉及到了這個問題,它需要一個統一的入口,如果在這兩台nginx伺服器的前面再放一臺nginx或者是一臺lvs伺服器做這兩台nginx的調度,只會使得這種部署方案進入一個死迴圈,變成一個無解的答案。
- 可以試著換一種思路,我就讓這台nginx作為主機進行工作,同時為這台nginx準備一臺備機,當主機宕機了,這台備機就可以及時頂替主機的工作。當然還需要考慮到這兩台伺服器是不同的ip,客戶訪問的是主機,怎麼變成訪問備機呢?如果要把備機的ip“換成主機的”顯然不可取,有可能主機只是過熱的短暫故障,如果ip被備機使用了,主機又突然恢復了,這個時候問題又出現了,因此,我們需要使用一個虛擬ip。
因此,實現的效果應是一主一備,主機宕機備機上線提供服務,不可能同時提供服務。訪問業務通過的入口為vip,因此我們引入Keepalived,讓其跑在兩台nginx上,達到Keepalived之間的相互通信,檢測心跳,如果主機宕機,Kpalived就將主機的vip漂移到備機上,這樣就可以實現不需要關註這兩台nginx的具體ip地址是多少就可以實現來者之間高可用的切換。至於宕機的伺服器恢復以後重新上線是否作為主機就要根據配置文件裡面的優先順序進行競選。
2.Kepalived介紹
Keepalived是一款保證集群高可用的一個服務軟體,用來防止單點故障。Kepalived是以VRRP(Virtual Router Redundancy Protocol)協議(虛擬路由冗餘協議)為實現基礎的。
虛擬路由冗餘協議,可以認為是實現路由器高可用的協議,即將N台提供相同功能的路由器組成一個路由器組,這個組裡面有一個master和多個backup,master上面有一個對外提供服務的vip(該路由器所在區域網內其他機器的預設路由為該vip),master會發組播,當backup收不到vrrp包時就認為master宕掉了,這時就需要根據VRRP的優先順序來選舉一個backup當master。這樣的話就可以保證路由器的高可用了。
3.Keepalived部署
假設nginx伺服器為192.168.1.1、192.168.1.2,vip為192.168.1.200:
為機子安裝環境,採用yum源安裝:
[root@localhost ~]# yum -y install kernel-devel*
[root@localhost ~]# yum -y install openssl-*
[root@localhost ~]# yum -y install popt-devel
[root@localhost ~]# yum -y install lrzsz
[root@localhost ~]# yum -y install openssh-clients
[root@localhost ~]# yum -y install libnl libnl-devel popt
[root@localhost ~]# yum install -y curl gcc openssl-devel libnl3-devel net-snmp-devel
- 進入
/usr/local/
目錄:
[root@localhost ~]# cd /usr/local/
- 把下載“keepalived-1.2.15.tar.gz”放入目錄下,解壓:
[root@localhost local]# tar zxvf keepalived-1.2.15.tar.gz
- 進入目錄:
[root@localhost local]# cd keepalived-1.2.15/
[root@localhost keepalived-1.2.15]#
- 通過configure進行安裝:
[root@localhost keepalived-1.2.15]# ./configure --prefix=/usr/local/keepalived
- 進行編譯安裝:
[root@localhost keepalived-1.2.15]# make
[root@localhost keepalived-1.2.15]# make install
- 拷貝執行文件:
[root@localhost keepalived-1.2.15]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
- 將init.d文件拷貝到etc下,加入開機啟動項:
[root@localhost keepalived-1.2.15]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived/etc/init.d/keepalived
- 將keepalived文件拷貝到etc下,加入網卡配置:
[root@localhost keepalived-1.2.15]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
- 創建keepalived文件夾,將keepalived配置文件拷貝到etc下:
[root@localhost keepalived-1.2.15]# mkdir -p /etc/keepalived
[root@localhost keepalived-1.2.15]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
- 添加可執行許可權,同時加入開機啟動:
[root@localhost keepalived-1.2.15]# chmod +x /etc/init.d/keepalived
# 添加時必須保證/etc/init.d/keepalived存在
[root@localhost keepalived-1.2.15]# chkconfig --add keepalived
[root@localhost keepalived-1.2.15]# chkconfig keepalived on
# 添加完可查詢系統服務是否存在
[root@localhost keepalived-1.2.15]# chkconfig --list
- 使用:
啟動:service keepalived start
停止:service keepalived stop
重啟:service keepalived restart
- 將keepalived日誌輸出到local0:
[root@localhost keepalived-1.2.15]# vi /etc/sysconfig/keepalived
# 添加:
KEEPALIVED_OPTIONS="-D -d -S 0"
- .在/etc/rsyslog.conf里添加配置:
[root@localhost keepalived-1.2.15]# vi /etc/rsyslog.conf
# 內容:
local0.* /var/log/keepalived.log
- 重新啟動keepalived和rsyslog服務後配置防火牆通訊地址:
[root@localhost keepalived-1.2.15]# service rsyslog restart
[root@localhost keepalived-1.2.15]# service keepalived restart
- 主機配置文件:
! Configuration File for keepalived
global_defs {
router_id NG_DEVEL1
}
vrrp_instance NG {
# 標示為主nginx
state MASTER
# HA檢測埠,查看主機伺服器的網卡
interface eth33
# 主備上的id必須相同
virtual_router_id 51
# 配置優先順序,本示例備機比主機優先順序小
priority 100
# VRRP Multicast 廣播周期秒數
advert_int 1
# 定義認證
authentication {
# 認證方式為口令認證
auth_type PASS
# 定義口令
auth_pass 1111
}
# 定義vip,可以設置多個
virtual_ipaddress {
192.168.1.200
}
}
- 備機配置文件:
! Configuration File for keepalived
global_defs {
router_id NG_DEVEL2
}
vrrp_instance NG {
# 標示為備nginx
state BACKUP
# HA檢測埠,查看主機伺服器的網卡
interface eth33
# 主備上的id必須相同
virtual_router_id 51
# 配置優先順序,本示例備機比主機優先順序小
priority 50
# VRRP Multicast 廣播周期秒數
advert_int 1
# 定義認證
authentication {
# 認證方式為口令認證
auth_type PASS
# 定義口令
auth_pass 1111
}
# 定義vip,可以設置多個
virtual_ipaddress {
192.168.1.200
}
}
- 重啟服務:
[root@localhost keepalived-1.2.15]# service keepalived restart
- 可以進行簡單的測試,當主機宕機後,vip成功漂移到備機
4.結語
Keepalived的使用不止局限於nginx,他的作用是作用於伺服器,去檢測伺服器來實現單點訪問的高可用,因此可以使用keepalived的場景就十分豐富了,lvs可以使用,也可以通過keepalived來實現MySQL的雙主模式切換,也可以設置多個vip綁定在不同的機器上,通過dns輪詢的方式訪問vip,如果發生宕機就把宕機的主機vip漂移到其他主機上。在由文章中的模擬實驗環境搭建可以參考上一篇文章《搭建基於lvs+nginx的負載均衡服務集群》。
keepalived的原理其實很簡單就是通過伺服器上的keepalived進程進行相互通信,這個時候需要註意,假設伺服器沒有宕機但是伺服器的業務報錯了,這個時候沒有實現切換,可以寫相應的運維腳本,通過腳本檢測當前的業務是否出現錯誤,出現錯誤就將keepalived進程kill掉來實現切換。這裡就不繼續展開了。
Enjoy GreatSQL