간혹 테스트를 하거나 잘못 보내진 문서만 골라서 지워야 하는 경우가 있다.


kibana dev tools에서 _delete_by_query를 사용하여 손쉽게 처리할 수 있다. 


(앞으로도 간혹 생각나는 것들이 있거나 기록하고 싶으면 아래 내용을 추가할 예정!!)


>> 특정 범위의 로그를 지울 경우

POST logstash-rs1_lnk_kr-*/_delete_by_query

{

  "query": {

    "range" : {

      "item_name_you_want_to_delete": {

        "lt" : "value_you_find_out"  // lt= less than, gt=greater than, eq=equal

      }

    }

  }

}



CentOS 기준.. 매번 사용하지 않는 것들이라 기록해둔다.



OS 버전 확인

cat /etc/redhat-release(el7 ~)   or cat /etc/issue(~el6)


커널 버전 확인

cat /proc/version


Kernel bits 확인

getconf WORD_BIT


cpu 정보 확인 

cat /proc/cpuinfo

실 CPU 수 : grep ^processor /proc/cpuinfo | wc -l

CPU당 코어 수 : grep 'cpu cores' /proc/cpuinfo | tail -1


메모리 

cat /proc/meminfo


디스크 용량 확인 

df -h

더빙이 있었다... 


너무 한 거 아냐??!  


꼭 들어보길... 


안들은 귀 사고 싶다... --;;;;;;

javascript로 aws cognito 연동 할 때, app 설정에서 "클라이언트 보안키 생성" 옵션을 해제해야 한다.


https://github.com/aws-amplify/amplify-js/tree/master/packages/amazon-cognito-identity-js


"When creating the App, the generate client secret box must be unchecked because the JavaScript SDK doesn't support apps that have a client secret."


클라이언트 보안 옵션은 기본으로 체크 되어 있어서 생각없이 넘어 갔는데, 켜져 있으면  "Unable to verify secret hash for client .." 라는 에러는 보게된다.

앱 클라이언트 첫 설정할 때 주의 필요!!!



쉽다길래 별 생각 안했는데.. 설정할게 많네 -_-



ERROR. max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]

ERROR. memory locking requested for elasticsearch process but memory is not locked


위 두 에러가 발생하면 아래 내용을 참고하여 수정하면 된다.


클러스터를 구성하기 위해서는 리소스 사용에 대한 제한을 풀어줘야 한다. 


아래 command로 현재 리소스 제한 사항을 볼 수 있으며, 

ulimit -Sa


vi /etc/security/limits.conf


로 들어가서 아래와 같이 설정한다.


es-user hard memlock unlimited          >> 하드 세팅으로 메모리 락 제한 없도록 설정

es-user soft memlock unlimited           >> 소프트 세팅으로 메모리 락 제한 없도록 설정

es-user hard nofile 65536                   >> 하드 세팅으로 65536번의 파일을 열어 볼 수 있게 설정

es-user soft nofile 65536                    >> 소프트 세팅으로 65536번의 파일을 열어 볼 수 있게 설정

es-user hard nproc 65536                   >> 하드 세팅으로 65536번의 프로시저를 실행 할 수 있게 설정

es-user soft nproc 65536                    >> 소프트 세팅으로 65536번의 프로시저를 실행 할 수 있게 설정

(es-user는 Elasticsearch를 실행할 유저를 말한다. 사용중인 계정으로 수정하여 설정할 것!)

모든 설정이 끝나면 다시 시스템을 리붓한다. 



ERROR. max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]


하나의 프로세스가 가질 수 있는 메모리 맵 영역의 최대 수를 말하는데 아래와 같이 수정이 가능함.


sysctl -w vm.max_map_count=262144

(root 권한으로 실행)

재실행 없이 바로 적용됨.


ERROR. failed to send join request to master ... 


network.bind_host, network.publish_host, network.host 세 가지 설정을 적절히 했는지 잘 살펴 볼 것!



config 파일에서 수정해야 할 내용들


