{"componentChunkName":"component---src-templates-post-template-jsx","path":"/history/posts/2023-01-07--001","result":{"data":{"site":{"siteMetadata":{"title":"Blog by Eunyoung","subtitle":"작업 기록 블로그","copyright":"© All rights reserved.","author":{"name":"EunYoung","twitter":"#"},"disqusShortname":"","url":"https://ssongey.github.io"}},"markdownRemark":{"id":"1c5eff80-43aa-5e6a-99ab-4c10dc2a36fb","html":"<p>사내 스터디로 ES 책을 보고있는데, 문득 내가 사용하고 있는 ES 들의 role 구성이 궁금했고,<br>\n생각보다 node 들의 role 이 많아서 정리하려고 한다.</p>\n<h3><strong>📢 환경</strong></h3>\n<ul>\n<li>ElasticSearch 7.17.8</li>\n</ul>\n<br/>\n<h2>✔️ 노드 role 확인</h2>\n<p>노드 정보 확인 API 를 사용하면 노드의 role 을 확인할 수 있다.</p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/6d7d8dd2b0ecdc30b4746e24703100d0/7970d/001-01.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 21.25%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAxElEQVQY001P2wpFUBTcuZSEpFwSioPYORsRJQ9evPgD//8hc45V5GGamdbMai32FV84gYM8/yBN0z/nKIoCVVUhyzKUZYkoihCGIeHSFzzPQxAEiOMYSZJA0zTs+w7Gaw7btsEYI6iqSuz7PmnTNCn8niuK8njDMGihrutY1xXsuuIyd+CGZVnE7/J7qSzLj3ddF5IkYRxHsOM4ME0T6rpG0zTouo7eXZYFQggMw4C2bWl+Z+Z5pjLnHH3fY9s2ypzniR8J3WeewHL3+wAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 01\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/6d7d8dd2b0ecdc30b4746e24703100d0/d9199/001-01.png\"\n        srcset=\"/devHistoryBlog/static/6d7d8dd2b0ecdc30b4746e24703100d0/8ff5a/001-01.png 240w,\n/devHistoryBlog/static/6d7d8dd2b0ecdc30b4746e24703100d0/e85cb/001-01.png 480w,\n/devHistoryBlog/static/6d7d8dd2b0ecdc30b4746e24703100d0/d9199/001-01.png 960w,\n/devHistoryBlog/static/6d7d8dd2b0ecdc30b4746e24703100d0/07a9c/001-01.png 1440w,\n/devHistoryBlog/static/6d7d8dd2b0ecdc30b4746e24703100d0/7970d/001-01.png 1908w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p>여기서 node.role 필드 값에 대한 정의는 아래와 같다.</p>\n<hr>\n<h2>✔️ 노드 role 정의</h2>\n<h3>m (master-eligible node)</h3>\n<ul>\n<li>마스터, 마스터 후보 노드</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"># elasticsearch.yaml\n\nnode.roles: [&quot;master&quot;]</code></pre></div>\n<h3>v (voting-only node)</h3>\n<ul>\n<li>마스터 노드 선출을 위한 투표에는 참여하지만, 마스터 역할은 수행하지 않는 마스터 후보 노드</li>\n<li>마스터 노드에만 해당 role을 줄 수 있다.</li>\n<li>만약 장애로 마스터 노드가 3개에서 1개로 줄어 최소 마스터 노드의 수를 충족하지 못할 경우 클러스터 전체 장애로 이어지는데, 이를 방지하기 위해 낮은 스펙을 가진 voting_only 마스터 노드를 더 추가하여 마스터 후보 노드 수를 높이는 것도 괜찮을 듯 싶다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"># elasticsearch.yaml\nnode.roles: [&quot;master&quot;, &quot;voting_only&quot;]</code></pre></div>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/6450ac93c555c71198b0bdfd722727fc/7970d/001-02.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 3.3333333333333335%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAABCAYAAADeko4lAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAOklEQVQI1z3JSQoAQQhD0T6aEyrizvufJUULVYtPHuQjIrg7VBXX3b1rZpgZZOZ+zLz9ripExFpEXgefVSP4d074pwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 02\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/6450ac93c555c71198b0bdfd722727fc/d9199/001-02.png\"\n        srcset=\"/devHistoryBlog/static/6450ac93c555c71198b0bdfd722727fc/8ff5a/001-02.png 240w,\n/devHistoryBlog/static/6450ac93c555c71198b0bdfd722727fc/e85cb/001-02.png 480w,\n/devHistoryBlog/static/6450ac93c555c71198b0bdfd722727fc/d9199/001-02.png 960w,\n/devHistoryBlog/static/6450ac93c555c71198b0bdfd722727fc/07a9c/001-02.png 1440w,\n/devHistoryBlog/static/6450ac93c555c71198b0bdfd722727fc/7970d/001-02.png 1908w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<h3>d (data node)</h3>\n<ul>\n<li>데이터 CRUD, 인덱싱, 검색 및 집계를 처리</li>\n<li>multi-tier architecture 에서 사용할 수 있는 특수 데이터 역할이 있다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"># elasticsearch.yaml\n\nnode.roles: [ &quot;data&quot;]</code></pre></div>\n<h3>s (data content node)</h3>\n<ul>\n<li>contents 를 저장하는 노드로, product catalog or article archive 와 같은 데이터를 CRUD, 검색 및 집계 처리</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"># elasticsearch.yaml\n\nnode.roles: [ &quot;data_content&quot;]</code></pre></div>\n<h3>h (data hot node)</h3>\n<ul>\n<li>자주 업데이트되는 시계열 데이터를 저장하는데 사용</li>\n<li>검색 및 인덱싱이 모두 빨라야하므로 많은 CPU, RAM 및 빠른 storage를 사용</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"># elasticsearch.yaml\n\nnode.roles: [ &quot;data_hot&quot;]</code></pre></div>\n<h3>w (data warm node)</h3>\n<ul>\n<li>쿼리 빈도가 낮고 거의 업데이트되지 않는 시계열 데이터를 저장하는데 사용</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"># elasticsearch.yaml\n\nnode.roles: [ &quot;data_warm&quot;]</code></pre></div>\n<h3>c (data cold node)</h3>\n<ul>\n<li>더 이상 정기적으로 검색할 필요가 없는 시계열 데이터는 warm에서 cold로 이동</li>\n<li>검색 성능이 우선이 아니기 때문에 일반적으로 CPU, RAM 대비 큰 storage를 사용</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"># elasticsearch.yaml\n\nnode.roles: [ &quot;data_cold&quot;]</code></pre></div>\n<h3>f (data frozen node)</h3>\n<ul>\n<li>거의 쿼리되지 않고 더이상 업데이트되지 않는 데이터는 cold에서 frozen으로 이동</li>\n<li>해당 노드는 적은 비용으로 frozen 된 데이터를 운영하기 위함이다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"># elasticsearch.yaml\n\nnode.roles: [ &quot;data_frozen&quot;]</code></pre></div>\n<h3>i (ingest node)</h3>\n<ul>\n<li>인덱싱에 전처리가 필요한 경우 사용</li>\n<li>스택 모니터링 및 수집 파이프라인에는 ingest역할이 필요</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"># elasticsearch.yaml\n\nnode.roles: [ &quot;ingest&quot;]</code></pre></div>\n<h3>(coordinating node only)</h3>\n<ul>\n<li>사용자 요청을 데이터 노드로 전달하고, 그 결과를 취합하는데 사용</li>\n<li>기본적으로 모든 노드에 coordinating role을 가지고 있지만, 운영시에는 모든 사용자 요청은 coordinating only 노드로만 가도록 하여 다른 role을 가진 노드(master, data 등..)의 부하를 줄이도록 한다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"># elasticsearch.yaml\n\nnode.roles: []</code></pre></div>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/cf711803b49866b9cfeecdec6b3e5066/3e992/001-03.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 3.3333333333333335%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAABCAYAAADeko4lAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAOklEQVQI1z2KuQkAMAwDM5Y//IA77z+PglOkEKdDOsyMzISZgYhQVehuuPvLzLxtfyLyqarfty8jAhdWRCIhXQTpfwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 03\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/cf711803b49866b9cfeecdec6b3e5066/d9199/001-03.png\"\n        srcset=\"/devHistoryBlog/static/cf711803b49866b9cfeecdec6b3e5066/8ff5a/001-03.png 240w,\n/devHistoryBlog/static/cf711803b49866b9cfeecdec6b3e5066/e85cb/001-03.png 480w,\n/devHistoryBlog/static/cf711803b49866b9cfeecdec6b3e5066/d9199/001-03.png 960w,\n/devHistoryBlog/static/cf711803b49866b9cfeecdec6b3e5066/07a9c/001-03.png 1440w,\n/devHistoryBlog/static/cf711803b49866b9cfeecdec6b3e5066/3e992/001-03.png 1902w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<h3>l (machine learning node)</h3>\n<ul>\n<li>ES에서 제공하는 머신러닝 기능이 필요한 경우 사용</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"># elasticsearch.yaml\n\nnode.roles: [&quot;ml&quot;]</code></pre></div>\n<h3>r (remote cluster client node)</h3>\n<ul>\n<li>다른 클러스터와의 검색이나 복제 등을 수행</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"># elasticsearch.yaml\n\nnode.roles: [&quot;remote_cluster_client&quot;]</code></pre></div>\n<h3>t (transform node)</h3>\n<ul>\n<li>기존 인덱스를 변환하거나 insight 및 요약된 데이터 분석 등의 api 요청을 수행</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"># elasticsearch.yaml\n\nnode.roles: [&quot;transform&quot;]</code></pre></div>\n<h3>모든 롤을 가진 node 설정 방법</h3>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"># elasticsearch.yaml\n\n# 아무런 설정을 하지 않는다. (default)\n# node.roles: []</code></pre></div>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/b196e0f8b527495c527eda21f8bb426c/3e992/001-04.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 3.3333333333333335%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAABCAYAAADeko4lAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAOUlEQVQI102LywkAMAjFOpfgB7yq4P7DvGKhpYccEsgSEUQEzAxEhMxEVR13d3Q3VBXM/Jjnb+OXDYwyIzs8V0jlAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 04\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/b196e0f8b527495c527eda21f8bb426c/d9199/001-04.png\"\n        srcset=\"/devHistoryBlog/static/b196e0f8b527495c527eda21f8bb426c/8ff5a/001-04.png 240w,\n/devHistoryBlog/static/b196e0f8b527495c527eda21f8bb426c/e85cb/001-04.png 480w,\n/devHistoryBlog/static/b196e0f8b527495c527eda21f8bb426c/d9199/001-04.png 960w,\n/devHistoryBlog/static/b196e0f8b527495c527eda21f8bb426c/07a9c/001-04.png 1440w,\n/devHistoryBlog/static/b196e0f8b527495c527eda21f8bb426c/3e992/001-04.png 1902w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<br/>\n<br/>\n<p><strong>참고)</strong><br>\n<a href=\"https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html\">https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html</a><br>\n<a href=\"https://opster.com/guides/elasticsearch/data-architecture/how-to-configure-all-elasticsearch-node-roles/#Master-node\">https://opster.com/guides/elasticsearch/data-architecture/how-to-configure-all-elasticsearch-node-roles/#Master-node</a><br>\n<a href=\"https://jeongxoo.tistory.com/12\">https://jeongxoo.tistory.com/12</a></p>","fields":{"tagSlugs":["/tags/elastic-search/"],"slug":"/history/posts/2023-01-07--001"},"frontmatter":{"title":"ES Node Role 정리","tags":["elastic search"],"date":"2023-01-07","description":""}}},"pageContext":{"slug":"/history/posts/2023-01-07--001"}},"staticQueryHashes":[]}