大多数场景redis sentinel就已经足够了。

特点

  • 每个主节点有个从节点
  • 主节点挂了,从节点晋升master
  • 数据分片,一份数据在多个master上

    命令

    cluster countkeysinslot {slot}:获取槽中的数据量

    slot

    ~Redis Cluster[old] - 图1

  • 节点直接互相通信的。

~Redis Cluster[old] - 图2
redis cluster有16384个slot
为什么redis集群的最大槽数是16384个? - 简书
~Redis Cluster[old] - 图3

客户端本地有 slot->node的缓存
slot更变就进行重定向。

手动安装配置Cluster【生产不用】

生成使用redis官方rb工具安装
image.png

1. 配置文件,开启节点

放行访问IP限制

bind 0.0.0.0

端口

port 6371

后台启动

daemonize yes

日志存储目录及日志文件名

logfile “/usr/local/redis/cluster/log/redis-6371.log”

rdb数据文件名

dbfilename dump-6371.rdb

aof模式开启和aof数据文件名

appendonly yes appendfilename “appendonly-6371.aof”

rdb数据文件和aof数据文件的存储目录

dir /usr/local/redis/cluster/data

设置密码

requirepass 123456

从节点访问主节点密码(必须与 requirepass 一致)

masterauth 123456 # 是否开启集群模式,默认 no cluster-enabled yes # 集群节点信息文件,会保存在 dir 配置对应目录下【系统自动创建,维护】 cluster-config-file nodes-6371.conf

集群节点连接超时时间

cluster-node-timeout 15000

集群节点 IP

cluster-announce-ip 192.168.10.101

集群节点映射端口

cluster-announce-port 6371

集群节点总线端口

cluster-announce-bus-port 16371

image.png

  • cluster节点与普通节点的区别就是cluster-enabled yes
  • cluster-require-full-coverage:集群完整性(有一个down机集群就不可用),建议设置为no
  • cluster-config-file nodes-6379.conf:虽然此配置的名字叫”集群配置文件”,但是此配置文件不能人工编辑,它是集群节点自动维护的文件,主要用于记录集群中有哪些节点、他们的状态以及一些持久化参数等,方便在重启时恢复这些状态。通常是在收到请求之后这个文件就会被更新。【可cat conf文件查看节点信息,和cluster node命令信息一样】

快速生成其他节点配置文件:
image.png
运行:redis-server redis-xxxx.conf
显示集群模式
image.png

cluster info:查看cluster信息

image.png

2. Meet操作【可作为节点加入集群操作】:

采用 Gossip 协议进行通信,交换维护节点元数据信息。
raft是强一致性的,gossip是最终一致的

cluster meet

image.png
gossip使节点彼此都能感知,交换元数据。

3. 给节点指派槽

cluster addslots:分配slot

image.png

cluster nodes:查看cluster nodes

image.png

4. 设置主从

image.png

cluster replicate:主从分配

image.png
让7003去复制7000

5. 查看slot分配情况

cluster slots

image.png
0~4095slot 分配到 7000主节点,7004从节点。

使用官方工具redis-trib创建cluster

先启动各个redis节点。

redis-trib.rb create:创建集群

image.png

集群加入新结点

redis-trib.rb add-node

image.png

redis-trib.rb info

image.png

迁移

image.png
image.png

扩容slot

  1. 启动节点
  2. meet加入集群
  3. 迁移slot到此节点【redis-trib.rb reshard

    redis-trib.rb reshard:分配slot

    image.png
    7006是新添加的节点,所以slot为0,后面会询问你迁移slot过去。

    缩容

  4. 迁移slot【redis-trib.rb reshard

image.png

  1. 使集群忘记此节点【redis-trib.rb del-node

image.png

redis-trib.rb del-node:下线节点

del-node通知给7000(任意一个节点)
image.png

redis-trib.rb rebalance

平衡slot,谨慎使用

Hash Tag【确保一组key映射到同一个slot中】

user:{user1}:ids和user:{user1}:tweets 对他们取hash结果是一样的=hash(user1)
当一个key包含 {} 的时候,就不对整个key做hash,而仅对 {} 包括的字符串做hash。

客户端重定向:moved异常 和 ask异常

moved异常

image.png
image.png

  • redis-cli -c 集群模式会自动redirect
  • redis-cli 普通模式 会抛异常

重分片对 Redis 集群的性能影响分析 — blog.huangz.me

ask异常

image.png

moved ask区别

~Redis Cluster[old] - 图27
moved永久转移,更新客户端 slot-node缓存
ask是该slot正在转移。一部分数据在A一部分在B
~Redis Cluster[old] - 图28

Jedis Cluster客户端(smart客户端)

image.png
image.png

jediscluster基本使用

image.png
image.png

批量操作优化

  1. 串行mget(就是循环mget)
  2. 串行IO
  3. 并行IO(多线程版串行IO)
  4. hashtag

image.png

cluster读写分离?不建议使用

  • 需要自定义读写分离客户端。

cluster中从节点只能算是一个备份,读写都在主节点。
image.png

redis数据迁移

redis-trib.rb import:将外部redis数据导入集群

image.png
image.png

故障转移

从节点提升master条件

  1. 检查slave与master断线时间:必须小于cluster-node-timeout * cluster-slave-validity-factor.
    • cluster-node-timeout默认15
    • cluster-slave-validity-factor默认10
  2. offset越大的,延迟选举时间越小

image.png

  1. 票数超过一半就成为master