LVS(NAT)+ldirectord实现负载均衡

LVS(NAT)+ldirectord实现负载均衡



使用LVS实现基于IP的负载均衡,当RS服务器不可用时,VS服务器仍然会将请求调度到该服务器。使用ldirectord对后端RS服务器做健康检查,某RS不可用时不将请求调度到该服务器,RS恢复后继续调度。



实验介绍

如下图所示,本实验使用6台CentOS6虚拟机,使用LVS实现基于IP的负载均衡,为了使VS服务器上的资源相同,使用NFS共享存储和同一个MySQL数据库。并且要求VS服务器支持http和https两种服务。

Alt text


实验步骤


第一步 : 搭建实验环境

实验搭建的步骤可参考我另外一篇博客LAMP实验(基于DNS的负载均衡),此处重点在于演示LVS部分。

  1. 按照拓扑图所示搭建好网络环境
#关键步骤
# 1. 开启VS路由转发功能:修改/etc/sysctl.conf文件
net.ipv4.ip_forward = 1
执行 sysctl -p 使配置文件生效
# 2. 两台httpd服务器的网关指向VS服务器
  1. 192.168.17.12192.168.17.13 服务器上安装好httpd服务和PHP模块,192.168.17.13上安装好NFS服务,192.168.17.15上安装好MySQL
# 1. `192.168.17.12` 和 `192.168.17.13`上安装httpd并启动。安装nfs-utils用于挂载nfs文件系统。安装php-mysql用于连接数据库
yum -y install httpd
yum -y install php
service httpd start
yum -y install nfs-utils
# 2. `192.168.17.13`上安装好NFS服务,并上传wordpress到该目录下,做为博客模板。并配置共享路径
yum -y install nfs-utils
# 3. `192.168.17.15`上安装好MySQL,并做相应的初始化设置。创建wordpress所需的用户和数据库
yum-y install mysql


第二步 : 配置VS实现负载均衡

配置VS

  1. 安装ipvsadm
yum -y install ipvsadm
  1. 添加集群
ipvsadm -A -t 172.18.17.11:80 -s rr
  1. 添加RS
ipvsadm -a -t 172.18.17.11:80 -r 192.168.17.12:80 -m -w 1
ipvsadm -a -t 172.18.17.11:80 -r 192.168.17.13:80 -m -w 1
  1. 挂载NFS文件系统
# 两台httpd服务器上挂载nfs文件系统
mount.nfs 192.168.17.14:/app/web /var/www/html/
# 在nfs服务器/app/web下创建测试文件
[14@root web]# cat index.php
<?php
echo 'SERVER_IP: ';
echo $_SERVER['SERVER_ADDR'];
echo "\n";
?>
  1. 在客户端Client上测试
[10@root ~]# for i in {1..6};do curl 172.18.17.11;done
SERVER_IP: 192.168.17.12
SERVER_IP: 192.168.17.13
SERVER_IP: 192.168.17.12
SERVER_IP: 192.168.17.13
SERVER_IP: 192.168.17.12
SERVER_IP: 192.168.17.13


第三步 : 实现https

  1. 创建证书
