服务器/虚拟机 | 作用 | 主机名 | 系统 |
---|---|---|---|
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默认页面,加上特定信息用于分辨主从服务器,编辑内容自定义即可;
编写脚本服务;
给编写的脚本赋予权限;
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;
}
}
配置lvs+keepalived+ngixn成功进行测试;
负载均衡测试;
故障测试;
启动主服务器,分别查看两台服务器的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中;