linux下高可用性羣集和負載均衡羣集的實現

一.heartbeat和ipvsadm簡介

heartbeat簡介:

heartbeat (Linux-HA)的工作原理:heartbeat最核心的包括兩個部分,心跳監測部分和資源接管部分,心跳監測可以通過網絡鏈路和串口進行,而且支持冗 餘鏈路,它們之間相互發送報文來告訴對方自己當前的狀態,如果在指定的時間內未受到對方發送的報文,那麼就認爲對方失效,這時需啓動資源接管模塊來接管運 行在對方主機上的資源或者服務。

可靠消息通信

Heartbeat通過插件技術實現了集羣間的串口、多播、廣播和組播通信,在配置的時候可以根據通信媒介選擇採用的通信協議,heartbeat啓動的時候檢查這些媒介是否存在,如果存在則加載相應的通信模塊。這樣開發人員可以很方便地添加新的通信模塊,比如添加紅外線通信模塊。

對於高可用集羣系統,如果集羣間的通信不可靠,那麼很明顯集羣本身也不可靠。Heartbeat採用UDP協議和串口進行通信,它們本身是不可靠的,可靠性必須由上層應用來提供。那麼怎樣保證消息傳遞的可靠性呢?

Heartbeat通過冗餘通信通道和消息重傳機制來保證通信的可靠性。Heartbeat檢測主通信鏈路工作狀態的同時也檢測備用通信鏈路狀態,並把這一狀態報告給系統管理員,這樣可以大大減少因爲多重失效引起的集羣故障不能恢復。例如,某個工作人員不小心撥下了一個備份通信鏈路,一兩個月以後主通信鏈路也失效了,系統就不能再進行通信了。通過報告備份通信鏈路的工作狀態和主通信鏈路的狀態,可以完全避免這種情況。因爲這樣在主通信鏈路失效以前,就可以檢測到備份工作鏈路失效,從而在主通信鏈路失效前修復備份通信鏈路。

Heartbeat通過實現不同的通信子系統,從而避免了某一通信子系統失效而引起的通信失效。最典型的就是採用以太網和串口相結合的通信方式。這被認爲是當前的最好實踐,有幾個理由可以使我們選擇採用串口通信:

(1)IP通信子系統的失效不太可能影響到串口子系統。

(2)串口不需要複雜的外部設備和電源。

(3)串口設備簡單,在實踐中非常可靠。

(4)串口可以非常容易地專用於集羣通信。

(5)串口的直連線因爲偶然性掉線事件很少。

不管是採用串口還是以太網IP協議進行通信,heartbeat都實現了一套消息重傳協議,保證消息包的可靠傳遞。實現消息包重傳有兩種協議,一種是發送者發起,另一種是接收者發起。

對於發送者發起協議,一般情況下接收者會發送一個消息包的確認。發送者維護一個計時器,並在計時器到時的時候重傳那些還沒有收到確認的消息包。這種方法容易引起發送者溢出,因爲每一臺機器的每一個消息包都需要確認,使得要發送的消息包成倍增長。這種現像被稱爲發送者(或者ACK)內爆(implosion)。

對於接收者發起協議,採用這種協議通信雙方的接收者通過序列號負責進行錯誤檢測。當檢測到消息包丟失時,接收者請求發送者重傳消息包。採用這種方法,如果消息包沒有被送達任何一個接收者,那麼發送者容易因NACK溢出,因爲每個接收者都會向發送者發送一個重傳請求,這會引起發送者的負載過高。這種現像被稱爲NACK內爆(implosion)。

Heartbeat實現的是接收者發起協議的一個變種,它採用計時器來限制過多的重傳,在計時器時間內限制接收者請求重傳消息包的次數,這樣發送者重傳消息包的次數也被相應的限制了,從而嚴格的限制了NACK內爆。

ipvs簡介

