<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://neotune.net/feed.xml" rel="self" type="application/atom+xml" /><link href="https://neotune.net/" rel="alternate" type="text/html" /><updated>2026-10-31T20:34:35+09:00</updated><id>https://neotune.net/feed.xml</id><title type="html">dev note</title><subtitle>neotune.github.io</subtitle><author><name>Neotune</name></author><entry><title type="html">elasticsearch 7.6.2 delete by query 사용시 search_phase_execution_exception 오류 발생</title><link href="https://neotune.net/elasticsearch/2023/03/02/001.html" rel="alternate" type="text/html" title="elasticsearch 7.6.2 delete by query 사용시 search_phase_execution_exception 오류 발생" /><published>2023-03-02T12:00:00+09:00</published><updated>2023-03-02T12:00:00+09:00</updated><id>https://neotune.net/elasticsearch/2023/03/02/001</id><content type="html" xml:base="https://neotune.net/elasticsearch/2023/03/02/001.html"><![CDATA[<h2 id="오류-증상">오류 증상</h2>
<p>Delete By Query를 이용하여 문서를 삭제 하던 중 아래와 같은 에러가 발생</p>
<blockquote>
  <p>elasticsearch version : 7.6.2</p>
</blockquote>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"error"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"root_cause"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
      </span><span class="p">{</span><span class="w">
        </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"exception"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"reason"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Trying to create too many scroll contexts. Must be less than or equal to: [500]. This limit can be set by changing the [search.max_open_scroll_context] setting."</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">],</span><span class="w">
    </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"search_phase_execution_exception"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"reason"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Partial shards failure"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"phase"</span><span class="p">:</span><span class="w"> </span><span class="s2">"query"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"grouped"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">
    </span><span class="nl">"failed_shards"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
      </span><span class="p">{</span><span class="w">
        </span><span class="nl">"shard"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w">
        </span><span class="nl">"index"</span><span class="p">:</span><span class="w"> </span><span class="s2">"product"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"node"</span><span class="p">:</span><span class="w"> </span><span class="s2">"vot-mThQS46c5aBtTd1RwA"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"reason"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
          </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"exception"</span><span class="p">,</span><span class="w">
          </span><span class="nl">"reason"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Trying to create too many scroll contexts. Must be less than or equal to: [500]. This limit can be set by changing the [search.max_open_scroll_context] setting."</span><span class="w">
        </span><span class="p">}</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">]</span><span class="w">
  </span><span class="p">},</span><span class="w">
  </span><span class="nl">"status"</span><span class="p">:</span><span class="w"> </span><span class="mi">500</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<h2 id="오류-원인">오류 원인</h2>
<p>정확한 원인은 알 수 없으나 github elasticsearch 에 버그로 리포팅된 issue를 발견
<a href="https://github.com/elastic/elasticsearch/issues/56202">github</a><br />
문제점이 elasticsearch 데몬을 기동 하자 마자 발생하는게 아니라 정상 동작 후 어느 순간에 도달하면 발생하는 버그라 elasticsearch에 delete by query 를 동작하는 배치 코드에는 문제가 없는데 해당 코드가 문제인 줄 알고 삽질를 유발함</p>

<h2 id="해결방법">해결방법</h2>
<ol>
  <li>elasticsearch ver. 7.7.0 이상으로 업그레이드</li>
  <li>elasticsearch 의 search.max_open_scroll_context 값을 int.MAX_VALUE 으로 변경
    <div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">//</span><span class="w"> </span><span class="p">[</span><span class="err">step</span><span class="w"> </span><span class="mi">1</span><span class="p">]</span><span class="w"> </span><span class="err">cluster</span><span class="w"> </span><span class="err">update</span><span class="w"> </span><span class="err">api를</span><span class="w"> </span><span class="err">이용하여</span><span class="w"> </span><span class="err">바로</span><span class="w"> </span><span class="err">반영</span><span class="w">
</span><span class="err">PUT</span><span class="w"> </span><span class="err">/_cluster/settings</span><span class="w">
</span><span class="p">{</span><span class="w">
  </span><span class="nl">"persistent"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
 </span><span class="nl">"search.max_open_scroll_context"</span><span class="p">:</span><span class="w"> </span><span class="mi">2147483647</span><span class="w">
  </span><span class="p">},</span><span class="w">
  </span><span class="nl">"transient"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
 </span><span class="nl">"search.max_open_scroll_context"</span><span class="p">:</span><span class="w"> </span><span class="mi">2147483647</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div>    </div>
  </li>
