如何在Debian 8上设置MariaDB主从复制

在本教程中,我将向您展示如何设置简单的MariaDB主从复制。 简而言之,我的意思是只有一个主机和一个从机,并且只有一个从主机复制到从机的复制实例。 本教程在以MariaDB 10.1作为主服务器的Debian 8服务器上以及在以MariaDB 10.1作为从属服务器的Raspbian Jessie上进行了演示。

MariaDB主从复制基础知识

在主从复制设置中,数据更改发生在主服务器上,而从服务器则自动从主服务器复制更改。 您可以在从属服务器上更改数据,但是更改不会复制到主服务器上。

MariaDB复制依赖于二进制日志。 您必须在主服务器上启用二进制日志记录才能使复制工作。 二进制日志的目的是允许复制,备份和还原数据库。 从属服务器上不需要二进制日志记录,但是建议使用。

设置复制可以完成4个步骤:

  1. 配置主机
  2. 配置从站
  3. 在主数据库上转储数据库并将其导入从数据库
  4. 将从站连接到主站

因此,让我们动手吧。

步骤1:配置主服务器

编辑my.cnf选项文件

打开 my.cnf 主服务器上的配置文件(也称为选项文件)。

sudo nano /etc/my.cnf

在这5行中添加 [mysqld] 部分。

log-bin        = /var/log/mysql/master-bin
log-bin-index  = /var/log/mysql/master-bin.index
binlog_format  = mixed
server-id      = 01
replicate-do-db = database_name

二进制日志由日志文件和索引文件组成。 第一种选择 log-bin 启用二进制日志记录。 二进制日志存储在 /var/log/mysql/ 目录。 master-bin 是二进制日志的基本名称。 第二个选择 log-bin-index 给出二进制日志索引文件的名称。

第三种选择 binlog-format 指定二进制日志记录的格式。 格式可以是基于语句的,基于行的和混合的。 混合日志记录是语句和基于行的日志记录的组合,建议用于复制。 在混合日志记录中,默认情况下使用基于语句的日志记录,但是当MariaDB确定某个语句对于基于语句的复制可能并不安全时,它将改为使用基于行的格式。

提示:当binlog事件以二进制格式存储时,mysqlbinlog可以将它们显示为文本。

服务器ID用于区分服务器。 复制组中的所有服务器必须具有唯一的服务器ID。

replicate-do-db option用于指定将哪个数据库复制到从属服务器。 显然您需要更换 database_name 与您的实际数据库名称。 如果要复制多个数据库,则需要添加多个如下的replicate-do-db条目:

replicate-do-db = db1
replicate-do-db = db2

您的my.cnf选项文件可能有一个选项 bind-address = 127.0.0.1。 如果是这种情况,则您的MariaDB服务器仅在localhost上侦听。 稍后,从服务器必须远程连接到主服务器,您需要注释掉此选项以允许远程登录。 保存文件并重新启动MariaDB服务,以使更改生效。

sudo systemctl restart mariadb

在主服务器上添加复制用户

从服务器将使用该用户远程登录主服务器,并从主服务器请求二进制日志。

首先登录MariaDB服务器。

mysql -u root -p

然后创建一个用户并向该用户授予复制特权(复制从属)。

CREATE USER replication_user;

set password for replication_user = password("your-password");

grant replication slave on *.* to replication_user identified by 'your-password';

flush privileges;

步骤2:配置从站

打开 my.cnf 从属服务器上的选项文件。

sudo nano /etc/my.cnf

在这四个选项中添加 [mysqld] 部分。 这将启用中继日志和复制。

server-id       = 02
replicate-do-db = database_name
relay-log-index = /var/log/mysql/slave-relay-bin.index
relay-log       = /var/log/mysql/slave-relay-bin

保存并关闭文件。 然后重新启动从属MariaDB服务器,以使更改生效。

sudo systemctl restart mariadb

有时MariaDB可能无法重新启动。 跑 systemctl status mariadb 检查状态。

第三步:将数据库转储到主数据库上

登录主MariaDB服务器并发出此命令以防止对数据库进行任何进一步更改。

flush tables with read lock;

然后

show master status;

请勿退出。 记录 FilePosition 细节。 现在打开另一个终端窗口,并通过SSH进入主服务器。 使用 mysqldump 将该数据库转储到一个实用程序 .sql 文件。

mysqldump -u root -p database_name > database_name.sql

现在,您可以通过在MariaDB监视器上运行以下命令来解锁主服务器上的表。

 unlock tables;

使用 scp 将此转储文件复制到您的从属服务器。 然后将其导入从服务器。

mysql -u root -p database_name.sql < database_name

步骤4:将从站连接到主站

现在,在MariaDB从属服务器中,运行此命令。

MariaDB [(none)]> change master to 
   -> master_host="master IP address",
   -> master_user="replication_user",
   -> master_password='replication_user_password', 
   -> master_port=3306,
   -> master_log_file="mariadb-bin.000012", 
   -> master_log_pos=6622841,
   -> master_connect_retry=10,
   -> master_use_gtid=current_pos;

master_log_file和master_log_pos可以从上面获得 show master status 命令。 最后一行 master_user_gtid=current_pos; 在MariaDB复制中启用GTID(全局事务ID)。 GTID是从MariaDB 10.0.2开始提供的功能。

然后启动奴隶。

MariaDB [(none)]> start slave;

检查从站状态。

MariaDB [(none)]> show slave statusG;

如果您在输出中没有看到错误,则表明复制正在顺利进行。 您应该看到以下两个是,表示一切正常。 如果其中之一为“否”,则说明有问题。

 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes

现在,如果您在主数据库服务器中进行了更改,它将被复制到从数据库服务器中。 的 从属I / O线程 连接到主服务器并请求二进制日志。 如果二进制日志中有新事务,则从属I / O线程会将它们写入从属服务器上的中继日志。 然后 从属SQL线程 读取中继日志并在数据库中执行新的事务。

要停止复制,请运行:

MariaDB [(none)]> stop slave;

全球交易编号

MySQL v5.6引入了GTID以解决复制中的一些限制。 从MariaDB 10.0.2开始,默认情况下会启用GTID。 唯一的GTID分配给每个登录到二进制日志的事件组。 MariaDB服务器10.0.2+可以启用和禁用GTID,而无需关闭数据库服务器。 MySQL的GTID实现不是这种情况。

结论

MariaDB主从复制可以帮助实现高可用性和可伸缩性,但不能防止数据丢失。 主机上粗心的drop database命令将被复制到从机上。 因此,您仍然需要定期备份数据库。

MariaDB主从复制的一个好处是,您可以使用mysqldump备份从服务器上的数据库,而不会影响主服务器的性能或影响主服务器上的写入操作。

Sidebar