实现↝Mysql数据库主从复制搭建与同步

这篇具有很好参考价值的文章主要介绍了实现↝Mysql数据库主从复制搭建与同步。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数据库的主从搭建,数据库--mysql篇,网络安全&运维,数据库,mysql,msyql主从复制,linux,运维,服务器,centos

🔻 一、mysql 同步复制有关概述

⛳ 前言、何为主从复制

一般数据库都是读取压力大于写数据压力,主从复制即为了实现数据库的负载均衡和读写分离。通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,主服务器只负责写,而从服务器只负责读。

如生产环境中,使用redis数据库作为缓存数据库,用户访问业务数据时,先从缓存数据库查询,如果缓存数据库没有,再从业务数据库读取。
数据库的主从搭建,数据库--mysql篇,网络安全&运维,数据库,mysql,msyql主从复制,linux,运维,服务器,centos

⛳ 1.1 mysql支持的复制方式

  • 基于语句的复制--Statement(Statement-Based Replication,SBR): 在主服务器上执行的sql语句,在从服务器上执行同样的语句。mysql默认采用基于语句的复制,效率比较高。一旦发现没法精确复制时,会自动选择基于行的复制,每一条会修改数据的sql都会记录在 binlog 中。

  • 基于行的复制--Row(Row-Based Replication,RBR):把改变的内容复制过去,仅保存哪条记录被修改。而不是把命令在从服务器上执行一遍, 从mysql5.0开始支持。

  • 混合类型的复制--Mixed(Mixed-Based Replication,MBR): 默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制,Statement 和 Row 的混合体。

  • 通过alter user root identified by '新密码';

⛳ 1.2 mysql支持的复制类型

1.2.1🍁异步复制

  • mysql数据库默认的复制方式
  • 异步复制指主库以异步的方式同步数据到一个从库或多个从库中。
  • 主节点不会主动推送数据到从节点,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理。
  • 主节点如果掉了,此时主节点上已经提交的事务可能并没有传到从节点上,如果此时,强行将从节点提升为主节点,可能导致新主节点上的数据不完整

1.2.2🍁同步复制

  • 同步复制是mysql主节点特有的复制方式,当主库执行完一个事务,然后所有的从库都复制了该事务并成功执行完才返回成功信息给客户端。

1.2.3🍁半同步复制

  • 介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回成功信息给客户端
  • 只能保证主库的Binlog至少传输到了一个从节点上,否则需要等待直到超时时间,然后切换成异步模式再提交。

1.2.4🍁[图解]-异步复制 / 同步复制 / 半同步复制

数据库的主从搭建,数据库--mysql篇,网络安全&运维,数据库,mysql,msyql主从复制,linux,运维,服务器,centos

⛳ 1.3 mysql复制解决的问题

  • 数据分布 (Data distribution )—提高数据操作自然并行度,以达到最优的执行效率的目的
  • 负载平衡(load balancing)—主服务器只负责写,而从服务器只负责读
  • 备份(Backups)—灾难恢复,对损坏的数据进行恢复和还原
  • 高可用性和容错行( High availability and failover)—确保 mysql 数据库在故障和异常情况下仍然能够提供可靠的服务

⛳ 1.4 mysql复制是如何工作的

复制整体来说有 3 个步骤:

  • master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events)
  • slavemaster的binary log events拷贝到它的中继日志(relay log)
  • slave重做中继日志中的事件,将改变反映它自己的数据
    数据库的主从搭建,数据库--mysql篇,网络安全&运维,数据库,mysql,msyql主从复制,linux,运维,服务器,centos

🔻 二、mysql 同步复制搭建

⛳ 2.1 主从节点准备

克隆两台安装好mysql8.0的虚拟机,并修改复制的db-server02(从节点)mysql server的UUID。

[root@db-server ~]# vi /var/lib/mysql/auto.cnf

####修改UUID
[auto]
server-uuid=83822642-0030-11ee-a2cc-000c29c2e1ad

####重启mysql服务
[root@db-server ~]# systemctl restart mysqld
mysql服务器 Ip
db-server(主节点) 192.168.181.101
db-server02(从节点) 192.168.181.102

⛳ 2.2 主节点配置

2.2.1 🍁 创建log-bin二进制日志存储路径

