使用 IP 共享冗余化 HAProxy 转发到 Redis 服务器 (Akamai)

如果不把Redis服务器集群化,而是采用主/从配置的情况下,可以将HAProxy放在前面,以确保客户端始终连接到主服务器。由于HAProxy会成为单点故障(SPOF),因此本文将介绍如何将HAProxy进行冗余处理。

redis-haproxy-ipsharing.jpg
本篇文章将介绍使用私有IP的案例。使用VLAN的情况将在另一篇文章中进行解释。

关于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客户端的操作进行确认

redis-haproxy-2-haproxy.jpg
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共享

redis-haproxy-2-haproxy-ipsharing.jpg

IP共享是一种技术,允许多个节点共享同一IP地址。只有一个节点能够使用该IP地址,当持有该IP的节点因内部故障而崩溃时,其他节点可以接管该IP地址。

redis-ipsharing-before.jpg
redis-ipsharing-after.jpg

给haproxy1添加一个私有IP。

linode-haproxy1-2-privateip-mark.jpg
需要通过Cloud Manager与支持服务联系才能进行追加。

将haproxy2作为共享IP添加

linode-haproxy2-ipsharing-button.jpg
linode-haproxy2-sharedip-popup-comment.jpg

如果追加成功,将显示”IP共享已成功上传”的消息,然后关闭弹出窗口。

linode-haproxy2-ipsharing-done.jpg

在haproxy2的网络配置中添加的IP已经被注册为共享IP。

linode-haproxy2-network-sharedip.jpg

在网络中添加共享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的绑定配置更改

redis-haproxy-binding.jpg

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-sentinel-haproxy-ipsharing-1.jpg

在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
即使服务器停止,它仍然可以正常运行。
在这个系统中,无法检测到 systemctl stop haproxy 命令。

通过 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
redis-sentinel-haproxy-ipsharing-2.jpg

在次要的主机中停止 lelastic.

ord-haproxy2:/etc/systemd/system# systemctl stop lelastic

使用Redis-cli进行连接验证(第3部分)

会没有回应。

ord-haproxy:6379> get scott

redis-sentinel-haproxy-ipsharing-3.jpg

在主机上重新启动 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-sentinel-haproxy-ipsharing-4.jpg

停止 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-sentinel-haproxy-ipsharing-5.jpg

继续之前中断的进程。

redis-1:~# systemctl start redis-server
ord-haproxy2:/etc/systemd/system# systemctl start lelastic
redis-sentinel-haproxy-ipsharing-7.jpg

总结

通过使用Redis Sentinel、HAProxy和IP共享,可以提供高可用性的Redis服务器。根据使用的数据中心地区,可能会更改使用IP共享进行故障转移的方式,因此请仔细阅读文档。

广告
将在 10 秒后关闭
bannerAds