</ol>]]></content><author><name>Neotune</name></author><category term="elasticsearch" /><category term="elasticsearch" /><summary type="html"><![CDATA[오류 증상 Delete By Query를 이용하여 문서를 삭제 하던 중 아래와 같은 에러가 발생 elasticsearch version : 7.6.2]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://neotune.net/apple-touch-icon.png" /><media:content medium="image" url="https://neotune.net/apple-touch-icon.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">elasticsearch too_many_buckets_exceptions</title><link href="https://neotune.net/elasticsearch/2022/12/20/001.html" rel="alternate" type="text/html" title="elasticsearch too_many_buckets_exceptions" /><published>2022-12-20T12:00:00+09:00</published><updated>2022-12-20T12:00:00+09:00</updated><id>https://neotune.net/elasticsearch/2022/12/20/001</id><content type="html" xml:base="https://neotune.net/elasticsearch/2022/12/20/001.html"><![CDATA[<p>Terms Aggregation 사용 중 데이터 건수가 늘어남에 따라 아래와 같은 에러가 발생</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"error"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"root_cause"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
      </span><span class="p">{</span><span class="w">
        </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"too_many_buckets_exception"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"reason"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Trying to create too many buckets. Must be less than or equal to: [10000] but was [10001]. This limit can be set by changing the [search.max_buckets] cluster level setting."</span><span class="p">,</span><span class="w">
        </span><span class="nl">"max_buckets"</span><span class="p">:</span><span class="w"> </span><span class="mi">10000</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">]</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>원인은 elasticsearch 에 max_buckets default 값이 10,000개로 그 이상 bucket이 집계에 사용될 경우 위와 같이 에러를 발생<br />
해결방법은 2가지로 Cluster update settings API를 이용하는 방법과 설정파일(elasticsearch.yml)에 설정하는 방법이 존재<br />
첫번째 방법은 elasticsearch에 바로 반영이 가능 하나 elasticsearch 재기동시 초기화 되는 단점이 있으며<br />
두번째 방법은 바로 반영이 불가능 하나 elasticsearch 재기동시 해당 설정이 영구적용됨</p>

<p>첫번째 방법으로 적용 후 두번째 방법으로 영구 설정하여 사용하기를 추천</p>

<h2 id="해결방법">해결방법</h2>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">//</span><span class="w"> </span><span class="p">[</span><span class="err">step</span><span class="w"> </span><span class="mi">1</span><span class="p">]</span><span class="w"> </span><span class="err">cluster</span><span class="w"> </span><span class="err">update</span><span class="w"> </span><span class="err">api를</span><span class="w"> </span><span class="err">이용하여</span><span class="w"> </span><span class="err">바로</span><span class="w"> </span><span class="err">반영</span><span class="w">
</span><span class="err">PUT</span><span class="w"> </span><span class="err">_cluster/settings</span><span class="w">
</span><span class="p">{</span><span class="w">
  </span><span class="nl">"persistent"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"search.max_buckets"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2147483647"</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="err">원하는</span><span class="w"> </span><span class="err">설정값</span><span class="w"> </span><span class="err">입력</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">

</span><span class="err">//</span><span class="w"> </span><span class="err">elasticsearch.yml</span><span class="w"> </span><span class="err">파일내</span><span class="w"> </span><span class="err">아래와</span><span class="w"> </span><span class="err">같이</span><span class="w"> </span><span class="err">삽입</span><span class="w">
</span><span class="err">search.max_buckets:</span><span class="w"> </span><span class="mi">20000</span><span class="w">  </span><span class="err">//</span><span class="w"> </span><span class="err">원하는</span><span class="w"> </span><span class="err">설정값</span><span class="w"> </span><span class="err">입력</span><span class="w">
</span></code></pre></div></div>

<h2 id="주의사항">주의사항</h2>

<p>buckets 사이즈를 무한정 늘리기엔 Elasticsearch Heap Memory 사용량과 비례 하기 때문에 해당 집계를 사용하는 데이터에 맞게 사이즈를 늘리는것을 추천</p>]]></content><author><name>Neotune</name></author><category term="elasticsearch" /><category term="elasticsearch" /><summary type="html"><![CDATA[Terms Aggregation 사용 중 데이터 건수가 늘어남에 따라 아래와 같은 에러가 발생]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://neotune.net/apple-touch-icon.png" /><media:content medium="image" url="https://neotune.net/apple-touch-icon.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">iterm2에서 Trigger를 이용하여 특정조건에서 profile 변경하기</title><link href="https://neotune.net/iterm2/2022/08/11/003.html" rel="alternate" type="text/html" title="iterm2에서 Trigger를 이용하여 특정조건에서 profile 변경하기" /><published>2022-08-11T12:00:00+09:00</published><updated>2022-08-11T12:00:00+09:00</updated><id>https://neotune.net/iterm2/2022/08/11/003</id><content type="html" xml:base="https://neotune.net/iterm2/2022/08/11/003.html"><![CDATA[<p>맥북에서 개발 및 서비스 운영을 하다 보면 ssh를 통해서 서버에 접속 할일이 많습니다</p>

<p>지금 내가 접속한 환경이 운영인지 개발인지 표시를 해주시면 쉘 명령어 입력시 한번 더 주의를 할 수 있을것 같아
iTerm2에 Automatic Profile Switching 기능을 사용하고자 했습니다.</p>

<p>하지만 automatic profile switching 기능을 사용할려면 변경이 필요한 환경에 shell Integration 을 설치 해야 합니다
이는 인프라팀이 좋아 하지 않을 방법이라 shell Integration 설치 없이 automatic profile switching 기능을 사용 하는 방법을 서술 합니다</p>

<p><img src="/assets/img/2022-08-11-001.png" alt="스크린샷" /></p>

<blockquote>
  <p>저 같은 경우 로컬PC에 사용자명을 출력하지 않아 어쩔 수 없이 로컬 환경만 shell Integration을 설치 했습니다</p>

  <p>저와 같이 zsh 쉘 환경에 사용자 명을 출력하지 않을 경우를 기준으로 설명합니다</p>
</blockquote>

<h2 id="trigger를-사용하여-profile-switching-하기">trigger를 사용하여 Profile Switching 하기</h2>

<ol>
  <li>iTerm2 install shell Integration
    <ol>
      <li>iTerm2 → Install shell Integration → continue → Download and Run Installer → continue → 아래 명령어를 통해 설치 확인</li>
    </ol>

    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> vi ~/.zshrc

 <span class="c"># 아래 항목이 추가 되었으면 정상 설치 안되어 있을 경우 추가</span>
 <span class="nb">test</span> <span class="nt">-e</span> <span class="s2">"</span><span class="k">${</span><span class="nv">HOME</span><span class="k">}</span><span class="s2">/.iterm2_shell_integration.zsh"</span> <span class="o">&amp;&amp;</span> <span class="nb">source</span> <span class="s2">"</span><span class="k">${</span><span class="nv">HOME</span><span class="k">}</span><span class="s2">/.iterm2_shell_integration.zsh"</span>
</code></pre></div>    </div>
  </li>
  <li>default profile 설정
    <ol>
      <li>iTerm2 → Preferences → Profiles → Default 선택 (혹은 자신이 기본으로 사용하는 profile 선택)</li>
      <li>General → Badge → 로컬 환경일때 표시 하고 싶은 text 설정</li>
      <li>Badge 텍스트 위치 필요시 Edit 눌러서 표시 크기 및 위치 조정</li>
      <li>Badge 텍스트 색 변경 필요시 Colors → Badge 항목에 원하는 색으로 변경</li>
      <li>Advanced → Triggers → Edit → + 버튼 클릭 → Action 항목 <code class="language-plaintext highlighter-rouge">Report User &amp; Host</code> 선택 → Reqular Expression → 아래 케이스 참고하여 정규식 입력 → Parameters → \1@\2</li>
    </ol>

    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c"># case1</span>
 <span class="nb">test</span>@product-elasticsearch-2c → <span class="o">(</span><span class="se">\w</span>+<span class="o">)</span>@<span class="o">([</span><span class="se">\w</span>.-]+<span class="o">)</span>

 <span class="c"># case2</span>
 <span class="o">[</span><span class="nb">test</span>@elasticsearch-product-2 ~] → <span class="o">(</span>?!<span class="se">\[</span><span class="o">)(</span><span class="se">\w</span>+<span class="o">)</span>@<span class="o">([</span><span class="se">\w</span>.-]+<span class="o">)</span>

 <span class="c"># 기타 형식일 경우 https://regexr.com 에서 작성하고 테스트 해야 함</span>
</code></pre></div>    </div>
  </li>
  <li>ssh 접속 환경 별 profile 설정 (product 일 경우)
    <ol>
      <li>iTerm2 → Preferences → Profiles → Default 선택 → Other Actions → Duplicate Profile</li>
      <li>Name을 자신이 원하는 이름으로 변경 ex) product</li>
      <li>Badge → <code class="language-plaintext highlighter-rouge">\(session.username)@\(session.hostname)</code> 입력</li>
      <li>Advanced → Automatic Profile Switching → ssh 접속시 console에 출력되는 username@hostname 규격 입력</li>
    </ol>

    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># case 1</span>
<span class="nb">test</span>@product-elasticsearch-2c → <span class="nb">test</span>@product-<span class="k">*</span>
   
<span class="c"># case 2</span>
<span class="nb">test</span>@elasticsearch-product-2 → <span class="nb">test</span>@<span class="k">*</span>product<span class="k">*</span>

<span class="c"># 호스트명에 운영/개발 환경을 구분 할 수 있는 단어를 픽할 수 있어야 profile swithching이 가능 하다</span>
</code></pre></div>    </div>
  </li>
</ol>

<h2 id="원리-설명">원리 설명</h2>

<p>iTerm2 에서 default profile에 설정된 정규식으로 사용자명 / 호스트명 이 인자값으로 뽑히는데 여기에 Automatic Profile Switching에 설정된 규격에 맞을경우
해당 profile로 전환 하는 것 입니다</p>

<p>또한 다시 default으로 전환되는건 세션이 끊기고 로컬PC에 설치된 shell Integration이 자동으로 default 프로필로 변경 해주기 때문에
별도의 Automatic Profile Switching 항목이 없어서 자동 전환 되는 것 입니다</p>

<p>아쉽게도 이 방법은 접속하는 서버의 호스트명에 해당 환경을 구분 할 수 있는 prefix가 있어야지 가능한 방법이며 공통적인 prefix가 없는 경우
해당하는 호스트명을 Automatic Profile Switching 에 등록 해줘야 합니다</p>

<p>한가지 더 팁을 드리자면 개인개정으로 접속 후 root 으로 전환시 profile이 풀리는 현상이 나타날 수 있는데 이는 Automatic Profile Switching 항목에
root 으로 개인계정과 같은 형식으로 등록 해주면 해결 됩니다</p>]]></content><author><name>Neotune</name></author><category term="iterm2" /><category term="iterm2" /><summary type="html"><![CDATA[맥북에서 개발 및 서비스 운영을 하다 보면 ssh를 통해서 서버에 접속 할일이 많습니다]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://neotune.net/apple-touch-icon.png" /><media:content medium="image" url="https://neotune.net/apple-touch-icon.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">github에 repo clone 하지 않고 바로 로컬에서 첫 소스 코드 업로드 방법</title><link href="https://neotune.net/git/2022/06/28/001.html" rel="alternate" type="text/html" title="github에 repo clone 하지 않고 바로 로컬에서 첫 소스 코드 업로드 방법" /><published>2022-06-28T12:00:00+09:00</published><updated>2022-06-28T12:00:00+09:00</updated><id>https://neotune.net/git/2022/06/28/001</id><content type="html" xml:base="https://neotune.net/git/2022/06/28/001.html"><![CDATA[<hr />
<p>보통 github에 소스코드 업로드시 아래와 같은 방법으로 진행 합니다</p>

<p>github에 repo 생성 → 로컬 PC에서 해당 remote git clone → repo 폴더에 소스 코드 이동/복사 → git add → git commit → git push</p>

<p>아래에 설명된 방법은  clone 단계를 거치지 않고 바로 업로드 하는 방법 입니다.</p>

<hr />

<h2 id="작업-방법">작업 방법</h2>

<div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 소스코드가 있는 폴더로 이동</span>
<span class="nb">cd</span> <span class="o">{</span>소스코드가 위치한 폴더<span class="o">}</span>

<span class="c"># git init</span>
git init

<span class="c"># repo 별로 git 사용자, 이메일 정보 설정 (해당 repo만 적용되는 설정)</span>
git config user.name <span class="s2">"{git commit history에 노출될 이름}"</span>
git config user.email <span class="o">{</span>github email 주소<span class="o">}</span>

<span class="c"># 설정된 사용자, 이메일 정보 확인</span>
git config user.name
git config user.email

<span class="c"># 소스코드 add all</span>
git add <span class="nb">.</span>

<span class="c"># initial commit</span>
git commit <span class="nt">-m</span> <span class="s2">"Initial Commit"</span>

<span class="c"># master -&gt; main 으로 브런치 명 변경 (master 브런치에서 수행)</span>
git branch <span class="nt">-M</span> main

<span class="c"># remote repo 주소 등록</span>
git remote add origin https://github.com/<span class="o">{</span>github <span class="nb">id</span><span class="o">}</span>/<span class="o">{</span>github repo name<span class="o">}</span>.git

<span class="c"># remote repo push</span>
git push <span class="nt">-u</span> origin main

<span class="c"># 번외 gitignore 에 등록된 파일이 업로드 되었을 경우 원격에서만 삭제 하는법</span>
git <span class="nb">rm</span> <span class="nt">--cached</span> <span class="nt">-r</span> .idea
git <span class="nb">rm</span> <span class="nt">--cached</span> <span class="nt">-r</span> gradle/wrapper
</code></pre></div></div>]]></content><author><name>Neotune</name></author><category term="git" /><category term="github" /><category term="git" /><summary type="html"><![CDATA[보통 github에 소스코드 업로드시 아래와 같은 방법으로 진행 합니다]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://neotune.net/apple-touch-icon.png" /><media:content medium="image" url="https://neotune.net/apple-touch-icon.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">AWS RDS에서 생성한 mysql에 접속이 안될 경우</title><link href="https://neotune.net/aws/2021/12/15/001.html" rel="alternate" type="text/html" title="AWS RDS에서 생성한 mysql에 접속이 안될 경우" /><published>2021-12-15T12:00:00+09:00</published><updated>2021-12-15T12:00:00+09:00</updated><id>https://neotune.net/aws/2021/12/15/001</id><content type="html" xml:base="https://neotune.net/aws/2021/12/15/001.html"><![CDATA[<hr />
<p>aws 상에서 서비스 구축 중 발생한 문제를 해결 하기 위해 구글링 하였으나 정확한 내용이 없어 기록으로 남깁니다
***</p>
<h2 id="오류상황">오류상황</h2>
<p>jdk version을 1.8 u292 에서 u312 으로 변경하고 나서 application 을 기동하였는데 exception을 발생시키고 MySQL에 접속이 불가한 상황
u292를 사용 하였을때는 정상 접속이 가능한 상황이었고
u312으로 변경 후 기존 application level의 코드 변경 없이 기동을 하였으나 아래와 같은 exception을 발생 하고 기동되지 않는 문제 발생</p>

<p><code class="language-plaintext highlighter-rouge">javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)</code></p>

