Redis 集群方案及使用场景 @刘琛林 2017.10.31.

Slides:



Advertisements
Similar presentations
分享人:張益源. 個人資料介紹 姓名:張益源 畢業:體育系 97 級 專長:田徑、籃球、游泳 任教學校:慈濟大學實驗國民小學 學校職務:體育兼資訊老師.
Advertisements

數學社群 教學分享 和平國小 陳淑渟老師 數學社群 教學分享 和平國小 陳淑渟老師. 小一常發生的 學習困難 定位板的應用 序數的學習 困難與教學 突破 主題大綱.
健康.安全年 製作 : 黃靜怡. 安全第一,我想,這是一句大家都耳熟能詳的話吧,說安全, 簡單的說,就是注意自己、眼睛要看、耳朵要聽,不要莽莽 撞撞的,安全是大家所期望的,而父母總是常常掛念我們, 就是希望我們能安全,畢竟,孩子是父母一輩子的牽掛,會 擔心我們的,往往就是關心我們的人,每個人都希望自己做.
【大願文教基金會】園藝治療師 黃盛璘督導、王麗玲執行. 年齡在 2 足歲以上 18 歲以下,經醫學中 心或區域醫 院鑑定為 重度、極重度 身心障礙,不具行動能 力、且不能自理生活,並持有身心障礙 手冊的新北市居民。 八里愛心教養院~服務對象.
教育信息化专题培训 王延觉 2014年5月.
第二十九课 致儿子书 张之洞.
如何陪伴孩子度過 高三歲月.
把人的生命写在教育的旗帜上 了解一个案件 欣赏一篇散文 学习一种理念 感悟一个故事.
六大原因造成 現代人身體酸性化.
【2008年高考重庆卷】A.当冰雪皑皑之际,唯独梅花昂然绽放于枝头,对生命充满希望和自信,教人精神为之一振。
景区讲解常用方法.
私校教職員老年經濟安全之介紹 -退休金3萬與9萬差別-
班級愛心小護士訓練 臺南市東區勝利國小 健康中心.
國有土地管理與運用問題之探討 主講人: 廖 蘇 隆 中華民國100年10月17 日.
项目四 营业税 山东经贸职业学院 财政金融系.
敬业·创业·乐业 ——我的成长之路 赵谦翔.
四年七班親師會 自信學習,健康成長.
穆公(朱金清 微博:淘穆公 阿里HBase业务设计实践 穆公(朱金清 微博:淘穆公
醫療旅遊.
社會發展學系 簡 介.
人物小传:杨嘉嵋,1975年出生,国家 重点四川大学本科毕业,中国传媒大学博士毕业,现为上海政法学院讲师。多次发表学术论文:《试论社会主义法治的目标和现代法治精神的培育》发表于钦州师范高等专科学校校报2000年04期,《西部在引进,利用外资中应重视的问题及对策》发表于四川师范学院学报2000年05期,《试论毛泽东的刑法思想》发表于达县师范高等专科学校学报2001年01期,《美国著名主持人的十点共性》发表于中国广播电视学刊2007年08期,《我国电视法治节目的现状与提升》发表于新闻战线2008年08期。
第二章 语用的主要要素分析 第一节 语境 第二节 预设 第三节 角色 第四节 视角.
从从容容中考去.
美麗的星空 陳弦希製作.
第五章 各类园林绿地的规划设计.
性別刻板印象.
初三8班(上) 期末总结班会.
初三(上) 期末总结班会.
一週菜單設計.
改革开放给我们带来的变化 系别:11商务流通系 班级:物流四班 组员:物四男生组.
大村國小 尋根之旅.
那年我參加瑞士巴塞爾博覽會, 除了接單做貿易,還零售賣品, 以擴大出口商品的影響。
常优
中國醫藥大學 北港分部簡報.
西安国际港务区 入区企业相关地方税收 知识培训
拒绝毒品健康成长 ——张鸿谊.
动商研究中心 让高校体育驶入快车道 --国家“学校体育”相关文件解读 2016 年 05 月 15 日.
第三章 领悟人生真谛 创造人生价值 第一节 树立正确的人生观 创造有价值的人生 第二节 第三节 科学对待人生环境.
鸟的生殖和发育.
会计技能综合实训 ——会计分工.
第十四章 中国特色社会主义事业的依靠力量. 第十四章 中国特色社会主义事业的依靠力量 内容提要 包括知识分子在内的工人、农民是中国特色社会主义事业的根本力量;改革开放以来出现的新的社会阶层是中国特色社会主义事业的建设者;必须认真贯彻尊重劳动、尊重知识、尊重知识人才、尊重创造的重大方针,最广泛最充分地调动一切积极因素;巩固和加强各族人民的团结合作。
终极(13)班 赵树杰 许志鹏 初二(13)班.
全面推廣政府服務流程改造 行政院研究發展考核委員會  主任委員 宋餘俠 102年7月17日.
中国政法大学卫生法研究中心 于秀艳 2011年6月28日 杭州
思想道德修养与法律基础.
第1課 華南地區— 海陸文化的交會區.
妈妈我爱你 你总说我还不懂事 维护我像一张白纸 你眼中我永远是长不大的孩子 虽然我有好多心事 却已不愿说与你知 我曾任性地排斥你爱我的方式
前不久看到了这样一则报道:某个大学校园里,一个大学生出寝室要给室友留一张字条,告诉他钥匙放在哪里。可是“钥匙”两个字他不会写,就问了其他寝室的同学,问了好几个,谁也不会写,没办法,只好用“KEY”来代替了。 请大家就此事发表一下自己看法。
多元文化“地球村”—— 世界文化之旅.
歡樂大派對 六年七班 第一組 自然成果發表會.
利用共同供應契約 辦理大量訂購流程說明.
專題報告: 沒有國哪裡會有家?.
Alibaba 数据库高可用架构 Alibaba
100道素菜 想看哪一道菜時 直接點一下就可進入 1西蘭花燒豆腐 2蕃茄炒凍豆腐 3東坡豆腐 4.西芹腰果百合 5土豆燉番瓜 6香椿豆腐
就在那裡上主要我去.
面向高能所信息化系统的高可用数据库服务 王丽 计算中心 中科院高能所 第十八届全国科学计算与信息化会议.
CHAPTER 6 認識MapReduce.
環境教育宣導 疼愛地球 珍惜資源 愛護環境.
Redis 客户端和工具集 潘海龙 平安健康互联网
校外教學六福村一日遊.
債之標的 楊智傑.
办公自动化基础 主讲教师:韩伟颖. 办公自动化基础 主讲教师:韩伟颖 第十章 数据的处理与分析 10.1 数据排序 10.2 数据筛选 10.3 分类汇总 10.4 创建与编辑图表.
契約與規範期末報告 -旅遊定型化契約書 指導老師:李惠圓 班級:四動二A 組別:第一組 組員:4970T010許欣婷 4970T041林姿汶
環境教育宣導 疼愛地球 珍惜資源 愛護環境.
兒童及少年保護、 家庭暴力及性侵害事件、 高風險家庭 宣導與通報
保變住開發要點 資料來源:台北市政府都發局.
附件六 慢飛天使 智能障礙介紹 炫寬愛心教養家園介紹 2019/5/27.
2007年六十四个热点话题 写作提示及解说.
太空人是載人航太的核心。選拔和訓練太空人是一個國家可以獨立自主實施載人航太的重要標誌之一。
银川社保网上申报 宁夏人力资源和社会保障 网上服务大厅操作
Presentation transcript:

Redis 集群方案及使用场景 @刘琛林 2017.10.31

为什么集群? 随着公司业务的发展,访问量和数据量会不断上升,而内存资源往往是有限制 的,纵向扩展不是一个好办法,我们需要横向可伸缩扩展,这需要由多台主机 协同提供服务,即分布式多个Redis实例协同运行。 其次,目前多核CPU,几十G内存的主机很普遍,对于主进程是单线程工作的 Redis,只运行一个实例就显得有些浪费。同时,管理一个巨大内存不如管理相 对较小的内存高效。 Redis集群的目标就是为了实现高可用性,避免性能瓶颈,可动态扩容,易于做 监控告警。 Redis单线程特性,多请求顺序执行,单个耗时的操作会阻塞后续的操作 单机内存有限 某些特殊业务,带宽压力较大 单点问题,缺乏高可用性 不能动态扩容

Redis集群实现方式 实现基础——分区 实现方案: 客户端分片 基于代理的分片 Twemproxy Codis 路由查询 分区是分割数据到多个Redis实例的过程,因此每个实例只保存全部key的一个子集。 通过利用多台计算机内存的和值,允许我们构造更大的数据库。 通过多核和多台计算机,允许我们扩展计算能力;通过多台计算机和网络适配器,允许我们扩展网络带宽。 实现方案: 客户端分片 基于代理的分片 Twemproxy Codis 路由查询 Redis Cluster

客户端分片 由客户端决定key写入或者读取的节点。 包括jedis在内的一些客户端,实现了客户端分片机制。 特性 优点 简单,相比于使用代理,减少了一层网络传输的消耗,效率较高。 缺点 业务逻辑与数据存储逻辑耦合 可运维性差 多业务各自使用redis,集群资源难以管理 不支持动态增删节点 Redis客户端 Redis实例 Redis实例 Redis实例

Twemproxy 特点: 支持失败的节点自动摘除(仅作为缓存时) 所有的key通过一致性哈希算法分布到集群中所有的redis实例中 代理与每个redis实例维持长连接,减少客户端和redis实例的连接数 代理是无状态的,可以任意部署多套,避免单点问题 默认启用pipeline,连接复用,提高效率,性能损失在 10% - 20% 多种hash算法:能够使用不同的分片策略和散列函数 可以设置后端实例的权重 支持状态监控 需要依赖于一些其他的程序组件。

Redis-Sentinel是Redis官方推荐的高可用性解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis没有实现自动进行主备切换,而Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。

Twemproxy 不足: 虽然使用 c 开发,性能损失较小,但同样是单线程。所以基本上twemproxy的数量需要和后端redis实例一样甚至更多才能充分发挥多实例的并发能力,造成运维困难。 twemproxy更改配置文件需要重新启动,比较坑,需要修改代码使其支持动态加载。 无法动态扩容,如果需要实现这个功能,要么自己写迁移脚本,手动迁移,比较繁琐,还会影响到当前服务的正常运行。 性能低:代理层损耗 && 本身效率低下,实测大约在20% 不支持针对多个值的操作,比如取sets的子交并补等(MGET 和 DEL 除外) 不支持Redis的事务操作 失去维护 最近一次提交在一年之前。

Codis Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有显著区别 ,上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务。 Codis Twemproxy Redis Cluster resharding without restarting cluster Yes No pipeline hash tags for multi-key operations multi-key operations while resharding - No(details) Redis clients supporting Any clients Clients have to support cluster protocol

Codis模块简介 Codis Server 基于 redis-2.8.21 分支开发。增加了额外的数据结构,以支持 slot 有关的操作以及数据迁移指令。 Codis Proxy 客户端连接的 Redis 代理服务, 实现了 Redis 协议。 对于同一个业务集群而言,可以同时部署多个 codis-proxy 实例 不同 codis-proxy 之间由 codis-dashboard 保证状态同步。 Codis Dashboard 集群管理工具,支持 codis-proxy、codis-server 的添加、删除,以及据迁移等操作。 所有对集群的修改都必须通过 codis-dashboard 完成。 Codis Admin 集群管理的命令行工具。 可用于控制 codis-proxy、codis-dashboard 状态以及访问外部存储。 Codis FE 集群管理界面。 Codis HA 为集群提供高可用。 依赖 codis-dashboard 实例,自动抓取集群各个组件的状态; 会根据当前集群状态自动生成主从切换策略,并在需要时通过 codis-dashboard 完成主从切换。 Storage 为集群状态提供外部存储。 目前仅提供了 Zookeeper 和 Etcd 两种实现,但是提供了抽象的 interface 可自行扩展。

Codis Codis是一整套缓存解决方案,包含高可用、数据分片、监控、动态扩态 etc.。走的是 Apps->代理->redis cluster。 Codis引入了Group的概念,每个Group包括1个Redis Master及至少1个Redis Slave,这是和Twemproxy的区别之一。这样做的好处是,如果当前Master有问题,则运维人员可通过Dashboard“自助式”切换到Slave,而不需要小心翼翼地修改程序配置文件。 为支持数据热迁移(Auto Rebalance),出品方修改了Redis Server源码,并称之为Codis Server。 Codis采用预先分片(Pre-Sharding)机制,事先规定好了,分成1024个slots(也就是说,最多能支持后端1024个Codis Server),这些路由信息保存在ZooKeeper中。 Codis仅负责维护当前Redis Server列表,由运维人员自己去保证主从数据的一致性。 支持Pipeline 使得客户端可以发出一批请求,并一次性获得这批请求返回结果。

Redis Cluster Redis官方推出,可线性扩展到1000个节点 无中心架构 一致性哈希思想,预分片 增加slave做数据副本,同时可用于切换,使集群快速恢复。 实现故障自动切换。节点之间通过gossip协议交换状态信息;投票机制完成slave到master角色的提升。 客户端直连redis服务,免去了proxy代理的损耗 降低硬件成本和运维成本,提高系统的扩展性和可用性。

数据分布:预分片 预先分配好 16384 个slot slot 和 server 的映射关系存储每一个 server 的路由表中,每个节点中都包含集群所有的节点信息 根据 CRC16(key) mod 16384 的值,决定将一个key放到哪一个slot中 数据迁移时就是调整 slot 的分布

架构:去中心化 每个节点中不会存有有重复数据,仅仅有自己的从机帮忙冗余。 集群中的节点不会代理请求:即如果client将命令发送到错误的节点上,操作会失败,但会返回”-MOVED”或”-ASK”,供client进行永久或临时的节点切换(需要 smart-client 支持),所以client连接集群中任意一个节点都可以 节点添加,或宕机或不可达的情况下还可以正常使用

可用性:Master-Slave 每个Redis Node可以有一个或者多个Slave,当Master挂掉时,选举一个Slave形成新的Master。 Master Slave 之间异步复制(可能会丢数据)。 采用 gossip 协议探测其他节点存活状态,超过 cluster-node-timeout,标记为 PFAIL,PING中附加此数据。当 Node A发现半数以上master将失效节点标记为PFAIL,将其标记为FAIL,广播 FAIL。 各 slave 等待一个随机时间后 发起选举,向其他 master 广播,半数以上同意则赢得选举否则发起下一次选举 当 slave 成为 master,先广播,后持续PING,最终集群实例都获知此消息

动态扩容/缩容 在目标节点上声明将从源节点上迁入Slot 在源节点上声明将往目标节点迁出Slot 批量从源节点获取KEY CLUSTER SETSLOT <slot> IMPORTING <source_node_id> 在源节点上声明将往目标节点迁出Slot 批量从源节点获取KEY CLUSTER GETKEYSINSLOT <slot> <count> 将获取的Key迁移到目标节点 MIGRATE <target_ip> <target_port> <key_name> 0 <timeout> 重复步骤3,4直到所有数据迁移完毕 分别向双方节点发送 CLUSTER SETSLOT <slot> NODE <target_node_id> 该命令将会广播给集群其他节点,已经将Slot转移到目标节点。 等待集群状态变为OK CLUSTER INFO 中的 cluster_state = ok

现阶段存在的问题: Gossip协议通信开销 严重依赖于smart-client的成熟度 (PHP redis 扩展) 如果smart-client支持缓存slot路由,需要额外占用内存空间,为了效率需要建立和所有 redis server 的长连接(每一个使用该库的程序都需要建立这么多连接)。 如果不支持缓存路由信息,会先访问任意一台 redis server,之后重定向到新的节点。 需要更新当前所有的client。 官方只提供了一个ruby程序 redis-trib 完成集群的所有操作,缺乏监控管理工具,很难清楚目前集群的状态 数据迁移以Key为单位,速度较慢 某些操作不支持,MultiOp和Pipeline都被限定在命令中的所有Key必须都在同一Slot内

Redis集群方案各参数比较 Twemproxy Codis Redis Cluster 性能   Twemproxy Codis Redis Cluster 性能 1、 单点的话比起原子redis降低20%左右; 2、 增加PIPELINE管道提高性能 只要是代理的设计性能瓶颈肯定在其,因redis实在太快 1、 相当于单redis实例40%性能丢失(从最开始的版本比Twemproxy慢20%至目前比其快100%); 2、 弥补:增加proxy数量和支持多核,比起Twemproxy还是好一点,因Twemproxy最好的情况跑满一个CPU; 3、 弥补:增加PIPELINE管道提高性能 没什么损失,追求的就 是这个 1000个节点内拥有线性的伸缩性,和操作redis实例性能差不多 分片算法 Redis一致hash,当初设计好如后续变更修改(增减节点)需要配置proxy通知新的算法,重启服务 通过presharding采用solt槽位的形式,整个集群分为1024个哈希槽,分片算法位SlotId = crc32(key) % 1024,增减节点不需要重启服务 采用solt槽位的形式,整个集群分为16384个哈希槽,分片算法位SlotId = crc16(key) % 16384,增减节点不需要重启服务 所需组件 Redis、twemproxy(nutcracker) Codis、zookeeper Redis,客户端支持 服务启动 方式 单进程 多进程

Redis集群方案各参数比较 Twemproxy Codis Redis Cluster 水平扩容 缩容(增 减节点)   Twemproxy Codis Redis Cluster 水平扩容 缩容(增 减节点) Redis存储层操作,不提供自动的解决方案,并且要自己写脚本支持数据的搬迁活动,然后更改proxy哈希算法,重启服务 Redis存储层,都是在线操作(扩容数据迁移,缩容的话先搬迁数据至别的节点,然后下线该节点) 没有代理和存储之分, 可以在线操作(扩容数 据迁移,缩容的话先搬 迁数据至别的节点,然 后下线该节点) 主从是否 必须 1、 没有数据复制不影响可 用节点代替故障节点 2、 如果没有做备份,故障节点key全部丢失 1、 故障节点如果没有备份,则 丢失掉该组的所有数据,但是不 影响其他组的运行,不会导致整 个集群坏掉 2、 如有备份节点,则把其升为主节点,集群没有影响,正常运转(需要管理员手动变更从节点为主节点,最新版本添加HA功能) 没有主从复制的节点一旦故障,将导致整个集群不可用,无法写入或者读入任何key,无法进行数据重新分片 官网建议:至少3主3从 主从特点 基于redis本身的主从方案(利用发布/订阅机制,采用广播形式), 采用异步复制(asynchronous replication)的方案,无论是master端还是slave端都不会引起阻塞,但是肯定是存在数据丢失的情况 集群设计 1、 proxy部署高可用(多proxy结合keepalived+haporxy) 2、 redis层设计多主多从部署 1、 proxy部署(多proxy+zookeeper集群方案,并且结合keepalived+haporxy) 2、 codis-server部署多组,每组部署一主多从架构 利用redis本身部署集群:至少3主3从

Redis集群方案各参数比较 Twemproxy Codis Redis Cluster 故障监控 自带监控并告警 目前还没有提供 功能限制 1、 不支持多key操作 2、 不支持事务 3、 不支持EVAL 比较多,可以查看官方文档 1、 复杂的多KEY(set求并求交集)不能跨节点操作 2、 不支持MULTI/EXEC 提供支持 不在维护 目前活跃状态 官网主打 概括 1、 轻量级 2、 在proxy层实现一致性哈希 3、 快速的故障转移 4、 可借助sentinel实现底层HA 5、 每次变更必须重启生效 1、 基于zookeeper的proxy高可用,zookeeper会记录整个集群的生存状态,则需要维护好zookeeper 2、 优势为动态水平扩容, 平衡数据,在迁移的时候不 影响业务访问和响应时间 3、 Dashboard操作降低人失误率,图形直观查看信息 4、 强一致数据(也是设计 的重点) 1、 性能好(也是设计的原 则) 2、 无中心组织结构,有利 有弊 3、 故障转移响应时间长 4、 有写丢失,比较频繁

总结:没有最好的架构,只有最合适的架构 参考资料: http://www.jianshu.com/p/14835303b07e http://www.voidcn.com/article/p-sasaebpg-ko.html http://blog.fatedier.com/2015/09/15/redis-cluster-survey/ http://www.sohu.com/a/79200151_354963 https://www.zhihu.com/question/21419897/ http://blog.csdn.net/dc_726/article/details/48552531 http://www.jianshu.com/p/ee2aa7fe341b http://www.cnblogs.com/verrion/p/redis_structure_type_selection.html https://github.com/twitter/twemproxy/ https://github.com/CodisLabs/codis