(转)MySQL 主从复制搭建,基于日志(binlog
原文:http://blog.jobbole.com/110934/
什么是MySQL主从复制
简单来说,就是保证主SQL(Master)和从SQL(Slave)的数据是一致性的,向Master插入数据后,Slave会自动从Master把修改的数据同步过来(有一定的延迟),通过这种方式来保证数据的一致性,就是主从复制。
MySQL主从能解决什么问题
一、高可用
因为数据都是相同的,所以当Master挂掉后,可以指定一台Slave充当Master继续保证服务运行,因为数据是一致性的(如果当插入Master就挂掉,可能不一致,因为同步也需要时间),当然这种配置不是简单的把一台Slave充当Master,毕竟还要考虑后续的Salve同步Master,当然本文并不是将高可用的配置,所以这里就不多讲了。
二、负载均衡
因为读写分离也算是负载均衡的一种,所以就不单独写了,因为一般都是有多台Slave的,所以可以将读操作指定到Slave服务器上(需要代码控制),然后再用负载均衡来选择那台Slave来提供服务,同时也可以吧一些大量计算的查询指定到某台Slave,这样就不会影响Master的写入以及其他查询
三、数据备份
一般我们都会做数据备份,可能是写定时任务,一些特殊行业可能还需要手动备份,有些行业要求备份和原数据不能在同一个地方,所以主从就能很好的解决这个问题,不仅备份及时,而且还可以多地备份,保证数据的安全
四、业务模块化
可以一个业务模块读取一个Slave,再针对不同的业务场景进行数据库的索引创建和根据业务选择MySQL存储引擎
五、高扩展(硬件扩展)
主从复制支持2种扩展方式
1、scale-up
向上扩展或者纵向扩展,主要是提供比现在服务器更好性能的服务器,比如增加CPU和内存以及磁盘阵列等,因为有多台服务器,所以可扩展性比单台更大
2、scale-out
向外扩展或者横向扩展,是指增加服务器数量的扩展,这样主要能分散各个服务器的压力
主从复制的缺点
一、成本增加
无可厚非的是搭建主从肯定会增加成本,毕竟一台服务器和两台服务器的成本完全不同,另外由于主从必须要开启二进制日志,所以也会造成额外的性能消耗
二、数据延迟
Slave从Master复制过来肯定是会有一定的数据延迟的,所以当刚插入就出现查询的情况,可能查询不出来,当然如果是插入者自己查询,那么可以直接从Master中查询出来,当然这个也是需要用代码来控制的
三、写入更慢
主从复制主要是针对读远大于写或者对数据备份实时性要求较高的系统中,因为Master在写中需要更多操作,而且只有一台写入的Master(因为我目前只会配置一台写入Master,最多就是有从Master的Slave,用来在Master挂掉后替换成Master,平时不对外进行服务),所以写入的压力并不能被分散,当然如果直接怎么解决这个问题的话,欢迎留言指教
复制方式
MySQL5.6开始主从复制有两种方式:基于日志(binlog)、基于GTID(全局事务标示符)。
本文只涉及基于日志binlog的主从配置
复制原理
1、Master将数据改变记录到二进制日志(binary log)中,也就是配置文件log-bin指定的文件,这些记录叫做二进制日志事件(binary log events)
2、Slave通过I/O线程读取Master中的binary log events并写入到它的中继日志(relay log)
3、Slave重做中继日志中的事件,把中继日志中的事件信息一条一条的在本地执行一次,完成数据在本地的存储,从而实现将改变反映到它自己的数据(数据重放)
要求
1、主从服务器操作系统版本和位数一致
2、Master和Slave数据库的版本要一致
3、Master和Slave数据库中的数据要一致
4、Master开启二进制日志,Master和Slave的server_id在局域网内必须唯一
具体配置
硬件需求
两台或两台以上安装了相同版本的MySQL(我没有试过不同版本会不会有问题,有兴趣的可以试试),当然这个可以用虚拟机或者Docker代替,个人推荐用Docker,比虚拟机消耗少太多了,当然用起来可能没有虚拟机那么方便,但是却不用挨个环境配置了
配置Master
一、安装数据库
二、配置my.cnf
不同的系统my.cnf路径不同,所以我们只讲解牵扯修改的地方。添加配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
[mysqld]
## 设置server_id,一般设置为IP,注意要唯一
server_id=100
## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
## 开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)
log-bin=edu-mysql-bin
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
|
配置完成后重启mysql
关于复制过滤
复制过滤可以让你只复制服务器中的一部分数据,有两种复制过滤:
1、在Master上过滤二进制日志中的事件
2、在Slave上过滤中继日志中的事件。
复制类型
1、基于语句的复制
在Master上执行的SQL语句,在Slave上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。一旦发现没法精确复制时,会自动选着基于行的复制
2、基于行的复制
把改变的内容复制到Slave,而不是把命令在Slave上执行一遍。从MySQL5.0开始支持
3、混合类型的复制
默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制
三、创建数据同步用户
1
2
3
|
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
|
这里主要是要授予用户REPLICATION SLAVE权限和REPLICATION CLIENT权限
配置Slave
一、安装数据库
二、配置my.cnf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
[mysqld]
## 设置server_id,一般设置为IP,注意要唯一
server_id=101
## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=edu-mysql-slave1-bin
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## 防止改变数据(除了特殊的线程)
read_only=1
|
如果Slave为其它Slave的Master时,必须设置bin_log。配置完成后重启mysql
完成Master和Slave链接
一、初始化数据
保证Master和Slave除不同步的数据库,其他库的数据一致
二、查询Master状态
在Master中执行
1
|
show master status;
|
记录下返回结果的File列和Position列的值
三、Slave中设置Master信息
在Slave中执行
1
|
change master to master_host='192.168.1.100', master_user='slave', master_password='123456', master_port=3306, master_log_file='edu-mysql-bin.000001', master_log_pos=1389, master_connect_retry=30;
|
上面执行的命令的解释:
master_host=’192.168.1.100′ ## Master的IP地址
master_user=’slave’ ## 用于同步数据的用户(在Master中授权的用户)
master_password=’123456′ ## 同步数据用户的密码
master_port=3306 ## Master数据库服务的端口
masterlogfile=’edu-mysql-bin.000001′ ##指定Slave从哪个日志文件开始读复制数据(Master上执行命令的结果的File字段)
masterlogpos=429 ## 从哪个POSITION号开始读(Master上执行命令的结果的Position字段)
masterconnectretry=30 ##当重新建立主从连接时,如果连接建立失败,间隔多久后重试。单位为秒,默认设置为60秒,同步延迟调优参数。
四、查看主从同步状态
在Slave中执行命令
1
|
show slave status;
|
可看到SlaveIOState为空, SlaveIORunning和SlaveSQLRunning是No,表明Slave还没有开始复制过程。相反SlaveIORunning和SlaveSQLRunning是Yes表明已经开始工作了
五、开启主从同步
在Slave中执行命令
1
|
start slave;
|
查询查看主从同步状态,会发现SlaveIORunning和SlaveSQLRunning是Yes了,表明开启成功
(转)MySQL 主从复制搭建,基于日志(binlog的更多相关文章
- MySQL5.6主从复制搭建基于日志(binlog)
什么是MySQL主从复制 简单来说,就是保证主SQL(Master)和从SQL(Slave)的数据是一致性的,向Master插入数据后,Slave会自动从Master把修改的数据同步过来(有一定的延迟 ...
- MYSQL主从复制搭建及切换操作(GTID与传统)
结构如下: MYSQL主从复制方式有默认的复制方式异步复制,5.5版本之后半同步复制,5.6版本之后新增GTID复制,包括5.7版本的多源复制. MYSQL版本:5.7.20 操作系统版本:linux ...
- Mysql 主从复制搭建
Mysql 主重复制搭建 Linux版本:Linux Centos 6.4 32位 Mysql版本:Mysql-5.6.38-linux-glibc2.12-i686 Mysql安装:Mysql安装教 ...
- 《MySQL数据库》MySQL主从复制搭建与原理
前言 主从复制:两台或者更多的数据库实例,通过二进制日志,实现数据同步.为什么需要主从复制,主从复制的作用是什么,答:为了预防灾难. 搭建 第一步:准备多实例环境.如何创建多实例见: 第二步:确保每一 ...
- 详解MySQL主从复制实战 - 基于GTID的复制
基于GTID的复制 简介 基于GTID的复制是MySQL 5.6后新增的复制方式. GTID (global transaction identifier) 即全局事务ID, 保证了在每个在主库上提交 ...
- MySQL和Mariadb二进制日志binlog详解
Mariadb/mysql提供了4中不同的日志,分别是错误日志(error.log).普通日志(general log).慢日志(slow log)以及二进制日志(binlog).错误日志记录了系统启 ...
- 基于Docker的Mysql主从复制搭建
来源:https://www.cnblogs.com/songwenjie/p/9371422.html?tdsourcetag=s_pctim_aiomsg 为什么基于Docker搭建? 资源有 ...
- 基于 Docker 的 MySQL 主从复制搭建
出处:https://www.jianshu.com/p/ab20e835a73f
- mysql主从复制搭建中几种log和pos详解
一.主从原理 Replication 线程 Mysql的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysql in ...
随机推荐
- ADO.net开放式并发
https://docs.microsoft.com/zh-cn/dotnet/framework/data/adonet/optimistic-concurrency 在多用户环境中,有两种用于更新 ...
- pthread_rwlock_rdlock和“No such file or directory”
pthread_rwlock_rdlock和"No such file or directory" 调用pthread_rwlock_rdlock时,如果失败报错"pth ...
- 跳转AppStore 评分
-(void)goToAppStore { NSString *str = [NSString stringWithFormat: @"itms-apps://ax.itunes.apple ...
- FlexBox弹性盒布局
网页布局(layout)是 CSS 的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂 ...
- phonegap/cordova学习建议
在技术群里面,一直有一些新人进来,问了一些让人可笑不得的问题.国内的资料相对比较少,而且很旧,都是一些2.X版本的资料.因此想写一些东西,帮助一下新人,让他们少走弯路. 首先说一些很多人问的问题,个人 ...
- centos7 mysql 数据库备份与还原
数据库备份 show databases; #先查看一下数据库 现在我要备份word数据库 退出mysql输入 mysqldump -u root -p word > word.sql #我把它 ...
- R12.1.3 patch9239090
参考文档:Oracle E-Business Suite Release 12.1.3 Readme [ID 1080973.1]1.调整参数_disable_fast_validate=TRUEpg ...
- 学习python的第五天
4.30自我总结 一复习 1.查看数据类型 #数值10的位置 print(di(10)) #数值10的样式 print(type(10)) 2.关于变量的一些补充 a=1 b=1 c=1 #a,b,c ...
- Linux Redis 开机启动
通过初始化脚本启动Redis 在Redis源代码目录的utils文件夹中有一个名为redis_init_script的初始化脚本文件.需要配置Redis的运行方式和持久化文件.日志文件的存储位置.步骤 ...
- 自定义Team Foundation Server (TFS) 与Project Professional的集成字段
用户可以象使用Office Excel一样,使用Project Professional连接TFS,将数据下载到本地修改,并且发布到TFS服务器上,如果你习惯使用Project来计划你的项目,那么Pr ...