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,复制过滤器
让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
原文地址:http://disheng.blog.51cto.com/2821957/1725670