快速搭建高可用Redis集群

在开始搭建 Redis 集群之前,首先要明确集群节点的数量。集群正常运作至少需要三个主节点,为了增加集群的可访问性,Redis 官方推荐的方案是配置主从结构,即一个主节点,配置多个从节点,当某一主节点宕掉,集群会根据选举算法从该主节点下的从节点中选择一个节点提升为主节点,从而保证集群正常运行。

本文是使用六个 Redis 节点来搭建集群,其中三个为主节点, 而其余三个则是各个主节点的从节点。这些节点可以部署在多台独立的服务器上也可以部署在一台服务器上。我们这里使用 3 台服务器,IP 地址分别为: 192.168.0.157、192.168.0.98、192.168.0.88,每台服务器启动两个节点,只要端口不同就可以,物理部署图如下:

Redis 集群部署图

集群节点规划好了,现在可以开始部署集群,详细步骤如下:

  1. 连接服务器 192.168.0.157,安装 Redis(版本3.2.8)
    创建 Redis 安装目录
sudo mkdir /usr/local/redis-3.2.8/

下载 Redis 源码到目录 /usr/local/src

$ cd /usr/local/src
$ sudo wget http://download.redis.io/releases/redis-3.2.8.tar.gz

解压下载的压缩包

$ sudo tar xzf redis-3.2.8.tar.gz

编译源码并安装到目录 /usr/local/redis-3.2.8/

$ cd redis-3.2.8
$ sudo make PREFIX=/usr/local/redis-3.2.8 install

安装完成后,二进制文件是在 /usr/local/redis-3.2.8/bin 目录下

  1. 规划节点对应的端口号。由于一台机器需要部署两个节点,需要用端口号进行区分,这个端口号可以自由定义,这里使用的端口号为 6379 和 6380。

  2. 创建 Redis 节点的数据文件存储目录(以端口号命名)

sudo mkdir -p /usr/redisdb/6379/ /usr/redisdb/6380/
  1. 将目录 /usr/local/src/redis-3.2.8/ 下的 Redis 配置文件 redis.conf 复制到刚新增的文件夹 6379 下,
sudo cp /usr/local/src/redis-3.2.8/redis.conf /usr/redisdb/6379/

修改相关配置:

sudo vim /usr/redisdb/6379/redis.conf

修改内容如下:

# 对应机器的IP
bind 192.168.0.157
# 对应端口号
port 6379
# 以守护进程的方式启动
daemonize yes
# 开实例的集群模式
cluster-enabled yes
# 保存节点配置文件的路径
cluster-config-file nodes-6379.conf
# 节点超时时间
cluster-node-timeout 15000
# 是否开启 appendonlylog
appendonly yes
# 集群 16384 个槽是否需要全部覆盖,若为 yes,则只要槽没有被覆盖,整个集群就全部停止对外服务
cluster-require-full-coverage no

文件中的 cluster-enabled 选项用于开实例的集群模式,而 cluster-config-file 选项则设定了保存节点配置文件的路径,默认值为 nodes.conf。节点配置文件无须人为修改,它由 Redis 集群在启动时创建,并在有需要时自动进行更新。

  1. 同样地,将目录 /usr/local/src/redis-3.2.8/ 下的 Redis 配置文件 redis.conf 复制到文件夹 6380 下,
sudo cp /usr/local/src/redis-3.2.8/redis.conf /usr/redisdb/6380/

修改相关配置:

sudo vim /usr/redisdb/6380/redis.conf

修改内容如下:

# 对应机器的IP
bind 192.168.0.157
# 对应端口号
port 6380
# 以守护进程的方式启动
daemonize yes
# 开实例的集群模式
cluster-enabled yes
# 保存节点配置文件的路径
cluster-config-file nodes-6380.conf
# 节点超时时间
cluster-node-timeout 15000
# 是否开启 appendonlylog
appendonly yes
# 集群 16384 个槽是否需要全部覆盖,若为 yes,则只要槽没有被覆盖,整个集群就全部停止对外服务
cluster-require-full-coverage no
  1. 启动 Redis 实例
/usr/local/redis-3.2.8/bin/redis-server /usr/redisdb/6379/redis.conf
/usr/local/redis-3.2.8/bin/redis-server /usr/redisdb/6380/redis.conf
  1. 分别连接服务器 192.168.0.88、192.168.0.98,重复步骤 1 - 6。

  2. 现在已经有了 6 个正在运行中的 Redis 实例, 本文是通过使用 Redis 集群命令行工具 redis-trib 来创建集群。该命令行工具位于 Redis 源码的 src 文件夹中(/usr/local/src/redis-3.2.8/src/redis-trib.rb), 它是一个 Ruby 程序,要运行该工具,需要安装 Ruby 的运行环境。
    安装ruby

