深入研究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,看官方的一篇就够了:

https://docs.docker.com/engine/install/ubuntu/
  1. 首先拉取镜像
docker pull mysql/mysql-server:8.0
  1. 启动两个实例,端口为3307和3308,密码都为123456

docker run -p 3307:3306 --name mysql1 -e MYSQL_ROOT_PASSWORD=123456 -d mysql/mysql-server:8.0

docker run -p 3308:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=123456 -d mysql/mysql-server:8.0
更多可以参考下面官网:
https://dev.mysql.com/doc/mysql-installation-excerpt/8.0/en/docker-mysql-getting-started.html

查看进程。

root@hxl-PC:/home/hxl# docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS                    PORTS                               NAMES
4f16b40cb2d4        mysql/mysql-server:8.0   "/entrypoint.sh mysq…"   5 hours ago         Up 30 minutes (healthy)   33060/tcp, 0.0.0.0:3308->3306/tcp   mysql2
80faae4d305b        mysql/mysql-server:8.0   "/entrypoint.sh mysq…"   6 hours ago         Up 31 minutes (healthy)   33060/tcp, 0.0.0.0:3307->3306/tcp   mysql1
root@hxl-PC:/home/hxl# 

配置主库(3307)

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

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

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

[mysqld]
server-id=101
log-bin=mysql-bin

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

mysql> create user 'bak'@'%' identified by '123456';
Query OK, 0 rows affected (0.03 sec)

mysql> grant replication slave on *.* to 'bak'@'%';
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> 
关于主从复制账号,可以查看官网:
https://dev.mysql.com/doc/refman/8.0/en/replication-howto-repuser.html

关于二进制日志配置选项,可以查看官网:
https://dev.mysql.com/doc/refman/5.6/en/replication-options-binary-log.html

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

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |      156 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> 
配置从库(3308)
[mysqld]
server-id=101

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

mysql> change master to master_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;
Query OK, 0 rows affected, 2 warnings (0.04 sec)

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

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

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

ysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  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。

在这里插入图片描述

在主库中新增一张表。


CREATE TABLE `tb_user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `userName` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

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

在这里插入图片描述

主库插入一条数据。

在这里插入图片描述

主从复制原理

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值