keepalived 配合Nginx 搭建高可用
Nginx 解决了负载均衡。
产生背景:一台Nginx可能会出现单点故障,导致程序不可用
一、准备
多台 nginx
keepalived
: 监听nginx健康。
haproxy
: 提供一个单独的虚拟IP和端口,统一接收客户端请求。
架构图:
+------------------------------------------------------------------------------------------+
+ +
+ +--------------------+ +------------+ +
+ + + + + +
+ + + Nginx + keepalived + ++++++> + server1 + +
+ +--------+ +-------+ / + + \ / + + +
+ + + + + / +--------------------+ \ / +------------+ +
+ + client + ---> + VIP + ---> X +
+ + + + + \ +--------------------+ / \ +------------+ +
+ +--------+ +-------+ \ + + / \ + + +
+ + + Nginx + keepalived + +++++++> + server2 + +
+ + + + + +
+ +--------------------+ +------------+ +
+ +
+------------------------------------------------------------------------------------------+
相关补充
keepalived 三个模块:
core模块:为keepalived的核心组件,负责主进程的启动、维护以及全局配置文件的加载和解析;
check:负责健康检查,包括常见的各种检查方式;
VRRP模块:是来实现VRRP协议的。
keepalived 工作原理
VRRP 虚拟路由器冗余协议:
(1)为看解决静态路由的单点故障而产生。
(2)通过竞选协议机制将路由的任务交给某台VRRP路由器。
(3)主机通过IP多播包的方式相同通讯,告知备机存活
(4)主机发包,备机接包,挡备机接不到包时,启动接管程序接管主机资源。
(5)备机可以有多台,可以通过优先级竞选。
(6)VRRP 使用加密协议保证安全。
keepalived 高可用对之间通过VRRP 协议进行通讯,确定主备,主的优先级高于备。工作运行时主机会获得所有资源,备机处于等待状态,当主节点宕机时,备节点接管主节点的资源,代替主节点提供服务。
在keepalived 之间,只有作为主节点的的服务器会一直发送VRRP 广播包,告诉备节点,自己是存活的,此时备节点不会抢占主节点。当主节点不可用,即备节点接收不到主节点发送的广播包,就会启动相关服务接管资源,接管速度可以小于1秒。
二、安装 keepalived
1、安装 keepalived
yum install -y openssl-devel
yum -y install keepalived
2、keepalived 常用命令
keepalived -v # 查看版本
keepalived start # 启动
keepalived stop # 停止
2、配置
Keepalived默认的配置文件路径在 /etc/keepalived/keepalived.conf
Keepalived默认的日志文件保存在 /var/log/messages
主节点 keepalived.conf
:
! Configuration File for keepalived
global_defs {
smtp_connect_timeout 30 #连接超时时间
router_id 192.168.100.123 #路由ID,可以通过hosts取别名
}
vrrp_instance VI_1 { # VRRP 实例VI_1的配置
state MASTER # 指定instance初始状态,实际根据优先级决定.backup节点不一样
interface ens33 # 容器中虚拟IP所在网卡名称
virtual_router_id 51 # VRID,相同VRID为一个组,决定多播MAC地址
priority 100 # 优先级,另一台改为90.backup节点不一样,数字越大优先级越高
advert_int 1 # 检查间隔
authentication {
auth_type PASS # 认证方式,可以是pass或ha
auth_pass 1111 # 认证密码
}
virtual_ipaddress {
192.168.100.101 #VIP地址,对外统一地址
}
}
备节点 keepalived.conf
:
! Configuration File for keepalived
global_defs {
smtp_connect_timeout 30
router_id 192.168.100.124
}
vrrp_instance VI_1 {
state BACKUP
interface eth33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.100.101 #VIP地址,对外统一地址
}
}
三、安装 haproxy
haproxy 官网应该被墙了,看github的:https://github.com/haproxy/haproxy
1、安装 haproxy
yum install -y gcc gcc-c++
yum -y install haproxy
2、keepalived 常用命令
#启动 | #停止 | #查看状态
systemctl start haproxy.service
systemctl stop haproxy.service
systemctl status haproxy.service
3、haproxy 配置
haproxy 配置文件需要自己创建 /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local3 info # 用127.0.0.1上的rsyslog服务中的local3设备记录日志,日志级别为info
user haproxy #用户
group haproxy #组
daemon # 以守护进程的方式运行
maxconn 4000 # 最大并发连接数
defaults
log global #表示用global模块中定义的日志配置
mode http # 模式 使用http模式
option httplog # 默认haproxy日志,不记录http请求,开启记录http请求
option dontlognull # 保证HAProxy不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包。
timeout connect 5000 # 成功连接一台服务器最长等待时间 单位毫秒
timeout client 50000 # 连接客户端最长等待时间 单位毫秒
timeout server 50000 # 服务器回应客户端最长等待时间 单位毫秒
frontend http_front
bind 192.168.100.123:80 # 监听本服务器 192.168.100.123的ip 80端口
stats uri /haproxy?stats # haproxy的状态管理页面,通过/haproxy?stats来访问
default_backend http_back # 定义一个服务器组 http_back
backend web_server
balance roundrobin # 轮询
option httpchk GET /index.html # 启动http的健康检查
option forwardfor header X-Forwarded-For # 设置后端服务器可以看到客户端ip 访问日志中
server node1 192.168.100.101:80 check inter 2000 rise 3 fall 3
# 后端服务器昵称node1 ip和端口 | check 关键字 | inter 健康检查间隔 2000毫秒| rise 检测 3次 认为正常| fall 检测3次认为失败 | weight 权重 30
测试
测试访问haproxy http://192.168.100.101
模拟主节点宕机,关闭nginx,再次访问haproxy。
文章不完整,后续再补充。