IPVS的含義
IPVS基本上是一種高效的Layer-4交換機,它提供負載平衡的功能。當一個TCP連接的初始SYN報文到達時,IPVS就選擇一臺服務器,將報文轉發給它。此後通過查發報文的IP和TCP報文頭地址,保證此連接的後繼報文被轉發到相同的服務器。這樣,IPVS無法檢查到請求的內容再選擇服務器,這就要求後端的服務器組是提供相同的服務,不管請求被送到哪一臺服務器,返回結果都應該是一樣的。但是在有一些應用中後端的服務器可能功能不一,有的是提供HTML文檔的Web服務器,有的是提供圖片的Web服務器,有的是提供CGI的Web服務器。這時,就需要基於內容請求分發 (Content-Based Request Distribution),同時基於內容請求分發可以提高後端服務器上訪問的局部性。
IPVS的工作原理
(1)先說下LVS

提到IPVS就不得不提LVS(Linux Virtual Server),虛擬服務器是一個高度可擴展性和高可用性的服務器,建立在一個集羣的服務器中。服務器集羣的架構對用戶是完全透明的,並且用戶使用起來感覺它只有一個高性能虛擬服務器。

真正的服務器和負載平衡器之間通過高速局域網或地理上分散的廣域網可以相互連接。負載平衡器可以將請求調度到不同的服務器並將並行的集羣服務顯示的像在一個單一的IP地址上的一個虛擬的服務,請求調度可以使用IP負載平衡技術或應用級負載平衡技術。系統的可擴展性是通過透明地添加或刪除集羣中的節點來實現的。通過檢測節點或守護進程的失敗和適當地重新配置系統提供高可用性。

(2)IPVS的原理

當一個TCP連接的初始SYN報文到達時,IPVS就選擇一臺服務器,將報文轉發給它。此後通過查發報文的IP和TCP報文頭地址,保證此連接的後繼報文被轉發到相同的服務器。這樣,IPVS無法檢查到請求的內容再選擇服務器,這就要求後端的服務器組是提供相同的服務,不管請求被送到哪一臺服務器,返回結果都應該是一樣的。但是在有一些應用中後端>的服務器可能功能不一,有的是提供HTML文檔的Web服務器,有的是提供圖片的Web服務器,有的是提供CGI的Web服務器。這時,就需要基於內容請求分發 (Content-Based Request Distribution),同時基於內容請求分發可以提高後端服務器上訪問的局部性。

上面已經說了IPVS是LVS的關鍵,因爲LVS的IP負載平衡技術就是通過IPVS模塊來實現的,IPVS是LVS集羣系統的核心軟件,它的主要作用是:安裝在Director Server上,同時>在Director Server上虛擬出一個IP地址,用戶必須通過這個虛擬的IP地址訪問服務。這個虛擬IP一般稱爲LVS的VIP,即Virtual IP。訪問的請求首先經過VIP到達負載調度器,然>後由負載調度器從Real Server列表中選取一個服務節點響應用戶的請求。

二.案例所用的拓撲圖

image 

三.配置dns,web服務器配置

3.1 配置server1的dns服務

1)配置server1的ip地址

wps_clip_image-20009

2)重啓server1的網絡服務

[root@localhost ~]# service network restart

正在關閉接口 eth0:                                      [確定]

關閉環回接口:                                             [確定]

彈出環回接口:                                             [確定]

彈出界面 eth0:                                           [確定]

3)配置server1的本地yum服務器

[root@localhost ~]# vim /etc/yum.repos.d/rhel-debuginfo.repo

修改配置文件如下圖所示

wps_clip_image-13362

4)掛載光盤

[root@localhost ~]# mount /dev/cdrom /mnt/cdrom

mount: block device /dev/cdrom is write-protected, mounting read-only

5)安裝dns所需要的軟件包

[root@localhost ~]# yum install bind -y

[root@localhost ~]# yum install bind-chroot -y

[root@localhost ~]# yum install caching-nameserver -y

6)生成dns主配置文件

[root@localhost ~]# cd /var/named/chroot/etc

[root@localhost etc]# cp -p named.caching-nameserver.conf named.conf

7)編輯主配置文件

[root@localhost etc]# vim named.conf

wps_clip_image-5350

wps_clip_image-27280

wps_clip_image-12722

8) 聲明bj.com區域

[root@localhost etc]# vim named.rfc1912.zones

wps_clip_image-13723

9) 生成區域文件

[root@localhost etc]# cd ..

[root@localhost chroot]# cd var/named

[root@localhost named]# cp -p localhost.zone bj.com.zone

10) 編輯區域文件

