一、概述
单机redis存在的问题
容量不足,一台redis写数据时候容量不足问题?
并发问题,一台redis写数据出现并发问题?
主从模式中,主机宕机或者主从修改,都需要在redis中修改ip地址等很麻烦
redis3.0前是通过主机代理方式,3.0后推荐无中心化集群配置
二、搭建
创建一个myredis文件夹(这里还是通过多个修改配置文件端口方式模拟多个服务器)复制redis.conf文件6份
对每个文件修内容如下(每个文件端口不同)
include /myredis/redis.conf
pidfile "/var/run/redis_6379.pid"
port 6379
dbfilename "dump6379.rdb"
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
启动6个redis查看
再次查看当前目录文件,可以看到已经生成了对应的节点配置文件
将六个redis合成一个集群
进入redis位置
cd /opt/redis-6.2.1/src
redis-cli --cluster create --cluster-relicas 1 192.168.10:6379 192.168.10:6389 192.168.10:6380 192.168.10:6381 192.168.10:6390 192.168.10:6391
说明:
- 一个集群至少三个主节点
- relicas 1 表示以最简单的方式搭建集群 即一主一丛 刚好3组
- 分配原则尽量保证每个主数据库运行在不同的ip地址,每个从库和主库不在一个ip地址上
运行效果
连接集群并查看
redis-cli -c -p 6379
#任意一个端口都行
cluster nodes
三、插槽
上面第2点合成之后可以看到最后输出下面一句话
All 16384 slots covered
一个redis集群包含16384个插槽,数据库中每个键都属于这16384个插槽的其中一个。
集群使用公式CRC16(key)%16384来计算键key属于哪个槽,其中CRC16(key)语句用于计算键key的CRC16检验和
集群中每个节点负责处理一部分插槽,举个列子,如果一个集群可以有主节点,其中:
A节点负责处理0号至5460号插槽
B节点负责处理5461至10922号插槽
C节点负责处理10923至16383号插槽
测试插入一对 key-value,有明显的插槽分配
但是如果插入多对key-value出现问题
可以通过分组的方式解决上面问题,如下使用user分组
查看插槽中key对应的插槽值
cluster keyslot k1
统计插槽中key的数量
cluster countkeysinslot 4837
查看插槽中指定数量的值
cluster getkeysinslot 449 10
四、集群故障恢复
1、如果过主节点下线?从节点能否自动升为主节点?15秒超时
挂掉6379可以看到6389成为主机,当6379恢复自动成为6389从机
2、集群中某个节点 主从都宕机
如果某一段插槽的主从都挂掉,而cluster-require-full-coverage为yes,那么整个集群都挂掉,古国某一段插槽的主从都挂掉,二cluster-require-full-coverage为no,那么该插槽的数据全部不能使用也无法存储
五、jedis集群的开发
redis采用的无中心化。即使连接的不是主机,集群会自动切换主机存储,主机写 从机读,无论哪台主机写的数据,其他主机都可以读到数据