Docker实战(十二):Docker安装ElasticSearch集群环境

Docker安装ElasticSearch集群环境

ES集群需要配置几个地方,最简单的是配置集群名称和Node名称,其他的基本使用默认值就可以了,下面是elasticsearch.yml配置文件部分属性的用法,可以参考使用

<code class="hljs vala has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 集群名称,默认为elasticsearch</span>
cluster.name: birdESCluster

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 节点Node名称,ES启动时会自动创建节点名称,默认的是从ES的,但你也可进行配置</span>
node.name: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"birdESNode01"</span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 是否作为主节点,每个节点都可以被配置成为主节点,默认值为true</span>
node.master: <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">true</span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 是否存储数据,即存储索引片段,默认值为true</span>
node.data: <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">true</span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># master和data同时配置会产生一些奇异的效果:</span>
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) 当master为<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">false</span>,而data为<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">true</span>时,会对该节点产生严重负荷;
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>) 当master为<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">true</span>,而data为<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">false</span>时,该节点作为一个协调者;
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>) 当master为<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">false</span>,data也为<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">false</span>时,该节点就变成了一个负载均衡器。
你可以通过连接来查看集群状态
http:<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//localhost:9200/_cluster/health</span>
http:<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//localhost:9200/_cluster/nodes</span>
或者使用插件来查看集群状态
http:<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//github.com/lukas-vlcek/bigdesk</span>
http:<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//mobz.github.com/elasticsearch-head</span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 设置一个索引的碎片数量,默认值为5</span>
index.number_of_shards: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 设置一个索引可被复制的数量,默认值为1</span>
index.number_of_replicas: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 当你想要禁用公布式时,你可以进行如下设置:</span>
index.number_of_shards: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>
index.number_of_replicas: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>

