Elasticsearch 6.x版本全文檢索學習之分佈式特性介紹

1、Elasticsearch 6.x版本全文檢索學習之分佈式特性介紹。

  1)、Elasticsearch支持集羣默認,是一個分佈式系統,其好處主要有兩個。
    a、增大系統容量,如內存、磁盤、使得es集羣可以支持PB級別的數據。
    b、提供系統可用性,即使部分節點停止服務,整個集羣依然可以正常服務。
  2)、Elasticsearch集羣由多個es實例組成。
    a、不同集羣通過集羣名字來區分,可以通過cluster.name進行修改,默認爲elasticsearch。
    b、每個es實例本質上是一個JVM進程,且有自己的名字,通過node.name進行修改。

2、cerebro的安裝與運行。Github地址:https://github.com/lmenezes/cerebro。下載,安裝,部署。

 1 [root@slaver4 package]# wget https://github.com/lmenezes/cerebro/releases/download/v0.7.2/cerebro-0.7.2.tgz
 2 --2019-11-01 09:20:22--  https://github.com/lmenezes/cerebro/releases/download/v0.7.2/cerebro-0.7.2.tgz
 3 正在解析主機 github.com (github.com)... 13.250.177.223
 4 正在連接 github.com (github.com)|13.250.177.223|:443... 已連接。
 5 已發出 HTTP 請求,正在等待迴應... 302 Found
 6 位置:https://github-production-release-asset-2e65be.s3.amazonaws.com/54560347/a5bf160e-d454-11e7-849b-758511101a2f?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20191101%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20191101T012023Z&X-Amz-Expires=300&X-Amz-Signature=8b121e4e2a72d997441ebf78e2d8bea9deeeb322d1a3fbc676bc8398099b73a3&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=attachment%3B%20filename%3Dcerebro-0.7.2.tgz&response-content-type=application%2Foctet-stream [跟隨至新的 URL]
 7 --2019-11-01 09:20:23--  https://github-production-release-asset-2e65be.s3.amazonaws.com/54560347/a5bf160e-d454-11e7-849b-758511101a2f?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20191101%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20191101T012023Z&X-Amz-Expires=300&X-Amz-Signature=8b121e4e2a72d997441ebf78e2d8bea9deeeb322d1a3fbc676bc8398099b73a3&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=attachment%3B%20filename%3Dcerebro-0.7.2.tgz&response-content-type=application%2Foctet-stream
 8 正在解析主機 github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)... 52.216.130.123
 9 正在連接 github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)|52.216.130.123|:443... 已連接。
10 已發出 HTTP 請求,正在等待迴應... 200 OK
11 長度:52121825 (50M) [application/octet-stream]
12 正在保存至: “cerebro-0.7.2.tgz”
13 
14 100%[======================================================================================================================================================================================>] 52,121,825  1.34MB/s 用時 30s    
15 
16 2019-11-01 09:20:55 (1.65 MB/s) - 已保存 “cerebro-0.7.2.tgz” [52121825/52121825])
17 
18 [root@slaver4 package]# ls
19 cerebro-0.7.2.tgz  elasticsearch-6.7.0.tar.gz  erlang-solutions-1.0-1.noarch.rpm  filebeat-6.7.0-linux-x86_64.tar.gz  kibana-6.7.0-linux-x86_64.tar.gz  logstash-6.7.0.tar.gz  materials  rabbitmq-server-3.5.1-1.noarch.rpm
20 [root@slaver4 package]# tar -zxvf cerebro-0.7.2.tgz -C /home/hadoop/soft/

將cerebro賦予新創建的elsearch用戶,用戶組。

 1 [root@slaver4 package]# cd ../soft/
 2 [root@slaver4 soft]# ls
 3 cerebro-0.7.2  elasticsearch-6.7.0  filebeat-6.7.0-linux-x86_64  kibana-6.7.0-linux-x86_64  logstash-6.7.0
 4 [root@slaver4 soft]# chown elsearch:elsearch cerebro-0.7.2/
 5 [root@slaver4 soft]# su elsearch
 6 [elsearch@slaver4 soft]$ ls
 7 cerebro-0.7.2  elasticsearch-6.7.0  filebeat-6.7.0-linux-x86_64  kibana-6.7.0-linux-x86_64  logstash-6.7.0
 8 [elsearch@slaver4 soft]$ ll
 9 總用量 0
