您的位置:首页 > 数据库 > MariaDB

L11 MariaDB主从复制(异步,半同步)

2015-12-17 15:28 681 查看
MariaDB主从复制(异步,半同步)
复制简单架构:



复制原理图:



异步与半同步说明:

1.半同步复制
在说明半同步复制之前我们先来了解一下,什么是同步复制?同步复制:同步复制可以定义为数据在同一时刻被提交到一台或多台机器,通常这是通过众所周知的“两阶段提交”做到的。虽然这确实给你在多系统中保持一致性,但也由于增加了额外的消息交换而造成性能下降。使用MyISAM或者InnoDB存储引擎的MySQL本身并不支持同步复制,然而有些技术,例如分布式复制块设备(简称DRBD),可以在下层的文件系统提供同步复制,允许第二个MySQL服务器在主服务器丢失的情况下接管(使用第二服务器的复本)。了解了同步复制我们正下面来说一下,什么是半同步复制?

MYSQL 5.5开始,支持半自动复制。之前版本的MySQL Replication都是异步(asynchronous)的,主库在执行完一些事务后,是不会管备库的进度的。如果备库不幸落后,而更不幸的是主库此时又出现Crash(例如宕机),这时备库中的数据就是不完整的。简而言之,在主库发生故障的时候,我们无法使用备库来继续提供数据一致的服务了。Semisynchronous Replication(半同步复制)则一定程度上保证提交的事务已经传给了至少一个备库。Semi synchronous中,仅仅保证事务的已经传递到备库上,但是并不确保已经在备库上执行完成了。

此外,还有一种情况会导致主备数据不一致。在某个session中,主库上提交一个事务后,会等待事务传递给至少一个备库,如果在这个等待过程中主库Crash,那么也可能备库和主库不一致,这是很致命的。如果主备网络故障或者备库挂了,主库在事务提交后等待10秒(rpl_semi_sync_master_timeout的默认值)后,就会继续。这时,主库就会变回原来的异步状态。

MySQL在加载并开启Semi-sync插件后,每一个事务需等待备库接收日志后才返回给客户端。如果做的是小事务,两台主机的延迟又较小,则Semi-sync可以实现在性能很小损失的情况下的零数据丢失。
2.异步与半同步异同

默认情况下MySQL的复制是异步的,Master上所有的更新操作写入Binlog之后并不确保所有的更新都被复制到Slave之上。异步操作虽然效率高,但是在Master/Slave出现问题的时候,存在很高数据不同步的风险,甚至可能丢失数据。
MySQL5.5引入半同步复制功能的目的是为了保证在master出问题的时候,至少有一台Slave的数据是完整的。在超时的情况下也可以临时转入异步复制,保障业务的正常使用,直到一台salve追赶上之后,继续切换到半同步模式。

配置示例(异步方式)





MASTER :node1 192.168.0.20
SLAVE :node2 192.168.0.21
步骤:
一,安装mariadb

二,配置MASTER和SLAVEre

三,启动从服务器复制功能

一,安装mariadb,主从一致安装
mariadb-10.0.10-linux-x86_64.tar.gz

