IT修真院·小课堂丨互联网职业小课堂在线学习平台

课堂课题:

什么叫集群?缓存应该在什么情况下使用集群?有哪些实现集群的方案?

关联任务:

任务五

直播时间:

2018-12-23 16:30:00


课堂内容:

视频链接:

PPT链接:

提交按钮:

小课堂内容格式


标题:

【修真院xx(职业)小课堂】课题名称

开场语:

大家好,我是IT修真院XX分院第X期的学员XX,一枚正直纯洁善良的XX程序员,今天给大家分享一下,修真院官网XX(职业)任务X,深度思考中的知识点——XXX

(1)背景介绍:

背景介绍的时候,尽可能的要宽广,讲清楚来龙去脉,讲清楚为什么会需要这个技术。

(2)知识剖析:

讲知识点的时候,尽可能的成体系,学会成体系的去给别人介绍知识。现在很多做的都是零散的,没有分类。

(3)常见问题:

最少列出1个常见问题。

(4)解决方案:

写清楚常见问题的解决方案。

(5)编码实战:

尽可能的去寻找在真实项目中在用的。如果你能找到某个网站在用你说的知识点,这是最好的。学以致用,否则当成练习题就没有意义了。多准备一些demo,讲解过程中将知识点和demo结合,便于大家理解所讲解的知识点。

(6)拓展思考:

知识点之外的拓展思考,由分享人进行讲解,这些东西就是所谓的深度,也是一个人技术水准高低比较的表现。

(7)参考文献:

引入参加文献的时候,在引用的句子后面加上序号【1】。参考文献中列出详细来源。不要去抄别人的东西,这是一个基本的态度。

(8)更多讨论:

Q1:提问人:问题?
A1:回答人(可以是分享人,也可以是其他学员):回答
Q2:提问人:问题?
A2:回答人(可以是分享人,也可以是其他学员):回答
Q3:提问人:问题?
A3:回答人(可以是分享人,也可以是其他学员):回答

(9)鸣谢:

感谢XX、XX师兄,此教程是在他们之前技术分享的基础上完善而成。

(10)结束语:

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

什么叫集群?缓存应该在什么情况下使用集群?有哪些实现集群的方案?     中品

辅导师兄 [真传弟子]JAVA-刘凯


【修真院java 小课堂】 redis缓存集群简单入门


大家好,我是IT修真院郑州分院第12期的学员张泉良,一枚正直纯洁善良的JAVA程序员,

今天给大家分享一下,修真院官网JAVA任务五,深度思考中的知识点——redis缓存集群简单入门


1. 背景介绍:


(1)Redis作为一个使用场景很高的NoSQL数据库,支持了较为丰富的数据类型,相比于其他关系型数据库在性能方面优势明显。所以可以将一些热点数据放入Redis中来承载高吞吐量的访问。

 (2)单机Redis在普通的服务器上通常ops上限在5w左右,开启pipeline的情况下在20-30w左右。对于大多数中小公司来说,通常单机的Redis已经足够,最多根据不同业务分散到多台Redis。


(3)为什么需要集群

Redis单线程特性,多请求顺序执行,单个耗时的操作会阻塞后续的操作

单机内存有限

某些特殊业务,带宽压力较大

单点问题,缺乏高可用性

不能动态扩容


2. 知识剖析:


(1) 什么是集群

集群是是指将多台服务器集中在一起,每台服务器都实现相同的业务,

做相同的事情。但是每台服务器并不是缺一不可,

存在的作用主要是缓解并发压力和单点故障转移问题。

可以利用一些廉价的符合工业标准的硬件构造高性能的系统。实现:高扩展、高性能、低成本、高可用!


(2) redis集群

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,

包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。

redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。

Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施。把多个redis实例整合在一起,形成一个集群

也就是将数据分散到集群的多台机器上。当数据量过大一个主机放不下的时候,就需要对数据进行分区,

将key按照一定的规则进行计算,并将key对应的value分配到指定的Redis实例上

 

(3) 一致哈希性        

      图全部不能贴了,(本地上传或者ctrl+v),以下图都用 img 标签引入

       

    <img src="https://note-1256974902.cos.ap-chengdu.myqcloud.com/note/20181223152259.png">    

     <img src="https://note-1256974902.cos.ap-chengdu.myqcloud.com/note/20181223152519.png">

     <img src="https://note-1256974902.cos.ap-chengdu.myqcloud.com/note/20181223152613.png">


