sed에는 저장 기능이 있다. 특정 패턴에 매칭되면 레지스터에 저장할 수 있다. 


마지막 글자를 레지스터 1에 저장하는 예시는 다음과 같다. 모든 문자(.*) 뒤에 (.)$ 를 얻는다. (나 )는 특수 문자라서 \을 필요로 한다. 


$ echo '123456' |  sed 's/.*\(.\)$/\1/'

6



맨 처음 글자를 레지스터 1에 저장하는 예시는 위 예시를 반대로 하면 된다. 


$ echo '123456' |  sed 's/^\(.\).*/\1/'

1



조금 더 앞으로 나아가 맨 처음 2글자를 뽑아보자. ^\(.\)\(.\)를 .*앞에 추가하고 다음 / 뒤에 \1\2를 추가한다. 

레지스터 1,2에 저장된 내용을 그대로 출력하게 한다.


$ echo '123456' |  sed 's/^\(.\)\(.\).*/\1\2/'

12


그 다음에는 처음에서 두 번째 문자를 출력해보자. 저장된 레지스터 2(\2)를 사용한다.


$ echo '123456' |  sed 's/^\(.\)\(.\).*/\2/'

12



다음은 패턴 매칭에 대한 상세 내용을 본다. 
12과 3이 오면 12를 저장한 내용을 레지스터 1에 저장한다. 그런데, 단 한 번만 출력한다. 


$ echo '1231231' | sed 's/\(12\)3/\1/'

121231



계속 패턴을 적용하려면, 마지막에 g를 추가한다. 


$ echo '1231231' | sed 's/\(12\)3/\1/g'

12121



sed에서 /만 사용해서 처음 만난 a를 A로 처음 바꿀 수 있다. 


$ echo 'aaaaaa' | sed 's/a/A/'

Aaaaaa




다섯 번째 a를 A로도 변경할 수 있다. 


$ echo 'aaaaaa' | sed 's/a/A/5'

aaaaAa




모든 a를 A로 바꾸려면 g를 사용한다. 


$ echo 'aaaaaa' | sed 's/a/A/g'

AAAAAA



이제 조금 익숙해졌다면, 재미있는 패턴 매칭으로 구성할 수 있다. 12와 3으로 이루어진 문자는 12----3,으로 나타내게 한다.



$ echo '123123123' | sed 's/\(12\)\(3\)/\1----\2,/g'

12----3,12----3,12----3,



Posted by '김용환'
,


ntpd를 잘못 설치되어 ntpd가 잘 못 뜰때가 있다. 

(ntp는 클러스터로 동작하는 많은 nosql에서 동기화하는데 중요한 위치를 차지한다. hbase, cassandra 등등이 예로 들 수 있다)


centos 6 기준으로 ntp를 실행한다.


$ sudo service ntpd start

실행 안됨


$ vi /var/log/message


Jan  9 23:45:28 ntpd[12521]: restrict: error in address '::' on line 10. Ignoring...

Jan  9 23:45:28 ntpd[12521]: restrict: error in address '::1' on line 16. Ignoring...

Jan  9 23:45:32 ntpd[12521]: ntpd exiting on signal 15



원인은 장비에 ipv6를 지원하지 않기 때문이다. ipv6을 사용하지 않기 때문에.. 그대로 진행해본다.

(SE와 정확한 원인을 파악하는게 좋다. 사실 ntpd를 다시 삭제하고 설치하는 것을 추천한다.. 하지만 재설치 없이 진행하는 글이 이 블로그의 목적이긴 한다.)



참고로 ntp 데몬이 종료됨을 아래 소스에서 확인할 수 있다. 참고로 signal 15는 SIGTERM이다. 


https://github.com/ntp-project/ntp/blob/master/ntpd/ntpd.c#L1380


static void
finish_safe(
int sig
)
{
const char *sig_desc;
sig_desc = NULL;
#ifdef HAVE_STRSIGNAL
sig_desc = strsignal(sig);
#endif
if (sig_desc == NULL)
sig_desc = "";
msyslog(LOG_NOTICE, "%s exiting on signal %d (%s)", progname,
sig, sig_desc);
/* See Bug 2513 and Bug 2522 re the unlink of PIDFILE */
# ifdef HAVE_DNSREGISTRATION
if (mdns != NULL)
DNSServiceRefDeallocate(mdns);
# endif
peer_cleanup();
exit(0);
}




두 군데를 수정한다. restrict -6 대신 -6을 없애고, restict -6 ::1을 주석 처리한다.


$ vi /etc/ntp.conf

..

#restrict -6 default kod nomodify notrap nopeer noquery

restrict default kod nomodify notrap nopeer noquery


#restrict -6 ::1



다시 데몬을 실행해본다.



$ sudo service ntpd start

실행 안됨


로그를 살펴보면 ntp 사용자가 없기 때문에 에러가 발생한다. (사실, ntpd는 ntp 계정에서 사용하도록 되어 있다.)


$ vi /var/log/message