这两个属性的设置直接影响集群中索引和搜索操作的执行。假设你有足够的机器来持有碎片和复制品,那么可以按如下规则设置这两个值:
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) 拥有更多的碎片可以提升索引执行能力,并允许通过机器分发一个大型的索引;
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>) 拥有更多的复制器能够提升搜索执行能力以及集群能力。
对于一个索引来说,number_of_shards只能设置一次,而number_of_replicas可以使用索引更新设置API在任何时候被增加或者减少。
ElasticSearch关注加载均衡、迁移、从节点聚集结果等等。可以尝试多种设计来完成这些功能。
可以连接http:<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//localhost:9200/A/_status来检测索引的状态。</span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 配置文件所在的位置,即elasticsearch.yml和logging.yml所在的位置</span>
path.conf: /path/to/conf

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 分配给当前节点的索引数据所在的位置</span>
path.data: /path/to/data

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 可以可选择的包含一个以上的位置,使得数据在文件级别跨越位置,这样在创建时就有更多的自由路径</span>
path.data: /path/to/data1,/path/to/data2

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 日志文件所在位置</span>
path.logs: /path/to/logs

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 临时文件位置</span>
path.work: /path/to/work

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 插件安装位置</span>
path.plugins: /path/to/plugins

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#  默认情况下,ElasticSearch使用0.0.0.0地址(也就是说如果这个机子有几个网卡,则ElasticSearch都可以通过这些IP来使用其服务。所以如果我们的服务器有网卡绑定在外网时一定要注意设置ElasticSearch的属性),并为http传输开启9200-9300端口,为节点到节点的通信开启9300-9400端口,也可以自行设置IP地址:</span>
network.bind_host: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">192.168</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.1</span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># publish_host设置其他节点连接此节点的地址,如果不设置的话,则自动获取,publish_host的地址必须为真实地址:</span>
network.publish_host: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">192.168</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.1</span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># bind_host和publish_host可以一起设置:(如果不想外网访问ES,可以设置这个)</span>
network.host: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">192.168</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.1</span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 可以定制该节点与其他节点交互的端口:</span>
transport.tcp.port: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9300</span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 节点间交互时,可以设置是否压缩,转为为不压缩:</span>
transport.tcp.compress: <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">true</span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 可以为Http传输监听定制端口:</span>
http.port: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9200</span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 设置内容的最大长度:</span>
http.max_content_length: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">100</span>mb

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 禁止HTTP</span>
http.enabled: <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">false</span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 允许在N个节点启动后恢复过程:</span>
gateway.recover_after_nodes: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 设置初始化恢复过程的超时时间:</span>
gateway.recover_after_time: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>m

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 设置ping其他节点时的超时时间,网络比较慢时可将该值设大:</span>
discovery.zen.ping.timeout: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>s

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 禁止当前节点发现多个集群节点,默认值为true:</span>
discovery.zen.ping.multicast.enabled: <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">false</span>

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 设置新节点被启动时能够发现的主节点列表:</span>
discovery.zen.ping.unicast.hosts: [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"10.0.0.28:9300"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"10.0.0.28:9500"</span>]

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 设置是否可以通过正则或者_all删除或者关闭索引</span>
action.destructive_requires_name 默认<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">false</span> 允许 可设置<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">true</span>不允许

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 下面是一些查询时的慢日志参数设置</span>
index.search.slowlog.level: TRACE
index.search.slowlog.threshold.query.warn: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>s
index.search.slowlog.threshold.query.info: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>s
index.search.slowlog.threshold.query.debug: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>s
index.search.slowlog.threshold.query.trace: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">500</span>ms
index.search.slowlog.threshold.fetch.warn: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>s
index.search.slowlog.threshold.fetch.info: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">800</span>ms
index.search.slowlog.threshold.fetch.debug:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">500</span>ms
index.search.slowlog.threshold.fetch.trace: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">200</span>ms
</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li><li style="box-sizing: border-box; padding: 0px 5px;">86</li><li style="box-sizing: border-box; padding: 0px 5px;">87</li><li style="box-sizing: border-box; padding: 0px 5px;">88</li><li style="box-sizing: border-box; padding: 0px 5px;">89</li><li style="box-sizing: border-box; padding: 0px 5px;">90</li><li style="box-sizing: border-box; padding: 0px 5px;">91</li><li style="box-sizing: border-box; padding: 0px 5px;">92</li><li style="box-sizing: border-box; padding: 0px 5px;">93</li><li style="box-sizing: border-box; padding: 0px 5px;">94</li><li style="box-sizing: border-box; padding: 0px 5px;">95</li><li style="box-sizing: border-box; padding: 0px 5px;">96</li><li style="box-sizing: border-box; padding: 0px 5px;">97</li><li style="box-sizing: border-box; padding: 0px 5px;">98</li><li style="box-sizing: border-box; padding: 0px 5px;">99</li><li style="box-sizing: border-box; padding: 0px 5px;">100</li><li style="box-sizing: border-box; padding: 0px 5px;">101</li><li style="box-sizing: border-box; padding: 0px 5px;">102</li><li style="box-sizing: border-box; padding: 0px 5px;">103</li><li style="box-sizing: border-box; padding: 0px 5px;">104</li><li style="box-sizing: border-box; padding: 0px 5px;">105</li><li style="box-sizing: border-box; padding: 0px 5px;">106</li><li style="box-sizing: border-box; padding: 0px 5px;">107</li><li style="box-sizing: border-box; padding: 0px 5px;">108</li><li style="box-sizing: border-box; padding: 0px 5px;">109</li><li style="box-sizing: border-box; padding: 0px 5px;">110</li><li style="box-sizing: border-box; padding: 0px 5px;">111</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li><li style="box-sizing: border-box; padding: 0px 5px;">86</li><li style="box-sizing: border-box; padding: 0px 5px;">87</li><li style="box-sizing: border-box; padding: 0px 5px;">88</li><li style="box-sizing: border-box; padding: 0px 5px;">89</li><li style="box-sizing: border-box; padding: 0px 5px;">90</li><li style="box-sizing: border-box; padding: 0px 5px;">91</li><li style="box-sizing: border-box; padding: 0px 5px;">92</li><li style="box-sizing: border-box; padding: 0px 5px;">93</li><li style="box-sizing: border-box; padding: 0px 5px;">94</li><li style="box-sizing: border-box; padding: 0px 5px;">95</li><li style="box-sizing: border-box; padding: 0px 5px;">96</li><li style="box-sizing: border-box; padding: 0px 5px;">97</li><li style="box-sizing: border-box; padding: 0px 5px;">98</li><li style="box-sizing: border-box; padding: 0px 5px;">99</li><li style="box-sizing: border-box; padding: 0px 5px;">100</li><li style="box-sizing: border-box; padding: 0px 5px;">101</li><li style="box-sizing: border-box; padding: 0px 5px;">102</li><li style="box-sizing: border-box; padding: 0px 5px;">103</li><li style="box-sizing: border-box; padding: 0px 5px;">104</li><li style="box-sizing: border-box; padding: 0px 5px;">105</li><li style="box-sizing: border-box; padding: 0px 5px;">106</li><li style="box-sizing: border-box; padding: 0px 5px;">107</li><li style="box-sizing: border-box; padding: 0px 5px;">108</li><li style="box-sizing: border-box; padding: 0px 5px;">109</li><li style="box-sizing: border-box; padding: 0px 5px;">110</li><li style="box-sizing: border-box; padding: 0px 5px;">111</li></ul>
elasticsearch.yml源文件链接:
Dockerfile文件
<code class="hljs coffeescript has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">######</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">######</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">######</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">######</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">######</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">######</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">######</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">##</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># version : birdben/escluster:v1</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># desc : 当前版本安装的escluster</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">######</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">######</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">######</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">######</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">######</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">######</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">######</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">##</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 设置继承自我们创建的 jdk7 镜像</span>
FROM birdben/<span class="hljs-attribute" style="box-sizing: border-box; color: rgb(0, 136, 0);">jdk7</span>:v1

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 下面是一些创建者的基本信息</span>
MAINTAINER birdben (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">191654006</span>@<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">163.</span>com)

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 设置环境变量,所有操作都是非交互式的</span>
ENV DEBIAN_FRONTEND noninteractive

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 添加 supervisord 的配置文件,并复制配置文件到对应目录下面。(supervisord.conf文件和Dockerfile文件在同一路径)</span>
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

