MySQL的复制

一、概述

        1.复制解决的问题是让一台服务器的数据与其他服务器保持同步,即主库的数据可以同步到多台备库上,备库也可以配置成另外一台服务器的主库。这种操作一般不会增加主库的开销,主要是启用二进制日志带来的开销。

        2.两种复制方式:

                基于行的复制和基于语句的复制,这两种方式主要都是通过主库上记录二进制日志、在备库重放日志的方式来实现异步的数据复制(即同一个时间点上,主库和主库的数据存在不一致)。另,其复制为向后兼容即新版本的服务器可以作为旧版本服务器的备库,反之不行。

                这两种复制方式的区别在于,基于行的复制在5.1版本后才被加进去。

        3.复制常见的用途:

                数据分布:随意停止或开始复制并在不同的地理位置分布数据备份

                负载均衡:将读操作分不到多个服务器上

                备份:复制不是备份也不可取代备份

                高可用和故障切换:帮助应用程序避免mysql单点失败,一个包含复制的设计良好的故障切换系统能够显著的缩短宕机时间

                mysql升级测试:使用高版本的mysql作为备库保证升级全部的示例前查询可以在备库按照预期执行

二、复制的工作过程

        1.在主库上把数据更改记录到二进制日志中

        2.备库将主库的日志复制到自己的中继日志中

        3.备库读取中继日志的事件并将其放到备库数据之上

        大概过程如下图:

   

        备库将主库的二进制日志复制到本地的中继日志中备库会启动一个工作线程(I/O线程),该线程会和主库建立普通的客户端连接,主库上启动特殊的二进制转储线程来读取二进制日志中的事件。

        注:主库上的二进制转储线程不会对二进制日志中事件进行轮询并且如果其转储进度追赶上主库会进入睡眠状态,直到主库发送信号量通知有新的事件产生才会被唤醒继续接收事件记录到中继日志中。

三、配置复制

        1.步骤:

                在每台服务器上创建复制账号

                配置主库和备库

                通知备库连接到主库并从主库复制数据

        2.环境:服务器server1(IP地址  192.168.0.1) 和服务器server2(IP地址  192.168.0.2)

        3.创建复制账号

                mysql会赋予一些特殊的权限给复制进程,在备库运行的I/O线程会建立一个到主库的TCP/IP连接,这意味需要在主库创建一个用户并赋予其合适的权限,备库I/O线程以该用户名连接到主库并读取其二进制日志。

                grant  replication  slave ,replication  client on *.*  to  repl@'192.168.0.%' identified  by 'testxiao';

                在主库和备库都创建该账号

        4.配置主库和备库

                假设主库是服务器server1,需要打开二进制日志并指定独一无二的服务器id,在主库的my.cnf文件中修改内容

                log_bin = mysql-bin

                server_id = 10

                一般使用服务器的末尾两位作为唯一id

                可以通过 show master  status

                备库上的my.cnf也要增加同样的配置

                log_bin = mysql-bin

                server_id = 11

                relay_log = /var/lib/mysql/mysql-relay-bin

                log_slave_updates = 1                    表示允许备库将重放的事件记录到自身的二进制文件

                read_only = 1

        5.启动复制

           告诉备库如何连接到主库并重放其二进制日志

                change  master  to master_host='server1',

                master_user='repl1',

                master_password='testxiao',

                master_log_file='mysql-bin.000001',

                master_log_pos=0;

       master_log_pos=0  表示从日志开头读起,可以通过show slave  status检查复制是否正确执行

            

        

                        其中slave_io_state   slave_io_running和save_sql_running这三列表示当前备库复制尚未运行,日志的开始是4不是0是因为0不是日志真正开始的位置,仅仅是日志文件头,mysql从直到第一个事件从文件的第4位开始读

                start  slave                该命令开始复制

                再次使用show slave  status

     

                通过上图的信息可以看出来I/O线程和SQL线程已经开始运行

     

                可以通过上述命令查看由I/O线程向主库发起的连接

        6.从另一个服务器开始复制

                大多数情况下一般是有一个已经运行一段时间的主库并需要三个条件让主库和备库保持同步:

                在某个时间点主库的快照

                主库当前的二进制日志文件和获得数据快照时在该二进制日志文件中的偏移量,这两个值被称为日志文件坐标,通过这两个值可以确定二进制日志的位置,可以通过show master status来获取这些值

                从快照时间到现在的二进制日志

           从别的服务器克隆备库的方法

                冷备份:

                关闭主库,把数据复制到备库,重启主库后会使用一个新的二进制文件,在备库通过执行change  master to  指向这个文件的起始处,缺点是在复制数据时需要关闭主库

                热备份:

                使用mysqldump

        

                使用快照或备份

                只要找到对应的二进制日志坐标就可以使用主库的快照或者备份来初始化备库

        7.推荐的复制配置

                sync_binlog=1

                如果开启该选项,mysql每次在提交事务前会将二进制日志同步到磁盘上保证在服务崩溃时不会丢失事件,只适用于二进制日志非中继日志

                relay_log=/path/to/logs/relay-bin

                skip_slave_start

                read_only

                以上三个配置中,第一个配置可以避免中继日志文件基于机器名来命名,第二个配置选项能够避免备库在崩溃后自动启动复制,第三个配置选项可以组织大部分用户更改非临时表。

