关于MariaDB.10.5.1 主从复制介绍

提示:本博文演示环境是基于centos7.2 x86_64位,最小化安装系统,MariaDB.10.5.1二进制安装来进行的

一、简单介绍下slave库的并行复制模式

slave_parallel_mode的 slave并行复制的5种模式:
官方给的5种模式

Description: Controls what transactions are applied in parallel when using parallel replication.
optimistic: tries to apply most transactional DML in parallel, and handles any conflicts with rollback and retry. See optimistic mode.
conservative: limits parallelism in an effort to avoid any conflicts. See conservative mode.
aggressive: tries to maximize the parallelism, possibly at the cost of increased conflict rate.
minimal: only parallelizes the commit steps of transactions.
none: disables parallel apply completely.

in-order 有序并行复制的optimistic乐观模式为在slave上并行应用提供了很多机会,同时从应用程序的角度来看,仍然保留精确的事务语义。这是MariaDB 10.5.1中的默认模式

二、master_use_gtid 参数说明:

配置主从复制时, CHANGE MASTER TO master_use_gtid = { slave_pos | current_pos | no } 这3个参数介绍:

2.1、CHANGE MASTER TO master_use_gtid=slave_pos 介绍:

假如:
A slave is configured to use GTID by CHANGE MASTER TO master_use_gtid=slave_pos

当slave从站连接到master主站时,它将在复制到从站的最后一个GTID的位置开始复制,这可以在变量gtid_slave_pos中看到。由于所有复制服务器上的GTID均相同,因此可以将从属服务器指向其他主服务器,并自动确定正确的位置。

如果不希望更改从属服务器上的binlog会影响GTID复制位置,则应使用master_use_gtid = slave_pos。然后,从站将始终在最后复制的GTID位置连接到主站。
对于期望与传统复制保持一致行为的用户来说,这可以避免一些意外,因为复制位置永远不会因服务器上进行的本地更改而改变

如果在从站上写入任何本地事务,则在使用值current_pos时可能会遇到问题。例如,如果在slave从属线程停止时发出INSERT语句或以其他方式写入表,则可能在gtid_binlog_pos中生成新的本地GTID,这将影响从属的gtid_current_pos值。重新启动从属线程时,这可能会导致错误,因为主控制器将不存在本地GTID。您可以通过将MASTER_USE_GTID复制参数设置为slave_pos而不是current_pos来纠正此问题。

重要提示:下面3种场景的演示环境: centos7.2_x86_64位 MariaDB.10.5.1 二进制安装
mgr01 172.16.0.130 master
mgr03 172.16.0.131 slave

1.场景1:当线上的master库运行了一段时间,而且数据库的数据很少。针对此场景给master库部署一个全新的slave库

mgr03启动后默认情况下GTID位点都是空的,尤其是gtid_slave_pos 这个是空的


([email protected]‘mgr03‘:mysql.sock)[(none)]>show variables like ‘Gtid%‘;
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| gtid_binlog_pos         |       |
| gtid_binlog_state       |       |
| gtid_cleanup_batch_size | 64    |
| gtid_current_pos        |       |
| gtid_domain_id          | 0     |
| gtid_ignore_duplicates  | OFF   |
| gtid_pos_auto_engines   |       |
| gtid_seq_no             | 0     |
| gtid_slave_pos          |       |
| gtid_strict_mode        | OFF   |
+-------------------------+-------+
10 rows in set (0.00 sec)

([email protected]‘mgr03‘:mysql.sock)[(none)]>ALTER USER ‘root‘@‘localhost‘ IDENTIFIED BY ‘123456‘;
Query OK, 0 rows affected (0.02 sec)

([email protected]‘mgr03‘:mysql.sock)[(none)]>show variables like ‘Gtid%‘;
+-------------------------+-------------+
| Variable_name           | Value       |
+-------------------------+-------------+
| gtid_binlog_pos         | 0-1313306-1 |
| gtid_binlog_state       | 0-1313306-1 |
| gtid_cleanup_batch_size | 64          |
| gtid_current_pos        | 0-1313306-1 |
| gtid_domain_id          | 0           |
| gtid_ignore_duplicates  | OFF         |
| gtid_pos_auto_engines   |             |
| gtid_seq_no             | 0           |
| gtid_slave_pos          |             |
| gtid_strict_mode        | OFF         |
+-------------------------+-------------+
10 rows in set (0.01 sec)

