01-MySQL主从复制

问题导入

  • 在之前项目的基础功能实现中,后台管理和移动端在进行数据访问的时候,都是直接操作数据库MySQL。此时的系统有且仅有一台MySQL服务器,则可能会出现如下问题
  • ①、读和写所有压力都由一台数据库承担,压力大
  • ②、数据库服务器磁盘损坏导致数据丢失,单点故障
  • 解决方案
  • 很简单,一台服务器撑不住,那就多台服务器
  • 为了解决上述提到的两个问题,我们可以准备两台MySQL,一台主(Master)服务器,一台从(Slave)服务器 ,主库的数据变更(写、更新、删除这些操作),需要同步到从库中(主从复制)。而用户在访问我们项目时 ,如果是写操作(insert、update、delete),则直接操作主库;如果是读(select)操作,则直接操作从库(在这种读写分离的结构中,从库是可以有多个的),这种结构我们称为 读写分离

一、MySQL主从复制

  • MySQL主从复制是一个异步的复制过程,底层是基于MySQL数据库自带的 二进制日志功能,就是一台或多台MySQL数据库( Slave,从库)从另一台MySQL数据库( master,即从库)进行日志的复制,然后再解析日志并应用到自身。 最终实现从库数据和主库的数据保持一致

PS:MySQL主从复制是MySQL数据库自带功能,无需借助第三方工具
二进制日志

  • 二进制日志(binlog)记录了所有的DDL(数据定义语言)语句和DML(数据操纵语言)语句,但是不包括数据查询语句。此日志对于灾难时的数据恢复有着极其重要的作用,MySQL的主从复制,就是通过binlog实现。默认MySQL是未开启该日志的

1.1、MySQL主从复制原理

  • MySQL主从复制原理,如下图所示
  • MySQL主从复制的过程
  • ①、Master节点将数据变更写入二进制日志(binary log)
  • ②、slave将master的binary log拷贝到它的中继日志(relay log)
  • ③、slave节点重做中继日志中的事件,完成数据的同步更新
  • 过程原理
  • ①、主库开启二进制日志文件,然后主库增删改操作(DML、DDL)都会记录到二进制日志文件中
  • ②、从库通过IO thread入去二进制日志写入中继日志文件中
  • ③、从库通过SQL thread读取中继日志,把数据同步到从库中

1.2、案例环境搭建

1.2.1、前置工作

  • Step1:
  • 准备两台服务器(没条件可以使用虚拟机),并且在服务器中安装MySQL,服务器的信息如下所示
  • 数据库 IP地址 数据库版本 Master(主库) 192.168.222.135 5.7.25 Slave(从库) 192.168.222.140 5.7.25

PS:虚拟机克隆结束之后,还需要更改克隆机子的IP地址

①、cd /etc/sysconfig/network-scripts
②、vim ifcfg-ens33
③、修改IPADDR字段的值为为另一个自己网关的ip地址
  • Step2
  • 开放3306端口,或者关闭防火墙
方式一:开放3306端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent  // 永久开放3306端口

firewall-cmd --zone=public --list-ports // 查看端口是否开放

方式二:关闭防火墙
system stop firewalld   // 关闭防火墙

system disable firewalld    // 关闭开机自动启动

  • Step3
  • 启动数据库服务
  • systemctl start mysqld
  • 登录MySQL,验证是否正常启动(可以正常登录即可,这里就不多演示)

1.2.2、主库配置

  • Step1:修改MySQL数据库的配置文件 /etc/my.cnf
log-bin=mysql-bin   #启用二进制日志
server-id=200       #设置服务器的唯一id
  • 上述配置需要配置在mysqld下
  • Step2:重启MySQL服务
  • systemctl restart mysqld
  • Step3:创建数据同步的用户并授权
  • 前置工作:查看数据库的密码复杂程度
    • MEDIUM等级的密码校验策略要求密码组成为:数字、小写字母、大写字母、特殊字符、长度至少8位 (如果觉得麻烦可以更改校验策略的等级)
  • 登录MySQL,并执行如下指令,创建用户并授权
GRANT REPLICATION SLAVE ON *.* to 'coolman'@'%' identified by 'Root@root';
  • 这句SQL的作用是 创建一个用户 coolman ,密码为 Root@root ,并且给该用户授予 REPLICATION SLAVE 权限。常用于建立复制时候所需要用到的用户权限,也就是slave必须被master授权具有该权限的用户,才能通过该用户复制。
  • Step4:登录MySQL数据库,查看master同步状态
  • 执行如下SQL,记录下结果中 FilePosition的值
  • show master status;
  • *PS:上面的SQL作用是查看Master的状态,执行完此SQL后不要再执行任何操作

1.2.3、从库配置

  • Step1:修改MySQL数据库的配置文件 /etc/mycnf
  • server-id=201 #服务器唯一id
  • PS:由于该Linux是复制出来的,MySQL中还有一个 server_uuid是一样的,需要修改,否则会引起冲突
    • vim /var/lib/mysql/auto.cnf随意修改后面的字符串即可)
  • Step2:重启MySQL服务
  • systemctl restart mysqld :重启服务
  • stop slave; :登录数据库后,停止从库的服务
  • Step3:登录MySQL数据库,设置主库的地址以及同步位置
change master to master_host='192.168.222.135', master_user='coolman', master_password='Root@123', master_log_file='mysql-bin.000001', master_log_pos=440;

