8-集群
什么是集群
Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。
Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。
创建集群
配置集群结点的基本信息,按如如下配置拷贝多个,我这里分别配置了端口号为6379、6380、6381、6389、6390、6391的文件。
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
然后使用在Redis安装目录下的src目录中,运行redis-cli --cluster create --cluster-replicas 1 192.168.232.129:6379 192.168.232.129:6380 192.168.232.129:6381 192.168.232.129:6389 192.168.232.129:6390 192.168.232.129:6391
以集群的方式启动客户端,-c
redis-cli -c -p 6379
运行CLUSTER NODES
查看集群信息。
分配原则
一个集群至少要有三个主节点。
- 尽量保证主库不再同一个 ip上
- 从库和对应的主库尽量不在一个ip上
插槽
一个 Redis 集群包含 16384 个插槽,每个主库都会分配一个插槽范围,当添加 kv对时,会根据待添加元素的 key 计算出对应的插槽值( CRC16(key) % 16384),然后放入对应的库中。
如下图,不同的key对应不同的slot,然后被存放在对应的库中。
添加值
不在一个slot下的键值,是不能使用mget,mset等多键操作。
可以通过{}来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去。此时根据分组计算slot
故障恢复
Q:如果主节点下线,从节点能否自动升为主节点?
A:能。
Q:主节点恢复后,主从关系会如何?
A:主节点回来变成从机。
Q:如果所有某一段插槽的主从节点都宕掉,redis服务是否还能继续?
A:如果运行配置cluster-require-full-coverage 为yes,那么整个集群都会垮掉;但如果cluster-require-full-coverage 为 no,那么只有down掉的节点负责的插槽不能使用,其他可以。
Jedis开发
package com.klaus;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
public class Main {
public static void main(String[] args) {
HostAndPort hostAndPort = new HostAndPort("192.168.232.129", 6379);
JedisCluster jedisCluster = new JedisCluster(hostAndPort);
jedisCluster.set("IDE", "IDEA");
String ide = jedisCluster.get("IDE");
System.out.println(ide);
jedisCluster.close();
}
}
优点
-
实现扩容
-
分摊压力
-
无中心配置相对简单
不足
多键操作是不被支持
多键的 Redis 事务是不被支持的,lua脚本不被支持
由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。
本文来自博客园,作者:klaus08,转载请注明原文链接:https://www.cnblogs.com/klaus08/p/15327106.html