高可用负载均衡集群html
ipvsios
负载均衡经常使用的有四种模式算法
DRvim
NAT浏览器
TUN缓存
FULLNET服务器
实验环境:准备四台rhel6.5的虚拟机四台。一台做为调度器server1,两台做为real server(server3,4),heartbeat服务关闭网络
172.25.50.10 server1.example.com负载均衡
172.25.50.20 server2.example.comcurl
172.25.50.30 server3.example.com
172.25.50.250 real50.example.com
172.25.50.40 server4.example.com
DR模式:
#ipvsadm -l 命令能够看到当前主机的调度策略
#ipvsamd -L
#iIpvsadm -C 清除当前策略
在server3和server4上都安装而且开启httpd服务,而后都在默认发布目录上写一个不一样的测试页面:server3.example.com server4.example,com
调度器server1上,添加一个172.25.50.100的ip
# ip addr add 172.25.50.100/24 dev eth0
而且用真机ping 一下这个ip让真机缓存绑定一个MAC地址
在server1上添加策略:
ipvsadm -A -t 172.25.50.100:80 -s rr##rr表示轮询
ipvsadm -a -t 172.25.50.100:80 -r 172.25.50.30:80 -g
ipvsadm -a -t 172.25.50.100:80 -r 172.25.50.40:80 -g
.ipvsadm参数说明:
-C:清除表中全部的记录
-A:在服务器列表中新添加一套新的虚拟服务器记录
-a:在服务器列表中添加一体新的真实主机记录
-t:表示tcp服务
-u:表示udp服务
-r::真实服务器地址
-s:使用调度算法(rr | wrr | )
[root@server1 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.50.100:http rr
-> server3.example.com:http Route 1 0 0
-> server4.example.com:http Route 1 0 0
在serevr3和server4上都添加ip:
# ip addr add 172.25.50.100/32 dev eth0
测试:在浏览器上访问172.25.50.100,重复刷新,能够看到测试页面的变更
[root@real50 kiosk]# curl 172.25.50.100
<h1>serer3.example.com</h1>
[root@real50 kiosk]# curl 172.25.50.100
<h2>server4.example.com</h2>
这样作是有缺陷的。这样是不具有对服务的健康检查
当real server的服务宕机,在调度器上不能看到服务是否正常运行,在浏览器上能够看到网页时好时坏。
Arp
在server3和server4上安装arptables_jf.x86_64 0:0.0.8-23.el6
在server3和server4 上都执行如下策略
arptables -A IN -d 172.25.50.100 -j DROP
arptables -A OUT -s 172.25.50.100 -j mangle --mangle-ip-s 172.25.50.30
/etc/init.d/arptables_jf save
而后关闭server3的httpd服务
而后在调度器上server1上可以发现real serevr 上的服务故障
[root@server1 ha.d]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.50.100:http rr
-> server4.example.com:http Route 1 0 0
在浏览器上只能看到serevr4的测试页面
[root@real50 kiosk]# curl 172.25.50.100
<h2>server4.example.com</h2>
[root@real50 kiosk]# curl 172.25.50.100
<h2>server4.example.com</h2>
######将heartbeat加入负载均衡集群中:#####
[root@server1 ~]# ipvsadm -C ##清除以前的策略
[root@server1 ~]# ipvsadm -L
[root@server1 ha.d]# rpm -qd ldirectord##查询这个软件的文档
/usr/share/doc/ldirectord-3.9.5/COPYING
/usr/share/doc/ldirectord-3.9.5/ldirectord.cf
/usr/share/man/man8/ldirectord.8.gz
[root@server1 ha.d]# cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf .
[root@server1 ha.d]# vim ldirectord.cf ##这个文件写着调度策略
25 virtual=172.25.50.100:80##虚拟ip
26 real=172.25.50.30:80 gate##真实主机的ip地址
27 real=172.25.50.40:80 gate
28 fallback=127.0.0.1:80 gate
29 service=http
30 scheduler=rr##策略:轮询
31 #persistent=600
32 #netmask=255.255.255.255
33 protocol=tcp
34 checktype=negotiate
35 checkport=80
36 request="index.html"
37 # receive="Test Page"##检测真实主机上的测试测试页面是否一致
38 # virtualhost=www.x.y.z
[root@server1 ha.d]# /etc/init.d/ldirectord start##启动ld
在server3上将httpd服务停了
在真机上:
[root@real50 Desktop]# curl 172.25.50.100
<h2>server4.example.com</h2>
调度器serverv1上:
[root@server1 ha.d]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.50.100:http rr
-> server4.example.com:http Route 1 0 0
这时将server3上的httpd服务打开
这时负载均衡开始工做:
[root@real50 Desktop]# curl 172.25.50.100
<h2>server4.example.com</h2>
[root@real50 Desktop]# curl 172.25.50.100
<h1>serer3.example.com</h1>
[root@server1 ha.d]# /etc/init.d/ldirectord stop
[root@server1 html]# ip addr del 172.25.50.100/24 dev eth0
[root@server1 html]# /etc/init.d/httpd stop
[root@server1 html]# cd /etc/ha.d/
[root@server1 ha.d]# vim haresources
在最后一行添加:
server1.example.com IPaddr::172.25.50.100/24/eth0 ldirectord httpd
||||
添加虚拟ip启动脚本
[root@server1 ha.d]# scp haresources 172.25.50.20:/etc/ha.d/#发送到server2上
[root@server1 ha.d]# scp ldirectord.cf 172.25.50.20:/etc/ha.d/
root@172.25.50.20's password:
haresources 100% 5972 5.8KB/s 00:00
/etc/init.d/heartbeat restart##在serevr1和server2上都从新启动heartbeat
[root@server1 ha.d]# tail -f /var/log/messages #用过日志查看服务启动状况
[root@server1 ha.d]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.50.100:http rr
-> server3.example.com:http Route 1 0 0
-> server4.example.com:http Route 1 0 0
在真机上测试:
[root@real50 Desktop]# for i in {1..8}; do curl 172.25.50.100; done
<h2>server4.example.com</h2>
<h1>serer3.example.com</h1>
<h2>server4.example.com</h2>
<h1>serer3.example.com</h1>
<h2>server4.example.com</h2>
<h1>serer3.example.com</h1>
<h2>server4.example.com</h2>
<h1>serer3.example.com</h1>
当realserver上任何一个的http服务挂了。另一个realserver会一直接管httpd服务
当调度器中的server1挂了,server2会接管调度工做,保证系统正常运行
Keepalived+lvs
先关闭sererv1和server2的heartbeart服务
/etc/init.d/heartbeat stop
在server和server上都进行以下操做
tar zxf keepalived-1.2.24.tar.gz #第三方模块,在官网上去找
cd keepalived-1.2.24
yum install openssl-devel -y#编译文件
yum install libnl-devel -y
yum install libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm -y
rpm -ivh libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm
warning: libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY
Preparing... ########################################### [100%]
package libnfnetlink-devel-1.0.0-1.el6.x86_64 is already installe
cd keepalived-1.2.24
./configure --prefix=/usr/local/keepalived##编译,并指定安装路径,
make && make install
ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/#指定启动脚本软链接
ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/keepalived/etc/keepalived /etc/
ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin
软链接设置后能够在后面的目录中生成一个新的文件,若是设置错了,把生成的新文件删除,再进行软链接设置便可。
编辑集群信息配置文件
[root@server1 etc]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost#接收警报的 email 地址,能够添加多个
}
notification_email_from Alexandre.Cassen@firewall.loc #设置邮件的发送地址
smtp_server 192.168.200.1#设置 smtp server 地址
smtp_connect_timeout 30#设置链接 smtp 服务器超时时间
router_id LVS_DEVEL#load balancer 的标识 ID,用于 email 警报
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER设置为主机###备机改成 BACKUP,此状态是由 priority 的值来决定的,当前priority 的值小于备机的值,那么将会失去 MASTER 状态
interface eth0#HA 监测网络接口
virtual_router_id 51##主、备机的 virtual_router_id 必须相同,取值 0-255
priority 100##优先级,备份机改成50,数字大的优先级高,主>备
advert_int 1#主备之间通告间隔秒数
authentication {
auth_type PASS##设置认证类型,pass 或者 AH
auth_pass 1111##设置验证密码
}
virtual_ipaddress {#设置虚拟 IP 地址,能够设置多个虚拟 IP 地址,每行一个
172.25.50.100
}
}
virtual_server 172.25.50.100 80 {#定义虚拟服务器
delay_loop 6#每隔 6 秒查询 realserver 状态
lb_algo rr#每隔 6 秒查询 realserver 状态
lb_kind DR#LVS 是用 DR 模式
# persistence_timeout 50
protocol TCP#指定转发协议类型,有 tcp 和 udp 两种
real_server 172.25.50.30 80 {#配置服务节点
weight 1配置服务节点的权值,权值大小用数字表示,数字越大,权
值越高,设置权值的大小能够为不一样性能的服务器分配不一样的负载,能够对性能高的服务器设
置较高的权值,而对性能较低的服务器设置相对较低的权值,这样就合理的利用和分配了系统
资源
TCP_CHECK {#realserve 的状态检测设置部分,单位是秒
connect_timeout 3#3 秒无响应超时
nb_get_retry 3#重复次数
delay_before_retry 3#重试间隔
}
}
real_server 172.25.50.40 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
注意:红色字体只有 备机 keepalived配置只改动红色部分
将配置文件复制到备机server2上,并进行修改
将server3和server4上的httpd服务开启,并设置vip:
ip addr add 172.25.50.100/32 dev eth0l两台realserver都添加
将server1和server2上的keepalived服务开启。
测试:
1. 高可用测试:中止 master 上的 keepalived 服务,看 backup 是否接管。
2. 负载均衡测试:访问 http://192.168.0.163,看到页面在两个 realserver 上切换表示成功!
你也能够经过 ipvsadm -Lnc 查看详细链接状况!
3. 故障切换测试:任意关闭 realserver 上的 httpd 服务,Keepalived 监控模块是否能及时发现,
而后屏蔽故障节点,同时将服务转移到正常节点来执行