mariadb-10GTID复制及多源复制

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介:

---本文大纲

一、什么是GTID

二、应用场景

三、多线程复制说明

四、实现过程

五、多源复制原理

六、实现过程

----------------------------------

一、什么是GITD

自MySQL 5.6引入的GTID(Global Transaction IDs)使得其复制功能的配置、监控及管理变得更加易于实现,且更加健壮。官方文档在这篇文档里,我们可以知道全局事务 ID 的官方定义是:GTID = source_id:transaction_id

gtid是一个 unique 唯一的表示符,他是由服务器的uuid 全局唯一标识,是由128位的随机符组成,mysql-5.6是依靠server-id和uuid 来标识复制架构中的每一个主机,因为是128位的随机字符串在全局都不会重复,server-id 和uuid以及每一个mysql事物的事物序号组成了唯一的gtid ,自从引进mysql-5.6之后每一个二进制日志当中在每一个事物的首部都会写上gtid 标记,因此gtid使得追踪和比较复制事物变得非常简单而且能够实现从崩溃中快速恢复。尤其是innodb 引擎要想实现高可用功能必须要借助于gtid来实现。

二、应用场景

wKioL1NSKh-RfZsnAAHRN5xIcEc108.bmp

当使用mariadb实现高可用时,GTID是显得尤为重要,例如,在一个高可用环境中,一主多从的模式下,当主库宕机后(写延迟),集群资源管理器可以在节点列表中的多个从库中任选一个提升为主库,而不会影响到业务本身,而其它的从库将会以新提升起来为主库为当前集群中的主库,以后将从这个库上复制同步;虽然这样做完成了“瞬间”业务切换,但可能在主库未宕机之前,多个从库的复制同步落后于主库,这样一来,当主库宕机后,集群资源管理器正好切换到一个与自己事务提交可能不一致的从库(B)上,当有应用读取之前己在宕机的主库中提交的事务时,发现现在的主库没有,这样就会出现事务不一致,而GTID就能很好的解决这个问题。首先当一个从库被提升为一个主库时,那么之前指向原来主库的从库将全部指向新提升的主库,来进行之后的复制,而后,刚提升的主库B会整合所有从库中己完成的的事务,来添补自己缺少的部分,而B从那里知道,缺少的是那一个事务,有那么多的事务,这个事务是那一个呢,这就是通过GTID来标识的,因为GTID标识了来源服务器的标识与第多少个事务(Source_id:transaction_id),每一个改变是事件都会与GTID相关连起来记录于binlog日志中以供其它从库同步,从而做到全局唯一的标识。

注:

在多级复制中GTID是不会改变的。

在GTID中,如果主服务器中有多个数据库,要实现多线程复制是靠I/O复制到从库的中继日志中由多个SQL thread来进行应用于本地的。

三、多线程复制说明

MySQL 5.6之前的版本,同步复制是单线程的,队列的,只能一个一个执行,在5.6里,可以做到多个库之间的多线程复制,例如数据库里,存放着用户表,商品表,价格表,订单表,那么将每个业务表单独放在一个库里,这时就可以做到多线程复制,但一个库里的表,多线程复制是无效的。

注:

每个数据库仅能使用一个线程,复制涉及到多个数据库时多线程复制才有意义;

同一个库的事务复制,就必须按先后顺序复制。

在复制模型中,同一个线程(I/O线程)可以对多个数据库提供服务。

四、实现过程

注:

此处仅是实现GTID复制。

1、资源分配

服务类型 版本类型 ip地址
OS
Centos6.5x86_64
Mariadb Master 10.0.10-MariaDB-log Source distribution 192.168.1.122/24
Mariadb Slave 10.0.10-MariaDB-log Source distribution 192.168.1.210/24

2、Mariadb Master配置清单

