码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2015-12-17 16:19:20      阅读:425      评论:0      收藏:0      [点我收藏+]

标签:mysql mariadb 主从复制

   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

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

标签:mysql mariadb 主从复制

原文地址:http://disheng.blog.51cto.com/2821957/1725670

(0)
(3)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!