Elasticsearch伪集群搭建
Elasticsearch单机版安装:https://www.cnblogs.com/biehongli/p/11643482.html
1、Elasticsearch集群版安装,这里进行模拟,是伪集群版的安装,我使用一台机器,通过修改端口号的方式进行伪集群的搭建。
注意:由于单机版的安装过程中出现了各种错误,所以集群版我是直接复制修改好的单机版的(注意:home/hadoop/soft/el_slave/elasticsearch-5.4.3-slaver1/data里面有一个nodes文件夹,将该文件夹删除即可,下面也会提及)。我没有再次通过解压缩安装包的方式,因为单机版报了不少错误,所以用解决完错误的更快些。
Elasticsearch集群版的搭建,是一主二从的方式,即一个master主节点,两个slaver从节点。(备注,我第一次搭建的作为了主节点了,请自行脑补)。
我这里先创建一个el_slave文件夹,然后将第一次单机版的Elasticsearch复制两份,备用。
1 [elsearch@slaver4 soft]$ mkdir el_slave 2 [elsearch@slaver4 soft]$ ls 3 elasticsearch-5.4.3 elasticsearch-head-master el_slave node-v8.16.2-linux-x64 4 [elsearch@slaver4 soft]$ cp -r elasticsearch-5.4.3/ el_slave/ 5 [elsearch@slaver4 soft]$ ls 6 elasticsearch-5.4.3 elasticsearch-head-master el_slave node-v8.16.2-linux-x64 7 [elsearch@slaver4 soft]$ cd el_slave/ 8 [elsearch@slaver4 el_slave]$ ls 9 elasticsearch-5.4.3 10 [elsearch@slaver4 el_slave]$ mv elasticsearch-5.4.3/ elasticsearch-5.4.3-slaver1 11 [elsearch@slaver4 el_slave]$ cp -r elasticsearch-5.4.3-slaver1/ elasticsearch-5.4.3-slaver2 12 [elsearch@slaver4 el_slave]$ ls 13 elasticsearch-5.4.3-slaver1 elasticsearch-5.4.3-slaver2 14 [elsearch@slaver4 el_slave]$
2、开始zao起来,修改主节点的配置文件/home/hadoop/soft/elasticsearch-5.4.3/config/elasticsearch.yml。添加如下所示的内容。
1 # 指定集群的名称 2 cluster.name: biehl01 3 # 给master起一个名称,叫master 4 node.name: master 5 # 告诉此节点,它就是master 6 node.master: true 7 # 绑定的ip地址和默认端口号9200 8 network.host: 192.168.110.133
操作如下所示:
修改主节点配置文件,以后重启一下elasticsearch,查看效果,如下所示:
3、主节点修改,完毕开始修改从节点的配置文件,修改内容如下所示:
1 # 从节点cluster.name要和master主节点的名称要保持一致 2 cluster.name: biehl01 3 # 从节点起一个名称 4 node.name: slave1 5 # 绑定的ip地址 6 network.host: 192.168.110.133 7 # 修改默认的端口号,默认9200 8 http.port: 8200 9 10 # 找到master主节点 11 discovery.zen.ping.unicast.hosts: ["192.168.110.133"]
从节点一配置如下所示:
从节点二配置文件里面添加如下所示内容:
1 # 从节点cluster.name要和master主节点的名称要保持一致 2 cluster.name: biehl01 3 # # 从节点起一个名称 4 node.name: slave2 5 # # 绑定的ip地址 6 network.host: 192.168.110.133 7 # # 修改默认的端口号,默认9200 8 http.port: 7200 9 # 10 # # 找到master主节点,discovery.zen.minimum_master_nodes的值计算是节点总数/2 + 1(三个节点就是写2即可) 11 # discovery.zen.minimum_master_nodes: 2 12 discovery.zen.ping.unicast.hosts: ["192.168.110.133"]
从节点二配置如下所示:
修改完毕,主节点,从节点一二,开始启动,三个节点,发现自己有点单蠢了呢。开始三个节点后台启动,使用jps显示三个进程,但是界面就是显示不了从节点一二,主要造成这个的原因是我复制了主节点,然后分析一下原因,我前台启动,发现报错了,错误如下所示:
1 # 主节点的报错 2 [master] failed to send join request to master [{slave1}{rYUCm8sMRzaXu84zRj3duQ}{qL5ICfOKQKyDTaRytL5vGg}{192.168.110.133}{192.168.110.133:9301}], reason [RemoteTransportException[[slave1][192.168.110.133:9301][internal:discovery/zen/join]]; nested: NotMasterException[Node [{slave1}{rYUCm8sMRzaXu84zRj3duQ}{qL5ICfOKQKyDTaRytL5vGg}{192.168.110.133}{192.168.110.133:9301}] not master for join request]; ], tried [3] times 3 4 # 从节点的报错 5 [slave1] failed to send join request to master [{slave2}{rYUCm8sMRzaXu84zRj3duQ}{jY1TxxwdSkaZkQqdsNTGaQ}{192.168.110.133}{192.168.110.133:9302}], reason [RemoteTransportException[[slave2][192.168.110.133:9302][internal:discovery/zen/join]]; nested: NotMasterException[Node [{slave2}{rYUCm8sMRzaXu84zRj3duQ}{jY1TxxwdSkaZkQqdsNTGaQ}{192.168.110.133}{192.168.110.133:9302}] not master for join request]; ], tried [3] times
错误原因:每个节点索引分片的分配在每新增一个节点都要重新进行一次分配。
在home/hadoop/soft/el_slave/elasticsearch-5.4.3-slaver1/data里面有一个nodes文件夹,将该文件夹删除即可。然后重启从节点一,从节点二,问题解决。
1 [elsearch@slaver4 elasticsearch-5.4.3-slaver1]$ ls 2 bin config data hs_err_pid11491.log lib LICENSE.txt logs modules NOTICE.txt plugins README.textile 3 [elsearch@slaver4 elasticsearch-5.4.3-slaver1]$ cd data/ 4 [elsearch@slaver4 data]$ ls 5 nodes 6 [elsearch@slaver4 data]$ rm -rf nodes/ 7 [elsearch@slaver4 data]$ ls
1 [elsearch@slaver4 elasticsearch-5.4.3-slaver2]$ ls 2 bin config data hs_err_pid11491.log lib LICENSE.txt logs modules NOTICE.txt plugins README.textile 3 [elsearch@slaver4 elasticsearch-5.4.3-slaver2]$ cd data/ 4 [elsearch@slaver4 data]$ ls 5 nodes 6 [elsearch@slaver4 data]$ rm -rf nodes/ 7 [elsearch@slaver4 data]$ ls
重新启动三个节点,启动以后如下所示:
注意:elasticsearch 集群搭建起来,为什么head只显示master?(为什么我启动三个es后 head中只显示了一个master节点)。这种问题,我估计就是自己是复制的主节点的,需要将home/hadoop/soft/el_slave/elasticsearch-5.4.3-slaver1/data/nodes,这个nodes文件夹删除,重新生成,我是这样操作的。
Elasticsearch-head插件的web界面效果如下所示:
至此,ElasticSearch的集群版就已经搭建完毕了。ElasticSearch集群的搭建可以使用更多的参数。你可以通过新增更多的参数配置,来实验ElasticSearch集群版的搭建。
1 # ======================== Elasticsearch Configuration ========================= 2 # 3 # NOTE: Elasticsearch comes with reasonable defaults for most settings. 4 # Before you set out to tweak and tune the configuration, make sure you 5 # understand what are you trying to accomplish and the consequences. 6 # 7 # The primary way of configuring a node is via this file. This template lists 8 # the most important settings you may want to configure for a production cluster. 9 # 10 # Please consult the documentation for further information on configuration options: 11 # https://www.elastic.co/guide/en/elasticsearch/reference/index.html 12 # 13 # ---------------------------------- Cluster ----------------------------------- 14 # 15 # Use a descriptive name for your cluster: 16 # 17 18 # 1、修改这里,是修改集群的名称,如果想将节点加入到集群中,所有节点都必须是这个名称的。 19 # cluster.name: my-application 20 21 22 # 23 # ------------------------------------ Node ------------------------------------ 24 # 25 # Use a descriptive name for the node: 26 # 27 28 # 2、给节点起一个名称。默认node-1 29 #node.name: node-1 30 31 32 # 33 # Add custom attributes to the node: 34 # 35 #node.attr.rack: r1 36 # 37 # ----------------------------------- Paths ------------------------------------ 38 # 39 # Path to directory where to store the data (separate multiple locations by comma): 40 # 41 42 # 3、path.data是存储的数据的路径 43 #path.data: /path/to/data 44 45 46 # 47 # Path to log files: 48 # 49 50 # 4、path.logs是es运行产生的日志文件, 51 #path.logs: /path/to/logs 52 53 54 # 55 # ----------------------------------- Memory ----------------------------------- 56 # 57 # Lock the memory on startup: 58 # 59 #bootstrap.memory_lock: true 60 # 61 # Make sure that the heap size is set to about half the memory available 62 # on the system and that the owner of the process is allowed to use this 63 # limit. 64 # 65 # Elasticsearch performs poorly when the system is swapping the memory. 66 # 67 # ---------------------------------- Network ----------------------------------- 68 # 69 # Set the bind address to a specific IP (IPv4 or IPv6): 70 # 71 #network.host: 192.168.0.1 72 73 # 5、绑定的ip地址和默认端口号9200 74 # network.host: 0.0.0.0 75 76 77 78 # 下面这些配置是我自己加的,上面或者下面标数字的都是默认的。 79 80 # 是否支持跨域 81 http.cors.enabled: true 82 # 83 # *表示支持所有域名 84 http.cors.allow-origin: "*" 85 86 # 指定集群的名称 87 cluster.name: biehl01 88 # 给master起一个名称,叫master 89 node.name: master 90 # 告诉此节点,它就是master 91 node.master: true 92 # 绑定的ip地址和默认端口号9200 93 network.host: 192.168.110.133 94 95 discovery.zen.minimum_master_nodes: 2 96 discovery.zen.ping.unicast.hosts: ["192.168.110.133"] 97 98 99 # 100 # Set a custom port for HTTP: 101 # 102 103 # 6、默认端口号是9200的。 104 # http.port: 9200 105 106 107 108 # 7、Discovery服务发现,配置集群的话,是需要进行修改的。 109 110 111 # 112 # For more information, consult the network module documentation. 113 # 114 # --------------------------------- Discovery ---------------------------------- 115 # 116 # Pass an initial list of hosts to perform discovery when new node is started: 117 # The default list of hosts is ["127.0.0.1", "[::1]"] 118 # 119 120 # 8、集群里面的节点都需要加到里面,如果是伪集群的话,可以使用ip:端口号或者主机名称的形式加进去的,如果是非伪集群,可以直接使用ip:port或者主机名称加进去。 121 # 注意,这里面加的主机节点,是有机会进行选举主节点的,其他未加进去,没有机会进行选择主节点的机会的。 122 #discovery.zen.ping.unicast.hosts: ["host1", "host2"] 123 # 124 # Prevent the "split brain" by configuring the majority of nodes (total number of master-eligible nodes / 2 + 1): 125 # 126 127 # 9、主节点数/ 2 + 1,此值是这样计算的,上面的注释也说明了。此值是为了阻止没有节点做主节点或者都做子节点的情况发生。避免出现脑裂。 128 # 默认值是3,这样才可以选出主节点的。那么这就需要注意了,你的主节点数至少是4的,不然无法正常选举。通过配置这个参数来防止集群脑裂现象 (集群总节点数量/2)+1 129 #discovery.zen.minimum_master_nodes: 3 130 131 132 # 133 # For more information, consult the zen discovery module documentation. 134 # 135 136 137 138 # ---------------------------------- Gateway ----------------------------------- 139 # 140 # Block initial recovery after a full cluster restart until N nodes are started: 141 # 142 #gateway.recover_after_nodes: 3 143 # 144 # For more information, consult the gateway module documentation. 145 # 146 # ---------------------------------- Various ----------------------------------- 147 # 148 # Require explicit names when deleting indices: 149 # 150 #action.destructive_requires_name: true
4、elasticsearch的基础概念总结:
1)、elasticsearch集群:elasticsearch集群是由一个或者多个节点组成的集合。每一个集群都有一个唯一的名称。默认是elasticsearch,我们可以自己设置的cluster_name的值,cluster_name的值非常重要,一个节点就是通过集群的名称加入集群的。然后,每一个节点都有自己的名称。节点是可以存储数据,参与集群索引数据,以及搜索数据的独立服务。
2)、索引,是含有相同属性的文档集合。
3)、类型,索引可以定义一个或者多个类型,文档必须属于一个类型。
4)、文档,文档是可以被索引的基本数据单位。索引在elasticsearch中是通过一个名称来识别的,必须是英文字母小写的,且不含中划线的,我们通过这个索引来对文档进行增删查改的操作。
5)、索引、类型、文档之间的关系,索引相当于数据库里面的database即数据库,类型相当于数据库里面的table即数据表,文档相当于数据库SQL里面的一行记录。
6)、分片,每个索引都有多个分片,每个分片是一个Lucene索引。
7)、备份,拷贝一份分片就完成了分片的备份。
注意:elasticsearch在创建索引的时候,默认创建5个分片,一份备份,这个数据可以进行修改。分片的数量只能在创建索引的时候进行指定,不能在后期进行修改,备份可以进行动态修改的。
5、Elasticsearch的基本用法,基本操作,基本使用。
elasticsearch是以RESTFul api风格来命名自己的api的。api的基本格式,http://<ip地址>:<port端口号>/<索引>/<类型>/<文档id>
注意:api的url里面的元素基本都是elasticsearch的基本概念都是名词,elasticsearch的动作都是常用http动词get/put/post/delete来决定的。
6、索引的创建分为非结构化创建("mappings": { }的json格式值是空的)、结构化创建("mappings": { }的json格式值非空的)。
1)、创建非结构化索引,操作如下所示(注意:这里使用head插件进行创建非结构化索引的哦):
创建完毕以后可以看到一个弹出框,表示创建成功了。
创建的索引,在概览可以看到自己创建的索引了,student是创建的索引的名称(切记,索引名称小写,不可以出现中划线)。每一个方框就是elasticsearch的分片,粗线方框是es的主分片,主分片旁边细线方框是es的备份分片,对应关系,粗线方框0的备份分片是细线方框0。依次类推。
2)、创建非结构化索引,操作如下所示(注意:这里使用head插件进行创建结构化索引的哦):
查看创建的结构化索引,如下所示(修改了记得点击刷新哦):
postman是一个拥有可视化界面的http模拟器,可以验证json结构。之前介绍过,这里简单使用一下。
现在查看一下新创建的索引,如下所示:
7、es的索引创建完毕以后就可以进行es的数据插入。插入分为指定文档id插入和自动产生文档id插入。文档id是什么呢,文档id是一个唯一索引值,指向我们的文档数据。
在head插件概览里面查看docs的变化,docs代表了该索引下所有文档的数量值。
在head插件的数据浏览可以看到刚才插入的一条数据的。
如何让es自动指定文档id呢。如下所示:
自己可以去head插件的概述和数据浏览进行查看,这里仅展示了数据浏览的数据。如下所示:
8、修改Elasticsearch的文档数据。分为直接修改文档、通过脚本修改文档。
这种通过指定文档id进行直接修改的效果如下所示:
通过脚本修改文档。操作如下所示:
不同的方式,请求成功以后自己使用head查看效果即可。
9、删除Elasticsearch的文档、删除Elasticsearch的索引。
删除以后发现数据已经被删除了。
如何删除一个索引呢,可以直接使用head插件进行删除即可。也可以使用请求删除索引。
使用postman的http请求删除索引,如下所示(注意:删除索引,是高危操作,索引删除,其下的数据也将全部删除):
10、Elasticsearch的查询,分为简单查询,条件查询,聚合查询。(注意:Elasticsearch的查询才是重中之重哦!)。
Elasticsearch的条件查询如下所示:
如何对Elasticsearch查询进行关键词的查询。查询出的数据顺序,以_score字段进行默认倒排的。
查询出的数据顺序,以_score字段进行默认倒排的。如何指定数据显示的顺序呢,如下所示:
Elasticsearch聚合查询如下所示:
复杂的聚合函数使用如下所示,可以计算最小值,平均值,最大值等等:
11、Elasticsearch的高级查询。高级查询包含子条件查询(也叫做叶子条件查询),指特定字段查询所指特定值。复合条件查询,指以一定的逻辑组合子条件查询。子条件查询包含Query context、Filter context。
1)、Query context是指在查询过程中,除了判断文档是否满足查询条件外,es还会计算一个_score来标识匹配的程度,旨在判断目标文档和查询条件匹配的有多好。Query context常用查询,包含全文本查询,即针对文本类型数据。字段级别查询,针对结构化数据,如数字、日期等等。全文本查询有模糊匹配,短语匹配,多个字段的匹配查询,以及语法的查询等等。
模糊匹配查询,如下所示,但是模糊匹配有一个缺点,就是比如模糊查询"java入门",会查询出"java高级编程","elasticsearch入门"等等这些词语。
Elasticsearch短语匹配如下所示:
Elasticsearch多字段模糊匹配查询。
Elasticsearch语法查询。语法查询,是根据一定的语法规则进行的查询,一般用作数据搜索,支持通配符,boolean查询,范围查询,正则表达式查询。
语法查询的多字段查询如下所示:
Elasticsearch字段的查询,即结构化数据的查询。term是具体项的含义,range是范围的含义。如下所示:
Elasticsearch范围的查询,gte是大于等于的含义,lte是小于等于的含义。gt是大于的含义,lt是小于的含义。
2)、Filter context的含义,Filter context在查询过程中,只判断该文档是否满足条件,只有yes或者no。Filter context主要用来做数据过滤的,查询的结果会被缓存起来。
Query Context和Filter Context的复合查询,常用查询如固定分数查询、布尔查询。,如下所示:
Elasticsearch在查询返回后会给一个评分_score这个值,固定分数查询就是将分数固定下来,boost可以设置分数的值,如下所示:
布尔查询如下所示,should是或者的关系,满足条件之一即查询出来,must是必须满足两者才查询出来,must就不截图了,替换成should即可测试:
布尔查询和过滤组成的组合查询,must的反义是must_not,自己可以进行测试即可,must和should的替换自行测试,如下所示:
作者:别先生
博客园:https://www.cnblogs.com/biehongli/
如果您想及时得到个人撰写文章以及著作的消息推送,可以扫描上方二维码,关注个人公众号哦。