10 drwxr-xr-x.  5 elsearch elsearch  57 11月 28 2017 cerebro-0.7.2
11 drwxr-xr-x.  9 elsearch elsearch 155 10月 25 15:09 elasticsearch-6.7.0
12 drwxr-xr-x.  6 elsearch elsearch 252 10月 26 11:22 filebeat-6.7.0-linux-x86_64
13 drwxr-xr-x. 13 elsearch elsearch 246 10月 25 16:13 kibana-6.7.0-linux-x86_64
14 drwxr-xr-x. 12 elsearch elsearch 255 10月 26 14:37 logstash-6.7.0
15 [elsearch@slaver4 soft]$

安裝了jvm即java就可以運行了。我啓動報瞭如下錯誤,修改一下日誌記錄的路徑。

  1 [elsearch@slaver4 bin]$ ./cerebro
  2 09:27:05,150 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
  3 09:27:05,151 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
  4 09:27:05,151 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/home/hadoop/soft/cerebro-0.7.2/conf/logback.xml]
  5 09:27:05,363 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
  6 09:27:05,371 |-INFO in ch.qos.logback.core.joran.action.ConversionRuleAction - registering conversion word coloredLevel with class [play.api.libs.logback.ColoredLevel]
  7 09:27:05,371 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.FileAppender]
  8 09:27:05,381 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [FILE]
  9 09:27:05,393 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
 10 09:27:05,427 |-INFO in ch.qos.logback.core.FileAppender[FILE] - File property is set to [./logs/application.log]
 11 09:27:05,428 |-ERROR in ch.qos.logback.core.FileAppender[FILE] - Failed to create parent directories for [/home/hadoop/soft/cerebro-0.7.2/./logs/application.log]
 12 09:27:05,429 |-ERROR in ch.qos.logback.core.FileAppender[FILE] - openFile(./logs/application.log,true) call failed. java.io.FileNotFoundException: ./logs/application.log (沒有那個文件或目錄)
 13     at java.io.FileNotFoundException: ./logs/application.log (沒有那個文件或目錄)
 14     at     at java.io.FileOutputStream.open0(Native Method)
 15     at     at java.io.FileOutputStream.open(FileOutputStream.java:270)
 16     at     at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
 17     at     at ch.qos.logback.core.recovery.ResilientFileOutputStream.<init>(ResilientFileOutputStream.java:26)
 18     at     at ch.qos.logback.core.FileAppender.openFile(FileAppender.java:186)
 19     at     at ch.qos.logback.core.FileAppender.start(FileAppender.java:121)
 20     at     at ch.qos.logback.core.joran.action.AppenderAction.end(AppenderAction.java:90)
 21     at     at ch.qos.logback.core.joran.spi.Interpreter.callEndAction(Interpreter.java:309)
 22     at     at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:193)
 23     at     at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:179)
 24     at     at ch.qos.logback.core.joran.spi.EventPlayer.play(EventPlayer.java:62)
 25     at     at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:155)
 26     at     at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:142)
 27     at     at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:103)
 28     at     at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:53)
 29     at     at ch.qos.logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:75)
 30     at     at ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:150)
 31     at     at org.slf4j.impl.StaticLoggerBinder.init(StaticLoggerBinder.java:84)
 32     at     at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:55)
 33     at     at play.api.libs.logback.LogbackLoggerConfigurator.configure(LogbackLoggerConfigurator.scala:80)
 34     at     at play.api.libs.logback.LogbackLoggerConfigurator.configure(LogbackLoggerConfigurator.scala:62)
 35     at     at play.api.inject.guice.GuiceApplicationBuilder$$anonfun$applicationModule$1.apply(GuiceApplicationBuilder.scala:102)
 36     at     at play.api.inject.guice.GuiceApplicationBuilder$$anonfun$applicationModule$1.apply(GuiceApplicationBuilder.scala:102)
 37     at     at scala.Option.foreach(Option.scala:257)
 38     at     at play.api.inject.guice.GuiceApplicationBuilder.applicationModule(GuiceApplicationBuilder.scala:101)
 39     at     at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:181)
 40     at     at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:123)
 41     at     at play.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21)
 42     at     at play.core.server.ProdServerStart$.start(ProdServerStart.scala:47)
 43     at     at play.core.server.ProdServerStart$.main(ProdServerStart.scala:22)
 44     at     at play.core.server.ProdServerStart.main(ProdServerStart.scala)
 45 09:27:05,429 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
 46 09:27:05,431 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
 47 09:27:05,431 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
 48 09:27:05,439 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [play] to INFO
 49 09:27:05,440 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [application] to INFO
 50 09:27:05,440 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.avaje.ebean.config.PropertyMapLoader] to OFF
 51 09:27:05,440 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.avaje.ebeaninternal.server.core.XmlConfigLoader] to OFF
 52 09:27:05,440 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.avaje.ebeaninternal.server.lib.BackgroundThread] to OFF
 53 09:27:05,440 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.gargoylesoftware.htmlunit.javascript] to OFF
 54 09:27:05,440 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to ERROR
 55 09:27:05,440 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
 56 09:27:05,441 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [FILE] to Logger[ROOT]
 57 09:27:05,441 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
 58 09:27:05,442 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@53aac487 - Registering current configuration as safe fallback point
 59 
 60 09:27:05,150 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
 61 09:27:05,151 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
 62 09:27:05,151 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/home/hadoop/soft/cerebro-0.7.2/conf/logback.xml]
 63 09:27:05,363 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
 64 09:27:05,371 |-INFO in ch.qos.logback.core.joran.action.ConversionRuleAction - registering conversion word coloredLevel with class [play.api.libs.logback.ColoredLevel]
 65 09:27:05,371 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.FileAppender]
 66 09:27:05,381 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [FILE]
 67 09:27:05,393 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
 68 09:27:05,427 |-INFO in ch.qos.logback.core.FileAppender[FILE] - File property is set to [./logs/application.log]
 69 09:27:05,428 |-ERROR in ch.qos.logback.core.FileAppender[FILE] - Failed to create parent directories for [/home/hadoop/soft/cerebro-0.7.2/./logs/application.log]
 70 09:27:05,429 |-ERROR in ch.qos.logback.core.FileAppender[FILE] - openFile(./logs/application.log,true) call failed. java.io.FileNotFoundException: ./logs/application.log (沒有那個文件或目錄)
 71     at java.io.FileNotFoundException: ./logs/application.log (沒有那個文件或目錄)
 72     at     at java.io.FileOutputStream.open0(Native Method)
 73     at     at java.io.FileOutputStream.open(FileOutputStream.java:270)
 74     at     at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
 75     at     at ch.qos.logback.core.recovery.ResilientFileOutputStream.<init>(ResilientFileOutputStream.java:26)
 76     at     at ch.qos.logback.core.FileAppender.openFile(FileAppender.java:186)
 77     at     at ch.qos.logback.core.FileAppender.start(FileAppender.java:121)
 78     at     at ch.qos.logback.core.joran.action.AppenderAction.end(AppenderAction.java:90)
 79     at     at ch.qos.logback.core.joran.spi.Interpreter.callEndAction(Interpreter.java:309)
 80     at     at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:193)
 81     at     at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:179)
 82     at     at ch.qos.logback.core.joran.spi.EventPlayer.play(EventPlayer.java:62)
 83     at     at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:155)
 84     at     at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:142)
 85     at     at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:103)
 86     at     at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:53)
 87     at     at ch.qos.logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:75)
 88     at     at ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:150)
 89     at     at org.slf4j.impl.StaticLoggerBinder.init(StaticLoggerBinder.java:84)
 90     at     at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:55)
 91     at     at play.api.libs.logback.LogbackLoggerConfigurator.configure(LogbackLoggerConfigurator.scala:80)
 92     at     at play.api.libs.logback.LogbackLoggerConfigurator.configure(LogbackLoggerConfigurator.scala:62)
 93     at     at play.api.inject.guice.GuiceApplicationBuilder$$anonfun$applicationModule$1.apply(GuiceApplicationBuilder.scala:102)
 94     at     at play.api.inject.guice.GuiceApplicationBuilder$$anonfun$applicationModule$1.apply(GuiceApplicationBuilder.scala:102)
 95     at     at scala.Option.foreach(Option.scala:257)
 96     at     at play.api.inject.guice.GuiceApplicationBuilder.applicationModule(GuiceApplicationBuilder.scala:101)
 97     at     at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:181)
 98     at     at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:123)
 99     at     at play.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21)
