Elasticsearch环境搭建和river数据导入(一)

虽然花了几天时间调研Solr,后来还是觉得Elasticsearch更靠谱呐,你看支持原生的分片、副本、集群分布式还不用借助zookeeper或者etcd,不用你自己去了解一大堆分布式系统的知识才能开始捣腾,而且还是开源界的新贵当然其实都2.0了其实也不是很新

总之就是看上去比apache基金会的那个靠谱,咳咳。如果你更关心它们具体的区别,可以参考这里

http://solr-vs-elasticsearch.com/

elasticsearch的环境搭建其实都没什么好讲的,因为实在是对新人太友好了嗯,相比之下Solr就显得有那么一点神坑其实也只是我没有认真读文档,急功近利想马上就搭起来用的原因啦

搭建一个单机的es非常的简单。

step 1:
wget -c https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/zip/elasticsearch/2.0.0/elasticsearch-2.0.0.zip

step 2:
unzip elasticsearch-2.0.0.zip

step 3:
cd elasticsearch-2.0.0 && bin/elasticsearch

然后,搭好了!矮油,怎么能这么好用。开源软件们这两年越来越靠谱了你说是不是。

es启动的时候可以看到会自动占用并绑定两个端口。9300会被用来做es集群间的通信,9200用来做http的查询端口。当然了,这些都是默认值,可以修改。

所以这时候你

curl localhost:9200

就会看到响应了

{
  "name" : "Absorbing Man",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "2.0.0",
    "build_hash" : "de54438d6af8f9340d50c5c786151783ce7d6be5",
    "build_timestamp" : "2015-10-22T08:09:48Z",
    "build_snapshot" : false,
    "lucene_version" : "5.2.1"
  },
  "tagline" : "You Know, for Search"
}

一般的资料这时候会接着去讲es里要怎么对索引和索引下的文档做传统的CRUD操作了,不过我们的主要目的是用它来解决数据库的文题,所以下面主要讲如何用它来索引MySQL里的数据。

先抄袭一下别人的理解,MySQL里的一些概念和es里的概念可以有一一对应:

Relational DB -> Databases -> Tables -> Rows -> Columns

Elasticsearch -> Indices   -> Types  -> Documents -> Fields

理解了对应关系之后,我们在这个基础上把MySQL里的工作表导入到es里来。

es在早期版本中官方实现了很多river插件,并且集成到es里,后来官方反悔认为是这些river插件给es带来了很多bug,但是我们觉得他们是在胡扯。具体的官方说明可以参考这里:

https://www.elastic.co/blog/deprecating-rivers

官方这么说当然也有一定的道理,软件变得复杂了以后按照功能拆分成子软件其实也无可厚非。目前他们推崇的方式也就是让以前的那些es的river插件变成logstash的插件,但看起来实质上除了职责分离开来也没有啥本质区别。扯远了。

目前仍然可用的从MySQL里同步数据到es里大概有这么几种方式:

1.用river工具
已经变成了独立的工具,而非es的插件,比如下面这个:
https://github.com/jprante/elasticsearch-jdbc
这个程序和之前文章里讲的Solr官方支持的全量导入和增量导入方式比较类似,都是用MySQL表里的update_time时间戳来判断需要导入的数据条目,不过用起来可是比后者简单多了。。至少你不用配schema,不用配dataconfig,也不用自己创建那些麻烦的core。只要仿照bin目录里的例子写几条sql,并且配置好索引的分片数、副本数什么的基本就可以了。

2.用另一种river工具
还有另一种实现思路的river软件是通过MySQL的binlog来进行数据同步,比如下面这个:
https://github.com/scharron/elasticsearch-river-mysql
或者一位国人写的:
https://github.com/siddontang/go-mysql-elasticsearch
不过国人写的这个连他自己都没有在生产环境中使用,所以还是别用了。。
这两个同步工具都要求MySQL的binlog为row format,如果你是在大公司的话,这意味着你可能需要去跟dba撕逼。

3.做双写双更
在操作数据库的时候同时把数据更新到搜索引擎,这个需要自己保证数据一致性,一旦不一致可能修复起来也比较蛋疼。而且这个需要所以对数据库的操作都能够收敛,比如系统里所有的数据库操作全在orm里,那么我们可以去修改orm。
但如果你们的系统很庞大,并且已经到处都是SQL,还是放弃吧!

4.用logstash的jdbc插件
上面也提到了,不展开了。感兴趣的自己去试验吧。

所以最终我们还是得用1,到头来和solr那套数据同步方式也没啥区别。

就是这个插件

https://github.com/jprante/elasticsearch-jdbc

官方的例子都在bin目录下,直接就可以运行,其实这些例子就比较简单易懂了,比solr的那些配置可要简单多了。随便拿一个脚本出来改一改就可以支持简单的数据导入了,比如下面的例子

bin=$JDBC_IMPORTER_HOME/bin
lib=$JDBC_IMPORTER_HOME/lib
echo '{
    "type" : "jdbc",
    "jdbc" : {
        "url" : "jdbc:mysql://localhost:3306/test",
        "user" : "",
        "password" : "",
        "sql" : "select *, id as _id from orders"
    }
}' | java \
       -cp "${lib}/*" \
       -Dlog4j.configurationFile=${bin}/log4j2.xml \
       org.xbib.tools.Runner \
       org.xbib.tools.JDBCImporter

注意例子里的sql的写法,id as _id是为了替换掉es里的对应元素,在增量导入的时候,river工具会以这个id为准,如果已经有这个元素了就去替换其内容,如果不写这个id as _id的话,可能会导致相同元素被重复导入。

这就是一个简单的全量导入的例子,至于增量导入,看一下mysql-schedule.sh,也很简单。

这样就已经可以部署一个单机的es服务了!

Xargin

Xargin

If you don't keep moving, you'll quickly fall behind
Beijing