###创建二进制日志存储路径
[root@db-server /]# mkdir -p -v /var/log/mysql/mysql-bin
mkdir: created directory ‘/var/log/mysql/mysql-bin’

###赋权mysql用户组合mysql用户
[root@db-server ~]# chown -R mysql:mysql /var/log/mysql
[root@db-server ~]# chown -R mysql:mysql /var/log/mysql/mysql-bin

数据库的主从搭建,数据库--mysql篇,网络安全&运维,数据库,mysql,msyql主从复制,linux,运维,服务器,centos

2.2.2 🍁 修改my.cnf配置文件

【必须参数】:

####添加内容
[mysqld]
#配置唯一的服务器ID,一般使用IP最后一位
server-id=1
# 设置需要复制的数据库,默认全部记录。比如: binlog-do-db=db_master_slave
binlog-do-db=db_master_slave

#开启log-bin二进制日志,指名路径。如: 本地的路/var/log/mysql/mysql-bin
log-bin=/var/log/mysql/mysql-bin
#设置binlog格式
binlog_format=STATEMENT

数据库的主从搭建,数据库--mysql篇,网络安全&运维,数据库,mysql,msyql主从复制,linux,运维,服务器,centos

【可选参数】:

# 0表示读写 (主机),1表示只读(从机)
read-only=0

#设置日志文件保留的时长,单位是秒
binlog_expire_logs_seconds=6000

#控制单个二进制日志大小。此参数的最大和默认值是1GB
max_binlog_size=20

#设置不要复制的数据库
binlog-ignore-db=test

#设置需要复制的数据库,默认全部记录。比如: binlog-do-db=dbtest01
binlog-do-db=需要复制的主数据库名字

#设置binlog格式
binlog_format=STATEMENT

2.2.3 🍁 重启mysql服务,检查是否生效

[root@db-server mysql]# systemctl restart mysqld
[root@db-server mysql]# systemctl status mysqld
[root@db-server mysql]# mysql -u root -p

mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
1 row in set (0.02 sec)

mysql> 

###开启log-bin二进制日志
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)

mysql> 
##skip_networking--tcp/ip协议通信,默认是OFF关闭状态,启用后主从将无法通信
mysql> show variables like '%skip_networking%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| skip_networking | OFF   |
+-----------------+-------+
1 row in set (0.00 sec)

mysql> 

2.2.4 🍁 主节点创建主从复制账号

  • mysql5.7版本:
mysql> grant replication slave on *.*  to  'slave1'@'%'  identified by 'Zyl@123456';  ###用户地址可以指定从机IP192.168.181.102
  • mysql8.0版本:
mysql> create user 'slave1'@'%' identified by 'Zyl@123456'; 
Query OK, 0 rows affected (0.02 sec)

mysql>grant replication slave on *.*  to  'slave1'@'%';
Query OK, 0 rows affected (0.01 sec)

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

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

数据库的主从搭建,数据库--mysql篇,网络安全&运维,数据库,mysql,msyql主从复制,linux,运维,服务器,centos

2.2.5 🍁 查看主节点的二进制日志的名称

  • File和Position两个参数需要在从库配置中使用。
mysql> show master status;
+------------------+----------+-----------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB    | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+-----------------+------------------+-------------------+
| mysql-bin.000004 |      157 | db_master_slave |                  |                   |
+------------------+----------+-----------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> 

⛳ 2.3 从节点配置

2.3.1 🍁 修改my.cnf配置文件

【必须参数】:

[mysqld]
#配置唯一的服务器ID,一般使用IP最后一位
server-id=2

###开启中继日志,从主服务器上同步日志文件记录到本地
relay-log=relay-log-bin

【可选参数】:

[mysqld]
###定义中继日志文件的位置和名称
relay-log-index=slave-relay-bin.index

2.3.2 🍁 在从节点配置需要复制的主机

####语法##
change master to 
master_host='主节点IP',
master_user='主节点用户名',
master_password='用户密码',
master_log_file='mysql-bin.具体数字',
master_log_pos=具体值;

####本环境配置##

mysql> change master to master_host='192.168.181.101',master_user='slave1',master_password='Zyl@123456',master_log_file='mysql-bin.000004',master_log_pos=157 ;
Query OK, 0 rows affected, 8 warnings (0.06 sec)

