elasticsearch应用知识概括

Posted GeorgeLin98

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了elasticsearch应用知识概括相关的知识,希望对你有一定的参考价值。

elasticsearch应用知识概括

mysql数据同步

mysql数据同步方案:

  • logstash或者beat做数据同步,但数据量过大时,会出现同步延时的问题。

  • 同步双写:这是一种最为简单的方式,在将数据写到mysql时,同时将数据写到ES。
    ①优点:业务逻辑简单。
    ②缺点:
    <1>硬编码,有需要写入mysql的地方都需要添加写入ES的代码;
    <2>业务强耦合;
    <3>存在双写失败丢数据风险;
    <4>性能较差:本来mysql的性能不是很高,再加一个ES,系统的性能必然会下降。
    ③上面说的双写失败风险,包括以下几种:
    <1>ES系统不可用;
    <2>程序和ES之间的网络故障;
    <3>程序重启,导致系统来不及写入ES等。
    ④针对这种情况,有数据强一致性要求的,就必须双写放到事务中来处理,而一旦用上事务,则性能下降更加明显。

  • 异步双写(MQ方式):针对上面同步的性能和丢数据问题,可以考虑引入MQ,从而形成了上图的方案。由于MQ的性能基本比mysql高出一个数量级,所以性能可以得到显著的提高。
    ①优点:
    <1>性能高;
    <2>不存在丢数据问题。
    ②缺点:
    <1>还存在硬编码、业务强耦合等问题;
    <2>系统中增加了mq的代码,复杂度增加;
    <3>可能存在时延问题,程序的写入性能提高了,但是由于MQ的消费可能由于网络或其它原因导致用户写入的数据不一定可以马上看到。

  • 异步双写(Worker方式):上面2中方案中都存在硬编码问题,也就是有任何对mysq进行增删改查的地方要么植入ES代码,要么替换为MQ代码,代码的侵入性太强,若是实时要求不高的情况下,可以考虑用定时器来处理。
    ①具体步骤如下:
    <1>数据库的相关表中增加一个字段为timestamp的字段,任何crud操作都会导致该字段的时间发生变化;
    <2>原来程序中的crud操作不做任何变化;
    <3>增加一个定时器程序,让该程序按一定的时间周期扫描指定的表,把该时间段内发生变化的数据提取出来;
    <4>逐条写入到ES中。
    ②优点:
    <1>不改变原来代码,没有侵入性、没有硬编码;
    <2>没有业务强耦合;
    <3>不改变原来程序的性能;
    <4>Worker代码编写简单不需要考虑增删改查。
    ③缺点:
    <1>时效性较差,由于定时器工作周期不可能设在秒级,所以实时性没有上面2中好;
    <2>对数据库有一定的轮询压力,一种改进方法是将轮询放到压力不大的从库上。

  • Binlog 同步方式:上面三种方案要不有代码侵入、要不有硬编码、要不有时延,那么有没有一种更好的方法?答案就是利用mysql的binlog!
    ①具体步骤如下:
    <1>读取mysql的binlog日志,获取指定表的日志信息;
    <2>将读取的信息转为MQ;
    <3>编写一个MQ消费程序;
    <4>不断消费MQ,每消费完一条消息,将消息写入到ES中。
    ②优点:
    <1>没有代码侵入、没有硬编码;
    <2>原有系统不需要任何变化,没有感知;
    <3>性能高;
    <4>业务解耦,不需要关注原来系统的业务逻辑。
    ③缺点:
    <1>构建Binlog系统复杂;
    <2>也像方案二,存在MQ延时的风险。

canal简介

canal简介:

  • canal主要用途是对MySQL数据库增量日志进行解析,提供增量数据的订阅和消费,简单说就是可以对MySQL的增量数据进行实时同步,支持同步到MySQL、Elasticsearch、HBase等数据存储中去。
  • canal工作原理:canal会模拟MySQL主库和从库的交互协议,从而伪装成MySQL的从库,然后向MySQL主库发送dump协议,MySQL主库收到dump请求会向canal推送binlog,canal通过解析binlog将数据同步到其他存储中去。
  • 链接:MySQL如何实时同步数据到ES?试试这款阿里开源的神器!

logstash 和 canal的区别:

  • 在传输上,两者都可以看做传输数据的管道,但logstash可以从数据库读取数据(例:MySql),传输到ES中,而canal能做到的不止这些,它可以把MySql的数据读取出来,配合java代码(貌似只支持java),将读取到的数据存储到任何代码能操作的地方,例如:文件、MySql、Redis、ES等等
  • 在时效性上,logstash配置文件是使用定时器去同步数据,而canal是监听MySql的binlog日志,进而做到数据几乎实时同步(PS:实际开发中基本是1秒~2秒内)
  • 在数据处理上,logstash可以读取多个表,然后分别存储到对应节点,或者可以在存储前进行联表查询,进而存储成一条数据。但当联表查询一对多时,存储成一条数据就变得不现实了,比如:文章搜索,并且连文章对应的评论一起搜索出来。如果用logstash的话,可能需要存成两张表,先根据条件搜索文章表,然后再循环查到的文章列表,再查询评论表,再拼装成数据,接口返回结果。但如果用canal的话,在数据存储到ES前,可以先把对应的评论查询出来,并且拼装成json字符串,当做文章表的单个字段存储到ES中,这样可以直接查询出来,避免反复地查询ES组装数据。在这一点上,理论上用canal查询会更快,更高效。
  • 在对数据库的压力上,logstash的原理是定时扫描变动的表,所以对数据库有一定压力,并且如果有其他程序在进行某条语句更新,锁住了这条行数据,那logstash读取数据时,就会被“卡住”,如果这个时间过长,可能会影响服务器卡死。而canal由于是监听的binlog日志,所以几乎对MySql没有压力,并且binlog已经记录,不会存在数据变动的情况。
  • 读取数据上,logstash可以读取数据库、文本文件,而canal读取的是binlog文件(binlog属于二进制文件)。
  • 学习成本上,logstash相对简单,canal相对难一点。

以上是关于elasticsearch应用知识概括的主要内容,如果未能解决你的问题,请参考以下文章

ElasticSearch知识概括

ElasticSearch知识概括

ElasticSearch知识概括

Beats与Logstash与Kibana知识概括

Beats与Logstash与Kibana知识概括

Beats与Logstash与Kibana知识概括