目录
前言
elasticsearch通常在项目中用于做海量数据存储和全文搜索,在电商的商品搜索,论坛的发帖搜索中有广泛应用。但是一般这些数据会存储在关系型数据库中例如mysql,mysql数据库拥有良好的事务解决方案,清晰的数据结构,丰富的组合查询功能,是大部分项目的首选存储方案。那么当数据量增长到一定程度,或者有全文搜索、模糊搜索、联想搜索等搜索方面的需求的时候,ES就会比Mysql显得更加合适了。
这个时候问题来了,在现有服务的存储环境主要是mysql的前提下如何把搜索服务交给ES来进行处理,那么就需要将mysql中的数据同步到ES中,并且这种同步操作应该是异步不影响原先服务运行的。我们采用的方案是使用阿里的canal搭建一个主从复制架构,将mysql的数据同步过来到ES,然后ES提供搜索服务
安装ES
首先我们登录ES官网
选择liunx x86平台,本次实战中我们选择的版本是7.10.0。 点击下载,我们可以得到一个elasticsearch的压缩包,然后我们通过ftp将压缩包上传到我们的服务器上你想要安装的目录,然后将压缩包进行解压。
解压之后可以得到一个elasticsearch-7.10.0的文件夹
可以看到解压后的目录如上。下面我们进入bin的目录看到如下
一般elasticsearch启动,应该使用非root用户来执行改命令,所以记住我们需要先创建一个新的用户然后输入命令
./elasticsearch -d
-d表示以守护进程运行,即使退出当前命令也可以在后台执行。
监听或打开安装目录下的logs/elasticsearch.log,有如下的日志输出即为成功
启动成功后,我们在浏览器中输入elasticsearch部署的ip加上9200端口可以返回elasticsearch的相关信息 。
{
"name" : "DESKTOP-KRUG30P",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "FAUTZ1PBTdelqYRhiz876Q",
"version" : {
"number" : "7.10.0",
"build_flavor" : "default",
"build_type" : "zip",
"build_hash" : "51e9d6f22758d0374a0f3f5c6e8f3a7997850f96",
"build_date" : "2020-11-09T21:30:33.964949Z",
"build_snapshot" : false,
"lucene_version" : "8.7.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
如果启动失败的话,有时候可能是因为内存不足的原因,因为elasticsearch默认的分配内存是比较大的,如果你的机器配置比较低可能就无法启动。这个时候可以找到elasticsearch的config目录下有个jvm.options的文件,这个文件就是设置java虚拟机的各种参数
按照例子我们可以降低内存分配再启动试试
一般在使用elasticsearch时我们都会使用到分词器,通常对于中文分词我们会使用ik分词器
可以到GitHub 上进行下载。
一种是我们在plugins目录下自己创建一个文件夹,将ik插件的压缩包解压到此。
另一种是直接通过bin目录下的命令来下载
elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.10.0/elasticsearch-analysis-ik-7.10.0.zip
安装ES-head插件
一般我们需要查看存储数据的时候,都会需要一个图形化的操作工具,这样便于我们操作。那么elasticsearch-head插件就是很好的一种方案。
我们进入GitHub,找到elasticsearch-head项目 可以通过git clone下该项目,也可以直接下载。切换到elasticsearch-head文件目录,然后运行命令
npm install
npm run start &
看到上面的日志输出即为成功。
打开浏览器访问主机ip:9100端口可以看到
这个就是我们的elasticsearch-head控制台。
安全保护
上面两步已经完成了对elasticsearch和elasticsearch-head的安装。那么刚才的访问都是匿名的,对于我们来说是不安全的容易收到外界的攻击。所以我们需要激活elasticsearch的x-pack功能来增加账号密码的验证。
首先进入elasticsearch的安装目录找到config文件夹,进入elasticsearch.yml文件,在末尾添加上如下的配置
#支持跨域
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Content-Type,Accept,Authorization, x-requested-with
#password
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.client_authentication: required
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
跨域是为了解决设置账号密码之后elasticsearch-head访问的跨域问题,下面的是开启相关的安全参数。退出保存后,进入安装目录下的bin文件夹
执行命令
elasticsearch-setup-passwords interactive
按提示输入账号和密码进行配置。
然后我们重启elasticsearch和elasticsearch-head。在浏览器中输入elasticsearch服务的地址加9200端口,访问后会看到需要我们输入账号密码,说明我们elasticsearch的密码配置已经成功了
然后我们访问elasticsearch-head,在浏览器中输入elasticsearch-head服务地址加9100端口后面跟上用户名和密码,例如
http://localhost:9100/?auth_user=elastic&auth_password=elastic
这里账号密码都用的是elastic.
可以看到服务能够正常访问。
此外我们通常会使用spring框架来整合这些中间件服务。由于我们的elasticsearch加了账号密码。我们需要在代码中配置。
首先在配置文件里面加上
然后在配置类中设置账号密码,可以通过spring的@Value读取
到此elasticsearch和elasticsearch-head的配置就完成了