前言
首先介绍一下 Keepalived, 它是一个高性能的服务器高可用或热备解决方案, 起初是专为 LVS 负载均衡软件设计的, Keepalived 主要来防止服务器单点故障的发生问题, 可以通过其与 Nginx 的配合实现 web 服务端的高可用.
Keepalived 以 VRRP 协议为实现基础, VRRP 是 Virtual Router Redundancy Protocol(虚拟路由冗余协议) 的缩写, VRRP 协议将两台或多台路由器设备虚拟成一个设备, 对外提供虚拟路由器 IP(一个或多个).
VRRP 出现的目的就是为了解决静态路由的单点故障问题的, 它能保证当个别节点宕机时, 整个网络可以不间断地运行.
下面我们介绍一下 nginx keepalived 高可用方案的部署安装.
环境准备
在两台主机上准备如下压缩文件:
- keepalived-2.0.20.tar.gz
- nginx-1.16.1.tar.gz
虚拟 IP 真实 IP nginx 端口 主从
- 192.168.124.20 192.168.124.13 80 MASTER
- 192.168.124.20 192.168.124.14 80 BACKUP
安装 nginx
file 新建一个用户:
useradd tianyan
确定安装目录, 我这里的安装目录是:/home/tianyan/tianyan_soft/nginx.install.
在这个目录下分别新建两个目录用于安装 nginx 和 keepalived, 解压两个压缩包.
执行安装命令:
- ./configure --prefix=/home/tianyan/tianyan_soft/nginx.install
- --sbin-path=/home/tianyan/tianyan_soft/nginx.install/sbin/nginx --conf-path=/home/tianyan/tianyan_soft/nginx.install/conf/nginx.conf
- --error-log-path=/home/tianyan/tianyan_soft/nginx.install/error.log
- --http-log-path=/home/tianyan/tianyan_soft/nginx.install/access.log
- --pid-path=/home/tianyan/tianyan_soft/nginx.install/nginx.pid
- --lock-path=/home/tianyan/tianyan_soft/nginx.install/nginx.lock
- --user=tianyan --group=tianyan
- --with-http_stub_status_module
- --with-http_gzip_static_module
- --with-http_ssl_module
- --with-http_realip_module
- --with-threads
- --with-pcre
- --http-client-body-temp-path=/home/tianyan/tianyan_soft/nginx.install/client/
- --http-proxy-temp-path=/home/tianyan/tianyan_soft/nginx.install/proxy/
- --http-fastcgi-temp-path=/home/tianyan/tianyan_soft/nginx.install/fcgi/
- --http-uwsgi-temp-path=/home/tianyan/tianyan_soft/nginx.install/uwsgi
- --http-scgi-temp-path=/home/tianyan/tianyan_soft/nginx.install/scgi
如果报错, 记得安装相关依赖:
- yum install gcc gcc-c++
- nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied).
注: 以非 root 权限启动时, 会出现 nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied) 错误.
原因: Linux 只有 root 用户可以使用 1024 一下的端口
解决办法:
1. 按照 root 权限启动
2. 将 /usr/local/nginx/conf/nginx.conf 文件中的 80 端口改为 1024 以上.
安装 keepalived
./configure --prefix=/usr/local/keepalived
上述命令执行完毕后继续执行:
make && make install
安装完毕后, 目录是这个样子:
file
将配置文件拷贝到系统对应的目录下
- mkdir /etc/keepalived
- cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
- cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
编辑 master 节点的 keepalived.conf
VIM /etc/keepalived/keepalived.conf
内容参考如下:
- ! Configuration File for keepalived
- global_defs {
- # 一个没重复的名字即可
- router_id hyq_slave
- }
ng 是否运行
- vrrp_script chk_nginx {
- script "/etc/keepalived/nginx_check.sh"
- interval 2
- weight -20
- }
- vrrp_instance VI_1 {
- state BACKUP # 必填, 可以是 MASTER 或 BACKUP
- interface ens33
- virtual_router_id 101
- priority 90
- advert_int 1
- # 如果两节点的上联交换机禁用了组播, 则采用 vrrp 单播通告的方式
- # 本机 ip
- unicast_src_ip 192.168.124.14
- unicast_peer {
- # 其他机器 ip
- 192.168.124.13
- }
- # 设置 nopreempt 防止抢占资源
- nopreempt
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- # 与上方 nginx 运行状况检测呼应
- track_script {
- chk_nginx
- }
- virtual_ipaddress {
- 192.168.124.20
- }
- }
编辑 slave 节点的 keepalived.conf
- VIM /etc/keepalived/keepalived.conf
- ! Configuration File for keepalived
- global_defs {
- # 一个没重复的名字即可
- router_id hyq_slave
- }
ng 是否运行
- vrrp_script chk_nginx {
- script "/etc/keepalived/nginx_check.sh"
- interval 2
- weight -20
- }
- vrrp_instance VI_1 {
- state BACKUP # 必填, 可以是 MASTER 或 BACKUP
- interface ens33
- virtual_router_id 101
- priority 90
- advert_int 1
- # 如果两节点的上联交换机禁用了组播, 则采用 vrrp 单播通告的方式
- # 本机 ip
- unicast_src_ip 192.168.124.14
- unicast_peer {
- # 其他机器 ip
- 192.168.124.13
- }
- # 设置 nopreempt 防止抢占资源
- nopreempt
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- # 与上方 nginx 运行状况检测呼应
- track_script {
- chk_nginx
- }
- virtual_ipaddress {
- 192.168.124.20
- }
- }
编写 nginx_check.sh 脚本
在 / etc/keepalived 目录下新建 nginx_check.sh 脚本
touch nginx_check.sh
编辑其内容为:
- !/bin/sh
- A=ps -C nginx --no-header |wc -l
- if [ $A -eq 0 ]
- then
- /usr/sbin/nginx
- sleep 1
- A2=ps -C nginx --no-header |wc -l
- if [ $A2 -eq 0 ]
- then
- systemctl stop keepalived
- fi
- fi
含义是: 如果 nginx 停止运行, 尝试启动, 但是如果无法启动, 则杀死本机的 keepalived 进程, keepalied 将会把虚拟 ip 绑定到 BACKUP 机器上. 注意: /usr/sbin/nginx 是 nginx 的启动命令, 如果你安装到其他目录, 则相应的替换.
Keepalived 的日志
Keepalived 日志默认位置是在 / var/log/messages 目录下. 我们将其修改一下.
由于系统是 centos7, 修改位置为:/lib/systemd/system/keepalived.service
原内容:
- EnvironmentFile=-/usr/local/keepalived/etc/sysconfig/keepalived
- ExecStart=/usr/local/keepalived/sbin/keepalived $KEEPALIVED_OPTIONS
修改为:
file
修改完毕后重新加载 service
systemctl daemon-reload
创建命令软连接:
ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived
执行:
keepalived -D -f /etc/keepalived/keepalived.conf
-D 将日志输出到 message 日志, 默认日志也在 message
-f 是指定配置文件
修改 / etc/sysconfig/keepalived
把 KEEPALIVED_OPTIONS="-D" 修改为: KEEPALIVED_OPTIONS="-D -d -S 0"
file
在 / etc/rsyslog.conf 末尾添加
- local0.*/var/log/keepalived.log
- file
最后执行命令:
service rsyslog restart
重启 keepalived 后就可以看到日志在 / var/log/keepalived.log 下了.
测试验证 VIP
当 keepalived 和 nginx 都启动后, 我们来测试一下.
首先在浏览器里面访问三个地址
- http://192.168.124.20/ (vip)
- http://192.168.124.13/ (master)
- http://192.168.124.14/ (slave)
我修改了一下 nginx 的 index.html, 可以看到当前 vip 指向是 13 的 master 节点:
file
然后, 我们手动停止 13 上的 nginx, 再次访问 http://192.168.124.20.
file
说明安装成功.
其中通过 ip address 命令可以观察到网卡的变化 file
实验到这里, 我们就完成了 keepalived + nginx 主从配置的安装部署了.
思考: 如何开启双主模式
什么是双主模式?
分别介绍一下两种配置
1,Nginx+keepalived 主从配置
file
这种方案就是上文介绍过的, 使用一个 vip 地址, 前端使用 2 台机器, 一台做主, 一台做备, 但同时只有一台机器工作, 另一台备份机器在主机器不出现故障的时候, 永远处于浪费状态, 仅仅用于灾备, 平时都是空闲着的.
2,Nginx+keepalived 双主配置
这种方案, 使用两个 vip 地址, 前端使用 2 台机器, 互为主备, 同时有两台机器工作, 当其中一台机器出现故障, 两台机器的请求转移到一台机器负担, 如下图:
file
[实战] Elasticsearch 写入速度提升的案例分享 https://sourl.cn/ZHcLLB
用 java 做一个能赚钱的微信群聊机器人 (PC 协议) https://sourl.cn/ghaHjj
MySQL 百万量级数据高效导入 Redis https://sourl.cn/BKw2vS
可视化界面在线生成 JVM 参数 https://sourl.cn/5W79kr
java 线上故障分析 + 性能调优 https://sourl.cn/4sgiRt
ELK 实践攻略 https://sourl.cn/JJrnuW
来源: https://www.cnblogs.com/hyq0823/p/12571781.html