黑马程序员技术交流社区

标题: 【上海校区】mysql主从复制的原理 [打印本页]

作者: 小影姐姐    时间: 2018-5-3 10:05
标题: 【上海校区】mysql主从复制的原理
mysql主从复制的原理

1.  主从复制方案
MySQL无需借助第三方工具,而是其自带的同步复制功能,另外一点,MySQL的主从复制并不是从硬盘给上文件直接同步,而是逻辑的binlog日志同步到本地的应用执行的过程

提示:官方说主从不要超过9台,推荐不超过5台。



1) 单向主从复制,可以在主库写入数据
2) 一主多从复制,可以在主库写入数据
3) 级联复制。,可以在主库写入数据
4) 多主一从复制,可以在Master1端或Master2端进行数据写入
5) 主主复制,可以在Master1端或Master2端进行数据写入
6) 环状级联单向多主同步,任何一个点都可以写入数据

工作中单向主从复制和主主复制最常用。

2. 主从复制原理
MySQL的主从复制是一个异步的复制过程(虽然一般情况下感觉是实时的),数据将从一个Mysql数据库(我们称之为Master)复制到另一个Mysql数据库(我们称之为Slave),在Master与Slave之间实现整个主从复制的过程是由三个线程参与完成的。其中有两个线程(SQL线程和IO线程)在Slave端,另一个线程(I/O线程)在Master端。

要实现MySQL的主从复制,首先必须打开Master端的binlog记录功能,否则就无法实现。因为整个复制过程实际上就是Slave从aster端获取binlog日志,然后再在Slave上以相同顺序执行获取的binlog日志中的记录的各种SQL操作


mysql主(称master)从(称slave)复制的原理:

1) master将数据改变记录到二进制日志(binary log)中,也即是配置文件log-bin指定的文件(这些记录叫做二进制日志事件,binary log events)
2) Slave服务器的IO线程会通过master上已经授权的复制用户权限,去请求主库的binlog日志
3) Master服务器接收到来自Slave服务器的IO线程的请求后,其上负责复制的IO线程会根据Slave服务器的IO线程请求的信息,分批读取指定binlog日志文件,并指定之后位置的binlog日志信息,然后返回给Slave端的IO线程。返回的信息中除了binlog日志内容外,还有下一个指定更新位置。
4) 当Slave服务器的IO线程获取到Master服务器上IO线程发送的日志内容、日志文件及位置点后,会将binlog日志内容依次写到Slave端自身的Relay Log(即中继日志)文件的最末端,并将新的binlog文件名和位置记录到master-info文件中,以便下一次读取master端新binlog日志时能告诉Master服务器从新binlog日志的指定文件及位置开始读取新的binlog日志内容
5) Slave服务器端的SQL线程会实时检测本地Relay Log 中IO线程新增的日志内容,然后及时把Relay LOG 文件中的内容解析成sql语句,并在自身Slave服务器上按解析SQL语句的位置顺序执行应用这样sql语句,并在relay-log.info中记录当前应用中继日志的文件名和位置点

3. 注意事项
1、 主DB server和从DB server数据库的版本一致
2、 主DB server和从DB server数据库数据一致[ 这里就会可以把主的备份在从上还原,也可以直接将主的数据目录拷贝到从的相应数据目录]
3、 主DB server开启二进制日志,主DB server和从DB server的server_id都必须唯一

4. 主库配置(Linux下也类似)
在my.ini修改:
[AppleScript] 纯文本查看 复制代码
*#开启主从复制,主库的配置*

[AppleScript] 纯文本查看 复制代码
*log-bin="C:/taotao/3380/logs/mysql-bin"*

[AppleScript] 纯文本查看 复制代码
*#指定同步的数据库,如果不指定则同步全部数据库*

[AppleScript] 纯文本查看 复制代码
*binlog-do-db=taotao*


5. 主库创建同步用户
[AppleScript] 纯文本查看 复制代码
#授权用户slave01使用123456密码登录mysql
    grantreplication slave on *.* to 'slave01'@'127.0.0.1' identified by '123456';
    flushprivileges;
    重新启动主mysql服务,执行SQL语句查询状态:
    *SHOW MASTER STATUS


需要记录下Position值,需要在从库中设置同步起始值。

6. 从库配置
在my.ini修改:
#指定serverid,只要不重复即可,从库也只有这一个配置,
[AppleScript] 纯文本查看 复制代码
执行SQL:
    CHANGE MASTER TO
    master_host = '127.0.0.1',
    master_port = 3380,*
    master_user = 'slave01',
    master_password = '123456',
    master_log_file = 'mysql-bin.000003',
    master_log_pos = 120

master_port:主库的ip地址
master_port:主库的端口
master_user:用户名
master_password:密码
master_log_file:上节中主库查询的file项对应的值
master_log_pos:上节中主库查询的position的值

  
[AppleScript] 纯文本查看 复制代码
  *#启动slave同步*
    START SLAVE;
    *#查看同步状态*
    SHOW SLAVE STATUS;


如果这两项为No或者Connection,均说明安装失败。

7. 主从设置失败解决


如何定位问题?
查看3381的日志:

问题:

如何设置Mysql的UUID?


重新启动mysql服务。

问题解决:








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2