【服务网格】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"
- 37 次浏览