MySQL主从复制

MySQL的异步复制算的上是一种典型的单领导者复制模式,就复制本身而已并无特殊之处。但是复制的细节,例如binlog的格式选取,从节点如何在保证数据准确的情况下进行并行复制,MySQL的实现方案总是能令人眼前一亮。 »

Linux主机通过Windows虚拟机转发Easyconnect内网请求

世界上有个恶心的公司叫Sangfor,开发出了恶心的工具EasyConnect,本来这东西都是给在校的学生用的,好不好用都无所谓。但是很多公司也开始使用这个来访问内网,并且还不支持Linux(反正到目前Ubuntu下的64bit版本连接就没成功过),这就很令人讨厌了。回想起Ubuntu下使用Wine安装微信的种种难受,决定还是使用Windows虚拟机开启EasyConnect,并把部分的Linux流量打进虚拟机。 »

MySQL-InnoDB中的锁

锁在InnoDB存储引擎中的使用远比我们想象中的更加频繁,及时是一条最为简单的update set语句,其中也涉及到了各种锁的使用。包括常说的一致性锁定读,解决幻读等场景中,同样包含了锁的大量使用。 »

Golang中的interface

Golang除了方便使用的协程以外,最令我感到惊讶的就是interface,接口。在其它语言中,接口承担的主要作用为解耦和协议,但是在Golang中,interface还作为一种”通用”类型广泛使用于标准库和第三方库中。 »

Linux操作系统-文件I/O

在操作系统中, 最为复杂同时也最为重要的功能就是文件I/O。 一台PC可以不连接互联网, 但是一定需要程序的载入、文件的打开, 而这些操作与I/O均密不可分。 包括软件开发中, 数据库与I/O的关系密切相关, 有时衡量一个DB的效率, 其实就是在衡量其I/O效率。 理解文件I/O, 就是在理解我们常用应用软件, 如MySQL、Redis、Nginx、ES、Prometheus等的核心。 »

MySQL中的悲观锁与常见的死锁场景

在MySQL中, 锁机制是并发条件下保护数据一致性与稳定性的一个非常重要的机制, 并且事务的实现也依赖于于锁机制。 其锁定的数据不单包括数据行记录, 同时也包括缓冲池中的LRU列表数据、日志数据等。 悲观锁(FOR UPDATE)则是日常开发中使用最多的一种锁, 但是, 由于事务隔离级别的多样性导致了悲观锁在使用时常常会有不同的表现, 死锁在程序员稍不注意时就会发生。 »

MySQL中的联合索引与覆盖索引

在上一篇文章中, 通过解析InnoDB存储引擎的.ibd数据存储文件得到了数据与索引的真实组织方式: 数据通过聚集索引在逻辑上连续存放, 二级索引保存数据主键ID(Row ID), 多棵B+Tree组合起来提供高效的索引数据查询。 除辅助索引(二级索引)外, 联合索引与覆盖索引在日常中也会经常用到。 »

MySQL物理存储方式

MySQL是基于磁盘进行数据存储的关系型数据库, 所有的数据、索引等数据均以磁盘文件的方式存储, 在有需要时载入内存读取。 为了加快数据查询的效率, 通常会在一些字段上添加索引, 但是许多文档都会告诉我们, 不要添加太多的索引, 索引不要太长, 使用数字或者空字符串来代替NULL值, 为什么会有这些建议? 这些建议又是否正确? 答案都能够从MySQL数据的物理存储方式中找到。 »

数据变更操作日志设计

当系统的某些行为涉及到资金与资产的数据变更时,常常会为其增加操作日志,便于后续的问题排查。例如红包的使用明细,银行转账的详细记录等等。操作日志记录这个需求看起来很简单,但是深挖下去,依然能找到很有趣的东西。 »