本文介绍在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;
不要退出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:
如果值为“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";
可以使用以下命令从从站登录来测试TLS连接,--ssl选项强制实施安全连接: mysql -h Master_IP_Address -u replicant -p --ssl 登录后,运行: status; 在输出中,可以看到正在使用的SSL密码:
步骤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";
然后在从属MariaDB监视器上,运行以下命令: MariaDB [(none)]> show variables like "gtid_slave_pos";
如果两个值相同,则主服务器上的数据更改将复制到从服务器。 附3、如何在Slave Server上备份数据库 请注意,复制不是备份的替代品,是的,不同服务器上有多个数据副本,但如果在主服务器上意外运行DROP DATABASE命令,则所有从属服务器都将删除数据库,可以设置多个从服务器并将其中一个专用于备份,因此创建备份时,主服务器和其余从服务器上的工作负载不会中断,有关如何备份和恢复MariaDB数据库,请参阅文章:如何在终端里备份并恢复MariaDB数据库。 在从站上进行备份之前,请务必停止复制。
结语 经过以上5个步骤,你就可以在Ubuntu 18.04或18.10服务器上设置好MariaDB主从复制,其中第4步是可选择的步骤,也可以不用去操作,对结果没有任何影响。
相关主题 |