verdant-docs Documentation 发发发布布布 0.1

Verdant Yang

4月月月 02, 2017

Contents

1 说说说明明明 1 1.1 个人说明 ...... 1

2 目目目录录录 3 2.1 数据库 ...... 3 2.2 Linux操作 ...... 14 2.3 大数据 ...... 14 2.4 其他 ...... 17

Bibliography 27

i ii CHAPTER 1

说明

这是个人整理的学习笔记

个个个人人人说说说明明明

注注注解解解: • 作者: • 博客: • Github地址:https://github.com/verdantyang

1 verdant-docs Documentation, 发发发布布布 0.1

2 Chapter 1. 说说说明明明 CHAPTER 2

目录

数数数据据据库库库

关关关系系系数数数据据据库库库:Mysql、Oracle、SQLite KV数数数据据据库库库:Memcached、Redis、Raik(Amazon) 硬硬硬盘盘盘KV数数数据据据库库库:SSDB(LevelDb) • LevelDB是单机存储引擎 列列列形形形数数数据据据库库库:HBase、BigTable、Cassandra、Hypertable • Cassandra是P2P的(无中心管理节点) 文文文档档档数数数据据据库库库:MongoDB、CouchDB 图图图数数数据据据库库库:Neo4j 图数据库支持ACID规则以及自动索引 书籍推荐: 高性能MySQL 工具推荐: DBeaver MySQL官网: http://dev.mysql.com/doc/ 数据库内核月报: http://mysql.taobao.org/monthly/

关关关系系系型型型数数数据据据库库库-存存存储储储引引引擎擎擎

数数数据据据库库库事事事务务务

ACID表表表示示示 • 原子性(atomicity) • 一致性(consistency)

3 verdant-docs Documentation, 发发发布布布 0.1

• 隔离性(isolation) • 持久性(durability)

事事事务务务级级级别别别

脏脏脏读读读(((dirty read))): 1. 事务T1更新了一行记录的内容,但是并没有提交所做的修改 2. 事务T2读取更新后的行,然后T1执行回滚操作,取消了刚才所做的修改 3. 现在T2所读取的行就无效了 不不不可可可重重重复复复读读读(((nonrepeatable read))): 1. 事务T1读取一行记录,紧接着事务T2修改了T1刚才读取的那一行记录 2. 然后T1又再次读取这行记录,发现与刚才读取的结果不同 幻幻幻像像像读读读(((phantom read))): 1. 事务T1读取一条指定的WHERE子句所返回的结果集 2. 然后事务T2新插入一行记录,这行记录恰好满足T1所使用的查询条件 3. 然后T1又使用相同的查询再次对表进行检索,此时却看到了事务T2刚才插入的新行 InnoDB和XtraDB存储引擎通过MVCC解决了幻像读的问题 MVCC(Multiversion Concurrency Control)是行级锁的一个变种 • 只在REPEATABLE READ和READ COMMITTED两个隔离级别下工作 • 在很多情况下避免了加锁操作,因此开销更低 • 实现了非阻塞的读操作,写操作也只锁定必要的行 InnoDB 的MVCC是通过在每行记录后面保存两个隐藏列实现的 • 这两个列,一个保存了行的创建时间,一个保存行的过期时间(或删除时间) • 存储的不是实际的时间值,而是系统版本号(每开始一个新事务版本号都会自动递增) 事务的隔离级别,从级别低到高依次为: 较低级别的隔离通常可以执行更高的并发,系统的开销也更低 \ 脏读 不可重复读 幻像读 备注 READ UNCOMMITTED Yes Yes Yes - READ COMMITTED No Yes Yes - REPEATABLE READ No No Yes InnoDB默认级别 SERIALIZABLE No No No 会在读取的每一行数据上都加锁 ORACLE数据库 支持 READ COMMITTED 和 SERIALIZABLE 不支持 READ UNCOMMITTED 和 REPEATABLE READ

4 Chapter 2. 目目目录录录 verdant-docs Documentation, 发发发布布布 0.1

事事事务务务实实实现现现相相相关关关