config/jvm.options


메모리 관련된 설정인데 역할에 따라 다르다. 찾아보면 다양한 정보가 나오는데 아직 경험하지 못해서 이렇다 저렇다 적기가 뭐 하네. 일단 아래 두 가지를 적절히 수정. 해당 서버의 리소스에 맞춰 수정이 필요. 


-Xms 와 -Xmx 를 master는 2g , data는 4g로 수정해 봄.


-------------------------------------------------------------------------------------------------------------------


config/elasticsearch.yml


cluster.name: es-cluster             << 적절한 이름으로 설정. 클러스터마다 고유해야 함.


node.name: node-master           << 적절한 이름으로 설정. 노드마다 고유해야 함.

node.master : true                    << 마스터 노드인 경우 true 아니면 false

node.data: false                       << 데이터 전용 노드인 경우 true 아니면 false


bootstrap.memory_lock: true      <<  bootstrap 검사. 5버전부터 추가 된 듯. 주요 설정들이 잘못된 경우 상용 모드에서는 서버가 실행되지 않고, 개발 모드에서는 경고 메세지 출력 처리. memory_lock은 jvm 메모리의 swapping lock 여부를 확인한다. 


network.bind_host: 0.0.0.0         
network.publish_host: 1.1.1.1      << 설치된 서버의 IP
network.host: 1.1.1.1                

transport.tcp.compress: true       << node간 통신하는 데이터의 압축 여부를 설정.
transport.tcp.port: 9300             << node간 통신에 사용하는 포트

http.port: 9200                        << http를 통한 elasticsearch API 지원 노드의 port를 설정한다.

(각 포트는 별도 설정하지 않았는데 기본값을 사용한다고 가정한다. 필요하다면 http.port , transport.tcp.port 옵션을 수정하여 사용할 것!)
discovery.zen.minimum_master_nodes: 1  << 실제 서비스 환경에서는 최소 2대 이상의 마스터를 운영해야 한다.
discovery.zen.ping.unicast.hosts: ["1.1.1.1:9300"]     << node 간 연결을 위해 unicast로 master 노드를 지정하자. 마스터로 등록된 서버의 모든 ip를 기록해야 한다. 기본 포트인 9300을 사용한다면 굳이 기록할 필요는 없고, 포트를 변경한 경우만 이와 같이 기록하며 된다.

-------------------------------------------------------------------------------------------------------------------

이상 Elasticsearch Cluster 를 구성할 때 발생하는 에러 유형과 해결책, 그리고 config 설정 정보를 추가로 정리해 보았다.


ES에서 제공하는 결과물은 대부분 멋지지만 가끔 odbc의 기능들이 필요한 경우가 있다. (X-pack을 사용하면 sql like query가 가능하지만 비용이 ..)


kibana 등에서는 결과를 실시간 쿼리를 통해 보기 때문에 반응성이 항상 아쉽다.


이런 저런 이유로 리포트용 솔루션을 별도 구축하게 되었다. 


만드는 김에, 일부 sql query가 필요한 경우를 위해, 필요한 로그들을 ES로 보냈다가 가져오기는 추가적인 절차가 필요해서,


logstash에서 ES로 보내면서 필요한 일부분만 바로 mysql에 직접 보내기로 했다. 


플러그인을 만들어야 하나 찾아보니... 


https://www.elastic.co/guide/en/logstash/current/input-plugins.html  >> input에는 


https://www.elastic.co/guide/en/logstash/current/output-plugins.html >> output에는 없네??


구글링 해보니 git에 있다.


https://github.com/theangryangel/logstash-output-jdbc/tree/master


하지만 2018/07/23 기준으로 아직 6.x 버전 대에서는 문제가 있을 수 있다네.


"See master branch for logstash v5 & v6 warning This is untested under Logstash 6.3 at this time, and there has been 1 unverified report of an issue. Please use at your own risk until I can find the time to evaluate and test 6.3."


