0%

Redis支持两种持久化手段,下面分别进行总结

  1. RDB(Redis DataBase):将当前Redis数据库中的所有数据以二进制的形式存储在.rbd文件中,也就是状态备份
  2. AOF(Append Only File):将写操作持久化在AOF文件中,也就是状态机备份

RDB

RDB机制将当前Redis存储的所有KV对存储在二进制文件中,持久化的触发时机有两个:

  1. 显式调用savebgsave

  2. 满足配置文件中的持久化条件

    • 在过去的xxx秒内,若写入操作超过xx个,则进行RDB持久化
阅读全文 »

Redis支持多机多实例部署,通过多实例部署,可以保证服务不受到单个Redis示例宕机的影响,实现服务的数据的可靠性和高可用,下面结合代码和底层原理,加深对于Redis多机部署的理解,主要内容来自Redis设计与实现

主从复制

Redis的主从复制在我看来较为轻量级,由从节点向主节点申请成为从节点,主节点不断向从节点发送数据,实现同步,与Mysql主从复制不同的是,即使在同步前主从状态不一致,同步后也会变为一致。

通过replicaof命令可制定当前Redis实例为对应实例的从机关系,重启即失效:

1
2
3
4
# replicaof 主机IP 端口
replicaof 192.168.1.1 6379
# 取消作为从机
replicate no one
阅读全文 »

Redis数据结构

redis有六种主要的数据类型,下面从调用API以及底层实现原理对于Redis中主要数据类型进行总结和整理,主要内容来自redis文档和《Redis设计与实现》。

底层数据结构

字符串(simple dynamic string)

字符串是Redis中最基本的数据类型,键和值的类型均为字符串类型,底层基于支持动态扩容的简单动态字符串(simple dynamic string,SDS)实现,其数据结构示例如下:

  1. len:buf数组中已经使用的长度,遵循C语言字符串末尾添加空字符\0的习惯
  2. free:buf数组中还剩余的长度
1
2
3
4
5
struct sdshdr{
int len;
int free;
char buf[];
}
阅读全文 »

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. 支持存储服务器的动态配置,即可以动态的增加删除存储服务器
阅读全文 »

MIT6.824中共设计了四个实验,主要内容是一个分布式kv数据库。

  1. mapreduce分布式实现
  2. raft实现
  3. 基于raft的kv数据库实现
  4. Sharded KV数据库实现
阅读全文 »