【服务网格架构】Envoy架构概览(9):访问日志,MongoDB,DynamoDB,Redis

时间:2022-07-22
本文章向大家介绍【服务网格架构】Envoy架构概览(9):访问日志,MongoDB,DynamoDB,Redis,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

访问日志

HTTP连接管理器和tcp代理支持具有以下功能的可扩展访问日志记录:

  • 每个连接管理器或tcp代理的任意数量的访问日志。
  • 异步IO刷新架构。访问日志记录不会阻塞主要的网络处理线程。
  • 可定制的访问日志格式使用预定义的字段以及任意的HTTP请求和响应头。
  • 可自定义的访问日志过滤器,允许将不同类型的请求和响应写入不同的访问日志。

访问日志配置。

MongoDB

Envoy支持具有以下功能的网络级别MongoDB嗅探过滤器:

  • MongoDB格式的BSON解析器。
  • 详细的MongoDB查询/操作统计信息,包括路由集群的计时和分散/多次计数。
  • 查询记录。
  • 每个通过$ comment查询参数的callsite统计信息。
  • 故障注入。

MongoDB过滤器是Envoy的可扩展性和核心抽象的一个很好的例子。在Lyft中,我们在所有应用程序和数据库之间使用这个过滤器。它提供了对应用程序平台和正在使用的特定MongoDB驱动程序不可知的重要数据源。

MongoDB代理过滤器配置参考。

DynamoDB

Envoy支持具有以下功能的HTTP级别DynamoDB嗅探过滤器:

  • DynamoDB API请求/响应解析器。
  • DynamoDB每个操作/每个表/每个分区和操作统计。
  • 4xx响应的失败类型统计信息,从响应JSON分析,例如ProvisionedThroughputExceededException。
  • 批量操作部分失败统计。

DynamoDB过滤器是Envoy在HTTP层的可扩展性和核心抽象的一个很好的例子。在Lyft中,我们使用此过滤器与DynamoDB进行所有应用程序通信。它为使用中的应用程序平台和特定的AWS SDK提供了宝贵的数据不可知的来源。

DynamoDB筛选器配置。

Redis

Envoy可以充当Redis代理,在集群中的实例之间对命令进行分区。在这种模式下,Envoy的目标是保持可用性和分区容错度的一致性。将特使与Redis Cluster进行比较时,这是重点。Envoy被设计为尽力而为的缓存,这意味着它不会尝试协调不一致的数据或保持全局一致的群集成员关系视图。

Redis项目提供了与Redis相关的分区的全面参考。请参阅“分区:如何在多个Redis实例之间分割数据”。

Envoy Redis的特点:

  • Redis协议编解码器。
  • 基于散列的分区。
  • Ketama发行。
  • 详细的命令统计。
  • 主动和被动健康检查。

计划的未来增强:

  • 额外的时间统计。
  • 断路。
  • 请求折叠分散的命令。
  • 复制。
  • 内置重试。
  • 跟踪。
  • 哈希标记。

配置

有关过滤器配置的详细信息,请参阅Redis代理过滤器配置参考。

相应的集群定义应该配置环哈希负载平衡。

如果需要进行主动健康检查,则应该使用Redis健康检查对群集进行配置。

如果需要被动健康检查,还要配置异常检测。

为了进行被动健康检查,将超时,命令超时和连接关闭映射连接到5xx。来自Redis的所有其他响应被视为成功。

支持的命令

在协议级别,支持管道。MULTI(事务块)不是。尽可能使用流水线来获得最佳性能。

在命令级别,Envoy仅支持可靠地散列到服务器的命令。因此,所有支持的命令都包含一个密钥。受支持的命令在功能上与原始Redis命令相同,除非可能出现故障。

有关每个命令用法的详细信息,请参阅官方的Redis命令参考。

Command

Group

DEL

Generic

DUMP

Generic

EXISTS

Generic

EXPIRE

Generic

EXPIREAT

Generic

PERSIST

Generic

PEXPIRE

Generic

PEXPIREAT

Generic

PTTL

Generic

RESTORE

Generic

TOUCH

Generic

TTL

Generic

TYPE

Generic

