mysql主从复制

本文详细介绍了MySQL主从复制的工作原理,包括如何在主服务器上开启二进制日志,数据同步机制,以及主从服务器之间的状态管理和配置步骤。重点讲解了如何设置授权、配置master.info和relay-log.info文件,确保数据一致性。
摘要由CSDN通过智能技术生成

mysql主从复制

主从复制原理

master: 主服务器

slave: 从服务器

这属于一种架构:

架构:architecture

架构师:architecturer

​ manger---->master

​ worker

​ node: 节点 一个节点就是一个服务器

集群:cluster

image-20231209145125263

1.首先在master开启二进制日志

2.master上数据发送变化,进行DML(增删改)操作的时候,会产生二进制日志

3.master上的dump线程会通知slave上的IO线程来拿二进制日志,IO线程拿到二进制日志后会写入到slave上的中继日志,然后sql线程会去读取新产生的中继日志,重演(重新执行)二进制日志里的操作,从而达到slave和master上的数据一模一样,实现数据的一致性。

架构的演变

为什么需要多台数据库服务器:

image-20231209150321588

一台顶不住,多来几台分担一下

主从复制操作

前提

准备两台服务器

主 master:192.168.153.136

从slave:192.168.153.132

开启master上的二进制日志

vim /etc/my.cnf
#开启二进制日志
log_bin
server_id = 1

'在从上面也开启'
log_bin
server_id = 2    

记得更改完要刷新服务
service mysqld restart

查看是否开启二进制日志

root@(none) 15:40  mysql>show variables like "log_bin";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)

root@(none) 15:41  mysql>

要保证两台服务器的基础数据一致

  • 在主服务器上把所有的库导出来

    [root@sc-master ~] mysqldump -uroot -p'Sanchuang123#' --all-databases >all_db.SQL
    mysqldump: [Warning] Using a password on the command line interface can be insecure.
    [root@sc-master ~] ls
    all_db.SQL  anaconda-ks.cfg  mysql-5.7.43-linux-glibc2.12-x86_64.tar.gz  onekey_install_mysql_binary_v3.sh
    [root@sc-master ~] scp all_db.SQL root@192.168.153.132:/root
    all_db.SQL                                                                   100%  889KB  64.8MB/s   00:00    
    [root@sc-master ~]# 
    
    
  • 在从服务器上再导入

    [root@sc-slave ~] mysql -uroot -p'Sanchuang123#' <all_db.SQL 
    mysql: [Warning] Using a password on the command line interface can be insecure.
    [root@sc-slave ~]# 
    
    

刷新一下flush logs

这样会产生一个新的日志,方便后面的操作

优化一下思路:清除所有的二进制日志

root@(none) 15:50  mysql>reset master;
Query OK, 0 rows affected (0.01 sec)

root@(none) 15:51  mysql>show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File                 | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| sc-master-bin.000001 |      154 |              |                  |                   |
+----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

root@(none) 15:51  mysql>

在master建立授权用户

用来给slave复制二进制命令

root@(none) 15:51  mysql>grant replication slave on *.* to 'renxj'@'192.168.153.%' identified by 'Sanchuang123#';
Query OK, 0 rows affected, 1 warning (0.00 sec)

root@(none) 15:56  mysql>

在slave上配置master info的信息

CHANGE MASTER TO MASTER_HOST='192.168.153.136',
MASTER_USER='renxj',
MASTER_PASSWORD='Sanchuang123#',
MASTER_PORT=3306,
MASTER_LOG_FILE='sc-master-bin.000001',
MASTER_LOG_POS=154;

查看slave服务器的状态

root@(none) 16:03  mysql>show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 192.168.153.136
                  Master_User: renxj
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: sc-master-bin.000001
          Read_Master_Log_Pos: 154
               Relay_Log_File: sc-slave-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: sc-master-bin.000001
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 154
              Relay_Log_Space: 154
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 0
                  Master_UUID: 
             Master_Info_File: /data/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: 
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

ERROR: 
No query specified

root@(none) 16:05  mysql>

启动slave

root@(none) 16:06  mysql>start slave;
Query OK, 0 rows affected (0.00 sec)

root@(none) 16:11  mysql>show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.153.136
                  Master_User: renxj
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: sc-master-bin.000001
          Read_Master_Log_Pos: 450
               Relay_Log_File: sc-slave-relay-bin.000003
                Relay_Log_Pos: 324
        Relay_Master_Log_File: sc-master-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

这两个都是yes就表示成功了

         Slave_IO_Running: Yes
        Slave_SQL_Running: Yes

测试主从复制的效果

主服务器:

root@(none) 16:16  mysql>create database yuanrd;
Query OK, 1 row affected (0.00 sec)

root@(none) 16:18  mysql>use yuanrd;
Database changed
root@yuanrd 16:18  mysql>create table t1(id int);
Query OK, 0 rows affected (0.01 sec)

root@yuanrd 16:19  mysql>insert into t1(id) values(1),(2);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

root@yuanrd 16:19  mysql>

从服务器:

root@(none) 16:16  mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| TENNIS             |
| gaohui             |
| gh                 |
| jiaojiao           |
| mysql              |
| performance_schema |
| sc                 |
| shiyuqian          |
| sys                |
| wangshuai          |
| yuanrd             |
+--------------------+
12 rows in set (0.00 sec)

root@(none) 16:18  mysql>use yuanrd;
Database changed
root@yuanrd 16:18  mysql>show tables;
Empty set (0.00 sec)

root@yuanrd 16:18  mysql>show tables;
+------------------+
| Tables_in_yuanrd |
+------------------+
| t1               |
+------------------+
1 row in set (0.00 sec)

root@yuanrd 16:19  mysql>select * from t1;
+------+
| id   |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.00 sec)

root@yuanrd 16:20  mysql>

查看网络socket

[root@sc-master ~] netstat -antplu|grep ES
tcp        0      0 192.168.153.136:22      192.168.153.1:50708     ESTABLISHED 2157/sshd: root@pts 
tcp        0     36 192.168.153.136:22      192.168.153.1:53162     ESTABLISHED 3464/sshd: root@pts 
tcp6       0      0 192.168.153.136:3306    192.168.153.132:50324   ESTABLISHED 3397/mysqld         
[root@sc-master ~]# 

tcp6 0 0 192.168.153.136:3306 192.168.153.132:50324 ESTABLISHED 3397/mysqld

查看谁连接我的mysql

root@(none) 16:22  mysql>show processlist;
+----+-------+-----------------------+------+-------------+------+---------------------------------------------------------------+------------------+
| Id | User  | Host                  | db   | Command     | Time | State                                                         | Info             |
+----+-------+-----------------------+------+-------------+------+---------------------------------------------------------------+------------------+
|  7 | renxj | 192.168.153.132:50324 | NULL | Binlog Dump |  827 | Master has sent all binlog to slave; waiting for more updates | NULL             |
|  8 | root  | localhost             | NULL | Query       |    0 | starting                                                      | show processlist |
+----+-------+-----------------------+------+-------------+------+---------------------------------------------------------------+------------------+
2 rows in set (0.00 sec)

root@(none) 16:25  mysql>

由此可以看出:slave是一直连接到master的,传输层使用tcp,因为建立了连接

使用的账号密码都是 renxj,今日复制二进制日志使用

master.info和relay-log.info存放在哪?

存放在数据目录下, /data/msql

几个问题

到底是主服务器主动通知从服务器来取二进制日志,还是从服务器每隔一段时间来拿二进制日志?

主服务器上的dump线程会通知slave上的IO线程来拿二进制日志

主服务器如何知道从服务器上已经有哪些数据了,需要从哪里开始给数据给从服务器?

服务器通过二进制日志(binary log)来实现从服务器的数据同步。

主服务器会将自己所执行的对数据库的修改操作记录在二进制日志中,这些操作包括INSERT、UPDATE、DELETE等。从服务器通过读取主服务器上的二进制日志,并将其中的操作重放在自己的数据库中来实现数据的同步。

保证基本数据的一致性,然后确定清除所有的二进制日志,记住对应的位置,文件

从服务器在连接主服务器时会告知主服务器自己的当前读取位置,主服务器会根据这个位置开始向从服务器发送数据。从服务器会根据接收到的数据进行重放,使得自己的数据库与主服务器保持一致。

在主服务器和从服务器建立复制关系后,从服务器会周期性地向主服务器发送一个心跳包,主服务器会返回一个包含当前主服务器的二进制日志位置的响应。从服务器根据这个位置来确定自己需要从哪个位置开始接收数据。

是否任何一台机器都可以充当从服务器,不需要验证就可以去拿主服务器的二进制日志?

必须有验证,不然会窃取数据

从服务器如何知道谁是它的主服务器呢?

在配置文件中的server_id号,唯一的标识

vim /etc/my.cnf
#开启二进制日志
log_bin
server_id = 1

master-info文件的作用 ?

记录 master 的ip,连接过去复制二进制日志的账号和密码,二进制日志文件的名字和位置号

relay-log.info文件的作用?

记录中继日志的文件名,记录中继日志的读取位置,记录主服务器的信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不冤不乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值