<h2 id="원인분석">원인분석</h2>
<p>Mysql으로 접속을 u292에서는 tls 1.1 으로 하였으나, u312 부터 tls 1.0, 1.1을 비활성화 하므로 생기는 문제
사실 log에서 아래와 같이 경고 하고 있었음</p>

<p><code class="language-plaintext highlighter-rouge">WARN: This connection is using TLSv1.1 which is now deprecated and will be removed in a future release of Connector/J.</code></p>

<h2 id="해결방안">해결방안</h2>
<p>jdk u292 버젼 이상 부터 datasource url 설정에 아래와 같이 TLS 프로토콜 명시</p>

<p><code class="language-plaintext highlighter-rouge">jdbc:mysql://test.amazonaws.com:3306/test?useUnicode=true&amp;characterEncoding=UTF-8&amp;autoReconnect=true&amp;enabledTLSProtocols=TLSv1.2</code></p>]]></content><author><name>Neotune</name></author><category term="aws" /><category term="aws" /><category term="mysql" /><category term="tls" /><category term="jdk" /><summary type="html"><![CDATA[aws 상에서 서비스 구축 중 발생한 문제를 해결 하기 위해 구글링 하였으나 정확한 내용이 없어 기록으로 남깁니다 *** 오류상황 jdk version을 1.8 u292 에서 u312 으로 변경하고 나서 application 을 기동하였는데 exception을 발생시키고 MySQL에 접속이 불가한 상황 u292를 사용 하였을때는 정상 접속이 가능한 상황이었고 u312으로 변경 후 기존 application level의 코드 변경 없이 기동을 하였으나 아래와 같은 exception을 발생 하고 기동되지 않는 문제 발생]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://neotune.net/apple-touch-icon.png" /><media:content medium="image" url="https://neotune.net/apple-touch-icon.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">docker를 이용한 elasticdump 실전 가이드</title><link href="https://neotune.net/elasticdump/2021/08/24/elasticdump-docker-command.html" rel="alternate" type="text/html" title="docker를 이용한 elasticdump 실전 가이드" /><published>2021-08-24T12:00:00+09:00</published><updated>2021-08-24T12:00:00+09:00</updated><id>https://neotune.net/elasticdump/2021/08/24/elasticdump-docker-command</id><content type="html" xml:base="https://neotune.net/elasticdump/2021/08/24/elasticdump-docker-command.html"><![CDATA[<hr />
<p>NodeJS 설치 없이 docker를 이용 elasticdump를 사용하는 실전 가이드 입니다</p>
<blockquote>
  <p>기본적으로 docker는 설치 되어 있다고 가정하고 설명하겠습니다</p>
