所谓的高可用,就是虽然nginx可以反向代理,如果某个内部服务器down了,可以使用其他的内部服务器,然而万一nginx挂了呢????布置多个nginx再反向代理nginx??反向套娃,总有一个是头部的nginx,就还会出现这个问题。
而高可用的方法是:两台并列的nginx,都可以处理内部服务器,如果有一台nginx挂了,另一个迅速顶上。所谓的顶上,其实就是修改第二个nginx的ip地址为第一个nginx服务器,然而这样很复杂,问题很多,例如万一挂掉的nginx恢复了呢,这时候ip冲突了就。这里换一种思路,使用虚拟ip地址,它是固定的字符串,外部就用它访问,只不过它是飘忽不定的,一会在第一台nginx,一会在第二台nginx,是不固定的,这样就避免了很多问题。
这就会用到一个小软件——keepalived。咱们可以来模拟一下。
- 模拟:在之前的设置中,都是01虚拟机作为nginx服务器,这里我们把01虚拟机克隆一下,作为并列的两个nginx服务器,如果其中一个挂了,另一个迅速顶上。
- 首先克隆虚拟机01——然后两台都下载安装keepalived软件。
这里下载安装还有一些坑,下载安装命令很简单:
sudo apt-cache search keepalived
sudo apt-get install keepalived
但是我发现安装完之后,在/etc/keepalived目录下却没有相应的keepalived.conf文件。
首先尝试启动
/etc/init.d/keepalived status # 查看状态
/etc/init.d/keepalived stop # 停止
/etc/init.d/keepalived start # 启动
systemctl start keepalived # 启动
systemctl status keepalived # 查看状态
然后查看状态,发现
没有配置文件,果然启动失败了,那么怎么生成配置文件呢,额,这里有个模板,在/usr/share/doc/keepalived/samples 目录下的模板文件keepalived.conf.sample,复制到/etc/keepalived目录下,改名字为keepalived.conf即可。重新启动
成了。
- 配置01虚拟机:
keepalived.conf配置文件:
global_defs {
router_id lb111 #起一个名字
}
vrrp_instance atguigu {# 后面atguigu是实例名字,随便起
state MASTER # 表示是主机,不是备用
interface ens33 #对应本机网卡的名字,用ifconfig查看
virtual_router_id 50 #不用改
nopreempt
priority 100 #主备竞选时候的优先级
advert_int 1 #间隔检测的时间
authentication { #这个是分组,一个局域网内可能有多台机器配置
auth_type PASS #keepalived了,总得区分开谁跟谁是一组配置
auth_pass 1111 #这个只要同组保持一致就行
}
virtual_ipaddress {#虚拟ip,可以虚拟好几个,咱们就用一个
192.168.200.11 #来实验就行
#192.168.200.12
#192.168.200.13
}
}
ifconfig网卡:
这里修改完配置文件之后重启keepalived发现报错了:
keepalived daemon is already running
原因其实是上一次不正常退出,而它daemon还在运行,这次重启发现daemon还在运行,他以为已经启动了。解决方法也很简单,先杀死keepalived所有进程,systemctl stop keepalived其实是没用的,这个玩意的进程很难杀死,具体遵循下面的文章,可以破解:
https://blog.csdn.net/liuyichen999521/article/details/127570525
启动成功后,看看IP是不是变了:
可以看到,多了一个虚拟地址。(要用ip addr才能看到哦,ifconfig看不到)。
- 配置04虚拟机
这里配置文件可是有差别的,不能完全复制,
global_defs {
router_id lb110 #变一个
}
vrrp_instance atguigu {# atguigu,必须一致!!!
state BACKUP #备用机
interface ens33
virtual_router_id 50 #必须一致!!!
nopreempt
priority 50 # 优先级低一点,因为是备用机
advert_int 1
authentication { #必须一致!!!
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.125.100
}
}
此时虚拟ip被01虚拟机占用了,所以ip addr不显示虚拟ip。
- 测试方法:用其他机器,ping 192.168.125.100,也就是ping虚拟ip,发现通了,此时一旦挂掉虚拟主机01,你会发现有一个请求超时,然后立刻通了,然后去04虚拟机,ip addr,发现出现了192.168.125.100,也就是说,完成了ip漂移。
绝了~
这个时候依然可以使用常规nginx的代理功能,访问:
http://192.168.125.100:80/
没毛病
- 拓展:keepalived是通过监听对方的keepalived进程来实现检测的,而万一虚拟机上的nginx坏了,keepalived没出问题,那这是检测不到的呀!!那可咋整,keepalived又不是为nginx服务的,他只是检测虚拟机是不是好使。
- 这里可以通过写脚本的方式,它在虚拟机本机上跑,通过它把keepalived和nginx联系起来,脚本不断去检测nginx是否报错,如果出问题就kill掉keepalived进程,触发ip漂移。
- 可见keepalived不是专门服务于nginx的,把nginx换成redis、mysql一样可以和keepalived配合。