ubuntu系统使用ipvs+keeplived+nginx+tomcat实现负载均衡高可用服务搭建教程
lvs+nginx的拓扑结构:
- 架构说明:
- lvs01和lvs02分别安装lvs、keepalived,通过keepalived VRRP虚拟路由冗余协议,添加虚拟ip(vip)。当其中一台lvs01机器宕机,lvs02会自动接管vip,即实现服务不中断。
- 主备模式:
- lvs02这台机器的资源没有利用到。只有在lvs01宕机或者不可用的时候,才会使用。
- 主主模式:
- lvs01和lvs02分别有不同的VIP,分别对应两个出口,添加两个dns,做dns轮询。这样可以实现将lvs01和lvs02充分利用起来。
- 业务量不大的情况下,lvs+keepalived主从足够用,不必使架构变得复杂。复杂的架构出现事故的几率、不可控因素也会增加。
环境准备
服务器/虚拟机 | 作用 | 主机名 | 系统 |
---|---|---|---|
192.168.98.1 | lvs,keepalived,nginx,tomcat | 主服务器 | ubuntu |
192.168.98.2 | lvs,keepalived,nginx,tomcat | 从服务器 | ubuntu |
安装步骤
-
关闭服务器防火墙;
ufw disable
-
打开内核转发功能;
sysctl -w net.ipv4.ip_forward=1
-
配置ipvs,ipvs无需安装,安装的是管理工具,第一种叫ipvsadm,第二种叫keepalive。ipvsadm是通过命令行管理,而keepalive读取配置文件管理。
apt-get install ipvsadm
-
将ipvsadm模块加载进系统中;
ipvsadm lsmod | grep ip_vs
-
-
安装keepalived
apt-get install keepalived
-
keepalived相关配置/etc/keepalived/keepalived.conf
-
主服务器:
global_defs { router_id LVS_DEVEL } vrrp_instance VI_1 { #定义一个实例,keepalived间的高可用只能接管相同实例名称 state MASTER #指定Keepalived的角色,MASTER表示此主机是主服务器 BACKUP表示此主机是备用服务器,所以设置priority时要注意MASTER比BACKUP高。 interface ens33 #指定监测网络的接口,当LVS接管时,将会把IP地址添加到该网卡上。 virtual_router_id 51 #虚拟路由标识,同一个vrrp实例使用唯一的标识,同一个vrrp_instance下,MASTER和BACKUP必须一致。 priority 120 #指定这个实例优先级 advert_int 1 #心跳报文发送间隔 mcast_src_ip 192.168.98.7 authentication { auth_type PASS #设置验证类型,主要有PASS和AH两种 auth_pass 1111 #设置验证密码,同一个vrrp_instance下,MASTER和BACKUP的密码必须一致才能正常通信 } virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个 192.168.98.100 } } virtual_server 192.168.98.100 80 { #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开 delay_loop 6 #设置运行情况检查时间,单位是秒 lb_algo wrr #设置负载调试算法,这里设置为wrr即加权论询算法 lb_kind DR #设置LVS实现负载均衡的机制,有NAT,TUN和DR三个模式可选 persistence_timeout 50 #设置会话保持时间,单位是秒 protocol TCP #指定转发协议类型,有TCP和UDP两种 real_server 192.168.98.7 80 { #配置服务节点1,需要指定real server的真实IP地址和端口 weight 1 #配置服务节点的权值, TCP_CHECK { connect_timeout 8 #表示8秒无响应超时 retry 3 #表示重试次数 delay_before_retry 3 #表示重试间隔 connect_port 80 #使用80端口进行保活 } } real_server 192.168.98.14 80 { weight 1 TCP_CHECK { connect_timeout 8 retry 3 delay_before_retry 3 connect_port 80 } } }
-
从服务器:
global_defs { router_id LVS_DEVEL } vrrp_instance VI_1 { #定义一个实例,keepalived间的高可用只能接管相同实例名称 state BACKUP #指定Keepalived的角色,MASTER表示此主机是主服务器 BACKUP表示此主机是备用服务器,所以设置priority时要注意MASTER比BACKUP高。 interface ens33 #指定监测网络的接口,当LVS接管时,将会把IP地址添加到该网卡上。 virtual_router_id 51 #虚拟路由标识,同一个vrrp实例使用唯一的标识,同一个vrrp_instance下,MASTER和BACKUP必须一致。 priority 100 #指定这个实例优先级 advert_int 1 #心跳报文发送间隔 mcast_src_ip 192.168.98.7 authentication { auth_type PASS #设置验证类型,主要有PASS和AH两种 auth_pass 1111 #设置验证密码,同一个vrrp_instance下,MASTER和BACKUP的密码必须一致才能正常通信 } virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个 192.168.98.100 } } virtual_server 192.168.98.100 80 { #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开 delay_loop 6 #设置运行情况检查时间,单位是秒 lb_algo wrr #设置负载调试算法,这里设置为wrr即加权论询算法 lb_kind DR #设置LVS实现负载均衡的机制,有NAT,TUN和DR三个模式可选 persistence_timeout 50 #设置会话保持时间,单位是秒 protocol TCP #指定转发协议类型,有TCP和UDP两种 real_server 192.168.98.7 80 { #配置服务节点1,需要指定real server的真实IP地址和端口 weight 1 #配置服务节点的权值, TCP_CHECK { connect_timeout 8 #表示8秒无响应超时 retry 3 #表示重试次数 delay_before_retry 3 #表示重试间隔 connect_port 80 #使用80端口进行保活 } } real_server 192.168.98.14 80 { weight 1 TCP_CHECK { connect_timeout 8 retry 3 delay_before_retry 3 connect_port 80 } } }
-
-
-
安装nginx,两台服务器相同;
-
在两台服务器中分别安装nginx;
apt-get install nginx
-
启动nginx成功;
service nginx start
-
查看nginx是否启动成功;
-
编辑nginx默认页面,加上特定信息用于分辨主从服务器,编辑内容自定义即可;
-
vi /var/www/html/index.nginx-debian.html
-
-
-
编写脚本服务;
-
给编写的脚本赋予权限;
chmod u+x realserver.sh
-
在/home/user/下新建realserver.sh文件,写入以下内容;
#!/bin/bash SNS_VIP=192.168.98.100 #此处ip必须与keepalived中虚拟ip相同 #. /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 "0" >/proc/sys/net/ipv4/ip_forward 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
-
-
在主服务器中的/etc/nginx/conf.d/下新建自定义配置文件nginx.conf,内容为;
upstream load_banance { #负载均衡方法,可选:least_conn,ip_hash等,不填写则为轮询方式; #服务器的访问地址,最好使用服务器的私有IP以获得更好的性能和安全性。 server 192.168.98.7:80 weight=1; server 192.168.98.14:80 weight=2; } server { #负载均衡的监听端口 listen 80; #负载均衡服务器的服务名称,没有时填写_ server_name _; location / { #代理转发,注意这个load_banance要与upstream后的字符串相同 proxy_pass http://load_banance; } }
- 配置完成后重启nginx;
-
配置lvs+keepalived+ngixn成功进行测试;
-
启动keepalived;
service keepalived start #启动命令 service keepalived stop #停止命令 service keepalived restart #重启命令 service keepalived status #查看状态
-
查看虚拟ip,主服务器上有,从服务器没有;
-
启动nginx;
service ngixn start
-
运行realserver.sh脚本;
/home/user/realserver.sh start #启动 /home/user/realserver.sh stop #停止
-
-
负载均衡测试;
-
访问虚拟ip,第一次访问与第二次访问的nginx不同,实现了负载均衡效果;
-
-
-
如上述效果没有实现可能是因为端口80的问题,可通过以下操作进行修改;
-
修改/etc/nginx/sites-enabled/default配置文件,/etc/nginx/sites-available/default配置文件也会同步修改,内容如下
-
修改/etc/nginx/conf.d/nginx.conf文件,内容如下
-
-
-
故障测试;
-
模拟主服务器故障情况,关闭主服务器模拟宕机情况,分别查看两台服务器的vip,此时主服务器上的vip漂移到从服务器上;
-
-
启动主服务器,分别查看两台服务器的vip,此时vip回到主服务器上;
-
在两台服务器上分别安装Tomcat服务;
-
在/usr/local文件夹下创建java文件夹;
-
下载jdk-8u333-linunx-x64.tar.gz压缩包,上传到服务器/usr/local/java文件夹下并解压;
tar -zxvf apache-tomcat-8.5.83.tar.gz
-
修改/etc/profile配置文件,在最后添加环境变量配置
#java env export JAVA_HOME=/usr/local/java/jdk1.8.0_333 #此处为jdk安装位置 export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
-
运行以下命令使配置生效;
source /etc/profile
-
-
在/usr/local文件夹下创建tomcat文件夹;
-
下载apache-tomcat-8.5.83.tar.gz压缩包,上传到服务器/usr/local/tomcat下并解压;
tar -zxvf apache-tomcat-8.5.83.tar.gz
-
修改/usr/local/tomcat/apacht-tomcat-8.5.83/bin/start.sh配置文件,在最后添加以下内容;
exec "$PRGDIR"/"$EXECUTABLE" start "$@" #set java environment export JAVA_HOME=/usr/local/java/jdk1.8.0.333 #此处为jdk安装位置 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:%{JAVA_HOME}/bin:%{JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH #tomcat export TOMCAT_HOME=/usr/local/tomcat/apache-tomcat-8.5.83
-
启动tomcat成功,可正常访问8080端口;
-
在/usr/local/tomcat/apache-tomcat-8.5.83/webapps/下创建test文件夹,在test文件夹下创建index.html文件内容(为了区别不同服务器上的tomcat),内容自定义即可;
-
修改/etc/nginx/nginx.conf配置文件,修改内容如下
在http节点中添加
upstream tomcat { server 192.168.98.7:8080; server 192.168.98.14:8080; } server { listen 80; server_name 192.168.98.100; location / { proxy_pass http://tomcat/test/index.html; } }
-
重启nginx;
server 192.168.98.7:8080; server 192.168.98.14:8080; } server { listen 80; server_name 192.168.98.100; location / { proxy_pass http://tomcat/test/index.html; } }
-
重启nginx;
-
访问虚拟ip发现nginx将请求转发到tomcat中;
-
-