MySQL 代理

MySQL 代理过滤器解码 MySQL 客户端与服务端之间的有线协议。它解码负载中的 SQL 查询(仅 SQL99 格式)。解码后的信息以动态元数据的形式发出,可以与访问日志过滤器相结合,以获得所访问表的详细信息,以及对每个表执行的操作。

Attention

mysql_proxy 过滤器目前在积极开发中,处于试验阶段。随着时间推移,功能将会得到扩展,同时配置结构也有可能会改变。

Warning

mysql_proxy 过滤器使用 MySQL v5.5 版本进行测试。由于协议实现的不同,该过滤器可能不能与其他 MySQL 版本一起使用。

配置

MySQL 代理过滤器应该与 TCP 代理过滤器链接,如下配置片段所示:

filter_chains:
- filters:
  - name: envoy.filters.network.mysql_proxy
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.network.mysql_proxy.v3.MySQLProxy
      stat_prefix: mysql
  - name: envoy.filters.network.tcp_proxy
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy
      stat_prefix: tcp
      cluster: ...

统计信息

每个配置的 MySQL 代理过滤器都有以 mysql.<stat_prefix>. 为根,如下所示的统计信息:

名称

类型

描述

auth_switch_request

Counter

上游服务器请求客户端更换其他认证方法的次数

decoder_errors

Counter

MySQL 协议解码异常数

login_attempts

Counter

登陆尝试次数

login_failures

Counter

登录失败次数

protocol_errors

Counter

会话中遇到的无序协议消息数

queries_parse_error

Counter

MySQL 解析失败的查询数

queries_parsed

Counter

MySQL 解析成功的查询数

sessions

Counter

自启动以来的 MySQL 会话数

upgraded_to_ssl

Counter

升级为 SSL 的会话/连接数

动态元数据

MySQL 过滤器为每个解析的 SQL 查询发出以下动态元数据:

名称

类型

描述

<table.db>

string

资源名称使用 table.db 格式。如果无法连接数据库,则资源名称默认使用正在访问的表。

[]

list

字符串列表表示可以对资源执行的操作。操作可以是插入、更新、查询、删除、创建、更新、展示其中之一。

对表实施 RBAC 访问

MySQL 过滤器发出的动态元数据可以与 RBAC 过滤器一起使用,用于控制对数据库的单个表的访问。 下面的配置片段展示了一个 RBAC 过滤器配置的示例,该配置拒绝在 _productdb_ 数据库中的 _catalog_ 表上使用 _update_ 语句的 SQL 查询。

filter_chains:
- filters:
  - name: envoy.filters.network.mysql_proxy
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.network.mysql_proxy.v3.MySQLProxy
      stat_prefix: mysql
  - name: envoy.filters.network.rbac
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.network.rbac.v3.RBAC
      stat_prefix: rbac
      rules:
        action: DENY
        policies:
          "product-viewer":
            permissions:
            - metadata:
                filter: envoy.filters.network.mysql_proxy
                path:
                - key: catalog.productdb
                value:
                  list_match:
                    one_of:
                      string_match:
                        exact: update
            principals:
            - any: true
  - name: envoy.filters.network.tcp_proxy
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy
      stat_prefix: tcp
      cluster: mysql