⑴、编辑配置文件/etc/my.cnf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
[client]
port        = 3306
socket      =  /tmp/maria .sock
[mysqld]
port        = 3306
socket      =  /tmp/maria .sock
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
thread_concurrency = 4
datadir= /mydata/data
log-bin=mysql-bin
binlog_format=row
server- id =10
log-slave-update =True
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync -master-info=1
slave-parallel-threads=2
master-verify-checksum=CRC32
slave-sql-verify-checksum=1
binlog-rows-query-log-events=1
report-port=3306
report-host=master.mysql.com
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout

注解:

binlog-format

二进制日志的格式,有row、statement和mixed几种类型;

当设置隔离级别为READ-COMMITED必须设置二进制日志格式为ROW,现在MySQL官方认为STATEMENT这个已经不再适合继续使用;但mixed类型在默认的事务隔离级别下,可能会导致主从数据不一致;

log-slave-updates、report-port和report-host

用于启动GTID及满足附属的其它需求;

master-info-repository和relay-log-info-repository

启用此两项,可用于实现在崩溃时保证二进制及从服务器安全的功能;

sync-master-info

启用之可确保无信息丢失;

slave-paralles-threads

设定从服务器的SQL线程数;0表示关闭多线程复制功能;

binlog-checksum、master-verify-checksum和slave-sql-verify-checksum

启用复制有关的所有校验功能;

binlog-rows-query-log-events

启用之可用于在二进制日志记录事件相关的信息,可降低故障排除的复杂度;

log-bin

启用二进制日志,这是保证复制功能的基本前提;

server-id

同一个复制拓扑中的所有服务器的id号必须惟一

log_slave_updates

记录从服务器的更新

⑵、授权复制节点及用户

1
2
3
4
5
MariaDB [(none)]>  GRANT  REPLICATION SLAVE  ON *.*  TO  repluser@192.168.1.122 IDENTIFIED  BY  'replpass' ;
Query OK, 0  rows  affected (0.01 sec)
MariaDB [(none)]> flush  privileges
     -> ;
Query OK, 0  rows  affected (0.00 sec)

⑶、备份Master节点的数据,同步于slave(此操作并非必须的,如果Master上有大量数据需要同步到新的Slave上,Slave是新上线的此操作才有意义)

1
2
# mysqldump -uroot -hmaster.mysql.com --all-databases --lock-all-tables --flush-logs --master-data=2 > /tmp/all.sql
#scp /tmp/all.sql 192.168.1.210:/tmp

⑷、查看一下Master GTID标识

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
MariaDB [(none)]> show variables  like  "%gtid%"
     -> ;
+ ------------------------+----------+
| Variable_name          | Value    |
+ ------------------------+----------+
| gtid_binlog_pos        | 0-1-2130 |
| gtid_binlog_state      | 0-1-2130 |
| gtid_current_pos       | 0-1-2130 |
| gtid_domain_id         | 0        |
| gtid_ignore_duplicates |  OFF       |
| gtid_seq_no            | 0        |
| gtid_slave_pos         |          |
| gtid_strict_mode       |  OFF       |
| last_gtid              | 0-1-2130 |
+ ------------------------+----------+
rows  in  set  (0.00 sec)

3、Mariadb Slave配置清单

⑴、编辑配置文件/etc/my.cnf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[client]
port        = 3306
socket      =  /tmp/maria .sock
[mysqld]
port        = 3306
socket      =  /tmp/maria .sock
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
thread_concurrency = 4
datadir= /mydata/data
log-bin=mysql-bin
relay-log=relay-log-bin
server- id =20
binlog- format =ROW
log-slave-updates= true
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync -master-info=1
slave-parallel-threads=2
binlog-checksum=CRC32
master-verify-checksum=1
slave-sql-verify-checksum=1
binlog-rows-query-log_events=1
report-port=3306
report-host=slave.mysql.com
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout

注:

除了server-id,其它的都与主库一样。

⑵、应用完全备份

1
# mysql </tmp/all.sql

⑶、连接Master