start slave;    # 开启从库服务
  • 参数说明:
    • 参数名称 含义 master_host 主库的IP地址 master_user 访问主库进行主从复制的用户名(在主库中创建的用户) master_password 访问主库进行主从复制的用户对应的密码 master_log_file 指定从哪个日志文件开始同步(上述查询的master状态中的file和position) master_log_pos 指定从日志文件的哪个位置开始同步
  • Step4:查看从数据库的状态
  • show slave status \G;
    • MySQL命令行中的 \G表示将查询结果进行按列打印,可以使每个字段打印到单独的行(即将查到的结构旋转90度变成纵向)
  • *通过状态信息中的Slave_IO_running和Slave_SQL_running可以看出主从同步是否就绪,如果这两个参数都是Yes,表示主从同步已经配置完成。

1.3、测试

  • 主从复制的环境已经搭建好了,那么可以通过Navicat等MySQL连接工具,连接上数据库后,进行测试
  • 测试的时候,我们只需要在主数据库Master执行操作,查看从数据库Slave中是否会将数据同步过去即可
  • PS:增删改的操作一定不能在从数据库操作,否则有很大可能Slave_SQL_Running线程被终止,从而导致主从复制失败(如果真出现了两个线程中的一个被终止之后,解决方案可以参考该[CSDN博客][https://blog.csdn.net/u013829518/article/details/91869547]
  • 测试1:执行DDL操作(创建数据库)
  • 创建数据库
    • 主库
    • 从库
  • 创建表
    • 主库
    • 从库
  • 测试2:执行DML操作(增删改)
  • 增加
    • 主数据库
    • 从数据库
  • 删除
    • 主数据库
    • 从数据库
  • 修改
    • 主数据库
    • 从数据库

Original: https://www.cnblogs.com/OnlyOnYourself-lzw/p/16405900.html
Author: OnlyOnYourself-Lzw
Title: 01-MySQL主从复制

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/505274/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java 笔记(全)

    ​ 标识符:给类或者变量类的方法属性命名都是标识符 ​ 组成必须是: 字母、数&#x…

    数据库 2023年6月11日
    0116
  • 5_SpringMVC

    一. 什么是MVC框架 MVC全名是Model View Controller, 是模型(model), 视图(view), 控制器(controller)的缩写, 一种软件设计典…

    数据库 2023年6月11日
    0175
  • git拉项目出现的小问题

    问题描述 在IDEA中拉代码事报错。 点击查看报错信息 error: unable to read askpass response from ‘C:\Users\&#x9…

    数据库 2023年6月11日
    0148
  • Django点击图片缩放

    参考信息 用 zoom.js 给博客园中博文的图片添加单击时弹出放大效果:https://www.cnblogs.com/mingc/p/7446492.html 使用 1. 下载…

    数据库 2023年6月9日
    0139
  • JDBC

    JDBC 一、JDBC概述 什么是JDBC? JDBC 是使用 Java 语言操作关系型数据库的一套 API。这套 API 是交由不同的数据库厂商实现的。我们利用 JDBC 编写操…

    数据库 2023年5月24日
    0169
  • Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

    1. kubernetes介绍 1.1 kubernetes简介 kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的…

    数据库 2023年6月9日
    0139
  • Read View的可见性判断理解

    读了 @SnailMann大佬【MySQL笔记】正确的理解MySQL的MVCC及实现原理 收益颇丰,非常感谢! 但对其中如何判断事务是否可见性还是不太理解,于是作了本文,在原博客基…

    数据库 2023年6月16日
    0132
  • 多线程

    public class 多线程 { static boolean flag = true; static class t1 implements Runnable{ @Overr…

    数据库 2023年6月16日
    0133
  • 集合自序整理集

    集合和数组一样都是对多个数据进行存储操作的容器 * – 集合长度可变,数组长度固定 – 集合可以存储不同数据类型元素,数组只能存储单一数据类型元素 &#82…

    数据库 2023年6月9日
    0155
  • Struts 2 学习笔记

    Struts2 是一个基于 MVC 设计模式的 Web 应用框架,它本质上相当于一个 servlet,在 MVC 设计模式中,Struts2 作为控制器(Controller)来建…

    数据库 2023年6月11日
    0150
  • 23种设计模式之命令模式

    文章目录 概述 命令模式的优缺点 命令模式的应用场景 命令模式的结构和实现 * 模式的结构 模式的实现 总结 ; 概述 命令模式(Command Pattern)是一种数据驱动的设…

    数据库 2023年6月6日
    0165
  • 达梦产品技术支持培训-day8-DM8数据库备份与还原-实操

    Disql 工具:联机数据备份与还原,包括库备份、表空间备份与还原、表备份与还原; DMRMAN 工具:脱机数据库备份还原与恢复; 客户端工具 MANAGER和CONSOLE:对应…

    数据库 2023年6月11日
    0130
  • select,poll,epoll

    select、poll、epoll 区别总结: 底层实现 select/poll 首先把关注的Socket集合从用户态拷贝到内核态,然后由内核检测事件,遍历整个集合(由于线性结构实…

    数据库 2023年6月16日
    0128
  • JUC学习笔记(六)

    JUC 中提供了三种常用的辅助类,通过这些辅助类可以很好的解决线程数量过多时 Lock 锁的频繁操作。这三种辅助类为: CountDownLatch: 减少计数 CyclicBar…

    数据库 2023年6月6日
    0153
  • 12 用最有效率的方法计算 2 乘以 8

    2 << 3 左移是位运算符,直接操作内存中整数对应的二进制位,效率高; 左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方。 Original: https:…

    数据库 2023年6月6日
    0122
  • 1_Html

    一. 引言 1.1 HTML概念 网页, 是网站中的一个页面, 是构成网站的基本元素, 是承载各种网站应用的平台. 通俗的说, 网站就是由网页组成的, 通常我们看到的网页都是以ht…

    数据库 2023年6月11日
    0140
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球