100     at     at play.core.server.ProdServerStart$.start(ProdServerStart.scala:47)
101     at     at play.core.server.ProdServerStart$.main(ProdServerStart.scala:22)
102     at     at play.core.server.ProdServerStart.main(ProdServerStart.scala)
103 09:27:05,429 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
104 09:27:05,431 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
105 09:27:05,431 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
106 09:27:05,439 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [play] to INFO
107 09:27:05,440 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [application] to INFO
108 09:27:05,440 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.avaje.ebean.config.PropertyMapLoader] to OFF
109 09:27:05,440 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.avaje.ebeaninternal.server.core.XmlConfigLoader] to OFF
110 09:27:05,440 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.avaje.ebeaninternal.server.lib.BackgroundThread] to OFF
111 09:27:05,440 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.gargoylesoftware.htmlunit.javascript] to OFF
112 09:27:05,440 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to ERROR
113 09:27:05,440 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
114 09:27:05,441 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [FILE] to Logger[ROOT]
115 09:27:05,441 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
116 09:27:05,442 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@53aac487 - Registering current configuration as safe fallback point
117 09:27:05,457 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
118 09:27:05,457 |-INFO in ch.qos.logback.core.joran.action.ConversionRuleAction - registering conversion word coloredLevel with class [play.api.libs.logback.ColoredLevel]
119 09:27:05,457 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.FileAppender]
120 09:27:05,457 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [FILE]
121 09:27:05,458 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
122 09:27:05,459 |-INFO in ch.qos.logback.core.FileAppender[FILE] - File property is set to [/home/hadoop/soft/cerebro-0.7.2/logs/application.log]
123 09:27:05,459 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
124 09:27:05,459 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
125 09:27:05,461 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
126 09:27:05,473 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [play] to INFO
127 09:27:05,474 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [application] to INFO
128 09:27:05,474 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.avaje.ebean.config.PropertyMapLoader] to OFF
129 09:27:05,474 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.avaje.ebeaninternal.server.core.XmlConfigLoader] to OFF
130 09:27:05,474 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.avaje.ebeaninternal.server.lib.BackgroundThread] to OFF
131 09:27:05,474 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.gargoylesoftware.htmlunit.javascript] to OFF
132 09:27:05,474 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to ERROR
133 09:27:05,474 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
134 09:27:05,474 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [FILE] to Logger[ROOT]
135 09:27:05,474 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
136 09:27:05,474 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@534a5a98 - Registering current configuration as safe fallback point
137 
138 [info] play.api.Play - Application started (Prod)
139 [info] p.c.s.NettyServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

