MariaDB复制是MariaDB实现高可用性、负载均衡和数据冗余的核心功能,通过将主服务器(Master)的数据变更同步到从服务器(Slave),支持读写分离、异地灾备和备份等场景。其核心机制依赖二进制日志(Binary Log)记录主服务器的变更事件,从服务器通过IO线程获取日志并写入中继日志(Relay Log),再由SQL线程重放日志实现数据同步。
log_bin参数)。MASTER_INFO文件(存储主服务器连接信息和日志位置)向主服务器请求二进制日志。BINLOG_DUMP线程将二进制日志中从库上次请求位置之后的事件发送给从库。relay_log参数)。最基础的复制架构,主服务器处理所有写操作,从服务器处理读操作,适用于读密集型应用(如电商商品详情页)。优点是配置简单,能有效减轻主服务器读压力。
主服务器处理写操作,多个从服务器处理读操作,进一步提升读性能。适用于高并发读场景(如社交平台动态流)。需注意:从服务器越多,主服务器的IO压力越大(需发送更多日志)。
两个服务器均为主服务器,相互复制数据,均可处理读写操作。优点是高可用性高(任一服务器故障,另一服务器可继续提供服务);缺点是数据冲突风险(如同一ID在不同服务器上插入数据),需通过auto_increment_increment(自增步长)和auto_increment_offset(自增偏移量)解决(如服务器1:auto_increment_increment=2, auto_increment_offset=1;服务器2:auto_increment_increment=2, auto_increment_offset=2)。
从服务器同时作为其他从服务器的主服务器(如A→B→C),适用于大规模分布式系统。优点是减少主服务器的复制压力;缺点是复制延迟累积(C服务器的数据同步会滞后于A服务器)。
/etc/mysql/mariadb.conf.d/50-server.cnf),添加以下参数:[mysqld]
server_id = 1 # 主服务器唯一ID(1-2^32-1)
log_bin = /var/log/mysql/mysql-bin.log # 开启二进制日志
binlog_format = ROW # 日志格式(ROW记录行变更,更安全)
bind_address = 0.0.0.0 # 允许远程连接
sudo systemctl restart mariadbCREATE USER 'repl_user'@'%' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
File和Position,后续从服务器配置需用到):FLUSH TABLES WITH READ LOCK; # 锁定表,确保数据一致性
SHOW MASTER STATUS;
UNLOCK TABLES; # 解锁表
/etc/mysql/mariadb.conf.d/50-server.cnf),添加以下参数:[mysqld]
server_id = 2 # 从服务器唯一ID(需与主服务器不同)
relay_log = /var/log/mysql/mysql-relay-bin.log # 开启中继日志
read_only = ON # 设置为只读(防止误操作,SUPER用户除外)
sudo systemctl restart mariadbCHANGE MASTER TO
MASTER_HOST = 'master_ip', # 主服务器IP
MASTER_USER = 'repl_user', # 复制用户
MASTER_PASSWORD = 'your_password', # 复制用户密码
MASTER_LOG_FILE = 'mysql-bin.000001', # 主服务器记录的File值
MASTER_LOG_POS = 123; # 主服务器记录的Position值
START SLAVE;Slave_IO_Running和Slave_SQL_Running均为Yes):SHOW SLAVE STATUS\G;
read_only=ON,避免误操作导致数据不一致(SUPER用户可绕过)。sync_binlog=ON(确保二进制日志同步到磁盘)、innodb_flush_log_at_trx_commit=ON(确保InnoDB事务日志同步到磁盘);从服务器开启sync_relay_log=ON、sync_relay_log_info=ON(确保中继日志同步)。PURGE BINARY LOGS命令删除或过期。解决方法:
slave_connections_needed_for_purge=3(需所有从库连接时才清除日志),确保从库有足够时间获取日志。CHANGE MASTER TO)。PURGE BINARY LOGS TO 'mysql-bin.0000XX'(保留最近XX个日志文件),避免日志文件占用过多磁盘空间。SHOW BINARY LOGS;查看主服务器二进制日志列表,SHOW SLAVE STATUS\G;查看从服务器复制进度。SHOW MASTER STATUS;(确认二进制日志文件和位置)。SHOW SLAVE STATUS\G;(重点关注Slave_IO_Running、Slave_SQL_Running和Seconds_Behind_Master(延迟秒数,0表示同步))。INSERT INTO test_table VALUES (1);)。