1.1 如何产生

容量不够,redis 如何进行扩容?

并发写操作,redis 如何分摊?

另外,主从模式,薪火相传模式,主机宕机,导致 ip 地址发生变化,应用程序中配置需要修改对应的主机地址,端口等信息。

之前通过代理主机来解决,但是 redis3.0 中提供了解决方案,就是 无中心化集群 配置。

1.2 什么是集群

Redis 集群实现了对 Redis 的水平扩容,即启动 N 个 redis 节点,将整个数据库分布存储在这 N 个节点中 ,每个节点存储总数据的 1/N.
Redis 集群通过分区(partition)来提供一定程度的可用性(availability):即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求

1.3 Redis 集群搭建

1.3.1 删除持久化数据

将rdb、aof文件都删除掉

1.3.2 制作 6 个实例,6379、6380、6381、6389、6390、6391

主机 6379 6380 6381
从机 6389 6390 6391

1.3.3 配置基本信息

开启 daemonize yes
创建 redis6379.conf 配置文件并复制五次更改为其他端口对应的配置文件

  1. include /myredis/redis.conf
  2. pidfile /var/run/redis_6379.pid
  3. port 6379
  4. dbfilename "dump6379.rdb"
  5. cluster-enabled yes /打开集群模式
  6. cluster-config-file nodes-6379.conf /设定节点配置文件名
  7. cluster-node-timeout 15000
  8. /设定失联时间,超过该时间,集群自动主从切换
  9. //对于不同的配置文件只需要修改端口号
  10. //可以用 :%s/6379/6380 快速更改

1.3.4 启动 6个redis 服务

redis-server /myredis/redis6379.conf
#redis-server /myredis/redis6380.conf
#redis-server /myredis/redis6381.conf
#redis-server /myredis/redis6389.conf
#redis-server /myredis/redis6390.conf
#redis-server /myredis/redis6391.conf
#ps -ef | grep redis //检查 redis 服务是否开启成功

1.3.5 将六个节点合成一个集群

首先确保所有 redis 实例启动
进入 redis 安装目录
#cd /opt/redis-6.2.6/src //只有在此目录下命令才能生效
#redis-cli —cluster create —cluster-replicas 1 192.168.200.20:6379 192.168.200.20:6380 192.168.200.20:6381 192.168.200.20:6389 192.168.200.20:6390 192.168.200.20:6391
>>> Performing hash slots allocation on 6 nodes…
……
Can I set the above configuration? (type ‘yes’ to accept): yes
……
[OK] All 16384 slots covered.
//此处的 IP 不要用 127.0.0.1 ,要用真实 IP 地址
// relicas 1 采用最简单的方式配置集群,一台主机,一台从机,正好三组

1.3.6 采用集群策略连接,设置的数据会自动切换到相应的写主机

redis-cli -c -p 6379 //从任意端口都可以进入该集群

1.4 Redis 集群操作和故障恢复

1.4.1 cluster nodes

通过该命令可以查看集群详细信息
image.png

1.4.2 cluster 是如何分配这六个节点的

  • 一个集群至少有三个主节点
  • 选项 —cluster-replicas 1 表示我们希望为集群中的每个主节点创建一个从节点
  • 分配原则尽量保证每个主数据库运行在不同的 IP 地址,每个从库和主库不在一个 IP 地址上

这样做是为了避免出现主从节点在同一个主机上导致同时宕机的现象

1.4.3 什么是插槽(slots)

一个 Redis 集群包含 16384 个插槽(hash slot), 数据库中的每个键都属于这 16384 个插槽的其中一个。

集群使用公式 CRC16(key)% 16384 来计算键值 key 数据那个槽

集群中的每个节点负责处理一部分插槽,例如:
节点A负责 0 号至 5460 号插槽
节点B负责 5461号至 10922 号插槽
节点C负责 10923 号至 16383 号插槽

1.4.4 在集群中录入值

image.png
无法同时录入多个键值对,因为无法计算 key 值,无法储存
image.png
可以用下面的方式把多个值放在一个组里,这样可以以 user1 这个 key 进行计算储存
image.png

1.4.5 查询集群中的值

cluster keyslot cust //查询插槽值
(integer)4847
>cluster countkeysinslot 4847 //计算该插槽中有几个键
(integer)3
>cluster getkeysinslot 4847 10 //返回该插槽中的值的数量
1)”k1{cust}”
2)”k2{cust}”
3)”k3{cust}”
//统一都只能查询在本节点插槽值范围内的值所对应的结果

1.4.6 故障恢复

先让 80 节点下线 ,会发现原来的一个从节点变成了主节点
image.png
再开启 80 节点,发现他并没有变成主节点,而是变成了从节点
image.png