Mysql主从复制原理及搭建

xiaoyuehan 2019-08-26 原文

Mysql主从复制原理及搭建

## Mysql主从复制原理

主从复制是指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中。对于多级复制,数据库服务器即可充当主机,也可充当从机。MySQL主从复制的基础是主服务器对数据库修改记录二进制日志,从服务器通过主服务器的二进制日志自动执行更新。

### Mysq主从复制的类型

– #### 基于语句的复制:

主服务器上面执行的语句在从服务器上面再执行一遍,在MySQL-3.23版本以后支持。

存在的问题:时间上可能不完全同步造成偏差,执行语句的用户也可能是不同一个用户。

– #### 基于行的复制:

把主服务器上面改变后的内容直接复制过去,而不关心到底改变该内容是由哪条语句引发的,在MySQL-5.0版本以后引入。

存在的问题:如果修改的行数过多,造成的开销比较大。

> MySQL默认使用基于语句的复制,当基于语句的复制会引发问题的时候就会使用基于行的复制,MySQL会自动进行选择。
>
> 在MySQL主从复制架构中,读操作可以在所有的服务器上面进行,而写操作只能在主服务器上面进行。主从复制架构虽然给读操作提供了扩展,可如果写操作也比较多的话(多台从服务器还要从主服务器上面同步数据),单主模型的复制中主服务器势必会成为性能瓶颈。

### Mysql主从复制的工作原理

![file](https://img2018.cnblogs.com/blog/1560574/201908/1560574-20190826160146501-1105734803.jpg)

如上图所示,主服务器上面的任何修改都会保存在二进制日志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主从同步搭建工作。
转评赞就是最大的鼓励

发表于
2019-08-26 16:02 晓月寒丶 阅读() 评论() 编辑 收藏

 

版权声明:本文为xiaoyuehan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/xiaoyuehan/p/11413101.html

Mysql主从复制原理及搭建的更多相关文章

  1. Mysql主从复制原理及搭建

    Mysql主从复制原理 主从复制是指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务 […]...

随机推荐

  1. linux 下写socket遭遇broken pipe(SIGPIPE C++)

    来自:http://linkyou.blog.51cto.com/1332494/751877/ 原代码片段如 […]...

  2. js的数据类型

    总体来讲有 五种基本类型,一个复杂类型,一个新增 symbol 一. 常见的数据类型有 es5  1 基本类型 […]...

  3. VBO、VAO和EBO

    Vertex Buffer Object 对于经历过fixed pipeline的我来讲,VBO的出现对于渲染 […]...

  4. Web开发人员和设计师必读文章推荐【系列五】

    本文继续向Web开发人员和设计师推荐优秀文章。梦想天空博客关注前端开发技术,展示最新HTML5和CSS3技术应 […]...

  5. 写一个狼吃羊的小游戏

    其实在2016年,我就准备写这个小游戏了。但是奈何当时没文化...

  6. 前端工程化系列[06]-Yeoman脚手架核心机制

    前端工程化系列[06]-Yeoman脚手架核心机制 在前端工程化系列[05] Yeoman脚手架使用入门这边文 […]...

  7. The sixth week CoreIDRAW 课总结 :

    1. 这节课学到了什么知识?        答:这节课学习了色彩填充和轮廓线的编辑,(1).颜色填充,可以在工 […]...

  8. 检测ip代理有效性 – SmilingEye

    检测ip代理有效性 转载及总结 转载:https://xw.qq.com/amphtml/20190428A0 […]...

展开目录

目录导航