Redis海量数据存储方案Redis Cluster


Redis主从集群搭建及主从复制原理解析

前言

本篇文章主要介绍Redis集群中如何搭建分片集群,以及分片集群的性能及集群数据迁移的方式;从而打破内存瓶颈,使得Redis可以存海量数据,达到10G或者更大的数据。

Redis集群搭建

redis5集群搭建 提取码为:ch2i  

在redis.conf中修改对应的端口号数据 dir数据

 需要启动多个 集群

需要做随机主从时, 直接使用--cluster-replicas 命令即可,这里使用的3主3从

如果遇到hash槽等占用,可以使用 cluster nodes查找占用的端口号是否被占用 

扫描二维码关注公众号,回复: 13321785 查看本文章

可以使用cluster slots 查看槽的分配 node 分配  并获得到nodeid,并删除槽的节点, 使用 sudo   redis-cli --cluster  del-node 192.168.100.2:7000  nodeid即可

flush刷新一下

 在官网中  对于集群的命令支持,包括自动分配hash槽等等。

 包括重新调整 redis集群的命令,cluster reset 

在安装过程中 需要查找命令,需要使用help命令 一个是针对cluster的  

另外一个针对 cli 里面的 查找 node节点里面包括 一些 info replication  set等常见命令

包括运行过程中需要对某些hash槽,进行多分配,则采用下面的命令

注意这里挪动槽位,只针对没有数据的挪动

Cluster hash槽一些常见的问题

# 1、 增加了slot槽的计算,是不是比单机性能差?
共16384个槽,slots槽计算方式公开的,java客户端中就使用了:HASH_SLOT = CRC16(key) mod 16384
为了避免每次都需要服务器计算重定向,优秀的java客户端都实现了本地计算,和服务器slots分配进行映射,有变动时再更新本地内容。

# 2、 redis集群大小
理论是可以做到16384个槽,但是redis官方建议是最大1000个实例

# 3、 批量操作或者

# 4、cluster meet命令中的bus-port是什么?
MEET <ip> <port> [bus-port]
每个Redis群集节点都有一个额外的TCP端口,用于接收来自其他Redis群集节点的传入连接

# 5、集群节点间的通信方式
每个节点使用TCP连接与每个其他节点连接。

# 6、ask和moved重定向的区别
重定向包括两种情况
如果是确定slot不属于当前节点,redis会返回moved
如果当前redis节点正在处理slot迁移,则代表此处请求对应的key暂时不在此节点,返回ask,告诉客户端本次请求重定向

# 7、数据倾斜和访问倾斜的问题
解决办法 调整key的策略 + slot迁移
迁移过程如下,完整的迁移流程:
在迁移目的节点执行cluster setslot <slot> IMPORTING <node ID>命令,指明需要迁移的slot和迁移源节点。
在迁移源节点执行cluster setslot <slot> MIGRATING <node ID>命令,指明需要迁移的slot和迁移目的节点。
在迁移源节点执行cluster getkeysinslot获取该slot的key列表。
在迁移源节点执行对每个key执行migrate命令,该命令会同步把该key迁移到目的节点。
在迁移源节点反复执行cluster getkeysinslot命令,直到该slot的列表为空。
在迁移源节点和目的节点执行cluster setslot <slot> NODE <node ID>,完成迁移操作。
#8 节点之间会交换信息,传递的消息包括槽的信息,带来带宽消耗。
注意:避免使用大的一个集群,可以分多个集群。
#9、 Pub/Sub发布订阅机制
注意:对集群内任意的一个节点执行publish发布消息,这个消息会在集群中进行传播,其他节点接收到发布的消息。

#10、读写分离
redis-cluster默认所有从节点上的读写,都会重定向到key对接槽的主节点上
可以通过readonly设置当前连接可读,通过readwrite取消当前连接的可读状态。
主从节点依然存在数据不一致的问题



Redis Cluster

为什么要实现Redis Cluster

  • 主从复制不能实现高可用
  • 随着公司发展,用户数量增多,并发越来越多,业务需要更高的QPS,而主从复制中单机的QPS可能无法满足业务需求
  • 数据量的考虑,现有服务器内存不能满足业务数据的需要时,单纯向服务器添加内存不能达到要求,此时需要考虑分布式需求,把数据分布到不同服务器上
  • 网络流量需求:业务的流量已经超过服务器的网卡的上限值,可以考虑使用分布式来进行分流
  • 离线计算,需要中间环节缓冲等别的需求

默认的主从复制集群是完全不满足要求的。

示例: 公司用户量3千万,用户基本信息缓存到redis中,需要内存10G,如何设计Redis的缓存架构?
1. 3千万用户,各种业务场景对用户信息的访问量很大。(单台redis示例的读写瓶颈凸显)
2. 单redis实例管理10G内存,必然影响处理效率。
3. redis的内存需求可能超过机器的最大内存。 (一台机器不够用)

