集群常用地方
- 容量不够时,redis进行扩容
- 并发操作时,redis进行分摊
什么是redis的集群
redis集群实现了redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储的总数据的1/N。
Redis集群通过分区(partition)来提供一定程度的可用性(availability),即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。
使用集群环境需求(安装ruby)
yum install ruby
yum install rubygems
快速配置几台redis服务器
- 拷贝多个
redis.conf
文件,后面用在这些文件中使用include 默认reidis.conf路径
就可以进行快速配置 - 开启
daemonize yes
(开启守护线程) - Pid文件名字
pidfile
- 指定端口号port
- Log日志文件的名字
Dump.rdb
的名字dbfilenameAppendonly.aof
关闭或者替换名字
tips:上面的5-7都是换名字,是因为如果多台服务器的名字都一样的话只会去替换掉而不会保存了
这一步仅仅只是简单地配置了多台redis服务器,与集群无关
集群环境的配置
- 打开集群模式
cluster-enabled yes
- 设置节点配置文件名
cluster-config-file 文件名
- 设置节点失联时间,超过改时间(毫秒),集群不用设置哨兵就自动进行主从切换(反客为主)
cluster-node-timeout 时间(毫秒)
集群的开启
- 配置文件设置完成后,启动所有的redis实例
- 启动后保证所有的
nodes-xxxx.conf
文件都生成正常 - 进入你的redis安装目录, 例如
/opt/redis-3.2.5/src
里运行./redis-trib.rb creat --replicas 每个主节点创建多少个从节点 你要集群的redis服务器的ip地址:端口号
将其和成
注意的是,这里的ip地址本能用127.0.0.1,要使用真实ip地址 - 集群方式进入客户端
redis-cli -c -p 端口号
- 查看集群信息
cluster nodes
如下图,下图显示6381端口为从服务器,6391为主服务器,而且通过6381后面的一串id与6391前面的一串id相同,可以知道6381的主服务器为6391
redis如何分配节点
- 一个集群至少要有三个主节点
- 之前实例合成集群命令的
--replicas 1
每个主节点创建1个从节点 - 分配原则尽量保证每个主服务器运行在不同的ip地址,没个从服务器和主库不在一个ip地址上。
redis集群的理解
slots(插槽)
- 一个redis集群中包含16384个插槽(hash slot),数据库中的每个键都属于这16384个插槽中的其中一个,集群使用公式CRC16(key)%16384来计算这个key属于哪个槽,其中CRC16(key)语句用于计算键key的CRC16检验和。
- 集群中的每个节点复制处理一部分插槽。
这个有点抽象,举个例子:如果一个集群有3个主节点,其中:
节点A负责0-5500插槽,节点B负责5501-11000插槽,节点C负责11001-16383插槽
redis存值的实际过程
- 在redis-cli每次录入,查询键值,redis都会计算出该key应该送往的插槽,如果不是客户端对应的插槽,redis会报错,并告诉应前往的redis实例的地址和端口
- redis-cli的客户端提供了
-c
参数,参数实现自动化重定向,然后获取和录入都会自动重定向 - 不在一个slot下的键值,是不能使用mget,mset(一次性获取多个键或设置多个键的值)等多键操作
- 可以通过{}来定义组的概念,从而使key中相同内容的键值对放到同一个slot中去。
简单地说,如果在键的后面添加一个{组名},那相同组名的的键就会存放在一个插槽,下图的a,aa,aaa后面都添加了同一个组名user,所以他们都被存放到同一个插槽中。
查询集群中的值
- 就散键key应该放在哪个插槽
cluster keyslot <key>
- 返回槽slot目前包含的键值对数量
cluster countkeysinslot <slot>
- 返回cont个slot中的键
cluster getkeysinslot <slot> <count>
故障恢的一些注意点
- 如果主节点意外关闭,从节点自动升级主节点
- 旧主节点恢复后会变成新主节点的从节点
- 某一段插槽的主从节点都意外关闭了,那这一部分的功能全部失效,无法获取也无法设置,也不会去将这个关闭节点的插槽分配给正常的插槽。
- 在redis.conf中有个参数
cluster-require-full-coverage yes/no
,这个参数如果为yes时,只有16384个slot都必须正常才可以进行进行服务
Redis集群的好处
- 实现扩容
- 分摊压力
- 无中心配置,相对简单
Redis集群的补助
- 不支持多键操作,例如mset,mget等一次操作多个键值对的命令是不被支持的。
- 多件的Reids事务是不被至此的,Lua等脚本也是不被支持。
- 由于redis的集群出现的比较晚,很多公司已近采用了其他点集群方案,如果想迁移到Redis Cluster中,需要整体迁移而不是逐步过渡,复杂度相当大。