1、結合圖形來描敘LVS的工作原理;
工作原理
LVS分為兩個組件:ipvs和ipvsadm
ipvs:工作于內核空間,主要用于使用戶定義的策略生效;
ipvsadm : 工作于用戶空間,主要用于用戶定義和管理集群服務的工具;
上圖所示,ipvs工作于內核空間的INPUT鏈上,當收到用戶請求某集群服務時,經過PREROUTING鏈,經檢查本機路由表,送往INPUT鏈;在進入netfilter的INPUT鏈時,ipvs強行將請求報文通過ipvsadm定義的集群服務策略的路徑改為FORWORD鏈,將報文轉發至后端真實提供服務的主機。
幾種常用模型:
LVS-DR
1)client向目標vip發出請求,Director接收.此時IP包頭及數據幀頭信息如(1),(2);
2)LVS根據負載均衡算法選擇一臺active的RS,將此RIP所在網卡的mac地址作為目標mac地址,發送到局域網里.此時IP包頭及數據幀頭信息如(3);
3)RS在局域網中收到這個幀,拆開后發現目標IP(VIP)與本地匹配,于是處理這個報文.隨后重新封裝報文,發送到局域網.此時IP包頭及數據幀頭信息如(4);
1)RS可以使用私有地址;但也可以使用公網地址,此時可以直接通過互聯網連入RS以實現配置、監控等;
2)RS的網關一定不能指向DIP;
3)RS跟DR要在同一物理網絡內(不能由路由器分隔);
4)請求報文經過DR,但響應報文一定不經過DR
5)不支持端口映射;
6)RS可以使用大多數的操作系統;
LVS-NAT
此模型中,DR只需要將VIP配置到DR上,它的工作機制是,將收到的集群服務請求報文目標地址轉換成經調度算法計算得出的后端主機IP地址,然后端主機將響應報文發送至DR,再由DR將源地址轉換成VIP的地址;此機制與iptables中我們學習的DNAT類似;
LVS-TUN
在數據包必須傳遞到另一個網絡或因特網上時,可以使用ip隧道,ip隧道能夠將數據包從一個子網或虛擬局域網(VLAN)轉發到另一個子網或虛擬局域網(VLAN),建立ip隧道是Linux內核功能的一部分,LVS-TUN轉發方法允許你將集群節點放在與Director不同的網絡上。
請留意DR將數據包轉發給RS時的IP數據報文;由于DR,RS都不在同一局域網內,而DR要將client請求報文轉發給RS時,DR是直接在數據包中直接添加IP首部(源IP:DR和目標IP:RS),這樣就是隧道技術了。
同樣,該模型下RS都將配置VIP地址,且不能被外界所獲知VIP存在于RS上;
LVS TUN類型:IP隧道
1)RIP、DIP、VIP都得是公網地址;
2)RS的網關不會指向也不可能指向DIP;
3)請求報文經過DR,但響應報文一定不經過DR;
4)不支持端口映射;
5)RS的OS必須得支持隧道功能;
LVS-FullNat
LVS當前應用主要采用DR和NAT模式,但這2種模式要求RS和DR在同一個vlan中,導致部署成本過高;TUN模式雖然可以跨vlan,但RS上需要部署ipip模塊等,網絡拓撲上需要連通外網,較復雜,不易運維。為了解決上述問題,我們在DR上添加了一種新的轉發模式:FullNat,該模式和NAT模式的區別是:Packet IN時,除了做DNAT,還做SNAT(用戶ip->內網ip),從而實現DR-RS間可以跨vlan通訊,RS只需要連接到內網;
LVS FullNat:
1)DR,RS可以不在同一網絡內,但它與TUN不同,所有IP報文頭部信息變更都在DR上進行,所以性能方面比LVS_NAT更差一些;
2)需要注意配置路由,保證能正常通信;
2、搭建一套LVS-DR模型的高性能集群,并實現以下功能:
(1)、wordpress程序通過nfs共享給各個realserver;
(2)、后端realserver中的nginx和php分離
LVS-VIP 192.168.31.100
LVS- DIP 192.168.31.10
nginx1 192.168.31.11
nginx2 192.168.31.12
PHP/NFS 192.168.31.13
MySQL 192.168.31.14
架構圖
1、在兩臺nginx上安裝nginx服務,我這里選擇源碼編譯安裝
[root@server ~]# tar -zxvf nginx-1.10.3.tar.gz
[root@server ~]# ./configure –prefix=/usr/local/nginx –sbin-path=/usr/local/nginx/sbin/nginx –conf-path=/etc/nginx/nginx.conf –error-log-path=/var/log/nginx/error.log –http-log-path=/var/log/nginx/access.log –pid-path=/var/run/nginx/nginx.pid –lock-path=/var/lock/nginx.lock –user=nginx –group=nginx –with-http_ssl_module –with-http_flv_module –with-http_stub_status_module –with-http_gzip_static_module –http-client-body-temp-path=/var/tmp/nginx/client/ –http-proxy-temp-path=/var/tmp/nginx/proxy/ –http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ –http-uwsgi-temp-path=/var/tmp/nginx/uwsgi –http-scgi-temp-path=/var/tmp/nginx/scgi –with-pcre
[root@server ~]#make && make install
2、建立nginx用戶,保證和php服務器上的nginx用戶id號,組id號一致
groupadd -r -g 409 nginx
useradd -r -u 409 -g 409 nginx
3、在PHP/NFS服務起上安裝php及nfs
yum install php-mysql php-mbstring php-gd php-xml nfs-utils -y
[root@php ~]#tar -zxvf php-5.5.15.tar.gz
[root@php ~]#./configure –prefix=/usr/local/php –with-mysql –with-pdo-mysql –with-mysqli –with-openssl –enable-fpm –enable-sockets –enable-sysvshm –enable-mbstring –with-freetype-dir –with-jpeg-dir –with-png-dir –with-zlib-dir –with-libxml-dir=/usr –enable-xml –with-mhash –with-mcrypt –with-config-file-path=/etc –with-config-file-scan-dir=/etc/php.d –with-bz2 –with-curl
[root@php ~]#make && make install
提供配置文件
[root@php php-5.5.15]# cp php.ini-production /etc/php.ini
為php-fpm提供腳本
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod +x /etc/init.d/php-fpm
chkconfig –add php-fpm
chkconfig php-fpm on
4、在PHP服務器上,建立nginx用戶,要保證和nginx服務器上的nginx用戶id號、組id號一致:
groupadd -r -g 409 nginx
useradd -r -u 409 -g 409 nginx
5、修改php-fpm配置文件,并重啟:
vim /usr/local/php/etc/php-fpm.conf
listen = 192.168.31.13:9000
user = nginx
group = nginx
service php-fpm restart
6.在PHP服務器上創建/www目錄,并開啟nfs服務
mkdir /www
chown nginx.nginx /www -R
vim /etc/exports
/www 192.168.31.0/24(rw,no_root_squash)
service nfs start
7.整合nginx與php
nginx服務器建立網頁文件存放目錄/www,并修改其權限
mkdir /www
chown -R nginx:nginx /www
vim /etc/nginx/nginx.conf
location / {
root /www;
index index.php index.html index.htm;
}
location ~ \.php$ {
root /www;
fastcgi_pass 192.168.31.13:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
8、nginx服務器掛載nfs,并測試php
mount -t nfs 192.168.31.13:/www /www
vim /www/index.php
<?php
phpinfo();
?>
9、整合PHP與mysql,安裝mysql
9.1添加用戶
useradd -r mysql
mkdir -pv /mydata/data
chown -R mysql.mysql /mydata/data
9.2解壓并初始化mysql
tar xf mariadb-10.0.20-linux-x86_64.tar.gz -C /usr/local/
cd /usr/local/
ln -sv mariadb-10.0.20-linux-x86_64 mysql
cd mysql/
chown -R root:mysql .
scripts/mysql_install_db –user=mysql –datadir=/mydata/data/
9.3修改配置文件
cp support-files/my-large.cnf /etc/my.cnf
vim /etc/my.cnf
添加以下幾行
datadir = /mydata/data
innodb_file_per_table = ON
skip_name_resolve = ON
9.4提供腳本文件
cp support-files/mysql.server /etc/init.d/mysqld
chkconfig –add mysqld
chkconfig mysqld on
service mysqld start
10.測試php與Mariadb聯動
MariaDB [(none)]> grant all on *.* to 'root'@'192.168.31.%' identified by 'mysql'; #在mysql中創建遠程連接賬號用于聯動測試 MariaDB [(none)]> flush privileges; ]# vim /data/www/index.php #在php服務器上創建測試頁面 <?php $conn = mysql_connect('192.168.31.14','root','mysql'); if ($conn) echo "OK"; else echo "Failure"; ?>
11、在php服務器上部署wordpress
cd /www
tar -zxvf wordpress-4.7.4-zh_CN.tar.gz
12、使用瀏覽器完成后續的圖形化安裝步驟。。。。省略
13、lvs服務器上安裝lvs
yum -y install ipvsadm
在lvs物理網卡上配置vip,并添加路由
ifconfig eth0:0 192.168.31.100 netmask 255.255.255.255 broadcast 192.168.31.100
route add -host 192.168.31.100 dev eth0:0
14、在兩臺rs上配置VIP,添加路由,并修改內核參數,禁止lo對VIP的廣播做響應
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 192.168.31.100 netmask 255.255.255.255 broadcast 192.168.31.100
route add -host 192.168.31.100 dev lo:0
15、在lvs上配置ipvsadm規則
ipvsadm -A -t 192.168.31.100:80 -s rr
ipvsadm -a -t 192.168.31.100:80 -r 192.168.31.11 -g -w 1
ipvsadm -a -t 192.168.31.100:80 -r 192.168.31.12 -g -w 1
ipvsadm -L -n
16、在瀏覽器中訪問lvs的vip,測試是否成功
3.基于heartbeat v2 crm實現HA LAMP組合;要求,部署wordpress,用于編輯的文章中的任何數據在節點切換后都能正常訪問;
Apache1/PHP VIP:192.168.31.100 RIP:192.168.31.11
Apache2/PHP VIP:192.168.31.100 RIP:192.168.31.12
NFS RIP:192.168.31.13
MYSQL RIP:192.168.31.14
架構圖
1. 在兩臺rs節點上分別安裝httpd,php并配置
yum install httpd php php-mysql php-mbstring php-gd php-xml nfs-utils -y
vim /etc/httpd/conf/httpd.conf
<IfModule dir_module>
DirectoryIndex index.php index.html
</IfModule>
…
AddType application/x-httpd-php .php
service httpd start
2.配置nfs服務器
mkdir -pv /data/www
vim /etc/exports
/data/www 192.168.0.0/24(rw,no_root_squash)
service nfs start
3.安裝并配置mariadb服務器
vim /etc/my.cnf
[mysqld]
…
datadir = /mydata/data
innodb_file_per_table = ON
skip_name_resolve = ON
mkdir -p /mydata/data
mysql_install_db –user=mysql –datadir=/mydata/data
service mysqld start
mysql
MariaDB [(none)]> create database wpdb;
MariaDB [(none)]> grant all on wpdb.* to root@’192.168.0.%’ identified by ‘mysql’;
MariaDB [(none)]> flush privileges;
4.在兩個rs上分別掛在nfs目錄
mount -t nfs 192.168.0.24:/data/www /var/www/html/
5.使用瀏覽器完成后續的圖形化安裝步驟,確保通過每個rs節點都能正常訪問wordpress <同上>
6.配置heartbeat v2 crm的準備工作
1)各節點hosts中添加自己和對端節點的名稱解析
2)各節點之間建立ssh互信關系
3)各節點之間時間同步
7.在各rs節點安裝heartbeat
yum install net-snmp-libs libnet PyXML libtool-ltdl gnutls gettext -y
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
8.在兩個rs節點上分別配置heartbeat
cp /usr/share/doc/heartbeat-2.1.4/{ha.cf,authkeys} /etc/ha.d/
cd /etc/ha.d/
chmod 600 authkeys
vim authkeys auth2 #1 crc 2 sha1 1q2w3e4R #3 md5 Hello! vim /etc/ha.d/ha.cf logfile /var/log/ha-log #只用heartbeat日志 #logfacility local0 #禁用rsyslog的local0 mcast eth0 225.23.190.1 694 1 0 #設定組播地址 keepalive 2 #監聽頻率為2秒 deadtime 30 #死亡判定時間為30秒 warntime 10 #異常警告時間為10秒 auto_failback on #修復后自動上線 node node1.magede.com #設置節點1 node node2.magedu.com #設置節點2 ping 192.168.0.1 #設定第三方仲裁設備 crm on #開啟crm,同時也會禁用haresources
10.打開hb_gui圖形界面
]# echo "magedu"|passwd --stdin hacluster #為hacluster設定密碼,用于后面圖形化登錄時身份驗證 ]# service heartbeat start;ssh node2 service heartbeat start ]# hb_gui &
輸入hacluster密碼后進入hb_gui主界面
創建資源組ha_wordpress
創建資源webip,用于啟停VIP
創建資源nfs,用于掛載nfs共享磁盤
創建資源webserver,用于啟停httpd服務
創建colocation約束,用于將不同資源綁定在一起
創建約束nfs_with_webip,即nfs服務必須與webip在同一個節點上
創建約束webserver_with_nfs,即webserver必須與nfs在同一個節點上
創建順序約束,用來指定資源服務的啟停順序
創建約束nfs_after_webip,即nfs必須在webip啟動之后才能啟動
創建約束webserver_after_nfs,即webserver服務必須在nfs服務啟動之后才能啟動
啟動資源ha_wordpress之后,可以發現所有節點均啟動在節點2上,此時訪問http://192.168.0.20/wordpress正常。
將節點2置為standby
可以發現所有的資源均已漂移到節點1上,再次訪問http://192.168.0.20/wordpress,依然正常,說明高可用實現成功。
嗯,差不多了!
原創文章,作者:N27_Vicent,如若轉載,請注明出處:http://www.www58058.com/78598