Ubuntu环境下MariaDB负载均衡的常见实现方法
在Ubuntu系统中,实现MariaDB负载均衡需结合复制技术(如主从复制、Galera Cluster)与负载均衡中间件(如HAProxy、ProxySQL),以下是具体步骤及关键说明:
负载均衡需先将数据分布到多个节点,MariaDB支持两种主要复制模式:
主服务器配置:编辑/etc/mysql/mariadb.conf.d/50-server.cnf,添加以下参数:
[mysqld]
server-id = 1 # 主节点唯一ID
log_bin = /var/log/mysql/mysql-bin.log # 开启二进制日志
binlog_do_db = your_database_name # 需同步的数据库名
重启服务:sudo systemctl restart mariadb
创建复制用户并授权:
CREATE USER 'replicator'@'%' IDENTIFIED BY 'strong_password';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
FLUSH PRIVILEGES;
查看主节点二进制日志位置(用于从节点同步):
SHOW MASTER STATUS;
从服务器配置:编辑/etc/mysql/mariadb.conf.d/50-server.cnf:
[mysqld]
server-id = 2 # 从节点唯一ID(需与主节点不同)
relay_log = /var/log/mysql/mysql-relay-bin.log # 开启中继日志
log_bin = /var/log/mysql/mysql-bin.log # 可选:开启本地二进制日志
binlog_do_db = your_database_name
read_only = 1 # 设置为只读(防止误写)
重启服务:sudo systemctl restart mariadb
配置从节点连接主节点:
CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='replicator',
MASTER_PASSWORD='strong_password',
MASTER_LOG_FILE='mysql-bin.000001', -- 替换为主节点的LOG_FILE
MASTER_LOG_POS=107; -- 替换为主节点的LOG_POS
START SLAVE; -- 启动复制
若需真正的多主复制(所有节点可同时读写),可使用Galera Cluster(需至少3个节点):
/etc/mysql/mariadb.conf.d/99-cluster.cnf:[mysqld]
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://node1_ip,node2_ip,node3_ip" # 所有节点IP
wsrep_node_address="current_node_ip" # 当前节点IP
wsrep_node_name="node1" # 节点名称
wsrep_sst_method=rsync # 数据同步方法
galera_new_cluster,其他节点重启MariaDB服务:sudo systemctl restart mariadb。mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size';"(结果应为节点数)。HAProxy是常用的TCP/HTTP负载均衡器,适合MariaDB的场景:
sudo apt update
sudo apt install haproxy
编辑/etc/haproxy/haproxy.cfg,添加以下内容:
global
log /dev/log local0
log /dev/log local1 notice
daemon
maxconn 256
defaults
log global
mode tcp # TCP模式(MariaDB基于TCP)
option tcplog # 记录TCP日志
timeout connect 5000ms # 连接超时
timeout client 50000ms # 客户端超时
timeout server 50000ms # 服务器超时
frontend mysql_front
bind *:3306 # 监听3306端口(客户端连接端口)
default_backend mysql_back
backend mysql_back
balance roundrobin # 轮询算法(也可选leastconn最少连接)
server mariadb1 master_ip:3306 check inter 2000 rise 2 fall 3 # 主节点
server mariadb2 slave1_ip:3306 check inter 2000 rise 2 fall 3 # 从节点1
server mariadb3 slave2_ip:3306 check inter 2000 rise 2 fall 3 # 从节点2
balance:可选roundrobin(轮询)、leastconn(最少连接)、source(源IP哈希)等。check:启用健康检查(定期检测节点是否可用)。sudo systemctl restart haproxy
sudo systemctl enable haproxy # 开机自启
客户端连接HAProxy的IP(如haproxy_ip:3306),执行查询,可通过HAProxy日志或MariaDB节点的SHOW PROCESSLIST;查看请求分发情况。
ProxySQL是高性能SQL代理,支持读写分离、查询缓存、自动故障转移等高级特性:
wget https://github.com/sysown/proxysql/releases/download/v2.3.0/proxysql_2.3.0-1_amd64.deb
sudo dpkg -i proxysql_2.3.0-1_amd64.deb
编辑/etc/proxysql.cnf,重点配置以下部分:
[mysql_servers]
# 定义后端MariaDB节点
mariadb_master 192.168.1.101 3306 100 # 主节点(权重100)
mariadb_slave1 192.168.1.102 3306 50 # 从节点1(权重50)
mariadb_slave2 192.168.1.103 3306 50 # 从节点2(权重50)
# 定义主机组(0=写组,1=读组)
mysql_query_rules
rule1 id 1 active 1 match_pattern ^SELECT.*FOR UPDATE apply 0 # 写操作走写组
rule2 id 2 active 1 match_pattern ^SELECT.* apply 1 # 读操作走读组
rule3 id 3 active 1 match_pattern ^.* apply 0 # 其他操作走写组
[mysql_users]
# 定义客户端连接用户
admin username password default_hostgroup 0 # 默认走写组
app_user app_pass default_hostgroup 1 # 应用用户默认走读组
sudo systemctl restart proxysql
sudo systemctl enable proxysql
客户端连接ProxySQL的默认端口(6033),执行以下命令:
-- 写操作(应路由到主节点)
INSERT INTO test_table (name) VALUES ('test');
-- 读操作(应路由到从节点)
SELECT * FROM test_table;
通过ProxySQL的SELECT * FROM stats.stats_mysql_query_digest;查看请求分发统计。
check参数),避免将请求发送到故障节点。leastconn适合写密集型场景)、增加后端节点数量。通过以上步骤,可在Ubuntu环境下为MariaDB实现高效的负载均衡,提升数据库的并发处理能力和可用性。