修改vim logback.xml,這個配置文件,<file>/home/hadoop/soft/cerebro-0.7.2/logs/application.log</file>,配置成自己的日誌文件路徑即可。

 1 <configuration>
 2 
 3     <conversionRule conversionWord="coloredLevel" converterClass="play.api.libs.logback.ColoredLevel"/>
 4 
 5     <appender name="FILE" class="ch.qos.logback.core.FileAppender">
 6         <file>/home/hadoop/soft/cerebro-0.7.2/logs/application.log</file>
 7         <encoder>
 8             <pattern>%date - [%level] - from %logger in %thread %n%message%n%xException%n</pattern>
 9         </encoder>
10     </appender>
11 
12     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
13         <encoder>
14             <pattern>%coloredLevel %logger{15} - %message%n%xException{5}</pattern>
15         </encoder>
16     </appender>
17 
18     <logger name="play" level="INFO"/>
19     <logger name="application" level="INFO"/>
20 
21     <!-- Off these ones as they are annoying, and anyway we manage configuration ourself -->
22     <logger name="com.avaje.ebean.config.PropertyMapLoader" level="OFF"/>
23     <logger name="com.avaje.ebeaninternal.server.core.XmlConfigLoader" level="OFF"/>
24     <logger name="com.avaje.ebeaninternal.server.lib.BackgroundThread" level="OFF"/>
25     <logger name="com.gargoylesoftware.htmlunit.javascript" level="OFF"/>
26 
27     <root level="ERROR">
28         <appender-ref ref="STDOUT"/>
29         <appender-ref ref="FILE"/>
30     </root>
31 
32 </configuration>