四、复制的原理

        1.基于语句的复制

            主库会记录造成数据更改的查询,当备库读取并重放这些事件时实际上是把主库上执行过的sql再执行一遍,好处是:能够保证主备保持同步且无需太多的带宽,缺点是会有一些元数据(时间戳)无法保持同步并且更新必须是串行的。

        2.基于行的复制

             可以正确的复制每一行但是没有向后兼容性,无需重放更新主库数据的查询

        mysql可以基于上述两种复制模式进行动态的切换,默认是使用基于行的复制语句的复制模式,如果发现语句无法被正确的复制就切换到基于行的复制模式。

五、复制文件

        1.mysql-bin.index          该文件用来记录磁盘上的二进制日志文件,包括二进制文件的文件名

             该文件并不多余,mysql需要依赖这个文件,如果这个文件中没有记录,mysql将无法是被二进制文件

        2.mysql-relay-bin-index        中继日志的索引文件和上述文件作用类似

        3.master.info                        保存备库连接到主库所需要的信息,该文件不可被删除,否则备库再重启后将无法连接到主库上,这个文件以文本的方式记录了复制用户的密码

        4.relay-log.info                        包含备库复制二进制日志和中继日志坐标,删除此库备库重启后将无法知道从哪个位置开始复制

六、发送复制事件到其他备库

        1.log_slave_updates选项可以让备库变成其他服务器的主库,该选项将其执行过的事件记录到它自己的二进制日志中可以使得它的备库可以从其日志中检索并执行事件

      

        2.mysql指定服务器id的原因是:mysql在复制过程中为了防止无限循环会丢弃事件中记录的服务器id和该服务器本身ID事件相同的事件。

七、复制过滤器

        1.复制过滤器是允许仅复制服务器上一部分的数据,两种复制过滤的方法:

            在主库上过滤记录到二进制日志中的事件

             在备库上过滤记录到中继日志的事件

      

                可能会发生问题,一般不用

八、复制拓扑

        1.可以在任意个主库和备库之间建立复制,限制条件是每一个备库只能有一个主库,条件是:

                一个mysql备库只能有一个主库

                每个备库必须有一个唯一的服务器id

                一个主库可以有多个备库

                打开log_slave_updates选项,表示一个备库可以将主库上的数据变化传播到其他的备库

        2.模式:一主多备结构

                主动-主动模式下的主-主复制(双向复制/双主复制),每一个都被配置成对方的主库和备库

    

        

                主动-被动模式下的主-主复制

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/960813.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32新建不同工程的方式

新建工程的方式 1. 安装开发工具 MDK5 / keil52. CMSIS 标准3. 新建工程3.1 寄存器版工程3.2 标准库版工程3.3 HAL/LL库版工程3.4 HAL库、LL库、标准库和寄存器对比3.5 库开发和寄存器的关系 4. STM32CubeMX工具的作用 1. 安装开发工具 MDK5 / keil5 MDK5 由两个部分组成&#…

「数学::质数」分解质因子 / LeetCode 2521(C++)

概述 由算数基本定理,我们知道任意一个大于1的自然数可以表示为一些质数的乘积: LeetCode 2521: 给你一个正整数数组 nums ,对 nums 所有元素求积之后,找出并返回乘积中 不同质因数 的数目。 注意: 质数 是…

CAN波特率匹配

STM32 LinuxIMX6ull(Linux)基于can-utils测试

【开源免费】基于SpringBoot+Vue.JS在线考试学习交流网页平台(JAVA毕业设计)

本文项目编号 T 158 ,文末自助获取源码 \color{red}{T158,文末自助获取源码} T158,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

【GESP】2024 C++ 一级编程题解析及测试信息下载

