使用 IP 共享冗余化 HAProxy 转发到 Redis 服务器 (Akamai)
如果不把Redis服务器集群化,而是采用主/从配置的情况下,可以将HAProxy放在前面,以确保客户端始终连接到主服务器。由于HAProxy会成为单点故障(SPOF),因此本文将介绍如何将HAProxy进行冗余处理。
关于HAProxy的IP共享化,请参考以下资料。
准备Redis Sentinel
根据以下文章,建立一个使用Redis Sentinel的3节点结构,以及HAProxy和Redis客户端的环境。
准备额外的 HAProxy
我們將在 HAProxy 的既有配置中新增一台服務器。每台服務器都使用 2.4.22 版本。
ord-haproxy1:~# haproxy -v
HAProxy version 2.4.22-0ubuntu0.22.04.1 2023/03/22 - https://haproxy.org/
Status: long-term supported branch - will stop receiving fixes around Q2 2026.
Known bugs: http://www.haproxy.org/bugs/bugs-2.4.22.html
Running on: Linux 6.2.9-x86_64-linode160 #1 SMP PREEMPT_DYNAMIC Wed Apr 5 15:30:32 EDT 2023 x86_64
ord-haproxy2:~# haproxy -v
HAProxy version 2.4.22-0ubuntu0.22.04.1 2023/03/22 - https://haproxy.org/
Status: long-term supported branch - will stop receiving fixes around Q2 2026.
Known bugs: http://www.haproxy.org/bugs/bugs-2.4.22.html
Running on: Linux 6.2.9-x86_64-linode160 #1 SMP PREEMPT_DYNAMIC Wed Apr 5 15:30:32 EDT 2023 x86_64
ord-redisclient:~# redis-cli -v
redis-cli 6.0.16
对Redis客户端的操作进行确认
ord-redisclient:~# redis-cli -h ord-haproxy1 --tls --cacert redissentinel-ord_ca.crt info replication | egrep role
role:master
ord-redisclient:~# redis-cli -h ord-haproxy2 --tls --cacert redissentinel-ord_ca.crt info replication | egrep role
role:master
这是/etc/hosts文件的信息。
# Redis
192.168.XXX.1 ord-redissentinel1 redis-1
192.168.XXX.2 ord-redissentinel2 redis-2
192.168.XXX.3 ord-redissentinel3 redis-3
192.168.0.1 ord-haproxy1
192.168.0.2 ord-haproxy2
192.168.XXX.11 ord-redisclient
在这种状态下,每个 Redis 服务器的 Firewalld 都允许来自 Redis 客户端的访问,因此当访问它们时可以知道 redis-2 和 redis-3 是复制品。
ord-redisclient:~# redis-cli -h redis-1 --tls --cacert redissentinel-ord_ca.crt info replication | egrep role
role:master
ord-redisclient:~# redis-cli -h redis-2 --tls --cacert redissentinel-ord_ca.crt info replication | egrep role
role:slave
ord-redisclient:~# redis-cli -h redis-3 --tls --cacert redissentinel-ord_ca.crt info replication | egrep role
role:slave
引入IP共享
IP共享是一种技术,允许多个节点共享同一IP地址。只有一个节点能够使用该IP地址,当持有该IP的节点因内部故障而崩溃时,其他节点可以接管该IP地址。
给haproxy1添加一个私有IP。
将haproxy2作为共享IP添加
如果追加成功,将显示”IP共享已成功上传”的消息,然后关闭弹出窗口。
在haproxy2的网络配置中添加的IP已经被注册为共享IP。
在网络中添加共享IP(haproxy1和haproxy2的共同配置)
首先进行的工作是在平台上进行设置。接下来进行 Linux 上的配置。
以下是对原文的中文同义句:
01-netcfg.yaml 文件位于 /etc/netplan 目录下。
# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: yes
lo: # ここから追加
match:
name: lo
addresses:
- 192.168.0.3/32 # /17 ではなく #32 ですので注意
将设置应用。
netplan apply
在设置完成后,您将能够在双方服务器的lo设备上查看已注册的私有IP地址。
ord-haproxy1:/etc/netplan# ip -4 a show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.0.3/32 scope global lo
valid_lft forever preferred_lft forever
ord-haproxy2:/etc/netplan# ip -4 a show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.0.3/32 scope global lo
valid_lft forever preferred_lft forever
弹性搜索的安装和配置
leelastic是Linode的专有工具,它是一个为了方便地使用弹性IP而设计的客户端。
执行以下命令。
version=v0.0.6
curl -LO https://github.com/linode/lelastic/releases/download/$version/lelastic.gz
gunzip lelastic.gz
chmod 755 lelastic
sudo mv lelastic /usr/local/bin/
创建一个名为 “lelastic.service” 的文件。
ord-haproxy2:~# vi /etc/systemd/system/lelastic.service
文件将如下进行设置。[ID] 和 [role] 将在后续编辑。
[Unit]
Description= Lelastic
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/bin/lelastic -dcid [ID] -[role] &
ExecReload=/bin/kill -s HUP $MAINPID
[Install]
WantedBy=multi-user.target
[ID] 输入数据中心的编号。请参考下一页的表格。
在 [role] 中,我们将在主机端(haproxy1) 上将 Shared IP 设置为主要(primary),在共享主机端(haproxy2) 上将其替换为次要(secondary)。
HAproxy 1 的配置
ExecStart=/usr/local/bin/lelastic -dcid 18 -primary &
如果添加-loglevel debug等参数,将会在/var/log/syslog中记录详细的日志。
HAproxy 2 的配置
ExecStart=/usr/local/bin/lelastic -dcid 18 -secondary &
弹性搜索的启动(haproxy1和haproxy2的共同操作)
chmod 644 /etc/systemd/system/lelastic.service
systemctl start lelastic
systemctl enable lelastic
HAProxy的绑定配置更改
HAProxy1
frontend ft_redis
# HAProxy Private IP address
# bind 191.168.0.1:6379 name redis
# shared IP address
bind 192.168.0.3:6379 name redis
default_backend bk_redis
绑定 *:6379 名称为redis
HAProxy 2
frontend ft_redis
# HAProxy Private IP address
# bind 191.168.0.2:6379 name redis
# shared IP address
bind 192.168.0.3:6379 name redis
default_backend bk_redis
确认从Redis客户端是否可以执行IP共享。
目前的情况。
在Redis客户端上注册一个IP共享的地址。
将 IP Sharing 地址注册到 /etc/hosts 文件中。
192.168.XXX.1 ord-redissentinel1 redis-1
192.168.XXX.2 ord-redissentinel2 redis-2
192.168.XXX.3 ord-redissentinel3 redis-3
# END redis servers
192.168.0.1 ord-haproxy1
192.168.0.2 ord-haproxy2
192.168.0.3 ord-haproxy # 追加した行です
192.168.XXX.11 ord-redisclient
通过 Redis-cli 进行连接确认(1)
ord-redisclient:~# redis-cli -h ord-haproxy --tls --cacert redissentinel-ord_ca.crt ping
PONG
ord-redisclient:~# redis-cli -h ord-haproxy --tls --cacert redissentinel-ord_ca.crt info replication | grep role
role: master
可以读写的状态。
ord-redisclient:~# redis-cli -h ord-haproxy --tls --cacert redissentinel-ord_ca.crt
ord-haproxy:6379> set scott tiger
OK
ord-haproxy:6379> get scott
"tiger"
ord-haproxy:6379> get scott
"tiger"
ord-haproxy:6379> set scott lion
OK
ord-haproxy:6379> get scott
"lion"
ord-haproxy:6379>
在主机上停止运行lelastic。
停止主服务器的进程。
ord-haproxy1:/etc/haproxy# systemctl stop lelastic
通过 redis-cli 进行连接确认(第二部分)
虽然会出现瞬间的连接错误,但会立即返回对新命令的响应。
ord-haproxy:6379> get scott
Could not connect to Redis at ord-haproxy:6379: SSL_connect failed: unexpected eof while reading
not connected> get scott
"lion"
Redis-2 已晋升为主服务器,但客户端无需担心该情况,仍可进行连接。
ord-haproxy1:/etc/haproxy# redis-cli -h redis-2 --tls --cacert /etc/haproxy/tls/redissentinel-ord_ca.crt info replication | grep role
role:master
在次要的主机中停止 lelastic.
ord-haproxy2:/etc/systemd/system# systemctl stop lelastic
使用Redis-cli进行连接验证(第3部分)
会没有回应。
ord-haproxy:6379> get scott
在主机上重新启动 lelastic
ord-haproxy1:/etc/haproxy# systemctl start lelastic
从Redis-cli测试连接确认(第4部分)
将立即连接。
ord-haproxy:6379> get scott
"lion"
(65.31s)
ord-haproxy:6379> get scott
"lion"
ord-haproxy:6379> set scott tiger
OK
ord-haproxy:6379> get scott
"tiger"
停止 Redis 主服务器
redis-1:~# systemctl stop redis-server
redis-2 正在晋升为主节点。
ord-haproxy1:/etc/haproxy# redis-cli -h redis-2 --tls --cacert /etc/haproxy/tls/redissentinel-ord_ca.crt info replication | grep role
role:master
使用 Redis-cli 进行连接确认(第五步)
redis-2 升级为主节点,但客户端可以连接到该节点而无需担心其状态。
ord-haproxy:6379> get scott
Could not connect to Redis at ord-haproxy:6379: SSL_connect failed: unexpected eof while reading
not connected> get scott
"lion"
ord-haproxy:6379> get scott
"lion"
(65.31s)
ord-haproxy:6379> get scott
"lion"
继续之前中断的进程。
redis-1:~# systemctl start redis-server
ord-haproxy2:/etc/systemd/system# systemctl start lelastic
总结
通过使用Redis Sentinel、HAProxy和IP共享,可以提供高可用性的Redis服务器。根据使用的数据中心地区,可能会更改使用IP共享进行故障转移的方式,因此请仔细阅读文档。