问题

容量不够了, Redis如何扩容?
并发写操作, Redis如何分摊?

论是什么模式, 主服务器炸了, 导致了ip地址发生变化, 应用程序中配置需要修改对应的主机地址,端口等信息, 之前要通过代理主机来解决, 但是redis3.0开始提供了解决方案: 无中心化集群配置.
无中心化集群中任何一台服务器都可以作为集群的入口, 它们直接互相连通.

什么是集群

Redis集群实现了水平扩容, 即启动N个redis节点, 将整个数据库分布存储到N个节点中, 每个节点存储1/N数据.

Redis集群通过分区来提供一定程度的可用性, 即使集群中有一部分节点失效或无法进行通信, 集群也可以继续处理命令

搭建集群

  1. 删除rdb,aof文件.
  2. 制作6个实例.

redisXXXX.conf后追加以下内容:

1
2
3
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
  1. 启动6个服务.
  2. 将6个节点合成一个集群
    下面是一行命令, 写服务器ip和设定的端口号, 不能写127.0.0.1
    1
    2
    3
    4
    5
    6
    7
    redis-cli --cluster create --cluster-replicas 1
    192.168.xxx.xxx:6379
    192.168.xxx.xxx:6380
    192.168.xxx.xxx:6381
    192.168.xxx.xxx:6389
    192.168.xxx.xxx:6390
    192.168.xxx.xxx:6391

成功:
W8SgpV.png
把最后的值记下来: 16384, 还要用的.

  1. 测试
    连接集群. 用集群中的任一端口均可.
    redis-cli -c -p 6379

cluster nodes: 查看集群中节点信息.
主从自动设置. 一个集群至少要有三个主节点.
--cluster-replicas 1表示从库最小分配.
分配原则: 尽量保证每个主数据库运行在不同的IP地址, 每个从库和主库不在一个IP地址上.

  1. 什么是slots
    slots译为插槽.
    一个redis集群包含16384个插槽, 数据库中的每个键都属于这16384个插槽中的一个.
    集群使用公式CRC16(key) % 16384 来计算key属于哪个槽, 其CRC16(key)语句用于计算key的CRC16校验和.
    集群中的一个节点负责一些插槽.
    如图所示, 0-5460, 5461-10922, 10923-16383.
    W8C9Qf.md.png

插入一个key, 让我们来看返回什么:
W8CZYn.png

也就是说, 我们这个集群, 不论从那个入口进入, key插入位置都要经过计算slot后才插入. 那么一个问题来了, 如果我们用批量插入命令呢?

W8CB0e.png

报错了!
我们想要批量插入就要这么写:

1
mset name{user} lucy age{user} 20

其他基本命令

  • cluster keyslot KEY: 返回KEY的slot槽值
  • cluster countkeysinslot SLOT: 返回插槽中键的数量, 注意只能看本服务器负责的插槽的值.
  • cluster getkeysinslot SLOT COUNT: 返回count个slot槽中的键.

故障恢复

某一个主机挂了, 其他从机立刻升级为主机, 当挂掉的主机重启, 它变为了从机.

如果某一段插槽的主从节点都宕机了, redis服务是否还能继续?

配置文件参数:
cluster-require-full-coverge.
如果是yes, 那么整个集群都挂了.
如果是no, 那么只有那一段不能用.

集群的Jedis开发

emmmmmm.
真没什么特别的.