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
注意:我们到我们配置中指定的 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