master操作:

提示:reset master 这一步操作不是必须的,除非在这个库之前,此数据库做过别的集群的slave库。尤其是在master库上,严禁此操作,除非你清楚的知道自己在干什么

mysql -e "grant replication slave on *.* to [email protected]‘172.16.0.%‘ identified by ‘JuwoSdk21TbUser‘; flush privileges;"
mysqldump -uroot -p‘123456‘ -B -A -F  --master-data=2 --single-transaction  --events|gzip >test.sql.gz
scp -rp -P52110 /opt/tes.sql.gz [email protected]:/root

slave操作:

([email protected]‘mgr03‘:mysql.sock)[test]>source /root/test.sql
CHANGE MASTER TO MASTER_HOST=‘mgr01‘,MASTER_PORT=3306,MASTER_USER=‘repuser‘,MASTER_PASSWORD=‘JuwoSdk21TbUser‘,master_use_gtid=slave_pos;start slave;show slave status\G

2.场景2: 当线上的master库运行了一段时间,而且数据库的数据很少。针对此场景给master库部署一个slave库。但是这个新slave库之前有做过其他的项目的主库

那么初始位置需要手动设置为空:SET GLOBAL gtid_slave_pos = "";

mgr01-master :
当前gtid情况:

[email protected] [test]>show variables like ‘Gtid%‘;
+-------------------------+--------------+
| Variable_name           | Value        |
+-------------------------+--------------+
| gtid_binlog_pos         | 0-1283306-50 |
| gtid_binlog_state       | 0-1283306-50 |
| gtid_cleanup_batch_size | 64           |
| gtid_current_pos        | 0-1283306-50 |
| gtid_domain_id          | 0            |
| gtid_ignore_duplicates  | OFF          |
| gtid_pos_auto_engines   |              |
| gtid_seq_no             | 0            |
| gtid_slave_pos          | 0-1313306-41 |
| gtid_strict_mode        | OFF          |
+-------------------------+--------------+
10 rows in set (0.001 sec)

mgr03-slave:
当前gtid情况:


([email protected]‘mgr03‘:mysql.sock)[test]>show variables like ‘Gtid%‘;
+-------------------------+---------------------------+
| Variable_name           | Value                     |
+-------------------------+---------------------------+
| gtid_binlog_pos         | 0-1313306-45              |
| gtid_binlog_state       | 0-1283306-42,0-1313306-45 |
| gtid_cleanup_batch_size | 64                        |
| gtid_current_pos        | 0-1313306-45              |
| gtid_domain_id          | 0                         |
| gtid_ignore_duplicates  | OFF                       |
| gtid_pos_auto_engines   |                           |
| gtid_seq_no             | 0                         |
| gtid_slave_pos          | 0-1283306-42              |
| gtid_strict_mode        | OFF                       |
+-------------------------+---------------------------+
10 rows in set (0.00 sec)

具体操作:

master操作:

mysql -e "grant replication slave on *.* to [email protected]‘172.16.0.%‘ identified by ‘JuwoSdk21TbUser‘; flush privileges;"

mysqldump -uroot -p‘123456‘ -B -A -F  --master-data=2 --single-transaction  --events|gzip >test.sql.gz

scp -rp -P52110 /opt/test.sql.gz [email protected]:/root

slave操作:


([email protected]‘mgr03‘:mysql.sock)[test]>source /root/test.sql

([email protected]‘mgr03‘:mysql.sock)[test]>reset master ;
([email protected]‘mgr03‘:mysql.sock)[test]>stop slave;
Query OK, 0 rows affected (0.12 sec)
([email protected]‘mgr03‘:mysql.sock)[test]>reset slave all;
([email protected]‘mgr03‘:mysql.sock)[test]>SET GLOBAL gtid_slave_pos = "";
Query OK, 0 rows affected (0.03 sec)

