mysql系列之6.mysql主从同步
普通文件的数据同步
nfs: 网络文件共享
samba: 共享数据
定时任务或守护进程结合 rsync.scp
inotify(sersync)+rsync 触发式实时数据同步
ftp数据同步
ssh key + scp / rsync
svn版本管理
rsync,sersync,inotify,union(双向同步),csync2(多向同步)
mysql主从同步逻辑图
1. 单向主从同步
主-从
一主多从
2. 双向主主同步: 互为主从 (一般不采用)
3. 线性: 级联单向双主同步
4. 环状: 级联单向多主同步
主从同步的意义, 解决的问题
1.互为备份: 高可用性和容错性
2.读写分离: 负载平衡
3.根据服务器拆分业务: 数据分布
如何实现读写分离
1.通过php程序: 建立多个连接文件, 轻松实现
2.通过软件实现: mysql-proxy amoeba 等代理软件
3.开发dbproxy
mysql主从复制原理
首先就是, master服务器端记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
1.slave服务器上执行 start slave, 开启主从复制开关
2.此时, slave服务器的IO线程会通过在master上授权的复制用户权限请求连接master服务器, 并请求从指定binlog日志文件的指定位置(日志文件名和位置就是在配置主从复制服务时执行change master命令时指定的)之后发送binlog日志内容
3.master服务器接收到来自slave服务器的IO线程的请求后, master服务器上负责复制的IO线程根据slave服务器的IO线程请求的信息读取指定binlog日志文件指定位置之后的binlog日志信息,然后返回给slave端的IO线程. 返回的信息中除了binlog日志内容, 还有本次返回日志内容后在master服务器端的新的binlog文件名称以及在binlog中的下一个指定更新位置
4.当slave服务器的IO线程获取到来自master服务器上IO线程发送日志内容及日志文件及位置点后, 将binlog日志内容依次写入到slave端自身的relay log(中继日志: mysql-relay.xxxxxx)文件的最末端, 并将新的binlog文件名和位置记录到master-info文件中, 以便下一次读取master端新binlog日志时能够告诉master服务器需要从新binlog日志的哪个文件哪个位置开始请求新的binlog日志内容
5.slave服务器端的sql线程会实时的检测本地relay log中新增加的日志内容, 然后及时的把log文件中的内容解析成在master端曾经执行的sql语句的内容, 并在自身slave服务器上按语句的顺序执行应用这些sql语句, 应用完毕后清理应用过的日志
6.经过了上面的过程, 就可以确保在master端和slave端执行了同样的sql语句. 当复制状态正常的情况下, master和slave端的数据是一样的, mysql的同步机制是有一些特殊的情况的, 但是大多数情况下大家不用担心.
整体上来说,复制有3个步骤:
(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
(2) slave将master的binary log events拷贝到它的中继日志(relay log);
(3) slave重做中继日志中的事件,将改变反映它自己的数据。
主从复制实现步骤
1.数据库环境
单机单数据库多实例
主库:3306, 从库3307
2.主库: 修改my.cnf
[mysqld] log-bin=mysql-bin server- expire_logs_days= //binlog日志保留的天数, 可不加此配置
#service iptables stop; //主服务器一定要关闭防火墙
#mysqladmin -uroot -S /data/3306/mysql.sock shutdown //重启mysql
#mysqld_safe --defaults-file=/data/3306/my.cnf
#mysql -uroot -S /data/3306/mysql.sock -e "show variables like 'log_bin';" //检查log bin
+---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_bin | ON | +---------------+-------+
3.从库: 修改my.cnf
server-
注意: 如果从库还想级联从库, 必须打开这两个参数------
log-bin
log-slave-updates
4.在master上建立授权账号
mysql> grant replication slave on *.* to "; mysql> flush privileges;
5.在master上导出当前数据
mysql> flush table with read lock;
然后重新开一个mysql命令窗口
mysql> show master status;
+------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000004 | 333 | | | +------------------+----------+--------------+------------------+
mysql> show master logs;
#mysqldump -uroot -S /data/3306/mysql.sock -A -B --events --master-data=2 > /all.sql
#vim /all.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=333;
mysql> show master status; //看看锁表期间数据是否有更改 mysql> unlock tables;
6.把备份数据拷贝到slave
#mysql -uroot -S /data/3307/mysql.sock < /all.sql
7.slave端开始连接master (/data/3307/data/目录下能看到两个文件,说明连接成功: master.info relay-log.info)
mysql> CHANGE MASTER TOMASTER_HOST='192.168.1.116', MASTER_PORT=, MASTER_USER='rep', MASTER_PASSWORD=', MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=;
8.slave端打开复制开关: 看到两个 Yes 就说明成功!
mysql> start slave; mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
9.测试主从复制是否正常工作
master端:
mysql> create database ab;
Query OK, 1 row affected (0.00 sec)
slave端:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| ab |
| mysql |
| performance_schema |
| test |
+--------------------+
最简化的建议
1.半夜的时候, 用mysqldump带--master-data=1参数实现全备, 把.sql恢复到从库
#mysqldump -uroot -S /data/3306/mysql.sock -A -B --events --master-data=1 > /all.sql
#mysql -uroot -S /data/3307/mysql.sock < /all.sql
2.然后在从库执行change master to ... 无需binlog文件及位置点
(省略下面这两行) MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=;
主库当机, 如何快速恢复数据库服务
核心思想: 把其中一个从库升级为主库
主库: 192.168.1.25
从库1: 192.168.1.30
从库2: 192.168.1.35
1.在每个从库上执行
停止从库的io线程
mysql> stop slave io_thread; mysql> show processlist;
2.登录从库1
停止同步, 重置为主,建立复制用户,查看status
# mysql -uroot
mysql> stop slave; mysql> reset master; mysql> grant replication slave on *.* to "; mysql> flush privileges; mysql> show master status;
3.进到从库1的数据库目录
删除从库日志
# cd /data/3307/data
# rm -f master.info relay-log.info
4.把从库1提升为主库: 修改my.cnf
去掉从库的参数配置
log-bin ##log-slave-updates ##read-only
5.在从库2,3,4..上操作:
在每个从库上重新指定主库
mysql> stop slave; mysql> change master to master_host='192.168.1.30', master_port=, master_user='rep', master_password=', master_log_file='mysql-bin.000001', master_log_pos=; mysql> start slave; mysql> show slave status\G;
双主或多主数据库架构
核心思想是: 互为主从, 避免id重复
主1: 192.168.1.25
主2: 192.168.1.30
1.my.cnf (记得重启mysqld服务)
修改主1的 my.cnf
[mysqld] auto_increment_increment = auto_increment_offset = //数据表id从1开始, 递增2 log-slave-updates //多主架构是互为主从的, 所以必须开启此项配置 log-bin
修改主2的 my.cnf
[mysqld] auto_increment_increment = auto_increment_offset = log-slave-updates log-bin
2.手动同步主1和主2当前的数据
3.把主1作为从服务器, 连接到主2 (主2的操作同此)
mysql> stop slave; mysql> reset master; mysql> show master status; mysql> grant replication slave on *.* to "; mysql> change master to master_host='192.168.1.30', //主2的服务器ip地址 master_port=, master_user='rep', //主2的复制账户和密码 master_password=', master_log_file='mysql-bin.000001', //主2的file和pos值 master_log_pos=; mysql> start slave; mysql> show slave status\G;
4.测试
在主1上新建一个数据库和表, 并插入几条数据, 自增id是1 3 5
然后去主2上看看数据是否已同步过来
接着在主2执行相同操作, 自增id应该是2 4 6
;
mysql系列之6.mysql主从同步的更多相关文章
- mysql用户权限分配及主从同步复制
赋予wgdp用户查询权限: grant select on wg_dp.* to 'wgdp'@'%' IDENTIFIED BY 'weigou123'; grant all privileges ...
- Mysql高可用架构(主从同步)
做高可用的优势 1.成本低 2.解决单点故障 3.不容易遇到性能瓶颈 一 .Mysql主从同步架构搭建案例 优点如下:·在业务繁忙阶段,在从服务器上可以执行查询工作(即我们常说的读写分离),降低主服务 ...
- MySQL面试题中:主从同步部署介绍
主从同步部署1.两台相同版本的mysql数据库,一台做主库,一台从库 主库开启binlog 在配置文件中的[mysqld]模块中添加log-bin=mysql-bin和server-id=1,一定要保 ...
- Mysql 实现基于binlog的主从同步
工作原理 1.主节点必须启用二进制日志,记录任何修改了数据库数据的事件.2.从节点开启一个线程(I/O Thread)把自己扮演成 mysql 的客户端,通过 mysql 协议,请求主节点的二进制日志 ...
- MySQL的读写分离与主从同步数据一致性
有没有做MySQL读写分离?如何实现mysql的读写分离?MySQL主从复制原理的是啥?如何解决mysql主从同步的延时问题? 高并发这个阶段,那肯定是需要做读写分离的,啥意思?因为实际上大部分的互联 ...
- MySQL面试题中:主从同步的原理
主从同步的原理:1.主库上面有一个IO线程,从库上有一个IO线程和一个SQL线程,从库中的IO线程负责从主库读取binlog,并写入从库的中继日志:SQL线程负责读取并执行中继日志中的binlog,转 ...
- mysql系列之9.mysql日志&存储引擎
mysqlbinlog 是什么? 数据目录下的如下文件: mysql-bin.xxxxxx 作用? 记录数据库内部增删改查对mysql数据库有更新的内容的记录 三种模式? statement leve ...
- Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'系列三:重置主从同步
1:停止slave服务器的主从同步 stop slave; 2:对Master数据库加锁 flush tables with read lock; 3:备份Master上的数据 mysqldump - ...
- mysql系列之2.mysql多实例
使用场景 资金紧张; 并发访问不大; 门户网站; 实现 生产硬件配置: mem 32G / 双cpu 8核 / 磁盘6*600G sas 15k, 2-3个实例 安装组件 #yum install n ...
随机推荐
- 搞懂ZooKeeper的Watcher之源码分析及特性总结
前言 本章讲ZooKeeper重要的机制,Watcher特性.ZooKeeper允许客户端向服务端注册Watcher监听,当服务端一些指定事件触发了这个Watcher,那么就会向指定客户端发送一个事件 ...
- 洛谷 P3359 改造异或树
题目描述 给定一棵n 个点的树,每条边上都有一个权值.现在按顺序删掉所有的n-1条边,每删掉一条边询问当前有多少条路径满足路径上所有边权值异或和为0. 输入输出格式 输入格式: 第一行一个整数n. 接 ...
- SpringMVC_01:创建运行环境(Maven)
Maven 环境下配置: 1.新建MavenProject,打包选线根据情况选择jar war和pom jar:打包为jar包,主要用于被其他项目引用 war:打包为war包,可直接运行于服务器 po ...
- ArcGIS 开发时,解决__类型“XX”同时存在于“”和“”中__的错误
错误提示:类型“ESRI.ArcGIS.ADF.BaseClasses.BaseCommand”同时存在于“e:\Program Files\ArcGIS\DeveloperKit10.2\DotNe ...
- 2016.6.20 tomcat安装出现No Java Virtual Machine found in..
安装tomcat时,选择安装路径为自定义路径,但是出现提示: No Java Virtual Machine found in.. 心想这和java虚拟机什么关系啊.百度了之后发现,安装过程中有一步是 ...
- linux过滤ip段
https://www.2cto.com/net/201307/227257.html
- vue DOM模板解析
当使用 DOM 作为模板时 (例如,使用 el 选项来把 Vue 实例挂载到一个已有内容的元素上),你会受到 HTML 本身的一些限制,因为 Vue 只有在浏览器解析.规范化模板之后才能获取其内容.尤 ...
- Vmware+gdb调试Linux内核——工欲善其事,必先利其器
今天我最终忍受不了qemu的低速跟不可理喻的各种bug,開始寻找新的调试内核的方法.然后想到了Vmware,那么成熟的虚拟机怎么可能调试不了内核.于是尝试了一番,发现结果很的棒!所以立刻奋笔疾书.把这 ...
- UNP学习笔记(第二十六章 线程)
线程有时称为轻权进程(lightweight process) 同一进程内的所有线程共享相同的全局内存.这使得线程之间易于共享信息,然后这样也会带来同步的问题 同一进程内的所有线程处理共享全局变量外还 ...
- PowerDesigner将PDM导出生成WORD文档(转)
今天的温习老知识,是如何将一个PD设计的PDM来导出WORD文档,这是一个非常实用的功能,可以在软件过程的数据库设计文档编写中节省N多时间, 那不废话了,我们就开始今天的讲解吧! 第一步,点击Repo ...