分布式Id
概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移到Cassandra,因为Cassandra...
概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移到Cassandra,因为Cassandra...
在单体架构中,不同模块之间可以通过项目引用的方式直接使用接口调用,单次请求在同一台机器的同一个进程内进行,这种调用方式称为本地调用,但是在微服务架构中,每个服务都是独立的进程,并且通常部署在不同的服务器,无法简单的使用本地调用的方式,而是需要远程服务调用来实现服务间的通信。 通信模式的划分 目前有很多种进程间通信的技术供开发者选择,可以使用基于同步请求/响应的通信机制,例如:ht...
在微服务架构中,由于系统的拆分,通常会有很多的服务,而每个服务又可能因为横向扩展而部署在多台服务器上,当服务A需要调用服务B的接口时,服务A该如何知道服务B的主机地址就成了一个问题,如果将B服务地址写死在配置文件中,那么当服务B扩展、下线或主机迁移时,服务A都需要改动配置文件以保证接口的正常调用,如果只有服务A需要调用服务B还好,手动修改也不是十分麻烦,但是在复杂的微服务架构中,一个服...
架构的本质 熵增定律:一个封闭系统,都是从有序到无序,也就是它的熵(即混乱程度)会不断地增加,最终系统会彻底变得无序。 这个理论放在软件系统的演化上,也是非常适用的。一方面,随着业务需求的增加,我们会往系统里不停地添加业务功能;另一方面,随着访问量的不断增加,我们会不断通过技术手段来加强系统非业务性功能。如果事先不做良好的设计,随着时间的推进,整个系统野蛮生长,就会逐渐碎片化,越来越无序...
从 ACID 到 CAP/BASE 在分布式系统中,存储基本都是多副本形式的,之所以采用这种模式,有以下两种原因: 提高系统可用性,防止单点故障引起的系统不可用 提高系统性能,利用负载均衡,让多副本分担流量压力 数据复制在可用性和性能方面给分布式系统带来的好处是不言而喻的,但是数据复制所带来的一致性挑战,也是所有开发人员需要面对的。 如何保证数据的一致性,同时又不影响系统...
数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。 根据加锁的范围,MySQL里面的锁大致可以分为全局锁、表级锁和行锁三类。 全局锁 全局锁就是对整个数据库实例加锁。MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWR...
事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在 MySQL 中,事务支持是在引擎层实现的。MySQL 是一个支持多引擎的系统,但并不是所有的引擎都支持事务。比如 MySQL 原生的 MyISAM 引擎就不支持事务,这也是 MyISAM 被 InnoDB 取代的重要原因之一。 提到事务,你肯定会想到 ACID(Atomicity、Consistency、Isolation、Du...
平时的工作中,不知道你有没有遇到过这样的场景,一条 SQL 语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持续时间还很短。在这一瞬间,MySQL 可能就是在刷脏页(flush)。 当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。 ...
与查询流程不一样的是,更新流程还设计两个重要模块:redo log 和 binlog。 以下面的一条sql为例 (ID为主键) update T set b=b+1 where ID = 2 客户端通过连接器与 mysql 建立连接 删除要update表的缓存 分析器解析 sql 并判断是否含有语句错误 优化器确定查询索引 执行器调用 Innodb 存储引...
存储结构 MySQL的存储结构 表存储结构 单位:表>段>区>页>行 在数据库中, 不论读一行,还是读多行,都是将这些行所在的页进行加载。也就是说存储空间的基本单位是页。 一个页就是一棵树B+树的节点,数据库I/O操作的最小单位是页,与数据库相关的内容都会存储在页的结构里。 B+树索引结构 在一棵B+树中,每个节点为都是一个页,每次新建节点的时候,就会申请一个页...
mysql 大概分为 server 层和存储引擎层两个部分,引擎的架构模式是插件形式的,mysql支持多种引擎如 InnoDB、MyISAM、Memory 等,其中 Innodb是应用最广泛的,mysql5.5.5版本后,将Innodb设为默认存储引擎。 server 层 连接器 连接器负责跟客户端建立连接、获取权限、维持和管理连接。一个用户成功建立连接后,即使你用管理员账...
Redis以高性能著称,不仅其因为采用了单线程,IO多路复用,纯内存读写等等,它还在底层的数据结构实现上用了很大的心思。针对不同的场景采用了不同的数据结构,以提升数据读写效率,降低数据存储空间。 Redis底层使用六种数据结构 简单动态字符串(SDS) hash表(散列表/字典) 链表 跳表 整型数组 压缩列表 Hash表 首先Redis的底层...
Redis的慢查询日志功能用于记录执行时间超过给点时长的命令请求,用户可以通过日志来监视和优化查询速度。 慢查询日志配置 我们可以通过配置文件或者命令方式配置 slowlog-log-slower-than(执行时间超过多少微妙的命令会被记录) 和 slowlog-max-len (最多保存多少条日志记录) 配置文件 slowlog-log-slower-than 1...
Sentinel(哨兵)是redis的高可用解决方案:由一个或多个Sentinel实例组成Sentinel系统可以监视任意多个主服务器,以及这些这些主服务器下属的所有从服务器,并在被监视的主服务器进入下线状态后,自动将下线主服务器下属的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。 配置 创建一个Sentinel.conf配置文件内容如下...
redis是C语言实现的,但redis中的字符串并没有直接用C语言中的字符串表示,而是自己构建了一种简单的动态字符串类型(SDS)。 在redis里面,C字符串只用作字面量,用在一些不会修改的地方,eg:打日志。 SDS的结构: struct sdshdr{ int free; int len; char buf[]; } free 属性值为0 表...