([email protected]‘mgr03‘:mysql.sock)[test]>show variables like ‘Gtid%‘;
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| gtid_binlog_pos         |       |
| gtid_binlog_state       |       |
| gtid_cleanup_batch_size | 64    |
| gtid_current_pos        |       |
| gtid_domain_id          | 0     |
| gtid_ignore_duplicates  | OFF   |
| gtid_pos_auto_engines   |       |
| gtid_seq_no             | 0     |
| gtid_slave_pos          |       |
| gtid_strict_mode        | OFF   |
+-------------------------+-------+
10 rows in set (0.00 sec)

([email protected]‘mgr03‘:mysql.sock)[test]>CHANGE MASTER TO MASTER_HOST=‘mgr01‘,MASTER_PORT=3306,MASTER_USER=‘repuser‘,MASTER_PASSWORD=‘JuwoSdk21TbUser‘,master_use_gtid=slave_pos;start slave;show slave status\G

3.场景三:从mysqldump或者XtraBackup或者Mariabackup备份集设置

这两种方式都可以在非阻塞的情况下获得备份时正确的Binlog位点(所有表都要是事务引擎),当然,如果备份时不会有写入,那么 SHOW MASTER STATUS 也能提供正确的位点。
一旦获取了备份时正确的Binlog位点(文件名和偏移量),那么就可以用BINLOG_GTID_POS()函数来计算GTID:SELECT BINLOG_GTID_POS("mysql-bin.000011",342);

使用mysqldump +gtid 方式新建slave:

从MariaDB 10.0.13版本开始,mysqldump会自动完成这个工作,并且把GTID的写在导出文件中,只要设置 –master-data 或 -dump-slave 的同时设置 --gtid 即可。

mgr01-master:

[[email protected] ~]# mysqldump -uroot -p‘123456‘ -B -A -F  --master-data=1 --gtid  --single-transaction  --events >2.sql
[[email protected] ~]#
[[email protected] ~]# grep  ‘CHANGE MASTER TO‘ 2.sql
-- CHANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.000011‘, MASTER_LOG_POS=342;
CHANGE MASTER TO MASTER_USE_GTID=slave_pos;

([email protected]‘mgr01‘:mysql.sock)[(none)]>SELECT BINLOG_GTID_POS("mysql-bin.000011",342);
+-----------------------------------------+
| BINLOG_GTID_POS("mysql-bin.000011",342) |
+-----------------------------------------+
| 0-1283306-68                            |
+-----------------------------------------+
1 row in set (0.009 sec)

[[email protected] ~]# scp -rp -P52110 2.sql [email protected]‘172.16.0.131‘:/root

slave库操作:

([email protected]‘mgr03‘:mysql.sock)[test]>source /root/2.sql
([email protected]‘mgr03‘:mysql.sock)[test]>show variables like ‘gtid_slave_pos‘;
+----------------+--------------+
| Variable_name  | Value        |
+----------------+--------------+
| gtid_slave_pos | 0-1283306-68 |
+----------------+--------------+
1 row in set (0.00 sec)

([email protected]‘mgr03‘:mysql.sock)[test]>SET GLOBAL gtid_slave_pos = "0-1283306-68";   这一步可有可无
([email protected]‘mgr03‘:mysql.sock)[test]>CHANGE MASTER TO MASTER_HOST=‘mgr01‘,MASTER_PORT=3306,MASTER_USER=‘repuser‘,MASTER_PASSWORD=‘JuwoSdk21TbUser‘,master_use_gtid=slave_pos;start slave;show slave status\G

使用当日Mariabackup的全备份来新建一个slave库:

mgr01 master 库上操作:

master主库上创建备份用户
[email protected] [(none)]>grant  reload,replication client,lock tables,process,super on *.* to [email protected]‘127.0.0.1‘ identified by ‘mypassword‘;flush privileges;

 mariabackup --backup --target-dir=/data/backup/  --user=mariabackup --password=mypassword  --host=127.0.0.1
 mariabackup --prepare --target-dir=/data/backup/

cd /data/; tar zcf bak.tar.gz ./backup
scp -rp -P22 bak.tar.gz [email protected]72.16.0.131:/root

[[email protected] data]# cat /data/backup/xtrabackup_binlog_info
mysql-bin.000013    746 0-1283306-74

mgr03 slave库上操作:


[[email protected] ~]# mariabackup  --defaults-file=/etc/my.cnf  --copy-back  --target-dir=/data/backup/
 chown -R mysql.mysql  /data/mysql/mysql3306/data
 /etc/init.d/mysql start

 基于Gtid复制配置:
SET GLOBAL gtid_slave_pos = "0-1283306-74";
CHANGE MASTER TO MASTER_HOST=‘mgr01‘,MASTER_PORT=3306,MASTER_USER=‘repuser‘,MASTER_PASSWORD=‘JuwoSdk21TbUser‘,master_use_gtid=slave_pos;start slave;show slave status\G

基于File and Position复制配置:

CHANGE MASTER TO
   MASTER_HOST=‘mgr01‘,
   MASTER_PORT=3306,
   MASTER_USER="repuser",
   MASTER_PASSWORD="JuwoSdk21TbUser",
   MASTER_LOG_FILE=‘mysql-bin.000013‘,
   MASTER_LOG_POS=746;
START SLAVE;

从一个线上的slave库进行 mariabackup备份数据库,然后利用这个备份做当前master库的slave库:
基于Gtid复制配置:
master库操作:

mariabackup --backup --slave-info --safe-slave-backup --target-dir=/data/backup/  --user=mariabackup --password=mypassword
 mariabackup --prepare --target-dir=/data/backup/
 cd /data/; tar zcf bak.tar.gz ./backup
scp -rp -P22 bak.tar.gz [email protected]:/root
[[email protected] data]# cat /data/backup/xtrabackup_binlog_info
mysql-bin.000013    746 0-1283306-74

slave库操作:

SET GLOBAL gtid_slave_pos = "0-1283306-74";
CHANGE MASTER TO MASTER_HOST=‘mgr01‘,MASTER_PORT=3306,MASTER_USER=‘repuser‘,MASTER_PASSWORD=‘JuwoSdk21TbUser‘,master_use_gtid=slave_pos;start slave;show slave status\G

2.2、CHANGE MASTER TO master_use_gtid=curren_pos 介绍:

假设我们设置了两个服务器A和B,让A作为master主服务器,而B作为slave从服务器。它运行了一段时间。然后在某个时候,masterA挂掉了,而slaveB成为了新的master。
然后,稍后我们想添加源masterA作为备库,也就是作为新的master 的slave库。
因为A之前从来不是slave库,它没有任何先前复制的GTID,并且gtid_slave_pos是空的,
为了允许A自动添加为slave库,可以使用master_use_gtid = current_pos,这将使用变量gtid_current_pos的值而不是gtid_slave_pos进行连接,gtid_current_pos该变量还考虑了当服务器作为主服务器时写入二进制日志中的GTID。
使用master_use_gtid = current_pos时,在使用CHANGE MASTER之前无需考虑服务器是master还是slave.
但是必须注意不要将多余的事务注入到slave 上的binlog中,这些事务不打算复制到其他服务器。
如果这样的额外事务是slave服务器启动时最新的事务,它将用作复制的起点。这可能会失败,因为该事务不在master主服务器上。为了避免slave从属服务器上的本地事务更改进入binlog,请将slave上的sql_log_bin设置为0。

启用GTID严格模式(通过将@@ GLOBAL.gtid_strict_mode设置为1)时,通常最好使用current_pos。在严格模式下,不允许在主服务器上进行额外的事务
提示:
不应以任何其他方式修改mysql.gtid_slave_pos表。特别是,请勿尝试更新表中的行以更改从站对当前GTID位置的想法

2.3、CHANGE MASTER TO master_use_gtid =no

这个是配置基于filename,pos传统复制的配置,这个在此不再演示描述,具体配置可以自行搜索本博主的文章或者百度。
到此处关于mariadb的主从复制介绍完毕,欢迎一起交流学习

原文地址:https://blog.51cto.com/wujianwei/2473718

时间: 2024-10-15 15:07:54

关于MariaDB.10.5.1 主从复制介绍的相关文章

MariaDB 10 基于OpenSSL的主从复制

需求架构 准备工作 主从服务器时间同步 # 主从服务器同时配置crontab任务,与NTP服务器同步时间即可 */5 * * * * ntpdate 172.16.0.1 &>/dev/null 部署配置 主库配置 vi /etc/my.cnf server-id = 1 # 在复制架构中,需保持全局唯一 log-bin = mysql-bin # 默认在数据目录下 sync_binlog = 1 # 设置mariadb每次在提交事务前会将二进制日志同步到磁盘,保证服务器崩溃时不会丢失事件