事务日志是以追加的方式实现的: 存储引擎在修改表的数据时只需要修改其内存拷贝,再把该修改行为记录 到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。 事务数据库系统普遍都采用了 Write Ahead Log 策略 即当事务提交时,先写重做日志再修改页 分布式XA事务让存储引擎级别的ACID 可以扩展到数据库层面 MySQL 服务器层不管理事务,事务是由下层的存储引擎实现的(事务标识是一个 64 比特的数字) MySQL 提供了两种事务型的存储引擎:InnoDB、NDB Cluster InnoDB 用日志把随机I/O变成顺序I/O(日志是环形方式写的) • 一旦日志安全写到磁盘,事务就持久化了,即使变更还没写到数据文件 • 如果发生了一些意外(例如断电),InnoDB 可以重放日志并且恢复已经提交的事务

缓缓缓存存存&缓缓缓冲冲冲池池池

待补充

索索索引引引

索引减少了服务器需要扫描的数据量,可帮助服务器避免排序和临时表(原理是排序) • 唯一性不好的数据不适合用索引 • 只有当索引能覆盖查询结果时才能使用索引 优优优点点点:可以提高读取性能(检索) 缺缺缺点点点:会降低数据的写入性能(增删改)、索引可能要占用 大量的存储空间 MySQL中索引是在存储引擎层而不是服务器层实现的 数据视图dba_segments可以查看索引占用空间 唯一限制和主键限制都是通过索引实现的 仅能在 索引中做最左前缀匹配的 LIKE 比较(不支持通配符开头的)

索索索引引引数数数据据据结结结构构构

B Tree(((B-Tree)))即即即平平平衡衡衡多多多路路路查查查找找找树树树 所有叶子结点位于同一层 B+Tree相相相较较较于于于B-Tree:::有有有n棵棵棵子子子树树树的的的结结结点点点中中中含含含有有有n个个个关关关键键键码码码 B+树是一种专门针对磁盘存储而优化的N叉排 序树 树有几层就涉及几次磁盘访问 注:链接键 1-7 到数据值 d1-d7的简单例子(红色列表链接允许快速按顺序遍历) B-Tree 索索索引引引 MyISAM和InnoDB使用的是 B+Tree MyISAM 使用前缀压缩来减少索引的大小(导致索引查找和倒序扫描比较慢) 主主主索索索引引引:::

2.1. 数数数据据据库库库 5 verdant-docs Documentation, 发发发布布布 0.1

图 2.1: 图:B+Tree数据结构

• MyISAM索引和数据是分开的(叶节点的data域存放的是数据记录的地址) • InnoDB数据文件本身就是索引文件(叶节点data域保存了完整的数据记录) 辅辅辅助助助索索索引引引::: • MyISAM主索引要求key唯一,辅助索引key可以重复 • InnoDB辅助索引data域存储相应记录的主键值而不是地址 限限限制制制::: • 不能跳过索引中的列 • 不能打乱列的顺序 • 如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查找 HASH索索索引引引通通通过过过哈哈哈希希希表表表实实实现现现 • 只有精确匹配索引所有列的查询才有效(不支持范围查询,无法用于排序) • Memory引擎默认使用此索引(速度非常快) 使用场景:提高URL等长字符串的查询效率,可建一哈希列(插入数据时配合触发器) 其他索引:空间数据索引(R-Tree)需要使用GIS相关函数进行、全文索引

数数数据据据库库库索索索引引引(((MySQL)))

聚聚聚簇簇簇索索索引引引 的顺序就是数据的物理存储顺序(一个表最多只能有一个聚簇索引) 默认使用主键建立,如果没定义主键会使用一个非空索引 若表中无数据需要聚集,可使用一个和应用无关的自增序列保证数据的按序写入 对于 非自增ID做主键的表,插入新行时可能导致页分裂(大量的数据移动) 非非非聚聚聚簇簇簇索索索引引引 的索引顺序与数据物理排列顺序无关 InnoDB二级索引(除聚簇索引外的)的叶子节点中存储的不是”行指针”,而是主键值 索索索引引引 可以包含一个或多个列的值

