Redis Cluster 集群

<mark>集群模式是实际使用最多的模式</mark>

Reids Cluster 是社区版 推出的 Redis 分布式集群解决方案,主要解决 Reis 分布式方面的需求。

比如:当遇到单机内存,并发和流量等瓶颈的时候,Redis Cluster 能起到很好的负载均衡的目的。

集群的作用

  • 分散单台服务器的访问压力,实现负载均衡
  • 分散单台服务器的存储压力,实现可扩展性
  • 分散单台服务器宕机带来的业务灾难

Redis集群结构设计

想用集群,但是集群不像添加内存卡插内存槽怎么简单。

主要考虑两个设计:

  • 数据存储设计
  • 内部通讯设计

# 数据存储设计

顾名思义,决定 数据 怎么存储的

单机情况
key 存储在 redis 存储空间中


多台redis情况

  • 通过算法设计,计算出 key 应该保存的位置

将所有的存储空间计划切割成 16384份,每台主机保存一部分
每份代表的是一个存储空间,不是一个key的保存空间
<mark>(这些存储空间,官方称为 “槽” slot)</mark>
将 key 按照计算出的结果放到对应的存储空间


机器增加 / 减少的处理

一个机器持有一定数量的槽,当有新机器出现,原来就存在的机器分一部分槽给新机器

(去机器相似,就是相反的操作,把原来分配的槽重新分配出去即可)


# 集群内部通讯设计

这样的设计,可以保证至多两次请求,能找到key的位置

# cluster 集群的搭建

开启集群

修改 redis.conf 配置
原始状态

port 6379
daemonize no
dir "/dev/redis/data"
dbfilename dump-6379.rdb
rdbcompression yes
rdbchecksum yes
save 10 2
appendonly yes
appendfsync always
appendfilename appendonly-6379.aof
bind 127.0.0.1
databases 16

添加

# 声明当前redis是一个cluster节点
cluster-enabled yes
# 指定cluester的配置文件
cluster-config-file nodes-6379.conf
# 设定cluster的下线时间
cluster-node-timeout 10000

复制出多个节点配置

[root@lawsssscat redis]# cat redis.conf > redis-6379.conf
[root@lawsssscat redis]# sed 's/6379/6380/g' redis-6379.conf > redis-6380.conf 
[root@lawsssscat redis]# sed 's/6379/6381/g' redis-6379.conf > redis-6381.conf 
[root@lawsssscat redis]# sed 's/6379/6382/g' redis-6379.conf > redis-6382.conf 
[root@lawsssscat redis]# sed 's/6379/6383/g' redis-6379.conf > redis-6383.conf 
[root@lawsssscat redis]# sed 's/6379/6384/g' redis-6379.conf > redis-6384.conf 
[root@lawsssscat redis]# sed 's/6379/6385/g' redis-6379.conf > redis-6385.conf 

检查一下 sed 替换有没有生效

分别开启

连接集群(ruby、gem)

上面把 6 个 cluster开启了,但目前没个都是独立的,

连接每个 cluster 节点,需要 安装包目录(/opt/redis-xxx/src)下的 redis-trib.rb 指令

进贡者(tributary)

<mark>注意:5.0之后 trib.rb 全部移植到了 redis-cli --cluster, 下面的 ruby 和 gem 也不用下载
(往下看就知道了)</mark>

而这个指令依赖 : ruby 和 gem

 yum install -y ruby gem

运行 trib.rb

依赖下完后就能运行了

# create 创建集群
# --replicas 1 创建从节点数:一个master有多少个 slave
# 127.0.0.1:6379 .... master 的 ip 和 端口,要和--replicas 对应上
# 如:replicas 1 对应 6 个master(一共6个redis服务的情况下,互为主从)
/opt/redis-5.0.8/src/redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384

<mark>最近运行发现</mark>
WARNING: redis-trib.rb is not longer available!
<mark>原因是, 5.0 之后,命令</mark>

/opt/redis-5.0.8/src/redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384

<mark>已经 移植到了 redis-cli</mark>

我们只需要更换命令即可,:

/usr/local/redis/bin/redis-cli --cluster create --cluster-replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384

Redis 5.0 redis-cli --cluster help说明

注意:我们到我们配置中指定的 nodes 配置文件目录,发现
在我们 启动 连接,并且在 输入 yes 之前,
nodes 的配置文件已经生成了

这时,配置内容很简单,就是记录了各自的 id

运行 trib.rb 【确认】

看打印的内容

再看 nodes 节点的配置信息

设置和获取数据

命令 redis-cli 登陆客户端,大概率不能设置数据

因为我们的key大概率(2/3)不在我们登陆的客户端管辖范围

需要用 redis-cli -c 登陆

<mark>(上图)重定向后,我们登陆的客户端端口号也变了</mark>

主从下线与主从切换

cluster 集群最大的优势是,出了问题怎么办

1、Slave宕机

直接在salve上 ctrl+c 模拟宕机

看 master 的反映

slave 6382

宕机slave 的 master 6380

其他 master 6379 和 6381

2、slave 恢复

先把上面的 slave 连上

bin/redis-server redis-6382.conf

3、master宕机

我们把 master 6379 停掉,看 直属的 slave 6384

日志可以看出,master6379断掉之后,直属的 slave 在多次尝试重连失败后,篡位成了 master

我们再用客户端看下节点信息

4、master恢复

 bin/redis-server redis-6379.conf

看 6379 的日志:6379 变成了 slave,并从 新master 6384同步数据

# cluster 集群搭建【配置/指令总结】

cluster配置

  • 设置加入 cluster,使其成为节点
    cluster-enabled yes|no
  • cluster配置文件名,该文件属于自动生成,仅用于快速查找文件并查询文件内容
    cluster-config-file <filename>
  • 节点服务响应超时时间,用于判定该节点是否下线成功或切换为从节点
    cluster-node-timeout <milliseconds>
  • master连接的 slave 最小数量
    cluster-migration-barrier <count>

cluster节点操作指令

  • 查看集群节点信息
    cluster nodes
  • 进入一个节点 redis,切换其主节点
    cluster replicate <master-id>
  • 发现一个新节点,新增主节点
    cluster meet ip:port
  • 忽略一个没有 solt 的节点
    cluster forget <id>
  • 手动故障转移
    cluster failover

企业级解决方案

Redis 集群搭建方案:

  • Twitter 开发的 twermproxy
  • 豌豆荚开发的 codis
  • <mark>redis 官方的 redis-cluster</mark>(神选)
    (redis 3.0 之后推出的解决方案)

还包括

  • 缓存预热
  • 缓存雪崩
  • 缓存击穿
  • 性能指标监控
  • 性能指标监控命令

主要还是项目时候积累概念, 详细看 : https://www.bilibili.com/video/BV1CJ411m7Gc?p=107

下一篇:Spring Security OAuth2.0 认证协议【1】- 基本概念