重新啓動,如下所示:

1 [root@slaver4 bin]$ ./cerebro
2 [info] play.api.Play - Application started (Prod)
3 [info] p.c.s.NettyServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

現在啓動你的Elasticseach。訪問地址http://192.168.110.133:9000,界面如下所示:

 連上如下所示:

3、Elasticsearch快速構建集羣。指定集羣名稱cluster.name、path.data的名稱、node.name的名稱、http.port端口號。最後的-d參數在後臺運行。

1 [elsearch@slaver4 bin]$ ./elasticsearch -Ecluster.name=my_cluster -Epath.data=my_cluster_node1 -Enode.name=node1 -Ehttp.port=5200 -d
2 OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
3 [elsearch@slaver4 bin]$ 

4、Cluster state。

  答:Elasticsearch集羣相關的數據稱爲cluster state,主要記錄如下信息。cluster state有版本控制的,創建索引以後,版本更新。
    節點信息,比如節點名稱、連接地址等等。
    索引信息,比如索引名稱、配置等等。
    五角星代表的是主節點、圓代表的是Coordinating節點、方框代表的是data節點。

5、Master Node。

  答:可以修改cluster state的節點稱爲master節點,一個集羣只能有一個。
    cluster state存儲在每個節點上,master維護最新版本並同步給其他節點。
    master節點是通過集羣中所有節點選舉產生的,可以被選舉的節點稱爲master-eligible節點,相關配置如下所示:node.master:true。
6、Coordinating Node。

  答:處理請求的節點即爲coordinating節點,該節點爲所有節點的默認角色,不能取消。
    路由請求到正確的節點處理,比如創建索引的請求到master節點。

7、Data Node。

  答:存儲數據的節點即爲data節點,默認節點都是data類型,相關配置如下。node.data:true。

8、解決單點問題,如果單節點,一個節點掛了,集羣停止服務,可以通過新增節點保障集羣健壯性,運行如下命令,可以啓動一個es節點實例。啓動多個節點依次類推。

  ./elasticsearch -Ecluster.name=my_cluster -Epath.data=my_cluster_node2 -Enode.name=node2 -Ehttp.port=5300 -d。

 1 [root@slaver4 ~]# su elsearch
 2 [elsearch@slaver4 root]$ cd /home/hadoop/soft/
 3 [elsearch@slaver4 soft]$ ls
 4 cerebro-0.7.2  elasticsearch-6.7.0  filebeat-6.7.0-linux-x86_64  kibana-6.7.0-linux-x86_64  logstash-6.7.0
 5 [elsearch@slaver4 soft]$ cd elasticsearch-6.7.0/
 6 [elsearch@slaver4 elasticsearch-6.7.0]$ ls
 7 bin  config  data  lib  LICENSE.txt  logs  modules  my_cluster_node1  NOTICE.txt  plugins  README.textile
 8 [elsearch@slaver4 elasticsearch-6.7.0]$ cd bin/
 9 [elsearch@slaver4 bin]$ ./elasticsearch -Ecluster.name=my_cluster -Epath.data=my_cluster_node2 -Enode.name=node2 -Ehttp.port=5300 -d
