一:基于Elasticsearch的搜索服务

本文档详述了如何基于Docker在Linux环境下搭建Elasticsearch三节点集群,包括环境配置、Docker镜像拉取、配置文件设定、启动服务以及设置用户名和密码。此外,还介绍了如何根据官方文档封装Java API工具类,分析业务需求确定索引数据结构,以及数据同步策略的选择。最后,探讨了编码实现中如何利用泛型、反射和多线程实现实时异步和可配置化的搜索服务。
摘要由CSDN通过智能技术生成

前言:

       由于公司XX项目搜索性能太慢(单据搜索,常用字典数据查询,业务报表等等基本涵盖了85%的搜索功能。。。),极端情况下打开一个单据需要等5分钟甚至更久,就算是B端的系统,也到了无法忍受的地步,需要对搜索功能进行统一升级替换,这个工作我接下了,完成后,发现其中有些东西还是值得记录一下的,由于文字编辑能力不到位,所以大部分话说的较为直接,直白????,就算是一些心得体会吧,所以就开了这个专栏。

关于xx系统搜索的慢,我做了些总结,慢基本是由于:

      1.直接查数据库,随着时间推移,单表数据量越来越大,数据复杂,需要关联很多张表,并配合一定的计算逻辑,就算给表中中高频搜索字段建了索引也收效甚微。

      2.mysql库中存储的业务数据主要以编码为主,而返回给前端需要"翻译"成中文等,所以,往往一个完整返回给前端的Json,有很多字段需要单独查询另外一个库(用友NC sqlserver)中的数据,以获取它的中文含义(比如集团,组织,部门的等等。。。),包含了大量的数据库连接,释放等操作,但又无法避免,频繁的I/O操作,非常耗时。有人也许会说在一条sql里 join就可以,但是就算不考虑可能有十几个字段需要从sqlserver十几张不同的表中查询中文含义,可想而知sql的复杂度,而且就算写了,性能问题还是没有解决,而且大概率还会更慢,而且业务放在sql中,后期难以维护。

     3.由于mysql write操作会阻塞其他线程的read和write操作,带来的等待。(系统偶尔崩溃的原因)就算是读写库分离,也还是快不了多少。

     4.编码本身问题,例如在循环里查询数据库这种逆天的操作等等。

     。。。。

     

    所以,综上:选择使用Elasticsearch来重做系统的搜索功能。

    完成后:搜索性能基本 毫秒级 就可完成,一般列表页 200条 数据,基本 38ms~100ms 就会完成搜索。

以200条数据分页为例:

 

本节主要介绍:

         如何搭建一个三节点的ES集群,

         如何根据官方文档来使用ES,以及在项目中集成EsUtil,

         如何来抽象我们的业务需求需要的搜索字段,以及设计索引数据结构,

         利用线程池异步的处理我们的数据,

         使用泛型,反射,并配合数据来实现搜索服务的可配置化,通用化,

      主要以介绍从 0 - 1的思路为主,配合少量代码,关于Elasticsearch一些基础的东西大家自行弥补。全部的代码后续会放在我的Github上,后续还有章节主要介绍Logstash,ES集群运维等相关的东西。

一.基于Docker Linux下 Elasticsearch 三节点 集群的安装与配置

        这里要提一点,前面做经费调研的时候,发现阿里云有提供es的服务,所以可以直接买阿里服务。但是比买相同配置三台干净的服务器自己搭建每年会贵一点,有图有真相:

所以可能由于经费的原因吧,买了三台干净的阿里云服务器自己搭建,不过就算是买的,测试环境大概率还是要自己搭建的,所以本节还是有价值的  - - 。 

由于Elasticsearch天生支持分布式,所以,Elasticsearch集群的搭建还是蛮方便的(当然中间该踩的坑一个不少),注意一些关键配置参数即可

          前置条件:

                          1.centos7.X 服务器 三台 能互相ping通 在同一内网更佳

                           2.每台机器安装配置docker

                           3.每台机器安装配置JDK1.8

*以下四步操作分别在三台机器上分别进行

1. 拉取es6.8.1版本的Docker镜像

     docker pull elasticsearch:6.8.1  

     docker images (确认镜像是否拉取成功)

2.对服务器环境做一些配置,以防止后面启动docker容器的会报一些错误

     总之,这些坑我已经替各位踩了,大家完全没必要再踩一遍,浪费时间


           1. 配置 jvm.options (es内置jvm内存:大小建议为物理机器内存的一半)
           2. 切换到root用户修改配置sysctl.conf ,vi /etc/sysctl.conf 打开配置 sysctl.conf ,最后一行增加: vm.max_map_count=262144,并执行命令:sysctl -p 使之生效即可

3.配置 elasticsearch.yml(Elasticsearch核心配置文件)

      这个配置文件很重要,前面之所以说Elasticsearch天生支持分布式,是因为它有集群发现机制,所以,只要配置好elasticsearch.yml这个配置文件,分别在三台机器上启动Docker容器,使它的集群发现机制生效,那么,三节点的Elasticsearch集群服务就算搭建成功了!由于是搭建三节点集群,所以配置文件有三个:    

机器1 elasticsearch.yml配置 es_01:

机器2 elasticsearch.yml配置 es_02:

机器3 elasticsearch.yml配置 es_03:

  

若是找不到elasticsearch.yml配置文件,可用 find / -type f -name elasticsearch.yml 找到。

前三条配置成功后,就可以启动我们的Docker容器了:

4.启动 Docker容器 ES服务

docker run -it -v /dev/shm/data:/usr/share/elasticsearch/data -v /dev/shm/log:/usr/share/elasticsearch/log --name elasticsearch6.8.1 -p 9200:9200 -p 9300:9300 -d 446946b24cdd    (这里容器中数据和日志文件都挂载到宿主机,可根据实际情况自定义,建好了文件夹后要给读写权限,参考Linux chmod 命令)

5.设置ES服务用户名,密码

由于我们前面的第一个elasticsearch.yml文件中配置了该参数,(只有配置了该参数的机器才需要进行这一步)

    所以在Docker ES服务启动后:

   1.进入容器内部

          docker exec -it <容器ID> /bin/bash   

   2.创建keystore文件 ,若存在则无需覆盖,直接进行下一步 

           bin/elasticsearch-keystore create 

         

   3.在Elasticsearch目录中运行命令:

       ./bin/elasticsearch-setup-passwords interactive

      回车之后为每一个用户设置独立的密码.(建议都设置成一样的,方便使用,后面的Kibana ,Logstash等等都会用到)

 

    最后验证三台机器ES Docker服务是否安装成功 ,浏览器,三台机器依次输入ip:9200,若提示如下图所示,则安装成功:

这里的用户名,密码,就是上一步我们设置的用户名密码登陆后,出现如下界面则成功:

三台机器都验证后,可以使用 Elasticsearch Cat 相关命令来查看集群状态。

二.Elasticsearch官网解读与Java API Utils

1.阅读官方文档提供的API

    官方地址:https://www.elastic.co/g

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值