构建 Redis 集群和故障转移验证

首先

在Redis Cluster中进行了故障转移行为的验证,作为验证时的备忘记录,记录了环境搭建和验证结果备忘录。

1. 创建Redis集群

1.1 安装 Redis

本次我们将在Mac环境下进行验证,需要使用homebrew等方式进行安装。
安装的方法可以通过谷歌搜索来得到,因此省略不提。

安装完成后,请执行以下操作以确认启动是否成功。

# Redisサーバをバックグラウンドで起動させる
# オプションを指定しない場合、デフォルトの「」が参照される
# デフォルトのポート番号は「6379」
$ redis-server --daemonize yes
# RedisCLIを起動させpingコマンドを実行し、PONGが返ってくるのを確認する
$ redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> exit
# Redisサーバの停止
$ redis-cli shutdown

1.2 Redis-Cluster的构建和启动

如果要构建Redis集群,至少需要6台机器。
这次我们只在一台机器上构建集群,通过不同的端口号启动Redis并构建集群。
在构建时,我们复制默认的(如果是Mac Homebrew安装的情况)/usr/local/etc/redis.conf文件,并创建6个文件,命名为redis-[端口号].conf,并将它们放置在/redis/conf/中,并进行配置的添加和修改。

    ディレクトリ構成
/redis
  ├ log
  ├ conf
  ├ pid
  └ work
    configファイルの設定内容
# Working Directory
dir /redis/work/
# ポート番号(今回だと7000~7005をそれぞれに設定する)
port XXXX
# PIDファイル
pidfile /redis/work/pid/redis-[ポート番号].pid
# ログファイル
logfile "/redis/log/redis-[ポート番号].log"
# DBファイル
dbfilename dump-[ポート番号].rdb
# AOFモードOn/Off設定
appendonly yes
# AppendOnlyFile
appendfilename "appendonly-[ポート番号].aof"
# クラスターモードOn/Off設定
cluster-enabled yes
# クラスター設定ファイル名
cluster-config-file cluster-config-[ポート番号].conf
# ReidsClusterのnode間通信におけるタイムアウト設定 (ミリ秒)
cluster-node-timeout=1000

创建文件后,启动6个Redis实例,并使用redis-cli命令构建集群。
构建Redis集群的方法包括使用redis-cli的–cluster create命令或redis-trib.rb等工具。
redis-trib.rb从Redis 3.0开始可用,通常使用redis-trib.rb是常见做法,但由于这次目的是进行故障转移验证,因此可以通过简单地使用–cluster create命令来构建集群。

# 作成した6ファイルを指定し、Redisサーバを6台起動させる
$ redis-server /redis/conf/redis-7000.conf --daemonize yes
$ redis-server /redis/conf/redis-7001.conf --daemonize yes
$ redis-server /redis/conf/redis-7002.conf --daemonize yes
$ redis-server /redis/conf/redis-7003.conf --daemonize yes
$ redis-server /redis/conf/redis-7004.conf --daemonize yes
$ redis-server /redis/conf/redis-7005.conf --daemonize yes
# Redis-Clusterの構築
$ redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 \
127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
# クラスタ作成時の標準出力は省略

检查集群的状态,如果有三个主节点和三个从节点正在运行,则表示OK。
如果使用cluster create命令来构建集群,则Master/Slave节点的分配将是随机设置的。
在本例中,集群是按以下配置构建的。

Redisノード構成.png
# クラスタ構成の場合-pオプションで接続先ポートを指定しないと接続エラーとなるので接続先ポートを指定する
$ redis-cli -p 7000 cluster nodes
dd5f9cd86a1758e6d88a5e5d2496f8f295cfccbf 127.0.0.1:7001@17001 master - 0 1605445940617 2 connected 5461-10922
bb439ff10930780ad6cbd11a72136728f718dcf9 127.0.0.1:7000@17000 myself,master - 0 1605445940000 1 connected 0-5460
5a3976ef7bf2656714cbbd54d9f42e5da5c8747c 127.0.0.1:7005@17005 slave dd5f9cd86a1758e6d88a5e5d2496f8f295cfccbf 0 1605445940822 2 connected
09fbbd23ec43cb1189319c819111fbbf57f080cf 127.0.0.1:7003@17003 slave 130464b52347bb3ac76c090ec6ca7a4232451d65 0 1605445940822 3 connected
d2fd5916251ac934ede4a32d95e8c68cae741a42 127.0.0.1:7004@17004 slave bb439ff10930780ad6cbd11a72136728f718dcf9 0 1605445940617 1 connected
130464b52347bb3ac76c090ec6ca7a4232451d65 127.0.0.1:7002@17002 master - 0 1605445940720 3 connected 10923-16383

2. 对Redis-Cluster的故障转移验证进行测试

2.1:主节点异常

如果Redis集群的主节点发生故障或其他问题,将会检测到该故障并进行故障转移(切换主从角色)。
故障转移所需的时间取决于redis.conf的cluster-node-timeout参数设置值。
在将每个节点的cluster-node-timeout设置为1秒、15秒和30秒的情况下,我们模拟了故障,并进行了测量以计算完成主/从切换所需的时间。

通过以1秒的间隔运行redis-cli的”cluster nodes”指令,来测量切换时间,并通过人为关闭Master节点的进程来模拟故障。

测量结果如下表所示。

