一、结合图形描述LVS的工作原理;
lvs-nat模型
主要是修改目标IP地址为挑选出新的RS的IP地址。即请求进入负载均衡器时做DNAT,响应出负载均衡器时做SNAT。
1.当用户请求到达Director Server,此时请求的数据报文会先到达内核的PREROUTING链,此时报文的源IP是CIP,目标IP是VIP。
2.PREROUTING链检查发现数据包的目标IP是本机,将数据包送至INPUT链。
3.IPVS内核模块比对数据包请求的服务是否为集群服务,如果是,则修改数据包的目标IP为后端服务器的IP,然后将数据包发至POSTROUTING链,做DNAT转换。此时报文的源IP是CIP,目标IP是RIP
4.POSTROUTING链通过选路,将数据包发送到Real Server。
5.Real Server比对发现目标IP是自己的IP,开始建立响应报文发回给Director Server,此时报文的源IP是RIP,目标IP是CIP.
6.Director Server在响应客户端之前,此时会将源IP地址修改为自己的IP地址,然后响应给客户端,做SNAT转换。此时报文的源IP是VIP。目标IP是CIP。
lvs-dr模型
将请求报文的目标MAC地址设定为天选出来的RS的MAC地址。即做MAC地址转换。
1.当用户请求到达Director Server,此时请求的数据报文huixiandao内核空间的PREROUTING链,此时报文的IP是CIP,目标IP是VIP。
2.PREROUTING链检查发现数据包的目标IP是本机,将数据包送至INPUT链,
3.IPVS内核模块比对数据包请求的服务是否为集群服务,如果是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改为RIP的MAC地址,然后将数据包发至POETROUTING链中,此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址。
4.由于DS和RS实在同一网络中,所以两者之间的通信时通过二层协议来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
5.RS发现请求报文的MAC地址是自己的MAC地址,就接受此报文,处理完成以后,将响应报文通过IO接口传送给eth0网卡,然后向外发出,不经过负载均衡器。此时源IP地址为VIP,目标IP是CIP。
6.响应报文最终送至客户端。
lvs-tun模型
在原有的IP报文外再次封装多一层IP首部,内部IP首部(源地址为CIP,目标地址为VIP)外部IP地址首部(源地址为DIP,目标地址为RIP)
1.当用户请求报文到达DS,此时请求的数据报文会先到内核的PREROUTING链。此时源IP是CIP,目标IP是VIP。
2.PREROUTING链检查发现数据包的目标IP是本机,将数据包送至INPUT链。
3.IPVS比对数据包请求的服务是否为集群服务,如果是,在请求报文的首部再次封装一层IP报文,封装源IP为DIP,目标IP是RIP,然后发至POSTROUTING链。此时源IP是为DIP,目标IP是RIP。
4.POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为外层封装多了一层IP首部,所以可以理解为此时通过隧道传输)。此时源IP是DIP,目标IP是RIP。
5.RS收到报文后发现是自己的IP地址,就会将报文接受下来,拆除最外层的IP后,会发现里面还有一层IP首部,而且目标地址是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成滞后,通过lo接口送给eth0网卡,然后向外传递。此时的源IP地址为VIP,目标IP为CIP。
6.响应报文送达至客户端。
二、搭建一套LVS-DR模型的高性能集群,并实现以下功能:
1、wordpress程序通过nfs共享给各个realserver;
2、后端realserver中的nginx和php分离
| 用途 | IP | 
| LVS-Master | 10.18.11.31 | 
| LVS-BACKUP | 10.18.11.32 | 
| LVS-VIP | 10.18.11.40 | 
| wordpress1 | 10.18.11.29 | 
| wordpress2 | 10.18.11.30 | 
配置NFS共享wordpress程序
#在10.18.11.29上配置共享目录 [root@localhost ~]# vim /etc/exports #在10.18.11.29上配置共享目录 /usr/local/nginx/html/ 10.18.11.29(rw,sync,fsid=0,no_root_squash) [root@localhost /]# systemctl start rpcbind.service #启动rpcbind服务 [root@localhost /]# systemctl start nfs-server.service #启动nfs服务 #在10.18.11.30上挂载共享目录 [root@localhost nginx]# mount -t nfs 10.18.11.29:/usr/local/nginx/html /usr/local/nginx/htmlmount -t nfs 10.18.11.29:/usr/local/nginx/html /usr/local/nginx/html [root@localhost nginx]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda2 75G 4.6G 66G 7% / devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 1.9G 25M 1.9G 2% /run tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/sda1 477M 94M 354M 21% /boot /dev/mapper/vgdata-mylv 6.8G 23M 6.4G 1% /users tmpfs 380M 0 380M 0% /run/user/0 10.18.11.29:/usr/local/nginx/html 75G 8.7G 62G 13% /usr/local/nginx/html [root@localhost nginx]# ll /usr/local/nginx/html/ #wordpress工程文件已共享 总用量 28 -rw-r--r-- 1 root root 537 11月 16 17:22 50x.html -rw-r--r-- 1 root root 145 11月 26 23:14 inc.php -rw-r--r-- 1 root root 612 11月 16 17:22 index.html -rw-r--r-- 1 root root 20 11月 25 15:23 index.php -rw-r--r-- 1 root root 6 11月 21 17:39 test.html -rw-r--r-- 1 root root 145 11月 26 23:15 test.php drwxrwxrwx 5 root root 4096 11月 27 16:37 wordpress
安装workpress
[root@localhost opt]# wget [root@localhost opt]# tar xzvf wordpress-4.5.3-zh_CN.tar.gz [root@localhost opt]# cp -r wordpress /usr/local/nginx/html/
在游览器中访问http://10.18.11.29/wordpress/wp-admin/install.php进行数据库配置
配置LVS
[root@localhost ~]# yum install keepalived        #在两台LVS服务器上安装keepalived
[root@localhost ~]# vim /etc/keepalived/keepalived.conf        #修改LVS-Master配置文件
! Configuration File for keepalived
 
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_1
}
 
