LVS集群实战
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://1364952.blog.51cto.com/1354952/1955320
LVS
Linux Virtual Server: Linux虚拟服务器
基于四层的LB
================================
LVS+keepalived Web Server 80/tcp
LVS+keepalived Galera MySQL/MySQL Cluster 3306/tcp
一、LVS概述
LVS是Linux内核的一部分,因此性能较高
Linux虚拟服务器(即分发器或调度器)功能:
不真正提供服务,介接受客户的访问,为整个集群提供一个唯一的入口
虚拟服务器和真实服务器(Real Server)通信
真正提供服务,集群中每个(Real Server)可以是物理机,也可以是虚拟机
二、LVS三种基本模式
VS/NAT | VS/TUN | VS/DR | |
Server | any | Tunneling | Non-arp device |
Server network | private | LAN/WAN | LAN |
Server number | low(10-20) | High(100) | High(100) |
Server gateway | load balancer | own router | Own router |
注:Server为Real Server
VS/NAT:
any | IIS,Apache,Nginx |
private | 私有网络 |
low | 10~20 |
gateway | 所有Real Server网关必须指向调度器 |
VS/NAT:网络地址转换模式,进站/出站的数据流量经过分发器。
VS/DR:直接路由模式,只有进站的数据流量经过分发器
调试器和真实服务器必须在同一网段
VS/TUN:隧道模式,只有进站的数据流量经过分发器。
VS/NAT配置
实验说明:
1、 KVM网络使用NAT模式
2、 client、调试器、Real Server都使用虚拟机或使用真实服务器
3、 虚拟机上的网卡使用半虚拟化驱动,如果半虚拟化驱动异常,可以使用default/rtl8139
网络拓扑:
主机功能 | IP地址 | 必备软件 |
client | CIP:192.168.122.0/24 | curl、elinks或firefox |
Director | eth0:VIP:192.168.122.100 | |
eth1:DIP:10.10.10.1 | ||
Real Server | RIP:10.10.10.10 10.10.10.20 10.10.10.30 | 安装httpd服务 |
DNS Server | www.ak.com=====>192.168.122.100 | bind或bind-chroot |
建议:先在Real Server安装如httpd
VS/NAT实施
1、 准备工作(集群中所有主机)[可选]
IP、hostname、hosts、iptables、SELinux、ssh trust、ntp
cat /etc/hosts
|
2、 RS配置
说明:RS是指Real Server,即后端的真实服务器。
在node1、node2、node3上部署
node1部署httpd服务 | |
yum install -y httpd echo ServerName node1.sky.com:80 > /etc/httpd/conf.d/sv.conf echo node1 web > /var/www/html service httpd restart chkconfig httpd on | |
cd /etc/sysconfig/network-scripts cp -v ifcfg-eth0{,.bak} cat > ifcfg-eth0 <<EOF DEVICE=eth0 TYPE=Ethernet ONBOOT=yes BOOTPROTO=static IPADDR=10.10.10.10 NETMASK=255.255.255.0 GATEWAY=10.10.10.1 DNS=192.168.122.100 EOF service network restart ip addr show curl 127.0.0.1 | |
node2部署httpd服务 | |
yum install -y httpd echo ServerName node2.sky.com:80 > /etc/httpd/conf.d/sv.conf echo node2 web > /var/www/html service httpd restart chkconfig httpd on curl 127.0.0.1 | |
cd /etc/sysconfig/network-scripts cp -v ifcfg-eth0{,.bak} cat > ifcfg-eth0 <<EOF DEVICE=eth0 TYPE=Ethernet ONBOOT=yes BOOTPROTO=static IPADDR=10.10.10.20 NETMASK=255.255.255.0 GATEWAY=10.10.10.1 DNS=192.168.122.100 EOF service network restart ip addr show | |
node3部署httpd服务 | |
yum install -y httpd echo ServerName node3.sky.com:80 > /etc/httpd/conf.d/sv.conf echo node3 web > /var/www/html service httpd restart chkconfig httpd on curl 127.0.0.1 | |
cd /etc/sysconfig/network-scripts cp -v ifcfg-eth0{,.bak} cat > ifcfg-eth0 <<EOF DEVICE=eth0 TYPE=Ethernet ONBOOT=yes BOOTPROTO=static IPADDR=10.10.10.30 NETMASK=255.255.255.0 GATEWAY=10.10.10.1 DNS=192.168.122.100 EOF service network restart ip addr show |
配置好网站服务器,测试所有RS //为了看到效果,建议提供不同的页面
默认网关均指向Directory的DIP
3、 Director分发器配置
配置VIP
ip addr add dev eth0 192.168.122.100/24 vim /etc/sysctl.conf 修改内容如下 net_ipv4.ip_forward=1 :wq保存退出 sysctl -p //确保打开路由转发 |
定义LVS的分发策略
yum install -y ipvsadm ipvsadm --help man ipvsadm 然后查找EXAMPLE实例 ipvsadm -A -t 192.168.122.100:80 -s rr ipvsadm -a -t 192.168.122.100:80 -r 10.10.10.10 -m ipvsadm -a -t 192.168.122.100:80 -r 10.10.10.20 -m ipvsadm -a -t 192.168.122.100:80 -r 10.10.10.30 -m | 确保RHEL仓库可用
-m是批massquerading(NAT) |
技巧: Director调度器调度多个网站服务时,只需要给调度器的WAN网卡设置多个外网IP,然后做第2个调度策略。 |
查看LVS状态信息
ipvsadm -L ipvsadm -Ln | |
状态信息如下: |
查看其他信息
ipvsadm -L -n --stats ipvsadm -L -n --rate ipvsadm -Ln -c watch -n.5 'ipvsadm -Ln -c' |
看速率 看LVS的连接条目
|
4、 测试
elinks -dump http://192.168.122.100/ ab -c1000 -n 1000 http://192.168.122.100 |
5、 小结
VS/NAT模式的原理:当Director收到Client请求时,Director将数据包的目标IP由VIP转换为选中的Real Server的RIP来实现分发。
要求:RS将网关指向Director的DIP。
特点:配置简单,所有的入站、出站数据包都经过分发器。当数据量比较大时,分发器可能会出现网络瓶颈!因而支持的RS数量少。
重点注意:
Director必须开启Kernel ip_forward
所有Real Server默认网关指向DIP
Director使用DIP和Real Server的RIP通信
监测:
watch -n.5 'ipvsadm -Ln -c'
新命令了解:
arping -I eth0 172.20.20.250
ip addr add dev br1 172.16.20.250/24
ip addr add dev lo 172.16.20.250/32
arp -n | grep 192.168.100.2
VS/DR模式原理解析
RIP:设置在物理网卡
VIP:设置在lo环回网卡(127.0.0.1)上
Non-arp工作原理:
VS-DR部署实战
实验说明:
1、 KVM网络使用NAT模式
2、 DR模式要求Director的DIP和所有Real Server的RIP必须在同一个网段及广播域
3、 所有节点网关均指定真实网关
4、 用脚本部署LVS集群
注意:调度器和RealServer必须在同一个LAN,LAN可以使用公网IP,也可以使用private IP
公网IP:前端路由器工作模式为路由模式
私网IP:前端路由器工作为NAT,并将某个公网IP映射到VIP(private)
网络拓扑:
Client | CIP:192.168.122.1 | |||
Director | VIP:192.168.122.100 DIP:192.168.122.2 | |||
Real Server | RIP:192.168.122.10 VIP:192.168.122.100 | RIP:192.168.122.20 VIP:192.168.122.100 | RIP:192.168.122.30 VIP:192.168.122.100 |
Nor-arp |
DNS Server | www.sky.com ===>192.168.122.100 |
LVS/DR实战
1、准备工作(集群中所有主机)
IP、hostname、hosts、iptables、SELinux、ssh trust、ntp
cat /etc/hosts
|
6、 RS配置
说明:RS是指Real Server,即后端的真实服务器。
在node1、node2、node3上部署好网站服务器,测试所有RS。为了测试效果,提供不同的网站页面。
在三台RS上的lo环回接口上添加VIP,并开启Non-arp功能 | |
ip addr dee lo 192.168.122.100/32 #在lo接口上绑定VIP echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore #non-arp echo 2> /proc/sys/net/ipv4/conf/all/arp_announce #non-arp | |
node1部署httpd服务 | |
yum install -y httpd echo ServerName node1.sky.com:80 > /etc/httpd/conf.d/sv.conf echo node1 web > /var/www/html service httpd restart chkconfig httpd on | |
cd /etc/sysconfig/network-scripts cp -v ifcfg-eth0{,.bak} cat > ifcfg-eth0 <<EOF DEVICE=eth0 TYPE=Ethernet ONBOOT=yes BOOTPROTO=static IPADDR=10.10.10.10 NETMASK=255.255.255.0 GATEWAY=10.10.10.1 DNS=192.168.122.100 EOF service network restart ip addr show curl 127.0.0.1 | |
node2部署httpd服务 | |
yum install -y httpd echo ServerName node2.sky.com:80 > /etc/httpd/conf.d/sv.conf echo node2 web > /var/www/html service httpd restart chkconfig httpd on curl 127.0.0.1 | |
cd /etc/sysconfig/network-scripts cp -v ifcfg-eth0{,.bak} cat > ifcfg-eth0 <<EOF DEVICE=eth0 TYPE=Ethernet ONBOOT=yes BOOTPROTO=static IPADDR=10.10.10.20 NETMASK=255.255.255.0 GATEWAY=10.10.10.1 DNS=192.168.122.100 EOF service network restart ip addr show | |
node3部署httpd服务 | |
yum install -y httpd echo ServerName node3.sky.com:80 > /etc/httpd/conf.d/sv.conf echo node3 web > /var/www/html service httpd restart chkconfig httpd on curl 127.0.0.1 | |
cd /etc/sysconfig/network-scripts cp -v ifcfg-eth0{,.bak} cat > ifcfg-eth0 <<EOF DEVICE=eth0 TYPE=Ethernet ONBOOT=yes BOOTPROTO=static IPADDR=10.10.10.30 NETMASK=255.255.255.0 GATEWAY=10.10.10.1 DNS=192.168.122.100 EOF service network restart ip addr show |
配置好网站服务器,测试所有RS //为了看到效果,建议提供不同的页面
默认网关均指向Director的DIP
7、 Director分发器配置
配置VIP
ip addr add dev eth0 192.168.122.100/32 ##配置VIP yum install -y ipvsadm ##确保yum仓库可用 |
定义LVS分发策略
ipvsadm -C ipvsadm -A -t 192.168.122.100:80 -s rr ipvsadm -a -t 192.168.122.100:80 -r 192.168.122.10 -g ipvsadm -a -t 192.168.122.100:80 -r 192.168.122.20 -g ipvsadm -a -t 192.168.122.100:80 -r 192.168.122.30 -g service ipvsadm save ipvsadm -Ln |
查看LVS状态信息
ipvsadm -L ipvsadm -Ln | |
状态信息如下: |
查看其他信息
ipvsadm -L -n --stats ipvsadm -L -n --rate ipvsadm -Ln -c watch -n.5 'ipvsadm -Ln -c' |
看速率 看LVS的连接条目
|
8、 测试
elinks -dump http://192.168.122.100/ ab -c1000 -n 1000 http://192.168.122.100 |
9、 小结
VS/NAT模式的原理:当一个Client发送一个请求到VIP,Director根据VIP选择对应的RealServer的Pool,根据算法,在Pool中选择一台RealServer,然后将Client的请求包发给选择的RealServer,最后,选择的RealServer把应答包直接传给Client。
LVS集群部署的脚本
vi lvs_httpd.sh |
#!/bin/bash #LVS_DR_RealServer的httpd初始化脚本,并发处理。 IFS=$'\n' alias sed='sed -c --follow-syslinks' ntpserver=172.16.8.100 vip=192.168.122.100
for line in $(cat real_serverip.txt) #real_serverip.txt #old_ip hostname newip #192.168.122.10 web10 192.168.122.10 #192.168.122.11 web11 192.168.122.20 #192.168.122.12 web12 192.168.122.30 #... do { ip=$(echo $line | awk '{print $1}') hostname=$(echo $line | awk '{print $2}') newip=$(echo $line | awk '{print $3}')
ssh root@$ip 'chkconfig NetworkManager off' ssh root@$ip 'iptables -F ; service iptables save' ssh root@$ip "sed -r -i "/^SELINUX/cSELINUX=permissive" /etc/selinux/config" ssh root@$ip "sed -r -i "/^HOSTNAME/cHOSTNAME=$hostname" /etc/sysconfig/network" ssh root@$ip "sed -r -i "/^BOOTPROTO/cBOOTPROTO=none" /etc/sysconfig/network-scripts/ifcfg-eth0" ssh root@$ip "sed -r -i "/IPADDR/cIPADDR=$newip" /etc/sysconfig/network-scripts/ifcfg-eth0" ssh root@$ip "sed -r -i "3aPREFIX=24" /etc/sysconfig/network-scripts/ifcfg-eth0" ssh root@$ip "sed -r -i "3aGATEWAY=$gw" /etc/sysconfig/network-scripts/ifcfg-eth0"
ssh root@$ip "wget ftp://172.16.8.100/rhel6.repo -O /etc/yum.repos.d/rhel6.repo" ssh root@$ip "yum install -y lftp tree httpd" ssh root@$ip "chkconfig httpd on" ssh root@$ip "echo "ServerName $hostname" > /etc/httpd/conf.d/sv.conf" ssh root@$ip "service httpd restart" ssh root@$ip "echo $hostname > /var/www/html/index.html" }& done |