10 OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
11 [elsearch@slaver4 bin]$ ./elasticsearch -Ecluster.name=my_cluster -Epath.data=my_cluster_node1 -Enode.name=node1 -Ehttp.port=5200 -d
12 OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
13 [elsearch@slaver4 bin]$ 

如果使用的是虛擬機,一定要將此配置修改爲這樣,不然你是將節點加不到一個集羣裏面的。

[elsearch@slaver4 config]$ vim elasticsearch.yml

1 network.host: 0.0.0.0

效果如下所示:

9、提供系統可用性。

  答:服務可用性:2個節點的情況下,允許其中1個節點停止服務。
    數據可用性。a、引入副本(Replication)解決。b、每個節點上都有完備的數據。

10、elasticsearch的副本和分片。

  如何將數據分佈到所有節點上,引入分片(Shard)解決問題。

  分片是ES支持PB級數據的基石,特點:a、分片存儲了部分數據,可以分佈於任意節點上。b、分片數在索引創建時指定且後續不允許再更改,默認爲5個。c、分片有主分片和副本分片之分,以實現數據的高可用。d、副本分片的數據由主分片同步,可以有多個,從而提高讀取的吞吐量。

創建索引的兩種方式,第一種,直接使用api進行創建即可,如下所示:

在集羣中test_index索引,創建3個分片和1個副本。Primary Shard主分片、Replication Shard副本分片。

# 在集羣中test_index索引,創建3個分片和1個副本。Primary Shard主分片、Replication Shard副本分片。
PUT test_index
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }
}

方式二,直接使用頁面創建即可,如下所示:

實線表示主分片,虛線表示副分片,主分片和副本分片一一對應。效果如下所示:

11、如果集羣是三個節點,此時增加節點是否能提高test_index的數據容量?

  答:不能,因爲只有3個分片,已經分佈在3臺節點上,新增的節點無法利用。

12、如果集羣是三個節點,此時增加副本數是否能提高test_index的讀取吞吐量?。

  答:不能,因爲新增的副本是分佈在3個節點上,還是利用了同樣的資源,如果要增加吞吐量,還需要增加節點。

13、分片數的設定非常重要,需要提前規劃好。

  分片數太少,導致後續無法通過增加節點實現水平擴容。
  分片數過大,導致一個節點上分佈多個分片,造成資源浪費,同時會影響查詢性能。

14、集羣狀態Cluster Health。三種狀態只是代表分片的工作狀態,並不是代表整個es集羣是否能夠對外提供服務Rest api獲取狀態:GET _cluster/health。

  通過如下api可以查看集羣健康狀況,包括以下三種:
    a、green 健康狀態,指所有主副分片都正常分配。
    b、yellow 指所有主分片都正常分配,但是有副本分片未正常分配。
    c、red 有主分片未分配。但是可以訪問該集羣的。

Rest api獲取狀態:GET _cluster/health。 

15、elasticsearch故障轉移。圖文參考:https://blog.csdn.net/weixin_40792878/article/details/86096009#2_84

備註:紅色截圖來源於慕課網。

  假設集羣由3個節點組成,此時集羣狀態是green。初始狀態,node1節點(P0、R1分片)、node2節點(P1、R2分片)、node3節點(P2、R0分片)。
  如果node1(node1節點是主節點)所在機器宕機導致服務終止,此時集羣會如何處理?
    第一步、node2和node3發現node1無法響應一段時間後會發起master選舉,比如這裏選舉node2爲master節點,此時由於主分片P0下線,集羣狀態變爲red。
    第二步、node2發現主分片P0未分配,將R0提升爲主分片。此時由於所有主分片都正常分配,集羣狀態變爲yellow。node2節點(P1、R2分片)、node3節點(P2、P0分片)。
    第三步、node2發現主分片P0和P1生成新的副本,集羣狀態變爲green。node2節點(P1、R2、R0分片)、node3節點(P2、P0、R1分片)。

16、elasticsearch文檔分佈式存儲。

  文檔最終會存儲在分片上,elasticsearch使用文檔存儲算法。假設doc1存儲到分片P1,doc1是如何存儲到分片P1的呢,需要文檔到分片的映射算法,目的使得文檔均勻分佈在所有分片上, 以充分利用資源。elasticsearch的分佈式文檔存儲方案使用的是hash算法。

