Redis-集群

1.1: 集群解决的问题

        容量不够,redis如何进行扩容?
        并发写操作, redis如何分摊?

1.2: 无中心化集群

        任何一台服务器都可以作为集群入口,服务器之间可以相互沟通,最少需要六台服务器。
1)    Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。
2)    Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。

1.3: Redis集群的搭建

1: 删除之前的rdb文件和aop文件
2: 修改redis6379.conf配置文件
  6379,6380,6381
  6389,6390,6391
  cluster-enabled yes		打开集群模式
  cluster-config-file nodes-6379.conf		设定节点配置文件名
  cluster-node-timeout 15000		设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换
3: 启动这6个redis服务
	node-xxx.conf文件生成位置和rdb文件生成的位置一致。
4: 将这6个节点合并成一个集群
	合并之前确保redis服务都正常启动,node-xxx.conf文件正常生成。
在/usr/local/opt/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:6389 127.0.0.1:6390 127.0.0.1:6391
操作结果:
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
5: 连接redis集群
	redis-cli -c -p 6379
6: 查看redis集群节点的信息
	通过cluster nodes 命令查看集群信息
127.0.0.1:6379> cluster nodes
7da6e912e88d46651c740886c7d42a625f06560e 127.0.0.1:6380@16380 master - 0 1654337344421 2 connected 5461-10922
2f5e3adbb9de5aa6976b04a14e0d16f22225891d 127.0.0.1:6391@16391 slave 7da6e912e88d46651c740886c7d42a625f06560e 0 1654337343000 2 connected
31dc47c62ec52734beb331845369db85225a6350 127.0.0.1:6390@16390 slave 756f9f3e6b44cb5ad5f801a0acd7f90565d011fc 0 1654337343000 1 connected
18d0233f4203444546ef5e243c09988701c00ede 127.0.0.1:6381@16381 master - 0 1654337344000 3 connected 10923-16383
ed5135fbd4f5cf7ac5683308e5476493a31fec00 127.0.0.1:6389@16389 slave 18d0233f4203444546ef5e243c09988701c00ede 0 1654337345432 3 connected
756f9f3e6b44cb5ad5f801a0acd7f90565d011fc 127.0.0.1:6379@16379 myself,master - 0 1654337342000 1 connected 0-5460
127.0.0.1:6379> 
myself,master中的myself代表:你当前连接的主机

7: redis cluster 如何分配这六个节点
  一个集群至少要有三个主节点。
  选项 --replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
  分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上。

8: 什么是slots ([OK] All 16384 slots covered.)
	一个 Redis 集群包含 16384 个插槽(hash slot), 数据库中的每个键都属于这 16384 个插槽的其中一个, 集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。
	集群中的每个节点负责处理一部分插槽。 
	举个例子,一个集群可以有主节点,其中:
 主机一负责处理 0 号至 5460 号插槽:127.0.0.1:6379@16379 myself,master - 0 1654337342000 1 connected 0-5460
 主机二负责处理 5461 号至 10922 号插槽:127.0.0.1:6380@16380 master - 0 1654337344421 2 connected 5461-10922
 主机三负责处理 10923 号至 16383 号插槽:127.0.0.1:6381@16381 master - 0 1654337344000 3 connected 10923-16383

9: 向集群中插入数据
	我从6379为入口链接redis集群插入数据:根据key计算数据插入的插槽位置,切换到插槽对应的主机,使用该主机进行数据的插入,在获取数据值时,根据key计算数据插槽位置,切换到插槽对应的主机,使用该主机获取对应的数据。当在链接从机上写数据时,也会转换为在主机上写入数据。
    127.0.0.1:6379> set k1 v1
    -> Redirected to slot [12706] located at 127.0.0.1:6381
    OK
    127.0.0.1:6381> get k1
    "v1"
    127.0.0.1:6381> set k2 v2
    -> Redirected to slot [449] located at 127.0.0.1:6379
    OK
    127.0.0.1:6379> set k3 v3
    OK
    127.0.0.1:6379> set k4 v4
    -> Redirected to slot [8455] located at 127.0.0.1:6380
    OK
    127.0.0.1:6380> get k1
    -> Redirected to slot [12706] located at 127.0.0.1:6381
    "v1"
    127.0.0.1:6381> 
不在一个slot下的键值,是不能使用mget,mset等多键操作。
可以通过{}来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去。
  127.0.0.1:6379> mset name{user} lisi age{user} 23
  -> Redirected to slot [5474] located at 127.0.0.1:6380
  OK
  127.0.0.1:6380> get name{user}
  "lisi"
  127.0.0.1:6380> 
10:	查询集群中的值
	CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。
	CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量
	CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键
11: 故障恢复
	如果主节点下线,从节点能自动升为主节点。当主节点又恢复了,他会自动变成新主节点的从节点。

1.4: java操作Redis集群

/**
* java操作Jedis集群
*/
@Test
void test9() {
  //连接Redis集群(随便一个redis服务地址)
  HostAndPort hostAndPort = new HostAndPort("127.0.0.1", 6379);
  JedisCluster jedisCluster = new JedisCluster(hostAndPort);
  //插入数据
  String set = jedisCluster.set("b2", "values2");
  System.out.println(set);
  //获取数据
  String value = jedisCluster.get("b2");
  System.out.println(value);

  jedisCluster.close();
}
//运行结果
OK
values2

1.5: Redis集群的优缺点

优点 
  实现扩容
  分摊压力
  无中心配置相对简单
缺点
  多键操作是不被支持的 
  多键的Redis事务是不被支持的。lua脚本不被支持。
  由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值