Mysql主从复制原理及搭建
## Mysql主从复制原理
主从复制是指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中。对于多级复制,数据库服务器即可充当主机,也可充当从机。MySQL主从复制的基础是主服务器对数据库修改记录二进制日志,从服务器通过主服务器的二进制日志自动执行更新。
### Mysq主从复制的类型
- #### 基于语句的复制:
主服务器上面执行的语句在从服务器上面再执行一遍,在MySQL-3.23版本以后支持。
存在的问题:时间上可能不完全同步造成偏差,执行语句的用户也可能是不同一个用户。
- #### 基于行的复制:
把主服务器上面改变后的内容直接复制过去,而不关心到底改变该内容是由哪条语句引发的,在MySQL-5.0版本以后引入。
存在的问题:如果修改的行数过多,造成的开销比较大。
> MySQL默认使用基于语句的复制,当基于语句的复制会引发问题的时候就会使用基于行的复制,MySQL会自动进行选择。
>
> 在MySQL主从复制架构中,读操作可以在所有的服务器上面进行,而写操作只能在主服务器上面进行。主从复制架构虽然给读操作提供了扩展,可如果写操作也比较多的话(多台从服务器还要从主服务器上面同步数据),单主模型的复制中主服务器势必会成为性能瓶颈。
### Mysql主从复制的工作原理