[root@node1 /]# mkdir /mydata/data -pv
mkdir: 已创建目录 "/mydata"
mkdir: 已创建目录 "/mydata/data"
[root@node1 /]# groupadd -r -g 306 mysql
[root@node1 /]# useradd -r -g 306 -u 306 mysql
[root@node1 /]# id mysql
uid=306(mysql) gid=306(mysql) 组=306(mysql)
[root@node1 /]# chown -R mysql.mysql /mydata/
[root@node1 /]# tar xf mariadb-10.0.10-linux-x86_64.tar.gz -C /usr/local/
[root@node1 /]# cd /usr/local/
[root@node1 local]# ln -sv mariadb-10.0.10-linux-x86_64 mysql
"mysql" -> "mariadb-10.0.10-linux-x86_64"
[root@node1 local]# cd mysql/
[root@node1 mysql]# chown -R root.mysql ./*
[root@node1 mysql]# ll
总用量 204
drwxr-xr-x 2 root mysql 4096 10月 28 15:06 bin
-rw-r--r-- 1 root mysql 17987 3月 31 2014 COPYING
-rw-r--r-- 1 root mysql 26545 3月 31 2014 COPYING.LESSER
......
[root@node1 mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data/
[root@node1 mysql]# mkdir /etc/mysql
[root@node1 mysql]# cp support-files/my-large.cnf /etc/mysql/my.cnf
[root@node1 mysql]# vim /etc/mysql/my.cnf
添加如下最基本的三行:
datadir = /mydata/data #数据目录路径
innodb_file_per_table = on #innodb独立表空间
skip_name_resolve = on #跳过域名解析



[root@node1 mysql]# cp support-files/mysql.server /etc/init.d/mysqld #复制启动脚本文件
[root@node1 mysql]# chkconfig --add mysqld #添加开机管理mysqld服务
[root@node1 data]# ln -sv /usr/local/mysql/bin/mysql /usr/bin/mysql #登录时候直接mysql可以登录
[root@node1 mysql]# service mysqld start
Starting MySQL.. [确定]

二,配置MASTER和SLAVE
配置过程:
1、master
(1) 启用二进制日志;
(2) 设置一个在当前集群中惟一的server-id;
(3) 创建一个有复制权限(REPLICATION SLAVE, REPLICATION CLIENT)账号;

2、slave
(1) 启用中继日志;
(2) 设置一个在当前集群中惟一的server-id;
(3) 使用有复制权限用户账号连接至主服务器,并启动复制线程;
master配置:






创建授权用户:

MariaDB [(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repluser'@'172.16.%.%' IDENTIFIED BY 'replpass';
Query OK, 0 rows affected (0.05 sec)

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
slave配置:






分别重启master和slave

三,启动从服务器复制功能
在master上查看二进制日志的名称和position:





在slave开始执行同步:
MariaDB [(none)]>CHANGE MASTER TO MASTER_HOST='192.168.0.20', MASTER_USER='repluser',MASTER_PASSWORD='replpass',MASTER_LOG_FILE='master-bin.000001',MASTER_LOG_POS=640,MASTER_CONNECT_RETRY=5,MASTER_HEARTBEAT_PERIOD=2;
查看:







启动线程:start slave;show slave status\G


完成。

配置示例(半同步方式)


半同步主从配置:
半同步复制:主服务器只要收到从服务器中的一台的返回信息,就会提交,否则需等待直至达到超时时间然后切换成异步再提交。可以使主从服务器的数据库数据的延迟较小,可以在损失很小的性能的前提下提高数据的安全性。

注意:至少有一台从服务器返回信息,主服务器才工作在同步状态,没有从服务器返回信息将切换到异步模式。



需要分别在master和slave端安装插件(谷歌提供)





(在以上配置的基础上)
主节点:
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.05 sec)

MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%';
+------------------------------------+-------+
| Variable_name | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled | OFF |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_no_slave | ON |
+------------------------------------+-------+
4 rows in set (0.00 sec)

MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_enabled=1; #开启同步
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_timeout=2000; #等待从服务器超时2000毫秒转换为异步模式
Query OK, 0 rows affected (0.00 sec)

从节点:
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.05 sec)

MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | OFF |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
2 rows in set (0.00 sec)

MariaDB [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled=1;
Query OK, 0 rows affected (0.00 sec)

如果从服务器已经启动,还需要重启IO_THREAD;
master查看:
SHOW GLOBAL STATUS LIKE '%semi%';



完成。

补充内容:
<一>
复制如何开始?
主节点运行很长时间,且已经有一定规模的数据,如何启动复制?

在主节点做一个完全备份,并记录二进制日志文件及位置;
在从节点恢复此完全备份,并在启动复制时从记录的二进制日志文件和位置开始;

复制时应该注意的问题:
1、如何限制从服务器只读?
在从服务器启动read_only;但仅对非具有SUPER权限的用户有效;

阻止所有用户 :MariaDB> FLUSH TABLES WITH READ LOCK;

2、如何保证主从复制时的事务安全?
在master节点启用参数:
sync_binlog = on #一旦数据改变产生,立即同步到二进制日志。

如果用到的为InnoDB存储引擎:
innodb_flush_logs_at_trx_commit
innodb_support_xa=on

在slave节点:
skip_slave_start
#禁止从服务器启动之后自动启动slave(start slave),手动进行start slave
sync_master_info = 1 #立即同步到master_info
sync_relay_log = 1
sync_relay_log_info = 1

slave 的master.info和relay-log.info







<二>

1,复制过滤器
让slave仅复制有限的几个数据库,而非所有;

有两种实现思路:

(1) 主服务器仅向二进制日志中记录有特定数据库相关的写操作;
问题:即时点还原将无法全面实现;

binlog_do_db= # 数据库白名单
binlog_ignore_db= # 数据库黑名单

(2)从服务器的SQL_THREAD仅在中断日志中读取特定数据相关的语句并应用在本地;
问题:会造成网络带宽和磁盘IO的浪费;

Replicate_Do_DB=
Replicate_Ignore_DB=
Replicate_Do_Table=
Replicate_Ignore_Table=
Replicate_Wild_Do_Table=
Replicate_Wild_Ignore_Table=

2,基于SSL的复制
前提:支持SSL
(1) 主服务器端配置证书和私钥,并创建一个要求必须使用SSL连接的复制账号(REQUIRE SSL);
(2) SLAV端连接master时,使用MASTER_SSL相关的选项来配置证书等信息;

3,跟复制功能相关的文件:
master.info:用于保存slave连接至master时的相关信息;
relay-log.info:保存了当前slave节点上已经复制的当前二进制日志和本地relay log日志对应关系;

4,复制的监控和维护
(1) 清理日志:PURGE

(2) 复制监控
SHOW MASTER STATUS
SHOW BINLOG EVENTS
SHOW BINARY LOGS

SHOW SLAVE STATUS

(3) 如何判断slave是否落后于master
Seconds_Behind_Master: 0

(4) 如何确定主从节点数据是否一致?
通过表自身的CHECKSUM检查
使用percona-tools中pt-table-checksum

(5) 数据不一致的修复方法:
重复复制;

本文出自 “行云流水” 博客,请务必保留此出处http://disheng.blog.51cto.com/2821957/1725670
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: