|
一、 概述 (一) LVS 1. 概述 使用LVS架設(shè)的服務(wù)器集群系統(tǒng)從體系結(jié)構(gòu)上看是透明的,最終用戶只感覺(jué)到一個(gè)虛擬服務(wù)器。物理服務(wù)器之間可以通過(guò)高速的LAN或分布在各地的WAN相連。最前端是負(fù)載均衡器,它負(fù)責(zé)將各種服務(wù)請(qǐng)求分發(fā)給后面的物理服務(wù)器,讓整個(gè)集群表現(xiàn)得象一個(gè)服務(wù)于同一IP地址的虛擬服務(wù)器。 一個(gè)完整的負(fù)載均衡項(xiàng)目,由虛擬服務(wù)器、故障隔離及失敗切換3個(gè)功能框架組成。 虛擬服務(wù)器是負(fù)載均衡體系的基本結(jié)構(gòu),分為:負(fù)載均衡器和真實(shí)服務(wù)器。 虛擬服務(wù)器最主要的功能是提供包轉(zhuǎn)發(fā)和負(fù)載均衡,由ipvsadm腳本來(lái)具體實(shí)現(xiàn)。 故障隔離:虛擬服務(wù)器中的某個(gè)真實(shí)服務(wù)器失效,系統(tǒng)將自動(dòng)從轉(zhuǎn)發(fā)隊(duì)列中清理出來(lái),從而保證用戶訪問(wèn)正確性,當(dāng)故障處理后,系統(tǒng)再自動(dòng)加入轉(zhuǎn)發(fā)隊(duì)列。 失敗切換:針對(duì)負(fù)載均衡器采取的措施,當(dāng)豬負(fù)載均衡器出現(xiàn)故障,備用自動(dòng)接管主負(fù)載均衡器的工作,恢復(fù)后恢復(fù)到初始角色。 實(shí)現(xiàn)虛擬服務(wù)器、故障隔離及失敗切換由ipvsdam和keepalived來(lái)實(shí)行。(也可以使用heartbeat來(lái)實(shí)現(xiàn),但復(fù)雜) LVS集群系統(tǒng)具有良好的可擴(kuò)展性和高可用性。 可擴(kuò)展性是指,LVS集群建立后,可以很容易地根據(jù)實(shí)際的需要增加或減少物理服務(wù)器。而高可用性是指當(dāng)檢測(cè)到服務(wù)器節(jié)點(diǎn)或服務(wù)進(jìn)程出錯(cuò)、失效時(shí),集群系統(tǒng)能夠自動(dòng)進(jìn)行適當(dāng)?shù)闹匦抡{(diào)整系統(tǒng)。 Linux Virtual Server的主要是在負(fù)載均衡器上實(shí)現(xiàn)的,負(fù)載均衡器是一臺(tái)加了LVS Patch的2.2.x版另外,還需要根據(jù)LVS應(yīng)用對(duì)物理服務(wù)器進(jìn)行恰當(dāng)?shù)呐渲谩?以下將分別講述一下三種模式的工作原理和優(yōu)缺點(diǎn)。 1) NAT Virtual Server via NAT方法的最大優(yōu)點(diǎn)是集群中的物理服務(wù)器可以使用任何支持TCP/IP操作系統(tǒng),物理服務(wù)器可以分配Internet的保留私有地址,只有負(fù)載均衡器需要一個(gè)合法的IP地址。 這種實(shí)現(xiàn)方法的最大的缺點(diǎn)是擴(kuò)展性有限。當(dāng)服務(wù)器節(jié)點(diǎn)(普通PC服務(wù)器)數(shù)據(jù)增長(zhǎng)到20個(gè)或更多時(shí),負(fù)載均衡器將成為整個(gè)系統(tǒng)的瓶頸,因?yàn)樗械恼?qǐng)求包和應(yīng)答包都需要經(jīng)過(guò)負(fù)載均衡器再生。假使TCP包的平均長(zhǎng)度是536字節(jié)的話,平均包再生延遲時(shí)間大約為60us(在Pentium處理器上計(jì)算的,采用更快的處理器將使得這個(gè)延遲時(shí)間變短),負(fù)載均衡器的最大容許能力為8.93M/s,假定每臺(tái)物理服務(wù)器的平臺(tái)容許能力為400K/s來(lái)計(jì)算,負(fù)責(zé)均衡器能為22臺(tái)物理服務(wù)器計(jì)算。 Virtual Server via NAT能夠滿足許多服務(wù)器的服務(wù)性能需求。即使是是負(fù)載均衡器成為整個(gè)系統(tǒng)的瓶頸,如果是這樣也有兩種方法來(lái)解決它。一種是混合處理,另一種是采用Virtual Server via IP tunneling或Virtual Server via direct routing。如果采用混合處理的方法,將需要許多同屬單一的RR DNS域。你采用Virtual Server via IP tunneling或Virtual Server via direct routing以獲得更好的可擴(kuò)展性。也可以嵌套使用負(fù)載均衡器,在最前端的是VS-Tunneling 或VS-Drouting的負(fù)載均衡器,然后后面采用VS-NAT的負(fù)載均衡器。 2) TUN 采用VS-NAT方式,請(qǐng)求與應(yīng)答包都需要經(jīng)過(guò)負(fù)載均衡器,那么當(dāng)服務(wù)器節(jié)點(diǎn)增長(zhǎng)到20個(gè)或更多時(shí),這個(gè)負(fù)載均衡器就可能成為新的瓶頸。我們發(fā)現(xiàn),許多Internet服務(wù)(例如WEB服務(wù)器)的請(qǐng)求包很短小,而應(yīng)答包通常很大。 而使用VS-TUN方式的話,負(fù)載均衡器只負(fù)責(zé)將請(qǐng)求包分發(fā)給物理服務(wù)器,而物理服務(wù)器將應(yīng)答包直接發(fā)給用戶。所以,負(fù)載均衡器能處理很巨大的請(qǐng)求量,這種方式,一臺(tái)負(fù)載均衡能為超過(guò)100臺(tái)的物理服務(wù)器服務(wù),負(fù)載均衡器不再是系統(tǒng)的瓶頸。使用VS-TUN方式,如果你的負(fù)載均衡器擁有100M的全雙工網(wǎng)卡的話,就能使得整個(gè)Virtual Server能達(dá)到1G的吞吐量。 IP tunneling(IP隧道)能夠用于架構(gòu)一個(gè)高性能的virtual server,非常適合構(gòu)建virtual proxy server,因?yàn)楫?dāng)代理服務(wù)器收到了請(qǐng)求,能夠讓最終用戶直接與服務(wù)器聯(lián)系。 但是,這種方式需要所有的服務(wù)器支持IP Tunneling(IP Encapsulation)協(xié)議,我僅在Linux系統(tǒng)上實(shí)現(xiàn)了這個(gè),如果你能讓其它操作系統(tǒng)支持,還在探索之中。 3) DR 就象VS-TUN一下,在VS-DR方式下,負(fù)載均衡器也只是分發(fā)請(qǐng)求,應(yīng)答包通過(guò)單獨(dú)的路由方法返回給客戶端。這種方式能夠大大提高Virtual Server的可擴(kuò)展性。與VS-TUN相比,VS-DR這種實(shí)現(xiàn)方式不需要隧道結(jié)構(gòu),但它要求負(fù)載均衡器的網(wǎng)卡必須與物理網(wǎng)卡在一個(gè)物理段上。 而且VS-DR模式,可以使用大多數(shù)操作系統(tǒng)做為物理服務(wù)器,其中包括:Linux 2.0.36、 2.2.9、2.2.10、2.2.12;Solaris 2.5.1、2.6、2.7;FreeBSD 3.1、3.2、3.3;NT4.0無(wú)需打補(bǔ)丁;IRIX 6.5;HPUX11等 3. 負(fù)載均衡調(diào)度算法 目前系統(tǒng)有八種負(fù)載均衡調(diào)度算法,具體如下: 1) rr 輪叫(Round Robin)調(diào)度器通過(guò)‖輪叫‖調(diào)度算法將外部請(qǐng)求按順序輪流分配到集群中的真實(shí)服務(wù)器上,它均等地對(duì)待每一臺(tái)服務(wù)器,而不管服務(wù)器上實(shí)際的連接數(shù)和系統(tǒng)負(fù)載. 2) wrr 加權(quán)輪叫(Weighted Round Robin)調(diào)度器通過(guò)‖加權(quán)輪叫‖調(diào)度算法根據(jù)真實(shí)服務(wù)器的不同處理能力來(lái)調(diào)度訪問(wèn)請(qǐng)求.這樣可以保證處理能力強(qiáng)的服務(wù)器處理更多的訪問(wèn)流量.調(diào)度器可以自動(dòng)問(wèn)詢真實(shí)服務(wù)器的負(fù)載情況,并動(dòng)態(tài)地調(diào)整其權(quán)值。 3) lc 最少鏈接(Least Connections)調(diào)度器通過(guò)‖最少連接‖調(diào)度算法動(dòng)態(tài)地將網(wǎng)絡(luò)請(qǐng)求調(diào)度到已建立的鏈接數(shù)最少的服務(wù)器上.如果集群系統(tǒng)的真實(shí)服務(wù)器具有相近的系統(tǒng)性能,采用‖最小連接‖調(diào)度算法可以較好地均衡負(fù)載. 4) wlc 加權(quán)最少鏈接(Weighted Least Connections)在集群系統(tǒng)中的服務(wù)器性能差異較大的情況下,調(diào)度器采用‖加權(quán)最少鏈接‖調(diào)度算法優(yōu)化負(fù)載均衡性能,具有較高權(quán)值的服務(wù)器將承受較大比例的活動(dòng)連接負(fù)載.調(diào)度器可以自動(dòng)問(wèn)詢真實(shí)服務(wù)器的負(fù)載情況,并動(dòng)態(tài)地調(diào)整其權(quán)值. 5) lblc 基于局部性的最少鏈接(Locality-Based Least Connections)―基于局部性的最少鏈接‖ 調(diào)度算法是針對(duì)目標(biāo)IP地址的負(fù)載均衡,目前主要用于Cache集群系統(tǒng).該算法根據(jù)請(qǐng)求的目標(biāo)IP地址找出該目標(biāo)IP地址最近使用的服務(wù)器,若該服務(wù)器是可用的且沒(méi)有超載,將請(qǐng)求發(fā) 送到該服務(wù)器;若服務(wù)器不存在,或者該服務(wù)器超載且有服務(wù)器處于一半的工作負(fù)載,則用‖最少鏈接‖的原則選出一個(gè)可用的服務(wù)器,將請(qǐng)求發(fā)送到該服務(wù)器. 6) lblcr 帶復(fù)制的基于局部性最少鏈接(Locality-Based Least Connections with Replication)―帶復(fù)制的基于局部性最少鏈接‖調(diào)度算法也是針對(duì)目標(biāo)IP地址的負(fù)載均衡,目前主要用于Cache集群系統(tǒng).它與LBLC算法的不同之處是它要維護(hù)從一個(gè)目標(biāo)IP地址到一組服務(wù)器的映射,而LBLC算法維護(hù)從一個(gè)目標(biāo)IP地址到一臺(tái)服務(wù)器的映射.該算法根據(jù)請(qǐng)求的目標(biāo)IP地址找出該目標(biāo)IP地址對(duì)應(yīng)的服務(wù)器組,按‖最小連接‖原則從服務(wù)器組中選出一臺(tái)服務(wù)器,若服務(wù)器沒(méi)有超載,將請(qǐng)求發(fā)送到該服務(wù)器,若服務(wù)器超載;則按‖最小連接‖原則從這個(gè)集群中選出一臺(tái)服務(wù)器,將該服務(wù)器加入到服務(wù)器組中,將請(qǐng)求發(fā)送到該服務(wù)器.同時(shí),當(dāng)該服務(wù)器組有一段時(shí)間沒(méi)有被修改,將最忙的服務(wù)器從服務(wù)器組中刪除,以降低復(fù)制的程度. 7) dh 目標(biāo)地址散列(Destination Hashing)―目標(biāo)地址散列‖調(diào)度算法根據(jù)請(qǐng)求的目標(biāo)IP地址,作為散列鍵(Hash Key)從靜態(tài)分配的散列表找出對(duì)應(yīng)的服務(wù)器,若該服務(wù)器是可用的且未超載,將請(qǐng)求發(fā)送到該服務(wù)器,否則返回空. 8) sh 源地址散列(Source Hashing)―源地址散列‖調(diào)度算法根據(jù)請(qǐng)求的源IP地址,作為散列鍵(Hash Key)從靜態(tài)分配的散列表找出對(duì)應(yīng)的服務(wù)器,若該服務(wù)器是可用的且未超載,將請(qǐng)求發(fā)送到該服務(wù)器,否則返回空. 4. IPVS IPVS是整個(gè)負(fù)載均衡的基礎(chǔ),如果沒(méi)有這個(gè)基礎(chǔ)的話,故障隔離與失敗切換毫無(wú)意義。IPVS有IPVSADM來(lái)實(shí)現(xiàn)的。 LVS客戶端是指負(fù)載均衡器/轉(zhuǎn)發(fā)器后面提供服務(wù)的服務(wù)器。 負(fù)載均衡分為直接路由模式DR、網(wǎng)絡(luò)地址轉(zhuǎn)發(fā)模式NAT及隧道模式TUN三種。 LVS客戶端的配置是根據(jù)其采用的負(fù)載均衡種類來(lái)做相應(yīng)操作的。 為了獲得最高性能,采用直接路由模式DR。 (二) Keepalived 1. 概述 Keepalived是運(yùn)行在lvs之上,它的主要功能是實(shí)現(xiàn)真實(shí)機(jī)的故障隔離及負(fù)載均衡器間的失敗切換FailOver。 (三) MySQL Cluster 1. 概述 MySQL Cluster是MySQL適合于分布式計(jì)算環(huán)境的高實(shí)用、高冗余版本。它采用了NDB Cluster 存儲(chǔ)引擎,允許在1個(gè) Cluster 中運(yùn)行多個(gè)MySQL服務(wù)器。在MyQL 5.0及以上的二進(jìn)制版本中、以及與最新的Linux版本兼容的RPM中提供了該存儲(chǔ)引擎。 MySQL Cluster 是一種技術(shù),該技術(shù)允許在無(wú)共享的系統(tǒng)中部署―內(nèi)存中‖數(shù)據(jù)庫(kù)的 Cluster 。通過(guò)無(wú)共享體系結(jié)構(gòu),系統(tǒng)能夠使用廉價(jià)的硬件,而且對(duì)軟硬件無(wú)特殊要求。此外,由于每個(gè)組件有自己的內(nèi)存和磁盤(pán),不存在單點(diǎn)故障。 MySQL Cluster 由一組計(jì)算機(jī)構(gòu)成,每臺(tái)計(jì)算機(jī)上均運(yùn)行著多種進(jìn)程,包括MySQL服務(wù)器,NDB Cluster 的數(shù)據(jù)節(jié)點(diǎn),管理服務(wù)器,以及(可能)專門(mén)的數(shù)據(jù)訪問(wèn)程序。關(guān)于 Cluster 中這些組件的關(guān)系,請(qǐng)參見(jiàn)下圖: 所有的節(jié)點(diǎn)構(gòu)成一個(gè)完成的MySQL集群體系。數(shù)據(jù)保存在―NDB存儲(chǔ)服務(wù)器‖的存儲(chǔ)引擎中,表(結(jié)構(gòu))則保存在―MySQL服務(wù)器‖中。應(yīng)用程序通過(guò)―MySQL服務(wù)器‖訪問(wèn)這些數(shù)據(jù)表,集群管理服務(wù)器通過(guò)管理工具(ndb_mgmd)來(lái)管理―NDB存儲(chǔ)服務(wù)器‖。 通過(guò)將MySQL Cluster 引入開(kāi)放源碼世界,MySQL為所有需要它的人員提供了具有高可用性、高性能和可縮放性的 Cluster 數(shù)據(jù)管理。 1) 優(yōu)點(diǎn) 99.999,的高可用性 快速的自動(dòng)失效切換 靈活的分布式體系結(jié)構(gòu),沒(méi)有單點(diǎn)故障 高吞吐量和低延遲 可擴(kuò)展性強(qiáng),支持在線擴(kuò)容 2) 缺點(diǎn): 存在很多限制,如:不支持外鍵,數(shù)據(jù)行不能超過(guò)8K(不含BLOB和text的數(shù)據(jù)) 部署、管理、配置很復(fù)雜占用磁盤(pán)空間大,MySQL Cluster 能夠使用多種故障切換和負(fù)載平衡選項(xiàng)配置NDB存儲(chǔ)引擎,但在 Cluster 級(jí)別上的存儲(chǔ)引擎上做這個(gè)最簡(jiǎn)單。MySQL Cluster的NDB存儲(chǔ)引擎包含完整的數(shù)據(jù)集,僅取決于 Cluster本身內(nèi)的其他數(shù)據(jù)。 目前,MySQL Cluster的 Cluster部分可獨(dú)立于MySQL服務(wù)器進(jìn)行配置。在MySQL Cluster中, Cluster的每個(gè)部分被視為1個(gè)節(jié)點(diǎn)。 1) 管理(MGM)節(jié)點(diǎn) 這類節(jié)點(diǎn)的作用是管理MySQL Cluster內(nèi)的其他節(jié)點(diǎn),如提供配置數(shù)據(jù)、啟動(dòng)并停止節(jié)點(diǎn)、運(yùn)行備份等。由于這類節(jié)點(diǎn)負(fù)責(zé)管理其他節(jié)點(diǎn)的配置,應(yīng)在啟動(dòng)其他節(jié)點(diǎn)之前首先啟動(dòng)這類節(jié)點(diǎn)。MGM節(jié)點(diǎn)是用命令―ndb_mgmd‖啟動(dòng)的。 2) 數(shù)據(jù)節(jié)點(diǎn) 這類節(jié)點(diǎn)用于保存 Cluster的數(shù)據(jù)。數(shù)據(jù)節(jié)點(diǎn)的數(shù)目與副本的數(shù)目相關(guān),是片段的倍數(shù)。例如,對(duì)于兩個(gè)副本,每個(gè)副本有兩個(gè)片段,那么就有4個(gè)數(shù)據(jù)節(jié)點(diǎn)。不過(guò)沒(méi)有必要設(shè)置多個(gè)副本。數(shù)據(jù)節(jié)點(diǎn)是用命令―ndbd‖啟動(dòng)的。 3) SQL節(jié)點(diǎn) 這是用來(lái)訪問(wèn) Cluster數(shù)據(jù)的節(jié)點(diǎn)。對(duì)于MySQL Cluster,客戶端節(jié)點(diǎn)是使用NDB Cluster存儲(chǔ)引擎的傳統(tǒng)MySQL服務(wù)器。通常,SQL節(jié)點(diǎn)是使用命令―mysqld –ndbcluster‖啟動(dòng)的,或?qū)ⅷDndbcluster‖添加到―my.cnf‖后使用―mysqld‖啟動(dòng)。 3. 注意事項(xiàng) 所有的節(jié)點(diǎn)的主機(jī)上盡量和確保環(huán)境一致,包括數(shù)據(jù)庫(kù)版本~ 在MYSQLD節(jié)點(diǎn)上需要安裝支持cluster的Mysql server。 在安裝NDB節(jié)點(diǎn)時(shí),如果需要各個(gè)節(jié)點(diǎn)環(huán)境盡可能保存一致,建議在NDB和mysql 節(jié)點(diǎn)一樣安裝整個(gè)帶有NDB cluster儲(chǔ)存引擎。 (四) 搭建環(huán)境說(shuō)明 2. 網(wǎng)絡(luò)拓?fù)?nbsp; 二、 LVS (一) LVS核心-IPVS 1. 安裝IPVSADM 1) 下載ipvsadm,在172.16.1.100進(jìn)行操作 wget 2) 創(chuàng)建連接文件 ln -sv /usr/src/kernels/2.6.32-71.29.1.el6.i686 /usr/src/Linux ln -sv /usr/src/kernels/2.6.32-71.29.1.el6.i686 /usr/src/linux 注: a、紅色字體部分可根據(jù)實(shí)際情況予以修改,可用ls /usr/src/kernels/ 進(jìn)行查看。 b、連個(gè)命令必須都執(zhí)行,不然將出現(xiàn)找不到*.h這個(gè)錯(cuò)誤,成為無(wú)法安裝~ 3) 解壓包 tar zxvf ipvsadm-1.24.tar.gz 4) 編譯及安裝,需要安裝gcc軟件 yum -y install gcc* make cd ipvsadm-1.24 make make install 5) 檢驗(yàn)安裝是否正確 執(zhí)行ipvsadm,提示: IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn 6) 配置ipvsadm的啟動(dòng)文件 vi /usr/local/sbin/lvs-dr.sh,內(nèi)容如下: #!/bin/bash # description: start LVS of DirectorServer #Written by :NetSeek GW=172.16.1.1 # website director vip. MySQL_VIP=172.16.1.99 MySQL_RIP1=172.16.1.101 MySQL_RIP2=172.16.1.102 source /etc/rc.d/init.d/functions logger $0 called with $1 case "$1" in start) # set squid vip /sbin/ipvsadm --set 30 5 60 /sbin/ifconfig eth0:0 $MySQL_VIP broadcast $MySQL_VIP netmask 255.255.255.255 broadcast $MySQL_VIP up /sbin/route add -host $MySQL_VIP dev eth0:0 /sbin/ipvsadm -A -t $MySQL_VIP:3306 -s wrr -p 3 /sbin/ipvsadm -a -t $MySQL_VIP:3306 -r $MySQL_RIP1:3306 -g -w 1 /sbin/ipvsadm -a -t $MySQL_VIP:3306 -r $MySQL_RIP2:3306 -g -w 1 touch /var/lock/subsys/ipvsadm >/dev/null 2>&1; stop) /sbin/ipvsadm -C /sbin/ipvsadm -Z ifconfig eth0:0 down route del $MySQL_VIP rm -rf /var/lock/subsys/ipvsadm >/dev/null 2>&1 echo "ipvsadm stoped" status) if [ ! -e /var/lock/subsys/ipvsadm ];then echo "ipvsadm stoped" exit 1 else echo "ipvsadm OK" fi ;; *) echo "Usage: $0 {start|stop|status}" exit 1 esac exit 0 7) 配置自啟動(dòng) chmod +x /usr/local/sbin/lvs-dr.sh vi /etc/rc.local,添加如下內(nèi)容: sleep 10 /usr/local/sbin/lvs-dr.sh start 8) 在172.16.1.101和172.16.1.102上添加如下腳本 vi /usr/local/bin/lvs_real,內(nèi)容如下: #!/bin/bash #description : start realserver VIP=172.16.1.99 source /etc/rc.d/init.d/functions case "$1" in start) echo "start LVS of REALServer" /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce; stop) /sbin/ifconfig lo:0 down echo "close LVS Directorserver" echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce ;; *) echo " Usage: $0 {start|stop} " exit 1 esac 參數(shù)說(shuō)明: a、vip(virtual ip)。直接路由模式的vip必須跟服務(wù)器對(duì)外提供服務(wù)的ip地址在同一個(gè)網(wǎng)段,并且lvs 負(fù)載均衡器和其他所有提供相同功能的服務(wù)器都使用這個(gè)vip. b、vip被綁定在環(huán)回接口lo0:0上,其廣播地址是其本身,子網(wǎng)掩碼是255.255.255.255。 這與標(biāo)準(zhǔn)的網(wǎng)絡(luò)地址設(shè)置有很大的不同。采用這種可變長(zhǎng)掩碼方式把網(wǎng)段劃分成只含一個(gè)主機(jī)地址的目的是避免ip地址沖突。 c、echo ―1‖,echo ―2‖ 這段的作用是抑制arp廣播。 9) 在172.16.1.101和172.16.1.102上執(zhí)行如下命令 chmod +x /usr/local/bin/lvs_real 10) 在172.16.1.101和172.16.1.102的執(zhí)行如下命令 vi /etc/rc.local,添加如下內(nèi)容: /usr/local/bin/lvs_real start 三、 故障隔離、失敗切換框架keepalived(172.16.1.100) (一) 安裝Keepalived 1. 下載keepalived wget 2. 解壓包 tar zxvf keepalived-1.2.2.tar.gz 3. 編輯及安裝 cd keepalived-1.2.2 ./configure -prefix=/usr/local/keepalived make ; make install (二) 添加keepalived為系統(tǒng)服務(wù) cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ chkconfig --add keepalived chkconfig keepalived on (三) 添加配置文件keepalived.conf 1. 配置文件 mkdir /etc/keepalived vi /etc/keepalived/keepalived.conf,添加如下內(nèi)容: ! Configuration File for keepalived global_defs { notification_email { [email protected] } notification_email_from [email protected] smtp_server 192.168.1.201 smtp_connect_timeout 30 router_id LVS_MYSQL } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 2 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.16.1.99 } } virtual_server 172.16.1.99 3306 { delay_loop 2 lb_algo rr lb_kind DR persistence_timeout 60 protocol TCP real_server 172.16.1.101 3306 { weight 1 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 3306 } } real_server 172.16.1.102 3306 { weight 1 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 3306 } } } 2. 配置文件說(shuō)明 1) 全局定義塊 A、email通知。作用:有故障,發(fā)郵件報(bào)警。這是可選項(xiàng)目。 B、Lvs負(fù)載均衡器標(biāo)識(shí)(lvs_id)。在一個(gè)網(wǎng)絡(luò)內(nèi),它應(yīng)該是唯一的。 C、花括號(hào)―{}‖。如果寫(xiě)漏了,keepalived運(yùn)行時(shí),不會(huì)得到預(yù)期的結(jié)果。由于定義塊內(nèi)存在嵌套關(guān)系,因此很容易遺漏結(jié)尾處的花括號(hào),這點(diǎn)要特別注意。 2) VRRP定義塊 A、同步vrrp組vrrp_sync_group。作用:確定失敗切換(FailOver)包含的路由實(shí)例個(gè)數(shù)。 B、實(shí)例組group.至少包含一個(gè)vrrp實(shí)例。 C、Vrrp實(shí)例vrrp_instance.實(shí)例名出自實(shí)例組group所包含的那些名字。 a、實(shí)例狀態(tài)state:只有MASTER和BACKUP兩種狀態(tài),并且需要大寫(xiě)。其中MASTER為工作狀態(tài),BACKUP為備用狀態(tài)。當(dāng)MASTER所在的服務(wù)器失效時(shí),BACKUP所在的系統(tǒng)會(huì)自動(dòng)把它的狀態(tài)有BACKUP變換成MASTER;當(dāng)失效的MASTER所在的系統(tǒng)恢復(fù)時(shí),BACKUP從MASTER恢復(fù)到BACKUP狀態(tài)。 b、通信接口interface。對(duì)外提供服務(wù)的網(wǎng)絡(luò)接口,在選擇服務(wù)接口時(shí),一定要核實(shí)清楚。 c、lvs_sync_daemon_inteface。負(fù)載均衡器之間的監(jiān)控接口,類似于HA HeartBeat的心跳線。但它的機(jī)制優(yōu)于Heartbeat,因?yàn)樗鼪](méi)有―裂腦‖這個(gè)問(wèn)題,它是以優(yōu)先級(jí)這個(gè)機(jī)制來(lái)規(guī)避這個(gè)麻煩的。在DR模式中,lvs_sync_daemon_inteface 與服務(wù)接口interface 使用同一個(gè)網(wǎng)絡(luò)接口。 d、虛擬路由標(biāo)識(shí)virtual_router_id.這個(gè)標(biāo)識(shí)是一個(gè)數(shù)字,并且同一個(gè)vrrp實(shí)例使用唯一的標(biāo)識(shí)。即同一個(gè)vrrp_stance,MASTER和BACKUP的virtual_router_id是一致的,同時(shí)在整個(gè)vrrp內(nèi)是唯一的。 e、優(yōu)先級(jí)priority.這是一個(gè)數(shù)字,數(shù)值愈大,優(yōu)先級(jí)越高。在同一個(gè)vrrp_instance里,MASTER 的優(yōu)先級(jí)高于BACKUP。若MASTER的priority值為150,那么BACKUP的priority 只能是140或更小的數(shù)值。 f、同步通知間隔 advert_int .MASTER與BACKUP負(fù)載均衡器之間同步檢查的時(shí)間間隔,單位為秒。 g、驗(yàn)證authentication。包含驗(yàn)證類型和驗(yàn)證密碼。類型主要有PASS、AH兩種,通常使用的類型為PASS,據(jù)說(shuō)AH使用時(shí)有問(wèn)題。驗(yàn)證密碼為明文,同一vrrp實(shí)例MASTER與BACKUP 使用相同的密碼才能正常通信。 D、虛擬ip地址virtual_ipaddress :可以有多個(gè)地址,每個(gè)地址占一行,不需要指定子網(wǎng)掩碼。注意:這個(gè)ip必須與我們?cè)趌vs客戶端設(shè)定的vip相一致~ a、虛擬服務(wù)器virtual_server定義塊:虛擬服務(wù)器定義是keepalived框架最重要的項(xiàng)目了,是keepalived.conf必不可少的部分。 b、虛擬服務(wù)器virtual_server:這個(gè)ip來(lái)自于vrrp定義塊的第―4‖步,后面一個(gè)空格,然后加上端口號(hào)。定義一個(gè)vip,可以實(shí)現(xiàn)多個(gè)tcp端口的負(fù)載均衡功能。 c、delay_loop。健康檢查時(shí)間間隔,單位是秒。 d、lb_algo. 負(fù)載均衡調(diào)度算法,互聯(lián)網(wǎng)應(yīng)用常使用wlc或rr。 e、lb_kind. 負(fù)載均衡轉(zhuǎn)發(fā)規(guī)則。一般包括DR,NAT,TUN3種,在我的方案中,都使用DR的方式。 f、persistence_timeout會(huì)話保持時(shí)間,單位是秒。這個(gè)選項(xiàng)對(duì)動(dòng)態(tài)網(wǎng)站很有用處:當(dāng)用戶從遠(yuǎn)程用帳號(hào)進(jìn)行登陸網(wǎng)站時(shí),有了這個(gè)會(huì)話保持功能,就能把用戶的請(qǐng)求轉(zhuǎn)發(fā)給同一個(gè)應(yīng)用服務(wù)器。在這里,我們來(lái)做一個(gè)假設(shè),假定現(xiàn)在有一個(gè)lvs 環(huán)境,使用DR轉(zhuǎn)發(fā)模式,真實(shí)服務(wù)器有3個(gè),負(fù)載均衡器不啟用會(huì)話保持功能。當(dāng)用戶第一次訪問(wèn)的時(shí)候,他的訪問(wèn)請(qǐng)求被負(fù)載均衡器轉(zhuǎn)給某個(gè)真實(shí)服務(wù)器,這樣他看到一個(gè)登陸頁(yè)面,第一次訪問(wèn)完畢;接著他在登陸框填寫(xiě)用戶名和密碼,然后提交;這時(shí)候,問(wèn)題就可能出現(xiàn)了—登陸不能成功。因?yàn)闆](méi)有會(huì)話保持,負(fù)載均衡器可能會(huì)把第2次的請(qǐng)求轉(zhuǎn)發(fā)到其他的服務(wù)器。 g、轉(zhuǎn)發(fā)協(xié)議protocol.一般有tcp和udp兩種。實(shí)話說(shuō),我還沒(méi)嘗試過(guò)udp協(xié)議類的轉(zhuǎn)發(fā)。 h、真實(shí)服務(wù)器real_server.也即服務(wù)器池。Real_server的值包括ip地址和端口號(hào)。多個(gè)連續(xù)的真實(shí)ip,轉(zhuǎn)發(fā)的端口相同。 i、權(quán)重weight.權(quán)重值是一個(gè)數(shù)字,數(shù)值越大,權(quán)重越高。使用不同的權(quán)重值的目的在于為不同性能的機(jī)器分配不同的負(fù)載,性能較好的機(jī)器,負(fù)載分擔(dān)大些;反之,性能差的機(jī)器,則分擔(dān)較少的負(fù)載,這樣就可以合理的利用不同性能的機(jī)器資源。 j、Tcp檢查 tcp_check。 四、 MySQL Cluster 1. 安裝MySQL Cluster 1) 在172.16.1.100載并安裝,MySQL-Cluster-gpl-management,MySQL-Cluster-gpl-tools。 rpm -ivh MySQL-Cluster-gpl-management-7.1.15-1.rhel5.i386.rpm rpm -ivh MySQL-Cluster-gpl-tools-7.1.15-1.rhel5.i386.rpm 2) 在172.16.1.101和172.16.1.102下載并安裝MySQL-Cluster-gpl-server、 MySQL-Cluster-gpl-client和MySQL-Cluster-gpl-storage rpm -ivh MySQL-Cluster-gpl-server-7.1.15-1.rhel5.i386.rpm rpm -ivh MySQL-Cluster-gpl-client-7.1.15-1.rhel5.i386.rpm rpm -ivh MySQL-Cluster-gpl-storage-7.1.15-1.rhel5.i386.rpm 2. 配置管理節(jié)點(diǎn)(172.16.1.100) mkdir /var/lib/mysql-cluster vi /var/lib/mysql-cluster/cluster.conf,添加如下內(nèi)容: [NDBD DEFAULT] NoOfReplicas=2 DataMemory=300M IndexMemory=75M TransactionDeadLockDetectionTimeOut=60000 [TCP DEFAULT] portnumber=1186 [NDB_MGMD] nodeid=1 hostname=172.16.1.100 datadir=/var/lib/mysql-cluster [NDBD] nodeid=2 hostname=172.16.1.101 datadir=/var/lib/mysql-cluster MaxNoOfOrderedIndexes=2048 MaxNoOfAttributes=50000 [NDBD] nodeid=3 hostname=172.16.1.102 datadir=/var/lib/mysql-cluster MaxNoOfOrderedIndexes=2048 MaxNoOfAttributes=50000 [MYSQLD] nodeid=4 hostname=172.16.1.101 [MYSQLD] nodeid=5 hostname=172.16.1.102 3. 配置sql節(jié)點(diǎn)和db節(jié)點(diǎn) 1) 172.16.1.101和172.16.1.102節(jié)點(diǎn) vi /etc/my.conf,添加并覆蓋= 3306 socket = /var/lib/mysql/mysql.sock # Here follows entries for some specific programs # The MySQL server [mysqld] port = 3306 socket = /var/lib/mysql/mysql.sock skip-locking skip-name-resolve key_buffer_size = 16M max_allowed_packet = 1M table_open_cache = 64 sort_buffer_size = 512K net_buffer_length = 8K read_buffer_size = 256K read_rnd_buffer_size = 512K myisam_sort_buffer_size = 8M character_set_server = utf8 ndbcluster ndb-connectstring = 172.16.1.100:1186 [mysql_cluster] ndb-connectstring = 172.16.1.100:1186 # Don‘t listen on a TCP/IP port at all. This can be a security enhancement, # if all processes that need to connect to mysqld run on the same host. # All interaction with mysqld must be made via Unix sockets or named pipes. # Note that using this option without enabling named pipes on Windows # (via the "enable-named-pipe" option) will render mysqld useless! # #skip-networking # Replication Master Server (default) # binary logging is required for replication #log-bin=mysql-bin # binary logging format - mixed recommended #binlog_format=mixed # required unique id between 1 and 2 - 1 # defaults to 1 if master-host is not set # but will not function as a master if omitted #server-id = 1 # Replication Slave (comment out master section to use this) # # To configure this host as a replication slave, you can choose between # two methods : # # 1) Use the CHANGE MASTER TO command (fully described in our manual) - # the syntax is: # # CHANGE MASTER TO MASTER_HOST=<host>, MASTER_PORT=<port>, # MASTER_USER=<user>, MASTER_PASSWORD=<password> ; # # where you replace <host>, <user>, <password> by quoted strings and # <port> by the master‘s port number (3306 by default). # # Example: # # CHANGE MASTER TO MASTER_HOST=?125.564.12.1‘, MASTER_PORT=3306, # MASTER_USER=?joe‘, MASTER_PASSWORD=?secret‘; # # OR # # 2) Set the variables below. However, in case you choose this method, then # start replication for the first time (even unsuccessfully, for example # if you mistyped the password in master-password and the slave fails to # connect), the slave will create a master.info file, and any later # change in this file to the variables‘ values below will be ignored and # overridden by the content of the master.info file, unless you shutdown # the slave server, delete master.info and restart the slaver server. # For that reason, you may want to leave the lines below untouched # (commented) and instead use CHANGE MASTER TO (see above) # # required unique id between 2 and 2 - 1 # (and different from the master) # defaults to 2 if master-host is set # but will not function as a slave if omitted #server-id = 2 # # The replication master for this slave - required #master-host = <hostname> # # The username the slave will use for authentication when connecting # to the master - required #master-user = <username> # # The password the slave will authenticate with when connecting to # the master - required #master-password = <password> # # The port the master is listening on. # optional - defaults to 3306 #master-port = <port> # # binary logging - not required for slaves, but recommended #log-bin=mysql-bin # Uncomment the following if you are using InnoDB tables #innodb_data_home_dir = /var/lib/mysql #innodb_data_file_path = ibdata1:10M:autoextend #innodb_log_group_home_dir = /var/lib/mysql # You can set .._buffer_pool_size up to 50 - 80 % # of RAM but beware of setting memory usage too high #innodb_buffer_pool_size = 16M #innodb_additional_mem_pool_size = 2M # Set .._log_file_size to 25 % of buffer pool size #innodb_log_file_size = 5M #innodb_log_buffer_size = 8M #innodb_flush_log_at_trx_commit = 1 #innodb_lock_wait_timeout = 50 [mysqldump] quick max_allowed_packet = 16M [mysql] no-auto-rehash # Remove the next comment character if you are not familiar with SQL #safe-updates [myisamchk] key_buffer_size = 20M sort_buffer_size = 20M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout 2) 在172.16.1.101和172.16.1.102節(jié)點(diǎn)執(zhí)行如下命令: useradd -M -d /dev/null -s /sbin/nologin -c "Mysql Cluster" mysql chown mysql:mysql /var/lib/mysql-cluster 4. 啟動(dòng)集群 1) 啟動(dòng)管理節(jié)點(diǎn) ndb_mgmd -f /var/lib/mysql-cluster/cluster.conf 2) 啟動(dòng)數(shù)據(jù)節(jié)點(diǎn) ndbd --initial 注: 紅色字體部分盡在第一次啟動(dòng)數(shù)據(jù)節(jié)點(diǎn)時(shí)執(zhí)行。 3) 啟動(dòng)sql節(jié)點(diǎn) /etc/init.d/mysql start /usr/bin/mysqladmin -u root password ?MyMysqlPassword‘ 5. 確認(rèn)集群狀態(tài),在管理節(jié)點(diǎn)(ClusterMgm)里執(zhí)行 ndb_mgm -- NDB Cluster -- Management Client -- ndb_mgm> show Connected to Management Server at: localhost:1186 Cluster Configuration --------------------- [ndbd(NDB)] 3 node(s) id=2 @172.16.1.101 (mysql-5.1.56 ndb-7.1.15, Nodegroup: 0, *) id=3 @172.16.1.102 (mysql-5.1.56 ndb-7.1.15, Nodegroup: 0) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.0.100 (mysql-5.1.56 ndb-7.1.15) [mysqld(API)] 3 node(s) id=4 @172.16.1.101 (mysql-5.1.56 ndb-7.1.15) id=5 @172.16.1.102 (mysql-5.1.56 ndb-7.1.15) ?非常重要: 1.在建表的時(shí)候一定要用ENGINE=NDB或ENGINE=NDBCLUSTER指定使用NDB集群 存儲(chǔ)引擎,或用ALTER TABLE選項(xiàng)更改表的存儲(chǔ)引擎,否則數(shù)據(jù)節(jié)點(diǎn)無(wú)法進(jìn)行數(shù)據(jù)同步。 2.NDB表必須有一個(gè)主鍵,因此創(chuàng)建表的時(shí)候必須定義主鍵,否則NDB存儲(chǔ)引擎將自動(dòng) 生成隱含的主鍵。 6. 其他命令: 1) 關(guān)閉管理節(jié)點(diǎn): ndb_mgm -e shutdown 2) 啟動(dòng)管理并重新加載配置: ndb_mgm -f /var/lib/mysql-cluster/cluster.conf --reload
信息發(fā)布:廣州名易軟件有限公司 http://m.jetlc.com
|