naver / kaist-oss-course

Introduction to Open Source Software class @ KAIST 2016
38 stars 9 forks source link

[ARCUS] command-line tool 개발 #51

Open jhpark816 opened 8 years ago

jhpark816 commented 8 years ago

아래 기능을 가진 command-line tool을 개발한다.

blukat29 commented 8 years ago

제가 해보겠습니다.

lsj1888 commented 8 years ago

@blukat29 진행해보시고, 잘 안되거나 궁금하신 내용있으면 이곳에 질문 올려주세요.

MinWooJin commented 8 years ago

@blukat29 언어 선택, 개발은 자유롭게 하시고, 기획이나 사용방법 등 구조가 어느정도 완성되면 공유 한번 해주시면 좋을 것 같습니다. pull request는 arcus main repo(https://github.com/naver/arcus), develop 브랜치로 보내주세요.

blukat29 commented 8 years ago

안녕하세요, arcus-python-client에 제시하신 기능에 필요한 부분인 arcus hash, zookeeper query, memcache query 등이 python module로 구현되어있는 것으로 보입니다. 따라서 이 이슈에 필요한 기능은 arcus-python-client를 이용하여 구현하면 효율적으로 할 수 있을 것 같습니다.

괜찮은 방법인지, 그렇게 할 경우 코드 구성을 어떻게 해야 할 지, dependency는 어떤 식으로 포함시켜야 할 지 도움이 필요합니다.

MinWooJin commented 8 years ago

@blukat29 Python client를 이용해 개발하는 방법도 괜찮은 것 같습니다. 새로운 기는을 개발하는 것이니, 이슈에 명시된 기능이 포함되고 사용법에 대한 readme만 명확하게 있으면 됩니다. 그 외 코드 구성등은 자유롭게 하시면 됩니다.

wjw0926 commented 8 years ago

안녕하세요, 팀원으로 같이 참여하도록 하겠습니다.

wjw0926 commented 8 years ago

안녕하세요, arcus-python-client를 이용해서 제시하신 기능 중 새로운 기능을 구현하려고 합니다. 따라서 contribution을 arcus-python-client로 하는 것이 괜찮은 방법인지, 그렇다면 지금 담당 분과 계속 진행하면 되는지 여쭙니다.

jhpark816 commented 8 years ago

@wjw0926 @lynix94

현재로선, command-line tool의 일부 기능이 arcus-python-client에 있고, 이를 확장하여 새로운 기능을 추가하는 방향으로 contribution하려고 하니, arcus-python-client로 contribution하는 것이 좋을 것 같습니다.

새로 추가하려는 기능들이 어떤 것들이 있는 지 먼저 알려주면 검토하여 최종 답변 주겠습니다.

blukat29 commented 8 years ago

현재 arcus python client에 포함된 arcus_cmd.py 는 다음과 같은 기능을 가지고 있습니다.

$ ./arcus_cmd.py --help
Usage: arcus_cmd.py [options]

Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -f FILE, --file=FILE  zookeeper address lists file
  -a ADDRESS, --address=ADDRESS
                        zookeeper address
  -s SERVICE, --service=SERVICE
                        service code
  -c COMMAND, --command=COMMAND
                        arcus command
  -n NODE, --node=NODE  node address or ip
  -x SSH_COMMAND, --ssh_command=SSH_COMMAND
                        ssh command execution
  --ssh_command_file=SSH_COMMAND_FILE
                        ssh command execution from file
  -i, --i               memory, maxconns info
  --dump_script         dump start script
  --vpn_remap=VPN_REMAP
                        read ip remap file for vpn network
  --all_node            select all node
  --all_server          select all server
  -t TIMEOUT, --timeout=TIMEOUT
                        arcus command timeout (msec)

주어진 key의 value 조회의 경우 -c옵션으로 각 memcached 노드에 telnet 커맨드를 보내면 됩니다. 이렇게 하면 value뿐만 아니라 flag도 알 수 있고, key가 어느 노드에 있는지도 알 수 있습니다.

$ ./arcus_cmd.py -a localhost:2181 -s test -c 'get test:string1'
## Zookeeper address localhost:2181
[127.0.0.1:11211-(localhost)]
[127.0.0.1:11212-(localhost)]
[127.0.0.1:11211-(localhost)]           get test:string1 - VALUE test:string1 0 7
test...
END
[127.0.0.1:11212-(localhost)]           get test:string1 - END

그래서 여기에 prefix별 통계 기능이 추가되면 좋을 것 같습니다. 아래와 같이 각 memcached 노드에 stats itemsstats cachedump명령을 내려 키들의 목록을 뽑아오는 방식으로 구현하면 될 것 같습니다.

stats items
STAT items:0:number 7
STAT items:0:sticky 0
STAT items:0:age 498
STAT items:0:evicted 0
STAT items:0:evicted_nonzero 0
STAT items:0:evicted_time 0
STAT items:0:outofmemory 0
STAT items:0:tailrepairs 0
STAT items:0:reclaimed 42
END
stats cachedump 0 100
ITEM arcus:zk-ping [acctime=517, exptime=0]
ITEM test:incr [acctime=498, exptime=518]
ITEM test:bytearray [acctime=498, exptime=518]
ITEM test:bool [acctime=498, exptime=518]
ITEM test:float [acctime=498, exptime=518]
ITEM test:int [acctime=498, exptime=518]
ITEM test:string1 [acctime=498, exptime=518]
END [curtime=519]

최종적으로 목표하는 출력은 이런 식입니다.

$ ./arcus_cmd.py -a localhost:2181 -s test --prefix_stats
[127.0.0.1:11211-(localhost)]
test: 7 items
hello: 6 items
[127.0.0.1:11212-(localhost)]
test: 1 items
hello: 13 items
[total]
test: 8 items
hello: 19 items

@jhpark816 검토해보시고 답변 부탁드립니다. 감사합니다.

jhpark816 commented 8 years ago

@blukat29 각 cache node에서 prefix 관련된 stats 정보는 아래의 명령으로 구할 수 있습니다.

이들 정보를 -p PREFIX --prefix=PREFIX 옵션으로 받아 prefix 통계 정보를 요약된 형태로 제공해 주면 좋을 것 같습니다.

PREFIX로 지정할 수 있는 값은 아래 3가지 중의 하나가 될 것입니다.

출력 format은

위의 more human readble한 format은 stats prefixesstats detail demp 명령을 수행해서 어떤 결과가 나오는 지를 직접 확인해 보고, 이를 바탕으로, complete format을 결정해서 제안해 주면 좋겠습니다

@lynix94 이기열 책임님 어떤가요 ??

참고로, python client에 대해 ownership을 가지고 계신 분은 네이버의 이기열 책임님이며, 최종 review 해 주실 것입니다.. 따라서, 저와 이기열 책임님을 mention하여 comment해 주시면 됩니다..

blukat29 commented 8 years ago

@jhpark816 @lynix94

현재 prefix name이 주어지거나 ''로 주어진 경우에 stats prefixes의 결과를 보여주고, 합계를 보여주는 정도까지 구현했습니다. 아래 형식으로 출력이 되는 상태입니다. time값은 더할 수 없을 것 같아 total에서 제외했습니다. 그리고 존재하지 않는 prefix name을 입력하면 아무 출력도 나오지 않습니다.

일단은 여기에 stats detail dump의 내용을 추가할 것입니다.

$ python3 arcus_cmd.py -a localhost:2181 -s test -p test
## Zookeeper address localhost:2181
[127.0.0.1:11211-(localhost)]
[127.0.0.1:11212-(localhost)]
[127.0.0.1:11211-(localhost)]           stats prefixes
PREFIX test itm 11 kitm 6 litm 0 sitm 1 bitm 4 tsz 174904 ktsz 480 ltsz 0 stsz 528 btsz 173896 time 20160606081032
[127.0.0.1:11212-(localhost)]           stats prefixes
PREFIX test itm 5 kitm 2 litm 1 sitm 0 bitm 2 tsz 70272 ktsz 168 ltsz 408 stsz 0 btsz 69696 time 20160606081032
[total]
PREFIX test itm 16 kitm 8 litm 1 sitm 1 bitm 6 tsz 245176 ktsz 648 ltsz 408 stsz 528 btsz 243592

그리고 세부적인 사항에 대해 질문이 있습니다.

  1. <all> prefix를 받으면 모든 prefix에 대해 각각 노드별로 출력하고 각각 total을 계산해서 보여주면 될까요?
  2. more human readable format은 아래처럼 비슷한 종류끼리 모아주고, 출력 시에 글자 수를 맞춰서 보여주는 것으로 생각하고 있는데 이렇게 진행하면 될까요?
PREFIX test
  get  10 hit   10 set   12 del    0 inc    2 dec    4
  lcs   2 lis   12 lih   12 lds    0 ldh    0 lgs   12 lgh   12
  scs   1 sis    6 sih    6 sds    0 sdh    0 sgs    1 sgh    1 ses    7 seh    7
  bcs   4 bis 4000 bih 4000 bus    0 buh    0 bds    0 bdh    0 bps    0 bph    0
  bms   0 bmh    0 bgs    6 bgh    5 bns    1 bnh    1
  pfs   0 pfh    0 pgs    0 pgh    0
  gps   0 gph    0 gas    0 sas    0

개발은 https://github.com/blukat29/arcus-python-client 에 fork해서 진행하고 있고 개발이 더 진행되면 한번에 pull request를 보낼 생각입니다.

jhpark816 commented 8 years ago

@blukat29 수고가 많습니다.

PREFIX test   get  10 hit   10 set   12 del    0 inc    2 dec    4
              lcs   2 lis   12 lih   12 lds    0 ldh    0 lgs   12 lgh   12
              scs   1 sis    6 sih    6 sds    0 sdh    0 sgs    1 sgh    1 ses    7 seh    7
              bcs   4 bis 4000 bih 4000 bus    0 buh    0 bds    0 bdh    0
                      bps    0 bph    0  bms   0 bmh    0 bgs    6 bgh    5 bns    1 bnh    1
                      pfs    0 pfh    0 pgs    0 pgh    0
              gps   0 gph    0 gas    0 sas    0
PREFIX test1  itm     11 kitm      6 litm      0 sitm      1 bitm      4 
              tsz 174904 ktsz    480 ltsz      0 stsz    528 btsz 173896 time 20160606081032
PREFIX test2  itm     11 kitm      6 litm      0 sitm      1 bitm      4 
              tsz 174904 ktsz    480 ltsz      0 stsz    528 btsz 173896 time 20160606081032
PREFIX test3  itm     11 kitm      6 litm      0 sitm      1 bitm      4 
              tsz 174904 ktsz    480 ltsz      0 stsz    528 btsz 173896 time 20160606081032

PREFIX test1  get  10 hit   10 set   12 del    0 inc    2 dec    4
              lcs   2 lis   12 lih   12 lds    0 ldh    0 lgs   12 lgh   12
              scs   1 sis    6 sih    6 sds    0 sdh    0 sgs    1 sgh    1 ses    7 seh    7
              bcs   4 bis 4000 bih 4000 bus    0 buh    0 bds    0 bdh    0
                      bps    0 bph    0  bms   0 bmh    0 bgs    6 bgh    5 bns    1 bnh    1
                      pfs    0 pfh    0 pgs    0 pgh    0
              gps   0 gph    0 gas    0 sas    0
PREFIX test2  get  10 hit   10 set   12 del    0 inc    2 dec    4
              lcs   2 lis   12 lih   12 lds    0 ldh    0 lgs   12 lgh   12
              scs   1 sis    6 sih    6 sds    0 sdh    0 sgs    1 sgh    1 ses    7 seh    7
              bcs   4 bis 4000 bih 4000 bus    0 buh    0 bds    0 bdh    0
                      bps    0 bph    0  bms   0 bmh    0 bgs    6 bgh    5 bns    1 bnh    1
                      pfs    0 pfh    0 pgs    0 pgh    0
              gps   0 gph    0 gas    0 sas    0
PREFIX test3  get  10 hit   10 set   12 del    0 inc    2 dec    4
              lcs   2 lis   12 lih   12 lds    0 ldh    0 lgs   12 lgh   12
              scs   1 sis    6 sih    6 sds    0 sdh    0 sgs    1 sgh    1 ses    7 seh    7
              bcs   4 bis 4000 bih 4000 bus    0 buh    0 bds    0 bdh    0
                      bps    0 bph    0  bms   0 bmh    0 bgs    6 bgh    5 bns    1 bnh    1
                      pfs    0 pfh    0 pgs    0 pgh    0
              gps   0 gph    0 gas    0 sas    0

@lynix94 어떤가요 ??

lynix94 commented 8 years ago

네, 이의 없습니다.

blukat29 commented 8 years ago

@lynix94 @jhpark816

@wjw0926 와 같이 작업하여 https://github.com/naver/arcus-python-client/pull/8 로 pull request 보냈습니다.