vrrp_instance VI_DNS1 {
    state MASTER
    interface ens192        #vip绑定的网卡
    virtual_router_id 51        #虚拟路由标记ID,同一组vrrp一致
    priority 100        ##优先级自定义,MASTER高于BACKUP即可
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {    
        10.18.11.40        #VIP
        }
}
 
virtual_server 10.18.11.40 80 {        #VIP和端口
    delay_loop 6
    lb_algo rr        #负载调度算法,RR为轮询
    lb_kind DR        #LVS负载工作模式为DR
    nat_mask 255.255.255.0
    persistence_timeout 50         #会话保持时间,50秒内分配同一节点       
    protocol TCP        #协议类型UDP
 
    real_server 10.18.11.29 80 {
        weight 100        #权值大小,越大权值越高
        TCP_CHECK {         #realserver 状态检测
        connect_timeout 8        #连接超时时间8秒
        nb_get_retry 3        #重试次数:3次
        delay_before_retry 3        ##重试间隔3秒
        connect_port 80        #检测端口
        }
    }
 
    real_server 10.18.11.30 80 {
        weight 100
        TCP_CHECK {
        connect_timeout 8
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
}
                                                                                                                                                     57,1          30%
[root@localhost ~]# vim /etc/keepalived/keepalived.conf         #修改LVS-BACKUP配置
! Configuration File for keepalived
 
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_2
}
 
vrrp_instance VI_DNS1 {
    state backup        #状态为backup
    interface ens192
    virtual_router_id 51
    priority 90        #优先级比master低
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.18.11.40
        }
}
 
virtual_server 10.18.11.40 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP
 
    real_server 10.18.11.29 80 {
                                                                                                                                                     1,1          顶端
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.18.11.40
        }
}
 
virtual_server 10.18.11.40 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
#    persistence_timeout 1
    protocol TCP
 
    real_server 10.18.11.29 80 {
        weight 100
        TCP_CHECK {
        connect_timeout 8
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
 
    real_server 10.18.11.30 80 {
        weight 100
        TCP_CHECK {
        connect_timeout 8
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
}
#在realserver服务器上执行该脚本
#!/bin/bash
SNS_VIP=10.18.11.40        
. /etc/rc.d/init.d/functions
case "$1" in
start)
       ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
       /sbin/route add -host $SNS_VIP dev lo:0
       echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
       sysctl -p >/dev/null 2>&1
       echo "RealServer Start OK"
       ;;
stop)
       ifconfig lo:0 down
       route del $SNS_VIP >/dev/null 2>&1
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
       echo "RealServer Stoped"
       ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac
exit 0三、基于heartbeat v2 crm实现HA LAMP组合;要求,部署wordpress,用于编辑的文章中的任何数据在节点切换后都能正常访问;
四、用Keepalived实现nginx与lvs的高可用集群;
原文:http://hiqiwang.blog.51cto.com/4214574/1923315