文章目录 一、前言二、问题问题:[GESP202403 一级] 小杨买书问题:[GESP202403 一级] 找因数问题: [GESP202406 一级] 休息时间问题:[GESP202406 一级] 立方数问题:[GESP202409 一级] 小杨购物问题:[GESP202…

可扩展架构:如何打造一个善变的柔性系统?

系统的构成:模块 + 关系 我们天天和系统打交道,但你有没想过系统到底是什么?在我看来,系统内部是有明确结构 的,它可以简化表达为: 系统 = 模块 + 关系 在这里,模块是系统的基本组成部分,它泛指子系统、应用、服务或功能模块。关系指模块 之间的依赖关系,简单…

蓝桥杯练习日常|递归-进制转换

蓝桥云课760数的计算 一、递归 题目&#xff1a; 我的解题代码&#xff1a; #include <iostream> using namespace std; int sum0; int main() {// 请在此输入您的代码int n;cin>>n;int fun(int n);fun(n); cout<<sum<<\n;return 0; } // void fu…

分享|instructionfine-tuning 指令微调是提高LLM性能和泛化能力的通用方法

《生成式AI导论》课程中&#xff0c;李宏毅老师提到一篇关于“ instruction fine-tuning” 指令微调的论文&#xff1a; 《Scaling Instruction-Finetuned Language Models》 摘要分享&#xff1a; 事实证明&#xff0c; 在一组以指令形式表达的数据集上微调语言模型可以提…

RK3588平台开发系列讲解(ARM篇)ARM64底层中断处理

文章目录 一、异常级别二、异常分类2.1、同步异常2.2、异步异常三、中断向量表沉淀、分享、成长,让自己和他人都能有所收获!😄 一、异常级别 ARM64处理器确实定义了4个异常级别(Exception Levels, EL),分别是EL0到EL3。这些级别用于管理处理器的特权级别和权限,级别越高…

我的2024年年度总结

序言 在前不久&#xff08;应该是上周&#xff09;的博客之星入围赛中铩羽而归了。虽然心中颇为不甘&#xff0c;觉得这一年兢兢业业&#xff0c;每天都在发文章&#xff0c;不应该是这样的结果&#xff08;连前300名都进不了&#xff09;。但人不能总抱怨&#xff0c;总要向前…

On to OpenGL and 3D computer graphics

2. On to OpenGL and 3D computer graphics 声明&#xff1a;该代码来自&#xff1a;Computer Graphics Through OpenGL From Theory to Experiments&#xff0c;仅用作学习参考 2.1 First Program Square.cpp完整代码 /// // square.cpp // // OpenGL program to draw a squ…

Shell编程(for循环+并发问题+while循环+流程控制语句+函数传参+函数变量+函数返回值+反向破解MD5)

本篇文章继续给大家介绍Shell编程&#xff0c;包括for循环、并发问题&#xff0c;while循环&#xff0c;流程控制语句&#xff0c;函数传参、函数变量、函数返回值&#xff0c;反向破解MD5等内容。 1.for循环 for 变量 in [取值列表] 取值列表可以是数字 字符串 变量 序列…

若依路由配置教程

1. 路由配置文件 2. 配置内容介绍 { path: "/tool/gen-edit", component: Layout, //在路由下&#xff0c;引用组件的名称&#xff0c;在页面中包括这个组件的内容(页面框架内容) hidden: true, //此页面的内容&#xff0c;在左边的菜单中不用显示。 …

C++学习——认识和与C的区别

目录 前言 一、什么是C 二、C关键字 三、与C语言不同的地方 3.1头文件 四、命名空间 4.1命名空间的概念写法 4.2命名空间的访问 4.3命名空间的嵌套 4.4命名空间在实际中的几种写法 五、输入输出 5.1cout 5.2endl 5.3cin 总结 前言 开启新的篇章&#xff0c;这里…

从0到1:C++ 开启游戏开发奇幻之旅(一)

目录 为什么选择 C 进行游戏开发 性能卓越 内存管理精细 跨平台兼容性强 搭建 C 游戏开发环境 集成开发环境&#xff08;IDE&#xff09; Visual Studio CLion 图形库 SDL&#xff08;Simple DirectMedia Layer&#xff09; SFML&#xff08;Simple and Fast Multim…

linux设置mysql远程连接

首先保证服务器开放了mysql的端口 然后输入 mysql -u root -p 输入密码后即可进入mysql 然后再 use mysql; select user,host from user; update user set host"%" where user"root"; flush privileges; 再执行 select user,host from user; 即可看到变…

react-bn-面试

1.主要内容 工作台待办 实现思路&#xff1a; 1&#xff0c;待办list由后端返回&#xff0c;固定需要的字段有id(查详细)、type(本条待办的类型)&#xff0c;还可能需要时间&#xff0c;状态等 2&#xff0c;一个集中处理待办中转路由页&#xff0c;所有待办都跳转到这个页面…

使用Cline+deepseek实现VsCode自动化编程

不知道大家有没有听说过cursor这个工具&#xff0c;类似于AIVsCode的结合体&#xff0c;只要绑定chatgpt、claude等大模型API&#xff0c;就可以实现对话式自助编程&#xff0c;简单闲聊几句便可开发一个软件应用。 但cursor受限于外网&#xff0c;国内用户玩不了&#xff0c;…

当高兴、尊重和优雅三位一体是什么情况吗?

英语单词 disgrace 表示“失脸&#xff0c;耻辱&#xff0c;不光彩&#xff0c;名誉扫地”一类的含义&#xff0c;可做名词或动词使用&#xff0c;含义基本一致&#xff0c;只是词性不同。 disgrace n.丢脸&#xff1b;耻辱&#xff1b;不光彩&#xff1b;令人感到羞耻的人(或…

白平衡与色温:摄影中的色彩密码

目录 一、色温&#xff1a;光线的色彩温度 &#xff08;一&#xff09;色温的定义与原理 &#xff08;二&#xff09;常见光源的色温 &#xff08;三&#xff09;相机色温与环境色温 二、白平衡&#xff1a;还原真实色彩的关键 &#xff08;一&#xff09;白平衡的定义与…