使用 VLAN 配置 Redis Sentinel(Akamai)
Akamai 上的 Redis 哨兵
可以通过Akamai的云计算服务提供的市场平台,简单地创建Redis Sentinel集群配置。通过配置HAProxy,您还可以始终连接到主服务器并进行读写操作。有关详细信息,请参阅下面的文章。
在上文中,描述了使用私有IP配置网络的方法,而本文则介绍了使用VLAN进行配置的方法。首先,按照上文中提供的参考,创建一个由私有IP组成的网络。所创建的网络如下所示。

虚拟局域网
以下的图表显示了从之前使用私有IP的配置更改为VLAN配置。本文将记录迁移至这种配置的步骤。

为了简化解释,本文将仅使用单机配置,尽管实际上应该采用HAProxy进行冗余配置。
进展的大体步骤如下:
进展的大致流程如下所示。
-
- 在市场上安装Redis Sentinel,构建相应的Linode节点,包括HAProxy、VLAN路由器和Redis客户端。
为Redis Sentinel的每个节点、HAProxy、路由器和Redis客户端的所有节点分配VLAN IP地址。
从Redis Sentinel的每个节点和HAProxy中删除公共IP和私有IP的分配。
确认Redis客户端始终可以通过HAProxy访问Redis主服务器。
在这个广大的流程中设置一些检查点,以确保其正常运作。
共同主机设置
请首先确定VLAN的IP地址。请参考以下文章关于VLAN的内容。
在全体范围内执行的简单操作是将私有IP更改为VLAN IP。最好事先准备一张映射表,如下所示,这样会更方便。
vlan-router10.0.0.1haproxy
vlan-haproxy10.0.0.21Redis Client
vlan-redisclient10.0.0.22
最终,具有公共 IP 的是 Redis 客户端和路由器。根据要求,请适当进行定义。路由器在从 VLAN 中通信到外部时是必需的。更多详细信息,请参考以下文章。
hosts文件位于/etc目录下。
10.0.0.11 redis-1v #Redis Sentinel 1
10.0.0.12 redis-2v # Redis Sentinel 2
10.0.0.13 redis-3v # Redis Sentinel 3
10.0.0.1 vlan-router
10.0.0.21 vlan-haproxy
10.0.0.22 vlan-redisclient
我们将在每个主机上进行工作。在 Redis Sentinel 的三个节点上,我们将修改与 redis.conf、sentinel.conf 和 firewalld 相关的 VLAN 设置。
将redis.conf文件中与Redis复制相关的IP配置更改为使用VLAN,以取代当前配置中基于私有IP的描述。
sentinel.conf 是用于修改 Redis Sentinel 的 IP 配置的文件。它将现有的使用私有IP的配置更改为使用VLAN。
vlan 的 IP 地址将被追加到正在运行的 firewalld 进程配置中。配置 VLAN 后,因此 firewalld 进程的需求较小,根据情况可以停止进程进行确认。
除此之外,在eth设备中启用VLAN,还必须更改系统的网络设置。
路由器作为主机来设置IP转发。设置参考以下文章。
停止Redis服务器的进程
首先,停止 Redis Server 和 Sentinel 的进程。按照以下顺序进行。
-
- 停止复制服务器的哨兵。如果存在多台,顺序不重要。
-
- 停止主服务器的哨兵。
-
- 停止复制服务器。如果存在多台,顺序不重要。
- 停止主服务器。
通过先停止哨兵,以防止意外修改主服务器和副本服务器。
如果redis_1是主服务器,redis_2和redis_3是副本服务器,则按照以下顺序进行操作。
redis_2# systemctl stop redis-sentinel
redis_3# systemctl stop redis-sentinel
redis_1# systemctl stop redis-sentinel
redis_2# systemctl stop redis-server
redis_3# systemctl stop redis-server
redis_1# systemctl stop redis-server
Redis-1v 可以将以下内容以中文进行改述:
Redis-1v
假设redis_1作为主服务器运行。由于服务器组已停止,redis-1v、redis-2v、redis-3v的操作顺序不重要。
/etc/redis/redis.conf 可以被中文翻译为 “/etc/redis/redis配置文件”。
#bind 127.0.0.1 ::1 192.168.XXX.XX1
bind 127.0.0.1 ::1 10.0.0.11
绑定(bind)的描述是将Redis服务器的IP地址注册到客户端监听。将私有IP的描述更改为VLAN的IP。
/etc/redis/sentinel.conf 可以被中文释义为:Redis哨兵配置文件。
#bind 127.0.0.1 ::1 192.168.XXX.XX1
bind 127.0.0.1 ::1 10.0.0.11
#sentinel monitor mymaster 192.168.XXX.XX1 6379 2
sentinel monitor mymaster 10.0.0.11 6379 2
#sentinel known-replica mymaster 192.168.XXX.XX3 6379
sentinel known-replica mymaster 10.0.0.13 6379
#sentinel known-replica mymaster 192.168.XXX.XX2 6379
sentinel known-replica mymaster 10.0.0.12 6379
#sentinel known-sentinel mymaster 192.168.XXX.XX2 26379 f80d00523b7831d8362ad5cf5c60f0975057b10f
sentinel known-sentinel mymaster 10.0.0.12 26379 f80d00523b7831d8362ad5cf5c60f0975057b10f
#sentinel known-sentinel mymaster 192.168.XXX.XX3 26379 83e7fea9eab2635981d02d5ad62142653b309e08
sentinel known-sentinel mymaster 10.0.0.13 26379 83e7fea9eab2635981d02d5ad62142653b309e08
雷迪斯-2V
redis-2v假设为一个副本服务器。
/等/失真/的/再старт/работа/职业/redis/女士/の/黑客/方式
#bind 127.0.0.1 ::1 192.168.XXX.XX2
bind 127.0.0.1 ::1 10.0.0.12
#replicaof 192.168.XXX.XX1 6379
replicaof 10.0.0.11 6379
/etc/redis/sentinel.conf 可以进行释义为:
Redis哨兵配置文件。
#bind 127.0.0.1 ::1 192.168.XXX.XX2
bind 127.0.0.1 ::1 10.0.0.12
#sentinel monitor mymaster 192.168.XXX.XX1 6379 2
sentinel monitor mymaster 10.0.0.11 6379 2
#sentinel known-replica mymaster 192.168.XXX.XX3 6379
sentinel known-replica mymaster 10.0.0.13 6379
#sentinel known-replica mymaster 192.168.XXX.XX2 6379
sentinel known-replica mymaster 10.0.0.12 6379
#sentinel known-sentinel mymaster 192.168.XXX.XX1 26379 662bdc406dfb2ce3fb31d2e7b5ca0eece38910b7
sentinel known-sentinel mymaster 10.0.0.11 26379 662bdc406dfb2ce3fb31d2e7b5ca0eece38910b7
#sentinel known-sentinel mymaster 192.168.XXX.XX3 26379 83e7fea9eab2635981d02d5ad62142653b309e08
sentinel known-sentinel mymaster 10.0.0.13 26379 83e7fea9eab2635981d02d5ad62142653b309e08
redis-3v 的原生中文解释如下:
Redis-3v被假定为另一个副本服务器。
/等等/redis/redis.conf
#bind 127.0.0.1 ::1 192.168.XXX.XX3
bind 127.0.0.1 ::1 10.0.0.13
# Generated by CONFIG REWRITE
#replicaof 192.168.XXX.XX1 6379
replicaof 10.0.0.11 6379
/etc/redis/sentinel.conf 的翻译可以是:/etc/redis/sentinel.conf
#bind 127.0.0.1 ::1 192.168.XXX.XX3
bind 127.0.0.1 ::1 10.0.0.13
#sentinel monitor mymaster 192.168.XXX.XX1 6379 2
sentinel monitor mymaster 10.0.0.11 6379 2
#sentinel known-replica mymaster 192.168.XXX.XX3 6379
sentinel known-replica mymaster 10.0.0.13 6379
#sentinel known-replica mymaster 192.168.XXX.XX2 6379
sentinel known-replica mymaster 10.0.0.12 6379
#sentinel known-sentinel mymaster 192.168.XXX.XX1 26379 662bdc406dfb2ce3fb31d2e7b5ca0eece38910b7
sentinel known-sentinel mymaster 10.0.0.11 26379 662bdc406dfb2ce3fb31d2e7b5ca0eece38910b7
#sentinel known-sentinel mymaster 192.168.XXX.XX2 26379 f80d00523b7831d8362ad5cf5c60f0975057b10f
sentinel known-sentinel mymaster 10.0.0.12 26379 f80d00523b7831d8362ad5cf5c60f0975057b10f
防火墙
内部.xml
以下是firewalld的设置。当通过市场进行供应时,将配置为只允许从Redis服务器的私有IP地址访问。请添加以下行。
<source address="10.0.0.11"/>
<source address="10.0.0.12"/>
<source address="10.0.0.13"/>
<source address="10.0.0.21"/>
<source address="10.0.0.1"/>
<source address="10.0.0.22"/>
请保留除了源地址以外的所有设置。最终将删除私有IP地址。
应用设置。
firewall-cmd --reload
我会检查设置。
firewall-cmd --get-active-zone
重新启动 Redis 服务器
首先,启动Redis Server和Sentinel进程。顺序如下所示。
-
- 启动主服务器
-
- 启动副本服务器。如果有多台,顺序无关紧要。
-
- 启动主服务器的Sentinel
- 启动副本服务器的Sentinel。如果有多台,顺序无关紧要。
如果redis_1是主服务器,而redis_2和redis_3是副本服务器,则按照以下顺序进行操作。
Redis-1v –> Redis的1v版本
redis_1:/etc/redis# systemctl start redis-server
redis_1:/etc/redis# redis-cli --tls --cacert /etc/redis/tls/ca.crt ping
PONG
redis_1:/etc/redis# redis-cli --tls --cacert /etc/redis/tls/ca.crt role
1) "master"
2) (integer) 258540423
3) (empty array)
Redis-2v 可以用中文释义为”Redis-2v”。
redis_2:/etc/redis# systemctl start redis-server
redis_2:/etc/redis# redis-cli --tls --cacert /etc/redis/tls/ca.crt ping
PONG
redis_2:/etc/redis# redis-cli --tls --cacert /etc/redis/tls/ca.crt role
1) "slave"
2) "10.0.0.11"
3) (integer) 6379
4) "connected"
5) (integer) 258540493
Redis-3v 可以简化 Redis 的部署和管理。
redis_3:/etc/redis# systemctl start redis-server
redis_3:/etc/redis# redis-cli --tls --cacert /etc/redis/tls/ca.crt ping
PONG
redis_3:/etc/redis# redis-cli --tls --cacert /etc/redis/tls/ca.crt role
1) "slave"
2) "10.0.0.11"
3) (integer) 6379
4) "connected"
5) (integer) 258540619
HAproxy在主机上的检查
# redis-cli -h redis-1v --tls --cacert redis-nj_ca.crt role
1) "master"
2) (integer) 258541333
3) 1) 1) "10.0.0.12"
2) "6379"
3) "258541319"
2) 1) "10.0.0.13"
2) "6379"
3) "258541319"
# redis-cli -h redis-2v --tls --cacert redis-nj_ca.crt role
1) "slave"
2) "10.0.0.11"
3) (integer) 6379
4) "connected"
5) (integer) 258541333
# redis-cli -h redis-3v --tls --cacert redis-nj_ca.crt role
1) "slave"
2) "10.0.0.11"
3) (integer) 6379
4) "connected"
5) (integer) 258541347
启动 Redis Sentinel
redis_1# systemctl start redis-sentinel
redis_2# systemctl start redis-sentinel
redis_3# systemctl start redis-sentinel
HAproxy连接来自主机。
haproxy# redis-cli -h vlan-haproxy --tls --cacert /etc/haproxy/tls/redis-nj_ca.crt ping
PONG
haproxy# redis-cli -h vlan-haproxy --tls --cacert /etc/haproxy/tls/redis-nj_ca.crt role
1) "master"
2) (integer) 259155340
3) 1) 1) "10.0.0.12"
2) "6379"
3) "259155340"
2) 1) "10.0.0.13"
2) "6379"
3) "259155207"
来自客户的连接。
haproxy:~# ip -4 a show dev eth1
4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet 10.0.0.21/24 brd 10.0.0.255 scope global eth1
valid_lft forever preferred_lft forever
redisclient:~# redis-cli -h vlan-haproxy --tls --cacert redis-nj_ca.crt ping
PONG
redisclient:~# redis-cli -h vlan-haproxy --tls --cacert redis-nj_ca.crt role
1) "master"
2) (integer) 275843158
3) 1) 1) "10.0.0.12"
2) "6379"
3) "275843158"
2) 1) "10.0.0.13"
2) "6379"
3) "275843144"
将 Redis 的公共 IP 删除,并将其设为 VLAN Only。
redis-1v 的中文释义
之前

