900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > mysql主从复制原理详解_深入研究MySQL(三) 主从复制原理及演示

mysql主从复制原理详解_深入研究MySQL(三) 主从复制原理及演示

时间:2021-11-15 09:37:18

相关推荐

mysql主从复制原理详解_深入研究MySQL(三) 主从复制原理及演示

一、主从复制概述

这章来说说主从复制,对于主从复制,有很多知识,在以后分篇记录,所以在这里只说说简单的用法,用来入个门可以,先说啥是主从复制,主从复制就是将一台主机的数据复制到另一台或者多台主机上,复制过程中一台服务器充当主库(Master),就是源数据存放的主机,还有一台或者多台服务器充当从库(Slave),Mysql支持单向、双向、链式级联、异步复制,还有在5.5版本后的半同步复制等。

利用主从复制功能,我们可以做到在主库发生意外时,让从库接管主库,也能让从库分担主库的读压力,这一点,也可以看看以前关于Redis主从复制的介绍。

模式图

二、主从复制演示

Docker安装MySQL

由于本次演示需要用到多个MySQL实例,可以使用Docker来做,但是貌似MySQL自身就可以配置多个实例,这一点不太清楚,没有试过,所以还是使用Docker吧,关于Docker的安装就不说了,下面说Docker中部署MySQL服务器。

(多说一句话,Docker真是个好东西,在上次团队需要马上运行一个服务端,需要数据库,要把sql文件导入进去,由于版本的差异,这个只能在5.6版本下导入,我们电脑上的所有版本完美的避开了5.6,这时想起了Docker,敲了几行命令,一个崭新的MySQL5.6就出来了,最终成功把数据导入进去,救了急)

关于安装Docker,看官方的一篇就够了:

/engine/install/ubuntu/

首先拉取镜像

dockerpullmysql/mysql-server:8.0

启动两个实例,端口为3307和3308,密码都为123456

dockerrun-p3307:3306--namemysql1-eMYSQL_ROOT_PASSWORD=123456-dmysql/mysql-server:8.0

dockerrun-p3308:3306--namemysql2-eMYSQL_ROOT_PASSWORD=123456-dmysql/mysql-server:8.0

更多可以参考下面官网:

/doc/mysql-installation-excerpt/8.0/en/docker-mysql-getting-started.html

查看进程。

root@hxl-PC:/home/hxl#dockerps

CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES

4f16b40cb2d4mysql/mysql-server:8.0"/entrypoint.shmysq…"5hoursagoUp30minutes(healthy)33060/tcp,0.0.0.0:3308->3306/tcpmysql2

80faae4d305bmysql/mysql-server:8.0"/entrypoint.shmysq…"6hoursagoUp31minutes(healthy)33060/tcp,0.0.0.0:3307->3306/tcpmysql1

root@hxl-PC:/home/hxl#

配置主库(3307)

修改master数据库的配置文件,位置在/etc/f,可以在本地编辑好,然后使用docker cp命令复制到里面。

server-id是唯一的,主从的不能一样,如果没有设置server_id或设置成0的话,从主机会无法连接。

log-bin是二进制日志名称,服务器会将所有更改数据的语句记录到二进制日志中,这个日志就可以实现备份和复制,但这个只是基本名称,MySQL还会在这个名称后面拼接一串数字来依次创建二进制日志文件。

[mysqld]

server-id=101

log-bin=mysql-bin

接下来要创建主从复制账号,在从主机上会用到,还要把他赋予REPLICATION SLAVE特权,这个操作可以不使用命令行,如果您用的dbeaver的话,可以通过界面去创建。

mysql>createuser'bak'@'%'identifiedby'123456';

QueryOK,0rowsaffected(0.03sec)

mysql>grantreplicationslaveon*.*to'bak'@'%';

QueryOK,0rowsaffected(0.01sec)

mysql>flushprivileges;

QueryOK,0rowsaffected(0.01sec)

mysql>

关于主从复制账号,可以查看官网:

/doc/refman/8.0/en/replication-howto-repuser.html

关于二进制日志配置选项,可以查看官网:

/doc/refman/5.6/en/replication-options-binary-log.html

最后查看master状态,show master status这个命令用于查看服务器的二进制日志文件的状态信息,需要用的字段是Position,在配置从节点的时候,需要传递给他。

mysql>showmasterstatus;

+------------------+----------+--------------+------------------+-------------------+

|File|Position|Binlog_Do_DB|Binlog_Ignore_DB|Executed_Gtid_Set|

+------------------+----------+--------------+------------------+-------------------+

|mysql-bin.000003|156||||

+------------------+----------+--------------+------------------+-------------------+

1rowinset(0.00sec)

mysql>

配置从库(3308)

[mysqld]

server-id=101

最后在从库中执行下面命令,注意修改主机地址、端口、日志文件,最后的start slave用于开始执行主从复制。

mysql>changemastertomaster_host='10.204.27.177',master_user='bak',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=156,master_port=156,get_master_public_key=1;

QueryOK,0rowsaffected,2warnings(0.04sec)

mysql>startslave;

QueryOK,0rowsaffected(0.01sec)

mysql>

master_user:之前创建的复制账号master_host:主库的IP地址master_password:复制账号的密码master_log_file:二进制文件master_port:主库端口号master_log_pos:从备份文件中获取postion号。get_master_public_key:指示是否从源请求基于RSA密钥对的密码交换所需的公共密钥

查看状态,当Slave_IO_Running和Slave_SQL_Running都是yes的话就代表配置成功了。\G是格式化格式,否则会一团糟。

ysql>showslavestatus\G;

***************************1.row***************************

Slave_IO_State:Waitingformastertosendevent

Master_Host:10.204.27.177

Master_User:bak

Master_Port:3307

Connect_Retry:60

Master_Log_File:mysql-bin.000003

Read_Master_Log_Pos:746

Relay_Log_File:4f16b40cb2d4-relay-bin.000002

Relay_Log_Pos:324

Relay_Master_Log_File:mysql-bin.000003

Slave_IO_Running:Yes

Slave_SQL_Running:Yes

.......

测试

这是两个库此时的初始化状态。

现在在主库中创建一个数据库test。

在主库中新增一张表。

CREATETABLE`tb_user`(

`id`intNOTNULLAUTO_INCREMENT,

`userName`varchar(100)NOTNULL,

PRIMARYKEY(`id`)

)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_0900_ai_ci;

可以看到从库也同步了,数据也都为空。

主库插入一条数据。

主从复制原理

首先主库会在二进制日志里记录了对数据库的更改,从库会从主库中获取这个二进制日志,然后在从库中重放这部分日志,就实现了数据的同步。

主服务器将更新写入二进制日志文件,并维护文件的一个索引。从库复制主库的二进制日志事件到本地的中继日志(relay log)。从库重放中继日志。

MySQL会使用3个线程来执行复制功能,其中一个在主服务器上,另两个在从服务器上。当从服务器执行start slave命令时,从服务器会创建一个I/O线程,用于连接主服务器,并让它发送二进制日志中的语句。

主服务器就会创建一个线程将二进制日志中的内容发送到从服务器中,从服务器中的I/O线程读取主服务器线程发送的内容并将数据复制到本地文件中,也就是中继日志,第3个线程就是SQL线程,是从服务器创建的,用于读取中继日志文件内容,并执行日志中所包含的更新。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。