1、結合圖形描述LVS的工作原理;
工作方式:
LVS由前端的負載均衡器(Load Balancer,LB)和后端的真實服務器(Real Server,RS)群組成。RS間可通過局域網或廣域網連接。LVS的這種結構對用戶是透明的,用戶只能看見一臺作為LB的虛擬服務器(Virtual Server),而看不到提供服務的RS群。當用戶的請求發往虛擬服務器,LB根據設定的包轉發策略和負載均衡調度算法將用戶請求轉發給RS。RS再將用戶請求結果返回給用戶。
工作原理:
1.當客戶端的請求到達負載均衡器的內核空間時,首先會到達PREROUTING鏈。
2.當內核發現請求數據包的目的地址是本機時,將數據包送往INPUT鏈。
3.LVS由用戶空間的ipvsadm和內核空間的IPVS組成,ipvsadm用來定義規則,IPVS利用ipvsadm定義的規則工作,IPVS工作在INPUT鏈上,當數據包到達INPUT鏈時,首先會被IPVS檢查,如果數據包里面的目的地址及端口沒有在規則里面,那么這條數據包將被放行至用戶空間。
4.如果數據包里面的目的地址及端口在規則里面,那么這條數據報文將被修改目的地址為事先定義好的后端服務器,并送往POSTROUTING鏈。
5.最后經由POSTROUTING鏈發往后端服務器。
幾種常用模型:
①.客戶端將請求發往前端的負載均衡器,請求報文源地址是CIP,目標地址為VIP。
②.負載均衡器收到報文后,發現請求的是在規則里面存在的地址,那么它將客戶端請求報文的源MAC地址改為自己DIP的MAC地址,目標MAC改為了RIP的MAC地址,并將此包發送給RS。
③.RS發現請求報文中的目的MAC是自己,就會將次報文接收下來,處理完請求報文后,將響應報文通過lo接口送給eth0網卡直接發送給客戶端。
優點:返回請求無需經過調度器,效率高
缺點:
1.配置復雜,需要修改內核參數使lo接口的VIP不能響應本地網絡內的arp請求;
2.負載均衡器的DIP網卡與各RS必須在一個局域網中,不能跨網段;
3.無法做端口轉換。
①.客戶端將請求發往前端的負載均衡器,請求報文源地址是CIP(客戶端IP),后面統稱為CIP),目標地址為VIP(負載均衡器前端地址,后面統稱為VIP)。
②.負載均衡器收到報文后,發現請求的是在規則里面存在的地址,那么它將客戶端請求報文的目標地址改為了后端服務器的RIP地址并將報文根據算法發送出去。
③.報文送到Real Server后,由于報文的目標地址是自己,所以會響應該請求,并將響應報文返還給LVS。
④.然后lvs將此報文的源地址修改為本機并發送給客戶端。
優點:
1.RS端配置簡單,只需配置私網IP即可;
2.支持端口轉換。
缺點:由于請求與響應都經過調度器,所以性能較差,容易出現瓶頸;
①.客戶端將請求發往前端的負載均衡器,請求報文源地址是CIP,目標地址為VIP。
②.負載均衡器收到報文后,發現請求的是在規則里面存在的地址,那么它將在客戶端請求報文的首部再封裝一層IP報文,將源地址改為DIP,目標地址改為RIP,并將此包發送給RS。
③.RS收到請求報文后,會首先拆開第一層封裝,然后發現里面還有一層IP首部的目標地址是自己lo接口上的VIP,所以會處理次請求報文,并將響應報文通過lo接口送給eth0網卡直接發送給客戶端。
優點:
1.返回請求無需經過調度器,效率高;
2.負載均衡器與RS之間可以跨網段,甚至跨公網。
缺點:
1.配置復雜,需要修改內核參數使lo接口的VIP不能響應本地網絡內的arp請求;
2.無法做端口轉換。
2、搭建一套LVS-DR模型的高性能集群,并實現以下功能:
(1)、wordpress程序通過nfs共享給各個realserver;
(2)、后端realserver中的nginx和php分離
1. 在兩臺rs節點上分別安裝nginx
]# yum install nginx nfs-utils -y #安裝nfs-utils是為了后面能夠正常掛在nfs分區
2. 安裝Mariadb
]# yum install mariadb-server -y
3. 安裝php-fpm和nfs
]# yum install php-fpm php-mysql php-mbstring php-gd php-xml nfs-utils -y
4. 在兩個rs節點上分別修改nginx配置文件,添加下面內容:
]# vim /etc/nginx/nginx.conf ... location / { root /data/www; #定義根目錄 index index.php index.html index.htm; #將index.php放在第一位置 } location ~ \.php$ { root /data/www; fastcgi_pass 192.168.0.24:9000; #指定php服務器地址和端口 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } ...
5.在php服務器上修改php-fpm配置文件
]# vim /etc/php-fpm.d/www.conf listen = 192.168.0.24:9000 #設置監聽地址和端口 #listen.allowed_clients = 127.0.0.1 #默認只允許本機訪問,注釋該行后表示允許所有地址到本機的連接 ]# systemctl start php-fpm.service
6. 在php服務器上配置nfs服務
]# mkdir -p /data/www ]# vim /etc/exports /data/www 192.168.0.0/24(rw,no_root_squash) #將/data/www通過nfs服務共享出去 ]# systemctl start nfs.service
7.在兩個rs節點上創建共享目錄并掛在共享盤
]# mkdir -p /data/www/ ]# mount -t nfs 192.168.0.24:/data/www /data/www ]# systemctl start nginx.service
8.在php服務器上創建測試頁,并在瀏覽器上分別打開rs1和rs2的主頁,檢查nginx和php的聯動
]# vim /data/www/index.php <?php phpinfo(); ?>
9. 在MySQL服務器上設置必要的優化參數并重新初始化數據文件目錄
]# 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 ]# systemctl start mariadb.service
10.測試php與Mariadb聯動
]# mysql MariaDB [(none)]> grant all on *.* to 'root'@'192.168.0.%' identified by 'magedu'; #在mysql中創建遠程連接賬號用于聯動測試 MariaDB [(none)]> flush privileges; ]# vim /data/www/index.php #在php服務器上創建測試頁面 <?php $conn = mysql_connect('192.168.0.25','root','magedu'); if ($conn) echo "OK"; else echo "Failure"; ?>
11. 在MySQL中創建wordpress數據庫和用戶
MariaDB [(none)]> create database wpdb; MariaDB [(none)]> grant all on wpdb.* to wpuser@'192.168.0.%' identified by 'magedu'; MariaDB [(none)]> flush privileges;
12.在php服務器上部署wordpress
]# cd /data/www ]# unzip wordpress-3.3.1-zh_CN.zip ]# cd wordpress ]# cp wp-config-sample.php wp-config.php #生成wordpress配置文件 ]# vim wp-config.php define('DB_NAME', 'wpdb'); #修改為實際庫名 /** MySQL 數據庫用戶名 */ define('DB_USER', 'wpuser'); #修改為實際用戶名 /** MySQL 數據庫密碼 */ define('DB_PASSWORD', 'magedu'); #修改為實際密碼 /** MySQL 主機 */ define('DB_HOST', '192.168.0.25'); #修改為實際IP
13.使用瀏覽器完成后續的圖形化安裝步驟
瀏覽器輸入:http://192.168.0.21/wordpress/wp-admin/install.php
14. 在lvs服務器上安裝lvs
]# yum install ipvsadm -y
15. 在lvs物理網卡上配置VIP
]# ifconfig eno16777736:0 192.168.0.20 netmask 255.255.255.255 broadcast 192.168.0.20
16.在兩臺rs上修改內核參數,禁止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
17.在兩臺rs的lo網卡上配置VIP并添加到lvs的vip的路由
]# ifconfig lo:0 192.168.0.20 netmask 255.255.255.255 broadcast 192.168.0.20 ]# route add -host 192.168.0.20 dev lo:0
18.在lvs上配置ipvsadm規則
]# ipvsadm -A -t 192.168.0.20:80 -s rr ]# ipvsadm -a -t 192.168.0.20:80 -r 192.168.0.22 -g -w 1 ]# ipvsadm -a -t 192.168.0.20:80 -r 192.168.0.23 -g -w 1 ]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.0.20:80 rr -> 192.168.0.22:80 Route 1 0 0 -> 192.168.0.23:80 Route 1 0 0
19.在瀏覽器中訪問lvs的vip,測試是否成功
3、基于heartbeat v2 crm實現HA LAMP組合;要求,部署wordpress,用于編輯的文章中的任何數據在節點切換后都能正常訪問;
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 ]# /etc/init.d/httpd start
2.配置nfs服務器
]# mkdir -p /data/www ]# vim /etc/exports /data/www 192.168.0.0/24(rw,no_root_squash) ]# systemctl start nfs.service
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 ]# systemctl start mariadb.service ]# mysql MariaDB [(none)]> create database wpdb; MariaDB [(none)]> grant all on wpdb.* to wpuser@'192.168.0.%' identified by 'magedu'; MariaDB [(none)]> flush privileges;
4.在nfs服務器上修改wordpress配置文件
]# cd /data/www ]# unzip wordpress-3.3.1-zh_CN.zip ]# cd wordpress ]# cp wp-config-sample.php wp-config.php ]# vim wp-config.php define('DB_NAME', 'wpdb'); /** MySQL 數據庫用戶名 */ define('DB_USER', 'wpuser'); /** MySQL 數據庫密碼 */ define('DB_PASSWORD', 'magedu'); /** MySQL 主機 */ define('DB_HOST', '192.168.0.25');
5.在兩個rs上分別掛在nfs目錄
]# mount -t nfs 192.168.0.24:/data/www /var/www/html
6.使用瀏覽器完成后續的圖形化安裝步驟,確保通過每個rs節點都能正常訪問wordpress
7.配置heartbeat v2 crm的準備工作
1)各節點hosts中添加自己和對端節點的名稱解析
2)各節點之間建立ssh互信關系
3)各節點之間時間同步
8.在各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
9.在兩個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,依然正常,說明高可用實現成功。
原創文章,作者:N26-西安-方老喵,如若轉載,請注明出處:http://www.www58058.com/76289
非常贊,尤其是lvs集中模型的數據流走向,其實理清楚里面的網絡地址和mac地址轉換過程,對于以后排查lvs相關的故障就輕而易舉了。