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.178linux.com/75745