sudo apt-get install ruby

输入 Y 确认后,将开始安装 Ruby。完成后,可以通过以下命令检查安装是否成功。

ruby -v

若输出以下内容,则说明安装已经成功了。

ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux]

若输出以下内容,则说明安装失败。

The program 'ruby' can be found in the following packages:
 * ruby
 * ruby1.8
Try: sudo apt-get install <selected package>

要运行命令行工具 redis-trib,还需要引用安装以下 Ruby 包:

sudo gem install redis

现在直接运行该命令行工具:

/usr/local/src/redis-3.2.8/src/redis-trib.rb 

结果如图:


redis-trib 运行结果图
  1. 安装好 Ruby 的运行环境后,现在就可以通过命令行工具 redis-trib 来创建集群了。
    命令如下:
/usr/local/src/redis-3.2.8/src/redis-trib.rb create --replicas 1 192.168.0.157:6379 192.168.0.157:6380 192.168.0.88:6379 192.168.0.88:6380 192.168.0.98:6380 192.168.0.98:6379

该命令在这里用于创建一个新的集群,选项 –replicas 1 的意思是每个主节点有 1 个从节点,之后跟着的参数是这个集群实例的地址列表。redis-trib 会打印出一份预想中的配置给你看,如下图:


集群配置信息

如果你觉得没问题的话, 就可以输入 yes , redis-trib 就会将这份配置应用到集群当中,让各个节点开始互相通讯,最后可以得到如下信息:

[OK] All 16384 slots covered

不过,我们除了希望为集群中的每个主节点创建一个从节点外,还希望同一组节点不要部署在同一台服务器上,以防止这台服务器出现故障导致整个集群不可用。但上面命令行工具 redis-trib 推荐的配置中,节点 192.168.0.98:6380 和节点
192.168.0.98:6379 互为主从,在同一台服务上。
为了达到我们想要的配置,我们可以优先配置 3 个主节点,再接着配置主节点对应的从节点:

/usr/local/src/redis-3.2.8/src/redis-trib.rb create 192.168.0.157:6379 192.168.0.98:6379 192.168.0.88:6379
Redis 集群配置信息

输入 yes,如图:


集群三个节点配置成功

“All 16384 slots covered” 表示集群中的 16384 个槽都有对应的主节点在处理, 集群运作正常。
接下来继续配置各个主节点的从节点,
配置主节点 192.168.0.157:6379 的从节点(192.168.0.88:6380):

/usr/local/src/redis-3.2.8/src/redis-trib.rb add-node --slave --master-id 723906b97713083964812b35baec8b3dfaf31f48 192.168.0.88:6380 192.168.0.157:6379

该命令在这里用于给主节点添加从节点,选项 --slave 表示添加的节点是从节点,--master-id 是主节点的 id,192.168.0.88:6380 是新节点的地址(IP 和端口),192.168.0.157:6379 是集群中的已有节点(可以是任意的一个),目的是指定哪个 Redis 集群。
运行结果如下:


配置从节点

配置主节点 192.168.0.88:6379 的从节点(192.168.0.98:6380):

/usr/local/src/redis-3.2.8/src/redis-trib.rb add-node --slave --master-id 16c069db410c4f9190e02d4aa466170243acae75 192.168.0.98:6380 192.168.0.157:6379

结果如下:


配置从节点

配置主节点 192.168.0.98:6379 的从节点(192.168.0.157:6380):

/usr/local/src/redis-3.2.8/src/redis-trib.rb add-node --slave --master-id 63d27c84242c87a93909ba34ea61094a76024ab6 192.168.0.157:6380 192.168.0.157:6379

结果如下:


配置从节点
  1. 检查集群状态:
/usr/local/src/redis-3.2.8/src/redis-trib.rb check 192.168.0.157:6379

如图:


集群当前状态

集群各个节点的当前状态以及它们正在负责的任务如下表:

节点 角色 状态 任务
192.168.0.157:6379 主节点 在线 负责处理槽(0 - 5460)
192.168.0.88:6380 从节点 在线 复制节点(192.168.0.157:6379)
192.168.0.88:6379 主节点 在线 负责处理槽(10923 - 16383)
192.168.0.98:6380 从节点 在线 复制节点(192.168.0.88:6379)
192.168.0.98:6379 主节点 在线 负责处理槽(5461 - 10922)
192.168.0.157:6380 从节点 在线 复制节点(192.168.0.98:6379)

至此,整个 Redis 集群已经搭建完成。但在生产环境中,可能需要根据具体情况做调整,比如一个主节点对应多个从节点等。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容