1、結合圖形描述LVS的工作原理;
NAT模型
NAT模型其實就是通過網絡地址轉換來實現負載均衡的,它的工作方式幾乎跟iptables 中的DNAT一模一樣的,NAT模型的工作方式:
1.用戶請求VIP(也就是是CIP請求VIP)
2,Director Server 收到用戶的請求后,發現源地址為CIP請求的目標地址為VIP,那么Dorector Server會認為用戶請求的是一個集群服務,那么Director Server 會根據此前設定好的調度算法將用戶請求負載給某臺Real Server ,假如說此時Director Server 根據調度算法的結果會將請求分攤到Real Server 2上去,那么Director Server 會將用戶的請求報文中的目標地址,從原來的VIP改為Real Server 2的IP,然后再轉發給Real Server 2
3,此時Real Server 1收到一個源地址為CIP目標地址為自己的請求,那么Real Server 1處理好請求后會將一個源地址為自己目標地址為CIP的數據包通過Director Server 發出去,
4.當Driector Server收到一個源地址為Real Server 1 的IP 目標地址為CIP的數據包,此時Driector Server 會將源地址修改為VIP,然后再將數據包發送給用戶,
DR模型:
1.director必須與realserver位于同一個網絡。
2.director只負責處理入站請求。而響應報文則由realserver直接返回給client端。大大節省director的資源。
3.不能做端口映射
整個工作原理如下:
客戶端通過路由器將請求交給director的VIP。director接收請求,將通過相應的算法將請求轉發給相應的realserver。在轉發的過程中,會修改請求包的目的mac地址,目的ip地址不變。realserver接收請求,并直接響應客戶端。這時,便出現一個問題:director此時與realserver位于同一個網絡中,當director直接將請求轉發給realserver時,realserver檢測到該請求包的目的ip是vip而并非自己,便會丟棄,而不會響應。。為了解決這個問題,我們需要在所有realserver上都配上VIP。這時會出現第二個問題:director與realserver位于同一個網絡中,當出現多個vip時,通過arp廣播,整個網絡必然混亂,我們無法保證客戶端的請求一定會發往director。為保證當客戶端請求抵達網絡時,只有director來響應請求。我們需要realserver忽略對vip的arp請求,并且在arp通告時,不通告vip地址。我們需要配置如下兩個內核參數:
arp_ignore :當一臺主機某個接口接收到arp請求時,這臺機上的ip地址是否通過該接口響應給對應請求的限制級別。簡單來說,當這臺主機有多塊網卡,或者有多個ip地址時,是否通過該接口將所有ip地址響應給對應的請求。
0:不作任何限制。將所有本機的ip地址都響應給對應請求。
1:當請求的ip就配置在本接口上時,才予以響應。換句話說,就是只響應當前接口的ip地址。
arp_announce:當一臺主機加入到一個新的網絡。會發出ARP通告,向網絡中其他主機通告自己的ip地址及mac等信息。arp_anounce就用來限制通告的級別。當這臺主機有多塊網卡或者多個ip地址時,是否通過某一個接口將所有ip地址通告給該網絡中的主機。
0:不作任何限制。從任意接口通告所有ip地址。
1:盡可能避免通告非本接口上的ip。
2:只通知本接口的ip。非本接口的ip不予通告。
由此我們亦可知,在realserver上配置vip時顯然也不能配置的物理接口的虛接口上,而應該配置在loopback上。
1、當Director收到用戶的請求后根據預先設定的調度算法來確定將請求負載到某臺Real Server上去,假如說此時根據調度算法的結果,會將請求負載到Real Server 1上面去,此時Director會將數據幀中的目標MAC地址修改為Real Server1的MAC地址,然后再將數據幀發送出去。
2、當Real Server1 收到一個源地址為CIP目標地址為VIP的數據包時,Real Server1發現目標地址為VIP,而自己本地是有VIP的,于是接受數據包并給予處理,當Real Server1處理完請求后,會將一個源地址為VIP目標地址為CIP的數據包發出去,此時的響應請求就不會再經過Director Server了,而是直接響應給用戶。
2、搭建一套LVS-DR模型的高性能集群,并實現以下功能:
(1)、wordpress程序通過nfs共享給各個realserver;
(2)、后端realserver中的nginx和php分離
準備:
nod1:192.168.50.178 centos 6.8
nod2:192.168.50.206 centos 6.3
NFS & php-fpm:192.168.50.173 centos 7
directory: 192.168.50.176 centos 6.3
NFS存儲:
新建/data目錄,并輸出為共享:/etc/exports文件如下
安裝php-fpm ,修改/etc/php-fpm.d/www.conf
確認監聽端口為9000
listen = 192.168.50.173:9000
將白名單注釋
;listen.allowed_clients =
分別在nod1和nod2上將共享目錄掛載至本地/data
mount -t nfs 192.168.50.173:/data /data
分別在nod1和nod2上安裝nginx,修改/etc/nginx/conf.d/default.conf,
新建一個location, 將.php交指php-fpm服務器處理
location ~ \.php$ { #root /data; fastcgi_pass 192.168.50.173:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; include /etc/nginx/fastcgi_params; }
編輯/etc/nginx/fastcgi_params,將內容更改為
fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name;
啟動nginx服務,并測試phpinfo正常。
在192.168.50.178上安裝mysql-server,并新建數據庫wp, 新用戶pa, 并進行相應授權
下載wordpress程序包,并解壓至/data/wp目錄下
編輯/data/wp/wp-config.php文件,內容如下
........................................................................... define('DB_NAME', 'wp'); define('DB_USER', 'pa'); define('DB_PASSWORD', '45455654545'); define('DB_HOST', '192.168.50.178'); define('DB_CHARSET', 'utf8'); define('DB_COLLATE', ''); ........................................................................... ?>
#######嘗試通過http://192.168.50.178/wp/index.php訪問時,出現錯誤提示"PHP似乎沒有安裝運行WordPress所必需的MySQL擴展。"在php-fpm機器上安裝php-mysql就可以了。
確保兩個realserver都能正常訪問wordpress后,開始lvs配置,具體配置步驟如下:
nod1 & nod2:
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore ifconfig lo:0 192.168.50.222/32 broadcast 192.168.50.222 up route add -host 192.168.50.222 dev lo:0
director
ifconfig eth0:0 192.168.50.222/32 broadcast 192.168.50.222 up ipvsadm -A -t 192.168.50.222:80 -s rr ipvsadm -a -t 192.168.50.222:80 -r 192.168.50.178 -g ipvsadm -a -t 192.168.50.222:80 -r 192.168.50.206 -g
配置完成后,通過http://192.168.50.222/wp可以正常訪問,同時通過iptables -L -n可以看到請求被調度到不同的服務器進行響應
3、基于heartbeat v2 crm實現HA LAMP組合;要求,部署wordpress,用于編輯的文章中的任何數據在節點切換后都能正常訪問;
1、實驗環境:nod1 192.168.50.206 centos6.8
nod2 192.168.50.178 centos6.3
vip 192.168.50.244
NFS & Mysql 192.168.50.173
2、部署nfs,mysql
編輯192.168.50.173上的/etc/export文件,內容如下
/data 192.168.50.206(rw,no_root_squash)
/data 192.168.50.178(rw,no_root_squash)
安裝mysql,新建wordpress數據庫,新建wp用戶名,并授權外網登錄
]# mysql >CREATE DATABASE WP; >GRANT ALL PRIVILEGES ON *.* TO 'pa'@'%'IDENTIFIED BY '454545' WITH GRANT OPTION;3、兩臺nod機器
掛載nfs至本地/data目錄
mount -t nfs 192.168.50.173:/data /data
1、直接yum安裝httpd, 此處版本為httpd 2.2
編輯/etc/httpd/conf/httpd, 新建虛擬機,將/data設置為httpd工作目錄:
<VirtualHost *:80> ServerAdmin admin@mydome.com DocumentRoot /data ServerName localhost ErrorLog logs/mydome.com-error_log CustomLog logs/mydome.com-access_log common </VirtualHost>
2、、安裝fastcgi模塊
下載
wget http://www.pccc.com/downloads/apache/current/mod_fastcgi-current.tar.gz
安裝
# tar zxvf mod_fastcgi-2.4.6.tar.gz
# cd mod_fastcgi-2.4.6
# cp Makefile.AP2 Makefile
# vim Makefile
修改top_dir目錄,64位系統的路徑為 /usr/lib64/httpd,32位系統的路徑為/usr/lib/httpd
top_dir = /usr/lib64/httpd
#make
#make install
當出現錯誤:“Makefile:12: /usr/lib64/httpd/build/special.mk: No such file or directory”,執行:
yum install libtool httpd-devel apr-devel apr
加載模塊
# vim /etc/httpd/conf/httpd.conf
找到LoadModule部分,添加一行加載語句
…
LoadModule fastcgi_module modules/mod_fastcgi.so
…
3、安裝php-fpm
yum install php-fpm
service php-fpm start
chkconfig php-fpm on
netstat -anp |grep php
4、新建php-fpm配置文件
新建/etc/httpd/conf.d/fastcgi.conf,內容如下:
AddHandler php5-fcgi .php Action php5-fcgi /php5-fcgi Alias /php5-fcgi /var/www/cgi-bin/php5-fcgi FastCgiExternalServer /var/www/cgi-bin/php5-fcgi -idle-timeout 60 -host 127.0.0.1:9000 -pass-header Authorization編輯/etc/httpd/conf/httpd.conf,添加:
AddType application/x-httpd-php .phpAddType application/x-httpd-php-source .phps DirectoryIndex index.php index.html5、解壓wordpress程序到/data/wp目錄,并安裝,安裝時數據庫路徑為192.168.50.173
驗證通過192.168.50.178/wp和 192.168.50.206/wp可以正常訪問
4、安裝heartbeat
依賴關系
yum install net-snmp-libs libnet PyXML perl-Time-Date libtool-ltdl
安裝hearheat包
rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm
編輯/etc/ha.cfg文件:內容如下
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport 694
ucast eth0 192.168.50.178 #使用單播,為別一臺nod的ip地址
auto_failback on
node nod1
node nod2
ping 192.168.50.1
apiauth ipfail gid=root uid=root
編輯/etc/authkeys文件,內容如下:
auth 2
#1 crc
2 sha1 Hi354fdafdgI!
#3 md5 Hello!
編輯/etc/haresources文件,內容如下
nod1 192.168.50.244 httpd
5、驗證heartbeat服務在兩臺nod機器上啟動heartbeat服務:service heartbeat start
在nod1上查看ip addr可以看到vip已經被配置,
在nod1上使用usr/lib64/heartbeat/hb_standby ,將nod1下線為維擴模式,此時vip被取消配置,httpd服務被停止
在nod2上查看vip已經被自動配置,httpd服務自動啟動,監聽在80端口,heartbeat服務正常。
使用 /usr/lib64/heartbeat/hb_takeover命令,將nod1重新上線
6、驗證數據庫是共享使用,發表的文章,兩個節點內容一致
確保vip被配置在nod1節點上,登錄后發,發表一篇文章,前臺訪問頁面如下:
將nod1配置為standby, 確保vip位于nod2上,訪問wordpress首頁如下:
原創文章,作者:N21-沉舟,如若轉載,請注明出處:http://www.www58058.com/58262
寫的很棒,完全可以作為范例來展示