在此之后

/etc/systemd/network/05-eth0.network 的中文义原
在使用Linode的Network Helper时,它可以自动优化不同操作系统的网络设置,这是一个很方便的功能。但推荐在使用VLAN时将其禁用。要禁用Network Helper并进行网络设置,请按以下步骤操作。
[Match]
Name=eth0
[Network]
DHCP=no
Domains=members.linode.com
IPv6PrivacyExtensions=false
Address=10.0.0.11/24
Gateway=10.0.0.1
路由设置
如果ping命令无法执行,请检查路由设置。
redis_1:/etc/systemd/network# ip r
default via 10.0.0.1 dev eth0 proto static
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.11
“平也可运作。”
redis_1:/etc/systemd/network# ping linode.com
PING linode.com (69.164.200.202) 56(84) bytes of data.
64 bytes from www-loadbal2.linode.com (69.164.200.202): icmp_seq=1 ttl=48 time=50.0 ms
64 bytes from www-loadbal2.linode.com (69.164.200.202): icmp_seq=2 ttl=48 time=46.8 ms
如果您遇到DNS问题,请检查/etc/systemd/resolved.conf文件中的DNS设置。
Redis-2v 可以用中文如下进行重述:
Redis-2v
请确认 Cloud Console 上的 Configuration > Network 设置。请确保与 redis-1v 相同的 05-eth0.network 和 ip r 设置也正确无误。
之前

