0%

MySQL性能调优

MySQL性能调优流程从低到高分别为:

  1. 查询及索引优化:SQL优化以及索引优化
  2. 库表优化:设计优化以及分库分表等操作
  3. MySQL参数/服务器优化:分为硬件调优和MySQL参数调优
  4. 分库分表横向扩展优化

查询优化

SQL作为访问操作数据库的主要手段,采用一定的优化手段提升SQL性能,对于提高数据库整体性能具有重要意义,下面内容为对于SQL性能优化的学习和总结,主要内容来自:尚硅谷mysql教程MySQL 8.0 Reference Manual Optimizing SELECT Statements

阅读全文 »

MySQL事务

之前在分布式系统的学习中已经系统的整理了事务ACID以及隔离性概念,下面总结在MySQL中的事务,偏向于实现层面,主要内容来自《MySQL技术内幕:InnoDB存储引擎(第2版)》

事务分类和使用

MySQL 默认提交事务(autocommit = 1),即执行完SQL一句后立马执行COMMIT操作,也就是所谓的隐性事务。显式事务的开启,需要手动输入事务控制语句,:

  • START TRANSACTION|BEGIN:开启事务
  • COMMIT:提交事务
  • ROLLBACK:回滚事务
  • SAVEPOINT identifier:创建事务中的保存点
  • REPEASE SAVEPOINT identifier:删除事务中的保存点
  • ROLLBACK TO[SACEPOINT]indentifier:回滚的指定的保存点

其中包括DDL等在内的数据库管理和修改操作开启隐性事务,无法在显式事务控制中使用。

阅读全文 »

InnoDB架构及物理存储

InnoDB is a general-purpose storage engine that balances high reliability and high performance.

InnoDB作为MySQL默认引擎,深入了解InnoDB有助于加深对于数据库系统的理解,下面首先从InnoDB的架构出发,介绍InnoDB的组成以及表数据的物理存储方式,其他例如事务、并发控制等相关内容在本文中不展开。

InnoDB架构

这部分内容是对MySQL 8.0 Reference Manual学习自我总结

InnoDB分为内存结构和磁盘结构两部分,其中内存结构主要为了减少磁盘访问,从而让提升访问性能,磁盘结构部分负责InnoDB中数据的实际物理存储。

阅读全文 »

索引相关知识总结

索引作为数据库的重要知识,在本科的数据库学习中基本没有接触过,在大四找工作准备面试笔试时才了解到这个常考的概念,本博客是对于以往索引相关知识缺失的补足和系统整理。

索引是什么?

A database index is a data structure that improves the speed of data retrieval operations on a database table) at the cost of additional writes and storage space to maintain the index data structure. -Wikipedia

索引(index)是用来加速数据库表数据检索的一种特殊数据结构,其作用类似于目录,通过减少检索过程中的磁盘IO,提升检索效率,索引的优点可以概括为以下三点

  1. 减少服务器需要扫描的数据量
  2. 避免因检索导致的排序和临时表
  3. 将随机I/O变为顺序I/O
阅读全文 »

基于Raft的Sharded KV 数据库实现

项目来自于MIT6.824分布式系统的结课大作业,实现代码已上传 github仓库,该博客为项目的总体框架总结,省略了大量的实现细节和代码,细节总结可参考 MIT6.824实验总结

该项目实现目标为一个分布式容错的简单KV数据库,系统主要的功能点可以总结为:

  1. 提供包括put(key, value), append(key, value), get(key)的基本kv数据库功能
  2. 基于Raft共识算法的多服务器备份,实现一致性备份存储,实现了系统容错功能
  3. 基于Raft日志的WAL机制以及系统快照机制,允许系统在失效后通过日志重新执行、加载快照等,快速恢复数据
  4. 通过数据分片和多复制服务器组存储方式,实现了系统的高并发访问性能
  5. 支持存储服务器的动态配置,即可以动态的增加删除存储服务器
阅读全文 »

Golang并发控制总结

写在开头:最近用go做MIT6.824课程作业时,涉及到大量基于golang的并发控制,但是由于不熟悉golang语言以及相关并发控制手段,导致出现了大量的bug,影响了实现进程,因此产生了总结学习golang并发控制的想法