# 此处使用简便方法在其中一台httpd服务器上快速创建证书,然后将证书复制到共享路径/var/www/html/ssl/下
# 1. 创建存证书的路径
[12@root html]# mkdir /var/www/html/ssl
# 2. 进入/etc/ssl/certs/目录下
[12@root html]# cd /etc/ssl/certs/
# 3. 使用 make 命令创建证书
[12@root certs]# make httpd.crt
...
Enter pass phrase: <=输入密钥加密密码
Verifying - Enter pass phrase: <=再次输入密钥加密密码
...
Enter pass phrase for httpd.key: <=输入输入密钥加密密码
...
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:yunnan
Locality Name (eg, city) [Default City]:xuanwei
Organization Name (eg, company) [Default Company Ltd]:zhubiaook.com
Organizational Unit Name (eg, section) []:it
Common Name (eg, your name or your server's hostname) []:www.zhubiaook.com
Email Address []:
#生成了密匙和证书
[12@root certs]# ls httpd.*
httpd.crt httpd.key
# 将证书和密匙复制到/var/www/html/ssl/目录下
[12@root certs]# cp httpd.* /var/www/html/ssl/
  1. 安装模块mod-ssl,并修改配置文件(证书,私钥的路径)
# 1. 两台httpd服务器上安装mod_ssl
yum -y install mod_ssl
# 2. 去除私钥的密匙
[13@root ssl]# openssl rsa -in httpd.key -out httpd.bk.key
Enter pass phrase for httpd.key:
writing RSA key
[13@root ssl]# mv httpd.bk.key httpd.key
mv: overwrite `httpd.key'? y
# 3. 修改配置文件的证书路径
[12@root certs]# vim /etc/httpd/conf.d/ssl.conf
SSLCertificateFile /var/www/html/ssl/httpd.crt
SSLCertificateKeyFile /var/www/html/ssl/httpd.key
  1. 配置VS,实现https
# 添加另外一个集群
[11@root ~]# ipvsadm -A -t 172.18.17.11:443 -s wrr
# 向集群内添加RS
[11@root ~]# ipvsadm -a -t 172.18.17.11:443 -r 192.168.17.12:443 -m -w 1
[11@root ~]# ipvsadm -a -t 172.18.17.11:443 -r 192.168.17.13:443 -m -w 2
  1. 测试
    在客户端Client上测试
[10@root ~]# for i in {1..6};do curl -k https://172.18.17.11;done
SERVER_IP: 192.168.17.13
SERVER_IP: 192.168.17.13
SERVER_IP: 192.168.17.12
SERVER_IP: 192.168.17.13
SERVER_IP: 192.168.17.13
SERVER_IP: 192.168.17.12
  1. 借助Firewall Mark合并http和https两个集群,实现统一调度
    上面的步骤中我们实现http和https的负载均衡是创建了两集群,分别调度,现在合并实现统一调度
# 查看当前ipvs规则
[11@root ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.18.17.11:80 rr
-> 192.168.17.12:80 Masq 1 0 0
-> 192.168.17.13:80 Masq 1 0 0
TCP 172.18.17.11:443 wrr
-> 192.168.17.12:443 Masq 1 0 0
-> 192.168.17.13:443 Masq 2 0 0
# 删除当前所有规则
[11@root ~]# ipvsadm -C
# 使用iptables命令给80和443端口协议打一个标签
[11@root ~]# iptables -t mangle -A PREROUTING -d 172.18.17.11 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 10
# 创建一个集群
[11@root ~]# ipvsadm -A -f 10 -s wrr
# 将RS加入集群
[11@root ~]# ipvsadm -a -f 10 -r 192.168.17.12 -m -w 1
[11@root ~]# ipvsadm -a -f 10 -r 192.168.17.13 -m -w 2
  1. 再次测试
[10@root ~]# for i in {1..6};do curl -k https://172.18.17.11;done
SERVER_IP: 192.168.17.13
SERVER_IP: 192.168.17.13
SERVER_IP: 192.168.17.12
SERVER_IP: 192.168.17.13
SERVER_IP: 192.168.17.13
SERVER_IP: 192.168.17.12
[10@root ~]# for i in {1..6};do curl http://172.18.17.11;done
SERVER_IP: 192.168.17.13
SERVER_IP: 192.168.17.13
SERVER_IP: 192.168.17.12
SERVER_IP: 192.168.17.13
SERVER_IP: 192.168.17.13
SERVER_IP: 192.168.17.12


第四步 : 实现高可用

ldirectord用来实现LVS负载均衡资源在主、备节点间的故障转移。在首次启动时,ldirectord可以自动创建IPVS表。此外,它还可以监控各RealServer的运行状态,一旦发现某RealServer运行异常时,还可以将其从IPVS表中移除

  1. 下载ldirectord
    ldirectord-3.9.6下载

  2. 使用yum命令安装ldirectord,自动解决软件包依赖问题
yum -y install ldirectord-3.9.6-0rc1.1.1.x86_64.rpm


  1. 复制参考配置文件到/etc/ha.d目录下,并修改配置文件
# 复制配置文件
cp /usr/share/doc/ldirectord-3.9.6/ldirectord.cf /etc/ha.d/
# 修改配置文件如下(不带Firewall Mark):
[11@root ~]# cat /etc/ha.d/ldirectord.cf
# Global Directives
checktimeout=3
checkinterval=1
fallback=127.0.0.1:80 <=所有RS主机宕机后使用本机提供服务
autoreload=yes
quiescent=no
# Sample for an http virtual service
virtual=172.18.17.11:80
real=192.168.17.12:80 masq
real=192.168.17.13:80 masq
service=http
scheduler=rr
protocol=tcp
checktype=negotiate
checkport=80
request="test.html"
receive="test"
# 修改配置文件如下(带Firewall Mark):
[11@root ~]# cat /etc/ha.d/ldirectord.cf
# Global Directives
checktimeout=3
checkinterval=1
fallback=127.0.0.1:80
autoreload=yes
quiescent=no
# Sample for an http virtual service
virtual=10
real=192.168.17.12 masq
real=192.168.17.13 masq
service=http
scheduler=rr
# protocol=tcp
checktype=negotiate
checkport=80
request="test.html"
receive="test"
  1. 测试
    查看当前VS服务器上的ipvs规则
[11@root ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 10 rr
-> 192.168.17.12:0 Masq 1 0 0
-> 192.168.17.13:0 Masq 1 0 0

关闭一台RS服务器,再查看规则,并测试

# 1. 停止 192.168.17.12 的http服务
[12@root certs]# service httpd stop
Stopping httpd:
# 2. 查看VS服务器当前规则,发现自动移除了 192.168.17.12 服务器
[11@root ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 10 rr
-> 192.168.17.13:0 Masq 1 0 0
# 3. Client上访问web服务,自动调度到正常的服务器上
[10@root ~]# for i in {1..6}; do curl -k https://172.18.17.11;done
SERVER_IP: 192.168.17.13
SERVER_IP: 192.168.17.13
SERVER_IP: 192.168.17.13
SERVER_IP: 192.168.17.13
SERVER_IP: 192.168.17.13
SERVER_IP: 192.168.17.13

Alt text