负载均衡:两台(一主一备) LVS Keepalived 三台HTTP服务器
这是我的第一台HTTP服务器【这里使用的是现成lnmp,然后复制出三台一模一样的】
在每台(HTTP服务器)真实服务器网上上添加LO:0接口,并设置虚拟IP在此接口上
- cd /etc/init.d/
- vim realserver
SNS_VIP=192.168.159.128 #定义VIP变量192.168.159.128
./etc/rc.d/init.d/functions #导脚本库
case "$1" in #case语句 $1传递给该shell脚本的第一个参数
start)
ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP #设置Lo:0 VIP netmask 及广播
/sbin/route add -host $SNS_VIP dev lo:0 #route del 增加本地路由
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 # -p <file(default /etc/sysctl.conf) 将标准信息输入设备空文件
echo "RealServer Start OK"
;;
stop)
ifconfig lo:0 down
route del $SNS_VIP >/dev/null 2>&1 #route del 删除本地路由
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}" #$0 是脚本本身的名字
exit 1 #表示进程正常退出
esac #case结束
exit 0 #表示进程非正常退出
记住:./etc/rc.d/init.d/functions这句脚本是没有任何的空格的,网上有出现空格的,百分百是复制出错
这样还会出现另外一个错误
chkconfig realserver on用下边这句设置脚本会报错
这时候需要在脚本最前边写上让其变成执行脚本:
#chkconfig: 2345 10 90
#description :realserver ....
也就是:
至于什么意思,自己搜,我这里就不做啰嗦
代码语言:javascript复制chmod 750 realserver #给此脚本赋予权限
chkconfig realserver on #设置开机自启动此脚本
service realserver start #开启此脚本
RealServer Start OK #表示启动成功!
#ifconfig #查看一下是否真的成功添加了lo:0接口
如图所示:
开始搭建负载均衡
LVS中提供了八种不同的调度算法
详情请参考:http://blog.csdn.net/u014649204/article/details/25115039
1:轮叫调度(Round-Robin Scheduling)
2: 加权轮叫调度(Weighted Round-Robin Scheduling)
3:最小连接调度(Least-Connection Scheduling)
4:加权最小连接调度(Weighted Least-Connection Scheduling)
5:基于局部性的最少链接(Locality-Based Least Connections Scheduling)
6:带复制的基于局部性最少链接(Locality-Based Least Connections with Replication Scheduling)
7:目标地址散列调度(Destination Hashing Scheduling)
8:源地址散列调度(Source Hashing Scheduling)
9:最短预期延时调度(Shortest Expected Delay Scheduling)
10:不排队调度(Never Queue Scheduling)
对应: rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq
LVS负载均衡主机:
先看一下CentOs内核,如果内核是2.6版本以后,那么LVS虚拟机已经存在于内核中。
说一下什么是Keepalived?
keepalived的作用是检测web服务器的状态,如果有一台web服务器死机或者工作出现故障,keepalived将会检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常之后,keepalived自动将web服务器加入到集群中,这些工作都会自动完成
我们用yum install keepalived
yum -y install keepalived
安装完成之后,使用rpm -ql 命令,查看一下Keepalived的安装信息
rpm -ql keepalived
根据提示信息里Keepalived的配置文件路径,覆盖配置文件,写入以下命令。详细说明在最后说明。
配置文件位置:
代码语言:javascript复制global_defs {
# notification_email {
# myemail@aliyun.com
# }
# notification_email_from myemail@aliyun.com
# smtp_server smtp.exmail.qq.com
# smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER #主
interface ens33 #在负载均衡主机上查看一下ip,我这里是ens33。这里要注意。
virtual_router_id 51
priority 100 #优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.159.128
}
}
virtual_server 192.168.159.128 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 192.168.159.132 80 { #第一台HTTP
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.159.130 80 { #第二台HTTP
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.159.131 80 { #第三台HTTP
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
然后启动Keepalived服务,有时候虽然提示启动成功,但是未必,因为Keepalive并没有对配置文件的校验功能,最好查看一下日志。
代码语言:javascript复制service keepalived start //启动服务
tail -f /var/log/message //查看日志
日志这里我就不说了,因为其他教程都是这样的,我这里使用的是ipvadm,使用说明我放在这
代码语言:javascript复制# ipvsadm [选项]
//可以使用man命令获取更多ipvsadm用法
# man ipvsadm
IPVSADM常用参数说明:
-A:在内核的虚拟服务器表中添加一条新的虚拟服务器记录
-E:编辑内核虚拟服务器表中的一条虚拟服务器记录
-D:删除内核虚拟服务器表中的一条虚拟服务器记录
-C:清除内核虚拟服务器表中的所有记录
-R:恢复虚拟服务器规则
-S:保存虚拟服务器规则,输出为-R选项可读的格式
-a:在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录
-e:编辑一条虚拟服务器记录中的某条真实服务器记录
-d:删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l:显示内核虚拟服务器表
-Z:虚拟服务表计数器清零(清空当前的连接数量等)
-set:- tcp tcpfin udp 设置连接超时值
--start-daemon:启动同步守护进程
--stop-daemon:停止同步守护进程
-h:显示帮助信息
-t:说明虚拟服务器提供的是TCP服务
-u:说明虚拟服务器提供的是UDP服务
-f:说明经过iptables标记过的服务类型
-s:使用的调度算法,常用选项 rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq
-p:持久服务
-r:真实的服务器
-g:指定LVS的工作模式为直接路由模式
-i:指定LVS的工作模式为隧道模式
-m:指定LVS的工作模式为NAT模式
-w:真实服务器的权值
-c:显示LVS目前的连接数
-timeout:显示 tcp tcpfin udp 的 timeout 值
--daemon:显示同步守护进程状态
--stats:显示统计信息
--rate:显示速率信息
--sort:对虚拟服务器和真实服务器排序输出
-n:输出IP地址和端口的数字形式
简易使用方式,如图
这里能够观测到三台http的访问状况
启动成功之后,浏览器访问192.168.159.128观察变化,这里分别是192.168.159.130/131/132
然后我们试着关掉一台HTTP服务器,观察访问发现,其他两台仍然可以正常访问,然后再启动一下刚才关闭的服务器,又恢复了之前。
这里很多朋友肯定会出现一个ping得通却无法访问的问题,我们需要注意防火墙的问题,所以我们需要在各自的HTTP机器将主机:192.168.159.128的80端口开通【如果粗暴点就关闭防火墙吧】
#iptables -A PREROUTING -t nat -p tcp -d 192.168.159.128 --dport 80 -j REDIRECT
接下来做负载均衡备用机
代码语言:javascript复制global_defs {
# notification_email {
# myemail@aliyun.com
# }
# notification_email_from myemail@aliyun.com
# smtp_server smtp.exmail.qq.com
# smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP #备
interface ens33 #在负载均衡主机上查看一下ip,我这里是ens33。这里要注意。
virtual_router_id 51
priority 100 #优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.159.129
}
}
virtual_server 192.168.159.129 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP
real_server 192.168.159.132 80 { #第一台HTTP
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.159.130 80 { #第二台HTTP
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.159.131 80 { #第三台HTTP
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
配置完成之后,然后试着关掉主机,继续访问192.168.159.128,一切正常,主机开机之后,主机继续当主机,备机继续待命
最后还出现一个问题,就是当所有的HTTP机器都service realserver start后会出现无法访问的情况,但所有的都使用了service realserver stop后却可以完美访问,自然切换,有类似问题的网友如果知道解决问题,烦请告知我,我继续完善该博文
OK!完美!结束!
创作不易,如果能够解决您的问题,请给我点个赞,谢谢