目前大厂的后端开发大量的从java转向go,很大一部分原因是由于go所具备的高并发、高性能、容易开发等性质,可以说go并发控制是学习go内容中最为重要的一部分(java并发我都没学会,直接学go,看出我的诚意了吧),下面的总结学习主要基于golang官网的Effective Go的cocurrency章节

阅读全文 »

分布式事务总结

要理解分布式事务首先要明白事务是什么,从单机事务的理解迁移到分布式事务,下面从两个角度总结单机和分布式事务

  1. 单机事务 vs 分布式事务
  2. 如何通过并发控制保证单机分布式事务的隔离性

单机/分布式事务

事务作为数据库系统读写操作的高层抽象,代表了数据库的基本操作。一个正常提供服务的数据库系统,其事务必须满足ACID四个性质,其中CI两个性质相互关联,是事务性质研究的重点。

  1. Atomic(原子性):每个事务被看作一个不可分割的单元,要么完全成功要么完全失败,不存在两者的中间状态。数据库系统必须保证任意时刻下事务的原子性
  2. Consistency(一致性):一致性是指数据库满足某种预先定义的约束,任何数据库的操作都必须满足一致性,即从一个满足一致性的状态转移到另一个满足一致性的状态(例如:转账事务要满足转出和转入账户总金额不变)
  3. Isolation(隔离性):一系列并发进程的执行导致数据库的状态改变和按照某种线性顺序执行的状态改变相同(实际上这是serializability的定义)
  4. Durable(持久性):事务一旦提交,其对数据状态的改变不会因为意外事件的发生而丢失

分布式事务可以看作事务+分布式环境,即一个执行范围跨越多个通过网络连接的不同主机的事务,分布式事务既然是事务,同样要满足ACID性质,但是由于分布式环境的复杂性,原有的事务性质保证手段在分布式环境下需要进行调整和新的设计。

阅读全文 »

Spark:分布式容错的内存计算框架

Resilient Distributed Datasets: A Fault-Tolerant Abstraction forIn-Memory Cluster Computing

Spark是目前大数据领域较为火热的批处理框架之一(也支持流处理),经过论文阅读,不难发现Spark的核心原理并不复杂,通过简单的抽象,有效的解决了内存计算问题,我想这就是Spark流行起来的原因之一,如果要理解Spark,最关键一步的是理解RDD这一抽象内存模型。

RDDs(Resilient Distributed Datasets)

Spark中将计算操作的基本内存数据单元抽象为一个只读、分区的数据集-弹性分布数据集(RDD),将一次Spark任务定义为RDD经过一系列操作不断变换状态的过程,如下图所示:

  • 每一步操作将一个RDD转化为另一个逻辑上的RDD(例如map、filter、join等)
  • 不同RDD之间通过操作链接起来,形成一个RDD转换父子关系链
  • Spark通过记录RDD转化的父子关系以及操作类型,实现容错(在RDD丢失后,根据计算链重新计算)

系统中通过五个元信息定义一个RDD:一系列分区、一系列父RDD依赖、转化操作、元数据(分区放置、分区信息),依赖关系如下图,分为一对一(narrow)和多对一(wide)。

阅读全文 »

FaRM: 无妥协的强一致性分布式数据库

No compromises: distributed transactions with consistency, availability, and performance

从论文的名字就能看出微软对于自己这套分布式数据库系统的自信程度,强调自己在实现强一致性的同时,并不会妥协可用性和性能,然而深入论文就会发现,虽然确实实现了题目中的性质,但是很多机制局限于其实现条件,另外由于时间和能力有限,未能看懂论文中对于错误恢复部分的阐述,未来涉及到相关内容时再重新学习。

构建系统动机

FaRM的构建动机来自于目前数据中心内部硬件发展的两个趋势:

  1. 基于RDMA(Remote Direct Memory Access)的快速网络通信技术:server之间进行通信时,不经过CPU,直接将数据写入到目标server存储区/拉取到本地存储区
  2. 低成本非易失DRAM存储技术:直接将数据存储在DRAM中,通过单独供电,在断电时备份到SSD中实现非易失

在我看来,FaRM的高性能大部分原因来自于上部分阐述的硬件优势,除去优势以外,以上设计同样为FaRM带来了一定限制

  • 无法实现跨数据中心分布
  • 增加了分布式事务和消息传递实现的复杂性(这难道就是我看不懂错误恢复的原因?
阅读全文 »