MySQL主从复制

主从复制

  • 主从复制的概念
  • 主从复制的原理
  • 主从复制配置

主从复制的概念

在实际生产环境中,如果对mysql数据库的读和写都在一台数据库服务器中操作,无论是在安全性、高可用性,还是高并发等各个方面都是不能满足实际需求的,一般要通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。如果我们的服务只有一台mysql服务器为用户提供服务,那么当这台服务器宕机了又或者这台服务器的磁盘坏了这都是我们无法接受的。
通过主从复制可以缓解这些问题,一台服务器挂了。还有其他mysql服务能够提供服务。下面我们说一下主从复制是怎么做的。

  • 首先, MySQL主库在事务提交时会把数据变更作为事件 Events 记录在二进制日志文件Binlog中; MySQL主库上的 sync_binlog参数控制 Binlog日志刷新到磁盘。
  • 主库推送二进制日志文件 Binlog中的事件到从库的中继日志 Relay Log, 之后从库根据中继日志 Relay Log重做数据变更操作, 通过逻辑复制以此来达到主库和从库的数据一致。

其主要的作用主要有一下两个:

  • 数据备份 - 热备份&容灾&高可用
  • 读写分离,支持更大的并发

读写分离。我们可以通过主从复制的方式来同步数据,然后通过读写分离提高数据库并发处理能力
MySQL主从复制_第1张图片
其中Master我们叫做主库,。负责写入数据,我们称之为:写库。
slave我们叫做从库负责读取数据,我们称之为:读库。
当主库进行更新的时候,会自动将数据复制到从库中,而我们在客户端读取数据的时候,会从从库中进行读取。

主从复制的原理

原理大致是这个Salve会从Master读取binlog来进行数据同步。
MySQL主从复制_第2张图片
主从复制的流程:两个日志(binlog二进制日志&relay log日志)和三个线程(master的一个线程slave的二个线程)。主要步骤如下:

  • 主库的更新操作写入binlog二进制日志中。
  • master服务器创建一个binlog转储线程,将二进制日志内容发送到从服务器。
  • slave机器执行START SLAVE命令会在从服务器创建一个IO线程,接收master的binary log复制到其中继日志。

首先slave开始一个工作线程(I/O线程),I/O线程在master上打开一个普通的连接,然后开始binlog dump process,binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件,I/O线程将这些事件写入中继日志。
sql slave thread(sql从线程)处理该过程的最后一步,sql线程从中继日志中读取事件,并重放其中的事件而更新slave机器的数据,使其与master的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于os缓存中,所以中继日志的开销很小。

主从复制配置

1.首先检查主库和从库主机之间是否能够ping通。
MySQL主从复制_第3张图片
在确保双方主机之间网络是通畅的之后。我们进行下一步。

2.开放双方的mysql监听端口,在这里我的端口号是3306.

3.master配置开启二进制日志、配置log_bin和全局唯一的server-id。
MySQL主从复制_第4张图片
然后我们在从库当中只需要配置这个server_id当时一定不能和主库的server_id一样!!!!!
MySQL主从复制_第5张图片
3.创建一个用于主从库通信用的账号

 create user 'slave'@'%' IDENTIFIED BY '671015zX@';

MySQL主从复制_第6张图片
下面说明一下上面那条命令:

  • MySQL创建用户命令:CREATE USER ‘username’@‘host’ IDENTIFIED BY ‘password’;
  • username:指定创建的用户名
  • host:指定用户登录的主机ip,% 表示任意主机都可远程登录,localhost 表示本地才能登录
  • password:指定该用户的登录密码

接下来给创建的用户授权同步复制权限

GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';

下面解释一下上面这条命令:

  • MySQL创建授权命令:GRANT REPLICATION SLAVE ON database.table TO ‘username’@‘host’;
  • privilege :指定授权的权限,比如create、drop等权限。
  • database:指定哪些数据库生效,*表示全部数据库生效
  • table:指定所在数据库的哪些数据表生效,*表示所在数据库的全部数据表生效
  • username:指定被授予权限的用户名
  • host:指定用户登录的主机ip,%表示任意主机都可远程登录。

最后刷新权限生效:

 FLUSH PRIVILEGES;

MySQL主从复制_第7张图片
接着执行命令查看并记下binary log二进制日志文件名 File 以及位置 Position的值,需要在从数据库用到:

 show master status;

MySQL主从复制_第8张图片
注意这个mysql-bin.000001这个文件名和位置我们需要记录下来。然后我们
启动从数据库,执行以下命令设置与主数据库的联系

CHANGE MASTER TO MASTER_HOST='101.35.98.26',MASTER_PORT=3306,MASTER_USER='slave',MASTER_PASSWORD='671015zX@',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=749;

MySQL主从复制_第9张图片
然后我们启动从库

start slave;

然后查看从库状态
MySQL主从复制_第10张图片
我们在可以在这个描述信息里面我可以看到这个从库两个线程的相关信息:
MySQL主从复制_第11张图片
下面我们来测试到底主从复制好了没有
MySQL主从复制_第12张图片
这是一开始的状态,下面我们在主库建一个表。
MySQL主从复制_第13张图片
然后我们在主库里面我们在建一张表往里面插入一条数据
MySQL主从复制_第14张图片
我们发现这个同步成功了。

你可能感兴趣的:(数据库,面试,golang)