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实现高效的负载均衡,提升数据库的并发处理能力和可用性。