[root@localhost named]# vim bj.com.zone

wps_clip_image-18662

11) 修改dns指向

[root@localhost named]# vim /etc/resolv.conf

nameserver 192.168.20.133

12)修改主機名

[root@localhost named]# vim /etc/sysconfig/network

wps_clip_image-28963

[root@localhost named]# hostname server1.bj.com

13)重啓dns服務

[root@localhost ~]# service named start

啓動 named:                                               [確定]

[root@localhost ~]# chkconfig named on

3.2 配置server1的web服務

源碼搭建lamp環境

1)lamp 搭建用到的軟件

mysql-5.5.15-linux2.6-i686.tar.gz

php-5.3.7.tar.bz2

httpd-2.2.19.tar.bz

2)想要實現源碼安裝,所需要的軟件組。

[root@localhost ~]# yum grouplist

Development Tools  //開發工具  

Legacy Software Development    //傳統軟件開發工具

Development Libraries  //開發工具庫

3)安裝mysql

把mysql-5.5.15-linux2.6-i686.tar.gz拆解到/usr/local目錄下

[root@server1 ~]# tar -zxvf mysql-5.5.15-linux2.6-i686.tar.gz -C /usr/local/

做軟連接

[root@server1 ~]# cd /usr/local

[root@server1 local]# ln -s mysql-5.5.15-linux2.6-i686/ mysql

查看mysql安裝文件

[root@server1 mysql]# less INSTALL-BINARY

wps_clip_image-21633

按照mysql的安裝說明文件執行如下操作

創建mysql用戶及用戶組

[root@server1 mysql]# groupadd mysql

[root@server1 mysql]# useradd -r -g mysql -s /sbin/nologin -M mysql

[root@server1 mysql]# chown -R mysql .

[root@server1 mysql]# chgrp -R mysql .

[root@server1 mysql]# scripts/mysql_install_db --user=mysql

把所有者和所屬組該爲root

[root@server1 mysql]# chown   -R   root   .

把data的所有者改爲mysql

[root@server1 mysql]# chown  -R  mysql  data

[root@server1 mysql]# bin/mysqld_safe      --user=mysql  &   //開啓服務

4)設置用service來管理mysql

[root@server1 mysql]# cp support-files/mysql.server  /etc/init.d/mysqld

[root@server1 mysql]# cd /etc/ld.so.conf.d/

[root@server1 ld.so.conf.d]# vim mysql.conf

創建mysql.conf文件指定庫文件目錄

wps_clip_image-20179

[root@server1 ld.so.conf.d]# ldconfig -v |grep mysql

/usr/local/mysql/lib:

libmysqlclient.so.18 -> libmysqlclient_r.so.18.0.0

[root@server1 ld.so.conf.d]# cd /usr/include/

[root@server1 include]# ln -s /usr/local/mysql/include/ mysql

[root@server1 include]# chkconfig --add mysqld

[root@server1 include]# chkconfig --list |grep mysql

mysqld          0:關閉 1:關閉 2:啓用 3:啓用 4:啓用 5:啓用 6:關閉

[root@server1 rc3.d]# ll |grep mysql

lrwxrwxrwx 1 root root 16 09-11 01:23 S64mysqld -> ../init.d/mysqld

此時啓動mysql

[root@server1 rc3.d]# service mysqld start

MySQL server PID file could not be found!                  [失敗]

執行如下指令

[root@server1 Server]# pkill -9 mysqld

啓動mysql

[root@server1 Server]# service mysqld start

Starting MySQL..                                      [確定]

4) 源碼安裝apache

拆解壓縮文件

[root@server1 ~]# tar -jxvf httpd-2.2.19.tar.bz2 -C /usr/local/src

[root@server1 ~]# cd /usr/local/src

[root@server1 src]# ll

總計 4

drwxr-xr-x 11 xht xht 4096 2011-05-21 httpd-2.2.19

查看安裝說明文件

[root@server1 httpd-2.2.19]# less INSTALL

wps_clip_image-2184

檢查預編譯環境

[root@server1 httpd-2.2.19]# ./configure --prefix=/usr/local/apache  //安裝目錄

--sysconfdir=/etc/httpd   //配置文件目錄

--enable-so           // 開啓 dso 動態共享對象

