envoyproxy是如何支持redis协议的?

Posted it_worker365

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了envoyproxy是如何支持redis协议的?相关的知识,希望对你有一定的参考价值。

官方文档

https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/other_protocols/redis#arch-overview-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协议的?的主要内容,如果未能解决你的问题,请参考以下文章

Redis原理/协议及使用

Redis

Redis

Redis

Redis

redis