RUN echo <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"export LC_ALL=C"</span>

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 设置 ES 的环境变量,若读者有其他的环境变量需要设置,也可以在这里添加。</span>
ENV ES_HOME /software/elasticsearch-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.7</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.2</span>

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 复制 elasticsearch-1.7.2 文件到镜像中(elasticsearch-1.7.2文件夹要和Dockerfile文件在同一路径)</span>
ADD elasticsearch-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.7</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.2</span> /software/elasticsearch-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.7</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.2</span>

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 挂载/software/elasticsearch-1.7.2/config和/escluster目录</span>
VOLUME [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"/software/elasticsearch-1.7.2/config"</span>]
VOLUME [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"/escluster"</span>]

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 容器需要开放ES的9200和9300端口</span>
EXPOSE <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9200</span>
EXPOSE <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9300</span>

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 执行supervisord来同时执行多个命令,使用 supervisord 的可执行路径启动服务。</span>
CMD [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"/usr/bin/supervisord"</span>]</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li></ul>
Dockerfile源文件链接:

https://github.com/birdben/birdDocker/blob/master/escluster/Dockerfile

supervisor配置文件内容
<code class="hljs vala has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 配置文件包含目录和进程</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 第一段 supervsord 配置软件本身,使用 nodaemon 参数来运行。</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 第二段包含要控制的 2 个服务。每一段包含一个服务的目录和启动这个服务的命令。</span>

[supervisord]
nodaemon=<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">true</span>

[program:sshd]
command=/usr/sbin/sshd -D

<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 修改supervisor配置方式如下,修改为不自动重启ES,并且改成非daemon,DFOREGROUND的方式运行,supervisor就可以监控到了</span>
[program:elasticsearch]
command=/bin/bash -c <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"exec ${ES_HOME}/bin/elasticsearch -DFOREGROUND"</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul>
控制台终端
<code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 构建镜像</span>
<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ </span>docker build -t=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"birdben/escluster:v1"</span> .
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 执行已经构件好的镜像,这里启动了两个ES的镜像,只是ES的端口号不同,挂载在宿主机器的存储路径也不同</span>
<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ </span>docker run -p <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9999</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">22</span> -p <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9200</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9200</span> -p <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9300</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9300</span> -v /docker/<span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">escluster01:</span>/escluster -v /docker/escluster01/<span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">config:</span>/software/elasticsearch-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.7</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>/config -t -i <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'birdben/escluster:v1'</span>
<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ </span>docker run -p <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9998</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">22</span> -p <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9201</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9200</span> -p <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9301</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9300</span> -v /docker/<span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">escluster02:</span>/escluster -v /docker/escluster02/<span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">config:</span>/software/elasticsearch-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.7</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>/config -t -i <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'birdben/escluster:v1'</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>
访问ElasticSearch集群的插件测试
<code class="hljs vala has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 访问9201和9201端口都能分别访问</span>
http:<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//10.211.55.4:9200/_plugin/head/</span>
http:<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//10.211.55.4:9201/_plugin/head/</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 在Node1上创建索引会自动同步到Node2上,而且对应的data和logs目录也存储在挂载的目录中</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>
ES集群的访问方式
Java API

Elasticsearch为Java用户提供了两种内置客户端: 
需要在项目中引入elasticsearch.jar,这个jar中有两种ES提供的Client

节点客户端 (Node Client)

NodeClient

Instantiating a node based client is the simplest way to get a Client that can execute operations against elasticsearch.

Embedding a node client into your application is the easiest way to connect to an Elasticsearch cluster

Node Client加入ES集群是一个没有数据的Node,就是这个Node不存储任何数据,但是这个Node知道数据存储在ES集群的哪个Node,可以把请求转发到正确的Node上去

注意:

