一.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列表中選取一個服務節點響應用戶的請求。
二.案例所用的拓撲圖
三.配置dns,web服務器配置
3.1 配置server1的dns服務
1)配置server1的ip地址
2)重啓server1的網絡服務
[root@localhost ~]# service network restart
正在關閉接口 eth0: [確定]
關閉環回接口: [確定]
彈出環回接口: [確定]
彈出界面 eth0: [確定]
3)配置server1的本地yum服務器
[root@localhost ~]# vim /etc/yum.repos.d/rhel-debuginfo.repo
修改配置文件如下圖所示
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
8) 聲明bj.com區域
[root@localhost etc]# vim named.rfc1912.zones
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
11) 修改dns指向
[root@localhost named]# vim /etc/resolv.conf
nameserver 192.168.20.133
12)修改主機名
[root@localhost named]# vim /etc/sysconfig/network
[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
按照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文件指定庫文件目錄
[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
檢查預編譯環境
[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
創建http.conf 文件並指定http庫文件目錄
[root@server1 apache]# cd /etc/ld.so.conf.d/
[root@server1 ld.so.conf.d]# vim httpd.conf
在/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
[root@server1 src]# cd php-5.3.7/
查看安裝說明文件
[root@server1 php-5.3.7]# less INSTALL
檢測預編譯環境
--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
查看網頁文件如下圖
修改配置文件使其支持php
[root@server1 htdocs]# vim /etc/httpd/httpd.conf
重啓服務
[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能否正常工作信息如下
7) 測試httpd能否調用php
[root@server1 htdocs]# vim index.php
測試php頁面如下
8) 測試php調用mysql
[root@server1 htdocs]# vim index.php
測試頁面如下
9) 測試mysql
利用mysql創建數據庫
[root@server1 htdocs]# /usr/local/mysql/bin/mysql
3.3 配置server2的dns,web服務
Server2 的ip地址爲192.168.20.134/28 主機名爲server2.bj.com
1)server2的ip地址
2)配置主機名
[root@localhost ~]# vim /etc/sysconfig/network
3) 配置dns與server1的配置基本相同下面只將bj.com.zone的內容顯示出來如圖
[root@server2 ~]# cd /var/named/chroot/var/named
[root@server2 named]# vim bj.com.zone
搭建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地址
心跳網卡的地址
2)重啓網絡服務
3)配置direct1的yum服務器
[root@localhost ~]# vim /etc/yum.repos.d/rhel-debuginfo.repo
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)查看規則
7)保存規則並重新啓動
[root@localhost ~]# service ipvsadm save
Saving IPVS table to /etc/sysconfig/ipvsadm: [確定]
4.2 配置Direct 2的ipvsadm
1)Director2服務器ip地址配置
心跳網卡的地址
2)重啓網絡服務
3)配置direct2的本地yum服務器
4)安裝完ipvsadm後創建規則
5)保存規則
6)在direct2上查看規則
五. 利用heartbeat搭建direct轉發器的高可用性羣集
5.1 在direct1上配置heartbeat
1)編輯hosts文件
[root@n1 ~]# vim /etc/hosts
2)停止ipvsadm服務
3)修改主機名
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
7)編輯資源配置文件
[root@n1 ha.d]# vim haresources
8)利用隨機函數產生隨機數並用MD5加密
9)編輯驗證文件
[root@n1 ha.d]# vim authkeys
10)查看heartbeat的狀態
11)啓動heartbeat的服務
5.2 配置direct2的heartbeat
1)配置direct2的主機名並修改hosts文件
[root@localhost ~]# vim /etc/sysconfig/network
[root@n2 ~]# vim /etc/hosts
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
5)編輯資源配置文件
[root@n2 ha.d]# vim haresources
6)編輯驗證文件密碼要和direct1上的相同
[root@n2 ha.d]# vim authkeys
7)修改驗證文件的權限
[root@n2 ha.d]# chmod 600 authkeys
8)重啓heartbeat服務
9)停止ipvsadm服務
[root@n2 ha.d]# service ipvsadm stop
六. 兩臺server服務器配合前面的director完成負載均衡羣集
6.1 配置serve2
1)配置server2的虛擬地址
2)解決關於arp的問題
[root@server2 ~]# vim /etc/sysctl.conf
3) 配置路由
[root@server2 ~]# route add -host 192.168.20.137 dev lo:0
6.2 配置Server1
1)配置虛擬地址
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)客戶端地址配置
2)用虛擬地址訪問網頁
3)用域名訪問網頁
刷新一次結果如下因爲用的算法輪詢
4)在direct1上面查看ipvsadm的規則因爲direct1是激活設備所以能看到
5)在direct2則看不到
6)模擬direct1失效
7)再次訪問網頁依然可以正常訪問
刷新一次
8)此時direct2爲激活設備能看到ipvsadm規則
9)模擬direct1恢復此時direct1再次成爲激活設備
查看ipvsadm規則
10)測試完畢。