创建步骤
01. 准备环境
02. 下载安装 redis
03. 独立启动/停止 redis
- 1
- 2
- 1
- 2
04. 测试独立 redis
05. 建立集群环境
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
创建配置文件 ~/redis-cluster/redis.conf,内容如下:
文件中的 cluster-enabled 选项用于开实例的集群模式, 而 cluster-conf-file 选项则设定了保存节点配置文件的路径, 默认值为 nodes.conf。该节点配置文件无须人为修改,它由Redis集群在启动时自动创建, 并在有需要时自动进行更新。
若要让集群正常运作至少需要三个主节点,我们的环境中,每个主节点附带一个从节点,所以一共六个节点。
为每个节点创建配置文件
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
修改各个目录下的 redis.conf 文件中的 port 为各自对应的端口
06. 启动各个节点
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
查看redis的启动情况
07. 创建集群
现在我们已经有了六个正在运行中的 Redis 实例, 接下来我们需要使用这些实例来创建集群。
通过使用 Redis 集群命令行工具 redis-trib , 编写节点配置文件的工作可以非常容易地完成: redis-trib 位于 Redis 源码的 src 文件夹中, 它是一个 Ruby 程序, 这个程序通过向实例发送特殊命令来完成创建新集群, 检查集群, 或者对集群进行重新分片(reshared)等工作。这里通过create命令来创建集群。
- 1
- 2
- 1
- 2
说明:
这里的IP地址必须是真实的IP,不能使用回环 127.0.0.1 地址。
–replicas 1 即每一个master有1个slave;顺序为 m m m s s s
redis-trib 会打印出一份预想中的配置给你看, 如果你觉得没问题的话, 就可以输入 yes , redis-trib 就会将这份配置应用到集群当中,让各个节点开始互相通讯。
输入yes,然后配置完成。
以上信息的其中一部分可以通过向集群中的任意节点(主节点或者从节点都可以)发送 CLUSTER NODES 命令来获得。该命令还可以获得节点 ID , IP 地址和端口号, 标志(flag), 最后发送 PING 的时间, 最后接收 PONG 的时间, 连接状态, 节点负责处理的槽。
08. 集群检查
- 1
- 1
09. 连接Redis集群
通过上面的输出,我们可以看出Redis三个主节点的slot范围。一个 Redis 客户端可以向集群中的任意节点(包括从节点)发送命令请求。我们首先连接第一个节点:
虽然我们用Node ID来标识集群中的节点, 但是为了让客户端的转向操作尽可能地简单, 节点在 MOVED 错误中直接返回目标节点的 IP 和端口号, 而不是目标节点的 ID 。客户端应该记录槽15495由节点127.0.0.1:7003负责处理“这一信息, 这样当再次有命令需要对槽15495执行时, 客户端就可以加快寻找正确节点的速度。这样,当集群处于稳定状态时,所有客户端最终都会保存有一个哈希槽至节点的映射记录,使得集群非常高效: 客户端可以直接向正确的节点发送命令请求, 无须转向、代理或者其他任何可能发生单点故障(single point failure)的实体(entiy)。
10. 添加新master节点
a. 启动节点
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
b. 将节点加入到集群
- 1
- 1
说明:
第一个 ip:port 为新节点
第二个 ip:port 是任意一个已经存在的节点
新节点没有包含任何数据,也没有包含任何slot。
当集群需要将某个从节点升级为新的主节点时, 这个新节点不会被选中,同时新的主节点因为没有包含任何slot,不参加选举和failover。
c. 为新节点分配 slot
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
11. 添加新的 Slave 节点
a. 启动节点
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
b. 将节点加入到集群
方法一:
- 1
- 1
说明:
第一个 ip:port 为新节点
第二个 ip:port 是任意一个已经存在的节点
新的节点会作为集群中其中一个主节点的从节点,一般来说是从节点最少的主节点。
方法二:
- 1
- 1
说明:
-master-id xxxx 主节点的 ID
第一个 ip:port 为新节点
第二个 ip:port 是任意一个已经存在的节点
注意:在线添加slave 时,需要bgsave整个master数据,并传递到slave,再由 slave加载rdb文件到内存,rdb生成和传输的过程中消耗Master大量内存和网络IO,以此不建议单实例内存过大,线上小心操作。
12. 在线 reshard 数据
对于负载/数据不均匀的情况,可以在线reshard slot来解决,方法与添加新master的reshard一样,只是需要reshard的master节点是已存在的老节点。
- 1
- 1
13. 删除一个 slave 节点
- 1
- 2
- 1
- 2
说明:
ip:port 集群中已有的任意一节点(不是被删除的节点)
被删除节点的 ID
14. 删除一个 master 节点(7003)
删除master节点之前首先要使用reshard移除master的全部slot,然后再删除当前节点。 (目前redis-trib.rb只能把被删除master的slot对应的数据迁移到一个节点上)。
a. 迁移 slot
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
b. 删除空的 master 节点
- 1
- 1
说明:
ip:port 集群中已有的任意一节点(不是被删除的节点)
被删除节点的 ID
15. 改变从节点的隶属关系(从节点 7013)
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
16. 集群的关闭和重启
redis cluster官方文档,没发现有关集群重启和关闭的方法。主要是因为在正式的环境中集群一般都由3台物理机构成,3台物理机同时挂掉的可能性极小。只要不同时挂掉,挂掉的机器修复后在加入集群,集群都能良好的运作,万一同时挂掉,数据又没有备份的话,就有大麻烦了。
redis cluster集群中的节点基本上都对等的,没有管理节点。如果要让所有节点都关闭,只能关闭所有 redis-server 进程。
- 1
- 1
然后重新启动,如果直接重启会报告错误。
- 1
- 1
会报以下错误,
- 1
- 1
第一次启动集群时,~/redis-cluster/7001/ 下只有 redis.conf,而现在重启时,此目录下有了别的文件,所有报错。简单的方法是将除了 redis.conf 外的其他文件全部删除,在启动肯定是可以的,但是集群是有数据的,所以需要保留了配置文件 redis.conf 和数据文件 *.rdb。
这样是可以启动的,但是原来的数据还是丢失了,不知道是自己的想法不对。
需要注意的问题
-
执行06步骤时,节点目录下(7001/7002/…/7013/ 应当只有 redis.conf 文件)
-
一定要严格执行 01 步骤准备好环境。
此步骤中 gem sources 默认地址好像无法访问,建议用下面方法替换
在安装redis集群中可能会出现的问题以及解决方案如下:
执行命令:./redis-trib.rb create --replicas 1 127.0.0.1:6800 127.0.0.1:6801 127.0.0.1:6802 127.0.0.1:6803 127.0.0.1:6804 127.0.0.1:6805时,出现问题:
问题1:
RubyGems 2.6.12 installedERROR: While executing gem ... (Gem::DocumentError) RDoc is not installed: no such file to load -- rdoc/rdoc
解决:
1.安装ruby软件包
[root@redis ~]#yum -y install ruby
2.安装rubygems软件包
[root@redis ~]#tar -zxvf rubygems-2.6.12.tgz
[root@redis ~]# cd rubygems-2.6.12
[root@redis rubygems-2.2.2]# ls
bin History.txt MIT.txt test
CVE-2013-4287.txt lib Rakefile UPGRADING.rdoc
CVE-2013-4363.txt LICENSE.txt README.rdoc util
hide_lib_for_update Manifest.txt setup.rb
[root@redis rubygems-2.2.2]# ruby setup.rb
此处,出现了第二个问题:
问题2:
While executing gem ... (Gem::DocumentError) RDoc is not installed: no such file to load -- rdoc
解决: [root@redis ~]#yum install ruby-rdoc
接着执行命令:./redis-trib.rb create --replicas 1 127.0.0.1:6800 127.0.0.1:6801 127.0.0.1:6802 127.0.0.1:6803 127.0.0.1:6804 127.0.0.1:6805
报错:/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:55:in `gem_original_require': no such file to load -- redis (LoadError)
from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
from ./redis-trib.rb:25
解决:yum install -y rubygems
接着执行:./redis-trib.rb create --replicas 1 127.0.0.1:6800 127.0.0.1:6801 127.0.0.1:6802 127.0.0.1:6803 127.0.0.1:6804 127.0.0.1:6805
报错:
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- redis (LoadError)
from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
from ./redis-trib.rb:25
解决:gem install redis
接着执行:./redis-trib.rb create --replicas 1 127.0.0.1:6800 127.0.0.1:6801 127.0.0.1:6802 127.0.0.1:6803 127.0.0.1:6804 127.0.0.1:6805
出现:
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:6800
127.0.0.1:6801
127.0.0.1:6802
Adding replica 127.0.0.1:6803 to 127.0.0.1:6800
Adding replica 127.0.0.1:6804 to 127.0.0.1:6801
Adding replica 127.0.0.1:6805 to 127.0.0.1:6802
M: f6980c8f40d777175090007abc7edbaca8c360a7 127.0.0.1:6800
slots:0-5460 (5461 slots) master
M: 40d10b0c47431f2e02a3c1cef36a8e14f6861cc8 127.0.0.1:6801
slots:5461-10922 (5462 slots) master
M: e97c8defa07e679b9bd95d0015247a9833342f49 127.0.0.1:6802
slots:10923-16383 (5461 slots) master
S: b3232105d439e545e43235bc1b8f0ff263a29534 127.0.0.1:6803
replicates f6980c8f40d777175090007abc7edbaca8c360a7
S: bac5f3e53982e521d5e143ed2dfbce7fbbe92623 127.0.0.1:6804
replicates 40d10b0c47431f2e02a3c1cef36a8e14f6861cc8
S: 80b48929a861db1de6baa4330baceadefc617651 127.0.0.1:6805
replicates e97c8defa07e679b9bd95d0015247a9833342f49
Can I set the above configuration? (type 'yes' to accept):
然后输入:y
至此,结束
最后,添加一篇博客,可能会对解决这个问题有帮助:http://blog.youkuaiyun.com/asas1314/article/details/50203923