mysql主从复制维护_MySQL主从复制详解
一、MySQL 主从复制原理
1、简介
MySql自带有主从复制功能,该功能是构建大型应用、高性能应用的基础。这种机制是指:将某一台主机(master)上的MySQL数据复制到多台其他主机上(slave),并重新执行一遍来实现。复制过程中一个Mysql实例充当主库(master),其他Mysql实例充当分库(slave)。
2、复制架构图
主库将更新写入binlog(二进制日志),并维护文件的一个索引以跟踪日志循环。如图:
从库生成两个线程,一个I/O线程,一个SQL线程。I/O线程去请求主库的binlog, 并将得到的binlog日志写到relay log(中继日志)文件中;
主库会生成一个log dump线程,用来给从库I/O线程传binlog;SQL线程会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致。
3、MySQL支持的复制类型
3.1 基于语句的复制。在主服务器上执行的 SQL 语句,在从服务器上执行同样的语句。配置:binlog_format = 'STATEMENT';
3.2 基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍,从 MySQL 5.0开始支持。配置: binlog_format = 'ROW';
3.3 混合类型的复制。默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。配置:binlog_format = 'MIXED';
4、解决的问题
数据分布
负载平衡
备份
高可用性和容错行
5、复制的常用拓扑结构
复制的拓扑结构有以下一些基本原则:
1> 每个Slave只能有一个Master
2>每个Slave只能有一个唯一的服务器ID
3>每个Master可以有很多Slave
4>如果设置了log_slave_updates,Slave可以是其他Slave的Master,从而扩散Master的更新。
MySQL不支持多主服务器复制,即一个Slave可以有多个Master。
常用拓扑结构:
5.1 一主多复制架构
由一个Master和多个Slave组成复制系统,Slave之间不通信。
在实际场景中,MySQL复制大部分都是一主多复制这种架构。在Master读取请求压力非常大的场景下,把大量对实时性要求不是特别高的读取通过负载均衡到多个从Slave上,降低主库的读取压力。在Master宕机时,可以把一个Slave切换为主库继续提供服务。
问题建议:
1> 当Slave增加到一定数量时,Slave对Master的负载及网络带宽会成为一个严重的问题。
2> 不同的Slave扮演不同的角色(例如使用不同的索引,或者不同的存储引擎)。
3> 用一个Slave作为备用Master,只进行复制。
4> 用一个远程Slave,用于灾难恢复。
5.2 多级复制架构
一主多从的架构能够解决大部分请求压力特别大的场景需求,但随着从库的增加,会影响到Master的I/O和网络压力,而使用多级复制架构就可以解决一主多从的这个问题。但同时要注意的是,多级复制场景下主库的数据是经历了多次才到达Salve,期间的延时也会比一主多从的复制要大。
问题建议:
1> 会根据层级的多少增加复制的延时。
2> 这种方案可以与第三方软件结合使用,如:Slave + LVS + Keepalived实现高可用
5.3 双主复制/Dual Master架构
如果写压力比较大,或者DBA做维护需要主从切换,通过双主复制/Dual Master架构可以避免重复搭主从库的麻烦。
问题建议:
1> 最大的问题就是更新冲突
2> 可以采用MySQL Cluster,以及将Cluster和Replication结合起来,可以建立强大的高性能数据平台。
二、MySQL主从配置
1、基础环境配置
数据库版本:mysql 5.1.73(Slave版本 >= Master版本)
IP地址:192.168.1.100 (Master)、192.168.1.101(Slave)
2、Master服务器配置
2.1(关掉新主库的只读属性)
mysql>set global read_only=0;
mysql>flush privileges;
2.2 开启读写属性
mysql>set global read_only=1;
mysql>flush privileges;
2.3 基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍,从 MySQL 5.0开始支持
mysql> SET SESSION binlog_format = 'ROW';
mysql> SET GLOBAL binlog_format = 'ROW';
2.4 在 Master 的数据库中建立一个复制账户,每个 Slave 使用该账户连接 Master 进行复制,需要 replication slave 和 replication client 权限,Master 的连接信息会存储在文本文件 master.info 文件中。(master.info文件在 Slave 的数据目录中)
说明:创建了一个用户名为 replication 的用户,密码为 123456 ,只允许在 192.168.1.101 这个 Slave 上登录。
mysql>grant replication slave on replication clinet on *.* to 'replication'@'192.168.1.101(slave IP)' identified by '123456';
mysql>flush privileges;
2.5 修改Master MySQL的数据库配置文件,默认是/etc/my.cnf
# 开启二进制日志,并指定文件所在目录,并在服务器上创建目录和授权
log-bin=/var/log/mysql/master-bin
#增加配置
binlog_format=mixed
2.6 取消server-id注释,不能和Slave一致
server-id = 1
2.7 在[mysqld]下面添加
binlog-do-db=db_test #要同步的数据库,如果有多个,则需要多写几行。
binlog-ignore-db=db_ignore_test #不需要同步的数据库,如果多个,则需要多写几行。
2.8 重启MySQL服务
2.9 查看Master状态
show master status;
File字段和Position字段要注意,在配置Slave时,需要指定相关值。
File
Position
Binlog_Do_DB
Binlog_Ignore_DB
master-bin.000208
1562
db_test
db_ignore_test
3、Slave服务器配置
3.1 取消server-id注释,不能和Slave一致
server-id = 101
3.2 添加中继日志,创建日志目录,授权
relay-log=/var/log/mysql
3.3 重启mysql服务
3.4 查看中继日志状态
mysql>show globalvariables like '%relay%';
3.5 连接Master服务器
mysql>change master to master_host='192.168.1.100',master_user='replication',master_password='123456',master_log_file='master-bin.000208',master_log_pos=1562;
选项:
master_host:Master 服务器IP
master_user:Master 服务器授权用户,也就是 Master 前面创建的那个用户
master_password:Master 服务器授权用户对应的密码
master_log_file:Master binlog 文件名,对应查询Master服务器状态时,File字段
master_log_pos:Master binlog 文件中的 Postion 值,对应查询Master服务器状态时,Position字段
更多的选项可以看:http://dev.mysql.com/doc/refman/5.7/en/change-master-to.html
#其中master_log_file、master_log_pos和File、Position不对应会提示1263错误,如:Slave I/O: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file', Internal MariaDB error code: 1236
解决方案是:在Master服务器上,查看Master状态,根据查看结果中的File字段和Position字段。在Slave中执行,
stop slave;
change master to master_log_file='master-bin.000208',master_log_pos=1562;
start slave;
3.6 查看主从状态
show slave status;
如果Last_SQL_Error没有错误提示以及Slave中的Exec_Master_Log_Pos值和Master中的show master status中的Position值一样,这样的话,MySQL主从复制应该是成功的。
4、测试
在Master数据库中执行sql语句操作,观察Slave是否同步,如果同步则说明配置成功。
5、注意
1> 主库和从库数据库名称必须相同
2> 主库和从库的复制可以精确到表,但是在需要改主库或者从库的数据库结构时需要立刻重启slave
3> 不能在MySQL配置文件里直接写入master的配置信息,需要用change master命令来完成。
4> 指定replicate_do_db必须在my.cnf里配置,不能用change master命令来完成;
5> 如果不及时清理,日积月累二进制日志文件可能会把磁盘空间占满,可以在配置文件里加上expire_logs_days=7,只保留最近7天的日志,建议当slave不再使用时,通过reset slave来取消relaylog;
6>写一个监控脚本,用来监控 Slave 中的两个"yes",如果只有一个"yes"或者零个,就表明主从有问题
收集的几个相关知识文章:
http://hzcsky.blog.51cto.com/1560073/479476/
http://storysky.blog.51cto.com/628458/259280
http://outofmemory.cn/code-snippet/3177/mysql-zhucong-library-clock-error-%EF%BC%9A-1062-Error-Duplicate-entry-1438019-for-key-PRIMARY-on-quer
http://www.lookingss.org/index.php/archives/3.html
http://369258.blog.51cto.com/359258/1345239
http://www.cnblogs.com/gomysql/p/3662264.html
http://tiany.blog.51cto.com/513694/173526
http://www.cnblogs.com/chenpingzhao/p/5060874.html
mysql主从复制维护_MySQL主从复制详解相关推荐
- mysql 流复制_MySQL系列详解六:MySQL主从复制/半同步演示-技术流ken
前言 随着技术的发展,在实际的生产环境中,由单台MySQL数据库服务器不能满足实际的需求.此时数据库集群就很好的解决了这个问题了.采用MySQL分布式集群,能够搭建一个高并发.负载均衡的集群服务器.在 ...
- mysql 实例复制_MySQL 复制详解及简单实例
MySQL 复制详解及简单实例 主从复制技术在MySQL中被广泛使用,主要用于同步一台服务器上的数据至多台从服务器,可以用于实现负载均衡,高可用和故障切换,以及提供备份等等.MySQL支持多种不同的复 ...
- mysql status改变_mysql 配置详解mysql SHOW STATUS 详解
1. back_log 指定MySQL可能的连接数量.当MySQL主线程在很短的时间内得到非常多的连接请求,该参数就起作用,之后主线程花些时间(尽管很短)检查连接并且启动一个新线程. back_log ...
- mysql配置文件说明_mysql配置文件详解说明
mysql配置文件http://www.doczj.com/doc/ef8ad6026c175f0e7cd1371f.htmlf详解说明 MySQL配置文件http://www.doczj.com/d ...
- mysql怎么约束_MySQL 约束详解
MySQL 约束详解 MySQL 中的约束是用来保证数据的完整性的机制.数据完整性一般有以下三种形式: 实体完整性:保证表中有一个主键. 域完整性:保证数据每列的值满足特定条件. 引用完整性:保证两张 ...
- mysql 执行时间 配置文件_mysql配置文件详解
[client] user = root host = localhost password = password [mysqld] federated #开启Federated存储引擎 ###### ...
- mysql字符集解释_MySQL字符集详解
一.MySQL字符集编码简单介绍 在使用MySQL时要注意6个需要编码的地方:系统的编码.客户端.服务端.库.表.列.字符集编码不仅影响数据存储,还影响client程序和数据库之间的交互.在mysql ...
- mysql 连接字符集_MySQL字符集详解
一.MySQL字符集编码简单介绍 在使用MySQL时要注意6个需要编码的地方:系统的编码.客户端.服务端.库.表.列.字符集编码不仅影响数据存储,还影响client程序和数据库之间的交互.在mysql ...
- mysql 负数类型_MySQL数据类型详解
MySQL数据类型,可以被分为3类:数值类型.日期和时间类型以及字符串(字符)类型 方括号("["和"]")指出可选的类型修饰符的部分 M 指出最大的显示尺寸. ...
最新文章
- 微软职位内部推荐-Sr. SW Engineer for Privacy Id
- STL之nth_element__寻找第n大的元素
- 02.Teams组成概述及使用分享
- 对Lucene PhraseQuery的slop的理解
- DenseNet——CNN经典网络模型详解(pytorch实现)
- stable_partition http://www.cplusplus.com/reference/algorithm/stable_partition/
- [设计模式-行为型]备忘录模式(Memento)
- 展厅智能中央控制服务器,可视化展馆智能中控-智能中央控制系统
- Twitter数据抓取的方法(二)
- Quartz时间配置(周期任务)
- mysql数据库wait_timeout_mysql设置wait_timeout详解
- 轮播图背景图铺满整个div
- 全民小镇ios越狱用户叉叉助手辅助刷金币攻略
- 16位算术逻辑运算实验
- debian修改键盘布局
- 计算机表格斜杠怎么打,如何在excel表格中绘制斜线并上下打字
- 测试人,测试魂,3年测遍32个城,主管的一句话给予了他源源不断的动力
- 三次方程求根公式例子二
- 比特大陆的“新筹码”:IPO失效后,押注算力芯片
- 瑞萨 RA MCU 基础知识
热门文章
- python诞生的时间地点人物事件_教程|计算任意视频中各人物的出镜时间(附Python实现)...
- 世界上最快的计算机每秒,世界上计算机最快的是每秒12.54亿美元
- C语言:虚拟驱动安装VS2010学习版
- WebApi后端框架Token身份认证,Api接口Token验证
- java 异或加密 c语言解密,java对文件简单的加密解密(异或运算)
- 6大行数字人民币推送子钱包扩大使用范围
- linux下刻录光盘读取不了_Linux下如何把镜像文件刻录到DVD光盘里
- 初识Java SE基础
- 帆软,FineReport
- 论坛社区项目复习,自用