mysql> 

数据库的主从搭建,数据库--mysql篇,网络安全&运维,数据库,mysql,msyql主从复制,linux,运维,服务器,centos

2.3.3 🍁 在从节点开启slave同步,查看同步状态

####开启slave同步
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.05 sec)

####查看同步状态
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 192.168.181.101
                  Master_User: slave1
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000004
          Read_Master_Log_Pos: 157
               Relay_Log_File: relay-log-bin.000006
                Relay_Log_Pos: 373
        Relay_Master_Log_File: mysql-bin.000004
             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: 

mysql> 

数据库的主从搭建,数据库--mysql篇,网络安全&运维,数据库,mysql,msyql主从复制,linux,运维,服务器,centos

⛳ 主要看这两个参数,两个参数的值都为Yes,即主从配置搭建成功:

  • Slave_IO_Running:IO线程,负责与主机的io通信
  • Slave_SQL_Running:SQL线程,责自己的slave MySQL进程

如果报错Slave failed to initialize relay_log info structure from the repository,需要清理之前的relay_log,重新启用新的relay_log即可。

reset slave;

⛳ 2.4 主节点创建数据库测试

  • 主节点配置的db_master_slave
####主节点创建数据库db_master_slave
mysql> create database db_master_slave;
Query OK, 1 row affected (0.01 sec)

mysql> use db_master_slave
Database changed
mysql> 

