生产环境网站离不开负载均衡、高可用性这样的字眼,不用解释便知道其中的意义与重要性。高可用性可以用keepalived实现,负载均衡可以用lvs或者nginx实现,二者的区别是lvs基于网络层,nginx基于应用层或者基于浏览器。lvs有3中实现方式,分别是nat、dr、tunel(隧道),三者大体相似,这里介绍nat模式,本文也没用介绍keepalived,以后有时间再写。
实验环境:使用vmware虚拟出4台linux,有一台作为client(rhel4.6),其中两台作为realserver(rhel5.6),另外一台作为lvs-nat(rhel5.6),各机器模拟信息如下图:
vmware里的各虚机网卡均采用桥接模式,lvs主机另添加了一块网卡eth1,共用两块网卡。
实验过程:在实验前,统一把各主机selinux和iptables关掉,lvs软件也就是这里安装的ipvsadm软件。
1.lvs配置:
先静态配置两个ip:eth0、eth1:
LVS# cat /etc/sysconfig/network-scripts/ifcfg-eth0
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.65.200
NETWORK=192.168.65.0
NETMASK=255.255.255.0
BROADCAST=192.168.65.255
HWADDR=00:0C:29:03:54:66
ONBOOT=yes
LVS# cat /etc/sysconfig/network-scripts/ifcfg-eth1
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth1
BOOTPROTO=static
IPADDR=192.168.200.200
NETWORK=192.168.200.0
NETMASK=255.255.255.0
BROADCAST=192.168.200.255
ONBOOT=yes
HWADDR=00:0c:29:03:54:70
LVS#mount /dev/cdrom /media
LVS#cd /media/Cluster
LVS# rpm -ivh ipvsadm-1.24-12.el5.i386.rpm
到这里,ipvsadm功能可以使用了,下面指明lvs主机与realserver主机:
LVS# ipvsadm -A -t 192.168.200.200:80 -s rr ///增加一台新的虚拟服务器,tcp地址为192.168.200.200,指明端口是web,使用调度算法是rr
LVS# ipvsadm -a -t 192.168.200.200:80 -r 192.168.200.210 -m ///增加一个realserver:192.168.200.210,lvs的模式为nat
LVS# ipvsadm -a -t 192.168.200.200:80 -r 192.168.200.220 -m ///如果有很多台realserver,可以一次往下添加
......
LVS# ipvsadm -ln ///检验刚刚添加的配置是否正确
LVS# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1 ///将0改为1,开启ip转发功能,因为这里的lvs相当于分离器,将收到的请求转发给realserver
LVS# /sbin/sysctl -p ///打印上一步的修改,检查有无错误
到这里,lvs机器基本信息配置完成,lvs不需要配置web(apache)。
2.配置realserver RS1:
首先将ip地址eth0写成静态:
RS1# cat /etc/sysconfig/network-scripts/ifcfg-eth0
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.200.210
NETWORK=192.168.200.0
NETMASK=255.255.255.0
BROADCAST=192.168.200.255
GATEWAY=192.168.200.200
HWADDR=00:0C:29:F8:73:52
ONBOOT=yes
RS1# yum install httpd
RS1# vi /var/www/html/index.html
RS1-----IP:192.168.200.210
RS1#service httpd restart
3.配置realserver RS2:
RS2# cat /etc/sysconfig/network-scripts/ifcfg-eth0
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.200.220
NETWORK=192.168.200.0
NETMASK=255.255.255.0
BROADCAST=192.168.200.255
GATEWAY=192.168.200.200
HWADDR=00:0C:29:05:BB:BE
ONBOOT=yes
RS2# yum install httpd
RS2# vi /var/www/html/index.html
RS2---------ip:192.168.200.220
RS2# service httpd restart
4.客户端的配置:
client# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.65.100
NETWORK=192.168.65.0
NETMASK=255.255.255.0
BROADCASTL=192.168.65.255
GATEWAY=192.168.65.200
HWADDR=00:0C:29:76:ED:97
ONBOOT=yes
TYPE=Ethernet
接下来再客户机上面执行测试操作:
在命令符终端上面验证:
在浏览器上面验证:
在客户机上面验证表明lvs功能发挥成功。
下面在lvs机器上面查看实验过程:
到这里,种种迹象表明lvs的nat模式搭建成功。下面介绍相关原理:
1,virtual-service-address:是指虚拟服务器的ip 地址
2,real-service-address:是指真实服务器的ip 地址
3,scheduler:调度方法
([email protected] 翻译 ipvsadm v1.21 2004 年4 月)
ipvsadm 的用法和格式如下:
ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p
[timeout]] [-M netmask]
ipvsadm -D -t|u|f virtual-service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address:port -r real-server-address:port
[-g|i|m] [-w weight]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
ipvsadm --set tcp tcpfin udp
ipvsadm --start-daemon state [--mcast-interface interface]
ipvsadm --stop-daemon
ipvsadm -h
命令选项解释:
有两种命令选项格式,长的和短的,具有相同的意思。在实际使用时,两种都可
以。
-A --add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也
就是增加一台新的虚拟服务器。
-E --edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录。
-D --delete-service 删除内核虚拟服务器表中的一条虚拟服务器记录。
-C --clear 清除内核虚拟服务器表中的所有记录。
-R --restore 恢复虚拟服务器规则
-S --save 保存虚拟服务器规则,输出为-R 选项可读的格式
-a --add-server 在内核虚拟服务器表的一条记录里添加一条新的真实服务器
记录。也就是在一个虚拟服务器中增加一台新的真实服务器
-e --edit-server 编辑一条虚拟服务器记录中的某条真实服务器记录
-d --delete-server 删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l --list 显示内核虚拟服务器表
-Z --zero 虚拟服务表计数器清零(清空当前的连接数量等)
--set tcp tcpfin udp 设置连接超时值
--start-daemon 启动同步守护进程。他后面可以是master 或backup,用来说
明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived 的
VRRP 功能。
--stop-daemon 停止同步守护进程
-h --help 显示帮助信息
其他的选项:
-t --tcp-service service-address 说明虚拟服务器提供的是tcp 的服务
[vip:port] or [real-server-ip:port]
-u --udp-service service-address 说明虚拟服务器提供的是udp 的服务
[vip:port] or [real-server-ip:port]
-f --fwmark-service fwmark 说明是经过iptables 标记过的服务类型。
-s --scheduler scheduler 使用的调度算法,有这样几个选项
rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,
默认的调度算法是: wlc.
-p --persistent [timeout] 持久稳固的服务。这个选项的意思是来自同一个客
户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。
-M --netmask netmask persistent granularity mask
-r --real-server server-address 真实的服务器[Real-Server:port]
-g --gatewaying 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式)
-i --ipip 指定LVS 的工作模式为隧道模式
-m --masquerading 指定LVS 的工作模式为NAT 模式
-w --weight weight 真实服务器的权值
--mcast-interface interface 指定组播的同步接口
-c --connection 显示LVS 目前的连接 如:ipvsadm -L -c
--timeout 显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout
--daemon 显示同步守护进程状态
--stats 显示统计信息
--rate 显示速率信息
--sort 对虚拟服务器和真实服务器排序输出
--numeric -n 输出IP 地址和端口的数字形式
算法:
rr一人一个,缺点是当群中有的机器性能好,有的性能坏,坏的扛不住
wrr基于权重的rr算法,缺点是新加的RS不会分担旧RS的负载。
如RS1 负载100
RS2 负载100
RS3(new) 1 RS3永远比旧RS少负担100
lc 最少链接 新加入的RS会主动承担负载,lvs会将新的请求全部分给新RS,直到新RS的负载和旧的大致相等的时候在分发
wlc基于权重的lc
lblc 尽可能让同一个访问分到同一个RS上,CDN常用,可以提高命中
sh 基于源IP的hash算法,保证同一个源IP的请求分到同一台RS上。主要用在会话连接中,如输入账号密码,如果用rr,两次请求就会切换到不同的RS上,就会需要重新输入账号密码,除非用cookice。
dh基于目标IP的hash算法