简介
主从复制是利用MySQL复制机制将数据复制到另外一台或多台MySQL服务器上,被复制的服务器称为主服务器,复制的服务器称为从服务器。一般是一主多从。主从复制的好处主要是数据备份、负载均衡(读写分离)、高可用等。
中继日志
中继日志应用于主从复制中,从服务器在收到主服务器修改事件时将事件写入到中继日志文件中,中继日志就像一个队列,事件在里面排队等待从服务器接收。和二进制日志索引文件一样,还有一个中继日志索引文件,索引文件列出所有中继日志文件,此文件是文本的因此可以直接查看,文件的最后一行就是当前正在使用的中继日志文件。
中继日志文件默认的基本名是HOSTNAME-relay-bin,基本文件名加上一组顺序编号000001、000002...就是中继日志文件名了,例如localhost-relay-bin.000001。每次启动服务器、执行刷新日志命令(flush logs)以及中继日志文件到达最大长度的时候,服务器会按顺序号生成下一个中继日志文件,参数max_relay_log_size决定了中继日志最大长度。中继日志索引文件名默认是中继日志基本文件名加上.index。参数relay_log、relay_log_index可以修改中继日志和中继日志索引文件名。
工作原理
在复制关系形成的时候,要复制的数据库的状态和数据在主从服务器上必须完全一致,此后主服务器的数据修改才会被正确的复制到从服务器上。二进制日志负责在主从服务器间传递数据,因此主服务器必须开启二进制日志功能。每个从服务器都必须具备连接到主服务器并请求数据复制的权限,从服务器会告诉主服务器上次连接时已经复制到二进制日志的什么位置,主服务器从上次复制结束的位置开始传输数据给从服务器,当从服务器复制完成所有数据后,会进入等待状态。当主服务器再次发生数据修改时会继续记录到二进制日志中以便向从服务器传输。每一个从服务器的连接也会占用主服务器的max_connections参数配置的最大连接数。
半同步复制
一般主从复制是异步的,主服务器在执行完客户端提交的请求后会立即将结果返回给客户端,并不关心从主服务器是否已经接收并处理。异步复制会导致主服务器和从服务器可能有短时间的数据不一致。通常这个时间是由网络和系统等决定的。如果出现不一致,而同时主服务器又宕机,这时从服务器中的数据就是不完整的,于是便有了半同步复制。
半同步复制是主服务器在执行完客户端提交的请求后不是立刻返回给客户端,而是等待至少一个从服务器接收到并写到中继日志中才返回给客户端。优点是主从数据一致,缺点是主库的请求延迟增加,吞吐量会降低,这个延迟最少是一个TCP/IP往返的时间。所以半同步复制最好在低延时的网络中使用。MySQL以插件的形式支持半同步复制。
并行复制
主从复制,有三种线程参与:Binlog Dump(主)、I/O线程 (从)、SQL Thread(从)。
MySQL5.6之前,从服务器只有两条线程,I/O线程负责接收主服务器的修改事件并把它们写入到中继日志,SQL线程负责读取中继日志的事件并执行它们,在处理完每个中继日志后删除它。这两个线程互不干扰。即使从服务器的多个数据库的数据还原也是只有一个SQL线程。
MySQL从5.6开始,I/O线程和SQL线程变成了coordinator线程和worker线程,coordinator线程包含I/O和SQL线程的功能,worker线程类似SQL线程。coordinator线程会判断是否允许并行,如果不允许则自己执行数据还原,如果允许则分发给多个worker线程并行还原。但是5.6的并行复制是针对多个数据库的,即每个数据库一个worker线程,这样假设只有一个数据库需要复制,那么就无法并行还原了。
MySQL5.7开始,可以称为真正的并行复制。5.7引入了参数slave-parallel-type,可选值有DATABASE(默认值,基于库的并行复制方式)和LOGICAL_CLOCK(基于组提交的并行复制方式)。参数slave_parallel_workers设置并行执行的worker线程数。在从服务器上配置slave-parallel-type=LOGICAL_CLOCK且slave_parallel_workers大于1就可以开启并行复制了。
并行复制可以大幅度降低主从延迟。但并不是slave_parallel_workers越大越好,slave_parallel_workers过大和过小,都可能带来负面性能影响,比如引起coordinator线程的判断、分发等开销增加。因此需要因地制宜。
server_id必须是唯一的,值在1到2^32-1之间。
master-info-repository参数值决定从服务器如何存储主服务器相关的复制状态。master-info-repository=file时,会在从服务器data目录下生成master.info 文件,如果master-info-repository=table,信息就会存在从服务器的mysql.slave_master_info表中。不要移动或者编辑相关的文件和表,想要更改配置通过再次执行change master to 语句,变更会自动保存到相关的文件和表。
relay_log_info_repository参数决定如何存储从服务器相关的复制状态,relay_log_info_repository=file时,会在从服务器data目录下生成 relay-log.info,relay_log_info_repository=table会将信息保存在mysql.slave_relay_log_info表中。
relay_log_recovery表示当中继日志损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的中继日志,并且重新从主服务器上获取,这样就保证了中继日志的完整性。默认未开启。
replicate_ignore_db参数可以将不复制的默认数据库排除在外,replicate_do_db恰恰相反,它是只复制指定的默认数据库。默认数据库就是use参数指定的数据库。因此这两个参数跨库会有问题,比如replicate_ignore_db=db1或者replicate_do_db=db2,先use db1,再update db2.table1...,那么update db2.table1...会被忽略。
skip-slave-start能防止复制进程随着从服务器的启动而启动。
配置
主服务器配置
[mysqld]
server_id=1
log_bin
从服务器配置
[mysqld]
server_id=2
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=8
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON
replicate_do_db=db1
replicate_do_db=db2
skip-slave-start
在主服务器上创建拥有复制权限的用户
CREATE USER 'slave1'@'192.168.22.133' IDENTIFIED BY 'slave1'
GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'192.168.22.133'
查看主服务器的二进制日志文件名和下一次复制起始位置
FLUSH TABLES;
SHOW MASTER STATUS;
File Position
localhost-bin.000001 297
首先手动将主数据库的数据库传输到从数据库,要保证开启主从复制时,要复制的数据库的状态和数据在主从服务器上必须完全一致。可以利用mysqldump,假设要同步的数据库有2个,分别是db1和db2,主服务器ip为192.168.22.1,从数据库ip为192.168.22.133,端口是3306,执行以下命令将db1和db2传输到从服务器,mysqldump -h 192.168.22.1 -u root -p --databases db1 | mysql -h 192.168.22.133 -u root -p。当然也可以利用其他备份方式。
在从服务器上设置主服务器连接和复制信息
CHANGE MASTER TO
-- 主服务器ip
MASTER_HOST = '192.168.22.1',
-- 主服务器端口
MASTER_PORT = 3306,
-- 主服务器拥有复制权限的用户
MASTER_USER = 'slave1',
-- 用户密码
MASTER_PASSWORD = 'slave1',
-- 主服务器二进制日志文件名
MASTER_LOG_FILE = 'localhost-bin.000001',
-- 主服务器二进制日志下一次复制起始位置
MASTER_LOG_POS = 297;
从服务器启动复制程序
START SLAVE;
从服务器关闭复制程序
STOP SLAVE;
查看从服务器状态
SHOW PROCESSLIST;
SHOW SLAVE STATUS;
删除从服务器
stop slave;
reset slave all;
- MySQL数据的主从复制、半同步复制和主主复制详解
一.MySQL复制概述 ⑴.MySQL数据的复制的基本介绍 目前MySQL数据库已经占去数据库市场上很大的份额,其一是由于MySQL数据的开源性和高性能,当然还有重要的一条就是免费~不过不知道还能免费 ...
- MySQL数据的主从复制、半同步复制和主主复制详解-转
一.MySQL复制概述 ⑴.MySQL数据的复制的基本介绍 目前MySQL数据库已经占去数据库市场上很大的份额,其一是由于MySQL数据的开源性和高性能,当然还有重要的一条就是免费~不过不知道还能免费 ...
- Mysql的ssl主从复制+半同步主从复制
Mysql的ssl主从复制+半同步主从复制 准备工作 1.主从服务器时间同步 [root@localhost ~]# crontab -e */30 * * * * /usr/sbin/ntpdate ...
- Mysql高级之主从复制
原文:Mysql高级之主从复制 主从复制不就是多台服务器嘛!,一个改变另一个也改变啦,内容其实都一样! 原理: 对数据库进行操作会生成一个文件,binlog(二进制文件),从服务器配置relaylog ...
- 003.MySQL高可用主从复制新增slave
一 基础环境 主机名 系统版本 MySQL版本 主机IP master CentOS 6.8 MySQL 5.6 172.24.8.10 slave01 CentOS 6.8 MySQL 5.6 17 ...
- MySQL 5.7主从复制从零开始设置及全面详解——实现多线程并行同步,解决主从复制延迟问题!
MySQL 5.7主从复制从零开始设置及全面详解——实现多线程并行同步,解决主从复制延迟问题!2017年06月15日 19:59:44 蓝色-鸢尾 阅读数:2062版权声明:本文为博主原创文章,如需转 ...
- 高可用Mysql架构_Mysql主从复制、Mysql双主热备、Mysql双主双从、Mysql读写分离(Mycat中间件)、Mysql分库分表架构(Mycat中间件)的演变
[Mysql主从复制]解决的问题数据分布:比如一共150台机器,分别往电信.网通.移动各放50台,这样无论在哪个网络访问都很快.其次按照地域,比如国内国外,北方南方,这样地域性访问解决了.负载均衡:M ...
- 为什么mysql要做主从复制?
为什么MySQL要做主从复制(读写分离)? 通俗来讲,如果对数据库的读和写都在同一个数据库服务器中操作,业务系统性能会降低. 为了提升业务系统性能,优化用户体验,可以通过做主从复制(读写分离)来减轻主 ...
- MySQL 5.5 主从复制
MySQL 5.5 主从复制的原理.过程 分为同步复制和异步复制,实际复制架构中大部分为异步复制.复制的基本过程如下: 1).Slave上面的IO进程连接上Master,并请求从指定日志文件的指 ...
- maria(mysql)的主从复制
一.mariadb的基本操作 1.远程连接 mysql -uroot -p -h 127.0.0.1 mysql -uroot -p -h 192.168.226.128 2.赋予远程连接的权限 gr ...
随机推荐
- 力扣Leetcode 3. 无重复字符的最长子串
无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串 ...
- 07.初步学习redis哨兵机制
[ ] 一.哨兵(sentinal)的介绍 哨兵是redis集群架构中非常重要的一个组件,主要功能如下: 集群监控,负责监控redis master和slave进程是否正常工作 消息通知,如果某个re ...
- 手把手教你 在Pytorch框架上部署和测试 关键点人脸检测项目DBFace,成功实现人脸检测效果
这期教向大家介绍仅仅 1.3M 的轻量级高精度的关键点人脸检测模型DBFace,并手把手教你如何在自己的电脑端进行部署和测试运行,运行时bug解决. 01. 前言 前段时间DBFace人脸检测库横空出 ...
- 最详细不过的CUDA的下载安装使用、环境变量配置,有这一篇就够了
在上一期中,我们介绍了为什么使用GPU可以加速计算和处理图像,以及查看自己的电脑能否使用GPU加速,不知道的可以去看上一期文章,这期我们正式的来下载与安装GPU加速工具CUDA,并检查是否安装成功. ...
- C++11中一个使用for+auto时容易发生的bug
C++11中一个使用for+auto时容易发生的bug 一个小坑,那就是忘记在for循环中使用auto时加引用. 例如: for(auto num : nums){ // do some thing ...
- 沉珂日重的Java项目 Spring真的帮到我们了吗?
开局三连图. 这是刚开始时的程序结构,虽清晰已经有混乱的前兆. 业务增加,人员增加后就会沉珂日重. 几年后,最后的模样会让使用者和维护者都很无奈. 人们喜欢把Java程序的层次结构比作建筑,实际却最像 ...
- linux 增加新用户无法使用sudo命令解决办法
昨天一不小心把自己的系统搞崩了,也没有快照,没法进行还原操作,所以只能重装系统解决了,装完系统以后一切正常,当我新增了一个用户,使用sudo命令切换到root用户时,发现怎么都切换不过去,经过百度发现 ...
- leetcode刷题-74搜索二维矩阵
题目 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列.每行的第一个整数大于前一行的最后一个整数.示例 1: 输入:matrix ...
- jzoj 3431. 【GDOI2014模拟】网格
Description 某城市的街道呈网格状,左下角坐标为A(0, 0),右上角坐标为B(n, m),其中n >= m.现在从A(0, 0)点出发,只能沿着街道向正右方或者正上方行走,且不能经过 ...
- [转载] 微软发布 SURFACE DUO ANDROID SDK 和模拟器
模拟器截图 微软今天发布了双屏折叠设备 Surface Duo Android 开发工具(SDK 和模拟器),Windows 10X 开发工具和模拟器之后 2 月 11 日发布,并宣布了新的针对双屏体 ...