如上图所示,主服务器上面的任何修改都会保存在二进制日志Binary log里面,从服务器上面启动一个I/O thread(实际上就是一个主服务器的客户端进程),连接到主服务器上面请求读取二进制日志,然后把读取到的二进制日志写到本地的一个Realy log里面。从服务器上面开启一个SQL thread定时检查Realy log,如果发现有更改立即把更改的内容在本机上面执行一遍。
如果一主多从的话,这时主库既要负责写又要负责为几个从库提供二进制日志。此时可以稍做调整,将二进制日志只给某一从,这一从再开启二进制日志并将自己的二进制日志再发给其它从。或者是干脆这个从不记录只负责将二进制日志转发给其它从,这样架构起来性能可能要好得多,而且数据之间的延时应该也稍微要好一些。
### Mysql主从复制的过程
1. Slave上面的IO进程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容。
2. Master接收到来自Slave的IO进程的请求后,负责复制的IO进程会根据请求信息读取日志指定位置之后的日志信息,返回给Slave的IO进程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置。
3. Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master从何处开始读取日志。
4. Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。
## linux安装mysql8并且实现主从同步
### 服务器准备
准备服务器Server1和Server2,如果在同一个服务器的话则安装mysql时需要改变其端口。
### 卸载mysql
在安装之前必须先检查主机上有没有安装过mysql,如果安装过的话必须先卸载。
### 安装mysql
下载软件包:
`wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm`
本地安装:
`yum localinstall mysql80-community-release-el7-1.noarch.rpm`
安装mysql:
`yum install mysql-community-server`
设为开机启动:
`systemctl enable mysqld`
`systemctl daemon-reload`
启动mysql:
`systemctl start mysqld`
以上步骤就安装好mysql8了。
获取mysql的临时密码:
`grep 'temporary password' /var/log/mysqld.log`
登录mysql:
`mysql -uroot -p`
会提示输入密码,输入之前获取的临时密码即可登录。
此时需要修改mysql的密码,要不然之后的步骤也会强制提示你需要修改密码:
`ALTER USER 'root'@'localhost' IDENTIFIED BY '121b33dAj934J1^Sj9ag';`
mysql8默认对密码的强度有要求,需要设置复杂一点,要不然也会提示错误。
刷新配置:
`FLUSH PRIVILEGES;`
### 主从配置
在主从配置之前需要确保两台mysql需要同步的库状态一致。
#### 主
配置文件默认在`/etc/my.cnf`下。
在配置文件中新增配置:
```
[mysqld]
## 同一局域网内注意要唯一
server-id=100
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
```
修改配置后需要重启才能生效:
`service mysql restart`
重启之后进入mysql:
`mysql -uroot -p`
在master数据库创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。
`CREATE USER 'slave'@'%' IDENTIFIED BY '@#$Rfg345634523rft4fa';`
`GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';`
语句中的`%`代表所有服务器都可以使用这个用户,如果想指定特定的ip,将`%`改成ip即可。
查看主mysql的状态:
`show master status;`
记录下`File`和`Position`的值,并且不进行其他操作以免引起`Position`的变化。
#### 从
在从`my.cnf`配置中新增:
```
mysqld]
## 设置server_id,注意要唯一
server-id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
```
修改配置后需要重启才能生效:
`service mysql restart`
重启之后进入mysql:
`mysql -uroot -p`
`change master to master_host='172.17.0.2', master_user='slave', master_password='@#$Rfg345634523rft4fa', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 2830, master_connect_retry=30;`
**master_host** :Master的地址
**master_port**:Master的端口号
**master_user**:用于数据同步的用户
**master_password**:用于同步的用户的密码
**master_log_file**:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
**master_log_pos**:从哪个 Position 开始读,即上文中提到的 Position 字段的值
**master_connect_retry**:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
在从mysql中查看主从同步状态:
`show slave status \G;`
此时的SlaveIORunning 和 SlaveSQLRunning 都是No,因为我们还没有开启主从复制过程。
开启主从复制:
`start slave;`
再次查看同步状态:
`show slave status \G;`
SlaveIORunning 和 SlaveSQLRunning 都是Yes说明主从复制已经开启。
若SlaveIORunning一直是Connecting,有下面4种原因:
1、网络不通,检查ip端口
2、密码不对,检查用于同步的用户名和密码
3、pos不对,检查Master的Position
4、mysql8特有的密码规则问题引起:
`ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '@#$Rfg345634523rft4fa'; `
将密码规则修改为:mysql_native_password
如果需要指定想要主从同步哪个数据库,可以在master的`my.cnf`添加配置:
`binlog-do-db:指定mysql的binlog日志记录哪个db`
或者在slave的`my.cnf`添加配置:
`replicate-do-db=需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可
replicate-ignore-db=需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可`
如果想要同步所有库和表,在从mysql执行:
`STOP SLAVE SQL_THREAD;`
`CHANGE REPLICATION FILTER REPLICATE_DO_DB = ();`
`start SLAVE SQL_THREAD;`
如果以上步骤出现问题,可以查看日志:
`/etc/log/mysqld.log`
至此完成了mysql8主从同步搭建工作。
转评赞就是最大的鼓励
Mysql主从复制原理及搭建的更多相关文章
- 【MySQL主从复制原理及搭建全过程】
目录 准备工作 主从复制原理 开始搭建主从复制 本文将使用mariaDB数据库实现主从复制,其步骤与MySQL数据库无差异. MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护, ...
- MySQL主从复制原理及搭建过程
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 复制概述 复制即把一台服务器上的数据通过某种手段同步到另外一台或多台从服务器上,使得从服务器在数据上与主服务器保持一致. ...
- MySQL主从复制--原理
简介 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一 ...
- MySQL 主从复制原理不再难
上篇我们分析过 Binlog 日志的作用以及存储原理,感兴趣的可以翻阅: 一文带你了解 Binlog 日志 Binlog 日志主要作用是数据恢复和主从复制.本身就是二进制格式的日志文件,网络传输无需进 ...
- mysql 主从复制原理
主从形式 mysql主从复制 灵活 一主一从 主主复制 一主多从---扩展系统读取的性能,因为读是在从库读取的: 多主一从---5.7开始支持 联级复制--- 用途及条件 mysql主 ...
- [转]MySQL主从复制原理介绍
MySQL主从复制原理介绍 一.复制的原理 MySQL 复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新.删除等等).每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以 ...
- Mysql主从复制原理及配置
Mysql主从复制原理及配置 1.复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其 ...
- mysql 主从复制原理(转)
本文转自https://blog.csdn.net/php_younger/article/details/59673879 mysql 主从复制原理 主从形式 mysql主从复制 灵活 一主一从 ...
- 如何实现 MySQL 的读写分离?MySQL 主从复制原理的是啥?如何解决 MySQL 主从同步的延时问题?
如何实现 MySQL 的读写分离? 其实很简单,就是基于主从复制架构,简单来说,就搞一个主库,挂多个从库,然后我们就单单只是写主库,然后主库会自动把数据给同步到从库上去. MySQL 主从复制原理的是 ...
随机推荐
- echarts在react项目中的使用
数据可视化在前端开发中经常会遇到,万恶的图表,有时候总是就差一点,可是怎么也搞不定. 别慌,咱们一起来研究. 引入我就不多说了 npm install echarts 对于基础的可视化组件,我一般采用 ...
- 记一次远程CMD开发过程
开发初衷: 有些同学电脑老是要出问题,但又不是什么大问题,通常几句cmd就能搞定.之前解决方案有2:一是远程演示,我口述别人操作:一是我写个cmd脚本,但毕竟不在本机不好调试.(吐槽一下常用的远程控制 ...
- Pivotal:15分钟部署你的应用
“ 本篇文章介绍的是PaaS平台Pivotal Cloud Foundry(以下简称PCF)的初步使用,相比于传统的IaaS平台(比如阿里云),PCF可实现快速迭代开发与部署,让您专注于业务开发.” ...
- TestNG中group的用法
TestNG中的组可以从多个类中筛选组属性相同的方法执行. 比如有两个类A和B,A中有1个方法a属于组1,B中有1个方法b也属于组1,那么我们可以通过配置TestNG文件实现把这两个类中都属于1组的方 ...
- Codeforces Round #219(Div. 2)373 B. Making Sequences is Fun(二分+找规律)
题目意思大概是给你w,m,k三个数,让你从m开始找 m m+1 m+2 m+3...........m+m', 使得他们的权值之和不超过w,计算权值的方法如下S(n)·k . S(n)表示n有多少位数 ...
- Apple放大绝进行反取证
取证说穿了其实就是攻防,这本是正义与邪恶的对决,亦即执法单位与嫌疑犯两者之间的事,但现实生活中要比这复杂多了. 怎么说呢?举个例子大家便理解了.取证人员费尽心思,用尽各种手法,努力地想要自手机上提取重 ...
- Linux基础管道管理
一.I/O重定向 标准输入,标准输出,标准错误 file descriptors (FD, 文件描述符或Process I/O channels); 进程使用文件描述符来管理打开的文件 [root@l ...
- Linux部署项目遇到问题解决
使用Linux部署web项目,可能会遇到各种各样问题导致服务启动失败,以下是我近期部署项目遇到的问题以及解决方案 一.场景:把war包放入tomcat的webapps文件夹下,然后启动tomcat服务 ...
- luogu2279_[HNOI2003]消防局的设立 贪心
传送门 不需要树形dp 关于深度排序 当前节点到最近的消防局(f[u])>2时要建新的与u的上面(v)的上面(w) 同时w的上面和上面的上面也要更新f值 #include <bits/st ...
- git的使用学习笔记
一.git Git 是一个开源的分布式版本控制系统,项目版本管理工具,可以在本地提交修改再合并到主分支上,最为出色的是它的合并跟踪(merge tracing)能力. 可以通过Linux命令进行增加, ...