下面一张图 其实就是企业的集群架构图 结合前面的技术加上今天的lvs+keepalived负载均衡nginxde技术就可以搭建出来 前面的实验累积一起就是这张图 只不过她的web服务器比我们实验的机器要多 其实理论是一样的 那么结合以前的实验 今天咱们可以做一个完整的网络图
集群图大概上这样的 ,但是条件有限我这里就开3台机器 其实还要加一台lvs从,防止主挂机可以切到从上面,vs从就不做了,后面会给大家一些配置文件,其实从和主一样,就是keepalived的优先级不一样,下面有lvs从的配置文件 安装和主一样.
实验环境:(环境大家可以参照其它笔记搭建)
192.168.1.120 lvs+keepalived负载nginx服务器(主)
192.168.1.116 nginx负载均衡服务器
192.168.1.118 nginx负载均衡服务器
192.168.1.117 lap+tomcat1+tomcat2 WEB服务器(一般每台web服务器只配一个网站 tomcat可以配置多个)
192.168.1.18 mysql主也是keepalived主
(这里我们用5台就可以演示出来 当然你的机器好的话 也可以把咱们前面两台数据库和两台web服务器都可以开起来 也可以在配置一台lvs从,这样效果更明显)
今天的内容是lvs+keepalived 来负载前端nginx服务器 做到这里那么我们上一张的nginx+keepalived 就可以不用了 如果说你们公司就两台nginx服务器 那么nginx+keepalived就可以的,但是 一旦nginx服务器多的话 keepalived没有使用的价值了,今天的lvs+keepalived就是来解决前端多台nginx负载均衡的问题。。。。。。。。。。。。
LVS 简单工作原理:用户请求LVS VIP,LVS根据转发方式和算法,将请求转发给后端服务器,后端服务器接受到请求,返回给用户。对于用户来说,看不到WEB后端具体的应用。
LVS转发方式有三种,分别是NAT、DR、TUN模式,常用算法:RR、LC、WRR、WLC模式等(RR为轮询模式,LC为最少连接模式)
假如下面就是1.116和1.118的nginx负载均衡的网站 两个网站是一样的要怎么不用访问这两台nginx的ip lvs可以解决负载nginx( 前端两台nginx 后端两台web服务器+两台数据库)这里条件有限就在两台nginx上配置两个一样的网站。
步骤1.
- LVS环境安装配置192.168.1.120
下载LVS所需软件ipvsadm-1.2.4.tar.gz软件,编译安装:
wget -c
http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
ln -s /usr/src/kernels/2.6.* /usr/src/linux //IPVS模块编译进内核里,需要做软连接
(这里写的是自己机器的内内核 这里记住如果内核Tab不出来, 那么我们就安装内核扩展包 yum –y install kernel kernel-devel)
yum -y install gcc* openssl openssl-devel
tar xzvf ipvsadm-1.24.tar.gz &&cd ipvsadm-1.24 && make && make install
(下面的黄色标记的公司一般不会用这种方式来做 下面的keepalived的配置可以来完成)
LVS安装完毕之后,需要进行配置,配置的步骤有两步,第一步为定义端口服务,第二步为添加realserver后端服务。
ipvsadm -A -t 192.168.1.199:80 -s rr
ipvsadm -a -t 192.168.1.199:80 -r 192.168.1.116 -g -w 2
ipvsadm -a -t 192.168.1.199:80 -r 192.168.1.118 -g -w 2
可以用脚本自动部署:server_lvs.sh
#!/bin/bash
SNS_VIP=192.168.1.199
SNS_RIP1=192.168.1.116
SNS_RIP2=192.168.1.118
echo 1 > /proc/sys/net/ipv4/ip_forward
. /etc/rc.d/init.d/functions
function IPVSADM(){
/sbin/ipvsadm --set 30 5 60
/sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $SNS_VIP dev eth0:0
/sbin/ipvsadm -A -t $SNS_VIP:80 -s wlc -p 120
/sbin/ipvsadm -a -t $SNS_VIP:80 -r $SNS_RIP1:80 -g -w 1
/sbin/ipvsadm -a -t $SNS_VIP:80 -r $SNS_RIP2:80 -g -w 1
/etc/init.d/ipvsadm save
}
case "$1" in
start)
IPVSADM
echo "-----------------------------------------------------"
/sbin/ipvsadm -Ln
touch /var/lock/subsys/ipvsadm > /dev/null 2>&1
;;
stop)
/sbin/ipvsadm -C
/sbin/ipvsadm -Z
ifconfig eth0:0 down >>/dev/null 2>&1
route del $SNS_VIP >>/dev/null 2>&1
rm -rf /var/lock/subsys/ipvsadm > /dev/null 2>&1
echo "ipvsadm stopped!"
;;
status)
if [ ! -e /var/lock/subsys/ipvsadm ]
then
echo "ipvsadm stopped!"
exit 1
else
echo "ipvsadm started!"
fi
;;
*)
echo "Usage: $0 {start | stop | status}"
exit 1
esac
exit 0
参数说明:
-A 增加一台虚拟服务器地址。
-t 虚拟服务器提供的是tcp服务。
-s 使用的调度算法。
-a 在虚拟服务器中增加一台后端真实服务器。
-r 指定真实服务器地址。
-m 设置当前转发方式为NAT模式;-g为直接路由模式;-i 模式为隧道模式。
-w 后端真实服务器的权重。
ipvsadm -D -t 192.168.1.199:80
ipvsadm -d -t 10.143.130.106:80 -r 10.143.130.107:80
查看LVS转发列表命令为:ipvsadm –Ln
我们会发现,如果这台LVS发生突发情况,down机了,那后端所有的应用程序都访问不了。如何避免这种问题呢,这里需要用到故障切换,也就是如果有一台备用的LVS就好了,主down了,自动切换到从,怎么实现这个需求,接下来讲解的keepalived软件就是专门用来做故障检测及切换的。
需要注意一点,如果使用了keepalived.conf配置,就不需要再执行ipvs –A命令去添加均衡的realserver命令了,所有的配置都会在keepalived.conf里面,一个配置文件搞定所有,即只需要安装ipvs模块。
步骤2.
- Keepalived安装配置
官方下载keepalived相应稳定版本:
cd /usr/src ;wget -c http://www.keepalived.org/software/keepalived-1.1.15.tar.gz
tar -xzvf keepalived-1.1.15.tar.gz &&cd keepalived-1.1.15 && ./configure && make && make install
(这里的keepalived安装不需要编译内核了 和前面mysql+keepalived安装方法不一样了 因为我们安装lvs的时候已经定义了)
(这里编译出错 就安装yum install popt-devel)
安装完毕,配置keepalived服务为系统服务。
DIR=/usr/local/
cp $DIR/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ && cp $DIR/etc/sysconfig/keepalived /etc/sysconfig/ && mkdir -p /etc/keepalived && cp $DIR/sbin/keepalived /usr/sbin/
在MASTER上/etc/keepalived/目录创建keepalived.conf配置文件,并写入如下内容:
! Configuration File for keepalived
global_defs {
notification_email {
wgkgood@163.com
}
notification_email_from wgkgood@163.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
# VIP1
vrrp_instance VI_1 {
state BACKUP
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 51
priority 100
advert_int 5
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.199
}
}
virtual_server 192.168.1.199 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
# persistence_timeout 60
protocol TCP
real_server 192.168.1.116 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.1.118 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
以上就是keepalived的配置文件 记住上面的vip的ip要保证没有被使用 这里是两台nginx服务器 如果还有多个nginx服务器就在配置文件里面添加real_server 对应的配置段
下面可以看到我们的lvs+keepalived配置成功
Lvs从上安装lvs和主安装是一样的 keepalived上配置如下就行了 我这里就不演示了:
如上配置文件,红色标记的地方需要注意,state状态主服务器设置MASTER,从设置为BACKUP,优先级备机设置比MASTER小,例如设置90,使用TCP端口检测。
在LVS BACKUP服务器写入如下配置,需要注意的是客户端的配置要修改优先级及状态:
! Configuration Filefor keepalived
global_defs {
notification_email {
wgkgood@163.com
}
notification_email_from wgkgood@163.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
# VIP1
vrrp_instance VI_1 {
state BACKUP
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 51
priority 90
advert_int 5
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.199
}
}
virtual_server 192.168.1.199 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
# persistence_timeout 60
protocol TCP
real_server 192.168.1.116 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.1.118 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
如上设置,LVS 主备配置完毕,接下来需要在realserver配置LVS VIP,为什么要在realserver绑定VIP呢?
客户端访问director的VIP,director接收请求,将通过相应的算法将请求转发给相应的realserver。在转发的过程中,会修改请求包的目的mac地址,目的ip地址不变。
Realserver接收请求,并直接响应客户端。这时便出现一个问题,director此时与realserver位于同一个网络中,当director直接将请求转发给realserver时,realserver检测到该请求包的目的ip是vip而并非自己,便会丢弃,而不会响应。为了解决这个问题,所以需要在所有Realserver上都配上VIP。
为什么一定要配置在lo接口上呢?
在realserver上的lo口配置VIP,这样限制了VIP不会在物理交换机上产生MAC地址表,从而避免IP冲突。
客户端nginx服务器上启动Realserver.sh脚本内容:
#!/bin/sh
#LVS Client Server
VIP=192.168.1.199 (这里的vip 要和lvs上的keepalived配置文件里面的vip是一样的)
case $1 in
start)
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
/sbin/route add -host $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"
exit 0
;;
stop)
ifconfig lo:0 down
route del $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 OK"
exit 1
;;
*)
echo "Usage: $0 {start|stop}"
;;
esac
在客户端nginx服务器都要执行上面的脚本 执行方式如下 两台nginx都是一样在lo上绑定虚拟ip 两台都要指定 有多少nginx服务器就指定多少
这是我们来做个验证 就是把其中一台nginx服务关掉看看有什么效果:
这里我们会发现那台nginx服务关掉了 lvs就会从路由表里面把它踢出去 当然nginx再起来的时候lvs就会自动把它加入路由表里面
接下来就是验证的时候了 在验证前我们要先把一些服务器添加到开机自动启动,
chkconfig --add keepalived
chkconfig keepalived on
- 在lvs上 我们要保证开机自动启动keepalived执行命令: echo "/etc/init.d/keepalived restart">>/etc/rc.local
- 在客户端nginx服务器上保证vip开机自动添加 执行命令:echo "sh /root/realserver.sh start" >> /etc/rc.local
- 客户端nginx服务器保证开机启动nginx服务执行命令:echo "/usr/local/nginx/sbin/nginx">>/etc/rc.local
接下来我们域名解析在Windows上hosts文件里 ,访问网站看到如下效果,说明我们成功了。
来源:https://www.cnblogs.com/zhangan/p/10930459.html