3. 常见问题:


 (1)、redis集群解决方案----------------客户端静态分片

      需要 smart-client 支持,在业务程序端根据预先设置的路由规则进行分片,从而实现对多个redis实例的分布式访问

                    <img src="https://note-1256974902.cos.ap-chengdu.myqcloud.com/note/20181223113556.png">

      优点: 相比于使用代理,减少了一层网络传输的消耗,效率较高。

      缺点: 当redis实例需要扩容或切换的情况下,较为麻烦。并且需要维护各个语言的客户端版本


(2)、redis集群解决方案--------------Proxy分片

     <img src="https://note-1256974902.cos.ap-chengdu.myqcloud.com/note/20181223115827.png">

 通过统一的代理程序访问多个redis实例,比如 豌豆荚开源的 codis。

 优点: 业务程序端只需要使用普通的api去访问代理程序即可,也避免了客户端需要维持和每个redis实例的长连接导致连接数过多。

  缺点: 增加了一层中间件,增加了网络和数据处理的消耗,性能下降


(3)、redis集群解决方案--------------------Redis Cluster


数据分布:预分片

<img src="https://note-1256974902.cos.ap-chengdu.myqcloud.com/note/20181223114508.png"/><br>

预先分配好 16384 个slot

slot 和 server 的映射关系存储每一个 server 的路由表中

根据 CRC16(key) mod 16384 的值,决定将一个key放到哪一个slot中

数据迁移时就是调整 slot 的分布   


去中心化:

<img src="https://note-1256974902.cos.ap-chengdu.myqcloud.com/note/20181223114758.png"/>


每个Redis Node可以有一个或者多个Slave,当Master挂掉时,选举一个Slave形成新的Master。

Master Slave 之间异步复制(可能会丢数据)。

采用 gossip 协议探测其他节点存活状态,超过 cluster-node-timeout,标记为 PFAIL,PING中附加此数据。

当 Node A发现半数以上master将失效节点标记为PFAIL,将其标记为FAIL,broadcast FAIL。

各 slave 等待一个随机时间后 发起选举,向其他 master broadcast,半数以上同意则赢得选举否则发起下一次选举   

      

4. 编码实战:

 本地以及服务器搭建redis集群

5. 拓展思考:


(1):为什么哈希槽的数量固定为16384?

由于使用CRC16算法,该算法可以产生2^16-1=65535个值

1、redis的一个节点的心跳信息中需要携带该节点的所有配置信息,而16K大小的槽数量所需要的内存为2K,如果使用65K个槽,这部分空间将达到8K,心跳信息就会很庞大。

2.、Redis集群中主节点的数量基本不可能超过1000个

3、 Redis主节点的配置信息中,它所负责的哈希槽是通过一张bitmap的形式来保存的,

N表示节点数,如果节点数很少,而哈希槽数量很多的话

 但是如果bitmap的填充率slots/N很高的话,bitmap的压缩率就很低


(2):redis怎么选择适合的持久化策略


1、LRU缓存(临时缓存)

2、持久化缓存


RDB - 快照:预设频率write on copy来持久化数据


高内存,空间小,速度快


AOF - 持久化:将每个收到的写指令通过write函数追加到文本 appendonly.aof 中,通过将新记录追加到文本尾部来持久化数据

低内存,空间大,速度慢



6. 参考文献:


http://redisdoc.com/topic/cluster-tutorial.html

https://blog.csdn.net/cywosp/article/details/23397179

https://juejin.im/post/5a707f4d5188255a8817f5b1

https://blog.csdn.net/u010648555/article/details/79427608

  

7.  更多讨论:

Q1:  使用redis开放外网访问,可能导致不良后果?

A1: 可能导致注入ssh秘钥,从而使服务器暴露在互联网上,最好加上密码(复杂度要高) 

Q2:   redis相比memcached有哪些优势?

A2:   

(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型

(2) redis的速度比memcached快很多

(3) redis可以持久化其数据


Q3:  MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据

A3:  

redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供 6种数据淘汰策略:

voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

no-enviction(驱逐):禁止驱逐数据


8.  鸣谢:

9.  结束语:

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~


评论

[真传弟子]JAVA-刘凯 发表于 2019-01-02 15:29:29 #1

介绍的很好,使用不同的方案需要结合相应的业务场景

回复

请您登录 后进行评论