6 Chapter 2. 目目目录录录 verdant-docs Documentation, 发发发布布布 0.1

图 2.2: 图:聚簇索引与非聚簇索引(MySQL)

2.1. 数数数据据据库库库 7 verdant-docs Documentation, 发发发布布布 0.1

当不考虑排序和分组时,将选择性最高的列放在前面通常是很好的 5.6之之之前前前不不不能能能跳跳跳过过过索索索引引引中中中的的的列列列(((MySQL只只只能能能高高高效效效地地地使使使用用用索索索引引引的的的最最最左左左前前前缀缀缀列列列))) 为 了 不 跳 过 某 索 引列,可以通过IN匹配某条件的所有数据来使用索引(不能滥用) 5.6加加加入入入了了了ICP(((Index Condition Pushdown)))索索索引引引条条条件件件下下下推推推 原理:WHERE条件如何使用索引 的判断从Server层下推到存储引擎层 功能:从而可以跳过索引中的列、为范围查询右边 的列使用索引 条条条件件件::: • 带有WHERE子句,非子查询,非针对多表的UPDATE/DELETE操作 • 存储引擎支持ICP,且系统参数index_condition_pushdown打开(默认开) • 索引不是聚集索引(InnoDB主键便是聚簇索引),聚簇索引本身也不需要 限制:不支持分区表(5.7解决了此问题)

索索索引引引扫扫扫描描描模模模式式式

紧凑索引扫描(Extra:Using index) 松散索引扫描(Extra:Using index for group-by) 相当于Oracle中的跳跃索引扫描(Skip Index Scan) 即不需要连续扫描索引中得每一个元组,扫描时仅考虑索引中的一部分 当MySQL在GROUP BY时发现不能满足紧凑扫描时,会尝试松散扫描 如果松散扫描也不能用,那么可能会用到临时表或者文件排序 条条条件件件 • 查询在单一表上(5.5后可以在查询中没有GROUP BY和DISTINCT条件) • GROUP BY指定的所有列是索引的一个最左前缀,并且没有其它的列 • 聚合函数只能使用MIN()和MAX(),并且指定的是同一列 还支持AVG()、SUM()、COUNT() • 如果查询中存在GROUP BY指定列外的索引其他部分,必须以常量形式出现 • 索引中的列必须索引整个数据列的值,而不是一个前缀索引(LIKE)

关关关系系系型型型数数数据据据库库库-SQL调调调优优优

查查查询询询的的的生生生命命命周周周期期期为为为::: 1. 从客户端到服务器 2. 查询缓存 3. 在服务器上进行解析和优化并生成执行计划 4. 在存储引擎中进行查询 5. 将结果返回给客户端(增量、逐步返回的过程) 查询指标(记到慢日志中):响应时间(服务时间、排序时间)、扫描行数、返回行数

8 Chapter 2. 目目目录录录 verdant-docs Documentation, 发发发布布布 0.1

图 2.3: 图:数据库查询处理流程(MySQL)

2.1. 数数数据据据库库库 9 verdant-docs Documentation, 发发发布布布 0.1

获获获取取取调调调优优优信信信息息息

EXPLAIN是通过估计得到的结果,而SHOW STATUS则是实际的统计结果

STATUS & PROFILE

SHOW STATUS返回一些计数器结果(统计项首字母大写,可以结合WHERE子句) 语句:SHOW STATUS LIKE ‘%xx%’; • Handler*变量用于统计句柄操作 Handler_read_rnd_next是索引读操作的次数 • Select_*变量是特定类型的 SELECT查询的计数器 • Com*变量统计了每种类型的 SQL 或 CAPI 命令发起过的次数。

FLUSH STATUS; /*请空STATUS计数器*/

/*执行SQL语句*/

SHOW STATUS WHERE Variable_name LIKE 'Handler%' OR Variable_name LIKE 'Created%'; /*获取上条SQL涉及的操作*/

SHOW PROFILE和和和SHOW PROFILES可可可用用用来来来分分分析析析当当当前前前会会会话话话中中中语语语句句句执执执行行行的的的资资资源源源消消消耗耗耗情情情况况况 profiling参数默认是0,需手动开启(select @@profiling;查询,set profiling=1;开启)

