虽然花了几天时间调研Solr,后来还是觉得Elasticsearch更靠谱呐,你看支持原生的分片、副本、集群分布式还不用借助zookeeper或者etcd,不用你自己去了解一大堆分布式系统的知识才能开始捣腾,而且还是开源界的新贵当然其实都2.0了其实也不是很新。
总之就是看上去比apache基金会的那个靠谱,咳咳。如果你更关心它们具体的区别,可以参考这里
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,但是我们觉得他们是在胡扯。具体的官方说明可以参考这里:
官方这么说当然也有一定的道理,软件变得复杂了以后按照功能拆分成子软件其实也无可厚非。目前他们推崇的方式也就是让以前的那些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那套数据同步方式也没啥区别。
就是这个插件
官方的例子都在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服务了!