From 789588b1951ad6f69e96f10f89509a5ddcdfa5cf Mon Sep 17 00:00:00 2001 From: Xargin Date: Mon, 24 Dec 2018 00:30:02 +0800 Subject: [PATCH] remove all ascii img --- ch6-cloud/ch6-04-search-engine.md | 147 +++++++----------------------- images/ch6-binlog-sync.png | Bin 0 -> 15400 bytes images/ch6-posting_list.png | Bin 0 -> 21182 bytes images/ch6-sync.png | Bin 0 -> 17011 bytes 4 files changed, 32 insertions(+), 115 deletions(-) create mode 100644 images/ch6-binlog-sync.png create mode 100644 images/ch6-posting_list.png create mode 100644 images/ch6-sync.png diff --git a/ch6-cloud/ch6-04-search-engine.md b/ch6-cloud/ch6-04-search-engine.md index e6807d6..348dd16 100644 --- a/ch6-cloud/ch6-04-search-engine.md +++ b/ch6-cloud/ch6-04-search-engine.md @@ -1,59 +1,40 @@ # 6.4 分布式搜索引擎 -在Web一章中,我们提到 MySQL 很脆弱。数据库系统本身要保证实时和强一致性,所以其功能设计上都是为了满足这种一致性需求。比如 write ahead log 的设计,基于 B+ 树实现的索引和数据组织,以及基于 MVCC 实现的事务等等。 +在Web一章中,我们提到MySQL很脆弱。数据库系统本身要保证实时和强一致性,所以其功能设计上都是为了满足这种一致性需求。比如write ahead log的设计,基于B+树实现的索引和数据组织,以及基于MVCC实现的事务等等。 -关系型数据库一般被用于实现 OLTP 系统,所谓 OLTP,援引 wikipedia: +关系型数据库一般被用于实现OLTP系统,所谓OLTP,援引wikipedia: > 在线交易处理(OLTP, Online transaction processing)是指透过信息系统、电脑网络及数据库,以线上交易的方式处理一般即时性的作业数据,和更早期传统数据库系统大量批量的作业方式并不相同。OLTP通常被运用于自动化的数据处理工作,如订单输入、金融业务…等反复性的日常性交易活动。和其相对的是属于决策分析层次的联机分析处理(OLAP)。 -在互联网的业务场景中,也有一些实时性要求不高(可以接受多 s 的延迟),但是查询复杂性却很高的场景。举个例子,在电商的 wms 系统中,或者在大多数业务场景丰富的 crm 或者客服系统中,可能需要提供几十个字段的随意组合查询功能。这种系统的数据维度天生众多,比如一个电商的 wms 中对一件货物的描述,可能有下面这些字段: +在互联网的业务场景中,也有一些实时性要求不高(可以接受多秒的延迟),但是查询复杂性却很高的场景。举个例子,在电商的wms系统中,或者在大多数业务场景丰富的crm或者客服系统中,可能需要提供几十个字段的随意组合查询功能。这种系统的数据维度天生众多,比如一个电商的wms中对一件货物的描述,可能有下面这些字段: -> 仓库 id,入库时间,库位分区 id,储存货架 id,入库操作员 id,出库操作员 id,库存数量,过期时间,sku 类型,产品品牌,产品分类,内件数量 +> 仓库id,入库时间,库位分区id,储存货架id,入库操作员id,出库操作员id,库存数量,过期时间,sku类型,产品品牌,产品分类,内件数量 除了上述信息,如果商品在仓库内有流转。可能还有有关联的流程 id,当前的流转状态等等。 想像一下,如果我们所经营的是一个大型电商,每天有千万级别的订单,那么在这个数据库中查询和建立合适的索引都是一件非常难的事情。 -在 CRM 或客服类系统中,常常有根据关键字进行搜索的需求,大型互联网公司每天会接收数以万计的用户投诉。而考虑到事件溯源,用户的投诉至少要存 2~3 年。又是千万级甚至上亿的数据。根据关键字进行一次 like 查询,可能整个 MySQL 就直接挂掉了。 +在CRM或客服类系统中,常常有根据关键字进行搜索的需求,大型互联网公司每天会接收数以万计的用户投诉。而考虑到事件溯源,用户的投诉至少要存2~3年。又是千万级甚至上亿的数据。根据关键字进行一次like查询,可能整个MySQL就直接挂掉了。 这时候我们就需要搜索引擎来救场了。 ## 搜索引擎 -elasticsearch 是开源分布式搜索引擎的霸主,其依赖于 Lucene 实现,在部署和运维方面做了很多优化。当今搭建一个分布式搜索引擎比起 Sphinx 的时代已经是容易很多很多了。只要简单配置客户端 ip 和端口就可以了。 +Elasticsearch是开源分布式搜索引擎的霸主,其依赖于Lucene实现,在部署和运维方面做了很多优化。当今搭建一个分布式搜索引擎比起Sphinx的时代已经是容易很多很多了。只要简单配置客户端IP和端口就可以了。 ### 倒排列表 -虽然 es 是针对搜索场景来定制的,但如前文所言,实际应用中常常用 es 来作为 database 来使用,就是因为倒排列表的特性。可以用比较朴素的观点来理解倒排索引: +虽然es是针对搜索场景来定制的,但如前文所言,实际应用中常常用es来作为database来使用,就是因为倒排列表的特性。可以用比较朴素的观点来理解倒排索引: -``` -┌─────────────────┐ ┌─────────────┬─────────────┬─────────────┬─────────────┐ -│ order_id: 103 │──────▶│ doc_id:4231 │ doc_id:4333 │ doc_id:5123 │ doc_id:9999 │ -└─────────────────┘ └─────────────┴─────────────┴─────────────┴─────────────┘ +![posting-list](../images/ch6-posting_list.png) +对Elasticsearch中的数据进行查询时,本质就是求多个排好序的序列求交集。非数值类型字段涉及到分词问题,大多数内部使用场景下,我们可以直接使用默认的bi-gram分词。什么是bi-gram分词呢: - - - -┌─────────────────┐ ┌─────────────┬─────────────┬─────────────┬─────────────┬─────────────┐ -│ sku_id: 30221 │──────▶│ doc_id:4231 │ doc_id:5123 │ doc_id:5644 │ doc_id:7801 │ doc_id:9999 │ -└─────────────────┘ └─────────────┴─────────────┴─────────────┴─────────────┴─────────────┘ - - - - -┌─────────────────┐ ┌─────────────┬─────────────┬─────────────┬─────────────┬─────────────┬─────────────┬─────────────┐ -│ city_id: 3 │──────▶│ doc_id:5123 │ doc_id:9999 │doc_id:10232 │doc_id:54321 │doc_id:63142 │doc_id:71230 │doc_id:90123 │ -└─────────────────┘ └─────────────┴─────────────┴─────────────┴─────────────┴─────────────┴─────────────┴─────────────┘ -``` - -对 es 中的数据进行查询时,本质就是求多个排好序的序列求交集。非数值类型字段涉及到分词问题,大多数内部使用场景下,我们可以直接使用默认的 bi-gram 分词。什么是 bi-gram 分词呢: - -即将所有 Ti 和 T(i+1) 组成一个词(在 es 中叫 term),然后再编排其倒排列表,这样我们的倒排列表大概就是这样的: +即将所有Ti和T(i+1)组成一个词(在es中叫term),然后再编排其倒排列表,这样我们的倒排列表大概就是这样的: ![terms](../images/ch6-terms.png) -当用户搜索 '天气很好' 时,其实就是求:天气、气很、很好三组倒排列表的交集,但这里的相等判断逻辑有些特殊,用伪代码表示一下: +当用户搜索'天气很好'时,其实就是求:天气、气很、很好三组倒排列表的交集,但这里的相等判断逻辑有些特殊,用伪代码表示一下: ```go func equal() { @@ -76,7 +57,7 @@ func equal() { } ``` -多个有序列表求交集的时间复杂度是:O(N * M), N 为给定列表当中元素数最小的集合, M 为给定列表的个数。 +多个有序列表求交集的时间复杂度是:O(N * M),N为给定列表当中元素数最小的集合,M为给定列表的个数。 在整个算法中起决定作用的一是最短的倒排列表的长度,其次是词数总和,一般词数不会很大(想像一下,你会在搜索引擎里输入几百字来搜索么?),所以起决定性作用的,一般是所有倒排列表中,最短的那一个的长度。 @@ -84,7 +65,7 @@ func equal() { ### 查询 DSL -es 定义了一套查询 DSL,当我们把 es 当数据库使用时,需要用到其 bool 查询。举个例子: +es定义了一套查询DSL,当我们把es当数据库使用时,需要用到其bool查询。举个例子: ```json { @@ -139,7 +120,7 @@ if field_1 == 1 && field_2 == 2 && field_3 == 3 && field_4 == 4 { } ``` -用 bool should query 可以表示 or 的逻辑: +用bool should query可以表示or的逻辑: ```json { @@ -178,7 +159,7 @@ if field_1 == 1 || field_2 == 2 { } ``` -这些 Go 代码里 if 后面跟着的表达式在编程语言中有专有名词来表达 Boolean Expression: +这些Go代码里`if`后面跟着的表达式在编程语言中有专有名词来表达Boolean Expression: ```go 4 > 1 @@ -186,7 +167,7 @@ if field_1 == 1 || field_2 == 2 { 3 < i && x > 10 ``` -es 的 Bool Query 方案,实际上就是用 json 来表达了这种程序语言中的 Boolean Expression,为什么可以这么做呢?因为 json 本身是可以表达树形结构的,我们的程序代码在被编译器 parse 之后,也会变成 AST,而 AST 抽象语法树,顾名思义,就是树形结构。理论上 json 能够完备地表达一段程序代码被 parse 之后的结果。这里的 Boolean Expression 被编译器 Parse 之后也会生成差不多的树形结构,而且只是整个编译器实现的一个很小的子集。 +es的`Bool Query`方案,实际上就是用json来表达了这种程序语言中的Boolean Expression,为什么可以这么做呢?因为json本身是可以表达树形结构的,我们的程序代码在被编译器parse之后,也会变成AST,而AST抽象语法树,顾名思义,就是树形结构。理论上json能够完备地表达一段程序代码被parse之后的结果。这里的Boolean Expression被编译器Parse之后也会生成差不多的树形结构,而且只是整个编译器实现的一个很小的子集。 ### 基于 client sdk 做开发 @@ -281,13 +262,13 @@ func deleteDocument( } ``` -因为 lucene 的性质,本质上搜索引擎内的数据是不可变的,所以如果要对 document 进行更新,实际上是按照 id 进行完全覆盖的操作,所以与插入的情况是一样的。 +因为Lucene的性质,本质上搜索引擎内的数据是不可变的,所以如果要对文档进行更新,实际上是按照id进行完全覆盖的操作,所以与插入的情况是一样的。 -使用 es 作为数据库使用时,需要注意,因为 es 有索引合并的操作,所以数据插入到 es 中到可以查询的到需要一段时间(由 es 的 refresh_interval 决定)。所以千万不要把 es 当成强一致的关系型数据库来使用。 +使用es作为数据库使用时,需要注意,因为es有索引合并的操作,所以数据插入到es中到可以查询的到需要一段时间(由es的refresh_interval决定)。所以千万不要把es当成强一致的关系型数据库来使用。 ### 将 sql 转换为 DSL -比如我们有一段 bool 表达式,user_id = 1 and (product_id = 1 and (star_num = 4 or star_num = 5) and banned = 1),写成 SQL 是如下形式: +比如我们有一段bool表达式,`user_id = 1 and (product_id = 1 and (star_num = 4 or star_num = 5) and banned = 1)`,写成SQL是如下形式: ```sql select * from xxx where user_id = 1 and ( @@ -295,7 +276,7 @@ select * from xxx where user_id = 1 and ( ) ``` -写成 es 的 DSL 是如下形式: +写成es的DSL是如下形式: ```json { @@ -356,15 +337,15 @@ select * from xxx where user_id = 1 and ( } ``` -es 的 DSL 虽然很好理解,但是手写起来非常费劲。前面提供了基于 SDK 的方式来写,但也不足够灵活。 +es的DSL虽然很好理解,但是手写起来非常费劲。前面提供了基于 SDK 的方式来写,但也不足够灵活。 -SQL 的 where 部分就是 boolean expression。我们之前提到过,这种 bool 表达式在被 parse 之后,和 es 的 DSL 的结构长得差不多,我们能不能直接通过这种“差不多”的猜测来直接帮我们把 SQL 转换成 DSL 呢? +SQL的where部分就是boolean expression。我们之前提到过,这种bool表达式在被parse之后,和es的DSL的结构长得差不多,我们能不能直接通过这种“差不多”的猜测来直接帮我们把SQL转换成DSL呢? -当然可以,我们把 SQL 的 where 被 Parse 之后的结构和 es 的 DSL 的结构做个对比: +当然可以,我们把SQL的where被Parse之后的结构和es的DSL的结构做个对比: ![ast](../images/ch6-ast-dsl.png) -既然结构上完全一致,逻辑上我们就可以相互转换。我们以广度优先对 AST 树进行遍历,然后将二元表达式转换成 json 字符串,再拼装起来就可以了,限于篇幅,本文中就不给出示例了,读者朋友可以查看: +既然结构上完全一致,逻辑上我们就可以相互转换。我们以广度优先对AST树进行遍历,然后将二元表达式转换成json字符串,再拼装起来就可以了,限于篇幅,本文中就不给出示例了,读者朋友可以查看: > github.com/cch123/elasticsql @@ -372,33 +353,15 @@ SQL 的 where 部分就是 boolean expression。我们之前提到过,这种 b ## 异构数据同步 -在实际应用中,我们很少直接向搜索引擎中写入数据。更为常见的方式是,将 MySQL 或其它关系型数据中的数据同步到搜索引擎中。而搜索引擎的使用方只能对数据进行查询,无法进行修改和删除。 +在实际应用中,我们很少直接向搜索引擎中写入数据。更为常见的方式是,将MySQL或其它关系型数据中的数据同步到搜索引擎中。而搜索引擎的使用方只能对数据进行查询,无法进行修改和删除。 常见的同步方案有两种: ### 通过时间戳进行增量数据同步 -``` - ┌────────────────────────┐ ┌────────────────────────┐ - │ move 10 min data to es │ │ move 10 min data to es │ - └────────────────────────┘ └────────────────────────┘ +![sync to es](../images/ch6-sync.png) - │ │ ┌───────────────┐ -───────────────┼────────────────┬──────────────┴─────────────┬──────────────▶ │ time passes │ - │ ┌───────┐ │ │ └───────────────┘ - │◀──┤ 10min ├───▶│ ┌────────────────────────┐ - │ └───────┘ │ │ move 10 min data to es │ - │ └────────────────────────┘ - │ - │ - │ - │ - ┌────────────────────────┐ - │ move 10 min data to es │ - └────────────────────────┘ -``` - -这种同步方式与业务强绑定,例如 wms 系统中的出库单,我们并不需要非常实时,稍微有延迟也可以接受,那么我们可以每分钟从 MySQL 的出库单表中,把最近十分钟创建的所有出库单取出,批量存入 es 中,具体的逻辑实际上就是一条 SQL: +这种同步方式与业务强绑定,例如wms系统中的出库单,我们并不需要非常实时,稍微有延迟也可以接受,那么我们可以每分钟从MySQL的出库单表中,把最近十分钟创建的所有出库单取出,批量存入es中,具体的逻辑实际上就是一条SQL: ```sql select * from wms_orders where update_time >= date_sub(now(), interval 10 minute); @@ -412,60 +375,14 @@ select * from wms_orders where update_time >= date_sub( ); ``` -取最近 11 分钟有变动的数据覆盖更新到 es 中。这种方案的缺点显而易见,我们必须要求业务数据严格遵守一定的规范。比如这里的,必须要有 update_time 字段,并且每次创建和更新都要保证该字段有正确的时间值。否则我们的同步逻辑就会丢失数据。 +取最近11分钟有变动的数据覆盖更新到es中。这种方案的缺点显而易见,我们必须要求业务数据严格遵守一定的规范。比如这里的,必须要有update_time字段,并且每次创建和更新都要保证该字段有正确的时间值。否则我们的同步逻辑就会丢失数据。 ### 通过 binlog 进行数据同步 -``` - ┌────────────────────────┐ - │ MySQL master │ - └────────────────────────┘ - │ - │ - │ - │ - │ - │ - ▼ - ┌───────────────────┐ - │ row format binlog │ - └───────────────────┘ - │ - │ - │ - ┌───────────────┴──────────────┐ - │ │ - │ │ - ▼ ▼ -┌────────────────────────┐ ┌─────────────────┐ -│ MySQL slave │ │ canal │ -└────────────────────────┘ └─────────────────┘ - │ - ┌─────────┴──────────┐ - │ parsed binlog │ - └─────────┬──────────┘ - │ - ▼ - ┌────────────────┐ - │ kafka │─────┐ - └────────────────┘ │ - │ - │ - │ - │ - ┌───────────┴──────┐ - │ kafka consumer │ - └───────────┬──────┘ - │ - │ - │ - │ ┌────────────────┐ - └─────▶│ elasticsearch │ - └────────────────┘ -``` +![binlog-sync](../images/ch6-binlog-sync.png) -业界使用较多的是阿里开源的 canal,来进行 binlog 解析与同步。canal 会伪装成 MySQL 的从库,然后解析好行格式的 binlog,再以更容易解析的格式(例如 json) 发送到消息队列。 +业界使用较多的是阿里开源的Canal,来进行binlog解析与同步。canal会伪装成MySQL的从库,然后解析好行格式的binlog,再以更容易解析的格式(例如json)发送到消息队列。 -由下游的 kafka 消费者负责把上游数据表的自增主键作为 es 的 document 的 id 进行写入,这样可以保证每次接收到 binlog 时,对应 id 的数据都被覆盖更新为最新。MySQL 的 row 格式的 binlog 会将每条记录的所有字段都提供给下游,所以实际上在向异构数据目标同步数据时,不需要考虑数据是插入还是更新,只要一律按 id 进行覆盖即可。 +由下游的kafka消费者负责把上游数据表的自增主键作为es的document的id进行写入,这样可以保证每次接收到binlog时,对应id的数据都被覆盖更新为最新。MySQL的row格式的binlog会将每条记录的所有字段都提供给下游,所以实际上在向异构数据目标同步数据时,不需要考虑数据是插入还是更新,只要一律按id进行覆盖即可。 -这种模式同样需要业务遵守一条数据表规范,即表中必须有唯一主键 id 来保证我们进入 es 的数据不会发生重复。一旦不遵守该规范,那么就会在同步时导致数据重复。当然,你也可以为每一张需要的表去定制消费者的逻辑,这就不是通用系统讨论的范畴了。 +这种模式同样需要业务遵守一条数据表规范,即表中必须有唯一主键id来保证我们进入es的数据不会发生重复。一旦不遵守该规范,那么就会在同步时导致数据重复。当然,你也可以为每一张需要的表去定制消费者的逻辑,这就不是通用系统讨论的范畴了。 diff --git a/images/ch6-binlog-sync.png b/images/ch6-binlog-sync.png new file mode 100644 index 0000000000000000000000000000000000000000..fd391a812eb2fd2476e1347fc0b69a0d66dafb22 GIT binary patch literal 15400 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 literal 0 HcmV?d00001 diff --git a/images/ch6-posting_list.png b/images/ch6-posting_list.png new file mode 100644 index 0000000000000000000000000000000000000000..146799c821c57af7994bee74a358295ea17dd011 GIT binary patch literal 21182 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 literal 0 HcmV?d00001 diff --git a/images/ch6-sync.png b/images/ch6-sync.png new file mode 100644 index 0000000000000000000000000000000000000000..aaeafb9ea4b2d3dbd0c21dcefa57b1bc4abe1d10 GIT binary patch literal 17011 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 literal 0 HcmV?d00001