MySQL主从复制(一主一从)

MySQL主从复制(一主一从)

什么是主从复制

MySQL主从复制是指数据可以从一个MySQL数据库服务器的主节点复制到一个或多个从节点。主节点记录了所有的写操作,并将这些写操作记录到二进制日志(binary log)中。从节点通过连接主节点,获取并应用这些二进制日志,从而实现数据的复制。

MySQL默认采用异步复制方式,这意味着主节点执行写操作后,并不会等待从节点应用这些操作,而是立即返回给客户端。从节点会异步地接收并应用主节点的二进制日志,以保持与主节点数据的一致性。

从节点可以复制主节点中的所有数据库,也可以选择复制特定的数据库或特定的表。通过配置主节点和从节点的参数,可以进行相应的设置。

主从复制的原理

image-20230714173923619

Master服务器会记录数据的改变,并将这些改变写入二进制binary log日志

Slave服务器会定期检查Master的二进制日志,如果发现改变,就会请求Master发送二进制事件Master会开启一个I/O线程,将二进制事件发送给Slave并保存到从节点本地的中继日志中

从节点会启动SQL线程,从中继日志中读取二进制日志并在本地重放,使从节点的数据和Master节点保持一致

最后,I/O 线程和SQL 线程会进入睡眠状态,等待下一次被唤醒

主从复制的优点

  • 提高可用性:当主节点发生故障时,可以快速切换到从节点,确保数据库的持续可用性

  • 负载均衡:将写的请求分发到主节点上,将读操作分发到从节点上,减轻主节点的负载,提高性能

  • 数据备份:从节点可以用作主节点的备份,以防止数据丢失

准备工作

准备好两台服务器,分别安装MySQL

IP 类型
192.168.200.10 主节点
192.168.200.20 从节点

第一步:修改主机名

修改192.168.200.10的主机名为master

修改192.168.200.20的主机名为slave

[root@master ~]# hostname -I
192.168.200.10 
[root@localhost ~]# hostnamectl set-hostname master
[root@localhost ~]# bash
[root@master ~]# 

[root@slave ~]# hostname -I
192.168.200.20 
[root@localhost ~]# hostnamectl set-hostname slave
[root@localhost ~]# bash
[root@slave ~]# 

第二步:使用yum安装

[root@master ~]# yum install -y mariadb-server mariadb
[root@slave ~]# yum install -y mariadb-server mariadb

第四步:开启mysql服务并设置开机自启

[root@master ~]# systemctl enable mariadb --now
[root@slave ~]# systemctl enable mariadb --now
# 查看状态
[root@slave ~]# systemctl status mariadb
  
[root@slave ~]# systemctl status mariadb

第五步:查看是否暴露了端口

[root@master ~]# netstat -tlnp |grep 3306
tcp        0      0 0.0.0.0:3306   0.0.0.0:*       LISTEN      15802/mysqld    

[root@slave ~]# netstat -tlnp |grep 3306
tcp        0      0 0.0.0.0:3306       0.0.0.0:*     LISTEN      15991/mysqld   

第六步:初始化数据库并测试登录

[root@master ~]# mysql_secure_installation 
[root@slave ~]#  mysql_secure_installation 

[root@master ~]# mysql -uroot -p000000
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '000000';flush privileges;
# root 用户授予所有数据库的所有权限,并设置密码为 '000000'
MariaDB [(none)]> exit;

[root@slave ~]# mysql -uroot -p000000
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '000000';flush privileges;
MariaDB [(none)]> exit;

第七步:防火墙放行3306端口

[root@master ~]# firewall-cmd --zone=public --add-port=3306/tcp --permanent && firewall-cmd --reload
success
success

[root@slave ~]#  firewall-cmd --zone=public --add-port=3306/tcp --permanent && firewall-cmd --reload
success
success

在SQLyog连接

image-20230714182151902

image-20230714182158683

配置主数据库Master

修改MySQL数据库的配置文件

[root@master ~]# vim /etc/my.cnf
[mysqld]
# 添加如下两行信息
server-id=10
log_bin

重启mysql服务

[root@master ~]# systemctl restart mariadb

创建用于复制的账户并授权

授权从节点进行主从复制。执行该命令后,从节点用户 csq 将被授予复制权限,并可以使用密码 000000 连接到主节点进行复制。

MariaDB [(none)]> grant replication slave on *.* to 'csq'@'192.168.200.%' identified by '000000';

登录mysql

显示主节点上的二进制日志文件列表

记住下面的Log_name 和File_size,配置从数据库要用

MariaDB [(none)]> show master logs;
+--------------------+-----------+
| Log_name           | File_size |
+--------------------+-----------+
| mariadb-bin.000001 |       398 |
+--------------------+-----------+
# Log_name 列显示二进制日志文件的名称
# File_size 列显示二进制日志文件的大小

配置从数据库Slave

修改mysql数据库配置文件

[root@slave ~]# vim /etc/my.cnf
[mysqld]
# 添加如下信息
server-id=20

重启mysql服务

[root@slave ~]# systemctl restart mariadb

登录mysql

配置连接主数据库的信息

# 因为配置主数据库的信息参数有很多当你忘记的时候可以查看如下命令
mysql> help change master to;

image-20230714190102613

我们可以复制稍微修改一下

这里要设置刚刚创建的用户账号信息,以及主数据库的IP

MariaDB [(none)]> CHANGE MASTER TO
    ->   MASTER_HOST='192.168.200.10',
    ->   MASTER_USER='csq',
    ->   MASTER_PASSWORD='000000',
    ->   MASTER_PORT=3306,
    ->   MASTER_LOG_FILE='mariadb-bin.000001',
    ->   MASTER_LOG_POS=398;
# MASTER_LOG_FILE 和  MASTER_LOG_POS 
# 这两个参数就是指定主数据库的二进制日志文件名称和位置
# 从节点可以确定从哪个位置开始复制数据

启动从节点的主从复制过程。

MariaDB [(none)]> start slave;
# 执行该命令后,从节点将开始连接主节点,并开始复制主节点上的二进制日志

查看从数据库的状态

MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.200.10
                  Master_User: csq
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mariadb-bin.000001
          Read_Master_Log_Pos: 398
               Relay_Log_File: mariadb-relay-bin.000002
                Relay_Log_Pos: 531
        Relay_Master_Log_File: mariadb-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              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: 398
              Relay_Log_Space: 827
              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: 0
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: 10

测试

主数据库创建一个数据库CSQ

MariaDB [(none)]> create database CSQ;

从数据库查看

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| CSQ                |
| mysql              |
| performance_schema |
+--------------------+

SQLyog查看

image-20230714191624035

image-20230714191646058

搭建完毕

猜你喜欢

转载自blog.csdn.net/qq_52089863/article/details/131730574