UNLINK

Generic

GEOADD

Geo

GEODIST

Geo

GEOHASH

Geo

GEOPOS

Geo

HDEL

Hash

HEXISTS

Hash

HGET

Hash

HGETALL

Hash

HINCRBY

Hash

HINCRBYFLOAT

Hash

HKEYS

Hash

HLEN

Hash

HMGET

Hash

HMSET

Hash

HSCAN

Hash

HSET

Hash

HSETNX

Hash

HSTRLEN

Hash

HVALS

Hash

LINDEX

List

LINSERT

List

LLEN

List

LPOP

List

LPUSH

List

LPUSHX

List

LRANGE

List

LREM

List

LSET

List

LTRIM

List

RPOP

List

RPUSH

List

RPUSHX

List

EVAL

Scripting

EVALSHA

Scripting

SADD

Set

SCARD

Set

SISMEMBER

Set

SMEMBERS

Set

SPOP

Set

SRANDMEMBER

Set

SREM

Set

SSCAN

Set

ZADD

Sorted Set

ZCARD

Sorted Set

ZCOUNT

Sorted Set

ZINCRBY

Sorted Set

ZLEXCOUNT

Sorted Set

ZRANGE

Sorted Set

ZRANGEBYLEX

Sorted Set

ZRANGEBYSCORE

Sorted Set

ZRANK

Sorted Set

ZREM

Sorted Set

ZREMRANGEBYLEX

Sorted Set

ZREMRANGEBYRANK

Sorted Set

ZREMRANGEBYSCORE

Sorted Set

ZREVRANGE

Sorted Set

ZREVRANGEBYLEX

Sorted Set

ZREVRANGEBYSCORE

Sorted Set

ZREVRANK

Sorted Set

ZSCAN

Sorted Set

ZSCORE

Sorted Set

APPEND

String

BITCOUNT

String

BITFIELD

String

BITPOS

String

DECR

String

DECRBY

String

GET

String

GETBIT

String

GETRANGE

String

GETSET

String

INCR

String

INCRBY

String

INCRBYFLOAT

String

MGET

String

MSET

String

PSETEX

String

SET

String

SETBIT

String

SETEX

String

SETNX

String

SETRANGE

String

STRLEN

String

失败模式

如果Redis抛出一个错误,我们把这个错误作为响应传递给这个命令。Envoy将错误数据类型的Redis响应视为正常响应,并将其传递给调用者。

特使也可以产生自己的错误来回应客户。

Error

Meaning

no upstream host

The ring hash load balancer did not have a healthy host available at the ring position chosen for the key.

upstream failure

The backend did not respond within the timeout period or closed the connection.

invalid request

Command was rejected by the first stage of the command splitter due to datatype or length.

unsupported command

The command was not recognized by Envoy and therefore cannot be serviced because it cannot be hashed to a backend server.

finished with n errors

Fragmented commands which sum the response (e.g. DEL) will return the total number of errors received if any were received.

upstream protocol error

A fragmented command received an unexpected datatype or a backend responded with a response that not conform to the Redis protocol.

wrong number of arguments for command

Certain commands check in Envoy that the number of arguments is correct.

在MGET的情况下,每个不能被获取的单独的密钥将产生错误响应。例如,如果我们获取五个键和两个键的后端超时,我们会得到一个错误的响应,每个代替值。

$ redis-cli MGET a b c d e
1) "alpha"
2) "bravo"
3) (error) upstream failure
4) (error) upstream failure
5) "echo"

微信公众号

关注微信公众号【首席架构师智库】

微信小号

希望加入的群:架构,云计算,大数据,数据科学,物联网,人工智能,安全,全栈开发,DevOps,数字化,产品转型。

知识星球

向大咖提问,近距离接触,或者获得私密分享。

点击加入知识星球【首席架构师圈】

微信圈子

志趣相投的同好交流。

点击加入微信圈子【首席架构师圈】

喜马拉雅

路上或者车上了解最新黑科技资讯,架构心得。

点击,收听【智能时刻,架构君和你聊黑科技】

知识星球

认识更多朋友,职场和技术闲聊。

点击加入知识星球【知识和技术】