ProxySQL中Galera节点初始hostgroup分配对负载均衡的影响及最佳实践
ProxySQL + Galera 节点初始分配问题解答
背景说明
我们拥有三个Galera节点:172.17.0.2、172.17.0.3、172.17.0.4,对应的主机组配置如下:
- writer_hostgroup=0(写入节点组)
- reader_hostgroup=1(读取节点组)
- backup_writer_hostgroup=2(备用写入节点组)
- offline_hostgroup=4(离线节点组)
计划配置mysql_galera_hostgroups,核心参数设置:
max_writers=1(仅保留1个活跃写入节点)writer_is_also_reader=1(所有节点均可承接读请求)- 所有服务器默认
weight=1
在配置mysql_galera_hostgroups前,需将节点添加到mysql_servers表并分配初始hostgroup_id,现有三种分配方案:
- 全部节点初始设为写入节点(hostgroup=0)
- 两个节点设为写入节点,一个设为读取节点(两个hostgroup=0,一个hostgroup=1)
- 全部节点初始设为读取节点(hostgroup=1)
问题1:mysql_servers中的初始节点分配是否会影响ProxySQL正确管理写入、备份及读节点?全部设为writer_hostgroup、全部设为reader_hostgroup或混合分配是否存在差异?是否仅当writer_is_also_reader=0时初始配置才起作用?
解答
- 初始分配仅在ProxySQL完成Galera节点状态检测前有短期影响,不会干扰ProxySQL基于Galera规则的长期自动管理。一旦ProxySQL识别出集群状态(如节点的
wsrep_ready、wsrep_local_state状态),就会按照mysql_galera_hostgroups的配置参数自动调整节点所属的主机组,完全覆盖初始分配。 - 三种初始分配方式的差异仅体现在启动初期的临时状态:
- 全部设为写入组:启动后所有节点暂时接收写请求,直到ProxySQL选出1个主写节点,其余节点自动调整为读节点/备用写入节点。
- 全部设为读节点:启动后所有节点暂时只处理读请求,直到ProxySQL完成状态探测并将选中的主写节点移入写入组。
- 混合分配:同样只是启动阶段的临时状态,最终会被ProxySQL的Galera管理逻辑覆盖。
- 并非仅当
writer_is_also_reader=0时初始配置才起作用。无论该参数设置为何,初始分配都只是启动初期的过渡状态,ProxySQL完成状态探测后就会按照预设规则重新分配主机组。
问题2:若mysql_servers中两个节点在writer_hostgroup,一个在reader_hostgroup,同时mysql_galera_hostgroups设置max_writers=1,ProxySQL是否会忽略初始hostgroup分配,随机选择一个节点作为写入节点(即初始在reader_hostgroup的节点可能成为写入节点,初始在writer_hostgroup的节点转为读节点)?
解答
- 是的,ProxySQL会完全忽略初始的hostgroup分配,仅基于Galera节点的健康状态和权重选择主写节点。
- 只要初始在reader_hostgroup的节点处于正常Galera状态(
wsrep_ready=ON、wsrep_local_state=4),就有同等概率被选为写入节点(因为所有节点weight=1);原本在writer_hostgroup的节点如果未被选中为主写节点,会被自动调整为读节点(因writer_is_also_reader=1),同时进入backup_writer_hostgroup作为备用写入节点,继续承接读请求。 - 节点被选中的优先级由
weight决定,和初始分配的hostgroup无关联。
问题3:为避免故障转移或路由问题,mysql_servers中节点的初始分配有何最佳实践?
解答
- 优先推荐将所有节点初始分配到reader_hostgroup:
- 避免启动初期多节点同时接收写请求的情况——如果初始设为写入组,在ProxySQL完成状态检测前,可能出现多节点处理写操作,引发Galera集群短暂的写入冲突(虽然后续会同步,但可能导致写入异常)。
- 保证启动初期读请求可以正常分流到所有节点,不会出现读路由空白。
- 若有明确的偏好主节点,可将该节点初始设为writer_hostgroup,其余设为reader_hostgroup:
- 这种方式能让偏好节点在启动初期优先承接写请求,后续ProxySQL会根据Galera状态自动调整,既符合启动阶段的预期,也不影响长期的自动管理。
- 统一设置节点的
weight参数:虽然初始分配会被覆盖,但weight会影响ProxySQL选择主写节点和分配读请求的优先级,需根据负载需求合理配置。 - 避免长期使用混合分配方案:混合分配只是临时过渡状态,没有长期价值,反而可能在启动初期造成路由规则混乱。
内容的提问来源于stack exchange,提问作者PeraMika
相关产品推荐
相关产品推荐

