深入了解Kafka【一】概述与基础架构
1、概述Kafka是一个分布式的、基于发布订阅的消息系统,主要解决应用解耦、异步消息、流量削峰等问题。
2、发布订阅模型消息生产者将消息发布到Topic中,同时有多个消息消费者订阅该消息,消费者消费数据之后,并不会清除消息。属于一对多的模式,如图:
3、系统架构网上找了个不错的架构图:
上图中标识了一个kafka体系架构包括若干Producer、Broker、Consumer和一个zookeeper集群。再贴两张带有Topic和Partition的架构图:
下面介绍一下各个角色:
3.1、Producer消息生产者,将消息push到Kafka集群中的Broker。
3.2、Consumer消息消费者,从Kafka集群中pull消息,消费消息。
3.3、Consumer Group消费者组,由一到多个Consumer组成,每个Consumer都属于一个Consumer Group。消费者组在逻辑上是一个订阅者。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费;消费者组之间互不影响。即每条消息只能被Consumer Group中的一个Consumer消费 ...
(转)MySQL-加锁处理分析
本文来自:何登成的技术博客
一、背景MySQL/InnoDB的加锁分析,一直是一个比较困难的话题。我在工作过程中,经常会有同事咨询这方面的问题。同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题。本文,准备就MySQL/InnoDB的加锁问题,展开较为深入的分析与讨论,主要是介绍一种思路,运用此思路,拿到任何一条SQL语句,都能完整的分析出这条语句会加什么锁?会有什么样的使用风险?甚至是分析线上的一个死锁场景,了解死锁产生的原因。
注:MySQL是一个支持插件式存储引擎的数据库系统。本文下面的所有介绍,都是基于InnoDB存储引擎,其他引擎的表现,会有较大的区别。
1.1 MVCC:Snapshot Read vs Current ReadMySQL InnoDB存储引擎,实现的是基于多版本的并发控制协议——MVCC (Multi-Version Concurrency Control) (注:与MVCC相对的,是基于锁的并发控制,Lock-Based Concurrency Control)。MVCC最大的好处,相信也是耳熟能详:读不加锁 ...
深入了解Mysql【十七】分库分表的简单介绍
当系统用户量上去后,数据库的IO、连接数以及单机资源成为瓶颈的时候,就要引入分库分表来解决问题了。通过分库分表,将数据切分,使得单一数据库中的数据量变小,从而提升数据库操作性能。数据切分可以分为垂直拆分和水平拆分,下面简单介绍。
1、垂直拆分1.1、垂直拆分类别垂直拆分有两种:垂直分库和垂直分表。
1.1.1、垂直分库按照现有的系统模块分库,比如用户库、订单库等。有点类似微服务的套路,但是也不能一味的模仿大厂,追求技术。还是要根据具体的业务进行处理,比如有些模块数据量很少,那完全可以将那几个模块连接到一个库中。
1.1.2、垂直分表这种情况是解决表中列过于多的问题,根据业务,根据表中列的相关性拆分成两张表或者多张表。这样虽然会有跨页(B+Tree索引的页存储着一行数据)查询的问题,但是对于热点数据来说,内存中的页所存储的热点数据更多,性能更好。
1.2、垂直拆分的优缺点
优点通过垂直拆分,系统模块间数据走向清晰、方便扩展、可以适当的减轻单机资源瓶颈问题。
缺点分布式事务问题、跨库查询问题、热点数据量大时,单表数据量依然很大。
2、水平拆分当单表数据量太大时,会出现单库的性能瓶颈, ...
深入了解Mysql【十六】主从复制延迟的解决-并行复制
MySQL主从复制有个很大的问题:延迟。从节点复制包括两个部分:
IO线程读取binlog,写入到中继日志
SQL线程解析中继日志,执行SQL,进而和主节点数据同步
发现IO线程不是瓶颈,要在SQL线程上解决问题,所以提出了并行复制的概念:只要再SQL线程上实现多线程,提升从节点处理数据的并发,那么数据同步进度就跟上来了。
各版本并行复制直接参考MySQL并行复制的深入浅出
感觉有点太深入,看不懂,先收藏,以后碰到问题再分析。
深入了解Mysql【十五】主从复制原理
1、概念复制是MySQL数据库提供的一种高可用、高性能的解决方案,指数据可以从一个MySQL数据库主节点复制到一个或多个从节点。
2、用途
读写分离读写分离就是在主服务器上修改,数据会同步到从服务器,从服务器只能提供读取操作,不能写入,实现备份的同时,也实现了数据库性能的优化,提升了服务器安全。
热备就是复制的实现,主服务器将binlog发送到备份服务器,备份服务器读取binlog,顺序执行binlog中的操作。
扩展业务量过大的时候,单机IO过高,需要多机扩展,降低单机IO访问频次。
4、异步复制简单来说三步实现:
主服务器将更新记录到binlog
从服务将主服务器的binlog拷贝到他的中继日志(relay log)
从服务器将中继日志的数据,顺序更新到自己的数据库上
如图:具体流程:
主库的更新事件(update,insert,delete)被写入到binlog
从库连接主库
主库的binlog dump线程将binlog发送到从库
从库的IO线程将binlog写入中继日志
从库的SQL线程执行中继日志中的更新事件,写入从库DB
以上是异步模式,当主库挂了之后,从库很大 ...
深入了解Mysql【十四】事务的实现原理之redo和undo
事务的四大特性中,隔离性由锁实现。原子性、一致性、持久性通过数据库的Redo Log和Undo Log实现。
1、Redo Log在前面的学习中,了解到重做日志分为两部分,一部分在缓冲池中:Redo Log Buffer,另一部分在物理磁盘:Redo Log File。在事务提交时,会将事务所有的日志都写入重做日志文件进行持久化,其中日志既有redo log也有undo log。redo记录的是页的物理修改操作,而undo是根据每行数据进行记录。
2、Undo Logundo主要用于事务的回滚操作,保证事务的原子性与一致性,并提供MVCC功能。在InnoDB中,Insert操作在事务提交之后,Undo Log会立即删除,因为新插入的数据没有历史版本;对于Update和Delete操作,需要维护多版本信息,以实现MVCC。
3、MVCC例子事务t1和t2同时访问数据A,t1要做更新操作,t2要做查询操作,假设t1获取了锁,t2并不会等待锁的释放,而是会去读取一个快照数据,由于历史版本数据存储在Undo页中,对数据的修改对于Undo页的读取没有影响,从而达到非一致性锁定读,提高了并发性。
...
深入了解Mysql【十三】事务简单介绍
1、概念
事务是最小的,不可分割的工作单元,一个事务对应一个完整的业务流程,比如转账操作。
数据库系统引入事务的目的是:事务会把数据库从一种一致性状态转换为另一种一致性状态。
2、特性概念来自:MySQL 事务
原子性(atomicity)/ˌætəˈmɪsəti/一个事务中的所有操走,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。事务的原子性通过redo log实现。
一致性(consistency)/kənˈsɪstənsi/在事务开始之前和事务结束之后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。事务的一致性通过undo log实现。
隔离性(isolation)/ˌaɪsəˈleɪʃn/数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个并发事务执行时由于交叉执行而导致数据的不一致。事务的隔离性通过锁来实现。 ...
深入了解Mysql【十二】InnoDB中的死锁、检测与样例分析
1、概念
死锁是指两个或两个以上的事务在执行过程中,因争夺锁资源而造成的一种相互等待的现象。
具体的介绍可以参考我以前写的一篇文章:【并发编程挑战】死锁
2、死锁检测以下文字全部摘抄整理自《MySQL技术内幕 InnoDB存储引擎 第二版》,在InnoDB存储引擎中,采用wait-for graph(等待图)的方式来进行死锁检测。
wait-for graph要求数据库保存一下两种信息:
锁的信息链表
事务等待链表
通过上述链表可以构造出一张图,而在这个图中若存在回路,就代表存在死锁,因此资源间相互发生等待。在wait-for graph中,事务为图中的节点。在图中,事务T1指向T2定义为:
事务T1等待事务T2所占用的资源
事务T1发生在事务T2后面
事务T2所占用的资源不会被强制剥夺
下面通过一个例子分析,当前事务与锁的状态如下图:
由图可知:
事务等待列表中有4个事务,在wait-for graph中对应4个节点。
事务t2对row1(行)占用x锁(独占锁),事务t1对row2(行)占用s锁(共享锁)
事务t1等待事务t2所占用的row1资源,因此在wait-for ...
深入了解Mysql【十一】幻读问题与Next-Key-Locking机制
在默认的事务隔离级别:可重复度(repeatable read),InnoDB采用Next-Key Locking机制来避免幻读问题(Phanton Problem)。
1、幻读的定义
指在同一事务下,连续执行两次同样的SQL语句,可能导致不同的结果,第二次的SQl语句可能会返回之前不存在的行。
2、例子假设表t有一个值1、2、3、4、5组成。此时事务T1执行SQL:
1select * from t where id>3;
结果返回4和5,这时事务没有提交。事务T2,向表中插入了一个6。
这时T1又执行了一个查询,发现结果为4、5、6,产生了幻读。
3、解决办法使用Next-Key Locking机制,来避免幻读。行锁有三种算法:
Record Lock单个行记录上的锁,会去锁定索引记录。
Gap Lock间隙所,锁定一个范围,但是不包含记录本身。
Next-Key Lock上面两种锁的结合,锁定一个范围和记录本身,InnoDB中行的查询都采用这种锁定算法。采用Next-Key Lock的锁定技术称为Next-Key Lokong。
参考MySQL 加锁处理分析
深入了解Mysql【十】B+树聚集索引与辅助索引
数据库中的B+树索引分为聚集索引和辅助索引,也可以叫聚簇索引与非聚簇索引,其内部都是高度平衡的B+树。聚集索引与辅助索引最大的不同是:聚集索引叶子节点存放的是一整行信息。
1、聚集索引
InnoDB是索引组织表,表中的数据按照主键顺序存放,聚集索引是按照每张表的主键构造的一颗B+树。
叶子节点存储了表的行数据,也叫做数据页。每个数据页通过双向链表进行链接。
因为数据页只能按照一颗B+树进行排序,所以每张表只能拥有一个聚集索引。
因为只能在数据页上查找行记录,所以查询性能稳定;又因为数据页直接通过双向链表链接,所以范围查询很快捷。
2、辅助索引
辅助索引也称非聚集索引,叶子节点除了包含键值以外,还包含与之对应的行数据的聚集索引的键值。
每张表上可以有多个辅助索引。
当通过辅助索引查询数据,会执行两次查询:首先从辅助索引中获取聚集索引的键值,再通过获取的键值去聚集索引中获取行数据。
下图中,name属性为辅助索引,通过name获取到主键id,再通过主键id就可以获取到数据行。
参考MySQL索引背后的数据结构及算法原理