一、准备工作
- CentOS7系统
- 安装Redis服务
- 安装Ruby服务
二、安装服务
1、安装Redis
自行百度,不是这篇文章重点
2、安装Ruby服务
2.1、有网:
- 执行
yum install ruby
- 执行
yum install rubygems
2.2、没网:
-
cd /run/media/root/CentOS 7 x86_64/Packages
(路径跟centos6不同) 获取下图rpm包 -
拷贝到
/opt/rpmruby/
目录下,并cd到此目录 -
执行:
rpm -Uvh *.rpm --nodeps --force
-
按照依赖安装各个rpm包
2.3、安装Redis3.2.0.gem
下载:参考 https://rubygems.org/gems/redis/versions/3.2.0
有网:gem 'redis', '~> 3.2'
没网:
- 官网下载 https://rubygems.org/gems/redis/versions/3.2.0,下载文件在网页右下角处
- 使用Xftp复制到
/opt
目录下 - 执行:
gem install --local redis-3.2.0.gem
三、制作实例
3.1、制作配置文件
制作六个实例:6379,6380,6381,6382,6383,6384
# 主从复制配置
# 这里把默认配置文件作为公共文件,其中默认配置文件修改的内容有
# 注释掉 bind 127.0.0.1 开启远程访问
# daemonize yes 开启后台启动
# Appendonly no 关闭aof
# include 公共文件位置
include /usr/local/bin/redis-3.2.5/redis.conf
pidfile "/var/run/redis6379.pid"
port 6379
dbfilename "dump6379.rdb"
# cluster集群配置
# 打开集群模式
cluster-enabled yes
# 设定节点配置文件名
cluster-config-file nodes-6379.conf
# 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换。
cluster-node-timeout 15000
注:对应其他五个配置文件,修改上面内容的端口号即可,比如:6379->6380,其他不用动,也可按需修改
3.2、开启服务
# 开启对应的六个服务
redis-server redis6379.conf
redis-server redis6380.conf
redis-server redis6381.conf
redis-server redis6382.conf
redis-server redis6383.conf
redis-server redis6384.conf
# 查看开启状态
ps -ef | grep redis
如下图:
四、合成集群
执行以下代码:
# 切换到Redis目录的src文件夹下
cd redis安装路径/src
# 执行代码
./redis-trib.rb create --replicas 1
192.168.44.130:6379
192.168.44.130:6380
192.168.44.130:6381
192.168.44.130:6382
192.168.44.130:6393
192.168.44.130:6394
# 以上ip不要写127.0.0.1,写机器真实ip,端口为六个redis服务端口
# 创建时会有确认操作 ,输入yes即可
注: 合成之前请确保六个Redis服务为空
不然报以下错误:
解决:
登录各个节点运行flushall
和cluster reset
就可以解决了
成功实例:
五、启动
命令:(以集群的方式启动)
redis-cli -c -p 端口号(随意一个,master可读可写,slave可读不可写)
成功实例:
六、数据插入
6.1、slot(插槽)
一个 Redis 集群包含 16384 个插槽(hash slot), 数据库中的每个键都属于这 16384 个插槽的其中一个, 集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。
集群中的每个节点负责处理一部分插槽。 举个例子, 如果一个集群可以有主节点, 其中:
节点 A 负责处理 0 号至 5500 号插槽。
节点 B 负责处理 5501 号至 11000 号插槽。
节点 C 负责处理 11001 号至 16383 号插槽。
可以使用 cluster nodes
命令查看集群信息
6.2、数据录入
方式一:登录方式 redis-cli
在redis-cli每次录入、查询键值,redis都会计算出该key应该送往的插槽,如果不是该客户端对应服务器的插槽,redis会报错,并告知应前往的redis实例地址和端口。
方式二:登录方式 redis-cli -c
redis-cli客户端提供了 –c 参数实现自动重定向。
如 redis-cli -c –p 6379 登入后,再录入、查询键值对可以自动重定向。
七、相关操作
命令 | 参数 | 解释 |
---|---|---|
CLUSTER KEYSLOT | key | 计算键 key 应该被放置在哪个槽上 |
CLUSTER GETKEYSINSLOT | slot ,count | 返回 count 个 slot 槽中的键 |
CLUSTER COUNTKEYSINSLOT | slot | 返回槽 slot 目前包含的键值对数量 |
cluster nodes | 无 | 命令查看集群信息 |
八、故障恢复
-
如果主节点下线?从节点能否自动升为主节点?
会。
-
主节点恢复后,主从关系会如何?
变成其他主节点的从节点,原本的从节点变成主节点,现在还是主节点,重新上线的以前的主节点,变成某一个的从,看分配规则
规则:在我们创建集群时,选项 --replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。 -
如果所有某一段插槽的主从节点都当掉,redis服务是否还能继续?
默认不能。
redis.conf
中的参数cluster-require-full-coverage
默认为true
即只有 16384个slot都正常的时候才能对外提供服务
可以修改cluster-require-full-coverage
为false
九、建议
分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上。
十、其他
- Redis 集群提供了以下好处:
- 实现扩容
- 分摊压力
- 无中心配置相对简单
- Redis 集群的不足:
- 多键操作是不被支持的
- 多键的Redis事务是不被支持的。lua脚本不被支持。
- 由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。