Amoeba是一款常用的数据库中间件,常用来实现MySQL集群的负载均衡和读写分离,完成配置后需要通过实际测试确认负载均衡功能是否生效,避免配置错误导致请求只落到单个节点。

测试前准备
首先要确认Amoeba已经正确连接了多个后端MySQL节点,假设我们配置了3个读节点,相关信息如下:
| 节点名称 | IP地址 | 端口 | 角色 |
|---|---|---|---|
| node1 | 192.168.0.101 | 3306 | 读节点 |
| node2 | 192.168.0.102 | 3306 | 读节点 |
| node3 | 192.168.0.103 | 3306 | 读节点 |
方法一:查看Amoeba运行日志
Amoeba默认会记录请求转发的日志,通过日志可以直接看到每个请求被分配到了哪个后端节点。首先找到Amoeba的日志文件,一般在安装目录的logs/amoeba.log路径下,执行以下命令查看实时日志:
tail -f /usr/local/amoeba/logs/amoeba.log
然后在另一个终端通过Amoeba的连接端口执行查询操作,日志中会出现类似forward to node node1、forward to node node2的记录,如果多次查询后日志中出现了不同节点的转发记录,说明负载均衡已经在生效。
方法二:通过节点请求计数器验证
可以在每个后端MySQL节点上创建一张测试表,用来记录每个节点接收到的查询次数,具体步骤如下。
1. 在所有读节点创建测试表
分别登录三个MySQL节点,执行以下建表语句:
CREATE TABLE test.load_balance_check (
id INT PRIMARY KEY AUTO_INCREMENT,
node_name VARCHAR(20),
req_time DATETIME
);2. 编写测试脚本发送多次查询
通过Amoeba的连接地址编写脚本,循环发送查询请求,每次查询都向测试表插入一条当前节点的标识记录,以下是Python示例代码:
import pymysql
import time
# Amoeba连接配置
amoeba_host = "192.168.0.100"
amoeba_port = 8066
amoeba_user = "amoeba_user"
amoeba_pass = "amoeba_pass"
conn = pymysql.connect(
host=amoeba_host,
port=amoeba_port,
user=amoeba_user,
password=amoeba_pass,
database="test"
)
cursor = conn.cursor()
# 循环发送100次查询请求
for i in range(100):
# 插入当前节点名称,由MySQL的@@hostname变量获取节点标识
sql = "INSERT INTO load_balance_check (node_name, req_time) VALUES (@@hostname, NOW())"
cursor.execute(sql)
conn.commit()
time.sleep(0.1)
cursor.close()
conn.close()3. 统计各节点请求数量
脚本执行完成后,分别查询每个节点的测试表数据量:
SELECT node_name, COUNT(*) AS req_count FROM test.load_balance_check GROUP BY node_name;
如果三个节点的请求数量大致相等,说明负载均衡策略生效,请求被均匀分配到了各个读节点。
方法三:模拟节点故障测试可用性
负载均衡除了分配请求,还需要在某节点故障时自动切换,避免请求失败。可以手动停止其中一个读节点的MySQL服务:
# 在node2节点执行 systemctl stop mysqld
然后再次通过Amoeba发送查询请求,如果请求仍然可以正常执行,且日志中没有出现转发到node2的记录,说明Amoeba已经检测到了节点故障并自动将请求转发到其他可用节点,负载均衡的故障转移功能也正常工作。
常见问题排查
- 如果日志中始终只转发到一个节点,检查Amoeba的配置文件
amoeba.xml中负载均衡策略是否配置正确,是否设置了轮询或者权重的规则。 - 如果插入的节点名称都相同,确认连接Amoeba时使用的是读账户,而不是写账户,避免请求被转发到写节点。
- 如果节点故障后请求失败,检查Amoeba的
dbServers.xml中是否配置了节点的健康检查参数。