elasticsearch通過如下公式計算文檔對應的分片。
    shard=hash(routing)%number_of_primary_shards。
    解釋如下所示:    
        hash算法保證可以將數據均勻的分散在分片中。
        routing是一個關鍵參數,默認是文檔id,也可以自行指定。
        number_of_primary_shards是主分片數。該算法與主分片數相關,這也是分片數一旦確定後便不能更改的根本原因。
    

17、elasticsearch文檔創建流程。

  第一步、Client客戶端向node3發起創建文檔的請求。
  第二步、node3通過routing計算該文檔應該存儲在Shard1上,查詢cluste state後確認主分片P1在node2上,然後轉發創建文檔的請求到node2。
  第三步、P1接受並執行創建文檔的請求後,將同樣的請求發送到副本分片R1。
  第四步、R1接收並執行創建文檔請求後,通知P1成功的結果。
  第五步、P1接收副本分片結果後,通過node3創建成功。
  第六步、node3返回結果到client。

18、elasticsearch文檔讀取流程。
  第一步、Client向node3發起創建文檔的請求。
  第二步、node3通過routing計算該文檔應該存儲在Shard1上,查詢cluste state後獲取Shard1的主副分片列表,然後以輪詢的機制獲取一個shard,比如這裏是R1,然後轉發讀取文檔的請求到node1。
  第三步、R1接收並執行創建文檔的請求後,將結果返回給node3。
  第四步、node3返回結果給Client。

19、elasticsearch文檔批量創建的流程。
  第一步、Client向node3發起批量創建文檔的請求(bulk)。
  第二步、node3通過routing計算所有文檔對應的shard,然後按照主shard分配對應執行的操作,同時發送請求到涉及的主shard,比如這裏3個主shard都需要參與。
  第三步、主shard接受並執行請求後,將通過的請求同步到對應的副本shard。
  第四步、副本shard執行結果後返回結果到主shard,主shard再返回node3。
  第五步、node3整合結果後返回Client。

20、elasticsearch文檔批量讀取的流程。
  第一步、Client向node3發起批量獲取文檔的請求(mget)。
  第二步、node3通過routing計算所有文檔對應的shard,然後以輪詢的機制獲取要參與的shard,按照shard構建mget請求,同時發送請求到涉及的shard,比如這裏有2個shard需要參與。
  第三步、R1、R2返回文檔結果。
  第四步、node3返回結果給Client。

21、elasticsearch的腦裂問題。腦裂問題,英文爲split-brain,是分佈式系統中的經典網絡問題。

如果node1和node2、node3網絡隔離了。這個時候會發生如下所示的情況。
  node2與node3會重新選舉master,比如node2成爲了新master,此時會更新cluster state,然後node1自己組成集羣后,也會更新cluster state。同一個集羣有兩個master,而維護不同的cluster state,網絡恢復後無法選擇正確的master。

如何解決腦裂問題,解決方案爲僅在可選舉master-eligible節點數大於等於quorum時候纔可以進行master選舉。

quorum = master-eligible 節點數/2 + 1,例如 3個master-eligible節點時,quorum爲2。

解決:設置config/elasticsearch.yml參數配置 discovery.zen.mininum_master_nodes爲quorum的值即可避免腦裂。

22、倒排索引生成不能更改。倒排索引一旦生成,不能更改。

好處,如下所示:
  a、不用考慮併發寫文件的問題,杜絕了鎖機制帶來的性能問題。
  b、由於文件不再更改,可以充分利用文件系統緩存,只允許載入一次,只要內存足夠。
  c、對該文件的讀取都會從內存讀取,性能高。
  d、利於生成緩存數據。
  e、利於對文件進行壓縮存儲,節省磁盤和內存存儲空間。

壞處,如下所示:
  a、寫入新文檔時,必須重新構建倒排索引文件,然後替換老文件後,新文檔才能被檢索,導致文檔實時性受到影響。