SHOW PROFILES; /*列出最近执行的多条语句*/ SHOW PROFILE FOR QUERY n; /*n对应SHOW PROFILES输出中的Query_ID*/ /*可以指定具体的分析项:如cpu、source*/

也可以使用INFORMATION_SCHEMA.PROFILING进行定制化的查询 例:获取某条查询各流程的执行时间和次数

SET @query_id=1; SELECT STATE, SUM(DURATION) AS Total_R, ROUND( 100 * SUM(DURATION)/ (SELECT SUM(DURATION) FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID=@query_id ),2) AS Pct_R, COUNT(*) AS Calls, SUM(DURATION)/ COUNT( *) AS "R/Call" FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID=@query_id GROUPBY STATE ORDERBY Total_R DESC;

存存存储储储引引引擎擎擎统统统计计计信信信息息息

SHOW ENGINE INNODB MUTEX; 返回 InnoDB 互斥体的详细信息 每个互斥体都保护着代码中一个临界区

10 Chapter 2. 目目目录录录 verdant-docs Documentation, 发发发布布布 0.1

SHOW ENGINE INNODB STATUS; 输出InnoDB内部的计数器、统计、事务处理信息 • SEMAPHORES 信号量相关信息 • TRANSACTIONS 事事事务务务相相相关关关信信信息息息(((包包包含含含锁锁锁的的的范范范围围围))) • FILE I/O 显示I/O辅助线程的状态 • BUFFER POOL AND MEMORY 缓冲池及内存统计信息 Buffer pool size单位是页 • LATEST DETECTED DEADLOCK 当服务器内有死锁时出现 SHOW TABLE STATUS; 查询表的相关信息 例:SHOW TABLE STATUS LIKE ‘user’ G(也可查询INFORMATION_SCHEMA)

执执执行行行计计计划划划

Oracle中使用set autotrace on MySQL使用EXPLAIN 5.6以前只能对SELECT语句使用,5.6后能对UPDATE、INSERT进行解释 无法获取触发器、存储过程对结果的影响 id select_type table type possible_keys key key_len ref rows Extra select_type • SIMPLE:简单的select(没有union和子查询) • PRIMARY:最外面的select(在有子查询的语句中,最外面的select查询就是primary) • DERIVED:包含在 FROM子句的子查询中的 SELECT • SUBQUERY:包含在 SELECT列表中的子查询中的 SELECT(不在 FROM子句中) • UNION:union语句的第二个或者说是后面那一条执行语句 type • null:意味着 MySQL 能在优化阶段分解查询语旬,在执行阶段不用再访问表或者索引 • const:能对查询的某部分进行优化并将其转换成一个常量 • eq_ref:索引查找,最多只返回一条符合条件的记录 通常索引是PRIMARY KEY或UNIQUE • ref:索引查找(查找和扫描的棍合体),它返回所有匹配某个值的行 称为ref是因为索引要跟某个参考值相比较 这个参考值或者是一个常数,或者是来自多表查询前一个表里的结果值 • index_merge:表示使用了索引合并优化方法 • range:查询中使用到了范围值(有限制的索引扫描) • index:类似all,除了只有索引树被扫描(使用索引扫描做的排序) • all:对于每个来自于先前的表的行组合,进行完整的表扫描 从好到坏依次是:

2.1. 数数数据据据库库库 11 verdant-docs Documentation, 发发发布布布 0.1

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > all key:选择使用的索引 key_len:被选中使用索引的索引键长度 ref:使用哪个列或常数与key一起从表中选择行 列出是通过常量const,还是某个表的某个字段(如果是JOIN)来过滤的 rows:显示MySQL执行查询的行数(数值越大越不好,说明没有用好索引) Extra:::该该该列列列包包包含含含MySQL解解解决决决查查查询询询的的的详详详细细细信信信息息息 • Using index 只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中信息 • Using where表明会读取实际的行来进行检索 • Using temporary为了解决查询,MySQL需要创建一个临时表来容纳结果 • Using filesort使用文件排序(排序的内容比较多) EXPLAIN PARTITION 会显示查询将访问的分区 可用来观察优化器是否执行了分区过滤(针对分区表) EXPLAIN EXTENDED 会令服务器”逆向编译”执行计划为一个 SELECT语句 再执行SHOW WARNINGS可查重构的查询 SELECT BENCHMARK(次数, 表达式); SQL类型的表达式需用引号括起来 • 只简单地返回服务器执行表达式的时间(不涉及分析和优化的开销) • 多次执行同样的表达式会因为系统缓存命中而影响结果