대량 삽입에 대한 이슈가 한 개 올라와 있는데, 회피하거나, 어차피 오픈소스니 문제 생기면 고쳐서 리포트도 해줄 겸 해보자고 시작함. 



[ 설  치 ]


일단 jdbc 다운로드 해서 vendor 폴더 안에 jar/jdbc 폴더 만들고 삽입.


http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.11.tar.gz  >> 오늘 기준 최신 파일. https://dev.mysql.com/downloads/connector/j/에서 최신 버전을 확인 후 버전 번호를 대체하면 다운 받을 수 있음.


압축 풀어서 vendor/jar/jdbc 폴더에 삽입. logstash가 설치된 곳마다 별도 설치해야 함.


이후 logstash 폴더에서 bin/logstash-plugin install logstash-output-jdbc를 실행. 


[ 설  정 ]


사용하는 config파일 열어서 아래 내용 추가.


output 내용 중 필요한 조건에 따라 아래 내용을 추가하면 됨.


if[조건]==값{ jdbc { driver_class => "com.mysql.cj.jdbc.Driver" connection_string => "jdbc:mysql://your_mysql_addr:port/your_db?characterEncoding=UTF-8&serverTimezone=UTC&user=input_your_id&password=input_your_pwd" statement => [ "INSERT INTO table_name (column1, column2) VALUES(?,?)", "raw_data_name1", "raw_data_name_2" ] } }


보다 상세한 옵션에 대해서는 https://github.com/theangryangel/logstash-output-jdbc/tree/master#configuration-options 를 참고할 것.


이상. 





'개발/경험 > linux-Solution' 카테고리의 다른 글

시스템 기본 사양 확인하기  (0) 2018.08.30
Elasticsearch cluster 설정  (0) 2018.07.25
logstash와 mysql 연동  (0) 2018.07.24
logstash 인덱스 수정, 조건 설정하는 방법  (0) 2018.07.16
Kibana systemd 에 등록하기  (0) 2018.07.11
Elasticsearch 설치기  (0) 2018.07.06

'logstash-' 날짜 형태로 인덱스를 자동 생성하는데, 여러 타이틀 혹은 용도 별로 분리하려면 수정이 필수적임. 



만약 새롭게 생성하는 상황이라면, 원하는 곳에 pipelines에 적용할 config 파일을 하나 만들자. 


