MySQL之应用层优化和备份与恢复(一)

应用层优化

缓存

作为基础组件的缓存

缓存有可能成为基础设施的重要组成部分。也很容易陷入一个陷阱,认为缓存虽然很好用,但并不是重要到非有不可得东西。你也许会辩驳,如果缓存服务器宕机或者缓存被清空,请求也可以直接落在数据库上,系统依然可以正常运行。如果是刚刚将缓存加入应用系统,这也许是对的,但缓存的加入可以使得在应用压力显著增长时不需要对系统的某些部分同比增加资源投入——通常是数据部分。因此,系统可能慢慢地变得对缓存非常依赖,却没有被发觉。
例如,如果高速缓存命中率是90%,当由于某种原因失去缓存,数据库上的负载将增加到原来的10倍。这很可能导致压力超过数据库服务器的性能极限。为了避免像这样的意外,应该设计一些高可用性缓存(包括数据和服务)的解决方案,或者至少是评估好禁用缓存或丢失缓存时的性能影响。比如说可以设计应用在遇到这样的情况时能够进行降级处理。

使用HandlerSocket和memcached

相对于数据存储在MySQL中而缓存在MySQL外部的缓存方案,另外有一种替代方法是为MySQL创建一个更快的访问路径,直接绕过使用缓存。对于小儿简单的查询语句,很大一部分开销来自解析SQL,检查权限,生成执行计划,等等。如果这种开销可以避免,MySQL在处理简单查询时将非常快。目前有两个解决方案可以用所谓的NoSQL方式访问MySQL。第一种时一个后台进程插件,成为HandlerSocket,由DeNA开发,这是日本最大的社交网站。HandlerSocket允许通过一个简单的协议访问InnoDB Handler对象。实际上,也就是绕过了上层的服务器层,通过网络直接连接到了InnoDB引擎层。有报告称HandlerSocket每秒可以执行超过750 000条查询。Percona Server分支中自带了HandlerSocket插件引擎层。第二个方案时通过memcached协议访问InnoDB。MySQL5.6的实验室版本有一个插件提供了这个接口。两种方法都有一些限制——特别是memcached的方法,这种方法对很多访问数据的方法都不支持。为什么会希望采用SQL以外的办法访问数据呢?除了速度之外,最大的可能是简单。这样做最大的好处是可以摆脱缓存,以及所有的失效逻辑,还有为它们服务的额外的基础设施

拓展MySQL

如果MySQL不能做你需要的事,一种可能是拓展其功能。在这里不会展示如何去做到这一点,但会提供一些可能的方向。如果你对进一步探索有兴趣,那么有很多很好的在线资源。当我们说"MySQL不能做你需要的事",我们指的是两件事情:MySQL根本做不到这一点或者MySQL可以做到,但是只能通过缓慢或笨拙的方法,总之做得不够好。无论哪个都是需要对MySQL拓展的原因。好消息事,MySQL已经越来越模块化和通用。存储引擎是拓展MySQL的一个很好的方式。Brian Aker已经写了一个存储引擎的框架,还有一系列介绍有关如何开始编写自己的存储引擎的文章。这是目前几个主要的第三方存储引擎的基础。许多公司都编写了它们自己的内部存储引擎。例如,一些社交网站公司使用了特殊的为社交图形操作设计的存储引擎,我们还知道有个公司定制了一个用于模糊搜索的引擎。写一个简单的自定义存储引擎并不难。还可以使用存储引擎作为另一个软件的接口。Sphinx引擎就是一个很好的例子,该引擎是Spinx全文检索软件的接口

MySQL的替代品

