云网牛站
所在位置:首页 > Linux云数据库 > 在Ubuntu 18.04/18.10上设置MariaDB主从复制的方法

在Ubuntu 18.04/18.10上设置MariaDB主从复制的方法

2019-03-07 11:19:40作者:陈自坚稿源:云网牛站

本文介绍在Ubuntu 18.04/18.10服务器上设置MariaDB主从复制的方法,分5个步骤完成:在主服务器上启用二进制日志和复制、在从站上启用中继日志和复制、转储主服务器上的数据库并将其导入从服务器、启用TLS加密(可选步骤)、将从站连接到主站。

 

在Ubuntu 18.04/18.10上进行MariaDB主从复制的先决条件

理想情况下,主服务器和从服务器应使用相同的MariaDB版本,不同MariaDB版本之间的复制可能会导致问题,如果你在Ubuntu 18.04上运行MariaDB数据库服务器,那么你应该从所有服务器上的Ubuntu存储库安装MariaDB,或者在所有服务器上安装MariaDB存储库中的最新MariaDB版本(参考:在Ubuntu 18.04系统上安装MariaDB 10.4的步骤)。

注意:有两种方法可以登录MariaDB监视器,首先,有一种老式的方法:

mysql -u root -p

第二个是使用sudo为mysql命令添加前缀,这允许你登录而无需提供MariaDB root密码:

sudo mysql -u root

我将MariaDB服务器配置为使用第二种方法,因此请使用你的首选方法,如果没有这样的话,让我们弄清楚。

 

步骤1:在主服务器上启用二进制日志和复制

默认情况下,禁用二进制日志,要启用它,请打开MariaDB主配置文件,通常,它被称为my.cnf,但在Ubuntu上,该文件名为50-server.cnf:

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

在[mysqld]单元中找到Logging and Replication部分,然后添加这5行:

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

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

第三行中的binlog格式指定二进制日志的格式,格式可以是基于语句,基于行和混合,混合日志记录是语句和基于行的日志记录的组合,这是默认值,建议用于复制,在混合日志记录中,尽可能使用基于语句的日志记录,但如果MariaDB确定语句对于基于语句的复制可能不安全,则它将使用基于行的格式。

注意:

1)默认情况下,Ubuntu存储库中的MariaDB包使用STATEMENT格式进行二进制日志,你可以通过登录MariaDB监视器获取当前使用的格式,并运行show bin变量,如"binlog_format";。

2)虽然binlog事件以二进制格式存储,但mysqlbinlog可以将它们显示为文本。

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

replicate-do-db选项用于指定将哪个数据库复制到从属服务器,显然,需要将database_name替换为你的实际数据库名称,如果要复制多个数据库,则需要添加多个replicate-do-db条目,如下所示:

replicate-do-db = db1

replicate-do-db = db2

接下来,在[mysqld]单元中找到以下行:

bind-address = 127.0.0.1

以上行使MariaDB服务器仅在localhost上侦听,稍后,从站必须远程连接到主站,需要注释掉上面的行以允许远程登录,保存文件并重新启动MariaDB服务以使更改生效:

sudo systemctl restart mariadb

或者:

sudo systemctl restart mysql

当主服务器位于公共Internet上时,建议限制对端口3306(默认MariaDB端口)的访问,例如,可以使用UFW创建IP地址白名单,仅允许从属IP地址连接到端口3306,参考Debian、Ubuntu、Linux Mint系统中的UFW防火墙入门教程

之后,我们需要在主服务器上添加复制用户,从服务器将使用此用户远程登录主服务器并请求二进制日志,登录MariaDB监视器:

sudo mysql -u root

然后创建用户并向该用户授予复制从属权限,用你首选的用户名和密码替换replicant_password及replicant:

create user 'replicant'@'%' identified by 'replicant_password';

grant replication slave on *.* to replicant;

如果从服务器将通过公共Internet连接到主服务器,则强制执行TLS加密是一种很好的做法:

grant replication slave on *.* to replicant require ssl;

然后刷新权限表:

flush privileges;

现在不要退出MariaDB监视器。

 

步骤2:在从站上启用中继日志和复制

在slave上打开50-server.cnf文件:

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

在[mysqld]单元中找到Logging and Replication部分,然后添加这4行:

server-id       = 02

relay-log-index = /var/log/mysql/slave-relay-bin.index

relay-log       = /var/log/mysql/slave-relay-bin

replicate-do-db = database_name