实际上Node Client是在我们的系统,单元测试中启动了一个Embedded ElasticSearch,这个Embedded ElasticSearch是我们不存储任何数据的Node加入ES集群,我们的系统通过它来和ES集群进行通信,最好关闭Embedded Node的http端口(9200端口)防止http请求直接访问,因为Node Client与ES集群Node的通信都是使用的9300端口

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">import static org<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.elasticsearch</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.node</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.NodeBuilder</span>.*<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>

// on startup

Node node = nodeBuilder()<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.node</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
Client client = node<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.client</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>

// on shutdown

node<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.close</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>

// 设置ES的集群名称,在Java代码中
Node node = nodeBuilder()<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.clusterName</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"yourclustername"</span>)<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.node</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
Client client = node<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.client</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>

// 也可以设置cluster<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.name</span>在/src/main/resources/elasticsearch<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.yml</span>配置文件</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li></ul>
传输客户端 (Transport Client)

TransportClient

The TransportClient connects remotely to an Elasticsearch cluster using the transport module. It does not join the cluster, but simply gets one or more initial transport addresses and communicates with them in round robin fashion on each action (though most actions will probably be “two hop” operations).

Transport Client不会加入集群,只是负责把请求转发给ES集群的Node

Java Client和ES集群通信通过9300端口,使用native ElasticSearch transport protocol, ES集群的Node也使用9300端口进行通信。(如果ES集群的9300端口没有开通,你的Nodes无法构建成一个集群)

注意:Java Client必须和ES集群的Node版本一致(也就是jar包的版本要和ES集群的版本对应一致),否则无法通信

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">// on startup

Client client = TransportClient<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.builder</span>()<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.build</span>()
        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.addTransportAddress</span>(new InetSocketTransportAddress(InetAddress<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getByName</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"host1"</span>), <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9300</span>))
        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.addTransportAddress</span>(new InetSocketTransportAddress(InetAddress<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getByName</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"host2"</span>), <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9300</span>))<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>

// on shutdown

client<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.close</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>

// 设置集群名称
Settings settings = Settings<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.settingsBuilder</span>()
        <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.put</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"cluster.name"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"myClusterName"</span>)<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.build</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
Client client = TransportClient<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.builder</span>()<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.settings</span>(settings)<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.build</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
//<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Add</span> transport addresses <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">and</span> do something with the client...

// 也可以设置cluster<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.name</span>在/src/main/resources/elasticsearch<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.yml</span>配置文件,如Node Client</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li></ul>

注意:addTransportAddress方法

Adds a transport address that will be used to connect to.The Node this transport address represents will be used if its possible to connect to it. If it is unavailable, it will be automatically connected to once it is up.In order to get the list of all the current connected nodes, please see connectedNodes().

当一个ES Node(对应一个transportAddress)不可用时,client会自动发现当前可用的nodes(the current connected nodes),从以下这段代码可知:

TransportClientNodesService

<code class="hljs axapta has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">index</span> = randomNodeGenerator.incrementAndGet();
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">index</span> < <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) {
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">index</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
    randomNodeGenerator.set(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>);
}
RetryListener<Response> retryListener = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> RetryListener<Response>(callback, listener, nodes, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">index</span>);
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {
    callback.doWithNode(nodes.get((<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">index</span>) % nodes.size()), retryListener);
} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">catch</span> (ElasticsearchException e) {
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (e.unwrapCause() instanceof ConnectTransportException) {
        retryListener.onFailure(e);
    } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throw</span> e;
    }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li></ul>
RESTFUL API

其他语言都可以使用RESTFUL API通过9200端口和ES进行通信,甚至可以通过命令行使用curl命令

HTTP Request格式

<code class="hljs vbnet has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">curl -X<VERB> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">'<span class="hljs-xmlDocTag" style="box-sizing: border-box;"><PROTOCOL></span>://<span class="hljs-xmlDocTag" style="box-sizing: border-box;"><HOST></span>/<span class="hljs-xmlDocTag" style="box-sizing: border-box;"><PATH></span>?<span class="hljs-xmlDocTag" style="box-sizing: border-box;"><QUERY_STRING></span>' -d '<span class="hljs-xmlDocTag" style="box-sizing: border-box;"><BODY></span>'</span>

VERB            : HTTP方法(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">GET</span>, POST, PUT, HEAD <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">or</span> DELETE)
PROTOCOL        : HTTP 或者 HTTPS协议(如果有一个HTTPS的代理在ES前端)
HOST            : ES集群名称或者IP地址
PORT            : 端口号运行着ES的HTTP服务,默认是<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9200</span>
QUERY_STRING    : 查询参数(例如:?pretty)
BODY            : A JSON-encoded request body</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>

参考文章:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值