MariaDB 10.3 主从半同步复制

本文介绍MariaDB主从半同步复制,以上一篇<MariaDB 10.3 主从复制>为基础,介绍主从半同步复制配置. 1. 简介 MariaDB从10.3.3开始已经把半同步插件加入到Server中,因此在配置主从半同步时,不再需要加载插件,本文所用的MariaDB版本为10.3.7. 2. 查看半同步复制参数 MariaDB01主 MariaDB02从 3. 启动半同步复制 MariaDB01 master启用命令:SET GLOBAL rpl_semi_sync_master_enable

数据库管理系统MariaDB 10.1.17 发布

MariaDB 10.1.17 发布,MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品. MariaDB 的详细介绍请登录勤快学QKXue.NET. 重要更新: XtraDB updated to 5.6.31-77.0TokuDB updated to 5.6.31-77.0Innodb updated to 5.6.32Performance Schem

LNMP 源码安装 超详细笔记记录 PHP7 MariaDB 10.1.12

LNMP 源码安装 超详细笔记记录 php 7.04 版本 mariaDB  10.1.12 版本 首先安装nginx 一般编译nginx时,都要先安装pcre.zlib等外部支持程序,然后编译安装nginx时指定这些外部支持程序的位置,这样nginx在每次启动的时候,就会去动态加载这些东西了. 下面介绍的是另一种方式,即将这些程序编译到nginx里面去,这样nginx启动时就不会采用动态加载的方式去load.从古谱中可获知,这种方式会比动态加载有更高的效率. 首先 安装 yum install

CentOS7安装通用二进制格式MariaDB 10.2.8

什么是MariaDB MariaDB 是MySql的一个分支. 了解一下数据库的发展历史,我们知道,MySql数据库不但二次易主,而且还被打入了冷宫(先被sun收购,然后sun被Oracle收购).因为Oracle有自己的数据库,同时只有Oracle自己的员工可以进行MySql的研发,所以MySQL之父Widenius先生离开了Sun之后,觉得依靠Sun/Oracle来发展MySQL,实在很不靠谱,于是决定另开分支,这个分支的名字叫做MariaDB. MariaDB不仅仅是Mysql的一个替代品

CentOS 6.4 安装 MariaDB 10.3

本文介绍如何使用yum在CentOS 6.4 安装 MariaDB 10.3 1. 创建mysql组 groupadd mysql 2. 创建mysql用户并添加到mysql组 useradd -g mysql mysql 3.修改mysql密码 passwd mysql 4. 配置 MariaDB 10.3 yum vi /etc/yum.repos.d/MariaDB.repo # MariaDB 10.3 CentOS repository list - created 2018-06-0

CentOS 7安装MariaDB 10详解以及相关配置

CentOS 7安装MariaDB 10详解以及相关配置 第一步:添加 MariaDB yum 仓库 首先在CentOS操作系统中/etc/yum.repos.d/目录下添加 MariaDB 的YUM配置文件MariaDB.repo文件. vi /etc/yum.repos.d/MariaDB.repo 在该文件中添加以下内容保存: [mariadb]name = MariaDBbaseurl = http://yum.mariadb.org/10.2/centos7-amd64gpgkey=h

What&#39;s is new in MariaDB 10.0(MySQL创始人Monty演讲)

视频地址(请使用翻墙软件观看): http://www.youtube.com/watch?v=4Th7JeRxPlo&feature=youtu.be PDF在附件里. What's is new in MariaDB 10.0(MySQL创始人Monty演讲),布布扣,bubuko.com What's is new in MariaDB 10.0(MySQL创始人Monty演讲)

MariaDB 10.0.X中,动态列支持 JSON 格式来获取数据。

MariaDB 10.0.X中,动态列(Dynamic Columns),可以支持 JSON 格式来获取数据. 为了兼容传统SQL语法,MariaDB 10和MySQL5.7支持原生JSON格式,即关系型数据库和文档型NoSQL数据库集于一身. 使用说明: ###表结构 create table assets (   item_name varchar(32) primary key, -- A common attribute for all items   dynamic_cols  blo