MySQL-主从复制

1、主从复制的理解

在工作用常见Redis作为缓存与MySQL一起使用。当有请求时,首先会从缓存中进行查找,如果存在就直接取出,否则访问数据库,这样 提升了读取的效率,也减少了对后台数据库的访问压力。Redis的缓存架构时高并发架构 中重要的一环

  • 作用
    • 读写分离:通过主从复制的方式来 同步数据 ,然后通过读写分离提高数据库并发处理能力。
    • 数据备份:通过主从复制将主库上的数据复制到从库上,相当于一种热备份机制,也就是在主库正常运行的情况下进行备份,并不会影响到服务
    • 具有高可用性:数据备份实际上是一种冗余机制,通过该方式可以换取数据库的高可用性,也就是当服务器出现故障或宕机的情况下,可以切换到从服务器上,保证数据的正常运行。

2、主从复制的原理

从数据库(Slave)从 主数据库(Master)读取 binlog 来进行数据同步。

2.1、原理刨析

  • 三线程:在主从复制过程中,会基于三线程来操作,一个主库线程,两个从库线程。
    • 二进制日志转储线程(Binlog dump thread):是一个主库线程。当从库线程连接的时候,主库可以将二进制日志发送给从库,当主库获取事件的时候,会在Binlog上加锁,读取完成之后,再将锁释放掉。
    • 从库I/O线程:会连接到主库,向主库发送请求更新 Binlog。这是从库的I/O线程就可以读取到主库的二进制日志转储线程发送的 Binlog 更新部分,并且拷贝到本地的中继日志(relay log)中。
    • 从库SQL线程:会读取从库中的中继日志(relay log)并且执行日志中的事件,将从库中的数据与主库保持同步。
      MySQL-主从复制_第1张图片
  • 不是所有版本的MySQL都默认开启服务器的二进制日志。在进行主从复制的时候,先检查服务器是否已经开启二进制日志
  • 除非特殊指定,默认情况下从服务器会执行所有主服务器中保存的事件。也可以通过配置,使从服务器执行特定的事件。
  • 复制三步骤
    • 1、Mater 将写操作记录到二进制日志(binlog)。这些记录叫做二进制日志事件
    • 2、Slave 将 Master 的binary log event 拷贝到他的中继日志(relay log)
    • 3、Slave 重做 relay log 中的事件,将改变应用到自己的数据库中。MySQL复制是异步且串行化的,而且重启后从接入点开始复制

2.2、复制的基本原则

  • 每个 Salve 只有一个Master
  • 每个 Salve 只能有一个唯一的服务器ID
  • 每个 Master 可以有多个Slave

3、主从架构的搭建

一台主机用于处理所有的写操作,一台从机负责所有读请求,如下图所示:

MySQL-主从复制_第2张图片

3.1、准备工作(采用虚拟机方式搭建主从复制架构)

  • 两台及以上虚拟机
  • 安装MySQL
  • 修改MySQL的server-uuid,使得主从服务器中MySQL的uuid都是独立的并重启mysql服务
[root@slave ~]# vim /var/lib/mysql/auto.cnf

[auto]
server-uuid=7e14fc46-fef9-11ee-98d3-0050562861fc

3.2、主机配置文件

建议MySQL版本保持一致且后台以服务运行,主从所有配置项都在 [mysqld]节点下,且都是小写字母。

具体参数配置如下
  • 必选项:
    • 主服务器唯一ID:server-id=1
    • 启用二进制日志,指名路径:log-bin=rqtanc-bin
  • 可选项:
    • read-only:0默认表示读写(主机),1表示只读(从机)
    • binlog_expire_log_seconds:设置日志文件保留的时长,单位为秒
    • max_binlog_size:控制单个二进制日志文件的大小,最大值和默认值是 1GB
    • binlog-ignore-db:设置不复制的数据库
    • binlog-do-db:设置需要复制的数据库,默认全部
    • binlog_format:设置binlog格式

先搭建完主从复制,在创建数据库。MySQL主从复制起始时,从机不继承主机数据。

3.3、从机配置文件

  • 必选项:
    • 从服务器唯一ID:server-id
  • 可选项:
    • relay-log:启用中继日志

3.4、主机:建立账户并授权

  • 创建用户:create user ‘slave’@‘%’ identified by ‘123456’;
  • 授予权限:grant replication slave on . to ‘slave’@‘%’;
  • 修改用户身份验证插件和密码:alter user ‘slave’@‘%’ identified with mysql_native_password by ’ 123456’;
  • 刷新权限:flush privileges;
mysql> create user 'slave'@'%' identified by '123456';
Query OK, 0 rows affected (8.55 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
Query OK, 0 rows affected (8.28 sec)

mysql> alter user 'slave'@'%' identified with mysql_native_password by ' 123456';
Query OK, 0 rows affected (1.21 sec)

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

mysql> show master status;
+------------

你可能感兴趣的:(MySQL,mysql,数据库)