本文内容
- 背景
- ES集群中第一个master节点
- ES slave节点
本文总结 Elasticsearch(以下简称ES)搭建集群的经验。以 Elasticsearch-rtf-2.2.1 版本为例。
我搭过三个集群:研究ELK时搭了一个;测试环境搭了一个;生产环境搭了一个。回想起来,搭建这三个集群时遇到的问题都不一样(我这么说,主要针对集群中节点发现,以及master问题,而不是es启动不起来或报错等问题)~
- 研究ELK时,搭建ES集群倒是很顺利,原因很简单,先从一台机器开始的;
- 可是测试环境搭建集群时,遭遇新加入节点一直不能发现 master 节点,或是集群节点出现都选举自己为 master 这两个情况,因为,节点都是陆续启动的,配置不当,是会出问题;
- 等到在生产环境搭建集群时,遭遇无法选举出 master 节点的情况。ES head 和 kopf 两个插件都不可用,因为,既然集群没有选举出 master 节点,显然,整个集群是用不了的。而前面的情况,head 和 kopf 插件还是能用的,但能用,意义也不大~
总结起来,搭建集群,应该注意两个问题。首先,当然是 Elasticsearch.yml 配置是否正确;再就是你的操作方式。比如节点启动步骤等。
因为,如果搭建一个集群,那么必须保证集群有一个 master 节点,一般来说,第一个启动的节点,一定是 master。然后,分别启动其他节点,这些节点就会找到 master 节点,而 master 节点,也会发现这些节点。
- 因此,配置集群中的第一个master节点,务必简单(简单到什么程度,后面再说),先启动它,它会立刻成为 master 节点。之后,再配置其他节点,最好直接告诉它们,可能的 master 节点是什么,然后启动他们,它们就会发现 master,而 master 节点,也会发现新加入的节点。
- 否则,如果第一个启动的节点,配置过于复杂(条件苛刻),造成它不能成为 master 节点,那么,整个集群会失败。
稍后,你再配置节点时,可以采用更高级、复杂点的配置,就不会有什么问题了~
所以,我才强调,ES 集群中第一个 master 节点的配置务必简单,以后再调整。
背景
假设,我们想搭建这样一个名为 myfirstcluster 的ES集群,它有两个节点:
| 节点 | 主机名 | 是否为 master |
| 192.168.1.2 | es-01 | 是 |
| 192.168.1.3 | es-02 | 否 |
ES集群中第一个master节点
最简单的 ES master 节点配置如下。该配置文件,是一个完整的 ES 配置文件,所以很长。我顺便翻译成了中文。
3: # 注意: Elasticsearch 大多数设置都有默认值. 5: # 7: # 9: # <http://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration.html> 11: # ---------------------------------- 集群 ----------------------------------- 13: # 集群名称: 15: cluster.name: mycluster 17: # ------------------------------------ 节点 ------------------------------------ 19: # 节点名称: 21: node.name: es-01 23: node.data: true 25: # 为节点添加自定义属性,如机架: 27: # node.rack: r1 29: # ----------------------------------- 路径 ------------------------------------ 31: # 存放数据的目录 (多个目录用逗号分隔): 33: # path.data: /path/to/data 35: # 日志文件目录: 37: # path.logs: /path/to/logs 39: # ----------------------------------- 内存 ----------------------------------- 41: # 启动时锁定内存: 43: # bootstrap.mlockall: true 45: # 确保设置了 `ES_HEAP_SIZE` 环境变量, 大小为系统内存的一半, 47: # 49: # 51: # 53: # 55: # 57: http.port: 9200 59: tcp.port: 9300 61: # 更多信息, 参见如下链接: http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-network.html> 64: # --------------------------------- 节点发现 ---------------------------------- 66: # 当新节点加入时,传递一个主机的初始化列表以完成节点发现: 68: # 70: # 72: # 74: # 76: # <http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery.html> 78: # ---------------------------------- 网关 ----------------------------------- 80: # 当整个集群重新启动后, 只有 N 个节点启动了, 集群才会恢复,否则将阻塞: 82: # gateway.recover_after_nodes: 2 84: # 更多信息, 参见如下链接: http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-gateway.html> 87: # ---------------------------------- 其他 ----------------------------------- 89: # 禁止在一个系统上启动多个节点: 91: # node.max_local_storage_nodes: 1 93: # 当删除 index 是必需显式名称: 95: # action.destructive_requires_name: true 96: 98: analysis: 100: my_pinyin: 102: first_letter: prefix 104: pinyin_first_letter: 106: first_letter: only 108: type: mmseg 110: mmseg_complex: 112: seg_type: complex 114: type: mmseg 116: semicolon_spliter: 118: pattern: ";" 120: type: pattern 122: ngram_1_to_2: 124: min_gram: 1 126: ngram_1_to_3: 128: min_gram: 1 130: filter: 132: max_gram: 10 134: type: nGram 136: max_gram: 10 138: type: nGram 140: max_gram: 10 142: type: nGram 144: min: 2 146: type: length 148: min: 3 150: type: length 152: type: pinyin 154: analyzer: 156: type: custom 158: - lowercase 160: lowercase_keyword_ngram_min_size1: 162: filter: 164: - stop 166: - unique 168: lowercase_keyword_ngram_min_size2: 170: filter: 172: - min2_length 174: - trim 176: tokenizer: nGram 178: type: custom 180: - lowercase 182: - stop 184: - unique 186: lowercase_keyword_ngram: 188: filter: 190: - stop 192: - unique 194: lowercase_keyword_without_standard: 196: filter: 198: tokenizer: keyword 200: type: custom 202: - lowercase 204: ik: 206: - ik_analyzer 208: ik_max_word: 210: use_smart: true 212: type: ik 214: mmseg: 216: - mmseg_analyzer 218: mmseg_maxword: 220: filter: 222: tokenizer: mmseg_maxword 224: type: custom 226: - lowercase 228: mmseg_simple: 230: filter: 232: tokenizer: mmseg_simple 234: type: pattern 236: pct_spliter: 238: pattern: "[%]+" 240: type: snowball 242: simple_english_analyzer: 244: tokenizer: whitespace 246: - standard 248: - snowball 250: type: custom 252: filter: 254: pinyin_ngram_analyzer: 256: tokenizer: my_pinyin 258: - lowercase 260: - trim 262: pinyin_first_letter_analyzer: 264: tokenizer: pinyin_first_letter 266: - standard 268: pinyin_first_letter_keyword_analyzer: 270: - pinyin_first_letter_analyzer_keyword 272: tokenizer: keyword 274: - pinyin_first_letter 276: path_analyzer: #used for tokenize :/something/something/else 278: tokenizer: path_hierarchy 279: 281: index.analysis.analyzer.default.type: ik 282: 284: # rtf.filter.redis.port: 6379 说明:
- 第15行,指定集群名称 myfirstcluster;
- 第21行,指定节点名称,最好写主机名;
- 第22和23行,指定该是否可能为master节点,以及是否为数据节点。ES的所说master节点,其实弱化了很多,仅仅就是为了节点发现和选举master节点而已,它甚至都可以不用来保存数据。
因此,看你的规划,完全可以让一个 master 节点,不保存任何数据;
- 第54行,指定节点IP地址,192.168.1.2;
- 第57行,指定HTTP端口,比如,head、kopf插件等插件,都使用该端口。事实上,你可以指定从 92开头的任何端口;
- 第59行,指定集群内部通信的端口,比如,节点发现都使用该端口。事实上,你可以指定93开头的任何端口,该行也可以写成“transport.tcp.port: 9300”;
这7行配置,在我看来,针对集群中第一个master节点,必须配置正确的。其他配置,可以暂时不用。
其中,第57行和第59行,实际上,一台物理机,是可以运行多个 ES,只需要指定不同的配置文件即可。
- 第69行,指定节点初始化列表,因为该节点是集群第一台机器,并且要当 master,所以写”127.0.0.1:9300”,端口号,就是你在第59行指定的端口。相关资料显示,也可以不指定端口,那是不是会93开头的所有端口扫描一下呢?;
- 从97行开始,是配置ES的分词。
slave 节点
Slave 节点配置如下。该配置文件内容只列出了配置项,但是是完整的。
3: # ---------------------------------- Cluster ----------------------------------- 5: # Use a descriptive name for your cluster: 7: cluster.name: myfirstcluster 9: # ------------------------------------ Node ------------------------------------ 11: # Use a descriptive name for the node: 13: node.name: es-02 15: node.data: true 17: # ----------------------------------- Paths ------------------------------------ 19: # Path to directory where to store the data (separate multiple locations by comma): 21: # path.data: /path/to/data 23: # Path to log files: 25: # path.logs: /path/to/logs 27: # ----------------------------------- Memory ----------------------------------- 29: # ... 31: # ---------------------------------- Network ----------------------------------- 33: # Set the bind address to a specific IP (IPv4 or IPv6): 35: network.host: 192.168.1.3 37: # Set a custom port for HTTP: 39: http.port: 9200 41: # 43: # 45: # The default list of hosts is ["127.0.0.1", "[::1]"] 47: discovery.zen.ping.unicast.hosts: ["192.168.1.2:9300"] 49: # ---------------------------------- Gateway ----------------------------------- 51: # ... 53: # ---------------------------------- Various ----------------------------------- 55: 57: analysis: 59: my_pinyin: 61: first_letter: prefix 63: pinyin_first_letter: 65: first_letter: only 67: type: mmseg 69: mmseg_complex: 71: seg_type: complex 73: type: mmseg 75: semicolon_spliter: 77: pattern: ";" 79: type: pattern 81: ngram_1_to_2: 83: min_gram: 1 85: ngram_1_to_3: 87: min_gram: 1 89: filter: 91: max_gram: 10 93: type: nGram 95: max_gram: 10 97: type: nGram 99: max_gram: 10 101: type: nGram 103: min: 2 105: type: length 107: min: 3 109: type: length 111: type: pinyin 113: analyzer: 115: type: custom 117: - lowercase 119: lowercase_keyword_ngram_min_size1: 121: filter: 123: - stop 125: - unique 127: lowercase_keyword_ngram_min_size2: 129: filter: 131: - min2_length 133: - trim 135: tokenizer: nGram 137: type: custom 139: - lowercase 141: - stop 143: - unique 145: lowercase_keyword_ngram: 147: filter: 149: - stop 151: - unique 153: lowercase_keyword_without_standard: 155: filter: 157: tokenizer: keyword 159: type: custom 161: - lowercase 163: ik: 165: - ik_analyzer 167: ik_max_word: 169: use_smart: false 171: type: ik 173: mmseg: 175: - mmseg_analyzer 177: mmseg_maxword: 179: filter: 181: tokenizer: mmseg_maxword 183: type: custom 185: - lowercase 187: mmseg_simple: 189: filter: 191: tokenizer: mmseg_simple 193: type: pattern 195: pct_spliter: 197: pattern: "[%]+" 199: type: snowball 201: simple_english_analyzer: 203: tokenizer: whitespace 205: - standard 207: - snowball 209: type: custom 211: filter: 213: pinyin_ngram_analyzer: 215: tokenizer: my_pinyin 217: - lowercase 219: - trim 221: pinyin_first_letter_analyzer: 223: tokenizer: pinyin_first_letter 225: - standard 227: pinyin_first_letter_keyword_analyzer: 229: - pinyin_first_letter_analyzer_keyword 231: tokenizer: keyword 233: - pinyin_first_letter 235: path_analyzer: #used for tokenize :/something/something/else 237: tokenizer: path_hierarchy 238: 240: index.analysis.analyzer.default.type: ik 说明:
- 第7行,也是指定了集群名称;
- 第13行,指定了节点名称为 es-02(主机名)
- 第14和15行,指定了该节点可能成为 master 节点,还可以是数据节点;
- 第35行,指定节点IP地址为 192.168.1.3;
- 第39行,指定http端口,你使用head、kopf等相关插件使用的端口;
- 第40行,集群内部通信端口,用于节点发现等;
上面的配置master也是这么配置的。
- 第47行,跟master节点配置不一样了。这里直接告诉该的节点,可能的master节点是什么。
文章摘自:http://www.cnblogs.com/liuning8023/p/5454696.html