mariadb-10GTID复制及多源复制
---本文大纲
一、什么是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来实现。
二、应用场景
当使用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
- [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
记录从服务器的更新
⑵、授权复制节点及用户
- 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是新上线的此操作才有意义)
- # 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标识
- 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 |
- +------------------------+----------+
- 9 rows in set (0.00 sec)
3、Mariadb Slave配置清单
⑴、编辑配置文件/etc/my.cnf
- [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,其它的都与主库一样。
⑵、应用完全备份
- # mysql /all.sql
⑶、连接Master
- MariaDB [(none)]> change master to master_host='192.168.1.122',master_user='repluser',master_password='replpass',master_use_gtid=current_pos;
⑷、看一下效果
⑸、测试一下
在Master创建一个数据库,建立一张测试表
- 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标识
- # 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标识的语句是
- MariaDB [yydb]> show global variables like 'gtid_current_pos';
修改GTID的语句是
- MariaDB [(none)]> SET GLOBAL gtid_slave_pos ='Master_GTID';
=================================基于GTID复制到此结束====================================
五、多源复制原理
首先,我们需要清楚 multi-master 与multi-source 复制不是一样的. Multi-Master 复制通常是环形复制,你可以在任意主机上将数据复制给其他主机。
Multi-source 是不同的. MySQL5.7版本中修复了一个复制限制 , 这限制是一个从站只能有一个主站. 这是一个在我们设计复制环境中的限制因素,也有一些极客使它正常工作了。但是现在有一个官方的解决办法了。所以。简单的说, Multi-Source 意味着一个从站能有一个以上主站. 现在, 像下图一样的复制环境是可能的:
这将帮助我们创建一些复制的层次结构,这在过去是不可能的。 举个例子,你可以 将一个从站放在你的办公室里。在办公室里从所有主站中复制数据传播到世界各地。
而在微观上说,各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
编辑配置文件
- [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]区域
授权复制用户
- 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
编辑配置文件
- #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]区域
授权复制用户
- 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
- 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的状态
- 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
- 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的状态
- 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
- 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 |
- +--------------------+
- 7 rows in set (0.00 sec)
Master 2
- 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 |
- +--------------------+
- 6 rows in set (0.00 sec)
- MariaDB [(none)]>
在Slave端显示结果为
- MariaDB [(none)]> show databases;
- +--------------------+
- | Database |
- +--------------------+
- | information_schema |
- | m1db |
- | m2db |
- | mysql |
- | performance_schema |
- | test |
- | xxdb |
- +--------------------+
- 7 rows in set (0.00 sec)
注:
在此实验中多源复制各Master中不能有同名库,否则复制将失败。
===========================================完=====================================
本文出自 “和风细雨” 博客,请务必保留此出处http://essun.blog.51cto.com/721033/1398848
mariadb-10GTID复制及多源复制的更多相关文章
- mysql的级联复制和多源复制
MySQL的复制:https://www.cnblogs.com/wxzhe/p/10051114.html 级联复制的结构如图 我们来设置基于filename和pos的级联复制,并且接受mysql- ...
- MariaDB的GTID复制和多源复制
什么是GTID? GTID就是全局事务ID(global transaction identifier ),最初由google实现,官方MySQL在5.6才加入该功能.GTID实际上是由UUID+TI ...
- MySQL灾备恢复在线主从复制变成主主复制及多源复制【转】
生产主主复制(A<--->B),和灾备主从复制(B--->C).当生产出现问题时,数据写入切换到灾备数据库,待生产恢复后,将灾备回写到生产.步骤如下: 1.灾备与生产其中一台建立主主 ...
- mysql的GTID复制和多源复制
配置基于GTID的复制--------------------------------------------在参数文件/etc/my.cnf增加下面内容:主库master_info_reposito ...
- mariadb 10 多源复制(Multi-source replication) 业务使用场景分析,及使用方法
mariadb 10 多源复制(Multi-source replication) 业务使用场景分析,及使用方法 官方mysql一个slave只能对应一个master,mariadb 10开始支持多源 ...
- mariadb多源复制 muiltil source replication
环境:centos-6.5 Mariadb:10.1.13-MariaDB 多源复制:企业数据库中写的需求较大,以至于I/O负载比较大,那么就必须把写的操作分摊到多台主服务器上进行,然后在将 ...
- 基于Docker搭建MySQL多源复制环境
MySQL5.7在主从复制上面相对之前版本多了一些新特性,包括多源复制.基于组提交的并行复制.在线修改Replication Filter.GTID增强.半同步复制增强等. 多源复制:多源复制加入了一 ...
- MySQL多源复制【转】
什么是多源复制? 首先,我们需要清楚 multi-master 与multi-source 复制不是一样的. Multi-Master 复制通常是环形复制, 你可以在任意主机上将数据复制给其他主机. ...
- (转)MySQL多源复制
原文:https://dev.mysql.com/doc/refman/5.7/en/replication-multi-source.html MySQL多源复制概述 MySQL多源复制使复制从接受 ...
随机推荐
- SQLAlchemy 反向生成 model 模型
前言 Django 反向生成的 model 模型的命令 : python manager.py inspectdb SQLAlchemy / Flask-SQLAlchemy则是: pip3 ins ...
- bzoj 1654: [Usaco2006 Jan]The Cow Prom 奶牛舞会【tarjan】
几乎是板子,求有几个size>1的scc 直接tarjan即可 #include<iostream> #include<cstdio> #include<cstri ...
- 题解报告:hdu 1312 Red and Black(简单dfs)
Problem Description There is a rectangular room, covered with square tiles. Each tile is colored eit ...
- MySQL故障处理一例_Another MySQL daemon already running with the same unix socket
MySQL故障处理一例:"Another MySQL daemon already running with the same unix socket". [root@test- ...
- Window对象与DOM
目前,前端插件数不胜数,比如有移动端滑动特效插件Swiper,下拉刷新的iScroll,弹出框插件layer,还有我们经常使用的JQuery,jquery.mobile等,这些插件能够满足我们日常的基 ...
- js计算每月的天数
function getDaysOfMonth(year, month) { month = parseInt(month); switch (month) { case 1: case 3: cas ...
- Java运行报错问题——Picked up JAVA_TOOL_OPTIONS: -agentlib:jvmhook
http://blog.csdn.net/xifeijian/article/details/8830933 上述这个朋友博文提醒,可能是因为其他软件添加了JAVA_HOME的路径造成冲突.但他支持删 ...
- glassfish中新建数据源(创建数据库连接池)
1.浏览器输入:http://localhost:4848 登录glassfish域管理控制台,默认的用户名和密码是amin和adminadmin.(也可以通过NetBeans的服务选项卡--服务器- ...
- Windows离线安装Python第三方库的方法
在window中,离线安装第三方模块, 1.下载第三方库的压缩文件,解压,将解压后的文件放到Python安装目录下的Lib\site_packages中 2. 将Python添加到环境变量里 3.进入 ...
- ubuntu部署java环境
一.安装java sudo add-apt-repository ppa:webupd8team/java sudo apt-get update sudo apt-get install oracl ...