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
允许多线程复制
与mariadb/mysql 5.5不兼容的地方
max_relay_log_size is now (almost) a normal variable and not automatically changed if max_binlog_size is changed. To keep things compatible with old config files, we set it to max_binlog_size at startup if its value is 0.
You can now access replication variables that depend on the active connection with either GLOBAL or SESSION.
We only write information about relay log positions for recovery if innodb-recovery-update-relay-log is set.
Slave_retried_transaction now shows the total count of retried transactions over all slaves.
The status variable Com_slave_start is replaced with Com_start_slave.
The status variable Com_slave_stop is replaced with Com_stop_slave.
FLUSH RELAY LOGS are not replicated anymore. This is not safe as connection names may be different on the slave.
TIPS:
mysql库需要过滤掉,不能复制.
半同步(Semi-sync)暂时无法使用。
如果需要sql_slave_skip_counter,需要先制定一个通道 set @@default_master_connection=’connection_name’