在后

/etc/systemd/network/05-eth0.network -> /etc/systemd/network/05-eth0.network
[Match]
Name=eth0
[Network]
DHCP=no
Domains=members.linode.com
IPv6PrivacyExtensions=false
Address=10.0.0.12/24
Gateway=10.0.0.1
Redis-3v 可以被翻译为 “Redis 第三版本”。
以母语汉语进行转述,仅提供一种选项:
在之后

来自客户的连接
redisclient:~# redis-cli -h vlan-haproxy --tls --cacert redis-nj_ca.crt
vlan-haproxy:6379> role
1) "master"
2) (integer) 286550827
3) 1) 1) "10.0.0.12"
2) "6379"
3) "286550827"
2) 1) "10.0.0.13"
2) "6379"
3) "286550827"
将HAProxy的公共IP删除,并改为仅VLAN模式。
之前

完成

客户发起的连接
redisclient:~# redis-cli -h vlan-haproxy --tls --cacert redis-nj_ca.crt ping
PONG
redisclient:~# redis-cli -h vlan-haproxy --tls --cacert redis-nj_ca.crt role
1) "master"
2) (integer) 286608397
3) 1) 1) "10.0.0.12"
2) "6379"
3) "286608264"
2) 1) "10.0.0.13"
2) "6379"
3) "286608264"
计划停止 Redis 主服务器。
通过 HAProxy 经过 Redis 客户端连接到 Redis 主服务器。
redisclient:~# redis-cli -h vlan-haproxy --tls --cacert redis-nj_ca.crt
vlan-haproxy:6379> role
1) "master"
2) (integer) 286765792
3) 1) 1) "10.0.0.12"
2) "6379"
3) "286765792"
2) 1) "10.0.0.13"
2) "6379"
3) "286765792"
vlan-haproxy:6379> set scott tiger
OK
vlan-haproxy:6379> get scott
"tiger"
停止正在运行的 redis_1 主服务器上的 redis-server。
redis_1:~# systemctl stop redis-server
Redis Server、HAProxy(vlan-haproxy)への接続のため、redis-cliからいくつかのコマンドを入力します。一時的に接続エラーが発生しましたが、その後、正常に動作しています。Redis Serverが切り替わるまでは、接続エラーが発生するはずですが、切り替わった後はHAProxyを介して正常に接続し、書き込みもできます。
vlan-haproxy:6379> role
Could not connect to Redis at vlan-haproxy:6379: SSL_connect failed: unexpected eof while reading
not connected> role
1) "master"
2) (integer) 286782638
3) 1) 1) "10.0.0.13"
2) "6379"
3) "286782505"
vlan-haproxy:6379> role
1) "master"
2) (integer) 286783170
3) 1) 1) "10.0.0.13"
2) "6379"
3) "286783037"
vlan-haproxy:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.0.0.13,port=6379,state=online,offset=286787720,lag=0
master_failover_state:no-failover
master_replid:d73bba0408b89d4481305c1a90cf2ee662079b32
master_replid2:7c0b274d9fa87ba0c2328927591112715b687d09
master_repl_offset:286787720
second_repl_offset:286781538
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:286550660
repl_backlog_histlen:237061
vlan-haproxy:6379> get scott
"tiger"
vlan-haproxy:6379> set scott lion
OK
vlan-haproxy:6379> get scott
"lion"
当Redis主服务器计划停止时,复制服务器将晋升为主服务器。通过HAProxy,Redis客户端始终能够连接到主服务器,无需关心主服务器的位置。

总结