####创建表
mysql> CREATE TABLE `tab1`  (
    ->   `id` int NOT NULL,
    ->   `name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
    ->   `class` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
    ->   PRIMARY KEY (`id`) USING BTREE
    -> ) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;
Query OK, 0 rows affected, 6 warnings (0.02 sec)

mysql> 

####插入测试数据
mysql> INSERT INTO `tab1` VALUES (1001, '曹操', '1班');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO `tab1` VALUES (1002, '张飞', '1班');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `tab1` VALUES (1003, '项羽', '3班');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `tab1` VALUES (1004, '刘备', '2班');
Query OK, 1 row affected (0.00 sec)

mysql> 

⛳ 2.5 从节点查看同步数据

2.5.1 🍁 数据测试-主节点插入数据,从节点查看

mysql> show databases;

数据库的主从搭建,数据库--mysql篇,网络安全&运维,数据库,mysql,msyql主从复制,linux,运维,服务器,centos

###查看tab1表数据
mysql> select * from tab1;
+------+--------+-------+
| id   | name   | class |
+------+--------+-------+
| 1001 | 曹操   | 1|
| 1002 | 张飞   | 1|
| 1003 | 项羽   | 3|
| 1004 | 刘备   | 2|
+------+--------+-------+
4 rows in set (0.00 sec)

mysql> 

2.5.2 🍁 数据测试-主节点删除数据,从节点查看

数据库的主从搭建,数据库--mysql篇,网络安全&运维,数据库,mysql,msyql主从复制,linux,运维,服务器,centos
数据库的主从搭建,数据库--mysql篇,网络安全&运维,数据库,mysql,msyql主从复制,linux,运维,服务器,centos

⛳ 2.6 主从同步关闭和开启

  • 🍁 停止主从服务复制的功能------从机执行
####开启slave同步
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.05 sec)


####关闭slave同步
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.03 sec)

🔻 三、mysql 同步复制延迟问题

⛳ 3.1 从节点配置主从同步要求

  • 🍁 读库与写库数据一致(最终一致)
  • 🍁 写数据必须写到写库
  • 🍁 读数据不一定必须到读库

主从同步复制的内容是二进制文件,在传输过程中会存在主从延迟的情况,会导致用户在从库读取的数据不是最新数据----->即数据不一致性问题。

⛳ 3.2 如何解决【数据不一致性】问题

  • 🍁 异步复制—master执行操作后直接返回给client结果,不再等待slave反馈同步信息,但这种方式数据一致性最弱。
  • 🍁 半同步复制—只要有一个slave复制了该事务并成功执行完就返回成功信息给client,这种方式提高了数据一致性,但是增加了网络延迟时间,降低了主库写的效率。
  • 组复制(MGR)----mysql 5.7.17 推出的新的数据复制技术,基于Paxos协议复制,很好的弥补了前面两种复制的不足。

数据库的主从搭建,数据库--mysql篇,网络安全&运维,数据库,mysql,msyql主从复制,linux,运维,服务器,centos文章来源地址https://www.toymoban.com/news/detail-689806.html

🔻四、总结—温故知新

❓ 了解何为主从复制
❓ mysql支持的复制类型之间区别,以及解决的问题
❓ mysql主从复制搭建
❓ mysql主从复制延迟及解决方案

👈【上一篇】
💖The End💖 点点关注,收藏不迷路💖
【下一篇】👉

到了这里,关于实现↝Mysql数据库主从复制搭建与同步的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL数据库——主从复制

    在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。有点类似

    2024年02月11日
    浏览(98)
  • MySQL数据库 主从复制与读写分离

    读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 因为数据库的“写”(写10000条数据可能要3分钟)操作是比较耗时的。 但是数据库

    2024年02月10日
    浏览(47)
  • 【MySQL数据库】主从复制与读写分离

    读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 因为数据库的“写”(写10000条数据可能要3分钟)操作是比较耗时的。 但是数据库

    2024年02月11日
    浏览(59)
  • 【数据库】mysql主从复制与读写分离

      读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE ),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。   因为数据库的\\\"写”(写10000条数据可能要3分钟)操作是比较耗时的。   

    2024年02月11日
    浏览(71)
  • 【数据库七】MySQL主从复制与读写分离

    读写分离,基本的原理是让主数据库处理事务性增、改、删操作 (insert、update、delete),而 从数据库处理select查询操作 。 数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库 。 因为数据库的“写”(写10000条数据可能要3分钟)操作是比较耗时的。 但是数据

    2024年02月11日
    浏览(59)
  • Linux系统中MySQL 数据库的主从同步

    在主数据库服务器上配置: 编辑主数据库服务器的配置文件(my.cnf) : 打开 MySQL 配置文件,一般路径为 /etc/my.cnf 或 /etc/mysql/my.cnf。 确保以下参数已启用或配置正确: 注: 一定是[mysqld]代码块中 创建用于复制的用户 : 登录到 MySQL 控制台: mysql -u root -p 创建用于复制的用户

    2024年03月23日
    浏览(58)
  • 发现Mysql的主从数据库没有同步,差点凉凉了

    摘要: 今天发现Mysql的主从数据库没有同步,瞬间整个人头皮发麻。 本文分享自华为云社区《糟了,生产环境数据竟然不一致,人麻了!》,作者:冰 河 。 今天发现Mysql的主从数据库没有同步 先上Master库: 查看下进程是否Sleep太多。发现很正常。 也正常。 再到Slave上查看

    2023年04月17日
    浏览(89)
  • MySQL高级第十七篇:数据库主从复制原理及保证数据一致性

    在实际工作中,我们常常将Redis作为缓存与MySQL来配合使用,当有请求的时候,首先会从缓存中进行查找,如果存在就直接取出,如果不存在再访问数据库。 这样就提升了读取的效率,也减少了对后端数据库的访问压力。 此外,对于一般数据库应用而言,都是 读多写少 的,

    2023年04月25日
    浏览(77)
  • Mysql主从数据库搭建(一主两从)

    目录 1、服务器规划 2、主从同步流程 3、主从搭建 3.1、master节点上配置文件修改 3.2、master节点创建同步用户和权限 3.3、slave1和slave2节点配置文件修改 3.4、slave1和slave2节点执行同步任务 3.5、解决虚拟机克隆导致mysql所有服务器uuid都一样的问题 4、bin-log相关说明 5、主从同步注

    2024年02月11日
    浏览(47)
  • Docker 容器搭建mysql 集群(主从数据库)

    目录 1.背景         2.设备及软件版本 3.开始搭建(这里不介绍安装docker及mysql) 3.1创建主数据库容器(master) 3.2查看容器是否创建成功 3.3进入修改容器下的/etc/my.cnf文件 3.3.1先拷贝my.cnf到容器外修改完再覆盖容器原来的my.cnf文件 3.4重启mysql容器使配置文件生效 3.5查看是否

    2024年02月08日
    浏览(101)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包