主从模式就是一台机器提供服务,另一台机器作为备份机,当主机的服务停止时,备份机立刻接替主机的服务。
安装
- 安装nginx
wget http://nginx.org/download/nginx-1.19.6.tar.gz
tar -zxvf nginx-1.19.6.tar.gz
cd nginx-1.19.6# 编译安装
./configure
make && make install
- 安装keepalived
编译安装会出错,直接使用yum安装
yum install -y keepalived
nginx 负载均衡
一共两个tomcat服务,分别位于两台服务器上。用nginx负责两个服务的负载均衡。再用轮询的方式。映射关系如下:

- 注意tomcat的服务名称不能含有下划线,比如
tomcat_servers,否则会报错。 - 可以更改
webapps/ROOT/index.jsp文件,部署成功后,访问192.168.158.3可以看到内容在两个tomcat之间切换。
worker_processes 1;events {worker_connections 1024;
}http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;# 配置tomcat服务upstream tomcatservers{server 192.168.158.3:8080 weight=1; # 访问服务的权重server 192.168.158.4:8080 weight=2;}server {listen 80;server_name localhost;location / {root html;index index.html index.htm;proxy_pass http://tomcatservers; # 配置代理关系}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}
}
keepalived 实现映射虚拟vip
通过映射一个虚拟的ip(vip)到已有的两台机器上,实现ip的“飘移”。虚拟ip本身不代表任何服务器,正常情况下vip映射到主机上,当主机停止服务后,vip就映射到备份机上。
- 修改
/etc/keepalived/keepalived.conf配置文件
! Configuration File for keepalived# 检查nginx状态的脚本
vrrp_script ckeck_nginx {script "/etc/keepalived/check_nginx.sh"interval 2weight 2
}# 配置虚拟ip
vrrp_instance VI_1 {state MASTER # 主机-MASTER,备份机-BACKUPinterface ens33 # 网卡名称virtual_router_id 51 # 同一组服务用id相同priority 100 # 主机的优先级应高于backupadvert_int 1 # master和backup的同步时间authentication { # 认证信息auth_type PASSauth_pass 1111}track_script { # 上面配置的脚本ckeck_nginx}virtual_ipaddress { # 配置虚拟ip,可配置多个,一行一个192.168.158.10192.168.158.20}
}
- backup机器的配置如下,和master基本一致。
! Configuration File for keepalivedvrrp_script ckeck_nginx {script "/etc/keepalived/check_nginx.sh"interval 2weight 2
}vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 51priority 90advert_int 1authentication {auth_type PASSauth_pass 1111}track_script {ckeck_nginx}virtual_ipaddress {192.168.158.10192.168.158.20}
}
- 这里用到的检查脚本如下,他用来检查nginx的状态,当nginx停止服务后,尝试重启服务。如果启动失败,就停止keepalived服务。重新映射vip到backup机器上。
#!/bin/bash
#检测nginx是否启动了
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then #如果nginx没有启动就启动nginx systemctl start nginx #重启nginxif [ `ps -C nginx --no-header |wc -l` -eq 0 ];then #nginx重启失败,则停掉keepalived服务,进行VIP转移killall keepalived fi
fi
- 用
ip add show ens33查看网卡的vip。可以看到
[root@twilight0319 keepalived]# ip add show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:67:8a:94 brd ff:ff:ff:ff:ff:ffinet 192.168.158.4/24 brd 192.168.158.255 scope global ens33valid_lft forever preferred_lft foreverinet 192.168.158.10/32 scope global ens33valid_lft forever preferred_lft foreverinet 192.168.158.20/32 scope global ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe67:8a94/64 scope link valid_lft forever preferred_lft forever
另一台机器就不会有vip,因为vip只会映射到一个ip上。当主机的keepalived服务停止后,会自动将vip映射到另一台机器上。
[root@twilight0319 keepalived]# ip add show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:6a:a6:17 brd ff:ff:ff:ff:ff:ffinet 192.168.158.3/24 brd 192.168.158.255 scope global ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe6a:a617/64 scope link valid_lft forever preferred_lft forever