在开始搭建 Redis 集群之前,首先要明确集群节点的数量。集群正常运作至少需要三个主节点,为了增加集群的可访问性,Redis 官方推荐的方案是配置主从结构,即一个主节点,配置多个从节点,当某一主节点宕掉,集群会根据选举算法从该主节点下的从节点中选择一个节点提升为主节点,从而保证集群正常运行。
本文是使用六个 Redis 节点来搭建集群,其中三个为主节点, 而其余三个则是各个主节点的从节点。这些节点可以部署在多台独立的服务器上也可以部署在一台服务器上。我们这里使用 3 台服务器,IP 地址分别为: 192.168.0.157、192.168.0.98、192.168.0.88,每台服务器启动两个节点,只要端口不同就可以,物理部署图如下:
集群节点规划好了,现在可以开始部署集群,详细步骤如下:
- 连接服务器 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 目录下
规划节点对应的端口号。由于一台机器需要部署两个节点,需要用端口号进行区分,这个端口号可以自由定义,这里使用的端口号为 6379 和 6380。
创建 Redis 节点的数据文件存储目录(以端口号命名)
sudo mkdir -p /usr/redisdb/6379/ /usr/redisdb/6380/
- 将目录 /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 集群在启动时创建,并在有需要时自动进行更新。
- 同样地,将目录 /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
- 启动 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
分别连接服务器 192.168.0.88、192.168.0.98,重复步骤 1 - 6。
现在已经有了 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
结果如图:
- 安装好 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
输入 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
结果如下:
- 检查集群状态:
/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 集群已经搭建完成。但在生产环境中,可能需要根据具体情况做调整,比如一个主节点对应多个从节点等。