--enable-ssl      //啓用加密功能

--with-z         //使用 zlib

編譯

[root@server1 httpd-2.2.19]# make

安裝

[root@server1 httpd-2.2.19]# make install

啓動httpd服務

[root@server1 httpd]# cd /usr/local/apache/

[root@server1 apache]# ./bin/apachectl start

加入開機啓動

[root@server1 apache]# vim /etc/rc.d/rc.local

wps_clip_image-24476

創建http.conf 文件並指定http庫文件目錄

[root@server1 apache]# cd /etc/ld.so.conf.d/

[root@server1 ld.so.conf.d]# vim httpd.conf

wps_clip_image-4920

在/usr/include/下爲apache頭文件建立軟連接

[root@server1 ld.so.conf.d]# cd /usr/include/

[root@server1 include]# ln -s /usr/local/apache/include apache

重啓服務

[root@server1 apache]# apachectl stop

[root@server1 apache]# apachectl start

5)爲server1安裝php

拆解軟件包到/usr/local/src目錄下

[root@server1 ~]# tar -jxvf php-5.3.7.tar.bz2 -C /usr/local/src

wps_clip_image-15756

[root@server1 src]# cd php-5.3.7/

查看安裝說明文件

[root@server1 php-5.3.7]# less INSTALL

wps_clip_image-24585

檢測預編譯環境

--prefix=/usr/local/php    //安裝目錄

將php編譯成apache的模塊,允許apache的apxx調用該模塊

--with-apxs2=/usr/local/apache/bin/apxs

--with-mysql=/usr/local/mysql  指明mysql的安裝位置

--with-mysqli=/usr/local/mysql/bin/mysql_config調用myql接口

支持寬字符

--enable-mbstring=all

[[email protected]]# ./configure

--prefix=/usr/local/php

--with-apxs2=/usr/local/apache/bin/apxs 

--with-mysql=/usr/local/mysql 

--with-mysqli=/usr/local/mysql/bin/mysql_config

--enable-mbstring=all

編譯

[root@server1 php-5.3.7]# make

安裝

[root@server1 php-5.3.7]# make install

查看網頁文件如下圖

wps_clip_image-341

修改配置文件使其支持php

[root@server1 htdocs]# vim /etc/httpd/httpd.conf

wps_clip_image-31640

重啓服務

[root@server1 htdocs]# /usr/local/apache/bin/apachectl stop

[root@server1 htdocs]# /usr/local/apache/bin/apachectl start

建立php網頁文件

[root@server1 htdocs]# mv index.html index.php

6) 測試apache能否正常工作信息如下

wps_clip_image-18701

7) 測試httpd能否調用php

[root@server1 htdocs]# vim index.php

wps_clip_image-26596

測試php頁面如下

wps_clip_image-495

8) 測試php調用mysql

[root@server1 htdocs]# vim index.php

wps_clip_image-27532

測試頁面如下

wps_clip_image-29991

9) 測試mysql

利用mysql創建數據庫

[root@server1 htdocs]# /usr/local/mysql/bin/mysql

wps_clip_image-31730

3.3  配置server2的dns,web服務

Server2 的ip地址爲192.168.20.134/28 主機名爲server2.bj.com

1)server2的ip地址

wps_clip_image-26465

2)配置主機名

[root@localhost ~]# vim /etc/sysconfig/network

wps_clip_image-9005

3) 配置dns與server1的配置基本相同下面只將bj.com.zone的內容顯示出來如圖

[root@server2 ~]# cd /var/named/chroot/var/named

[root@server2 named]# vim bj.com.zone

wps_clip_image-22506

搭建server2的lamp環境同搭建server1的lamp環境相同

只是將index.php改爲:

<html><body><h1>It works!</h1></body></html>

<?

$link=mysql_connect(‘127.0.0.1’,‘root’,’’);

If($link)

Echo “connect is ok”;

Else

Echo “disconnect”

?>

四. 配置兩臺direct轉發器

4.1 配置direct1的ipvsadm

1)配置direct1的ip地址

wps_clip_image-8553

心跳網卡的地址

wps_clip_image-24939

2)重啓網絡服務

wps_clip_image-28118

3)配置direct1的yum服務器

