现在的位置: 首页 > 关系型数据库 > MariaDB > 正文

MariaDB 10 多源复制特性

时间:2015年06月01日 | 分类:MariaDB | 评论:0 条 | 浏览:2,544 次

mariadb multi-source replication(mariadb多主复制),在mariadb-10.0里面加入了多主复制功能。

修改过的语法:
     针对每个复制线程会有一个对应的connection_name
     而connection_name是default_master_connection变量的值;
     如果你要操作对应的复制线程,需要将这个变量设置为对应的复制线程的名字。
connection_name的值是长度小于64的任何字符串,并且对大小写不敏感
     你需要尽量让连接名固定,因为它会被作为文件名的一部分。

以下是新增加的一些语法:
     关注点主要在connection_name,也就是在以前的语法上增加了connection_name,如果没加connection_name,那么默认的就是空(”).
CHANGE MASTER ['connection_name'] …
FLUSH RELAY LOGS ['connection_name']
MASTER_POS_WAIT(….,['connection_name'])
RESET SLAVE ['connection_name']
SHOW RELAYLOG ['connection_name'] EVENTS
SHOW SLAVE ['connection_name'] STATUS
SHOW ALL SLAVES STATUS
START SLAVE ['connection_name'...]]
START ALL SLAVES …
STOP SLAVE ['connection_name'] …
STOP ALL SLAVES …

原来的老式的连接是一个空字符串 ”,如果你不想用的话可以不用这个连接。
你可以使用change master创建一个新的master 连接。
你可以使用reset slave ‘connect_name’ ALL;完全的删除一个连接。

多源复制的变量
     新复制变量 @@default_master_connection 指定了;
     如果你不指定一个连接的话那个链接将会被命令和变量使用。默认这个值是 ” (默认连接名)。
     下面的复制变量是针对局部的连接的(换句话说,他们显示了 @@default_master_connection 的值)。
我们正致力于将重要的对于连接局部化。
类型                      名称                                                                   描述
变量           Max_relay_log_size                      relay log的最大值. 如果是0的话,那么在启动的时候就会被设置成 max_binlog_size 的大小
状态           Slave_heartbeat_period               多久从master请求一个心跳包 (以秒计算).
状态           Slave_received_heartbeats          我们从master收到了多少个心跳包.
状态           Slave_running                             显示slave是否正在运行。YESS表示 sql 和 IO 线程是活动的。
                                                                    No表示其中任意一个没在运行中。
                                                                    ”"表示 @@default_master_connection 不存在。
变量           Sql_slave_skip_counter                复制日志要忽略多少个条目(主要用在日志中有错误的情况下)。
     你可以用 SESSION 或者是 GLOBAL 访问以上所有的变量。
注意,和MySQL形成对比的是,所有的变量总是显示正确的有效的值!
例如:
set @@default_master_connection=”;
show status like ‘Slave_running’;
set @@default_master_connection=’other_connection’;
show status like ‘Slave_running’;

如果 @@default_master_connection 包含一个不存在的名称,你将收到一个警告.
所有其他的master相关的变量都是全局的,并且影响 “” 连接或者是所有的连接。例如, Slave_retried_transactions 现在显示所有的slave的重试事务次数。

新添加的状态变量:
               名称                                     描述
Com_start_all_slaves                执行 START ALL SLAVES 命令的次数。
Com_start_slave                      执行 START SLAVE 命令的次数。取代了 Com_slave_start.
Com_stop_slave                      执行 STOP SLAVE 命令的次数。取代了 Com_slave_stop.
Com_stop_all_slaves                执行 STOP ALL SLAVES 命令的次数

SHOW ALL SLAVES STATUS 有以下的新的列:

               名称                                     描述

     Connection_name                 master的连接名。 这是第一个变量
Slave_SQL_State                    SQL 线程的状态
Retried_transactions              这个连接重试事务的次数。
Max_relay_log_size                这个连接的最大的relay日志的大小。
Executed_log_entries             slave已经指向了多少个日志条目。
Slave_received_heartbeats     从master获得了多少个心跳。
Slave_heartbeat_period          多久从master请求一个心跳包(以秒计算)。

新文件
     被多源复制使用的新文件的基本准则是:他们有在扩展名前被冠以 连接名 前缀的和原来的中继日志文件类似的名字。
主要的例外是,保存所有连接名字的 文件master-info-file 被简单的命名为带有 multi- 前缀的 master-info-file 。

当你使用多源复制的时候,下面的文件将被创建:

               名称                                                                   描述

     multi-master-info-file                                          master-info-file (一般是 master.info) 带上了 multi- 前缀。这里面是所有使用中的master连接信息。
master-info-file-connection_name.extension       包含了当前master应用到slave的位置。扩展名一般是 .info
relay-log-connection_name.xxxxx relay-log         有了一个 connection_name 的前缀. xxxxx 是 relay log 的编号。这里面保存的是从master读取的复制数据。
relay-log-index-connection_name.extension        包含可用的 relay-log-connection_name.xxxxx 文件的名字。扩展名一般是 .index
relay-log-info-file-connection_name.extension    包含relay日志中的当前master的位置。扩展名一般是 .info

当创建这些文件的时候,连接名被转化成小写的,并且其中所有的特殊字符都被转化了,就和mysql表名中的特殊字符被转化一样。
这样做是为了方便文件名可以在不同系统上移植。
提示:
你只需要指定 –log-base-name ,所有的其他变量将会使用这个作为前缀;
     而不用为mysqld指定 –relay-log, –relay-log-index,–general-log, –slow-log, –log-bin, –log-bin-index 这些的名字。

其他事项
     所有slave的错误信息都会加上connection name,然后被写入到error log.
ER_MASTER_INFO和WARN_NO_MASTER_INFO现在会加上connection_name
这里没有冲突的解决方案,我们假设所有的master之间没有冲突.
所有执行的命令都被存储在正常的binary log里面。
如果你server variable log_warnings>1,那么你就会收到一些multi-master-info文件更新的信息
show slave status;看见的第一行是增加的,叫做connection_name.
reset slave命令现在会删除所有的relay-log文件。

典型的使用案例
     将多个master的数据整合到一个slave上,方面查询分析。
将多个mariadb/mysql服务器的数据整合到一个slave,方便备份。

受限的事项
     一个slave最多可以有64个master
每个活跃的连接会创建两个线程(和mariadb复制相同)
你需要确认所有的master需要有不同的server-id。
max_relay_log_size 在启动后修改是不能生效的。
innodb-recovery-update-relay-log 值对默认的复制连接生效,这个参数是xtradb的特新用来存储relay log的位置号。但是这个方案存在安全隐患,我们不推荐使用
Slave_net_timeout 对所有参数有效,我们不检查它是否小于Slave_heartbeat_period,因为对多主复制来说没有特别意义。

将要完成的功能
multi-source现在还不支持semisync,我们将在下个release版本中解决。
所有关于multi-source的bugs可以在这里找到https://mariadb.atlassian.net/secure/IssueNavigator.jspa?mode=hide&requestId=11400
允许多线程复制

TIPS:
mysql库需要过滤掉,不能复制.
半同步(Semi-sync)暂时无法使用。
如果需要sql_slave_skip_counter,需要先制定一个通道 set @@default_master_connection=’connection_name’

×