优优优化化化手手手段段段

优优优化化化范范范围围围查查查询询询

字段设置尽量避免使用null • MySQL会为null值添加索引 • Oracle中is null、is not null不会启用索引 以下操作符可以应用索引:<、<=、=、>、>=、BETWEEN、IN、LIKE 不以 % 或 _ 开头 以下操作符不使用索引:<>、NOT IN、LIKE % 或 _ 开头 尽量避免使用OR(可以用UNION代替)

优优优化化化MAX、、、MIN

COUNT()、MIN()、MAX() • 索引和列非空,通常可以帮助MySQL优化这类表达式 例如:要找到某一列的最小/大值,只需要查询在BTree索引最左端的记录,MySQL可以直接 获取索引一行记录。在优化器生成执行计划的时候就可以利用这一点,在B-Tree 索引中,优 化器会将这个表达式作为一个常数对待。 • 如果WHERE子句没有使用到索引可能涉及全表扫描

12 Chapter 2. 目目目录录录 verdant-docs Documentation, 发发发布布布 0.1

例:

SELECT MIN(actor_id) FROM actor WHERE first_name= 'penelope';

/*优化为*/ SELECT actor_id FROM actor USE INDEX(PRIMARY) WHERE first_name= 'penelope' LIMIT 1;

优优优化化化排排排序序序和和和分分分页页页

MySQL有有有两两两种种种排排排序序序算算算法法法 1. 先将需要排序的字段取出,使用排序区排序后再取数据(须访问两次数据) 2. 一次性将所需的Column全部取出,排序后直接返回(即filesort) • 查询中所有需要的列和ORDER BY的列总大小超过max_length_for_sort_data字节 • 使用了BLOB或者 TEXT(即使不在OREDR BY子句中) MySQL有有有两两两种种种方方方式式式可可可以以以生生生成成成有有有序序序的的的结结结果果果::: 1. 通过排序操作:即Order By 2. 按索引顺序扫描,使用索引来对结果做排序: • 索引的列顺序和 ORDER BY子句的顺序完全一致 • 且所有列的排序方向都一样(倒序或正序,也可以使用常量) 对于很大的表直接使用LIMIT可能效率很低,改为使用延时关联(只查主键从而使用索引),例:

SELECT film_id, description FROM film ORDERBY title LIMIT 50,5;

/*优化为*/ SELECT film.film_id, film.description FROM film INNER JOIN (SELECT film_id FROM film ORDERBY title LIMIT 50,5) AS lim USING(film_id);

切切切分分分查查查询询询

分批次删除数据代替一次全部删除

row_affected = 0 do { row_affected = do_query( "DELETE FROM message WHERE created < DATA_SUB(NOW(), INTERVAL 3 MONTH) LIMIT 10000" ) } while rows_affected > 0

优优优化化化子子子查查查询询询和和和关关关联联联查查查询询询

优化子查询(改成联表查询,尽可能使用索引) 分解关联查询(提高缓存利用率、减小锁竞争)

2.1. 数数数据据据库库库 13 verdant-docs Documentation, 发发发布布布 0.1

MySQL 认为任何一个查询都是一次”关联” • 对任何关联都执行嵌套循环操作(中间通过临时表) • 不会生成查询字节码来执行查询,而是生成查询的一棵指令树(由存储引擎完成)

优优优化化化索索索引引引使使使用用用

使用FORCE INDEX强制使用某个索引 • 由于MySQL 5.6 引入了ICP机制,索引的选取需要在存储引擎层确定,FORCE INDEX确保某个索引被 使用。