[root@localhost ~]# vim /etc/yum.repos.d/rhel-debuginfo.repo

wps_clip_image-15730

4)安裝ipvs

[root@localhost ~]# yum install -y ipvsadm

5)創建ipvsadm的規則,rr表示輪詢算法

[root@localhost ~]# ipvsadm -A -u 192.168.20.137:53 -s rr

[root@localhost ~]# ipvsadm -a -u 192.168.20.137:53 -r 192.168.20.133 -g

[root@localhost ~]# ipvsadm -a -u 192.168.20.137:53 -r 192.168.20.134 -g

[root@localhost ~]# ipvsadm -A -t 192.168.20.137:80 -s rr

[root@localhost ~]# ipvsadm -a -t 192.168.20.137:80 -r 192.168.20.133 -g

[root@localhost ~]# ipvsadm -a -t 192.168.20.137:80 -r 192.168.20.134 –g

6)查看規則

wps_clip_image-8564

7)保存規則並重新啓動

[root@localhost ~]# service ipvsadm save

Saving IPVS table to /etc/sysconfig/ipvsadm:               [確定]

4.2 配置Direct 2的ipvsadm

1)Director2服務器ip地址配置

wps_clip_image-10394

心跳網卡的地址

wps_clip_image-13976

2)重啓網絡服務

wps_clip_image-11132

3)配置direct2的本地yum服務器

wps_clip_image-5285

4)安裝完ipvsadm後創建規則

wps_clip_image-27536

5)保存規則

wps_clip_image-2834

6)在direct2上查看規則

wps_clip_image-1194

五. 利用heartbeat搭建direct轉發器的高可用性羣集

5.1 在direct1上配置heartbeat

1)編輯hosts文件

[root@n1 ~]# vim /etc/hosts

wps_clip_image-18932

2)停止ipvsadm服務

wps_clip_image-14646

3)修改主機名

wps_clip_image-31366

wps_clip_image-4331

4)利用yum安裝heartbeat軟件包

[root@n1 ~]# yum localinstall -y heartbeat-2.1.4-9.el5.i386.rpm --nogpgcheck

[root@n1~]#yum  localinstall

heartbeat-pils-2.1.4-10.el5.i386.rpm

heartbeat-stonith-2.1.4-10.el5.i386.rpm

libnet-1.1.4-3.el5.i386.rpm perl-MailTools-1.77-1.el5.noarch.rpm –nogpgcheck

5)切換到heartbeat的配置目錄複製所需文件

[root@n1 ]# cd  /etc/ha.d

[root@n1 ha.d]# cp /usr/share/doc/heartbeat-2.1.4/ha.cf ./

[root@n1 ha.d]# cp /usr/share/doc/heartbeat-2.1.4/authkeys ./

[root@n1 ha.d]# cp /usr/share/doc/heartbeat-2.1.4/haresources ./

[root@n1 ha.d]# cp /etc/init.d/ipvsadm resource.d/

6)在eth1上發送心跳信息並指明兩臺direct轉發器

[root@n1 ha.d]# vim ha.cf

wps_clip_image-6447

wps_clip_image-20151

7)編輯資源配置文件

[root@n1 ha.d]# vim haresources

wps_clip_image-28951

8)利用隨機函數產生隨機數並用MD5加密

wps_clip_image-30527

9)編輯驗證文件

[root@n1 ha.d]# vim authkeys

wps_clip_image-14941

10)查看heartbeat的狀態

wps_clip_image-22514

11)啓動heartbeat的服務

wps_clip_image-21338

5.2 配置direct2的heartbeat

1)配置direct2的主機名並修改hosts文件

[root@localhost ~]# vim /etc/sysconfig/network

wps_clip_image-26715

[root@n2 ~]# vim /etc/hosts

wps_clip_image-11360

2)安裝heartbeat軟件包

[root@n2~]#yumlocalinstall  -y  heartbeat-2.1.4-9.el5.i386.rpm \

heartbeat-pils-2.1.4-10.el5.i386.rpm \

heartbeat-stonith-2.1.4-10.el5.i386.rpm\

libnet-1.1.4-3.el5.i386.rpm \

perl-MailTools-1.77-1.el5.noarch.rpm –nogpgcheck