cluster-node-timeoutの設定値フェイルオーバー完了までの時間1秒3秒15秒21秒30秒35秒

在设置 cluster-node-timeout=15秒 时, cluster nodes 命令的执行结果如下:大约在 Master 进程被终止后的 15 秒左右,检测到了 Master 节点的异常,并在此后的 4 秒内完成了 Master/Slave 的切换。

# ポート7000/7004以外のノード情報は省略
==========================================
== 22:57:44
# 22:57:44に7000ポートのノードのプロセスをkill
Kill Process redis-server 127.0.0.1:7000
==========================================
== 22:57:44
bb439ff10930780ad6cbd11a72136728f718dcf9 127.0.0.1:7000@17000 master - 0 1605448662626 8 disconnected 0-5460
d2fd5916251ac934ede4a32d95e8c68cae741a42 127.0.0.1:7004@17004 slave bb439ff10930780ad6cbd11a72136728f718dcf9 0 1605448664658 8 connected
==========================================
== 22:58:00
bb439ff10930780ad6cbd11a72136728f718dcf9 127.0.0.1:7000@17000 master - 1605448665679 1605448662626 8 disconnected 0-5460
d2fd5916251ac934ede4a32d95e8c68cae741a42 127.0.0.1:7004@17004 slave bb439ff10930780ad6cbd11a72136728f718dcf9 0 1605448680033 8 connected
==========================================
== 22:58:01
# 7000ポートのノードの状態が「fail?」に変化
bb439ff10930780ad6cbd11a72136728f718dcf9 127.0.0.1:7000@17000 master,fail? - 1605448665679 1605448662626 8 disconnected 0-5460
d2fd5916251ac934ede4a32d95e8c68cae741a42 127.0.0.1:7004@17004 slave bb439ff10930780ad6cbd11a72136728f718dcf9 0 1605448680033 8 connected
==========================================
== 22:58:04
# 7000ポートのノードの状態が「fail」に変化
bb439ff10930780ad6cbd11a72136728f718dcf9 127.0.0.1:7000@17000 master,fail - 1605448665679 1605448662626 8 disconnected 0-5460
d2fd5916251ac934ede4a32d95e8c68cae741a42 127.0.0.1:7004@17004 slave bb439ff10930780ad6cbd11a72136728f718dcf9 0 1605448684155 8 connected
==========================================
== 22:58:05
# ポート7000/7004のMaster/Slaveが切り替わる
bb439ff10930780ad6cbd11a72136728f718dcf9 127.0.0.1:7000@17000 master,fail - 1605448665679 1605448662626 8 disconnected
d2fd5916251ac934ede4a32d95e8c68cae741a42 127.0.0.1:7004@17004 master - 0 1605448684155 9 connected 0-5460
==========================================

通过2.2版本的手动故障转移命令进行故障转移。

不仅仅可以通过Redis的Master节点故障来实现自动故障转移,还可以通过redis-cli命令手动强制进行故障转移。
如果要进行手动故障转移,可以在Slave节点的机器上执行故障转移命令,从而实现Master和Slave的切换。

# クラスターフェイルオーバーコマンド
$ redis-cluster -p <Slaveノードのポート番号> cluster failover

这次将进行手动故障切换实验,验证从执行手动故障切换到实际完成(主/从切换)所需的时间。验证方法与“2. Redis-Cluster故障切换验证”相同,以1秒间隔执行redis-cli的cluster nodes命令,并通过执行culster failover命令触发故障切换。
验证结果如下表所示,无论cluster-node-timeout的设置值如何,都确认能即时切换。

cluster-node-timeoutの設定値フェイルオーバー完了までの時間1秒1秒15秒1秒30秒1秒

在验证过程中,集群节点命令的执行结果如下所示。可以确认在执行故障转移命令后,主节点和从节点在1秒内成功切换。

==========================================
== 22:36:18
# 22:36:18にredis-cliのフェイルオーバーコマンドを実行
Redis Command Failover Eexecute.
==========================================
== 22:36:18
bb439ff10930780ad6cbd11a72136728f718dcf9 127.0.0.1:7000@17000 master - 0 1605447378364 1 connected 0-5460
d2fd5916251ac934ede4a32d95e8c68cae741a42 127.0.0.1:7004@17004 slave bb439ff10930780ad6cbd11a72136728f718dcf9 0 1605447378159 1 connected
==========================================
== 22:36:19
# ポート7000/7004のMaster/Slaveが切り替わる
bb439ff10930780ad6cbd11a72136728f718dcf9 127.0.0.1:7000@17000 slave d2fd5916251ac934ede4a32d95e8c68cae741a42 0 1605447379388 7 connected
d2fd5916251ac934ede4a32d95e8c68cae741a42 127.0.0.1:7004@17004 master - 0 1605447379696 7 connected 0-5460
==========================================

2.3 结果总结

2.3 结果概述

    • ノード障害発生時のフェイルオーバー完了までにかかる時間はcluster-node-timeoutの設定値に依存する。

cluster failoverによるフェイルオーバーは即時切り替わりであり、cluster-node-timeoutの設定値に依存しない。

请提供用于参考的资料。

    • https://www.sraoss.co.jp/tech-blog/redis/redis-cluster/

 

    • https://runebook.dev/ja/docs/redis/cluster-forget

 

    https://www.sraoss.co.jp/tech-blog/redis/redis-persistdata/
广告
将在 10 秒后关闭
bannerAds