envoyproxy是如何支持redis协议的?
Posted it_worker365
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了envoyproxy是如何支持redis协议的?相关的知识,希望对你有一定的参考价值。
官方文档
跨集群访问redis_cluster的问题是如何通过envoy解决的?
概览
代码细节
envoy基于nio网络编程,框架除了处理连接相关事宜外,业务都是扩展自各类事件的响应及回调
对于redis,envoy做了哪些扩展,先总体看下source/extensions
第一部分处理了cluster负载均衡相关实现,第二部分处理了命令协议、类型的封装编解码,客户端及事件封装等;第三部分提供了redis拦截入口,对命令的二次加工;
注册
source/extensions/filters/network/common/redis_proxy/config.cc
source/extensions/cluster/redis/redis_cluster.cc
负载均衡计算
通过实现Upstream::LoadBalancer的chooseHost被回调
chooseHost的具体实现在cc中,可以看到这里现实computeHashKey()得到hash再根据hash.value()%16384定位到具体的slot_array_
computeKey()就是返回了hash_key_,那么看下这个值怎么算出来
集群信息生成
选择算法看起来就是从slot_array_里按照rediscluster一样的策略搞一遍,再来看下集群节点是如何生成的
实现了Upstream::BaseDynamicClusterImpl,构造了redis命令CLUSTER SLOTS
通过回调,连接配置的集群信息,注册回调,发送请求
redis_cluster.cc中响应回调,当收到redis cluster slot命令响应之后,解析,存入cluster_slots且调用onClusterSlotUpdate通知
最终调用到redis_cluster_lb*,将信息更新到内存对象
命令处理
redis协议解码后, 经过filter处理命令
根据请求数据做对应的操作, 有些是直接在proxy拦截执行, 有些是请求redis返回结果, 有些在proxy再做一次聚合等
支持redis 协议的强一致raft 集群
raftis
我们用floyd(我们实现的raft 库) 包装了一个支持redis 协议的强一致集群, 还是很方便的.
欢迎围观(点击阅读原文查看源代码)
https://github.com/Qihoo360/floyd/tree/master/floyd/example/redis
floyd 是360 基础架构组实现的支持raft 协议的 library. 目前已被采纳为 raft 官方推荐cpp 版本协议实现之一
Floyd是一个C++实现的Raft一致性协议库。
Raft是一个相对于Paxos更容易理解和工程实现的一致性算法;
Floyd是一个一致性库,可以很容易引入到各种项目;
Floyd支持集群节点之间的一致性操作,例如:Read/Write/Delete;
同时也支持非一致性的本地数据访问接口: DirtyRead/DirtyWrite;
以及查询、管理接口:GetLeader/GetServerStatus/set_log_level
用户
Floyd 目前应用在Zeppelin中,为其Meta集群提供一致性的存储;Zeppeli是一个大容量的分布式key-value存储;
陆续会有新的项目在使用;
我们为什么倾向于库,而不是一个服务?
当我们在有服务发现、协调和管理的需求时,ZooKeeper是一个很好的选择,但是有一定成本.
我们必须维护一套新的ZooKeeper的服务;
我们也必须使用其SDK,去和ZooKeeper服务交互;
我们认为,一个集成、单一的服务通常会比多个服务更加可控、简单. 所以,作为一个库来使用,能够简化整体的架构.
Floyd功能和API
API和具体使用
type | API | Status |
---|---|---|
一致性接口 | Read | 支持 |
一致性接口 | Write | 支持 |
一致性接口 | Delete | 支持 |
本地接口 | DirtyRead | 支持 |
本地接口 | DirtyWrite | 支持 |
查询 | GetLeader | 支持 |
查询 | GetServerStatus | 支持 |
Raft的功能特性
Language | Leader election + Log Replication | Membership Changes | Log Compaction |
---|---|---|---|
C++ | Yes | No | No |
以上是关于envoyproxy是如何支持redis协议的?的主要内容,如果未能解决你的问题,请参考以下文章