文檔搜索實時性,解決新文檔查詢慢的問題,解決方案是新文檔直接生成新的倒排索引文件,查詢的時候同時查詢所有的倒排文件,然後做結果的彙總計算即可。

23、Lucene 中的segment、Elasticsearch中的Index的概念理解。

  a、Lucene採用了這種方案,它構建的單個倒排索引稱爲segment,合在一起稱爲Index(Lucene中的名稱,是segment的集合),與Elasticsearch中的Index(邏輯上document文檔集合)概念不同,Elasticsearch中的一個Shard對應一個Lucene Index。
  b、Lucene會有一個專門的文件來記錄所有的segment信息,稱爲 Commit Point。

24、文檔搜索實時性概念refresh。利用緩存來提升查詢實時性。

  a、segment寫入磁盤的過程依然很耗時,可以藉助文件系統緩存的特性,先將segment在緩存(即內存)中創建並開放查詢來進一步提升實時性,該過程在es中被稱爲refresh。

  b、在refresh之前文檔會先存儲在一個buffer中,refresh時將buffer中的所有文檔清空並生成segment。

  c、Elasticsearch默認每1秒執行一次refresh,因此文檔的實時性被提高到1秒,這也是es被稱爲近實時(Near Real Time)的原因。

refresh將緩存中的文件清空並在磁盤上面生成segment。

25、文檔搜索實時性概念translog。處理緩存易丟失的情況

如果在內存中的segment還沒有寫入磁盤前發生了宕機,那麼其中的文檔就無法恢復了,如何解決這個問題呢?
  a、Elasticsearch引入了translog機制,寫入文檔到buffer的時候,同時將該操作寫入translog。
  b、translog文件會即時寫入磁盤(fsync),6.x默認每個請求都會落盤,可以修改爲每5秒寫一次,這樣風險便是丟失5秒內的數據,相關配置爲index.translog.*。
  c、Elasticsearch啓動的時候會檢查translog文件,並從中恢復數據。

26、文檔搜索實時性概念flush。持久化緩存中的segment。 

flush負責將內存中的segment寫入磁盤,主要做如下的工作。
  a、將translog寫入磁盤。
  b、將index buffer清空,其中的文檔生成一個新的segment,相當於一個refresh操作。
  c、更新commit point並寫入磁盤。
  d、執行fsync操作,將內存中的segment寫入磁盤。
  e、刪除舊的translog文件。

27、文檔搜索實時性概念refresh。

refresh發生的時機主要有如下幾種情況。
  a、間隔時間達到的時候,通過index.settings.refresh_interval來設定,默認是1秒。
  b、index.buffer佔滿時,其大小通過indices.memory.index_buffer_size設置,默認爲jvm heap的10%,所有shard共享。
  c、flush發生的時候也會發生refresh。

28、文檔搜索實時性概念flush

flush發生的時機主要有以下幾種情況:
  a、間隔時間達到時,默認是30分鐘,5.x之前可以通index.translog.flush_threshold_period修改;之後發佈的版本無法設置。
  b、translog佔滿時,其大小可以通過index.translog.flush_threshold_size控制,默認是512MB;每個index有自己的translog。

29、文檔搜索實時性,刪除與更新文檔。

1)、segment一旦生成就不能更改,那麼如果你要刪除文檔該如何操作呢?
  a、Lucene專門維護一個.del的文件,記錄所有已經刪除的文檔,注意,.del上記錄的是文檔在Lucene內部的id。

  b、在查詢結果返回前會過濾掉.del中的所有文檔。
2)、更新文檔如何進行呢?
  a、首先刪除文檔,然後再創建新文檔。

30、Elasticsearch中的Segment Merge。

a、隨着segment的增多,由於一次查詢的segment數增多,查詢速度會變慢。
b、es會定時在後臺進行segment merge的操作,減少segment的 數量。
c、通過force_merge api可以手動強制做segment merge的操作。

 

作者:別先生

博客園:https://www.cnblogs.com/biehongli/

如果您想及時得到個人撰寫文章以及著作的消息推送,可以掃描上方二維碼,關注個人公衆號哦。

 

發佈了434 篇原創文章 · 獲贊 33 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章