練習一:負載均衡一個php應用:
測試是否需要會話保持;
是否需要用到共享存儲;
為了檢測是否需要會話保持和共享存儲,要在兩臺主機上分別配置LAMP環境;這樣就使得兩者之間沒有了共享存儲;負載均衡使用nat模型的wlc算法,并且不使用lvs的長連接選項。數據庫故意使用了相同的賬號密碼來進行安裝。
步驟一:配置環境:
使用yum分別安裝兩臺主機的環境,分別安裝Discuz論壇;
此種方式可以在安裝的時候就會發現,因為沒有會話保持,每次安裝的下一步都可以正確使用,但是安裝之后就不能正常訪問了,每次刷新頁面都會報錯,是如下兩個頁面的來回切換:
而第一張圖片的錯誤應該是刷新到了沒有安裝論壇的主機,而第二張雖然能夠訪問,但是連接數據庫出現了錯誤,因為點擊登錄并不能登錄成功。我們再打開一個新的頁面進行訪問,結果還是相同。
我們重新負載均衡,這時使用會話保持的非共享存儲:使用lvs自帶的保持連接機制:
[root@localhost ~]# ipvsadm -E -t 10.1.49.11:80 -p 360 [root@localhost ~]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.1.49.11:80 wlc persistent 360 -> 192.168.49.2:80 Masq 1 0 0 -> 192.168.49.3:80 Masq 1 0 0
重新安裝:
訪問正常,發表一個帖子,查看也正常。但是此時很明顯另一臺主機并沒有安裝discuz,并且數據庫相互獨立。我們將另一臺主機安裝discuz,查看效果:
可以正常訪問,但是可以看到我們在另一臺主機上發表的一個帖子,在此主機上并不能看得到,這對于用戶來說并不是想要的結果。因此我們需要共享存儲,利用nas、san、ds等等或者主從復制等方法將數據庫同步,才可以使用,如下圖所示:
當使用了共享存儲,但沒有會話保持的時候:登錄之后,確實能夠看到同樣的內容,但是因為沒有會話保持,登錄之后刷新,登錄就會斷開,也會影響用戶體驗,類似于在淘寶上面買東西,從登錄=》拍得東西=》添加地址=》付款,這是一個一系列的過程,也可以理解成一次操作過程,所有這一系列的操作過程都應當由一臺服務器完成,而不能被負載均衡器分配到不同的服務器上。
課后作業二:dr模型中vip與dip/rip不在同一個網段的實驗環境設計及配置實現;
先配置VIP和DIP/RIP在同一網段的情況,此時兩臺RS主機的網關指向的是10.1.0.1,響應報文會從交換機發送出去。
而在配置不同網段的情況下,可以將RIP的網關指向其它路由器,從而從另一個途徑直接發給用戶,其源地址是VIP,目標地址是CIP。如下圖:
步驟一:配置準備,此處使用一臺客戶端,一臺Director和兩臺RS:
同步時間
[root@localhost ~]# ntpdate 10.1.0.1
在centos7中:
[root@localhost ~]# vim /etc/chrony.conf
重啟服務:
[root@localhost ~]# systemctl restart chronyd.service [root@localhost ~]# date 2016年 10月 26日 星期三 22:13:42 CST
打開Director的核心轉發功能:
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
更改兩臺RS的內核參數及網卡,此處使用腳本更改:
[root@localhost ~]# cat set.sh #!/bin/bash # vip=10.1.49.49 mask=255.255.255.255 case $1 in start) echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce ifconfig lo:0 $vip netmask $mask broadcast $vip up route add -host $vip dev lo:0 ;; stop) ifconfig lo:0 down echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce ;; *) echo "usage `basename` $0 start|stop" exit 1 ;; esac
將網卡改為同一網段,并執行腳本:
在Director上創建DR模型,使用腳本:
[root@localhost ~]# cat rs.sh #!/bin/bash # vip='10.1.49.49' iface='eno16777736:0' mask=255.255.255.255 port='80' rs1='10.1.252.28' rs2='10.1.49.10' scheduler='wrr' type='-g' case $1 in start) ifconfig $iface $vip netmask $mask broadcast $vip up #Director上直接配置別名,使用VIP iptables -F ipvsadm -A -t $vip:$port -s $scheduler ipvsadm -a -t $vip:$port -r $rs1 $type -w 1 ipvsadm -a -t $vip:$port -r $rs2 $type -w 1 ;; stop) ipvsadm -C ifconfig $iface down ;; *) echo "usage" exit 1 ;; esac [root@localhost ~]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.1.49.49:80 wrr -> 10.1.49.10:80 Route 1 0 0 -> 10.1.252.28:80 Route 1 0 0
檢測結果:
[root@localhost ~]# for i in {1..10}; do curl http://10.1.49.49/index.html; done RS1 RS2 RS1 RS2 RS1 RS2 RS1 RS2 RS1 RS2
練習三:使用rsync+inotify實現數據同步;
(1)實驗拓撲圖:
(2)實驗目的:主機client創建有/data/tom和/data/jerry的非空目錄并擔任客戶端角色,結合inotify-tools工具;server1和server2主機分別創建有/data/test1和/data/test2并擔任rsync的服務器。本實驗驗證當clent的目錄內容發生變化時,能否實時同步到服務器端的目錄中。
(3)rsync特性:
可以鏡像備份整個目錄樹或者文件系統。
可以借助于rcp(remote file copy)、rsh(remote shell)、ssh(secure shell)傳輸文件,又可以通過sockets直接連接傳輸。
基于增量備份機制,有較高的同步效率。
支持匿名和認證的進程模式傳輸,方便數據傳輸與鏡像。
可以指定排除同步部分目錄或文件。
支持拷貝設備文件、鏈接等特殊文件。
文件或目錄的拷貝可以保留其權限、時間戳、軟硬鏈接等所有屬性。
(4)配置實驗環境:
yum安裝rsync和inotify。
服務端:
[root@localhost ~]# service xinetd start 正在啟動 xinetd: [確定] [root@localhost ~]# chkconfig rsync on [root@localhost ~]# chkconfig --list | grep rsync rsync: 啟用
在centos6中rsync安裝好之后沒有自己的配置文件,我們需要手動創建配置文件:
[root@localhost ~]# cat /etc/rsyncd.conf uid = root gid = root use chroot = no max connections = 20 pid file = /var/run/rsyncd.pid log file = /var/log/rsyncd.log lock file = /var/run/rsync.lock timeout = 900 [data] path = /data/tom ignore errors read only = false list = false hosts allow = 10.1.49.11/24 auth users = backuser secrets file = /etc/rsync.passwd
rsync命令:
rsync [option]…SRC [SRC]…DEST [DEST]
option是rsync能夠使用的選項,如下
-n : 同步測試,不執行同步
-v : –verbose,詳細輸出模式,顯示詳細過程
-q : –quiet,靜默模式,盡可能輸出少的信息
-c : –checksum,可以對傳輸的文件進行較驗的,強制對文件傳輸進行校驗
-r : –recursive,遞歸復制
-p : –perms,保存文件的權限
-t : –times,保留文件的時間戳
-l : –links,保留文件的符號鏈接
-g : –group,保留文件的屬組
-o : –owner,保留文件的屬主
-D : –devices,保留設備文件
-A : –acls,保留acl訪問控制列表
-a : –archives歸檔,復制時可以保存原有的屬主屬主等屬性信息,甚至包括一點額外的屬性。等同于-rlptgoD
-e SSH : 遠程復制時,表示使用ssh協議作承載。如果ssh端口不是22,可以用-e ‘ssh -p 22’
-z : 基于網絡時使用,對文件壓縮后傳輸
–progress : 顯示壓縮進度條的,簡寫-P
–stats : 顯示如何執行壓縮和傳輸的,也就是顯示傳輸狀態的
(5)inotify,linux內核版本2.6.13以及更新版本支持,提供強大的文件系統監控,通過打開一個獨立的文件描述符并以此監控一個或則多個文件的打開、關閉、移動/重命名、刪除創建或者改變屬性的事件。由于notify是內核功能,因此需要使用時,需要通過其接口程序inotify-tools接口程序調取使用。inotify-tools是基于linux平臺為inotify的提供的C語言開發的接口工具,并提供一系列命令行工具并利用這些工具監控文件系統的事件。
(6)建立rsync用戶名和密碼文件,并更改權限:
[root@localhost ~]# echo "backuser:123" >> /etc/rsync.passwd [root@localhost ~]# chmod 600 /etc/rsync.passwd
以上,服務器端配置完成。
(7)客戶端配置:
[root@localhost ~]# echo "123" > /etc/rsync.passwd [root@localhost ~]# chmod 600 /etc/rsync.passwd
配置inotify:
[root@localhost ~]# yum install inotify-tools
(8)添加腳本:此處只寫了一臺服務器,兩臺以上服務器可以使用for循環執行:
[root@localhost ~]# cat inotify.sh #!/bin/bash # src=/data/tom des=data ip=10.1.49.10 inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' -e modify,delete,create,attrib $src | while read file do rsync -avzP --delete --progress $src backuser@$ip::$des --password-file=/etc/rsync.passwd echo "$src was rsynced" done
注意文件名及變量的書寫。
執行腳本:
[root@localhost ~]# bash inotify.sh &
此處的腳本在測試時會顯示同步過程,是為了檢測錯誤方便;在實際中可以將結果重定向至/dev/null。
(9)測試,此處只測試一個服務器:在客戶端的tom目錄下創建文件:
[root@localhost tom]# touch asdf [root@localhost tom]# sending incremental file list tom/ tom/asdf 0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=1/3) tom/asdfasdf 0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=0/3) sent 144 bytes received 50 bytes 388.00 bytes/sec total size is 0 speedup is 0.00 /data/tom was rsynced /data/tom was rsynced
在服務端查看:
[root@localhost tom]# ls tom [root@localhost tom]# cd tom/ [root@localhost tom]# ls asdf asdfasdf
確實能夠同步成功,但是此處做的還有不足。
在服務器端可以看出,同步的目錄在tom下又新建了一個tom目錄,說明兩者的配置中的目錄并不是同層的。此處的改進,可使服務器端的配置文件中的目錄更改為path=/data,這樣就可以同步至/data目錄下了。也可以將腳本中的src=/data/tom,更改為/data。
原創文章,作者:SilencePavilion,如若轉載,請注明出處:http://www.www58058.com/56513