Cannot find user `ntp'




sudo를 사용해 group과 user 계정을 추가한다. 


$ sudo groupadd -g 87 ntp && sudo useradd -c "Network Time Protocol" -d /var/lib/ntp -u 87 \

        -g ntp -s /bin/false ntp


데몬을 실행하면 잘 동작한다. 


$ sudo service ntpd start

$ ps -ef | grep ntp

ntp       8261     1  0 23:47 ?        00:00:00 ntpd -u ntp:ntp -p /var/run/ntpd.pid -g



정상적으로 실행되는지 ntpq -p를 실행한다. 


$ ntpq -p

     remote           refid      st t when poll reach   delay   offset  jitter

==============================================================================

...



Posted by '김용환'
,



cassandra 장비를 재시작할 때 다음 커맨드를 실행한다.




cassandra의 내부 통신은 gossip 프로토콜(p2p)을 사용한다. 해당 프로토콜을 이용해 서로의 상태를 확인하고 노드를 알수 있게 된다. disablegossip을 하면 클러스터에서 끊어지는 효과를 얻게 된다. 마치 그 장비는 없는 셈이 된다. (재시작된 서버가 클러스터에 빠져서 클러스터로 돌아왔을 때, consistency를 맞추기 위한 시간을 줄이기 위한 추가적인 기능인 Hinted handoff도 disable되지 않는다.) 


opscenter로 확인하면 클러스터에서 disablegossip 커맨드를 실행한 서버가 클러스터에서 빠져 있는 것을 볼 수 있다.


$ nodetool disablegossip



클러스터 상황이 내부적으로 정리되면, 이번에는 클러스터에 붙는 애플리케이션의 연결을 사용하지 않도록 한다. disablethrift는 cassandra data-stax client에서 해당 클러스터의 연결이 진행되지 못하도록 한다.


$ nodetool disablethrift


리눅스 내부적으로 tcpdump/netstat으로 확인해보면, disablethift를 실행할 때 기존의 connection은 끊기고 새로운 connection이 맺어지고 더 이상 데이터는 전달되지 않는 가짜 connection이 생긴다. (ping과 fin/ack 정도만 있다)



필요에 따라서는 opscenter와 agent와 같은 일부 probe툴과의 통신을 끊을 수 있다.


$ nodetool disablebinary



다음에는 drain 커맨드를 실행시켜 완전한 connection을 중단한다. 

애플리케이션과 중지된 cassandra간의 connection은 모두 끊어진다. 


$ nodetool drain



이제 cassandra 데몬을 종료한다.


$ kill -9 $cassandra_pid




cassandra 재시작 또는


$ reboot


작업을 진행한다...





cassandra 데몬을 실행한다. 



$ CASSANDRA_CONF=/etc/cassandra/conf cassandra


제대로 실행 중인지 로그를 확인한다. 참고로 부하와 cpu가 일시적으로 올라갈 수 있다. 


$ tail -f /var/log/cassandra/system.log




opscenter를 위한 모니터링 툴을 실행한다.


sudo service datastax-agent start



그리고, ntp 데몬이 정상적인지 확인한다. 동기(sync) 시간이 카산드라 클ㄹ스터에 중요한 부분을 차지하기 때문에 ntp 데몬이 정상인지 확인해야 한다. 그리고 불의의 사고에서도 동작되도록 chkconfig를 확인한다. 



$ ntpq -p

     remote           refid      st t when poll reach   delay   offset  jitter

==============================================================================

..



$  sudo chkconfig --list | grep ntpd

ntpd           0:해제 1:해제 2:활성 3:활성 4:활성 5:활성 6:해제





이제 opscenter에서 클러스터에 제대로 붙어 있는지 확인할 수 있다. 


그리고, tcpdump를 사용해서 특정 소켓에 대해서 정상적으로 패킷이 왔다갔다 하는지 확인한다. 





* 참고 


재시작을 할 상황에서는 복구를 구성할 수 있는 정보가 3시간(디폴트)만 저장된다. 따라서 3시간이 넘어가면 복구할 수 없게 된다. 즉 복구 관련된 힌트 정보를 모두 삭제한다. 따라서 이를 위해 nodetool repaire를 실행해 클러스터의 정보를 복제하도록 해야 한다. 관련 복제 관련된 정보가 바로 max_hint_window_in_ms이다. 



http://docs.datastax.com/en/archived/cassandra/2.0/cassandra/configuration/configCassandra_yaml_r.html



max_hint_window_in_ms
(Default: 10800000 - 3 hours) Defines how long in milliseconds to generate and save hints for an unresponsive node. After this interval, new hints are no longer generated until the node is back up and responsive. If the node goes down again, a new interval begins. This setting can prevent a sudden demand for resources when a node is brought back online and the rest of the cluster attempts to replay a large volume of hinted writes.




'cassandra' 카테고리의 다른 글

[cassandra] 로그 설정 팁  (0) 2017.01.11
[cassandra] nodetool disablebinary  (0) 2017.01.11
[cassadra] compaction 전략  (0) 2016.12.09
[cassandra] select count(*) 구하기  (0) 2016.12.07
[cassandra] read repair  (0) 2016.11.23
Posted by '김용환'
,