</blockquote>

<hr />
<h3 id="준비">준비</h3>

<ol>
  <li>
    <p>docker 이미지 pull</p>

    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> docker pull elasticdump/elasticsearch-dump
</code></pre></div>    </div>
  </li>
</ol>

<hr />
<h3 id="케이스별-elasticdump-실행-명령어">케이스별 elasticdump 실행 명령어</h3>

<ol>
  <li>ES TO ES index 데이터 10,000건씩 덤프
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> docker run <span class="nt">--rm</span> <span class="nt">-ti</span> elasticdump/elasticsearch-dump <span class="se">\</span>
 <span class="nt">--input</span><span class="o">=</span>http://production.es.com:9200/my_index <span class="se">\</span>
 <span class="nt">--output</span><span class="o">=</span>http://staging.es.com:9200/my_index <span class="se">\</span>
 <span class="nt">--type</span><span class="o">=</span>data <span class="se">\</span>
 <span class="nt">--limit</span><span class="o">=</span>10000
</code></pre></div>    </div>
  </li>
  <li>ES에서 로컬에 설치한 ES으로 index 데이터 10,000건씩 덤프
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> docker run <span class="nt">--net</span><span class="o">=</span>host <span class="nt">--rm</span> <span class="nt">-ti</span> elasticdump/elasticsearch-dump <span class="se">\</span>
 <span class="nt">--input</span><span class="o">=</span>http://staging.es.com:9200/my_index <span class="se">\</span>
 <span class="nt">--output</span><span class="o">=</span>http://localhost:9200/my_index <span class="se">\</span>
 <span class="nt">--type</span><span class="o">=</span>data <span class="se">\</span>
 <span class="nt">--limit</span><span class="o">=</span>10000
</code></pre></div>    </div>
  </li>
  <li>ES에서 로컬 저장소에 JSON으로 index 데이터 10,000건씩 덤프 (로컬 JSON 저장 경로 : ~/Documents/elasticdump)
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> docker run <span class="nt">--rm</span> <span class="nt">-ti</span> <span class="nt">-v</span> ~/Documents/elasticdump:/tmp:/tmp elasticdump/elasticsearch-dump <span class="se">\</span>
 <span class="nt">--input</span><span class="o">=</span>http://production.es.com:9200/my_index <span class="se">\</span>
 <span class="nt">--output</span><span class="o">=</span>/tmp/my_index_data.json <span class="se">\</span>
 <span class="nt">--type</span><span class="o">=</span>data <span class="se">\</span>
 <span class="nt">--limit</span><span class="o">=</span>10000
</code></pre></div>    </div>
  </li>
  <li>ES에서 로컬 저장소에 JSON으로 index 데이터 10,000건씩 100만건만 덤프 (로컬 JSON 저장 경로 : ~/Documents/elasticdump)
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> docker run <span class="nt">--rm</span> <span class="nt">-ti</span> <span class="nt">-v</span> ~/Documents/elasticdump:/tmp:/tmp elasticdump/elasticsearch-dump <span class="se">\</span>
 <span class="nt">--input</span><span class="o">=</span>http://production.es.com:9200/my_index <span class="se">\</span>
 <span class="nt">--output</span><span class="o">=</span>/tmp/my_index_data.json <span class="se">\</span>
 <span class="nt">--type</span><span class="o">=</span>data <span class="se">\</span>
 <span class="nt">--size</span><span class="o">=</span>1000000 <span class="se">\</span>
 <span class="nt">--limit</span><span class="o">=</span>10000
</code></pre></div>    </div>
  </li>
  <li>ES에서 로컬 저장소에 1GB 크기 JSON으로 분할하여 index 데이터 10,000건씩 100만건만 덤프 (로컬 JSON 저장 경로 : ~/Documents/elasticdump)
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> docker run <span class="nt">--rm</span> <span class="nt">-ti</span> <span class="nt">-v</span> ~/Documents/elasticdump:/tmp:/tmp elasticdump/elasticsearch-dump <span class="se">\</span>
 <span class="nt">--input</span><span class="o">=</span>http://production.es.com:9200/my_index <span class="se">\</span>
 <span class="nt">--output</span><span class="o">=</span>/tmp/my_index_data.json <span class="se">\</span>
 <span class="nt">--type</span><span class="o">=</span>data <span class="se">\</span>
 <span class="nt">--fileSize</span><span class="o">=</span>1024MB <span class="se">\</span>
 <span class="nt">--size</span><span class="o">=</span>1000000 <span class="se">\</span>
 <span class="nt">--limit</span><span class="o">=</span>10000
