首页 > 代码库 > Redis 集群配置

Redis 集群配置

Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。集群的每个节点负责一部分hash槽。

这种结构很容易添加或者删除节点,并且无论是添加删除或者修改某一个节点,都不会造成集群不可用的状态。

使用哈希槽的好处就在于可以方便的添加或移除节点。当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了;当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了;在这一点上,我们以后新增或移除节点的时候不用先停掉所有的 redis 服务。

1、创建集群

1.1) 这里我们搭建一主一从的模式

也就是:

技术分享

然后在/data/program/redis-cluster目录下创建6个子目录,并在每个目录下添加redis.conf文件,关于如何安装redis可以参照我之前的Blog – Linux Redis 安装

  • 1000

/data/program/redis-cluster/1000

bind 192.168.74.128
port 1000
pidfile /data/program/redis-cluster/1000/redis_1000.pid
loglevel debug
logfile /data/program/redis-cluster/1000/redis_1000.log
## redis cluster ##
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
  • 1010

/data/program/redis-cluster/1010

bind 192.168.74.128
port 1010
pidfile /data/program/redis-cluster/1010/redis_1010.pid
loglevel debug
logfile /data/program/redis-cluster/1010/redis_1010.log
## redis cluster ##
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
  • 2000

/data/program/redis-cluster/2000

bind 192.168.74.128
port 2000
pidfile /data/program/redis-cluster/2000/redis_2000.pid
loglevel debug
logfile /data/program/redis-cluster/2000/redis_2000.log
## redis cluster ##
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
  • 2010

/data/program/redis-cluster/2010

bind 192.168.74.128
port 2010
pidfile /data/program/redis-cluster/2010/redis_2010.pid
loglevel debug
logfile /data/program/redis-cluster/2010/redis_2010.log
## redis cluster ##
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
  • 3000

/data/program/redis-cluster/3000

bind 192.168.74.128
port 3000
pidfile /data/program/redis-cluster/3000/redis_3000.pid
loglevel debug
logfile /data/program/redis-cluster/3000/redis_3000.log
## redis cluster ##
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
  • 3010

/data/program/redis-cluster/3000

bind 192.168.74.128
port 3010
pidfile /data/program/redis-cluster/3010/redis_3010.pid
loglevel debug
logfile /data/program/redis-cluster/3010/redis_3010.log
## redis cluster ##
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000

1.2) 并依次启动服务,然后查看是否都启动成功:

技术分享

1.3) 连接其中一个结点查看集群状态:

redis-cli -c -h 192.168.74.128 -p 1000

可以看到集群状态为fail.

技术分享

我们还可以使用**info**命令查看更多的信息。

$ 192.168.74.128:1000> info

1.4) 安装ruby

那么我们就需要使用redis作者为我们写的集群安装插件,因为这个脚本是ruby写的,而且我们需要使用到ruby gem管理包,所以我们安装的ruby版本必须是2.0以上。使用以下命令安装ruby,并查看ruby的版本(如果yum安装ruby不是2.0,可以手动安装)。

$ yum install ruby
$ ruby -v

gem命令安装redis包,增加redis-trib.rb调用redis的接口包。

gem install redis

1.5) 创建redis集群

到${redis_home}/src下运行安装redis集群命令:

./redis-trib.rb create --replicas 1 192.168.74.128:1000 192.168.74.128:2000 192.168.74.128:3000 192.168.74.128:1010 192.168.74.128:2010 192.168.74.128:3010

注意:replicas表示一台主服务器的从服务器台数,这里配置1表示一主一从,如果为0表示没有从服务。

技术分享

然后输入yes.

技术分享

出现以上命令就表示安装集群成功了。其中

  • M表示master,S表示slave。
  • 每条信息表示:
M/S nodeid 机器IP:端口 slots:(hash槽区间) (hash槽个数) master/slave

注意:从为0个hash槽,slave只是备份,缓解读的压力。

  • 一共是16384个hash槽.

而且再次查看集群状态我们可以看到:

$ cluster info

技术分享

而且我们还可以查看集群的节点:

$ cluster nodes

技术分享

并且当我们从结点1000操作redis,当插入key值为key1的时候,它会计算出hash槽属性2000结点,会自动转发到2000节点。

技术分享

2、添加节点

2.1、创建4000目录

在 /data/program/redis-cluster创建4000目录,并把1000目录下的redis文件copy到4000目录下。并把里面的配置文件改为如下:

/data/program/redis-cluster/4000

bind 192.168.74.128
port 4000
pidfile /data/program/redis-cluster/4000/redis_4000.pid
loglevel debug
logfile /data/program/redis-cluster/4000/redis_4000.log
## redis cluster ##
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000

然后启动。

2.2、添加节点

到${redis_home}/src运行添加命令节点命令

./redis-trib.rb add-node 192.168.74.128:4000 192.168.74.128:1000

表示把4000节点加入到1000结点所在的集群。

技术分享

看到以上内容就表示节点添加成功,查看4000节点集群状态:

# redis-cli -c -h 192.168.74.128 -p 1000
192.168.74.128:1000> cluster nodes

技术分享

然后4000节点成为一个主节点,但是4000节点并没有hash槽的区间,也就是4000节点在集群中并没有真正起作用。我们还需要分hash槽给4000节点。

2.3、reshard hash槽

2.3.1) 到${redis_home}/src运行reshard hash槽命令.

./redis-trib.rb reshard 192.168.74.128:1000

技术分享

2.3.2) 这里会提示选择move多少个hash槽。 输入 1000,然后它会提示:

What is the receiving node ID?

2.3.3) 表示哪个节点ID来的节点来接收这些hash槽,当然是4000节点的nodeid.也就是输入图片标注位置的值。

技术分享

2.3.4) 然后会出现

技术分享

  • all 表示所分配的hash槽来自于所有节点
  • done 表示所分配的hash槽配置你指定来源的nodes的id.

我们输入all.然后会提示你是否确定输入yes.

技术分享

2.3.5) 然后我们再去观察节点信息。

# redis-cli -c -h 192.168.74.128 -p 1000
192.168.74.128:1000> cluster nodes

技术分享

然后我们可以看到4000节点的hash槽区间包含3个段,而且很明显这些节点是来自于1000、2000、3000节点。

注意:如果分配给4000结点的hash槽之前如果有数据那么这些数据有会移动到4000结点。

3、删除节点

3.1) 把hash slots转出来,转到其他master节点上

./redis-trib.rb reshard 192.168.74.128:1000

3.2) 选择需要移动的hash槽

How many slots do you want to move (from 1 to 16384)?

输入 1000(4000结点的1000个)。

3.3) 输入接收的ID

技术分享

我们选择2000结点来接收4000结点的1000个hash槽。也就是输入以上标注的2000结点的nodeid.

3.4) 输入souce node(也就是4000结点nodeid)

技术分享

然后再输入done,回车。会出现以下画面。

技术分享

然后会提示你是否执行这个reshard计划,选择yes。它就会把4000节点的hash槽移动到2000节点去。

技术分享

3.5) 查看节点状态

# redis-cli -c -h 192.168.74.128 -p 1000
192.168.74.128:1000> cluster nodes

技术分享

然后我们可以看到4000节点并没有hash槽区间了,而我们的2000节点有3个hash槽区间了包括1000、3000节点移动到4000节点的hash槽区间,同样样包括它之前移动到4000节点的hash槽区间。

3.6) 删除节点

然后我们再去${redis_home}/src删除这个4000节点。

./redis-trib.rb del-node 192.168.74.128:4000 0aeb4f8f2af940880853193d338a70b033856a5b

技术分享

会提示删除节点成功。

3.7) 查看节点状态

# redis-cli -c -h 192.168.74.128 -p 1000
192.168.74.128:1000> cluster nodes

然后我们看到没有4000节点了,只有我们刚开始创建的6个节点信息。

技术分享

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

    Redis 集群配置