MySQL并不是适合每一个场景的解决方案。有些工作通常在MySQL以外来做会更好,即使MySQL理论上也可以做到。最明显的一个例子是在传统的文件系统中存储文件,而不是在表中。图像文件是静丹案例:虽然可以把它们放到一个BLOB列,但这通常不是个好办法(使用MySQL的复制来快速分布镜像到其他机器更有优势,我们知道一些程序使用这种技术)。一般的做法是,在文件系统中存储图片或其他大型二进制文件,而在MySQL中只存储文件名;然后应用程序在MySQL之外存取文件。对于Web应用程序,可以把文件名放在元素的src属性中,这样就可以实现对文件的存取。
全文检索是另一个最好放在MySQL之外处理额例子——MySQL在全文搜索方面明显不如Lucene和Sphinx。 NDB API也可能对某些任务有用。例如,尽管MySQL的NDB集群存储引擎(目前还)不适合存储一个高性能Web应用程序的全部数据,但用NDB API直接存储网站会话数据或用户注册信息还是可能的。在如下网站可以了解到更多NDB API的内容.还有供Apache使用的NDB模块,mod_ndb.
最后,对于某些操作——如图形关系和树遍历——关系型数据并不总是正确的典范,MySQL并不擅长分布式数据处理,因为它缺乏并行执行查询的能力。处于这些目的情况还是建议使用其他工具(可能与MySQL结合).现在想到的例子包括:

  • 1.对于简单的键——值存储,在复制严重落后的非常高速的访问场景中,我们建议用Redis替换MySQL.即使MySQL主库可以承担这样的压力,备库的延迟也是非常让人头疼的。Redis也常用来做队列,因为它对队列操作支持得很好
  • 2.Hadoop是房间中得大象,一语双关。混合MySQL/Hadoop得部署在处理大型或半结构化数据时非常常见

备份与恢复

概述

如果没有提前做好备份规划,也许以后会发现已经错失了一些最佳得选择。例如,在服务器已经配置好了以后,才想起应该使用LVM,以便可以获取文件系统的快照——但这时已经太迟了。在为别分配置系统参数时,可能没有注意到某些系统配置对性能有着重要影响。如果没有计划做定期的恢复演练,当真的需要恢复时,就会发现并没有那么顺利。在此假设大部分用户主要使用InnoDB而不是MyISAM。也不会涵盖一个精心设计的备份和恢复解决方案的所有部分——而仅涉及与MySQL相关的部分。不打算包括的话题如下:

  • 1.安全(访问备份,恢复数据的权限,文件是否需要加密)
  • 2.备份存储在哪里,包括它们应该离数据多远(在一块不同的盘上,一台不同的服务器上,或离线存储),以及如何将数据从源头移动到目的地
  • 3.保留策略、审计、法律要求,以及相关的条款
  • 4.存储解决方案和介质,压缩,以及增量备份
  • 5.存储的格式
  • 6.对备份的监控和报告
  • 7.存储层内置备份功能,或者其他专用设备,例如预制式文件服务器

让我们先澄清几个核心术语。首先,经常可以听到所谓的热备份、暖备份和冷备份。人们经常使用这些词来表示一个备份的影响:例如"热"备份不需要任何的服务停机时间。问题是对这些术语的理解因人而异。有些工具虽然在名字中使用了"热备份",但实际上并不是所认为的那样。我们尽量避开这些术语,而直接说明某个特别的技术或工具对服务器的影响。另外两个让人困惑的词是还原和恢复。还原意味着从备份文件中获取数据,可以加载这些文件到MySQL里,也可以将这些文件放置到MySQL期望的路径中。恢复一般意味着当某些异常发生后对一个系统或其部分的拯救。包括从备份中还原数据,以及使服务器完全恢复功能的所有必要步骤,例如重启MySQL、改变配置和预热服务器的缓存等。
在很多人的概念中,恢复仅意味着修复崩溃后损坏的表。这与恢复一个完整的服务器使不同的。存储引擎的崩溃恢复要求数据和日志文件一致。要确保数据文件中只包含已经提交的事务所做的修改,恢复操作会将日志中还没有应用到数据文件的事务重新执行。这也许是恢复过程的一部分,甚至是备份的一部分。然而,这和一个意外的DROP TABLE事故后需要做的事是不一样的。

为什么要备份?

