通俗易懂 codis 理论知识,codis是如何工作的
Tofloor
poster avatar
heisen
deepin
2020-06-27 04:06
Author
初学者有很多写的不对的地方望多多指教,不喜勿喷
Codis简介
Codis是一个分布式 Redis服务,它将多台redis服务器 通过网络相连接,将多台redis服务器的内存叠加起来,从而可以解决redis内存空间有限的问题,也解决了如果redis内存过大,会导致rdb快照文件过大,而rdb快照文件过大又会导致导致 在主从备份等操作时严重占用系统性能和网络资源的问题,所以单台redis服务器内存大小建议为10G左右。
codis 可以被看成是无限内存的redis服务器, codis有动态扩/缩容的能力. 对偏存储型的业务更实用, 对于海量的 key, value不太大( *<= 1M* ), 随着业务扩展缓存也要随之扩展的业务场景有特效.
codis对程序的调用几乎是透明的,就像调用一台redis服务器一样,当然他也不是完全支持redis命令, 比如你需要 SUBPUB 之类的指令, Codis 是不支持的. 时刻记住 Codis 是一个分布式存储的项目 。




Redis 讲解
在讲清楚codis之前我们必须先了解以下redis,R以及他的主从复制,和哨兵。
什么是redis?
redis 可以被看做是基于内存的数据库,他将数据存放在内存中。因为数据存放于内存,所以io性能非常高,一般用于做数据库的缓存使用,从而解决在高并发环境中,数据库压力过大的问题。在传统的架构中,java/php程序直接从数据库读取数据,但在redis架构中,java/php首先读取redis,当在redis中能找到数据时直接返回结果,如果在redis中找不到结果,则转而访问比如mysql数据库,然后将得到的数据写入redis缓存,并返回结果。


什么是redis主从?
单台redis服务器很容易出现单点故障,比如redis服务器坏了,那么他内存中的数据将全部丢失,虽然他有持久化方案。这时候我们就需要两台以上的服务器,一台redis做master对外提供服务,另一台做slave,他的任务是只取备份master的数据,首先需要读取master的rdb快照文件,完整备份master的数据,而后会定期执行master的aof日志,实时与master保持数据同步。



什么是redis哨兵?
在上面例子中,虽然master的数据得到了保障,就算master宕机,还有slave有数据备份,但是在生产环境中假如master挂了,那么在java程序中写的redis地址是master的,这时想要这套环境继续工作,就需要手动操作,更换IP地址。要知道就算在现场,更换ip也需要好几分钟,这都是白花花的银子。
这时哨兵闪亮登场,哨兵(sentinel) 会不断地检查你的Master和Slave是否运作正常。当被监控的某个 Redis出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他应用程序发送通知。当一个Master不能正常工作时,哨兵(sentinel) 会开始一次自动故障迁移操作,它会将失效Master的其中一个Slave升级为新的Master, 并将原Master和其他Slave改为复制新的Master; 当客户端试图连接失效的Master时。在这个环境中java程序只需要访问哨兵的地址即可。哨兵至少需要 3 个实例,来保证自己的健壮性









codis 讲解什么是codis?
上面的环境看起来已经很完美了,有主从备份,有哨兵的高可用,但是还差了一个环节,那就是分布式集群。可以看出在上面的环境中,同一时间对外提供服务的redis服务器始终只有一台,上面说了,redis数据存放在内存中,在大的生产环境中一台服务器的内存空间显然是有限的,而且即便他是内存,在海量的读写面前他的性能也显得那么微不足道。
所以就引出了我们的主题,codis。


Codis是一个分布式 Redis服务,它将多台redis服务器 通过网络相连接,将多台redis服务器的内存叠加起来,从而可以解决redis内存空间有限的问题。codis通过算法将数据分布在不同的服务器中,从而也提高了他的i\o性能。
codis在逻辑上引入了曹的概念,数据根据算法分布于1024个曹中,codis将1024个曹平均分布在每台redis服务器上,也就是说codis最多允许有1024台redis服务器组(一套主从(master+slave)称之为一个组)。而这些数据具体存放在哪个服务器中谁也不知道,但这些数据全部记录在zookeeper中,所以codis需要依赖于zookeeper。并且zookeeper的可靠性非常重要,毕竟zookeeper没了,就等于数据没了。所以在生产环境中一般部署三台以上zookeeper,以保障数据可靠




codis 组件:
Codis-Server:基于 redis-3.2.8 分支开发。增加了额外的数据结构,以便支持 slot(曹) 有关的操作以及数据迁移指令。具体的修改可以参考文档 redis 的修改
Codis-Proxy:是codis的代理服务, 实现了 Redis 协议,用户可以向访问redis服务器一样访问他,但部分命令不支持。 用户只需要访问codis-proxy,流量会被代理到对应的redis服务器。proxy是无状态的,即他本身不存储任何数据,所以可以同时部署多个 codis-proxy 实例,然后使用lvs等产品进行负载均衡。
Codis Dashboard:集群管理工具,可以通过dashboard 的添加、删除 codis-proxy和codis-server,以及据迁移等操作。对于同一个业务集群而言,同一个时刻 codis-dashboard 只能有 0个或者1个;
Codis FE:集群管理界面。通过web界面管理集群,相当于可视化的dashboard
Storage:为集群状态提供外部存储,将codis状态工作数据记录于Zookeeper使用。




一楼继续更

Reply Favorite View the author
All Replies
avatar
heisen
deepin
2020-06-27 04:07
#1
本帖最后由 ybaojun 于 2020-6-26 20:09 编辑

codis工作原理
假如现在有一条数据在codis环境中没有找到,java程序去mysql中读取到了这条数据,然后要将这条数据缓存到codis。
此时数据会被发往codis-proxy,proxy会根据算法将数据存放在对应的slot中,(也就是存放在下面的某一个redis组中),并将存放在哪个组中的记录写入zookeeper。
比如要存放在第二个组中,那么proxy会将数据转发到第二个组的master服务器,是的,是直接转发到第二个组的master服务器,而不是转发给哨兵,因为在这套环境中哨兵最少可以只保留一个(如果不考虑高可用),那你转发给哨兵,哨兵可能也不知到找谁
那么你可能就会有一个疑问,proxy是怎么把数据准确的转发给这个组中的master服务器的呢,而不是slave?实际上codis-proxy一直在监听哨兵的选举信息,并记录新的选举信息到zookeeper。
假设现在某一个组的master宕机了,哨兵会通知slave master挂了,需要一个slave升级为master,并告诉其他slave指向新的master,然而这一切都被有心人codis-proxy记录到zookeeper中,并且在下次数据转发到该组时,就能够准确的找到master了


codis部署拓扑方案
Reply View the author