关关关系系系型型型数数数据据据库库库-MySQL

服服服务务务器器器层层层

配配配置置置&参参参数数数

内内内置置置库库库

管管管理理理

源源源码码码

Linux操操操作作作

目目目录录录

Linux服服服务务务启启启动动动的的的接接接口口口是是是/etc/init.d目目目录录录下下下,,,其其其形形形式式式都都都是是是script脚脚脚本本本 执 行shell档 案 可 用 绝 对 路 径 或 相 对 路 径,也可将其放在PATH指定的目录内 shell档案可以用bashshell.sh或shshell.sh来执行(需要有rx权限) 第第第一一一行行行 #!/bin/bash(((读读读取取取到到到回回回车车车CR就就就执执执行行行一一一行行行指指指令令令))) exit 返回值

大大大数数数据据据

基基基础础础知知知识识识-分分分布布布式式式通通通信信信

序序序列列列化化化与与与RPC

序列化与RPC:网络中位于不同机器上进程间的交互 • 直接使用JSON或XML作为数据通信格式(必须反复传输相同的数据Schema信息) • 使用二进制数据格式通信:Protocol Buffer、Thrift、Avro 序列化框架:Thrift、Avro、Protobuf、Hessian、Kryo、msgpack 1)))PB(((Google)))序序序列列列化化化与与与RPC框框框架架架,,,开开开源源源部部部分分分未未未提提提供供供RPC实实实现现现,,,常常常用用用于于于数数数据据据序序序列列列化化化 官 方 版 本 支 持 语 言:C++、Java、Python、JavaScript 相比JSON、XML、Thrift,压缩效率最高

14 Chapter 2. 目目目录录录 verdant-docs Documentation, 发发发布布布 0.1

应用:ActiveMQ用于消息存取 2)))Thrift(((FaceBook开开开源源源)))序序序列列列化化化与与与RPC框框框架架架 支持十几种常见语言 支持List、Set、Map等数据结构(PB不支持) 应用:Hadoop、HBase、Cassandra、Hypertable、Scribe 3)))Avro(((Apache开开开源源源)))序序序列列列化化化与与与RPC框框框架架架(((数数数据据据可可可采采采用用用二二二进进进制制制或或或JSON格格格式式式))) 支 持C++、Java、Python、JavaScript等6种编程语言API 使用JSON作为IDL定义语言,支持Record、Array、Map等数据结构 应用:Hadoop Protocol Buffer、、、Thrift、、、Avro使使使用用用流流流程程程::: 1. 使用IDL定义消息体及RPC函数调用接口(编程语言无关) 2. 使用工具依据IDL生成指定语言的编码,例:thrift –gen java MyProject.thrift 3. 在应用程序中链接上一步生成的代码

Protocol buffer

使使使用用用流流流程程程 1. 定义消息格式文件,通常以proto 作为扩展名; 2. 使用Protocol Buffers 编译器生成特定语言(支持 C++、Java、Python)的代码文件; 3. 使用Protocol Buffers 库提供的API 来编写应用程序。 消消消息息息文文文件件件格格格式式式:限定修饰符① | 数据类型② | 字段名称③ | = | 字段编码值④ | [字段默认值⑤] ①.限定修饰符包含 required、optional、repeated • required:表示字段必须提供,不能为空,否则message会被认为是未初始化的 • optional:可选字段,可以设置也可以不设置 – 如果没有设置,会设置一个缺省值 – 可以指定一个缺省值,否则使用系统的缺省值: 数字类型缺省为0;字符类型缺省为空串;逻辑类型缺省为false 对于嵌入的message,缺省值通常是message的实例或原型 – 为了兼容老的版本,升级时很多接口都把后添加的字段统一设置为optional • repeated:字段可以被重复(包括0),可等同于动态数组或列表,值列表是按序存储的 ④.字段编码值 其中1~15的编码时间和空间效率都是最高的 编码值越大,其编码的时间和空间效率就越低(相对于1-15) 生成jar包:protoc -I=$SRC_DIR –java_out=$DST_DIR $SRC_DIR/addressbook.proto 例:protoc –java_out=./src ./proto/addressbook.proto