</code></pre></div>    </div>
  </li>
  <li>
    <p>ES QUERY를 이용하여 ES에서 로컬 저장소에 JSON으로 index 데이터 10,000건씩 덤프 (로컬 JSON 저장 경로 : ~/Documents/elasticdump)</p>

    <p><code class="language-plaintext highlighter-rouge">~/Documents/elasticdump/search_query.json</code></p>
    <div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w"> </span><span class="p">{</span><span class="w">
   </span><span class="nl">"query"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"match_all"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="p">},</span><span class="w">
   </span><span class="nl">"_source"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"account_number"</span><span class="p">,</span><span class="w"> </span><span class="s2">"balance"</span><span class="p">]</span><span class="w">
 </span><span class="p">}</span><span class="w">
</span></code></pre></div>    </div>
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> docker run <span class="nt">--rm</span> <span class="nt">-ti</span> <span class="nt">-v</span> ~/Documents/elasticdump:/tmp:/tmp elasticdump/elasticsearch-dump <span class="se">\</span>
 <span class="nt">--input</span><span class="o">=</span>http://production.es.com:9200/my_index <span class="se">\</span>
 <span class="nt">--output</span><span class="o">=</span>/tmp/my_index_data.json <span class="se">\</span>
 <span class="nt">--type</span><span class="o">=</span>data <span class="se">\</span>
 <span class="nt">--searchBody</span><span class="o">=</span>@/tmp/search_query.json <span class="se">\</span>
 <span class="nt">--limit</span><span class="o">=</span>10000
</code></pre></div>    </div>
  </li>
  <li>elasticdump으로 생성한 JSON 파일을 ES에 10,000건씩 복원 (로컬 JSON 파일 경로 : ~/Documents/elasticdump)
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> docker run <span class="nt">--rm</span> <span class="nt">-ti</span> <span class="nt">-v</span> ~/Documents/elasticdump:/tmp:/tmp elasticdump/elasticsearch-dump <span class="se">\</span>
 <span class="nt">--input</span><span class="o">=</span>/tmp/my_index_data.json <span class="se">\</span>
 <span class="nt">--output</span><span class="o">=</span>http://production.es.com:9200/my_index <span class="se">\</span>
 <span class="nt">--type</span><span class="o">=</span>data <span class="se">\</span>
 <span class="nt">--limit</span><span class="o">=</span>10000
</code></pre></div>    </div>
  </li>
  <li>elasticdump로 생성하지 않은 JSON 파일을 ES에 10,000건씩 복원 (로컬 JSON 파일 경로 : ~/Documents/elasticdump)
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> docker run <span class="nt">--rm</span> <span class="nt">-ti</span> <span class="nt">-v</span> ~/Documents/elasticdump:/tmp:/tmp elasticdump/elasticsearch-dump <span class="se">\</span>
 <span class="nt">--input</span><span class="o">=</span>/tmp/my_index.json <span class="se">\</span>
 <span class="nt">--output</span><span class="o">=</span>http://production.es.com:9200/my_index <span class="se">\</span>
 <span class="nt">--type</span><span class="o">=</span>data <span class="se">\</span>
 <span class="nt">--transform</span><span class="o">=</span>doc._source<span class="o">=</span><span class="s2">"Object.assign({},doc)"</span> <span class="se">\</span>
 <span class="nt">--limit</span><span class="o">=</span>10000
</code></pre></div>    </div>
  </li>
</ol>

<hr />
<h3 id="reference">Reference</h3>
<ul>
  <li><a href="https://hub.docker.com/r/elasticdump/elasticsearch-dump">dockerhub-elasticdump</a></li>
  <li><a href="https://github.com/elasticsearch-dump/elasticsearch-dump">github-elasticdump</a></li>
