proxysql集群+高可用


【1】集群的核心概念

(1.1)集群能达到什么效果?

参考转自官网:https://proxysql.com/documentation/ProxySQL-Cluster/

ProxySQL 是一个去中心化代理,如果可能,通常建议将其部署在与应用程序相同的服务器上。这种方法可以很好地扩展到数百个节点,并且可以在运行时轻松重新配置。

为了管理一组 ProxySQL 实例,您需要单独配置每个主机,使用配置管理工具,如 Ansible/Chef/Puppet/Salt(按字母顺序)或服务发现工具,如 Consul/ZooKeeper。

因此,虽然 ProxySQL 是高度可定制的,并且可以使用任何已经实现的配置管理工具技术在任何环境中进行部署和管理,但这种方法有一些缺点:

  • 它需要并依赖于外部软件(配置管理软件本身)
  • 前一点意味着这种方法本身不受支持
  • 收敛时间不可预测
  • 没有针对网络分裂的保护

因此,从 ProxySQL 1.4.x 开始,本机支持配置集群。

集群只是类似于组复制的操作,互相同步下面的5个表

目前 ProxySQL 集群解决方案中有两个主要组件:

  • 监控
  • 重新配置

两个组件(监控和远程重新配置)都可用于 4 个表:

  • global_variables (Supported from ProxySQL 2.1.x)
  • mysql_query_rules
  • mysql_servers
  • mysql_users
  • proxysql_servers

(1.2)集群管理变量

添加了几个与集群解决方案相关的新变量。它们都是 Admin 的变量,这意味着加载它们LOAD ADMIN VARIABLES TO RUNTIME需要命令。

定义同步内容的变量:

  • admin-checksum_mysql_query_rules: 布尔变量。true(默认)ProxySQL 每次LOAD MYSQL QUERY RULES TO RUNTIME执行时都会生成一个新的配置校验和。如果设置为false,新配置不会自动传播,也不会从远程节点同步;

  • admin-checksum_mysql_servers: 布尔变量。true(默认)ProxySQL 每次LOAD MYSQL SERVERS TO RUNTIME执行时都会生成一个新的配置校验和。如果设置为false,新配置不会自动传播,也不会从远程节点同步;

  • admin-checksum_mysql_users: 布尔变量。true(默认)ProxySQL 每次LOAD MYSQL USERS TO RUNTIME执行时都会生成一个新的配置校验和。

    •   如果设置为false,新配置不会自动传播,也不会从远程节点同步。如果您有数百万用户,请禁用此功能并且不要依赖它,因为它可能会很慢;

定义凭据的变量:

  • admin-cluster_username 和 admin-cluster_password: 使用此凭证来监控其他 ProxySQL 实例。

    •   请注意,用户名/密码对也应该存在于 中 admin-admin_credentials,否则连接将失败。如果 admin-cluster_username 未定义,则聚类不执行任何检查;

定义检查间隔/频率的变量:

  • admin-cluster_check_interval_ms:此变量定义校验和检查之间的间隔。

    默认值:1000。最小值:10,最大值:300000

  • admin-cluster_check_status_frequency:如果大于 0,则此变量定义在多少次校验和检查后执行状态检查。

    默认值:10。最小值:0 ,最大值:10000

远程同步后,立即将新更改保存到磁盘通常是个好主意。这样,重新启动后,配置将已经同步。

与同步到磁盘相关的变量:

  • admin-cluster_mysql_query_rules_save_to_disk: 布尔变量。true(默认)远程同步并加载到运行时,新的mysql查询规则也保存到磁盘;

  • admin-cluster_mysql_servers_save_to_disk: 布尔变量。true(默认)在远程同步并加载到运行时,新的 mysql 服务器也保存到磁盘;

  • admin-cluster_mysql_users_save_to_disk: 布尔变量。true(默认)在远程同步并加载到运行时,新的 mysql 用户也被保存到磁盘;

  • admin-cluster_proxysql_servers_save_to_disk: 布尔变量。true(默认)在远程同步并加载到运行时,新的 proxysql 服务器也被保存到磁盘;

由于不同的原因,可能同时重新配置多个 ProxSQL 实例。

  例如,可能每个 ProxySQL 实例都在监视 MySQL 复制拓扑并自动检测故障转移,并且在很短的时间内(可能不到一秒)它们将全部收敛到相同的配置,而无需与每个实例同步其他。

  同样,可能会自动避开节点的所有代理检测到临时网络问题或缓慢的 MySQL 实例。所有代理都将采取相同的操作,而无需相互同步。

  或者,作为最后一个示例,如果从属服务器由于复制滞后而滞后并自动回避,则所有代理将彼此独立地采取相同的操作。

因此,ProxySQL Cluster 可以配置为不立即与远程节点同步,而是在触发远程同步之前等待一定数量的检查。

如果在这样的阈值之后本地和远程配置仍然不同,则触发同步:

  • admin-cluster_mysql_query_rules_diffs_before_sync定义有多少不匹配检查触发mysql_query_rules

    默认同步:3。最小值:0(从不同步)。最大:1000

  • admin-cluster_mysql_servers_diffs_before_sync定义有多少不匹配检查触发mysql_servers

    默认同步:3。最小值:0(从不同步)。最大:1000

  • admin-cluster_mysql_users_diffs_before_sync定义有多少不匹配检查触发mysql_users

    默认同步:3。最小值:0(从不同步)。最大:1000

  • admin-cluster_proxysql_servers_diffs_before_sync定义有多少不匹配检查触发proxysql_servers

    默认同步:3。最小值:0(从不同步)。最大:1000

(1.3)集群配置表 proxysql_servers

表定义如下:

CREATE TABLE proxysql_servers (
    hostname VARCHAR NOT NULL,
    port INT NOT NULL DEFAULT 6032,
    weight INT CHECK (weight >= 0) NOT NULL DEFAULT 0,
    comment VARCHAR NOT NULL DEFAULT '',
    PRIMARY KEY (hostname, port) )

该表是一个配置表,定义了 ProxySQL 对等点的列表。

  • hostname: 对等方的主机名/IP
  • port: 对等端口
  • weight:目前未使用,但在未来增强的路线图中
  • comment: 自由形式的评论字段

也支持配置文件

proxysql_servers可以从配置文件中加载条目。

以下是如何proxysql_servers从配置文件进行配置的示例:

proxysql_servers =
(
    {
        hostname="172.16.0.101"
        port=6032
        weight=0
        comment="proxysql1"
    },
    {
        hostname="172.16.0.102"
        port=6032
        weight=0
        comment="proxysql2"
    }
)