19.LVS小記
LVS的類型:
nat:是一種基于IP的DNAT的,通過目標端口與目標地址利用特定的算法選取出響就的主機進行響應,通過RS(Real Server)的地址和端口進行轉發
特點:
RIP與DIP必需在同一個網段中,RIP應該使用私網地址且RS的網關需要指向DIP(VS的一個IP)
請求報文與響應報文都需要經過Director進行轉發,Director易于成為并發性瓶頸
支持端口映射,可修改請求報文的目標端口
VS必須是Linux系統,而RS可以是任意系統
DR:是一種基于直鏈路由進行響應轉發,訪問VIP(VS的虛擬IP),修改包的源地址,響應時不再經過VS
特點:
Director與所有的RS都需要配置VIP
確保前端路由將目標IP為VIP的請求報文發往Director上
在前端網關做靜態綁定
在RS上使用arptables
在RS上修改內核參數,以限制arp通告及應答級別
/proc/sys/net/ipv4/conf/all/arp_ignore 的值修改為1
/proc/sys/net/ipv4/conf/all/arp_announce 的值修改為2
把lo網卡的以上值也修改
RS的RIP可以是公網IP,也可以使用公網IP;RIP與DIP在同一個網段中,RS的網關不可以指向DIP,以確保報文不會流經Director
請求報文經由Director,而響應報文不經過Director而是直接響應客戶端
不支持端口映射
tun:隧道模式,在請求IP的報文外面再次封裝一個IP首部,通過這個IP訪問選定的RS,RS響應的時候不再經過VS直接響應VS
特點:
DIP,VIP,RIP都是公網地址(RIP與DIP和VIP八桿子打不著,更別說在同一個網段了)
請求經由Director,但是響應不經過Director,而是直接響應客戶端
不支持商品映射
RS的OS需要支持隧道功能;
fullnat:通過修改源地址的源IP與目標IP地址進行轉發
特點:
VIP是公網地址,RIP與DIP是私網地址,且通常不在同一IP網絡;RIP的網關一般不會指向DIP
RS收到的請求的報文,源地址是會轉化為DIP目標地址轉化為RIP
請求與響應都經過Director
支持端口映射
十大算法:
靜態算法:
RR:輪詢
WRR:加權輪詢
SH:Srouce Hashing,將來自同一個IP的請求始終發往第一次挑中的RS,從而實現會話綁定
DH:Destination Hashing,將發往同一個目標地址的請求始終發至第一次挑中的RS,典型使用場景是正向代理緩存場景中的負載均衡
動態算法:
LC:last connection
Overhead=activeconns256+inactiveconns
WLC:Weighted LC
Overhead=(activeconns256+inactiveconns)/weight
SED:Shortest Expection Delay
Overhead=(activeconns+1)*256/weight
NQ:Never Queue
LBLC:Localirty-Based LC,動態DH算法
LBLCR:LBLC with Replication,帶復制功能的LBLC;
實現LVS_nat
VS上的腳本
#!/bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
network_device=”enp0s3″
DIP=”192.168.56.103″
DIP_R=”172.18.250.96″
PROT=80
type=rr
RS1=”192.168.56.101″
RS2=”192.168.56.102″
yum -y install ipvsadm >& /dev/null
ifconfig ${network_device}:0 $DIP netmask 255.255.255.255 broadcast $DIP up
ipvsadm -A -t ${DIP_R}:${PROT} -s $type
ipvsadm -a -t ${DIP_R}:${PROT} -r ${RS1} -m -w 1
ipvsadm -a -t ${DIP_R}:${PROT} -r ${RS2} -m -w 1
RS上的腳本
#!/bin/bash
DIP=”192.168.56.101″
RIP=”192.168.56.102″
route add -host $RIP gw $DIP
實現LVS_DR
VS腳本:
#!/bin/bash
VIP=”172.18.35.202″
PROT=80
DEVICE=”enp0s3″
type=wrr
RS1=”172.18.250.37″
RS2=”172.18.250.38″
ifconfig ${DEVICE}:0 $VIP netmask 255.255.255.255 broadcast $VIP up
ipvsadm -A -t ${VIP}:${PROT} -s $type
ipvsadm -a -t ${VIP}:${PROT} -r ${RS1} -g -w 1
ipvsadm -a -t ${VIP}:${PROT} -r ${RS2} -g -w 2
RS腳本
#!/bin/bash
VIP=”172.13.35.202″
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig lo:0 ${VIP} netmask 255.255.255.255 broadcast ${VIP} up
route add -host ${VIP} dev lo:0
RS的預配置腳本:
!/bin/bash
vip=10.1.0.5
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
VS的配置腳本:
!/bin/bash
vip=’10.1.0.5′
iface=’eno16777736:0′
mask=’255.255.255.255′
port=’80’
rs1=’10.1.0.7′
rs2=’10.1.0.8′
scheduler=’wrr’
type=’-g’
case $1 in
start)
ifconfig $iface $vip netmask $mask broadcast $vip up
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 $(basename $0) start|stop”
exit 1
;;
esac
實現LVS_tun
ifconfig tunl0 VIP netmask 255.255.255.255 broadcast 172.18.35.202 up //配置一個隧道IP,生產環境為公有IP,每一個RS上也需要有一個VIP為公有IP而且是配置在tunl網卡上的
route add -host VIP dev tunl0 //添加路由,使其響應報文的源IP為VIP
LVS的多端口與長連接
多端口使用firewall,持久連接使用persistent(timeout),也就是lvs的-f與-p
多端口要求,這里使用多端口需要用到iptables中的mangle表,在PREROUTING鏈上對請求進行修改,修改為一個數字,這個數字可以是一個十進制數值如3,也可以是一個十六制數字如0xffff等等
iptables -t mangle -A PREROUTING -d VIP -p tcp -m multiport –dport 80,8080 -j MARK –set-mark 0xffff
ipvsadm -A -f 0xffff -s wrr -p 300
ipvsadm -a -f 0xffff -r RIP -g -w 2
….
這個后面的就是LVS的DR配置了
長連接是在指定時間內連接不斷開,而且在/proc/net/….會生成一個時間表
LVS的ldirectord自動監控LVS的健康指數使用elrepo源可以進行rpm包安裝,此源清華與aliyun有
配置文件說明
# Global Directives
checktimeout=3
checkinterval=1
fallback=127.0.0.1:80
fallback6=[::1]:80
autoreload=yes
logfile=”/var/log/ldirectord.log”
logfile=”local0″
emailalert=”admin@x.y.z”
emailalertfreq=3600
emailalertstatus=all
quiescent=no
Sample for an http virtual service
virtual=172.18.35.202:80
real=172.18.250.37:80 gate
real=172.18.250.38:80 gate
#real=192.168.6.6:80 gate
fallback=127.0.0.1:80 gate
service=http
scheduler=wrr
persistent=600
#netmask=255.255.255.255
protocol=tcp
checktype=negotiate
checkport=80
request=”index.html” //七層健康監測
receive=”Test Page” //七層健康監測的內容
virtualhost=www.x.y.z
使用LVS發布wordpress
拓撲圖:
見LVS_DR_wordpress.png
配置步驟
RS_LAMP配置:
yum -y install showmount
service rpcbind start
service nfs start
mkdir /data/www -p
echo “/data/www 172.18.250.38(rw,async)” > /etc/exports
exportfs -ua
下載wordpress
unzip wordpress-4.3.1-zh_CN.zip
chmod -R a+w wordpress
vim /etc/httpd/conf/httpd.conf
#DocumentRoot “/var/www/html” //注釋掉
DirectoryIndex index.php index.html index.html.var //添加一個index.php
vim /etc/httpd/conf.d/vhost.conf
<VirtualHost :80>
DocumentRoot /data/www
ServerName www.a.com
ErrorLog logs/dummy-host.example.com-error_log
CustomLog logs/dummy-host.example.com-access_log common
<Directory /data/www>
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
service httpd start
mysql -u root
create database wordpress;
grant all privileges on *. to test@”localhost” identified by “test”;
grant all privileges on . to test@”127.0.0.1″ identified by “test”;
grant all privileges on . to test@”%” identified by “test”;
\q
ifconfig lo:0 172.18.35.202 netmask 255.255.255.255 broadcast 172.18.35.202 up
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/lo/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
route add -host 172.18.35.202 dev lo:0
RS_LNP配置:’
yum -y install showmount
mount -t nfs 172.18.250.37:/data/www /data/www
將nginx的主配置文件中的非注釋server注釋掉
vim /etc/nginx/conf.d/vhost.conf
server {
listen *:80;
root /data/www;
index index.php index.html index.htm;
location ~ .php$ {
fastcgi_pass localhost:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
注釋掉/etc/nginx/nginx.conf.default中的server段
ifconfig lo:0 172.18.35.202 netmask 255.255.255.255 broadcast 172.18.35.202 up
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/lo/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
route add -host 172.18.35.202 dev lo:0
VS配置:
ifconfig enp0s3:0 172.18.35.202 netmask 255.255.255.255 broadcast 172.18.35.202 up
yum -y install ipvsadm
ipvsadm -A -t 172.18.35.202:80 -s wrr
ipvsadm -a -t 172.18.35.202:80 -r 172.18.250.37 -g -w 1
ipvsadm -a -t 172.18.35.202:80 -r 172.18.250.38 -g -w 2
網頁配置,完成
原創文章,作者:gaomei,如若轉載,請注明出處:http://www.www58058.com/75745