1
MariaDB [(none)]> change master  to  master_host= '192.168.1.122' ,master_user= 'repluser' ,master_password= 'replpass' ,master_use_gtid=current_pos;

⑷、看一下效果

wKioL1NSlejjtfQRAAYk3TiXlIA217.jpg

⑸、测试一下

在Master创建一个数据库,建立一张测试表

1
2
3
4
MariaDB [(none)]> use yydb
Database  changed
MariaDB [yydb]>  create  table  t1 (id  int (4)  not  null , name  char (30)  not  null );
Query OK, 0  rows  affected (0.03 sec)

在Slave的日志查看一下,是否含有GTID标识

1
2
3
4
5
6
7
8
9
# at 793
#140419 23:40:27 server id 1  end_log_pos 726 CRC32 0x7d8f09f0  GTID 0-1-2132
/*!100001 SET @@session.gtid_seq_no=2132* // *!*/;
# at 835
#140419 23:40:27 server id 1  end_log_pos 852 CRC32 0x4b60d93e  Query   thread_id=4 exec_time=0 error_code=0
use `yydb`/*!*/;
SET TIMESTAMP=1397922027/*!*/;
create table t1 ( id  int(4) not null,name char(30) not null)
/*!*/;

注:

如果Master与Slave的GTID标识不符,就无法实现基于GTID的复制,只要将Slave库中的GTID修改与Master一致就可以了

查看GTID标识的语句是

1
MariaDB [yydb]> show  global  variables  like  'gtid_current_pos' ;

修改GTID的语句是

1
MariaDB [(none)]>  SET  GLOBAL  gtid_slave_pos = 'Master_GTID' ;

=================================基于GTID复制到此结束====================================

五、多源复制原理

首先,我们需要清楚 multi-master 与multi-source 复制不是一样的. Multi-Master 复制通常是环形复制,你可以在任意主机上将数据复制给其他主机。

wKioL1NSzBLROFPdAAPnGUo1a2Y130.jpg

Multi-source 是不同的. MySQL5.7版本中修复了一个复制限制 , 这限制是一个从站只能有一个主站. 这是一个在我们设计复制环境中的限制因素,也有一些极客使它正常工作了。但是现在有一个官方的解决办法了。所以。简单的说, Multi-Source 意味着一个从站能有一个以上主站. 现在, 像下图一样的复制环境是可能的:

wKiom1NSzVrAcEHxAAPUwKAkuC0275.jpg

这将帮助我们创建一些复制的层次结构,这在过去是不可能的。 举个例子,你可以 将一个从站放在你的办公室里。在办公室里从所有主站中复制数据传播到世界各地。

而在微观上说,各Master开启一个binlog dump线程通知Slave端,由Slave开启多个IO threads到各Master端上复制二进制日志并记录到本地的relay日志中,由本地的SQL thread在读取出来并在本地应用。从而实现复制功能。

六、配置过程

1、资源分配

服务类型 版本类型 IP地址
OS Centos6.5x86_64
Master 1 10.0.10-MariaDB-log Source distribution 192.168.1.109
Master 2 10.0.10-MariaDB-log Source distribution 192.168.1.111
Slave 10.0.10-MariaDB-log Source distribution 192.168.1.110

2、在各Master上开启二进制日志,授权复制用户

⑴、Master 1

编辑配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[mysqld]
port        = 3306
socket      =  /tmp/mysql .sock
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
thread_concurrency = 4
datadir= /mariadb/data
server- id = 10
log-bin=mysql-bin
binlog- format =ROW

注:

binlog-format日志格式使用默认就可以

只需要修改[mysqld]区域

授权复制用户

1
2
MariaDB [(none)]>  grant  replication slave,replication client  on  *.*  to  'repluser' @ '192.168.1.110'  identified  by  'replpass' ;
Query OK, 0  rows  affected (0.00 sec)

⑵、Master 2