2.3. 大大大数数数据据据 15 verdant-docs Documentation, 发发发布布布 0.1

消消消息息息队队队列列列

消息队列:子系统间消息的可靠传递 ActiveMQ| RabbitMQ重量级系统、ZeroMQ轻量级、Redis轻量级(支持MQ功能) 性性性能:ZeroMQ > Kafka > RabbitMQ > ActiveMQ 消息持久化存储:除了ZeroMQ都支持 支持两种模式的队列:消息队列模式、Pub-Sub模式 • 消息队列模式生产者将消息存入队列、消费者从队列消费消息 • Pub-Sub模式:生产者将消息发送到指定主题队列,消费者订阅指定主题队列 生产者Push:Scribe、Flume 消费者Pull:Kafka 1)Kafka(Linkedin开源)采用Pub-Sub机制的分布式消息系统 Kafka基基基于于于磁磁磁盘盘盘读读读/写写写操操操作作作,,,其其其消消消息息息是是是存存存储储储在在在外外外部部部文文文件件件中中中的的的 最初被设计为Log收集工具,支持消息传递的”至少送达一次”语义 采用Pull的方式:即Consummer从Broker拉取 应用:Linkedin的流式计算系统Samza即构建在Kafka和YARN之上

图 2.4: 图:Kafaka构成

构构构成成成:::消消消息息息生生生产产产者者者Producer、、、代代代理理理服服服务务务器器器Broker、、、消消消息息息消消消费费费者者者Consummer • 其副本管理单位是Topic的数据分片(每个数据分片是有序、尾部追加的消息队列)

16 Chapter 2. 目目目录录录 verdant-docs Documentation, 发发发布布布 0.1

• 一个Topic的多个分区分布在Kafka集群的多个Server上 Server负责分区中消息的读写操作,每个分区都有一个Server为Leader状态 • Kafaka的很多管理信息都放在ZooKeeper中 • 采用ISR(In-Sync Replicas)机制保证数据一致性 并未使用ZAB/Paxos:因为2f+1个副本最多允许f个副本故障

数数数据据据总总总线线线

数据总线的作用是能够形成数据变化通知通道:近实时性、数据回溯能力、主题订阅能力 实现模式:应用双写(潜在的数据不一致)、Log日志挖掘 Kafka也可以实现数据总线,不过其基于磁盘效率略低 Databus(Linkedin开源)数据总线系统(基于内存、客户端通过Pull方式获取数据) Bootstrap更新数据的长期存储地(存储增量更新、数据快照) 内存数据中继器Relay(环状的内存缓冲区)短期数据存储地 Wormhole(Facebook)数据总线系统采用了Pub-Sub架构

应应应用用用层层层多多多播播播通通通信信信

Gossip协议(即感染协议) 更更更新新新模模模型型型::: • 全部通知:某个节点有更新消息则立即通知所有其他节点 • 反熵:交换信息的效率Push-Pull > Pull > Push 节点P随机选择集群中另一个节点Q交换信息 Q如果更新,则类似P一样继续传播 经过一定轮数的信息交换 • 散布谣言:在反熵模型的基础上增加了传播停止判断 应应应用用用::: Dynamo、Cssandra、Riak系统使用其来进行故障检测、集群资源管理、副本数据修复 BitTorrent、S3用其在节点间交换信息

其其其他他他

RST模模模板板板

二二二级级级标标标题题题

注注注解解解: 注解 - 标题级别和下划线无对应,文档中保持一致就好。 - reST标题可用下列符号标记: # * = - ^ ~ ‘ : . _ + ” 等。

2.4. 其其其他他他 17 verdant-docs Documentation, 发发发布布布 0.1

三三三级级级标标标题题题

四四四级级级标标标题题题

五五五级级级标标标题题题

六六六级级级标标标题题题

字字字体体体

