一、基本概念
1、redis 集群是一个可以在多个节点之间进行数据共享的设施。redis 集群提供了以下两个好处 1.1 将数据自动切分 (split) 到多个节点 1.2 当集群中的某一个节点故障时,redis 还可以继续处理客户端的请求。
2、一个 Redis 集群包含 16384 个哈希槽(hash slot),数据库中的每个数据都属于这 16384 个哈希槽中的一个。集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽。集群中的每一个节点负责处理一部分哈希槽。这样的话就可以很方便的向集群中添加或者移除节点。(假设集群中有 A B C 三个节点)
2.1 添加节点:如果要添加一个 D 节点到集群中,首先要把这个节点添加到集群,然后还需要将节点 ABC 中的某些哈希槽移动到节点 D。2.2 移除节点:如果要移除节点 A,那么只需要把节点 A 中的所有哈希槽转移到节点 B 和节点 C 中,然后再移除空白节点 A 就可以了。
3、集群中的主从复制集群中的每个节点都有 1 个至 N 个复制品,其中一个为主节点,其余的为从节点,如果主节点下线了,集群就会把这个主节点的一个从节点设置为新的主节点,继续工作。这样集群就不会因为一个主节点的下线而无法正常工作。注意:如果某一个主节点和他所有的从节点都下线的话,redis 集群就会停止工作了。
4、redis 集群不保证数据的强一致性,在特定的情况下,redis 集群会丢失已经被执行过的写命令
4.1 使用异步复制(asynchronous replication)是 Redis 集群可能会丢失写命令的其中一个原因
4.2 网络原因,如果网络断开时间太长,redis 集群就会启用新的主节点,之前发给主节点的数据就会丢失。
二、redis cluster 搭建
要让集群正常工作至少需要 3 个主节点,在这里我们要创建 6 个 redis 节点,其中三个为主节点,三个为从节点,对应的 redis 节点的 ip 和端口对应关系如下
192.168.137.174:6379192.168.137.174:6380
192.168.137.174:6381
192.168.137.174:6382
192.168.137.174:6383
192.168.137.174:6384
1:安装 redis
- wget http://download.redis.io/releases/redis-3.2.9.tar.gz
- tar -xzvf redis-3.2.9.tar.gz -C /usr/local
- cd /usr/local/redis-3.2.9
- make
- 如果报错,可以参考http: //www.cnblogs.com/hd3013779515/p/6914374.html
2:创建集群需要的目录(一台机器上模拟 6 个实例)
mkdir -p /usr/local/redis-cluster
cd /usr/local/redis-cluster
mkdir 6379
mkdir 6380
mkdir 6381
mkdir 6382
mkdir 6383
mkdir 6384
备注: 要让集群正常运作至少需要三个主节点
3:修改配置文件 redis.conf
cp /usr/local/redis-3.2.9/redis.conf /usr/local/redis-cluster
vi redis.conf
## 修改配置文件中的下面选项
port 6379
bind 192.168.137.174
daemonize yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
## 修改完 redis.conf 配置文件中的这些配置项之后把这个配置文件分别拷贝到 6379~6384 目录下面
cp /usr/local/redis-cluster/redis.conf /usr/local/redis-cluster/6379
## 注意:拷贝完成之后要修改 6379~6384 目录下面 redis.conf 文件中的 port 参数,分别改为对应的文件夹的名称
4:分别启动这 6 个 redis 实例
cd /usr/local/redis-cluster/6379/
/usr/local/redis-3.2.9/src/redis-server redis.conf
cd /usr/local/redis-cluster/6380/
/usr/local/redis-3.2.9/src/redis-server redis.conf
cd /usr/local/redis-cluster/6381/
/usr/local/redis-3.2.9/src/redis-server redis.conf
cd /usr/local/redis-cluster/6382/
/usr/local/redis-3.2.9/src/redis-server redis.conf
cd /usr/local/redis-cluster/6383/
/usr/local/redis-3.2.9/src/redis-server redis.conf
cd /usr/local/redis-cluster/6384/
/usr/local/redis-3.2.9/src/redis-server redis.conf
注意:一定先进入 6379~6384 目录,然后再启动服务,服务启动后自动生成 appendonly.aof,nodes.conf 文件。
## 启动之后使用命令查看 redis 的启动情况 ps -ef|grep redis
如下图显示则说明启动成功
5:执行 redis 的创建集群命令创建集群
cd /usr/local/redis-3.2.9/src
./redis-trib.rb create --replicas 1 192.168.137.174:6379 192.168.137.174:6380 192.168.137.174:6381 192.168.137.174:6382 192.168.137.174:6383 192.168.137.174:6384
注意: replicas 是给 master 分配 slave 个数的参数,我们给的参数是 1 ,那每个 master 就有一个从节点.
5.1 执行上面的命令的时候可能会报错,因为是执行的 ruby 的脚本,需要 ruby 的环境
错误内容: /usr/bin/env: ruby: No such file or directory
所以需要安装 ruby 的环境,这里推荐使用 yum install ruby 安装
yum install ruby |
5.2 然后再执行第 5 步的创建集群命令,可能还会报错,提示缺少 rubygems 组件,使用 yum 安装
错误内容:
./redis-trib.rb:24:in `require': no such file to load -- rubygems (LoadError)
from ./redis-trib.rb:24
yum install rubygems |
5.3 再次执行第 5 步的命令,可能还会报错,提示不能加载 redis,是因为缺少 redis 和 ruby 的接口,使用 gem 安装
错误内容:
/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 |
注意: 若公司有代理,通过 gem install --http-proxy http://proxy.xxx.com:8080 redis 模式安装,红色部分是公司的代理
5.4 再次执行第 5 步的命令,正常执行
输入 yes,然后配置完成。
至此 redis 集群即搭建成功!
6:使用 redis-cli 命令进入集群环境
/usr/local/redis-3.2.9/src/redis-cli -c -h 192.168.137.174 -p 6379 |
备注: -c 表示 cluster 模式进入,-p 指定集群某个端口号
登录集群后,然后进行验证:
7: 查看集群中的所有节点信息
/usr/local/redis-3.2.9/src/redis-cli -h 192.168.137.174 -p 6379 cluster nodes [| grep master]
8: 通过 check cluster 的一个节点,就知道整个集群的状况
/usr/local/redis-3.2.9/src/redis-trib.rb check 192.168.137.174:6379
默认情况下不能从 slaves 读取数据,但建立连接后,执行一次命令 READONLY,该 slaves 即可读取数据。
否则只能以 redis-cli -c -h -p 命令登录 -c 是以集群方式
cluster-enabled yes 集群开关,默认是不开启集群模式。
cluster-config-file nodes-6379.conf 集群配置文件的名称,每个节点都有一个集群相关的配置文件,持久化保存集群的信息。这个文件并不需要手动配置,这个配置文件有 Redis 生成并更新,每个 Redis 集群节点需要一个单独的配置文件,请确保与实例运行的系统中配置文件名称不冲突。
cluster-node-timeout 15000 节点互连超时的阀值。集群节点超时毫秒数。即节点与集群其他节点断开多长时间将被认定为超时。建议稍微大一点
cluster-slave-validity-factor 10 在进行故障转移的时候,全部 slave 都会请求申请为 master,但是有些 slave 可能与 master 断开连接一段时间了,导致数据过于陈旧,这样的 slave 不应该被提升为 master。该参数就是用来判断 slave 节点与 master 断线的时间是否过长。判断方法是:比较 slave 断开连接的时间和 (node-timeout * slave-validity-factor)+ repl-ping-slave-period 如果节点超时时间为三十秒, 并且 slave-validity-factor 为 10, 假设默认的 repl-ping-slave-period 是 10 秒,即如果超过 310 秒 slave 将不会尝试进行故障转移
cluster-migration-barrier 1 master 的 slave 数量大于该值,slave 才能迁移到其他孤立 master 上,如这个参数若被设为 2,那么只有当一个主节点拥有 2 个可工作的从节点时,它的一个从节点才会尝试迁移。
cluster-require-full-coverage yes 默认情况下,集群全部的 slot 有节点负责,集群状态才为 ok,才能提供服务。设置为 no,可以在 slot 没有全部分配的时候提供服务。不建议打开该配置,这样会造成分区的时候,小分区的 master 一直在接受写请求,而造成很长时间数据不一致。
2.Redis 集群环境搭建
来源: http://www.bubuko.com/infodetail-2091440.html