编辑配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#vim /etc/my.cnf
[mysqld]
port        = 3306
socket      =  /tmp/maria .sock
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
thread_concurrency = 4
datadir= /mydata/data
log-bin=mysql-bin
server- id = 20
binlog- format =ROW

注:

binlog-format日志格式使用默认就可以

只需要修改[mysqld]区域

授权复制用户

1
2
MariaDB [(none)]> grantreplication slave,replication client  on *.*  to 'repluser' @ '192.168.1.110' identified  by 'replpass' ;
Query OK, 0 rowsaffected (0.00 sec)

⑶、Slave

连接两个Master

Master 1

1
MariaDB [(none)]> change master  'Master1'  to  master_host= '192.168.1.109' ,master_user= 'repluser' ,master_password= 'replpass' ,master_log_file= 'mysql-bin.000006' ,master_log_pos=326;

查看Slave的状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
MariaDB [(none)]> show slave  'Master1'  status\G
***************************  1 . row ***************************
                Slave_IO_State: Waiting  for  master to send event
                   Master_Host:  192.168 . 1.109
                   Master_User: repluser
                   Master_Port:  3306
                 Connect_Retry:  60
               Master_Log_File: mysql-bin. 000007
           Read_Master_Log_Pos:  326
                Relay_Log_File: master-relay-bin-master1. 000009
                 Relay_Log_Pos:  535
         Relay_Master_Log_File: mysql-bin. 000007
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
               Replicate_Do_DB:
           Replicate_Ignore_DB:
            Replicate_Do_Table:
        Replicate_Ignore_Table:
       Replicate_Wild_Do_Table:
   Replicate_Wild_Ignore_Table:
                    Last_Errno:  0
                    Last_Error:
                  Skip_Counter:  0
           Exec_Master_Log_Pos:  326
               Relay_Log_Space:  1128
               Until_Condition: None
                Until_Log_File:
                 Until_Log_Pos:  0
            Master_SSL_Allowed: No
            Master_SSL_CA_File:
            Master_SSL_CA_Path:
               Master_SSL_Cert:
             Master_SSL_Cipher:
                Master_SSL_Key:
         Seconds_Behind_Master:  0
Master_SSL_Verify_Server_Cert: No
                 Last_IO_Errno:  0
                 Last_IO_Error:
                Last_SQL_Errno:  0
                Last_SQL_Error:
   Replicate_Ignore_Server_Ids:
              Master_Server_Id:  10
                Master_SSL_Crl:
            Master_SSL_Crlpath:
                    Using_Gtid: No
                   Gtid_IO_Pos:
1  row  in  set  ( 0.00  sec)

Master 2

1
MariaDB [(none)]> change master  'Master2'  to  master_host= '192.168.1.111' ,master_user= 'repluser' ,master_password= 'replpass' ,master_log_file= 'mysql-bin.000010' ,master_log_pos=342;

查看Slave的状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
MariaDB [(none)]> show slave  'Master2'  status\G
*************************** 1. row ***************************
                Slave_IO_State: Waiting  for  master  to  send event
                   Master_Host: 192.168.1.111
                   Master_User: repluser
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: mysql-bin.000010
           Read_Master_Log_Pos: 342
                Relay_Log_File: master-relay-bin-master2.000002
                 Relay_Log_Pos: 535
         Relay_Master_Log_File: mysql-bin.000010
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
               Replicate_Do_DB:
           Replicate_Ignore_DB:
            Replicate_Do_Table:
        Replicate_Ignore_Table:
       Replicate_Wild_Do_Table:
   Replicate_Wild_Ignore_Table:
                    Last_Errno: 0
                    Last_Error:
                  Skip_Counter: 0
           Exec_Master_Log_Pos: 342
               Relay_Log_Space: 841
               Until_Condition: None
                Until_Log_File:
                 Until_Log_Pos: 0
            Master_SSL_Allowed:  No
            Master_SSL_CA_File:
            Master_SSL_CA_Path:
               Master_SSL_Cert:
             Master_SSL_Cipher:
                Master_SSL_Key:
         Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert:  No
                 Last_IO_Errno: 0
                 Last_IO_Error:
                Last_SQL_Errno: 0
                Last_SQL_Error:
   Replicate_Ignore_Server_Ids:
              Master_Server_Id: 20
                Master_SSL_Crl:
            Master_SSL_Crlpath:
                    Using_Gtid:  No
                   Gtid_IO_Pos:
