Ubuntu上实现MariaDB负载均衡的常见方法
HAProxy是Ubuntu上最常用的负载均衡工具之一,支持TCP模式(适用于MariaDB的3306端口),可实现请求的分发和故障转移。
sudo apt update && sudo apt install haproxy。/etc/haproxy/haproxy.cfg文件,添加以下核心配置:global
log /dev/log local0
log /dev/log local1 notice
daemon
defaults
log global
mode tcp
option tcplog
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend mariadb_front
bind *:3306 # 监听3306端口(MariaDB默认端口)
default_backend mariadb_back
backend mariadb_back
balance roundrobin # 轮询算法(也可选leastconn等)
server mariadb1 master_ip:3306 check # 主服务器IP
server mariadb2 slave1_ip:3306 check # 从服务器1 IP
server mariadb3 slave2_ip:3306 check # 从服务器2 IP
sudo systemctl restart haproxy并设置开机自启(sudo systemctl enable haproxy)。mysql -h load_balancer_ip -u root -p),观察请求是否分发到不同节点。ProxySQL是专为MySQL/MariaDB设计的高性能代理,支持读写分离、查询缓存和动态负载均衡,适合需要精细化控制的场景。
sudo apt update && sudo apt install proxysql),或下载源码编译(需提前安装依赖)。/etc/proxysql.cnf文件,重点配置以下部分:[mysql_servers]
# 定义后端服务器及权重(权重越高,分配请求越多)
mariadb_master host=master_ip port=3306 weight=100
mariadb_slave1 host=slave1_ip port=3306 weight=50
mariadb_slave2 host=slave2_ip port=3306 weight=50
[mysql_query_rules]
# 规则1:将SELECT查询转发到从服务器(hostgroup 1)
rule1 rule_id=1 active=1 match_pattern=^SELECT.*FOR UPDATE$ destination_hostgroup=0 apply=0
rule2 rule_id=2 active=1 match_pattern=^SELECT destination_hostgroup=1 apply=1
# 规则3:将写操作(INSERT/UPDATE/DELETE)转发到主服务器(hostgroup 0)
rule3 rule_id=3 active=1 match_pattern=^(INSERT|UPDATE|DELETE).*$ destination_hostgroup=0 apply=1
[mysql_users]
# 定义客户端连接的用户
admin user=admin password=your_password default_hostgroup=0
sudo systemctl restart proxysql并设置开机自启。mysql -h 127.0.0.1 -u admin -p -P 6032)查看查询分发情况,或通过客户端连接(mysql -h 127.0.0.1 -u admin -p)测试读写分离。MySQL Router是MySQL官方提供的工具,主要用于实现读写分离和负载均衡,集成度高,适合需要官方支持的场景。
sudo apt update && sudo apt install mysql-router)。/etc/mysql-router.cnf文件,配置读写分离:[DEFAULT]
bind_address = 0.0.0.0
[routing:readwrite]
bind_port = 6446 # 路由器监听端口
destinations = readwrite://user:password@master_ip:3306,readwrite://user:password@slave1_ip:3306
mode = first-available # 或round-robin(轮询)
[routing:readonly]
bind_port = 6447
destinations = readonly://user:password@slave1_ip:3306,readonly://user:password@slave2_ip:3306
mode = round-robin
sudo systemctl restart mysql-router并设置开机自启。Galera Cluster是MariaDB的多主复制解决方案,支持同步复制和多节点写入,无需额外负载均衡器即可实现负载均衡(客户端可连接任意节点)。
sudo apt update && sudo apt install mariadb-server mariadb-galera-server)。/etc/mysql/conf.d/galera.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="当前节点IP"
wsrep_node_name="节点名称"
wsrep_sst_method=xtrabackup-v2 # 数据同步方法(推荐xtrabackup)
wsrep_sst_auth="sst_user:sst_password" # SST用户及密码
galera_new_cluster启动集群,其他节点执行sudo systemctl restart mariadb加入集群。mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size';",若结果为节点数(如3),则集群配置成功。