两个连续反引号嵌入代码,如: git status 。 Got GitHub by Jiang Xin. 这是 粗粗粗体体体 ,这是 斜体 。 不留白的粗粗粗体体体和斜体效果 删除线 效果 不留白的删除线效果 下划线 效果 不留白的下划线效果

• Water: H2O • E = mc2 标记符号前后空白用反反反斜斜斜线线线消除

段段段落落落

第一段内容。 第二段和第一段间有一空行。 一个回车不分段, 本行续上行。

保持换行符, 本行不续行。

用新定义的role插入换行, 本行不再续行。

段段段落落落缩缩缩进进进

邮件体段落缩进: > 第一级段落缩进。 > > > 第二级段落缩进。 > > 返回一级段落缩进。

18 Chapter 2. 目目目录录录 verdant-docs Documentation, 发发发布布布 0.1

代代代码码码块块块

双冒号后缩进为代码块。

$ printf "Hello, world.\n"

还可声明语言类型实现语法加亮。

$ printf "Hello, world.\n"

注注注释释释

git Simple and beautiful. hg Another DVCS. subversion VCS with many constrains. Why not Git?

分分分割割割线线线

四条短线或以上显示为分隔线。

列列列表表表

无无无序序序列列列表表表

• 星号、减号、加号开始列表。 – 列表层级和缩进有关。

* 和具体符号无关。 • 返回一级列表。

有有有序序序列列列表表表

1. 数字和点是一种编号方式。 (a) 大写字母编号。 i. 小写字母编号。 2. 继续一级列表。 (a) 大写罗马编号。 i. 小写罗马编号。

2.4. 其其其他他他 19 verdant-docs Documentation, 发发发布布布 0.1

列列列表表表续续续行行行、、、段段段落落落和和和代代代码码码块块块

1. 列表项可以折行, 对齐则自动续行。 2. 列表项可包含多个段落。 空空空行开始的新段落, 新段落要和列表项内容对齐。 3. 列表下的代码段注意对齐即可。

$ printf "Hello, world.\n"

链链链接接接

超超超链链链接接接

• 网址 http://github.com/ • 邮件 [email protected] • 访问 Google 。 • 上面已定义,直接引用 google 链接。 • 链接地址在后面定义,如: GitHub 。 • 反引号括起多个单词的链接。如 my blog 。

内内内部部部跳跳跳转转转

上面定义的位置,可以: • 通过 fig1 跳转。 • 或者 点击这里 跳转。 • 或者参见 内部跳转图例。

表表表格格格

表 2.1: 示例表格 head1 head2 head3 cell cell rowspan

colspan

another line

20 Chapter 2. 目目目录录录 verdant-docs Documentation, 发发发布布布 0.1

图 2.5: 内部跳转图例

2.4. 其其其他他他 21 verdant-docs Documentation, 发发发布布布 0.1

图图图片片片

图 2.6: 图:GitHub Octocat

••• GitHub Logo:

22 Chapter 2. 目目目录录录 verdant-docs Documentation, 发发发布布布 0.1

• 带链接的图片:

2.4. 其其其他他他 23 verdant-docs Documentation, 发发发布布布 0.1

• 下下下图图图向向向右右右浮浮浮动动动。。。

其其其他他他

转转转义义义

反斜线作为转义字符,禁止对后面 *字符* 做语法解析。

脚脚脚注注注 reST脚注的多种表示法: • 脚注即可以手动分配数字1 , 也可以使用井号自动分配2 。 • 自动分配脚注3 也可以用 添加标签形式3 多次引用。 1 数字编号脚注。 2 井号自动编号。 3 井号添加标签以便多次引用。

24 Chapter 2. 目目目录录录 verdant-docs Documentation, 发发发布布布 0.1

• 还支持用星号嵌入符号式脚注, 如这个*0 和 这个†0 。 • 使用单词做标识亦可 [CIT2012] 。 • genindex • modindex • search

0 星号自动用符号做脚注标记。 0 星号自动用符号做脚注标记。

2.4. 其其其他他他 25 verdant-docs Documentation, 发发发布布布 0.1

26 Chapter 2. 目目目录录录 Bibliography

[CIT2012] 单词或其他规定格式。

27