草庐IT

01-MySQL主从复制

OnlyOnYourself-lzw 2023-03-28 原文

问题导入

  • 在之前项目的基础功能实现中,后台管理和移动端在进行数据访问的时候,都是直接操作数据库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操作(增删改)
    • 增加
      • 主数据库
      • 从数据库
    • 删除
      • 主数据库
      • 从数据库
    • 修改
      • 主数据库
      • 从数据库

有关01-MySQL主从复制的更多相关文章

  1. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  2. ruby-on-rails - 无法安装 mysql2 0.3.14 gem - 2

    我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby​​目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin

  3. ruby - 如何在 ruby​​ 中复制目录结构,不包括某些文件扩展名 - 2

    我想编写一个ruby​​脚本来递归复制目录结构,但排除某些文件类型。因此,给定以下目录结构:folder1folder2file1.txtfile2.txtfile3.csfile4.htmlfolder2folder3file4.dll我想复制这个结构,但不包含.txt和.cs文件。因此,生成的目录结构应如下所示:folder1folder2file4.htmlfolder2folder3file4.dll 最佳答案 您可以使用查找模块。这是一个代码片段:require"find"ignored_extensions=[".cs"

  4. ruby - 如何使用 ruby​​ mysql2 执行事务 - 2

    我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi

  5. ruby - 在两个 ActiveRecord 类之间合并/复制属性的好方法? - 2

    之前有人问过这个问题,我发现了以下clip关于如何一次设置一个类对象的所有属性,但由于批量分配保护,这在Rails中是不可能的。(例如,您不能Object.attributes={})有没有一种很好的方法可以将一个类的属性合并到另一个类中?object1.attributes=object2.attributes.inject({}){|h,(k,v)|h[k]=vifObjectModel.column_names.include?(k);h}谢谢。 最佳答案 利用assign_attributes使用:without_prote

  6. Ruby:我怎样才能复制这个数组? - 2

    (跟进我之前的问题,Ruby:howcanIcopyavariablewithoutpointingtothesameobject?)我正在编写一个简单的Ruby程序来在.svg文件中进行一些替换。第一步是从文件中提取信息并将其放入数组中。为了避免每次调用此函数时都从磁盘读取文件,我尝试使用memoize设计模式-在第一次调用后的每次调用中都使用缓存结果。为此,我使用了一个在函数之前定义的全局变量。但是,即使我在返回局部变量之前将该变量.dup为局部变量,调用该变量的函数仍在修改全局变量。这是我的实际代码:#memoizetokeepfromhavingtoreadoriginalfi

  7. ruby-on-rails - 当我通过 rvm 使用 rails3 时,如何在 ubuntu 上安装 mysql2 gem? - 2

    我正在尝试绕过rails配置这个极其复杂的迷宫。到目前为止,我设法在ubuntu上设置了rvm(出于某种原因,ruby在ubuntu存储库中已经过时了)。我设法建立了一个Rails项目。我希望我的测试项目使用mysql而不是mysqlite。当我尝试“rakedb:migrate”时,出现错误:“!!!缺少mysql2gem。将其添加到您的Gemfile:gem'mysql2'”当我尝试“geminstallmysql”时,出现错误,告诉我需要为安装命令提供参数。但是,参数列表很大,我不知道该选择哪些。如何通过在ubuntu上运行的rvm和mysql获取rails3?谢谢。

  8. Centos7-yum安装mysql-修改密码-无密码登录-安全配置 - 2

    目录1、yum安装mysql修改密码(1)在mysql里面修改(2)第二种方式,利用mysqladmin修改密码2、没有密码,登录mysql修改密码3、mysql的安全设置1、yum安装mysql在CentOS中默认安装有MariaDB(MySQL的一个分支),安装完成之后可以直接覆盖MariaDB。rpm-qa|grepmariadb查询是否安装了mariadbrpm-e--nodepsmariadb-libs-5.5.60-1.el7_5.x86_64卸载mariadwgethttp://dev.mysql.com/get/mysql57-community-release-el7-11.

  9. ruby - 安装 dm-mysql-adapter 时出错 - 2

    我是Ruby的新手。我安装了DataMapper并且正在尝试安装dm-mysql-adapter-1.0.2gem。但是当我尝试安装时,出现以下错误。我正在使用ubuntu操作系统。vinoth@vinoth-laptop:~/Downloads$geminstalldm-mysql-adapter-1.0.2----with-mysql-lib=/usr/lib/mysql----with-mysql-conf=/usr/bin/mysqlWARNING:Installingto~/.gemsince/home/vinoth/gemsand/home/vinoth/gems/bina

  10. ruby-on-rails - gem 列表中的 mysql2 gem 但获取项目找不到 gem - 2

    我目前正在构建一个需要mysql2gem的RoR项目。我成功安装了gem。因为它出现在我的gem列表中。[root@vc2cmmka035538nsimple_cms]#gemlist***LOCALGEMS***actionmailer(3.2.3)actionpack(3.2.3)activemodel(3.2.3)activerecord(3.2.3)activeresource(3.2.3)activesupport(3.2.14,3.2.3)arel(3.0.2)bigdecimal(1.1.0)builder(3.2.2,3.0.0)bundler(1.1.5)c2c_li

随机推荐