LNMP架构(10)mysql的主从复制原理及主从数据库配置

目录

一、MySQL 主从复制原理

二.主从数据库配置


一、MySQL 主从复制原理

主从复制(也称 AB 复制)允许将来自一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)。

复制是异步的 从站不需要永久连接以接收来自主站的更新。

根据配置,可以复制数据库中的所有数据库,所选数据库甚至选定的表。

MySQL中主从复制的优点包括:

  • 横向扩展解决方案 -在多个从站之间分配负载以提高性能。在此环境中,所有写入和更新都必须在主服务器上进行。但是,读取可以在一个或多个从设备上进行。该模型可以提高写入性能(因为主设备专用于更新),同时显着提高了越来越多的从设备的读取速度。
  • 数据安全性 - 因为数据被复制到从站,并且从站可以暂停复制过程,所以可以在从站上运行备份服务而不会破坏相应的主数据。
  • 分析 - 可以在主服务器上创建实时数据,而信息分析可以在从服务器上进行,而不会影响主服务器的性能。
  • 远程数据分发 - 可以使用复制为远程站点创建数据的本地副本,而无需永久访问主服务器。

Replication 的原理

LNMP架构(10)mysql的主从复制原理及主从数据库配置_第1张图片

前提是作为主服务器角色的数据库服务器必须开启二进制日志

  1. 主服务器上面的任何修改都会通过自己的 I/O tread(I/O 线程)保存在二进制日志 Binary log 里面。
  2. 从服务器上面也启动一个 I/O thread,通过配置好的用户名和密码,连接到主服务器上面请求读取二进制日志,然后把读取到的二进制日志写到本地的一个Relay log(中继日志)里面。
  3. 从服务器上面同时开启一个 SQL thread 定时检查 Relay
    log(这个文件也是二进制的),如果发现有更新立即把更新的内容在本机的数据库上面执行一遍。

需要注意的是:

  • 每个从服务器都会收到主服务器二进制日志的全部内容的副本。
  • 从服务器设备负责决定应该执行二进制日志中的哪些语句。
  • 除非另行指定,否则主从二进制日志中的所有事件都在从站上执行。
  • 如果需要,可以将从服务器配置为仅处理一些特定数据库或表的事件。

重要: 无法将主服务器配置为仅记录特定事件。

每个从站(从服务器)都会记录二进制日志坐标:

文件名
文件中它已经从主站读取和处理的位置。

由于每个从服务器都分别记录了自己当前处理二进制日志中的位置,因此可以断开从服务器的连接,重新连接然后恢复继续处理。

一主多从

如果一主多从的话,这时主库既要负责写又要负责为几个从库提供二进制日志。此时可以稍做调整,将二进制日志只给某一从,这一从再开启二进制日志并将自己的二进制日志再发给其它从。或者是干脆这个从不记录只负责将二进制日志转发给其它从,这样架构起来性能可能要好得多,而且数据之间的延时应该也稍微要好一些。工作原理图如下:
LNMP架构(10)mysql的主从复制原理及主从数据库配置_第2张图片

关于二进制日志

mysqld将数字扩展名附加到二进制日志基本名称以生成二进制日志文件名。每次服务器创建新日志文件时,该数字都会增加,从而创建一系列有序的文件。每次启动或刷新日志时,服务器都会在系列中创建一个新文件。服务器还会在当前日志大小达到max_binlog_size参数设置的大小后自动创建新的二进制日志文件 。二进制日志文件可能会比max_binlog_size使用大型事务时更大, 因为事务是以一个部分写入文件,而不是在文件之间分割。

为了跟踪已使用的二进制日志文件, mysqld还创建了一个二进制日志索引文件,其中包含所有使用的二进制日志文件的名称。默认情况下,它具有与二进制日志文件相同的基本名称,并带有扩展名.index。在mysqld运行时,不应手动编辑此文件。

二进制日志文件通常表示包含数据库事件的单个编号文件。

二进制日志 表示含编号的二进制日志文件集加上索引文件。

SUPER 权限的用户可以使用SET sql_log_bin=0语句禁用其当前环境下自己的语句的二进制日志记录

二.主从数据库配置

1.实验环境 : server2(172.25.254.2 master)server3(172.25.254.3 slave)

2.主数据库的配置

(1)vim /etc/my.cnf
[mysqld]
basedir=/usr/local/lnmp/mysql
datadir=/data/mysql
socket=/data/mysql/mysql.sock
#skip-grant-tables   
server-id=1        主机id号指定
log-bin=mysql-bin  日志文件名称指定
#
##
## include all files from the config directory
!includedir /etc/my.cnf.d


(2)[root@server2 mysql]# /etc/init.d/mysqld restart
(3)[root@server2 mysql]# mysql -p   
(4)mysql> create user 'repl'@'172.25.11.%' identified by '密码';    创建复制用户
 
     mysql> grant replication slave on *.* to 'repl'@'172.25.11.%';       授予用户权限
 
     mysql> flush privileges;

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

测试master是否创建成功   

[root@server3 bin]# mysql -h 172.25.254.2 -u repl -p    
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.21 Source distribution

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

3.slave的配置

(1)vim /etc/my.cnf
[mysqld]
basedir=/usr/local/lnmp/mysql
datadir=/data/mysql
socket=/data/mysql/mysql.sock
#skip-grant-tables
server-id=2      从机的id指定
#log-bin=mysql-bin

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
(2)[root@server3 mysql]# /etc/init.d/mysqld restart
(3)[root@server3 mysql]# mysql -p
mysql> change master to     #下面的参数信息需要从master中获取
    -> master_host='172.25.254.2',   
    -> master_user='repl',
    -> master_password='[email protected]',
    -> master_log_file='mysql-bin.000001',
    -> master_log_pos=156,
    -> get_master_public_key=1;
Query OK, 0 rows affected, 2 warnings (0.25 sec)

mysql> start slave;
Query OK, 0 rows affected (0.03 sec)
(4)mysql> start slave;    开启slave
Query OK, 0 rows affected (0.03 sec)

mysql> show slave status\G;    查看是否同步master的数据  
            Slave_IO_Running: Yes    看到这两个参数表明同步成功
            Slave_SQL_Running: Yes

4.测试主从复制是否成功

在主机上创建一个库 
mysql> create database summer;
Query OK, 1 row affected (0.11 sec)

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

在slave中看

mysql> show slave status\G;
              Read_Master_Log_Pos: 347
               Relay_Log_File: server3-relay-bin.000002
                Relay_Log_Pos: 515
               Relay_Master_Log_File: mysql-bin.000001     信息和master上面一致
               Slave_IO_Running: Yes
               Slave_SQL_Running: Yes


mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| summer             |   建的库在slave中出现
| sys                |
+--------------------+
5 rows in set (0.05 sec)

 

你可能感兴趣的:(企业自动化运维架构)