MariaDB新安装环境下的复制配置
MariaDB 新安装环境下的复制配置
一、理解 MariaDB 复制
MariaDB 复制是一种数据同步机制,它允许将一个 MariaDB 数据库服务器(主服务器)的数据更改复制到一个或多个其他 MariaDB 数据库服务器(从服务器)。这种机制在很多场景下都非常有用,比如:
- 负载均衡:通过将读操作分发到多个从服务器,可以减轻主服务器的负担,提高系统整体的读性能。例如,在一个电商网站中,大量的商品浏览操作(读操作)可以由从服务器处理,而主服务器专注于处理订单提交等写操作。
- 数据冗余与高可用性:从服务器作为主服务器数据的副本,当主服务器出现故障时,从服务器可以迅速接管服务,确保数据的可用性。比如在金融系统中,数据库的高可用性至关重要,复制机制可以保障在主数据库出现硬件故障等问题时,业务仍能正常进行。
- 数据备份:从服务器可以作为一种实时备份,用于数据恢复和灾难恢复场景。
MariaDB 复制基于主从模型,主服务器记录所有的数据更改操作到二进制日志(binary log)中。从服务器通过 I/O 线程连接到主服务器,读取主服务器的二进制日志,并将其写入到自己的中继日志(relay log)中。然后,从服务器的 SQL 线程读取中继日志,并在本地执行这些更改操作,从而保持与主服务器数据的一致性。
二、环境准备
在开始配置 MariaDB 复制之前,需要准备以下环境:
- 操作系统:本文以 CentOS 7 为例进行演示。确保操作系统已经安装并配置好网络,能够正常联网进行软件安装等操作。
- MariaDB 安装:在主服务器和从服务器上都需要安装 MariaDB。可以通过官方 yum 源进行安装,以下是安装步骤:
- 在 CentOS 7 上,首先需要安装 MariaDB 官方的 yum 源。创建一个新的 yum 源配置文件
/etc/yum.repos.d/MariaDB.repo
,内容如下:
- 在 CentOS 7 上,首先需要安装 MariaDB 官方的 yum 源。创建一个新的 yum 源配置文件
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.5/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
- 安装 MariaDB 服务器:执行 `yum install MariaDB-server MariaDB-client` 命令,安装过程中会提示确认安装,输入 `y` 确认即可。
- 启动 MariaDB 服务:安装完成后,使用 `systemctl start mariadb` 启动 MariaDB 服务。并且可以通过 `systemctl enable mariadb` 命令设置 MariaDB 服务开机自启。
- 初始化 MariaDB:运行 `mysql_secure_installation` 脚本进行初始化设置,包括设置 root 密码、删除匿名用户、禁止远程 root 登录、删除测试数据库等操作。按照提示依次输入相关信息即可。
三、主服务器配置
- 修改主服务器配置文件:主服务器的配置文件通常位于
/etc/my.cnf
或/etc/mysql/my.cnf
。打开该文件,添加或修改以下配置项:
[mysqld]
server-id = 1
log-bin = /var/lib/mysql/mysql-bin.log
binlog-format = ROW
- `server-id`:每个参与复制的服务器都必须有一个唯一的 `server-id`,这里主服务器设置为 1。取值范围是 1 到 2^32 - 1。
- `log-bin`:指定二进制日志文件的路径和文件名前缀。这里设置为 `/var/lib/mysql/mysql-bin.log`。二进制日志记录了主服务器上所有的数据更改操作,是复制的关键。
- `binlog-format`:设置二进制日志的格式为 `ROW`。`ROW` 格式记录的是每一行数据的变化,相比于 `STATEMENT` 格式,它更加准确和安全,特别是在处理一些函数和触发器等复杂操作时。
2. 重启 MariaDB 服务:修改完配置文件后,使用 systemctl restart mariadb
命令重启 MariaDB 服务,使配置生效。
- 创建复制用户:登录到 MariaDB 服务器,使用以下命令创建一个用于复制的用户:
CREATE USER'replication_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO'replication_user'@'%';
FLUSH PRIVILEGES;
- `CREATE USER` 语句创建了一个名为 `replication_user` 的用户,`@'%'` 表示该用户可以从任何主机连接。如果安全性要求较高,可以将 `%` 替换为具体允许连接的 IP 地址。
- `GRANT REPLICATION SLAVE` 授予该用户复制相关的权限,`ON *.*` 表示对所有数据库和表都有该权限。
- `FLUSH PRIVILEGES` 使权限设置立即生效。
4. 获取主服务器状态:在主服务器上执行以下命令获取主服务器的状态信息:
SHOW MASTER STATUS;
执行结果类似如下:
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
这里需要记录下 File
和 Position
的值,后续配置从服务器时会用到。
四、从服务器配置
- 修改从服务器配置文件:同样打开从服务器的 MariaDB 配置文件
/etc/my.cnf
或/etc/mysql/my.cnf
,添加或修改以下配置项:
[mysqld]
server-id = 2
relay-log = /var/lib/mysql/mysql-relay-bin.log
read-only = 1
- `server-id`:从服务器的 `server-id` 必须与主服务器不同,这里设置为 2。
- `relay-log`:指定中继日志文件的路径和文件名前缀。从服务器通过 I/O 线程将主服务器的二进制日志读取到中继日志中。
- `read-only`:设置为 1 表示将从服务器设置为只读模式,防止从服务器上的写操作破坏数据一致性。不过,具有 `SUPER` 权限的用户仍然可以执行写操作。
2. 重启 MariaDB 服务:修改完配置后,使用 systemctl restart mariadb
命令重启 MariaDB 服务,使配置生效。
- 配置从服务器连接主服务器:登录到从服务器的 MariaDB,执行以下命令配置从服务器连接到主服务器:
CHANGE MASTER TO
MASTER_HOST='主服务器IP地址',
MASTER_USER='replication_user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=154;
- `MASTER_HOST`:指定主服务器的 IP 地址。
- `MASTER_USER` 和 `MASTER_PASSWORD`:使用在主服务器上创建的复制用户及其密码。
- `MASTER_LOG_FILE` 和 `MASTER_LOG_POS`:使用在主服务器上执行 `SHOW MASTER STATUS` 命令获取到的值。
4. 启动从服务器复制:配置好连接信息后,执行以下命令启动从服务器的复制:
START SLAVE;
- 检查从服务器状态:执行以下命令检查从服务器的复制状态:
SHOW SLAVE STATUS \G;
重点关注以下两个参数:
- Slave_IO_Running
:如果为 Yes
,表示 I/O 线程正在运行,从服务器正在从主服务器读取二进制日志。
- Slave_SQL_Running
:如果为 Yes
,表示 SQL 线程正在运行,从服务器正在执行中继日志中的操作。
另外,还需要确保 Seconds_Behind_Master
的值为 0 或非常小,表示从服务器与主服务器的数据同步延迟很小。如果这两个线程状态不是 Yes
,或者 Seconds_Behind_Master
值较大,需要根据错误信息排查问题。
五、常见问题及解决方法
- 网络连接问题
- 症状:从服务器无法连接到主服务器,
SHOW SLAVE STATUS \G
中Slave_IO_Running
为No
,错误信息可能提示连接超时等。 - 解决方法:首先检查主从服务器之间的网络是否畅通,可以使用
ping
命令测试。如果网络不通,检查防火墙设置。在 CentOS 7 上,如果使用firewalld
,可以执行以下命令开放 MariaDB 的端口(默认为 3306):
- 症状:从服务器无法连接到主服务器,
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
如果使用 iptables
,添加规则允许主从服务器之间的 3306 端口通信:
iptables -A INPUT -p tcp -s 主服务器IP地址 --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp -s 从服务器IP地址 --dport 3306 -j ACCEPT
service iptables save
service iptables restart
- 权限问题
- 症状:从服务器连接主服务器时提示权限不足,
SHOW SLAVE STATUS \G
中Slave_IO_Running
为No
,错误信息包含Access denied
等。 - 解决方法:确保在主服务器上创建的复制用户具有正确的权限,并且用户名和密码在从服务器配置中填写正确。可以在主服务器上重新执行
GRANT REPLICATION SLAVE ON *.* TO'replication_user'@'%'; FLUSH PRIVILEGES;
命令,然后在从服务器上重新执行CHANGE MASTER TO...
命令。
- 症状:从服务器连接主服务器时提示权限不足,
- 数据不一致问题
- 症状:
Seconds_Behind_Master
值较大,或者从服务器上的数据与主服务器不一致。 - 解决方法:首先检查主从服务器的系统时间是否一致,时间差异较大可能导致复制问题。可以使用
ntpdate
等工具同步时间。如果数据不一致,可以尝试停止从服务器复制(STOP SLAVE;
),然后重新配置从服务器连接主服务器(CHANGE MASTER TO...
)并启动复制(START SLAVE;
)。在重新配置之前,需要确保主服务器的二进制日志状态没有发生变化,可以在主服务器上先执行FLUSH TABLES WITH READ LOCK;
锁定主服务器的表,获取最新的SHOW MASTER STATUS
信息后,再在从服务器上进行配置。配置完成后,在主服务器上执行UNLOCK TABLES;
解锁表。
- 症状:
六、高级配置与优化
- 半同步复制
- 原理:半同步复制是 MariaDB 提供的一种增强型复制机制,它介于异步复制和同步复制之间。在异步复制中,主服务器在将数据更改写入二进制日志后,就立即返回给客户端确认,而不等待从服务器接收并应用这些更改。同步复制则要求主服务器等待所有从服务器都确认接收到并应用了数据更改后才返回给客户端确认,这种方式虽然保证了数据的强一致性,但性能开销较大。半同步复制要求主服务器在将数据更改写入二进制日志后,等待至少一个从服务器确认接收到这些更改后才返回给客户端确认。
- 配置方法:
- 在主服务器上,打开配置文件,添加或修改以下配置项:
[mysqld]
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 10000
rpl_semi_sync_master_enabled
设置为 1 启用主服务器的半同步复制功能,rpl_semi_sync_master_timeout
设置主服务器等待从服务器确认的超时时间,单位为毫秒,这里设置为 10000 毫秒。
- 在从服务器上,打开配置文件,添加或修改以下配置项:
[mysqld]
rpl_semi_sync_slave_enabled = 1
rpl_semi_sync_slave_enabled
设置为 1 启用从服务器的半同步复制功能。
- 重启主从服务器的 MariaDB 服务使配置生效。然后登录到主从服务器的 MariaDB,分别执行以下命令加载半同步复制插件:
在主服务器上:
INSTALL PLUGIN rpl_semi_sync_master SONAME'semisync_master.so';
在从服务器上:
INSTALL PLUGIN rpl_semi_sync_slave SONAME'semisync_slave.so';
- 多线程复制
- 原理:传统的 MariaDB 从服务器复制中,SQL 线程是单线程的,它按照中继日志的顺序依次执行数据更改操作。在高并发写入的场景下,单线程复制可能成为性能瓶颈。多线程复制允许从服务器使用多个线程来并行执行中继日志中的操作,从而提高复制性能。
- 配置方法:在从服务器的配置文件中,添加或修改以下配置项:
[mysqld]
slave_parallel_type = LOGICAL_CLOCK
slave_parallel_workers = 4
slave_parallel_type
设置为 LOGICAL_CLOCK
表示使用逻辑时钟方式进行并行复制,这是 MariaDB 10.0 及以上版本推荐的方式。slave_parallel_workers
设置并行复制的线程数,这里设置为 4,可以根据服务器的硬件资源和负载情况进行调整。修改配置后,重启从服务器的 MariaDB 服务使配置生效。
- 复制过滤
- 原理:复制过滤允许在主服务器或从服务器上设置规则,决定哪些数据库、表或操作需要进行复制,哪些不需要。这样可以减少复制的数据量,提高复制效率,同时也可以满足一些特殊的业务需求,比如只复制部分重要的数据。
- 配置方法:
- 在主服务器上过滤:在主服务器的配置文件中,可以使用
binlog-do-db
和binlog-ignore-db
配置项。例如,如果只希望复制test_db
数据库,而忽略other_db
数据库,可以添加以下配置:
- 在主服务器上过滤:在主服务器的配置文件中,可以使用
[mysqld]
binlog-do-db = test_db
binlog-ignore-db = other_db
- **在从服务器上过滤**:在从服务器的配置文件中,可以使用 `replicate-do-db`、`replicate-ignore-db`、`replicate-do-table` 和 `replicate-ignore-table` 等配置项。例如,如果只希望从服务器复制 `test_db` 数据库中的 `test_table` 表,可以添加以下配置:
[mysqld]
replicate-do-db = test_db
replicate-do-table = test_db.test_table
修改配置后,重启主从服务器的 MariaDB 服务使配置生效。
七、总结 MariaDB 复制的优势与应用场景
MariaDB 复制在现代数据库管理中具有显著的优势,为各种规模的应用提供了可靠的数据同步和扩展方案。其优势主要体现在以下几个方面:
- 高可用性:通过复制,从服务器作为主服务器的实时副本,当主服务器出现故障时,从服务器可以迅速接管,确保服务的连续性。这在对业务连续性要求极高的场景,如金融交易系统、在线支付平台等,至关重要。
- 负载均衡:能够有效地将读操作分散到多个从服务器上,极大地提升了系统整体的读性能。在一些大型的电商网站或社交媒体平台,大量的用户浏览操作(读操作)可以由从服务器承担,而主服务器专注于处理写操作,从而提高系统的并发处理能力。
- 数据备份与恢复:从服务器可视为一种实时备份,为数据恢复和灾难恢复提供了有力保障。在数据遭受误删除、损坏等情况时,可以利用从服务器的数据进行快速恢复。
在实际应用场景中,MariaDB 复制广泛应用于以下领域:
- Web 应用:对于高流量的 Web 应用,如新闻网站、论坛等,通过复制实现负载均衡,提高网站的响应速度和并发处理能力。同时,确保数据的高可用性,避免因主服务器故障导致网站无法访问。
- 数据仓库:在数据仓库环境中,主服务器用于接收和处理实时数据,从服务器可用于数据分析和报表生成。这样可以避免分析操作对主服务器的性能影响,同时保证数据的一致性。
- 分布式系统:在分布式系统中,各个节点可能需要保持数据的一致性。MariaDB 复制可以在不同节点之间同步数据,确保整个分布式系统的数据完整性和一致性。
通过合理配置和优化 MariaDB 复制,能够充分发挥其优势,满足不同应用场景的需求,为企业的业务发展提供坚实的数据库支持。无论是小型企业的简单应用,还是大型企业的复杂分布式系统,MariaDB 复制都能提供有效的数据管理解决方案。