下面是备份非常重要的几个理由:

  • 1.灾难恢复
    灾难恢复是下列场景下需要做的事情:硬件故障、一个不经意的Bug导致数据损坏,或者服务器及其数据由于欧协原因不可获取或无法使用等。你需要准备好应付很多问题:某人偶尔连错数据库服务器执行了一个ALTER TABLE的操作,计放大楼被炸毁,恶意的黑客攻击或MySQL的Bug等。尽管遭受任何一个特殊的灾难的几率都非常低,但所有的风险叠加在一起就很有可能会碰到
  • 2.人们改变象发
    不必惊讶,很多人经常会在删除某些数据后又想要恢复这些数据
  • 3.审计
    有时候需要知道数据或Schema在过去的某个时间点是什么样的。例如,你也许被卷入一场法律官司,或发现了应用的一个Bug,想知道这段代码之前干了什么(有时候仅仅依靠代码的版本控制还不够)
  • 4.测试
    一个最简单的基于实际数据来测试的方法是,定期用最新的生产环境数据更i性能测试服务器。如果使用备份的方案就非常简单:只要把备份文件还原到测试服务器上即可。

检查你的假设。例如, 你认为共享虚拟主机供应商会提供MySQL服务器的备份?许多主机供应商根本不备份MySQL服务器,另外一些也仅仅在服务器运行时复制文件,这可能会创建一个损坏的没有用处的备份

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见锁策略之可重入锁VS不可重入锁

可重入锁VS不可重入锁 有一个线程,针对同一把锁,连续加锁两次,如果产生了死锁,那就是不可重入锁,如果没有产生死锁,那就是可重入锁. 死锁 我们之前引入多线程的时候不是讲了一个加数字的案例么,我们今天以它来举例 当我们这样写的时候会出现什么问题? 分析:第一个synchron…

前端基础--Vue3

Vue3基础 VUE3和VUE2的区别 2020年9月18日,Vue.js发布版3.0版本,代号:One Piece 于 2022 年 2 月 7 日星期一成为新的默认版本! Vue3性能更高,初次渲染快55%, 更新渲染快133% 。体积更小 Vue3.0 打包大小减少41%。 同时Vue3可以更好的支持T…

基于微服务智能推荐健康生活交流平台的设计与实现(SpringCloud SpringBoot)+文档

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

vb 学习简介

vb 第一节 Visual Basic(简称VB)是一种高级编程语言,它最初由微软公司开发,旨在简化Windows应用程序的开发过程。下面,我们将介绍Visual Basic编程语言的基础概念和用途,包括其历史背景、主要特性以及在现代编程中的应用。 历史背景 Visual Basic起源于1991年,当时微软…

代码随想录算法训练营day72 | 117. 软件构建、47. 参加科学大会

本次题目来自于卡码网 117. 软件构建(拓扑排序) python设置默认值 from collections import defaultdict aa defaultdict(int) 拓扑排序:找到入度为0的节点,然后移除。如果最后都能移除,则无环,可以排…

C#发票识别接口,再长的税号录入都不怕

“十二金”工程是我国政府在信息化建设中的重要一步,“金税工程”总称为中国税收管理信息系统(CTAIS),是我国电子政务的核心系统之一,是财政的重要环节。十二金”是面向政府办公业务建立的十二个重点信息应用系统,按“…

解决使用monaco-editor编译器,编译器展示内容没有超过编译器高度,但是出现滚动条问题

前言: 最近在完成项目时,有使用编译器进行在线编辑的功能,就选用了monaco-editor编译器,但是实现功能之后,发现即使在编译器展示的内容没有超过编译器高度的情况下,编译器依旧存在滚动条,会展示…

计算机网络--网络层

一、网络层的服务和功能 网络层主要为应用层提供端对端的数据传输服务 网络层接受运输层的报文段,添加自己的首部,形成网络层分组。分组是网络层的传输单元。网络层分组在各个站点的网络层之间传输,最终到达接收方的网络层。接收方网络层将运…

如何在 Java 应用中使用 Jedis 客户端库来实现 Redis 缓存的基本操作

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

构建高效盲盒小程序:数据库设计、安全策略与性能优化

