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

 

注:ServerReal  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

curlelinksfirefox

Director

eth0:VIP:192.168.122.100


eth1:DIP:10.10.10.1

Real   Server

RIP10.10.10.10    10.10.10.20    10.10.10.30

安装httpd服务

DNS   Server

www.ak.com=====>192.168.122.100

bindbind-chroot

建议:先在Real  Server安装如httpd

 

  • VS/NAT实施

1、  准备工作(集群中所有主机)[可选]

IPhostnamehostsiptablesSELinuxssh  trustntp

 

cat  /etc/hosts

  1. 0.0.1    localhost

  2. 10.10.1   director1.sky.com   director1

  3. 10.10.10   node1.sky.com   node1

  4. 10.10.20   node2.sky.com   node2

  5. 10.10.30   node3.sky.com   node3

 

2、  RS配置

说明:RS是指Real Server,即后端的真实服务器。

node1node2node3上部署

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      //为了看到效果,建议提供不同的页面

默认网关均指向DirectoryDIP

 

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是批massqueradingNAT

技巧:

     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、  测试

curl    http://192.168.122.100

elinks   -dump  http://192.168.122.100/

ab   -c1000   -n  1000    http://192.168.122.100


 

5、  小结

VS/NAT模式的原理:Director收到Client请求时,Director将数据包的目标IPVIP转换为选中的Real  ServerRIP来实现分发。

要求:RS将网关指向DirectorDIP

特点:配置简单,所有的入站、出站数据包都经过分发器。当数据量比较大时,分发器可能会出现网络瓶颈!因而支持的RS数量少。

 

重点注意:

     Director必须开启Kernel  ip_forward

所有Real Server默认网关指向DIP

     Director使用DIPReal ServerRIP通信

监测:

     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模式要求DirectorDIP和所有Real ServerRIP必须在同一个网段及广播域

3、  所有节点网关均指定真实网关

4、  用脚本部署LVS集群


 

注意:调度器和RealServer必须在同一个LANLAN可以使用公网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、准备工作(集群中所有主机)

IPhostnamehostsiptablesSELinuxssh  trustntp

 

cat  /etc/hosts

  1. 0.0.1    localhost

  2. 168.122.2   director1.sky.com   director1

  3. 168.122.10   node1.sky.com   node1

  4. 168.122.20   node2.sky.com   node2

  5. 168.122.30   node3.sky.com   node3

 

6、  RS配置

说明:RS是指Real Server,即后端的真实服务器。

node1node2node3上部署好网站服务器,测试所有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      //为了看到效果,建议提供不同的页面

默认网关均指向DirectorDIP

 

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、  测试

curl    http://192.168.122.100

elinks   -dump  http://192.168.122.100/

ab   -c1000   -n  1000    http://192.168.122.100


 

9、  小结

VS/NAT模式的原理:当一个Client发送一个请求到VIPDirector根据VIP选择对应的RealServerPool,根据算法,在Pool中选择一台RealServer,然后将Client的请求包发给选择的RealServer,最后,选择的RealServer把应答包直接传给Client

 

LVS集群部署的脚本

vi   lvs_httpd.sh

#!/bin/bash

#LVS_DR_RealServerhttpd初始化脚本,并发处理。

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