redis如何支撑1T+海量数据?

  |   0 评论   |   0 浏览

系统发展到一定程度,你的数据会越来越多,在这种大型系统里面,我们应该怎么保证高并发呢?

讲到高并发,大家第一想到的就是redis。redis的主从架构可以支持高并发,但是海量数据的话,是没办法支持的,因为只有一个master来负责写,那这个master的内存有多大,就代表这个主从架构可以存放多少数据。如果你的系统流量很大,数据量也很大,单master不能支撑大量的数据,大量的请求到达数据库,很容易就把数据库压垮了。那海量数据的时候,redis怎么才能支撑呢?redis还有一个集群叫redis cluster。该集群就是把master作为集群,每个master存储一定的数据,对数据进行分片存储。从而来实现支撑1T+海量数据。

先来大概介绍下redis cluster:
1、自动把数据进行分片,每个master上放一部分数据;
2、提供内置的高可用;
在cluster架构下,redis需要开通两个端口,一个如6379,另一个是加10000的端口号,该端口号是用来节点间通信的,也就是cluster bus 也叫集群总线。他的作用是故障检测,配置更新,故障转移授权。
cluster bus用了另外一种二进制的协议,主要用于节点间数据高效交换,占用更少的网络带宽和处理时间。

分布式数据存储的算法有:hash算法、一致性hash算法、redis cluster hash slot算法。

1、hash算法
hash算法是算出一个数据的hash值然后对一个固定数做取模运算。这样就可以把数据分布在几个地方。现在这个算法比较常用的场景是在数据库分库分表上,缓存框架上面一般不使用该算法。

imagepng
如果master挂掉了,那缓存里所有的数据都查询不到。

2、一致性hash算法
一般使用在memcache里面;

imagepng
如果其中一个master节点挂掉了,那只有1/3的数据丢失了,其他的数据不会受影响。相比于hash算法,受影响的数据少很多。
但是会有缓存热点问题:可能在某个hash区间内的数据特别多,如果这个节点挂了,那会有大量的数据涌入数据库,造成性能瓶颈。

解决缓存热点问题:
imagepng

3、redis cluster hash slot算法
redis cluster有固定的16384个hash slot,对key计算CRC16值,然后对16384取模,可以获取key对应的hash slot。
每个master都会拥有一部分slot,比如有3个master,那每个master都会有5000多个slot。
增加一个master,只要把部分slot移动过去,删除一个master,只要把他对应的slot移到其他master上。
slot的增加和删除成本非常低。

imagepng

一般在生产环境需要配置3个master和3个slave,如果部署在6台机器上最好,没有6台也至少要3台,可以保证master和slave不在同一台机器上。

slave自动迁移
在master下面可以配置多个slave,如果master下面的slave挂了,一个slave都没了,那冗余的slave就会自动迁移到没有slave的master下面,所以我们可以冗余一些slave,这样可用性就更高了。

节点间的内部通信机制
redis cluster节点间采取gossip协议进行通信
imagepng

集中式元数据
imagepng

集中式:
好处在于,元数据的更新和读取,时效性非常好,一旦元数据出现了变更,立即就更新到集中式的存储中,其他节点读取的时候立即就可以感知到;
不好在于,所有的元数据的更新压力全部集中在一个地方,可能会导致元数据的存储有压力。

gossip:
好处在于,元数据的更新比较分散,不是集中在一个地方,更新请求会陆陆续续,打到所有节点上去更新,有一定的延时,降低了压力;
不好在于,元数据更新有延时,可能导致集群的一些操作会有一些滞后。

redis cluster主备切换原理
1、判断节点宕机
如果一个节点认为另外一个节点宕机,那么就是pfail,主观宕机;
如果多个节点都认为另外一个节点宕机了,那么就是fail,客观宕机;
在cluster-node-timeout内,某个节点一直没有返回pong,那么就被认为pfail;
如果一个节点认为某个节点pfail了,那么会在gossip ping消息中,ping给其他节点,如果超过半数的节点都认为pfail了,那么就会变成fail。

2、从节点过滤
对宕机的master node,从其所有的slave node中,选择一个切换成master node;
检查每个slave node与master node断开连接的时间,如果超过了cluster-node-timeout * cluster-slave-validity-factor,那么就没有资格切换成master;

3、从节点选举
每个从节点,都根据自己对master复制数据的offset,来设置一个选举时间,offset越大(复制数据越多)的从节点,选举时间越靠前,优先进行选举;
所有的master node开始slave选举投票,给要进行选举的slave进行投票,如果大部分master node(N/2 + 1)都投票给了某个从节点,那么选举通过,那个从节点可以切换成master;
从节点执行主备切换,从节点切换为主节点

redis cluster的重要配置

是否开启cluster
cluster-enabled <yes/no>

这是指定一个文件,供cluster模式下的redis实例将集群状态保存在那里,包括集群中其他机器的信息,比如节点的上线和下限,故障转移,不是我们去维护的,给它指定一个文件,让redis自己去维护的
cluster-config-file <filename>

节点存活超时时长,超过一定时长,认为节点宕机,master宕机的话就会触发主备切换,slave宕机就不会提供服务
cluster-node-timeout <milliseconds>

关注公众号,更快获取文章

本文为博主原创文章,未经博主允许不得转载。