在移动互联网时代,盲盒经济以其独特的魅力迅速崛起,成为连接消费者与商品的新桥梁。盲盒小程序作为这一趋势的载体,不仅要求用户体验流畅,还需确保数据安全与性能卓越。本文将从数据库设计、安全策略及性能优化三个方面&#xff0…

堆与栈的概念(RTOS)

目录 #堆在RTOS的概念 #相关代码表示 #堆相关特点 #栈在RTOS中的概念 #栈的代码表示 #栈的相关特点 #为什么每个RTOS任务都要有自己的栈 前言:本篇参考韦东山老师的RTOS,连接放在最后 #堆在RTOS的概念 本文所指的堆与栈并不是数据结构中&#xff…

【unity实战】在Unity中使用有限状态机制作一个敌人AI

最终效果 文章目录 最终效果前言有限状态机的主要作用和意义素材下载逻辑图敌人动画配置优雅的代码文件目录状态机代码定义敌人不同状态切换创建敌人效果更多的敌人参考源码完结 前言 有限状态机以前的我嗤之以鼻,现在的我逐帧分析。其实之前我就了解过有限状态机&…

2.(vue3.x+vite)调用iframe的方法(vue编码)

1、效果预览 2.编写代码 (1)主页面 <template><div><button @click="sendMessage">调用iframe,并发送信息

【udp报文】udp报文未自动分片,报文过长被拦截问题定位

问题现象 某局点出现一个奇怪的现象&#xff0c;客户端给服务端发送消息&#xff0c;服务端仅能收到小部分消息&#xff0c;大部分消息从客户端发出后&#xff0c;服务端都未收到。 问题定位 初步分析 根据现象初步分析&#xff0c;有可能是网络原因导致消息到服务端不可达&a…

【C语言】文件的顺序读写

©作者:末央&#xff06; ©系列:C语言初阶(适合小白入门) ©说明:以凡人之笔墨&#xff0c;书写未来之大梦 目录 前言字符输入输出函数 - fgetc和fputc文本行输入输出函数 - fgets和fputs格式化输入输出函数 - fscanf和fprintf 前言 对文件数据的读写可以分为顺序…

Unity3D 打造基于AStar的寻路与导航详解

在游戏开发中&#xff0c;寻路与导航是一个至关重要的功能&#xff0c;它能够使游戏角色自动找到最优路径&#xff0c;避开障碍物&#xff0c;实现自动导航&#xff0c;从而提升游戏体验。AStar&#xff08;A*&#xff09;算法作为一种广泛应用的寻路算法&#xff0c;因其高效性…

关于多线程的使用方法

多线程在python中应用比较广泛&#xff0c;但是因为python中有GIL锁的缘故&#xff0c;在多线程中看起来是并发的执行的&#xff0c;在宏观上是并发执行的&#xff0c;但是在微观上是一个接着一个执行。 在python中使用多线程比较简单&#xff0c;是一套固定的模版。 from qu…

PHP利用GD库实现图片合成功能方法

在程序项目开发的过程中我们免不了要实现一种功能。例如海报的生成&#xff0c;照片和文字合成一张新的图片。php中怎么实现 实现功能 文字和照片合成一张新的照片&#xff0c;并且自适应换行并加上签名和日期&#xff0c;加上字体样式&#xff0c;下面我们就开实现该功能 实现…

Seal^_^【送书活动第8期】——《ChatGLM3大模型本地化部署、应用开发与微调》

Seal^_^【送书活动第8期】——《ChatGLM3大模型本地化部署、应用开发与微调》 一、参与方式二、本期推荐图书2.1 作者建语2.2 编辑推建2.3 图书简介2.4 前 言2.5 目 录 三、正版购买 大模型领域 既是繁星点点的未知宇宙&#xff0c;也是蕴含无数可能的广阔天地&#xff0c; 正…

深入理解 Linux 内核架构

目录 引言内核概念Linux 内核的基本组成 进程管理内存管理文件系统设备驱动网络栈内核结构 内核态与用户态内核模块系统调用中断与异常处理内核同步机制Linux 内核使用场景常用的内核命令与工具内核调试与性能优化总结 1. 引言 Linux 内核是现代计算机系统的核心组件之一&am…