database_name应与主服务器上的数据库名称相同,在上面的配置中,我们没有启用二进制日志记录,如果从站仅用于负载平衡,这很好,如果从站也将充当另一个从站的主站,或者从站将用于备份,则需要启用二进制日志记录,要启用二进制日志记录,请添加以下3行:

log-bin       = /var/log/mysql/02-bin

log-bin-index = /var/log/mysql/02-bin.index

binlog_format = mixed

如果从属设备将作为另一个从属设备的主设备,则还要添加以下行:

log_slave_updates = ON

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

sudo systemctl restart mariadb

有时MariaDB可能无法重启,运行systemctl status mariadb以检查状态。

 

步骤3:将数据库从主服务器复制到从服务器

在主MariaDB监视器上,运行以下命令以防止对数据库进行任何进一步更改:

flush tables with read lock;

注意:如果主服务器位于实时网站上,则上述命令可能导致你的网站脱机,在另一台服务器上创建你的网站的克隆,以防止停机。

然后使用以下命令获取二进制日志坐标,坐标是当前正在使用的二进制日志文件的名称,以及最后写入事件的位置:

show master status;

在Ubuntu 18.04/18.10上设置MariaDB主从复制的方法

不要退出MariaDB监视器,因为现在退出它将释放锁定,记录文件和位置详细信息,现在打开另一个终端窗口并通过SSH连接到主服务器,使用mysqldump实用程序将数据库转储到.sql文件:

sudo mysqldump -u root database_name > database_name.sql

你可以通过在MariaDB监视器上运行以下命令来获取数据库名称:

show databases;

将数据库转储到磁盘后,可以通过在MariaDB监视器上运行以下命令来解锁主服务器上的表:

unlock tables;

使用scp命令或你喜欢的任何方法将此SQL文件复制到从属服务器,然后登录到从属MariaDB监视器:

sudo mysql -u root

创建一个具有相同名称的空白数据库:

create database database_name;

退出MariaDB监视器:

exit;

使用以下命令将数据库导入到从属MariaDB服务器:

sudo mysql -u root database_name < database_name.sql

为了使数据与主机保持一致,建议在从机上启用只读模式,复制将以只读模式正常工作,在slave上打开50-server.cnf文件:

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

在[mysqld]单元中添加以下行以启用只读模式:

read-only = 1

具有SUPER权限的用户(如root)仍然可以写入数据库,因此在向用户授予权限时应该小心,如果不希望任何人能够更改/删除数据库,可以在[mysqld]单元中添加以下行:

innodb-read-only = 1

保存并关闭文件,然后重新启动MariaDB以使更改生效:

sudo systemctl restart mariadb

 

步骤4:设置TLS加密

注意:如果从站和主站位于专用网络中,则不必执行此步骤,跳到第5步。

如果从属设备将通过公共Internet连接到主设备,则必须启用TLS加密以防止流量监听,你的服务器可能具有启用了TLS的Web服务器,因此你也可以将该TLS证书用于MariaDB。例如,我已使用Let's Encrypt在我的Nginx Web服务器中启用了TLS,要在MariaDB中启用TLS,请打开50-server.cnf文件:

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

在[mysqld]单元中找到安全功能部分,添加以下行,请把ywnz修复成自己的:

ssl-ca = /etc/letsencrypt/live/ywnz.com/chain.pem

ssl-cert = /etc/letsencrypt/live/ywnz.com/cert.pem

ssl-key = /etc/letsencrypt/live/ywnz.com/privkey.pem

保存并关闭文件,mysql用户需要访问上述SSL文件的权限,因此你需要使用以下命令授予读取权限:

sudo setfacl -R -m "u:mysql:rx" /etc/letsencrypt/archive/

sudo setfacl -R -m "u:mysql:rx" /etc/letsencrypt/live/

然后重新启动MariaDB以使更改生效:

sudo systemctl restart mariadb

你可能想知道为什么你不需要授予www-data用户对SSL文件的读取权限,这是因为Apache或Nginx有一个以root用户身份运行的主进程,但是,所有MariaDB进程都以mysql用户身份运行。

MariaDB重新启动后,登录MariaDB监视器并运行以下命令以检查是否已成功启用SSL:

show global variables like "have_ssl";

如果值为“是”,则启用SSL:

在Ubuntu 18.04/18.10上设置MariaDB主从复制的方法

如果值为“DISABLED”,则表示SSL配置中存在错误,检查MariaDB错误日志(/var/log/mysql/error.log)以查找原因。