</ul>]]></content><author><name>Neotune</name></author><category term="elasticdump" /><category term="elasticsearch" /><category term="docker" /><category term="elasticdump" /><category term="macos" /><summary type="html"><![CDATA[NodeJS 설치 없이 docker를 이용 elasticdump를 사용하는 실전 가이드 입니다 기본적으로 docker는 설치 되어 있다고 가정하고 설명하겠습니다]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://neotune.net/apple-touch-icon.png" /><media:content medium="image" url="https://neotune.net/apple-touch-icon.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">elasticsearch 7 설정</title><link href="https://neotune.net/elasticsearch/2021/08/20/001.html" rel="alternate" type="text/html" title="elasticsearch 7 설정" /><published>2021-08-20T12:00:00+09:00</published><updated>2021-08-20T12:00:00+09:00</updated><id>https://neotune.net/elasticsearch/2021/08/20/001</id><content type="html" xml:base="https://neotune.net/elasticsearch/2021/08/20/001.html"><![CDATA[<hr />
<p>설치 자체는 쉬우나 OS level의 환경설정이나 jvm 관련 설정 내용들이 잘 정리되어 있는 문서가 없어 별도로 정리 합니다</p>

<blockquote>
  <p>centOS 환경에 root 권한을 가지고 있고 RPM 설치 기준으로 설명 하였습니다  <br />
.zip and .tar.gz으로 설치 했을 경우 부분적으로 설정이 적용되지 않을 수 있습니다</p>
</blockquote>

<hr />
<h2 id="환경설정">환경설정</h2>

<ol>
  <li>
    <p>vi /etc/elasticsearch/elasticsearch.yml - <code class="language-plaintext highlighter-rouge">elasticsearch.yml</code> 파일 수정</p>

    <div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="na">cluster.name</span><span class="pi">:</span> <span class="s">search-dev</span>
  
 <span class="na">node.name</span><span class="pi">:</span> <span class="s">search-dev-master</span>
 <span class="na">node.roles</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">master</span><span class="pi">,</span> <span class="nv">ingest</span><span class="pi">]</span>
    
 <span class="na">path.data</span><span class="pi">:</span> <span class="s">/var/lib/elasticsearch</span>
 <span class="na">path.logs</span><span class="pi">:</span> <span class="s">/var/log/elasticsearch</span>
    
 <span class="na">network.host</span><span class="pi">:</span> <span class="s">0.0.0.0</span>
 <span class="na">http.port</span><span class="pi">:</span> <span class="m">9200</span>
 <span class="na">transport.port</span><span class="pi">:</span> <span class="m">9300</span>
 <span class="na">transport.compress</span><span class="pi">:</span> <span class="no">true</span>
    
 <span class="na">discovery.seed_hosts</span><span class="pi">:</span>
   <span class="pi">-</span> <span class="s">127.0.0.1</span>
    
 <span class="na">cluster.initial_master_nodes</span><span class="pi">:</span>
   <span class="pi">-</span> <span class="s">127.0.0.1</span>
    
 <span class="na">xpack.security.enabled</span><span class="pi">:</span> <span class="no">false</span>
    
 <span class="c1"># _all api index</span>
 <span class="na">action.destructive_requires_name</span><span class="pi">:</span> <span class="no">true</span>
    
 <span class="c1"># 서버에 system call filter 가 설치 되지 않았을 경우 해당 filter 사용 안함으로 설정</span>
 <span class="na">bootstrap.system_call_filter</span><span class="pi">:</span> <span class="no">false</span>
    
 <span class="c1"># 메모리 스왑 방지 옵션</span>
 <span class="na">bootstrap.memory_lock</span><span class="pi">:</span> <span class="no">true</span>

 <span class="c1"># xpack security 설정 disable - 해당 설정을 하지 않으면 kibana dev tool 사용시 경고 메세지 지속적으로 나타남</span>
 <span class="na">xpack.security.enabled</span><span class="pi">:</span> <span class="no">false</span>
</code></pre></div>    </div>
  </li>
  <li>vi /etc/elasticsearch/jvm.options - <code class="language-plaintext highlighter-rouge">jvm.options</code> 파일 수정
    <blockquote>
      <p>보통 master, coordinating node 는 8GB, data node는 30GB(zero based) 설정으로 운영합니다</p>
    </blockquote>

    <div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c1">################################################################</span>
 <span class="c1">## IMPORTANT: JVM heap size</span>
 <span class="c1">################################################################</span>
 <span class="c1">##</span>
 <span class="c1">## The heap size is automatically configured by Elasticsearch</span>
 <span class="c1">## based on the available memory in your system and the roles</span>
 <span class="c1">## each node is configured to fulfill. If specifying heap is</span>
 <span class="c1">## required, it should be done through a file in jvm.options.d,</span>
 <span class="c1">## and the min and max should be set to the same value. For</span>
 <span class="c1">## example, to set the heap to 4 GB, create a new file in the</span>
 <span class="c1">## jvm.options.d directory containing these lines:</span>
 <span class="c1">##</span>
    
 <span class="s">-Xms8g</span>
 <span class="s">-Xmx8g</span>
</code></pre></div>    </div>
  </li>
  <li>vi /etc/fstab - centOS swap 설정 확인 (root 권한 필요)
    <blockquote>
      <p>elasticsearch 전용으로 운영하는 서버가 아닐 경우 swap 설정에 대한 인프라 담당자와 협의 필요</p>
    </blockquote>

    <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c"># 명령어 입력 후 /etc/fstab 내용에 swap 관련 설정이 없어야 함</span>
 vi /etc/fstab
</code></pre></div>    </div>

    <p><code class="language-plaintext highlighter-rouge">/etc/fstab</code> - swap 설정이 없는 경우</p>
    <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c">#</span>
 <span class="c"># /etc/fstab</span>
 <span class="c"># Created by anaconda on Sat Feb 29 12:05:47 2020</span>
 <span class="c">#</span>
 <span class="c"># Accessible filesystems, by reference, are maintained under '/dev/disk'</span>
 <span class="c"># See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info</span>
 <span class="c">#</span>
 <span class="nv">UUID</span><span class="o">=</span>388a99ed-9486-4a46-aeb6-06eaf6c47675 /                       xfs     defaults        0 0
 ~
</code></pre></div>    </div>
  </li>
  <li>vi /usr/lib/systemd/system/elasticsearch.service - <code class="language-plaintext highlighter-rouge">elasticsearch.service</code> Systemd 파일 수정
    <blockquote>
      <p>LimitNPROC 항목 주석 제거 or 65535 값 변경, [Service] LimitMEMLOCK=infinity [Install] 위에 추가</p>
    </blockquote>

    <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c"># Specifies the maximum number of processes</span>
 <span class="nv">LimitNPROC</span><span class="o">=</span>65535   

 <span class="c"># Allow a slow startup before the systemd notifier module kicks in to extend the timeout</span>
 <span class="nv">TimeoutStartSec</span><span class="o">=</span>75
    
 <span class="o">[</span>Service]
 <span class="nv">LimitMEMLOCK</span><span class="o">=</span>infinity
    
 <span class="o">[</span>Install]
 <span class="nv">WantedBy</span><span class="o">=</span>multi-user.target
</code></pre></div>    </div>
  </li>
  <li>
    <p>elasticsearch Systemd 파일 수정 후 서비스 reload</p>

    <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c"># elasticsearch.service 수정 사항 시스템에 반영</span>
 systemctl daemon-reload
    
 <span class="c"># [선택사항] 재부팅시 elasticsearch daemon 자동 실행 옵션 활성화</span>
 systemctl <span class="nb">enable </span>elasticsearch.service
</code></pre></div>    </div>
  </li>
  <li>
    <p>vi /etc/sysctl.conf - <code class="language-plaintext highlighter-rouge">/etc/sysctl.conf</code> virtual memory, swap file, tcp 통신 복구 횟수 설정</p>

    <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c"># swap file 설정</span>
 vm.swappiness<span class="o">=</span>1
    
 <span class="c"># virutal memory 설정</span>
 vm.max_map_count<span class="o">=</span>262144
    
 <span class="c"># [선택사항] - 클러스터 복구를 위한 TCP 통신 retry 횟수 설정 : 5번까지 시도하며, 완료시간은 6초 이내 이므로 빠르게 장애 상황을 인지 할 수 있음</span>
 <span class="c"># 기본 설정은 15회이며 15회를 모두 수행하는 시간은 900초이다, 즉 클러스터 장애 상황을 900초 이후에 인지 할 수 있음</span>
 net.ipv4.tcp_retries2<span class="o">=</span>5
</code></pre></div>    </div>
  </li>
  <li><code class="language-plaintext highlighter-rouge">/etc/sysctl.conf</code> 수정 후 reboot
    <blockquote>
      <p>elasticsearch 전용으로 운영하는 서버가 아닐 경우 리부팅시 인프라 담당자와 협의 필요</p>
    </blockquote>

    <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code> reboot
</code></pre></div>    </div>
    <hr />
  </li>
</ol>

<h3 id="reference">Reference</h3>
<ul>
  <li><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/system-config.html">Important System Configuration - elasticsearch 공식문서</a></li>
</ul>]]></content><author><name>Neotune</name></author><category term="elasticsearch" /><category term="elasticsearch" /><category term="centos" /><summary type="html"><![CDATA[설치 자체는 쉬우나 OS level의 환경설정이나 jvm 관련 설정 내용들이 잘 정리되어 있는 문서가 없어 별도로 정리 합니다]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://neotune.net/apple-touch-icon.png" /><media:content medium="image" url="https://neotune.net/apple-touch-icon.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">brew 명령어 실행시 Ignoring commonarker 오류 출력</title><link href="https://neotune.net/brew/2019/11/22/brew-error.html" rel="alternate" type="text/html" title="brew 명령어 실행시 Ignoring commonarker 오류 출력" /><published>2019-11-22T12:00:00+09:00</published><updated>2019-11-22T12:00:00+09:00</updated><id>https://neotune.net/brew/2019/11/22/brew-error</id><content type="html" xml:base="https://neotune.net/brew/2019/11/22/brew-error.html"><![CDATA[<hr />
<p>brew 설치 후 install 실행시 <code class="language-plaintext highlighter-rouge">Ignoring commonmarker-0.17.13 because its extensions are not built</code> 와 같은 메세지가 계속적으로 출력되고 있었습니다.</p>

<p>실제 명령어 수행에는 큰 이상은 없지만 메세지가 자꾸 신경쓰여 해당 문구가 출력되지 않도록 하는 방법을 설명하였습니다.</p>

<blockquote>
  <p>단 설명드리는 방법은 문제를 해결하는 방법 중에 한가지 이며 설명드리는 방법으로 해결이 안될 수도 있음을 알려드립니다.</p>
</blockquote>

<hr />
<h2 id="출력되는-메세지-sample">출력되는 메세지 sample</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>neotune@mac-neotune brew <span class="nb">install </span>jython
Ignoring commonmarker-0.17.13 because its extensions are not built.  Try: gem pristine commonmarker <span class="nt">--version</span> 0.17.13
Ignoring commonmarker-0.17.13 because its extensions are not built.  Try: gem pristine commonmarker <span class="nt">--version</span> 0.17.13
<span class="o">==&gt;</span> Downloading https://homebrew.bintray.com/bottles/jython-2.7.1.mojave.bottle.1.tar.gz
<span class="o">==&gt;</span> Downloading from https://akamai.bintray.com/e6/e64dc854f84ba16de19059102aa5c94d01b9ed2a996e3bafa7df1f6f2c19e3ca?__gda__<span class="o">=</span><span class="nv">exp</span><span class="o">=</span>1574390614~hmac<span class="o">=</span>afcb679b5fb8ac48d0dfe
<span class="c">######################################################################## 100.0%</span>
<span class="o">==&gt;</span> Pouring jython-2.7.1.mojave.bottle.1.tar.gz
</code></pre></div></div>
<hr />
<h2 id="해결방법">해결방법</h2>

<ol>
  <li><code class="language-plaintext highlighter-rouge">brew install</code> 실행시 나왔던 메세지 중 <code class="language-plaintext highlighter-rouge">try:</code> 이후 출력된 명령어를 sudo 권한으로 실행 (ex : sudo gem pristine commonmarker –version 0.17.13)
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="nv">$ </span><span class="nb">sudo </span>gem pristine commonmarker <span class="nt">--version</span> 0.17.13
  Password:
  Ignoring commonmarker-0.17.13 because its extensions are not built.  Try: gem pristine commonmarker <span class="nt">--version</span> 0.17.13
  Restoring gems to pristine condition...
  Building native extensions.  This could take a <span class="k">while</span>...
  Restored commonmarker-0.17.13 
</code></pre></div>    </div>
  </li>
  <li>정상 실행 여부 확인을 위해 아래 명령어 실행 (ex : gem list | grep commonmarker)
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="c"># 해결 완료 상태 일 경우</span>
  <span class="nv">$ </span>gem list | <span class="nb">grep </span>commonmarker
  commonmarker <span class="o">(</span>0.17.13<span class="o">)</span> 
  <span class="c"># 해결 안된 상태 일 경우</span>
  <span class="nv">$ </span>gem list | <span class="nb">grep </span>commonmarker
  Ignoring commonmarker-0.17.13 because its extensions are not built.  Try: gem pristine commonmarker <span class="nt">--version</span> 0.17.13
  commonmarker <span class="o">(</span>0.17.13<span class="o">)</span> 
</code></pre></div>    </div>
  </li>
</ol>

<hr />]]></content><author><name>Neotune</name></author><category term="brew" /><category term="brew" /><category term="macos" /><summary type="html"><![CDATA[brew 설치 후 install 실행시 Ignoring commonmarker-0.17.13 because its extensions are not built 와 같은 메세지가 계속적으로 출력되고 있었습니다.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://neotune.net/apple-touch-icon.png" /><media:content medium="image" url="https://neotune.net/apple-touch-icon.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">리눅스 환경에서 text 파일 비교 후 중복 text 찾기</title><link href="https://neotune.net/linux/2019/11/11/linux-sort.html" rel="alternate" type="text/html" title="리눅스 환경에서 text 파일 비교 후 중복 text 찾기" /><published>2019-11-11T12:00:00+09:00</published><updated>2019-11-11T12:00:00+09:00</updated><id>https://neotune.net/linux/2019/11/11/linux-sort</id><content type="html" xml:base="https://neotune.net/linux/2019/11/11/linux-sort.html"><![CDATA[<hr />
<p>리눅스 환경에서 text 파일 혹은 임의의 파일를 비교 하여 중복인 text나 key 값 등을 뽑아 내고 싶을때가 있습니다.
엄청난 크기의 파일이 아니라면 간단한 리눅스 명령어로 찾을 수 있습니다</p>

<p>파일 갯수는 제한이 없으며 비교 대상의 파일이 같은 형식으로 이루어져 있어야 합니다</p>

<p>간단하게 설명을 드리자면 <code class="language-plaintext highlighter-rouge">1.txt</code> 파일에는 아래와 같이 되어 있고</p>

<figure class="highlight"><pre><code class="language-shell" data-lang="shell">12354512
12311344
12354123
12341234</code></pre></figure>

<p><code class="language-plaintext highlighter-rouge">2.txt</code> 파일에는 아래와 같이 되어 있으면 중복으로 들어가 있는 “12354123” 을 찾을 수 있는 방법입니다.</p>

<figure class="highlight"><pre><code class="language-shell" data-lang="shell">444444
333333
12354123
8888888</code></pre></figure>

<hr />
<h2 id="text-파일에서-중복-찾기-방법">text 파일에서 중복 찾기 방법</h2>

<p>1 . 비교를 원하는 파일을 한개의 파일에 담습니다 (diff.txt 파일에 1.txt 과 2.txt 에서 출력된 내용이 다 들어가게 됩니다)</p>

<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nv">$ </span>more 1.txt <span class="o">&gt;&gt;</span> diff.txt
<span class="nv">$ </span>more 2.txt <span class="o">&gt;&gt;</span> diff.txt   </code></pre></figure>

<p>2 . 중복인 text를 중복 횟수가 많은 순으로 출력</p>

<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nv">$ </span><span class="nb">sort </span>diff.txt | <span class="nb">uniq</span> <span class="nt">-c</span> | <span class="nb">sort</span> <span class="nt">-r</span> <span class="nt">-k1</span>
<span class="c"># 출력 sample</span>
4 991569114
3 991741226
2 992385238</code></pre></figure>

<p>3 . 중복인 text를 중복 횟수가 많은 순으로 result.txt 기록</p>

<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nv">$ </span><span class="nb">sort </span>diff.txt | <span class="nb">uniq</span> <span class="nt">-c</span> | <span class="nb">sort</span> <span class="nt">-r</span> <span class="nt">-k1</span> <span class="o">&gt;&gt;</span> result.txt</code></pre></figure>

<p>4 . 중복된 text만 추출 (중복횟수 X)</p>

<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nv">$ </span><span class="nb">sort </span>diff.txt | <span class="nb">uniq</span> <span class="nt">-d</span></code></pre></figure>

<hr />
<h2 id="sort-명령어-옵션">sort 명령어 옵션</h2>

<table>
  <thead>
    <tr>
      <th style="text-align: center">옵션</th>
      <th style="text-align: center">설명</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">-n</td>
      <td style="text-align: center">라인의 각 필드를 비교하는 대상을 숫자로 한정</td>
    </tr>
    <tr>
      <td style="text-align: center">-f</td>
      <td style="text-align: center">영어를 정렬할때 대소문자 구별 안함</td>
    </tr>
    <tr>
      <td style="text-align: center">-r</td>
      <td style="text-align: center">출력 순서를 역순으로</td>
    </tr>
    <tr>
      <td style="text-align: center">-b</td>
      <td style="text-align: center">앞에 붙는 공백 무시</td>
    </tr>
    <tr>
      <td style="text-align: center">-t</td>
      <td style="text-align: center">필드 구분자 지정</td>
    </tr>
    <tr>
      <td style="text-align: center">-m</td>
      <td style="text-align: center">정렬된 파일을 병합</td>
    </tr>
    <tr>
      <td style="text-align: center">-u</td>
      <td style="text-align: center">정렬 후 중복행 제거</td>
    </tr>
    <tr>
      <td style="text-align: center">-o</td>
      <td style="text-align: center">저장할 파일명을 명시, 명시하지 않으면 화면에 출력</td>
    </tr>
  </tbody>
</table>

<hr />
<h2 id="uniq-명령어-옵션">uniq 명령어 옵션</h2>

<table>
  <thead>
    <tr>
      <th style="text-align: center">옵션</th>
      <th style="text-align: center">설명</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">-c</td>
      <td style="text-align: center">같은 라인이 몇번 나오는지를 표시</td>
    </tr>
    <tr>
      <td style="text-align: center">-d</td>
      <td style="text-align: center">중복되어 나오는 라인 중 한 라인만 표시</td>
    </tr>
    <tr>
      <td style="text-align: center">-D</td>
      <td style="text-align: center">중복되는 모든 라인을 보여준다</td>
    </tr>
    <tr>
      <td style="text-align: center">-N</td>
      <td style="text-align: center">필터링은 무시할 라인을 정한다 (시작 라인부터 N 번째 라인까지는 검사하지 않는다)</td>
    </tr>
    <tr>
      <td style="text-align: center">-i</td>
      <td style="text-align: center">중복 라인을 한라인으로 생각하고 출력한다</td>
    </tr>
    <tr>
      <td style="text-align: center">-u</td>
      <td style="text-align: center">중복 라인이 없는 것만 보여준다</td>
    </tr>
    <tr>
      <td style="text-align: center">-w</td>
      <td style="text-align: center">N 번째 문자까지만 비교대상으로 하여 uniq 명령을 수행</td>
    </tr>
    <tr>
      <td style="text-align: center">-s</td>
      <td style="text-align: center">N 번째 문자까지만 비교대상에서 제외하고 uniq 명령을 수행</td>
    </tr>
    <tr>
      <td style="text-align: center">-f</td>
      <td style="text-align: center">N 번째 필드를 비교대상에서 제외하고 uniq 명령을 수행</td>
    </tr>
  </tbody>
</table>]]></content><author><name>Neotune</name></author><category term="linux" /><category term="command" /><category term="shell script" /><category term="centos" /><summary type="html"><![CDATA[리눅스 환경에서 text 파일 혹은 임의의 파일를 비교 하여 중복인 text나 key 값 등을 뽑아 내고 싶을때가 있습니다. 엄청난 크기의 파일이 아니라면 간단한 리눅스 명령어로 찾을 수 있습니다]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://neotune.net/apple-touch-icon.png" /><media:content medium="image" url="https://neotune.net/apple-touch-icon.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">맥 zsh 쉘에서 git branch 명령어 실행 시 branch 리스트가 화면 전환되어 출력될때</title><link href="https://neotune.net/git/2019/02/01/zsh-git-branch.html" rel="alternate" type="text/html" title="맥 zsh 쉘에서 git branch 명령어 실행 시 branch 리스트가 화면 전환되어 출력될때" /><published>2019-02-01T12:00:00+09:00</published><updated>2019-02-01T12:00:00+09:00</updated><id>https://neotune.net/git/2019/02/01/zsh-git-branch</id><content type="html" xml:base="https://neotune.net/git/2019/02/01/zsh-git-branch.html"><![CDATA[<hr />
<p>맥에서 git branch -l 명령어 이용시 기존 bash 쉘에서는 명령어 아래에 바로 출력이 되었는데 zsh 쉘로 전환 후 갑자기 git 에서 branch 리스트를 화면전환하여 보여주고 있어서 불편했습니다</p>

<p>아래와 같이 명령어를 입력하면 해결 됩니다</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>git config <span class="nt">--global</span> pager.branch <span class="nb">false</span>
</code></pre></div></div>]]></content><author><name>Neotune</name></author><category term="git" /><category term="zsh" /><category term="git" /><category term="macos" /><summary type="html"><![CDATA[맥에서 git branch -l 명령어 이용시 기존 bash 쉘에서는 명령어 아래에 바로 출력이 되었는데 zsh 쉘로 전환 후 갑자기 git 에서 branch 리스트를 화면전환하여 보여주고 있어서 불편했습니다]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://neotune.net/apple-touch-icon.png" /><media:content medium="image" url="https://neotune.net/apple-touch-icon.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>