3)在配置目錄下複製所需文件

[root@n2 ~]# cd /etc/ha.d

[root@n2 ha.d]# cp /usr/share/doc/heartbeat-2.1.4/ha

[root@n2 ha.d]# cp /usr/share/doc/heartbeat-2.1.4/ha.cf ./

[root@n2 ha.d]# cp /usr/share/doc/heartbeat-2.1.4/authkeys ./

[root@n2 ha.d]# cp /usr/share/doc/heartbeat-2.1.4/haresources ./

[root@n2 ha.d]# cp /etc/init.d/ipvsadm resource.d/

4)在eth1在心跳探測並指明兩臺direct轉發器

[root@n2 ha.d]# vim ha.cf

wps_clip_image-2521

wps_clip_image-15520

5)編輯資源配置文件

[root@n2 ha.d]# vim haresources

wps_clip_image-28720

6)編輯驗證文件密碼要和direct1上的相同

[root@n2 ha.d]# vim authkeys

wps_clip_image-17860

7)修改驗證文件的權限

[root@n2 ha.d]# chmod 600 authkeys

8)重啓heartbeat服務

wps_clip_image-14446

9)停止ipvsadm服務

[root@n2 ha.d]# service ipvsadm stop

六. 兩臺server服務器配合前面的director完成負載均衡羣集

6.1 配置serve2

1)配置server2的虛擬地址

wps_clip_image-3657

2)解決關於arp的問題

[root@server2 ~]# vim /etc/sysctl.conf

wps_clip_image-31429

wps_clip_image-24036

3) 配置路由

[root@server2 ~]# route add -host 192.168.20.137 dev lo:0

6.2  配置Server1

1)配置虛擬地址

wps_clip_image-12484

2)解決arp問題

[root@server1 ~]# echo "net.ipv4.conf.all.arp_announce = 2" >> /etc/sysctl.conf

[root@server1 ~]# echo "net.ipv4.conf.lo.arp_announce = 2" >> /etc/sysctl.conf

[root@server1 ~]#  echo "net.ipv4.conf.all.arp_ignore = 1" >> /etc/sysctl.conf

[root@server1 ~]# echo "net.ipv4.conf.lo.arp_ignore = 1" >> /etc/sysctl.conf

[root@server1 ~]# sysctl -p

net.ipv4.ip_forward = 0

net.ipv4.conf.default.rp_filter = 1

net.ipv4.conf.default.accept_source_route = 0

kernel.sysrq = 0

kernel.core_uses_pid = 1

net.ipv4.tcp_syncookies = 1

kernel.msgmnb = 65536

kernel.msgmax = 65536

kernel.shmmax = 4294967295

kernel.shmall = 268435456

net.ipv4.conf.all.arp_announce = 2

net.ipv4.conf.lo.arp_announce = 2

net.ipv4.conf.all.arp_ignore = 1

net.ipv4.conf.lo.arp_ignore = 1

3)創建路由並查看路由表

[root@server2 ~]# route add -host 192.168.20.137 dev lo:0

[root@server1 ~]# route -n

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

192.168.20.137  0.0.0.0         255.255.255.255 UH    0      0        0 lo

192.168.20.128  0.0.0.0         255.255.255.240 U     0      0        0 eth0

169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0

0.0.0.0         192.168.20.131  0.0.0.0         UG    0      0

7. 客戶機測試

1)客戶端地址配置

wps_clip_image-21911

2)用虛擬地址訪問網頁

wps_clip_image-6195

3)用域名訪問網頁

wps_clip_image-24784

刷新一次結果如下因爲用的算法輪詢

wps_clip_image-10905

4)在direct1上面查看ipvsadm的規則因爲direct1是激活設備所以能看到

wps_clip_image-9105

5)在direct2則看不到

wps_clip_image-12828

6)模擬direct1失效

wps_clip_image-25811

7)再次訪問網頁依然可以正常訪問

wps_clip_image-4505

刷新一次

wps_clip_image-23736

8)此時direct2爲激活設備能看到ipvsadm規則

wps_clip_image-26232

9)模擬direct1恢復此時direct1再次成爲激活設備

查看ipvsadm規則

wps_clip_image-10642

wps_clip_image-6694

10)測試完畢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章