首页 > 代码库 > MySQL的复制原理详解以及基础配置

MySQL的复制原理详解以及基础配置

MySQL 的日志类型

二进制日志,事务日志,错误日志,一般查询日志,中继日志,慢查询日志


二进制日志有以下内容

    数据目录,一般放置在mysql-bin.XXXXX编号)

    滚动:达到一个最大上限,flush logs,服务器重启

    格式:statement

              row

              mixed

    mysql-bin.index:二进制日志文件索引文件

    mysql > SHOW MASTER STATUS查看主服务器的状态

    mysql > SHOW BINARY LOGS 查看二进制日志

    mysql > SHOW BINLOG  EVENTS IN ‘file‘查看二进制日志中的事件


    event中比较重要的选项:

          timestamp时间戳

          position,offset,operation,server-id


MySQL的隔离级别:

    READ-UNCOMMITED

    READ-COMMITED

            如果使用mixed可能会发生数据不一致的情况

            官方推荐使用row 的方法

    REPEATABLE-READ

    SERIALIZABLE



复制实现的功能

  1. 实现数据备份

  2. 如果有从服务器,主服务器发生故障之后,开通从服务器的写入功能,从而提供高可用的使用功能

  3. 异地容灾

  4. 分摊负载(scale out )主服务器:写      从服务器:读


复制方法有三种,分别是主从复制,半同步复制以及主主复制


首先介绍主从复制(使用较频繁)


在主服务器上,前端用户每次执行一次数据库发生修改或者引起修改的指令,都会在二进制日志中保存为一个事件,每保存一个事件,都会通过MySQL的3306端口发送给另外一个服务器,另外一台服务器将这个日志接收下来,然后先保存在本地的日志文件中,然后每次读取一个操作,然后将每一次修改执行到自己服务器上,这个过程叫做MySQL 的复制


master上存在一个二进制文件Binary log

slave 从主服务器上二进制文件复制而成的文件,叫做中继日志(relay log)

在主服务器上当有多个事务并发执行的时候,但是在写入二进制文件中的时候只能一条一条写,因此就需要一个暂时缓存的日志文件进行缓存,接着再向二进制文件中写入


其中在复制方法上同时又有同步复制以及异步复制的区分:


同步复制

从服务器不能比主服务器慢,前端发生的修改不能及时的得到slave 的响应

因此基本上是使用半同步复制的方法

半同步复制只是将数据同步发送给另一个节点,只能保证近的节点能够及时的响应


异步复制:一主多从,等待每一个服务器都同步完成的时候,


在多台从服务器进行复制的时候,可能会因为请求过多,主服务器难以有效的处理,因此就需要一个前端代理。

读写分离(rw-splitting):找一个MySQL的前端代理,工作在应用层,能够理解MySQL的语句,能够完成将不同的操作(读 写)定向到不同的服务器,分别分发给主服务器和从服务器,从而完成读写分离


多级复制:一个从服务器可能是一个主服务器的从服务器,也可能是另一个从服务器的从服务器

如果一个从服务器不记录中继日志,则不能将内容发送给下一级服务器,从服务器上不能进行写操作


接下来介绍双主模型


双主模型的时候,配置几乎一样,但是要很注意server-id的重要性,防止出现复制环路的产生

无法实现减轻写操作,很容易出问题


例如

tutors:name,age,gender,tid

tom 10

jerry 30

A主机:UPDATE tutords SET  name=jerry

B主机:UPDATE tutors SET age=30 WHERE name=tom

在最终的完成同步的时候,查询出来的结果并不认能够合并,会产生冲突


所以在生产环境中,一般不建议使用双主模型



读写分离可以由下面的组件实现:

mysql-proxy

amoeba


数据拆分之后实现路由:

cobar


补充:

master :slave 

    1-->N

slave :master

    1-->N X 

一个从服务器只能属于一个主服务器


MySQL 5.5之前的复制实现非常简单,

MySQL 5.6之后引用了 gtid,multi-thread replication(多线程复制)


配置MySQL复制基本步骤


主从复制

 一.master

             启用二进制日志

             log-bin=master-bin

             log-bi-index =master-bin.index

    1.  选择一个唯一的server-id

      server-id ={0-2^32}

    2. 创建具有复制权限的用户

            REPLICATION SLAVE

            REPLICATION CLIENT


二.slave

1.启用中继日志

relay-log =relay-log     

log-bin-index=

2.选择一个唯一的server-id 

            server-id ={0-2^32}

3.连接至主服务器,并开始复制数据

   mysql > CHANGER MASTER TO MASTER_HOST= ‘ ‘,MASTER_PORT= ‘ ‘,MASTER_LOG_FILE=‘ ‘,MASTER_LOG_FILE_POS=‘ ‘,MASTER_USER=‘ ‘ ,MASTER_PASSWORD=‘ ‘;

mysql >START SLAVE

mysql>START SLAVE SQL_Thread  开启SQL线程

mysql>START SLAVE IO_Thread开启IO线程


复制线程:

master:dump

slave :IO_Thread,SQL_Thread


read_only=YES

在从服务器上设定,对具有SUPER权限的用户不生效


sync-binlog = ON 

在主服务器上设定,用于事务安全


半同步复制

在master 和slave 上各自安装一个google提供的插件

主服务器上


mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;

mysql>SET GLOBAL rpl_semi_sync_master_enabled=1;

mysql>SET GLOBAL rpl_semi_syc_master_timeout=1000;


从服务器上

mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so‘;

mysql>SET GLOBAL rpl_semi_sync_slave_enables =1;

mysql_STOP SLAVE IO_Thread;START SLAVE IO_Thread;


双主复制

  1. 在两台服务器上各自建立一个具有复制权限的用户

  2. 修改配置文件

主服务器上

server-id =10

log-bin =mysql-bin

relay -log=relay -mysql

relay-log -index =relay -mysql.index

auto-increment-incremeng =2

auto-increment-offset =1


从服务器上

server-id=20

log-bin=mysql=bin

relay-log=relay-mysql

relay-log-index=relay-mysql.index

auto-increment-increment=2

auto-increment-offset =2


3.如果此时两台服务器均为新建立,且无其他写入操作,各服务器之需记录当前自己的二进制文件以及事件位置,以之作为另一台服务器复制起始位置即可


4.各服务器接下来指定对另一台服务器为自己的主服务器即可


A主机必须查看B的二进制文件及位置,并以之作为自己的复制起点

B主机必须查看A的二进制文件及位置,并以之作为自己的复制起点

两个服务器都能进行读写,即为双主模型









本文出自 “牛顿也吃苹果” 博客,请务必保留此出处http://mi55u.blog.51cto.com/11619321/1926833

MySQL的复制原理详解以及基础配置