( https://www.elastic.co/guide/en/logstash/current/advanced-pipeline.html 참고)



만약 이미 만들어 두었다면 config/pipelines.yml을 열어 pipeline.id의 path.config를 확인해보자.


이제 기본적인 pipeline config를 구성했다면 원하는 조건과 이름을 활용해 인덱스를 수정해보자.


만약 logstash에서 elasticsearch로 바로 보낸다면 output 부분이 아래와 같을 것이다. 


output { elasticsearch { hosts => ["IP Address:port"] } }



hosts아래에 인덱스 이름 조건을 아래와 같이 삽입하면 elasticsearch에서 인덱스 명이 수정된 것을 확인할 수 있다.



output { elasticsearch { hosts => ["IP Address:port"]

index => 'test-%{+YYYY.MM.dd}' } }



만약 다중 pipelines을 사용한다면 input의 type별로 인덱스를 다르게 할 수 있다.



input {

redis {

.

.

type => "game_name"

}

.

.

}

.

.



output {

if[type]=="game_name"{ elasticsearch { hosts => ["IP Address:port"]

index => 'test-%{+YYYY.MM.dd}' }

}

.

.

}



* 조건은 아래와 같이 다중으로 처리 할 수 있다. 


if[type]=="game_name" and [playtime]>0{




보다 상세한 내용은 https://www.elastic.co/guide/en/logstash/current/configuration.html 문서에서 찾을 수 있다.



------------------------------------------------------------------------------------------------------------------------------


커스텀 인덱스 사용에 대한 주의 사항이 있어 내용을 추가한다.


유저 ip로 유저들의 위치 등을 찾아 낼 수 있는 플러그인을 기본적으로 제공하는데 한 가지 제약이 있다.


커스텀 인덱스를 사용하면 geoip의 정보를 찾아주지면 location이 아래처럼 일반 데이터 형태로 처리된다. 



그래서 Visualize/Map으로 가면 아래와 같은 에러를 볼 수 있다. 




원인은 logstash-로 시작되는 인덱스가 아닌 경우 geoip 를 제대로 처리하지 않기 때문이다. (https://www.elastic.co/blog/geoip-in-the-elastic-stack 참고)


elasticsearch로 output 하는 기본 Template 파일을 보면 "template":"logstash-*"로 시작되는걸 볼 수 있다. 


이를 해결하기 위한 방법은 두 가지가 있는데, 첫 번째는 별도의 template 파일을 만들어서 적용하는 것이다. 


elasticsearch {
      manage_template => true
      template => "/etc/logstash/templates/custom_template.json"
}

(https://stackoverflow.com/questions/29344547/kibana4-geo-map-error-not-showing-the-client-ip-field 참고)

하지만 이는 커스텀 인덱스 별로 모두 별도로 만들어야 하는 문제가 있다. 이를 해결하기 위한 두 번째 방법을 권고하는데, 그 방법은 커스텀 인덱스 이름 앞에 "logstash-"를 붙이는 방법이다. 개인적으로도 이 방법을 추천한다. 

index => 'logstash-test-%{+YYYY.MM.dd}'

잘 처리되면 아래와 같은 결과를 볼 수 있다. 

이상. 또 다른 이슈 안생기길...

'개발/경험 > linux-Solution' 카테고리의 다른 글

Elasticsearch cluster 설정  (0) 2018.07.25
logstash와 mysql 연동  (0) 2018.07.24
logstash 인덱스 수정, 조건 설정하는 방법  (0) 2018.07.16
Kibana systemd 에 등록하기  (0) 2018.07.11
Elasticsearch 설치기  (0) 2018.07.06
메모리 사용양 측정 - mpstat  (1) 2015.04.10

tar 파일 가져와서 설치했더니 데몬으로 가동이 안되는 상태.


rpm으로 다시 설치할까 그냥 systemd에 등록함. 


elasticsearch , kibana 모두 6.3 버전 사용.


/etc/systemd/system/kibana.service 파일을 만들어 아래 내용을 삽입.


[Unit]

Description=Kibana 6.3


[Service]

Type=simple

User=root

Environment=CONFIG_PATH=/your kibana path/config/kibana.yml

Environment=NODE_ENV=production

ExecStart=/your kibana path/node/bin/node /your kibana path/src/cli


[Install]

WantedBy=multi-user.target



systemctl daemon-reload 

systemctl start kibana

systemd로 start


systemctl status kibana 로 상태를 확인해보면 아래와 같이 나온다.


● kibana.service - Kibana 6.3

   Loaded: loaded (/etc/systemd/system/kibana.service; enabled; vendor preset: disabled)

   Active: active (running) since 화 2018-07-10 09:57:33 KST; 24h ago


'개발/경험 > linux-Solution' 카테고리의 다른 글

logstash와 mysql 연동  (0) 2018.07.24
logstash 인덱스 수정, 조건 설정하는 방법  (0) 2018.07.16
Kibana systemd 에 등록하기  (0) 2018.07.11
Elasticsearch 설치기  (0) 2018.07.06
메모리 사용양 측정 - mpstat  (1) 2015.04.10
apache2에서 perl 설정하기  (0) 2015.02.05

CentOS에 Elasticsearch를 설치해 보았다. 정리할 생각이 없었는데, 하다보니 중간에 막히는 것들이 처리하면서 정리 한번 해둬야겠단 생각이 들었다. 


일단 처음 설치할 때 주의할 점은 Elasticsearch는 root 계정으로 실행할 수 없다. (실행 가능하게 하는 옵션이 있던데, 최신 버전에서는 안되는 듯. 그리고 보안의 측면에서도 당연히 좋지 않아 추천하지 않는다.) 그러므로 전용 계정을 설정해서 설치, 실행하자.


설치 환경 및 각종 버전은 아래와 같다. 

CentOS  7.5.x

Elasticsearch 6.3.0 (https://www.elastic.co/downloads/elasticsearch)

plugin, Elastic-HQ (https://github.com/ElasticHQ/elasticsearch-HQ)



wget으로 다운로드 받아 설치한다. 별도 인스톨 과정은 없다. bin/elasticsearch 로 실행 가능.


wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.0.tar.gz

tar xvzf elasticsearch-6.3.0.tar.gz


실행전에 한 가지 수정하고 진행하자.

config/elasticsearch.yml에서 http.host를 자신이 사용하고자 하는 ip로 수정한다. 예를들어 내 ip가 172.150.x.x 이며 config를 수정하지 않고 실행할 경우 로컬에서 localhost로 접속은 되지만, 다른 PC에서 172.150.x.x로 접속되지는 않는다.


처음이니 데몬 옵션 주지말고 elasticsearch로 실행해보라. -d로 실행하며 혹시 모를 에러가 보이지 않으니 주의가 필요하다. 잘 실행되었는지 일단 확인해보자.


root 권한으로 실행되지 않으니 주의!


cluster 설정을 한 후 root로 실행하면 root권한으로 실행되지 않는다는 메세지와 함께, logs 폴더 아래 몇몇 로그 파일이 생긴다. 이를 지우지 않고 다른 계정으로 실행하면 log 파일 접근 실패 에러가 뜨면서 실행되지 않는다. 해당 로그 파일들을 삭제 후 다시 시작할 것!


curl 172.150.x.x:9200 ( 혹은 config를 수정하지 않았다면 localhost:9200)  

아래와 같은 간단한 health 정보가 출력되면 정상이다. 





혹시 그래도 접속이 안된다면 iptables에 9200번 ACCEPT 처리를 해주자.


 firewall-cmd --zone=public --permanent --add-port=5000/tcp


이제 플러그인 Elastic-HQ를 설치해보자. 이를 설치하기 위해 python 3.4 이상의 버전이 필요하다. CentOS 7.5 버전에는 기본적으로 2.x 버전이 설치되어 있다. 3.4 이상의 버전을 추가로 설치한 후 아래로 진행하자. 


( http://docs.elastichq.org/installation.html 참고)


git clone https://github.com/ElasticHQ/elasticsearch-HQ.git


설치에 필요한 추가 라이브러리를 설치한다. elasticsearch-HQ 폴더로 가서 아래를 실행.

(pip가 없다면 "yum install python-pip"로 설치.)


pip install -r requirements.txt

아래와 같은 에러 발생.

python-socketio 2.0.0 has requirement python-engineio>=2.2.0, but you'll have python-engineio 2.0.2 which is incompatible.

바로 업그레이드 시킴
pip3.6 install --upgrade python-engineio
(pip도 link설정 수정 안했다면 pip버전 지정해서 설정해야 함.)

이제 아래와 같이 실행 가능해졌다.

python3 application.py &
위에서 따로 언급 안했지만 python 3.x 버전을 추가로 설치 후 python 링크를 python3.6으로 대체했다면 시스템에 여러 문제가 발생할 수 있다. 

리눅스 시스템, 특히 CentOS는 python2를 많이 사용하고 있기 때문이다. 그래서 가능하면 python3.6.x 버전을 python3으로만 단축해서 사용해야 한다. 

HQ의 접속 포트는 5000번이다. iptables에 추가 후 브라우져로 접속해보면 아래와 같은 화면을 볼 수 있다.




주소를 지정하면 다음 화면으로 넘어간다.

HQ는 백그라운드로 실행했으므로 종료 시킬 때는 kill로... 


공식 문서에 python manage.py runserver 이걸로 실행하라는 이야기 있는데 에러가 나고, 해결책은 관심없어서 안 찾아봤음. 게다가 root 로 실행해야 함. -0-a 해결 방법 아시는 분 계시면 댓글 부탁드립니다. (공손..)


이까지.. 


다음은 Kibana 설치와 샘플 올려서 그래프 보는 방법에 문제가 있으면 이어서 계속, 별 문제 없으면 스킵.  :)


큰 건 아니고 작은 허들이 있어서 기록해 둠.

다운로드는 아래와 같이. (kibana는 elasticsearch와 동일한 버전을 다운받아 설정해야 한다. 안그럼 시작 시 경고 등장함.)

wget https://artifacts.elastic.co/downloads/kibana/kibana-6.3.0-linux-x86_64.tar.gz
압축을 풀고 config 일부를 수정하자.

config/kibana.yml에서  아래 사항을 설정한다. 


server.host: "yourkibanaip"

elasticsearch.url: "http://yourip:9200"

xpack.security.enabled: false   <<- 이에 대한 경고가 뜬다. 일단 테스트 과정이니 넘어감.


elasticsearch.url을 현재까지는 멀티로 지정할 수 없다. 커뮤니티에서도 다들 stack 솔루션 중 kibana만 안된다고 성토 중. 
( 관련 링크 : https://github.com/elastic/kibana/issues/214)

host 주소를 정확히 입력해두고, elasticsearch 주소 설정, 시작할 때 관리자 비번 안물어보게 설정.


이제 실행!!


bin/kibana


그럼 아래와 같은 화면을 볼 수 있다.




이제 logstash와 실제 데이터를 연동해서 결과를 만들어 볼 차례.


그 과정에 또 허들이 생기면 이젠 다른 글에 이어 정리할 예정. 바이~~~!



공식 사이트는 이 곳!!

http://jsoncpp.sourceforge.net/ >> 현재는 github로 링크가 이동된다.


최근 코드는 많이 달라져 있어서 최근 코드 사용에 대해서는 추후 다시 한번 정리할 예정이다.


이번은 예전에 사용하던 코드를 활용하여 ( 파일 >>  jsoncpp.zip


일단 설치는 그냥 압축을 풀어 프로젝트에 적용하면 끝!! (h와 cpp 파일 각 하나씩만 존재한다.)


사용법은 아래와 같다. 


- 읽기


json 파일의 내용을 어딘가에서 읽어왔다면 Json::Reader를 사용하여 파싱하여야 한다.


std::string data;  << --- 이곳에 json 데이터가 있다고 가정하면.. 

Json::Reader reader;

Json::Value root;

reader.parse(data, root); <<-- data를 넣어주면 root 에 파싱된 json 정보를 넣어준다.


const Json::Value &name = root["name"]; << -- name이라는 키를 활용해서 정보를 가져오고..

std::string yourName= name.asString();  << --- as... 로 데이터를 캐스팅해서 가져온다.



- 쓰기


새롭게 정보를 쓸 때는 Json::Value 에 기록할 수 있다.


Json::Value root;

root["name"] = "Poppy";   << -- name이라는 키와 "Poppy"라는 값을 삽입하는 예

root["array sample"] = Json::Value(Json::arrayValue);   << -- "array sample"이라는 배열을 삽입하는 

root["array sample"].append( "array 1");                    <<-- 위처럼 정의해주지 않아도 append 하면 바로 배열로 저장됨. 어쨌든 값을 배열로 저장하는 과정.

root["array sample"].append( "array 2");



Json::Value에 저장된 값을 텍스트 형태로 다시 변환하는 건 아래와 같이 가능핟. 

Json::FastWriter fastWriter;
std::string output = fastWriter.write(root);


최근 업데이트된 코드를 보고 내용을 첨부할 예정. (예정... 예... 정... 예................. 정.............................)




'개발/경험 > C C++' 카테고리의 다른 글

jsoncpp 사용법 정리  (0) 2018.07.05

+ Recent posts