1. 集群解决的问题
- 容量不够问题
- 并发写操作压力问题
- 无中心化集群配置
2.集群概念
- Redis集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个redis节点中,每个节点存储总数据的1/N。
- Redis集群通过分区(partition)来提供一定程度的可用性(availability),即使集群中有一部分节点失效或无法通讯,集群也可以继续处理命令请求
3. 删除持久化数据
将整个rdb.aof 文件都删除掉。
4. 集群搭建
<1>制作六个实例
主服务器:6379从服务器:6389
主服务器:6380从服务器:6390
主服务器:6381从服务器:6391
<2>配置文件
include /myredis/redis.conf
pidfile "/var/run/redis_6379.pid"
port 6379
dbfilename "dump6379.rdb"
#打开集群
cluster-enabled yes
#设定节点配置文件名
cluster-config-file nodes-6379.cinf
#设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换
cluster-node-timeout 15000
<3>启动六台redis服务器
<4>将六个节点合成一个集群
1. 前提
组合之前,确保六个redis实例启动后,nodes-xxxx.onf文件都正常生成。
2. 命令:
ifconfig 查看本机ip地址
cd /opt/redis-6.2.6/src
redis-cli --cluster create --cluster-replicas 1 10.0.24.3:6379 10.0.24.3:6380 10.0.24.3:6381 10.0.24.3:6389 10.0.24.3:6390 10.0.24.3:6391
3. 说明
-replicas 1 采用最简单的方式配置集群,一台主机,一台从机,正好三组
不能使用127.0.0.1 ,要使用正式IP地址
4. 执行结果
<5>集群操作
1. 集群连接
可以用任意一个节点
redis-cli -c -p 6379
2. 查看集群信息
cluster nodes
5. redis cluster 节点分配
一个集群,至少三个主节点
选项 – cluster-replicas1 表示我们希望为集群的每个节点创建一个从节点。
分配原则尽量保证每个主数据库运行在不同的ip地址,每个从库和主库不在一个ip地址。
6. slots
- 一个Redis集群包含16384个插槽(hashslots),数据库中每个键都授予这16384个插槽的其中一个。
- 集群使用公式CRC16(key) % 16384 来计算key数据那个槽,其中CRC16(key)语句用于计算键key的CRC16校验和。
- 集群中的每个节点负责处理一部分插槽
- 演示
在6379中set key value ,但是通过计算,slot 在6381节点上,于是切 换到6381 再进行插入操作
7. 故障恢复
<1>当主服务器宕机之后,从服务器会成为主服务器
<2>当宕机的主服务器恢复之后,会作为从服务器
<3>如果一段槽点的主从服务器都宕机
如果 cluster-require-full-coverage 为yes,则整个集群都宕机
如果 cluster-require-full-coverage 为no,则该段数据全都不能使用,也无法存储
redis.conf中的参数 cluster-require-full-coverage
8. 优缺点
<1> 优点
实现扩容
分摊压力
无中心配置,相对简单
<2> 缺点
多键操作不被支持
多键的redis事务不被支持,lua脚本不被支持
由于集群方案出现比较晚,很多公司已经采用了其他的解决方案,而代理或者客户端分片的方案想要迁移至redis cluster ,需要整体迁移而股市逐步过度,复杂度较大