引出的分片集群

概述

redis cluster是Redis的分布式集群解决方案,在3.0版本推出后有效地解决了redis分布式方面的需求 实现了数据在多个Redis节点之间自动分片、故障自动转移、扩容机制等功能。
  • 这里去选择去那个 redis-server,根据一定的算法去找,这在持久化数据库存储海量数据是实现了的  比如mycat,但mycat做的更好的是,将分片规则更加变细了,这里是默认的
  •  计算hash数值crc(16)    计算出hash槽的位置 预设槽slot   hash值 % 16383 能快速找到数据
  •  对于redis中采用的方式,是采用的虚拟槽,这个槽的大小是16384的大小,而每个槽,这里为什么采用这个大小,作者的意思是空间利用率是最好的,槽的作用将数据打散利用hash也好
  • 以及客户端入如果需要获取数据,根据计算出的槽,随便找一台,并且为了快速找到目标值,也就是每个机子上都维护了一所有的hash槽并对应的ip地址,因此能快速重定向
  • 还有些客户端 会自己存储 所有的hash槽和 ip地址 就能快速找到服务端

 客户端缓存 slot分配信息 发生命令前,客户端进行slot计算、根据slot分配信息,定位到redisserver 

而什么时候进行更新 重新分配槽信息:定时刷新、收到重定向的响应。

请求的时候,本地进行更新数据。

这里在客户端中中重定向

 如果需要他自动重定向,则需要添加-c命令

分片高可用

在所有的集群的进行连接都是采用集群总线进行连接 (n-1)*2 个进行通信,n表示节点的个数; 从这里可以看出10000的端口号对应着集群的通信,20000的端口号对应哨兵的选取,还有客户端进行通信。

集群总线,客户端口号+10000 每个节点之间都有对应的节点的传入传出TCP连接,用于节点到节点的通信,整体形成一个网络拓扑。避免消息交换太多,用gossip协议进行一种定时传播的信息的协议。

 

 每个节点都有进出的通信,对应着这么(n-1)*2个通信

P2P 网络核心技术:Gossip 协议

高可用达到的情况是可以把c的从节点移动,当A的主节点没有从节点时,移动到A上

这样做的好处,分片自带故障转移的功能。

分片扩容

  •  启动新节点
  •  加入到已经存在的集群作为master

 /usr/local/redis/bin/redis-cli --cluster add-node 192.168.100.242:6387 192.168.100.242:6382
本质就是发送一个新节点通过 CLUSTER MEET命令加入集群
新节点没有分配hash槽

  •  加入到已经存在的集群作为slave

/usr/local/redis/bin/redis-cli --cluster add-node 192.168.100.242:7006 192.168.100.242:7000 --cluster-slave
 可以手工指定master,否则就是选择一个slave数量较少的master   这里是智能添加到少节点的master上的
/usr/local/redis/bin/redis-cli --cluster add-node 192.168.100.242:7006 192.168.100.242:7000 --cluster-slave --cluster-master-id <node-id>
 还可以将空master,转换为slave
cluster replicate <master-node-id>

 

  •  检查集群

/usr/local/redis/bin/redis-cli --cluster check 192.168.100.242:6382

这里通过cluster nodes 命令去查看集群节点的分布情况 

 分片缩容

删除master的时候要把数据清空或者分配给其他主节点

/usr/local/redis/bin/redis-cli --cluster del-node 192.168.100.242:6381 <node-id>

集群slot迁移

slot手动迁移过程
  • 在迁移目的节点执行cluster setslot <slot> IMPORTING <node ID>命令,指明需要迁移的slot和迁移源节点。
  • 在迁移源节点执行cluster setslot <slot> MIGRATING <node ID>命令,指明需要迁移的slot和迁移目的节点。
  • 在迁移源节点执行 cluster getkeysinslot获取该slot的key列表.
  • 在迁移源节点执行对每个keyy执行migrate命令,该命令会同步把该key迁移到目的节点。
  • 在迁移源节点反复执行cluster getkeysinslot命令,直到该slot的列表为空。
  • 在迁移源节点和目的节点执行cluster setslot <slot> NODE <node ID>,完成迁移操作。

集群从节点迁移

redis 集群实现了一个叫做复制(从节点) 迁移的概念,以提高系统的可用性

假设集群有三个主节点 A,B,C。 A、B都各有一个从节点,A1 和 B1。节点C有两个从节点:C1 和 C2
迁移过程如下,大致描述如下:
- 主节点 A 失效。A1 被提升为主节点。
- 节点 C2 迁移成为节点 A1 的从节点,要不然 A1 就没有任何从节点。
- 三个小时后节点 A1 也失效了。
- 节点 C2 被提升为取代 A1 的新主节点。
- 集群仍然能继续正常工作。

猜你喜欢

转载自blog.csdn.net/qq_33373609/article/details/120720991