Debian/Ubuntu存储库中的MariaDB服务器二进制文件与MariaDB捆绑的YaSSL库静态链接,MariaDB存储库中的MariaDB二进制文件与系统的TLS库(通常是OpenSSL)动态链接,可以登录MariaDB监视器并运行以下命令来检查MariaDB服务器正在使用哪个SSL库:

show variables like "version_ssl_library";

在Ubuntu 18.04/18.10上设置MariaDB主从复制的方法

可以使用以下命令从从站登录来测试TLS连接,--ssl选项强制实施安全连接:

mysql -h Master_IP_Address -u replicant -p --ssl

登录后,运行:

status;

在输出中,可以看到正在使用的SSL密码:

在Ubuntu 18.04/18.10上设置MariaDB主从复制的方法

 

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

现在登录到从属MariaDB监视器并运行以下命令以创建连接配置文件:

MariaDB [(none)]> change master 'master01' to

-> master_host='master_IP_address',

-> master_user='replicant',

-> master_password='replicant_password',

-> master_port=3306,

-> master_log_file='master-bin.000001',

-> master_log_pos=62307428,

-> master_connect_retry=10,

-> master_use_gtid=slave_pos,

-> master_ssl=1;

在第一行中,连接名称设置为master01,可以从主MariaDB服务器上的show master status命令获取master_log_file和master_log_pos的值,master_use_gtid=slave_pos在MariaDB复制中启用GTID(全局事务ID),GTID是从MariaDB 10.0.2开始提供的功能。

最后一行强制执行TLS加密,如果主服务器和从服务器位于安全专用网络中,则不必强制执行TLS加密,因此你可以删除最后一行,请注意,最后一行以分号结尾。

然后开始这个连接:

MariaDB [(none)]> start slave 'master01';

检查状态:

MariaDB [(none)]> show slave 'master01' status\G;

如果在输出中看不到任何错误,则表示复制正在顺利运行,应该看到以下两个“Yes”表示一切顺利,如果其中一个不是“Yes”,那么事情就不对了:

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

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

要停止复制,请运行:

MariaDB [(none)]> stop slave 'master01';

如果要从复制状态重新启动复制,可以重置复制:

MariaDB [(none)]> reset slave 'master01';

附1、故障排除

第一次检查从站状态时,你可能会看到以下错误:

Last_SQL_Error: Error 'Duplicate entry

这通常发生在从属设备第一次连接到主设备时,如果发生错误,复制将停止,我们可以通过在MariaDB服务器配置文件(50-server.conf)的[mysqld]单元中添加以下两行来跳过此重复输入错误:

slave-skip-errors=1062

skip-slave-start

重启MariaDB,然后再次启动从属复制:

MariaDB [(none)]> start slave 'master01';

检查状态:

MariaDB [(none)]> show slave 'master01' status\G;

片刻之后,状态输出中的Seconds_Behind_Master将变为零,之后,可以删除[mysqld]中的两行并重新启动MariaDB。

附2、检查复制是否正常工作

首先,更改主服务器上的一些数据,然后在主MariaDB监视器上运行以下命令:

MariaDB [(none)]> show variables like "gtid_binlog_pos";

在Ubuntu 18.04/18.10上设置MariaDB主从复制的方法

然后在从属MariaDB监视器上,运行以下命令:

MariaDB [(none)]> show variables like "gtid_slave_pos";

在Ubuntu 18.04/18.10上设置MariaDB主从复制的方法

如果两个值相同,则主服务器上的数据更改将复制到从服务器。

附3、如何在Slave Server上备份数据库

请注意,复制不是备份的替代品,是的,不同服务器上有多个数据副本,但如果在主服务器上意外运行DROP DATABASE命令,则所有从属服务器都将删除数据库,可以设置多个从服务器并将其中一个专用于备份,因此创建备份时,主服务器和其余从服务器上的工作负载不会中断,有关如何备份和恢复MariaDB数据库,请参阅文章:如何在终端里备份并恢复MariaDB数据库

在从站上进行备份之前,请务必停止复制。

 

结语

经过以上5个步骤,你就可以在Ubuntu 18.04或18.10服务器上设置好MariaDB主从复制,其中第4步是可选择的步骤,也可以不用去操作,对结果没有任何影响。

 

相关主题

在Ubuntu 18.04/Debian 9上配置MariaDB Replication的方法

精选文章
热门文章