Redis 集群配置
Posted carl-zhao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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个节点信息。
以上是关于Redis 集群配置的主要内容,如果未能解决你的问题,请参考以下文章