是不是经常遇到数据库单点故障导致网站瘫痪?或者随着业务增长,单个数据库服务器压力山大?别慌,今天咱们就一起来实战如何在Ubuntu 20.04/22.04上为MariaDB 10.6搭建主从复制集群,并通过负载均衡让数据库性能飞起来!本文手把手教学,避免踩坑,适合有一定Linux基础但对集群搭建不熟悉的小伙伴。
一、环境准备与MariaDB安装
在开始之前,我们需要准备2-4台Ubuntu 20.04或22.04服务器。假设我们有以下环境:
- 主数据库(Master):192.168.1.10
- 从数据库1(Slave1):192.168.1.11
- 从数据库2(Slave2):192.168.1.12(可选)
- 负载均衡服务器(HAProxy):192.168.1.13
在所有数据库服务器上安装MariaDB 10.6:
sudo apt update
sudo apt install software-properties-common
sudo apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'
sudo add-apt-repository 'deb [arch=amd64,arm64,ppc64el] https://mirrors.aliyun.com/mariadb/repo/10.6/ubuntu focal main'
sudo apt update
sudo apt install mariadb-server
安装完成后,运行安全初始化脚本:sudo mysql_secure_installation
。这一步会设置root密码、移除匿名用户、禁止远程root登录等安全设置。
二、配置MariaDB主从复制
1. 主数据库(Master)配置
编辑主服务器的配置文件/etc/mysql/mariadb.conf.d/50-server.cnf
,在[mysqld]
段落下添加或修改以下内容:
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog-format = ROW
log-slave-updates = True
master-info-repository = TABLE
relay-log-info-repository = TABLE
sync-master-info = 1
binlog-checksum = CRC32
master-verify-checksum = 1
slave-sql-verify-checksum = 1
binlog-rows-query-log-events = 1
expire_logs_days = 10
max_binlog_size = 100M
# 指定要复制的数据库(可选)
# binlog_do_db = your_database_name
重启MariaDB服务使配置生效:sudo systemctl restart mariadb
登录MySQL创建复制账号:
CREATE USER 'replicator'@'%' IDENTIFIED BY '你的强密码';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'replicator'@'%';
FLUSH PRIVILEGES;
查看主服务器状态并记录二进制日志位置:
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
记录下File
和Position
的值,稍后在从服务器配置中会用到。完成后解锁表:UNLOCK TABLES;
2. 从数据库(Slave)配置
编辑从服务器的配置文件/etc/mysql/mariadb.conf.d/50-server.cnf
,注意每台从服务器要有唯一的server-id
:
[mysqld]
server-id = 2 # 第二台从服务器设为3,以此类推
relay_log = /var/log/mysql/mysql-relay-bin.log
log_bin = /var/log/mysql/mysql-bin.log
read_only = 1
log-slave-updates = True
master-info-repository = TABLE
relay-log-info-repository = TABLE
重启从服务器MariaDB服务:sudo systemctl restart mariadb
如果主数据库已有数据,需要先将数据同步到从服务器。可以使用mysqldump
工具导出导入:
# 在主服务器上执行
mysqldump -u root -p --master-data=2 --single-transaction --databases 你的数据库名 > db_dump.sql
# 将db_dump.sql复制到从服务器后导入
mysql -u root -p < db_dump.sql
在从服务器上配置复制连接:
CHANGE MASTER TO
MASTER_HOST='192.168.1.10',
MASTER_USER='replicator',
MASTER_PASSWORD='你的强密码',
MASTER_LOG_FILE='记录的文件名',
MASTER_LOG_POS=记录的位置值;
启动复制进程:START SLAVE;
检查复制状态:SHOW SLAVE STATUS\G
关键是要看到Slave_IO_Running: Yes
和Slave_SQL_Running: Yes
,这表明复制正常运行。
3. 验证主从复制
在主数据库上创建一个测试数据库或表,在从数据库上检查是否同步成功。这是最激动人心的时刻,如果看到数据实时同步过来了,说明你前面的配置都正确!
三、配置HAProxy负载均衡
现在我们已经有了主从复制,但应用程序还需要知道如何连接这些数据库。HAProxy将作为中间层,将数据库请求分发到不同的服务器。
在负载均衡服务器上安装HAProxy:
sudo apt update
sudo apt install haproxy
编辑HAProxy配置文件/etc/haproxy/haproxy.cfg
:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats timeout 30s
user haproxy
group haproxy
daemon
defaults
log global
mode tcp
option tcplog
option dontlognull
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
# 监控界面配置
listen stats
bind *:9999
mode http
stats enable
stats uri /haproxy-status
stats realm Haproxy\ Statistics
stats auth admin:你的监控密码
# 数据库负载均衡配置
frontend mysql_frontend
bind *:3306
mode tcp
option clitcpka
default_backend mysql_backend
backend mysql_backend
mode tcp
balance roundrobin # 使用轮询算法
option tcp-check
server mysql-master 192.168.1.10:3306 check port 3306 inter 2000 rise 2 fall 3
server mysql-slave1 192.168.1.11:3306 check port 3306 inter 2000 rise 2 fall 3
server mysql-slave2 192.168.1.12:3306 check port 3306 inter 2000 rise 2 fall 3
启动HAProxy服务:
sudo systemctl enable haproxy
sudo systemctl start haproxy
现在,应用程序可以连接HAProxy服务器(192.168.1.13)的3306端口,HAProxy会自动将请求分发到后端的数据库服务器。
四、故障排查与常见问题
搭建过程中难免会遇到问题,这里分享几个常见坑点:
1. 主从复制中断
如果SHOW SLAVE STATUS
显示复制错误,可以尝试跳过特定错误(谨慎使用):
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; # 跳过一个事务
START SLAVE;
2. 网络连接问题
确保所有服务器之间的3306端口是通的,可以使用telnet
命令测试:
telnet 192.168.1.10 3306
3. 时间同步问题
确保所有服务器时间同步,可以安装NTP服务:
sudo apt install chrony
sudo systemctl enable chrony
sudo systemctl start chrony
4. 防火墙配置
Ubuntu默认使用ufw防火墙,需要开放相应端口:
sudo ufw allow 3306
sudo ufw allow 9999 # HAProxy监控界面端口
五、性能优化建议
集群搭建完成后,还可以进行以下优化:
- 读写分离:配置HAProxy将写请求发送到主库,读请求分发到从库
- 连接池:应用程序使用数据库连接池,避免频繁创建新连接
- 监控告警:设置监控告警系统,及时发现数据库问题
- 定期备份:虽然有了主从复制,但仍需定期备份重要数据
结语
通过本文的步骤,你应该已经成功在Ubuntu上搭建了MariaDB主从复制集群并实现了负载均衡。这种架构不仅提高了数据库的可用性和性能,还为后续扩展打下了坚实基础。数据库架构没有银弹,根据实际业务需求调整才是王道。
如果遇到问题,欢迎留言讨论。记得定期检查集群状态,确保业务稳定运行!
没有回复内容