MySQL 主从复制

文章目录

  • 一、需要主从复制原因与改造方法
    • 1.1、原因
    • 1.2、改造方法
    • 1.3、更高级解决方案
  • 二、MySQL 主从复制原理
    • 2.1、MySQL 支持的复制类型
    • 2.2、复制的工作过程
  • 三、案例实施
    • 3.1、环境准备
      • 3.1.1、主机
      • 3.1.2、拓扑图
      • 3.1.3、实验目的
    • 3.2、实验过程
      • 3.2.1、主节点建立时间同步环境
      • 3.2.2、从节点上进行时间同步
      • 3.2.3、安装MySQL 数据库
      • 3.2.4、配置主服务器
      • 3.2.5、配置从服务器
      • 3.2.6、验证

一、需要主从复制原因与改造方法

1.1、原因

在企业网站中,后端MySQL数据库只有一台时,会有以下问题:
遇到单点故障,服务不可用
无法处理大量的并发数据请求
数据丢失将会造成很大损失
MySQL 主从复制_第1张图片

1.2、改造方法

增加MySQL数据库服务器,对数据进行备份,形成主备
确保主备MySQL数据库服务器数据是一样的
主服务器宕机了,备份服务器继续工作,数据有保障

MySQL主从复制与读写分离是密切相关的
MySQL 主从复制_第2张图片

1.3、更高级解决方案

通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力
MySQL 主从复制_第3张图片

二、MySQL 主从复制原理

首先要部署主从复制,只有主从复制完成了,才能在基础上进行数据的读写分离

2.1、MySQL 支持的复制类型

基于语句的复制(默认)
在主服务器上执行的语句,从服务器执行同样的语句

基于行的复制
把改变的内容复制到从服务器

混合类型的复制
一旦发现基于语句无法精确复制时,就会采用基于行的复制

2.2、复制的工作过程

(1)在每个事务更新数据完成之前,Master在二进制日志记录这些改变。写入二进制日志完成后,Master通知存储引擎提交事务
(2)Slave将Master的Binary log复制到其中继日志。首先,Slave开始一个工作线程——I/O线程,I/O线程在Master上打开一个普通的连接,然后开始Binlog dump process。Binlog dump process从Master的二进制日志中读取事件,如果已经跟上Master,他会睡眠并等待Master产生新的事件。I/O线程将这些事件写入中继日志。
(3)SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新Slave的数据,使其与Master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
复制过程有一个很重要的限制,即复制在Slave上是串行化的,也就是说Master上的并行更新操作不能再Slave上并行操作。
MySQL 主从复制_第4张图片

三、案例实施

3.1、环境准备

实验环境防火墙和核心防护均已关闭

systemctl stop firewalld.service 
setenforce 0

3.1.1、主机

三台centos7.6 主机
一台主mysql服务器 ip地址为20.0.0.25
两台从mysql服务器 ip地址为20.0.0.23和20.0.0.22

3.1.2、拓扑图

MySQL 主从复制_第5张图片

3.1.3、实验目的

实现主从复制

3.2、实验过程

3.2.1、主节点建立时间同步环境

安装配置NTP

[root@localhost ~]# yum -y install ntp
[root@localhost ~]# vi /etc/ntp.conf           //最后面添加这两行
server 127.127.1.0
fudge 127.127.1.0 stratum 8
[root@localhost ~]# systemctl restart ntpd


3.2.2、从节点上进行时间同步

[root@localhost mysql]# yum -y install ntpdate
[root@localhost mysql]# ntpdate 20.0.0.25

两台从服务器都如此操作

3.2.3、安装MySQL 数据库

三台主机都需要安装MySQL 数据库。安装数据库方法可以参考我以前博客
https://blog.csdn.net/weixin_48191211/article/details/108320638

3.2.4、配置主服务器

(1)修改/etc/my.cnf配置文件,增加服务器id,配置二进制日志选项

[root@localhost ~]# vi /etc/my.cnf
server-id = 11                          //修改
log-bin=master-bin                      //增加下两行
log-slave-updates=true
[root@localhost ~]# systemctl restart mysqld.service 

(2)登陆mysq,给从服务器授权

[root@localhost ~]# mysql -uroot -p
Enter password: 

mysql> GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'20.0.0.%' IDENTIFIED BY '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)

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

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

3.2.5、配置从服务器

(1)修改/etc/my.cnf配置文件,增加服务器id,配置二进制日志选项

[root@localhost ~]# vim /etc/my.cnf
[root@localhost ~]# systemctl restart mysqld.service
server-id = 22                               //修改    另一台改成33,三个id不能相同
relay-log=relay-log-bin                      //增加下两行
relay-log-index=slave-relay-bin.index
[root@localhost ~]# systemctl restart mysqld.service

(2)登陆mysql,配置同步

[root@localhost ~]# mysql -uroot -p
Enter password: 
mysql> change master to master_host='20.0.0.25',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=599;
Query OK, 0 rows affected, 2 warnings (0.00 sec)

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

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 20.0.0.25
                  Master_User: myslave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 599
               Relay_Log_File: relay-log-bin.000002
                Relay_Log_Pos: 321
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes             //开启
             Slave_SQL_Running: Yes            //开启
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 

3.2.6、验证

(1)主服务器创建一个库

[root@localhost ~]# mysql -uroot -p
Enter password: 

mysql> create database lx
    -> ;

(2)两台从服务器查看是否同步

[root@localhost ~]# mysql -uroot -p
Enter password: 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| lx                 |          //同步成功
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

你可能感兴趣的:(数据库,理论,实验,mysql)