1 row  in  set  (0.00 sec)

⑷、测试一下

在Master1创建一个数据库,在Master2也创建一个数据库

Master 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
MariaDB [(none)]> show variables  like  'server_id' ;
+ ---------------+-------+
| Variable_name | Value |
+ ---------------+-------+
| server_id     | 10    |
+ ---------------+-------+
1 row  in  set  (0.00 sec)
MariaDB [(none)]>  create  database  m1db;
Query OK, 1 row affected (0.01 sec)
MariaDB [(none)]> show databases;
+ --------------------+
Database            |
+ --------------------+
| information_schema |
| jjdb               |
| m1db               |
| mysql              |
| performance_schema |
| test               |
| yydb               |
+ --------------------+
rows  in  set  (0.00 sec)

Master 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
MariaDB [(none)]> show variables  like  'server_id' ;
+ ---------------+-------+
| Variable_name | Value |
+ ---------------+-------+
| server_id     | 20    |
+ ---------------+-------+
1 row  in  set  (0.00 sec)
MariaDB [(none)]>  create  database  m2db;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> show databases;
+ --------------------+
Database            |
+ --------------------+
| information_schema |
| m2db               |
| mysql              |
| performance_schema |
| test               |
| xxdb               |
+ --------------------+
rows  in  set  (0.00 sec)
MariaDB [(none)]>

在Slave端显示结果为

1
2
3
4
5
6
7
8
9
10
11
12
13
MariaDB [(none)]> show databases;
+ --------------------+
Database            |
+ --------------------+
| information_schema |
| m1db               |
| m2db               |
| mysql              |
| performance_schema |
| test               |
| xxdb               |
+ --------------------+
rows  in  set  (0.00 sec)

注:

在此实验中多源复制各Master中不能有同名库,否则复制将失败。

===========================================完=====================================










本文转自 jinlinger 51CTO博客,原文链接:http://blog.51cto.com/essun/1398848,如需转载请自行联系原作者
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7月前
|
NoSQL 关系型数据库 MySQL
阿里云RDS关系型数据库大全_MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等
阿里云RDS关系型数据库如MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等,NoSQL数据库如Redis、Tair、Lindorm和MongoDB
256 0
|
7月前
|
NoSQL 关系型数据库 MySQL
阿里云关系型数据库详细介绍MySQL/MariaDB/SQL Server/PolarDB/PostgreSQL等
阿里云关系型数据库详细介绍MySQL/MariaDB/SQL Server/PolarDB/PostgreSQL等,阿里云RDS关系型数据库如MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等
118 0
|
7月前
|
NoSQL Cloud Native 关系型数据库
阿里云RDS数据库_MySQL_SQL Server_MariaDB_PolarDB_PostgreSQL
阿里云RDS关系型数据库大全:MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等
111 0
|
存储 自然语言处理 关系型数据库
mysql/mariadb 实现全文检索
mysql/mariadb 实现全文检索
mysql/mariadb 实现全文检索
|
9月前
|
关系型数据库 MySQL API
MariaDB数据库中如何允许远程链接mysql并开放3306端口
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险。
559 0
|
9月前
|
存储 关系型数据库 MySQL
mysql--Centos安装MariaDB(mysql)
mysql--Centos安装MariaDB(mysql)
1389 0
|
9月前
|
Ubuntu 关系型数据库 MySQL
Ubuntu安装MariaDB-10.3数据库(等同于Mysql-5.7)
Ubuntu安装MariaDB-10.3数据库(等同于Mysql-5.7)
197 0

推荐镜像

更多