naver / arcus-memcached

ARCUS memory cache server
https://github.com/naver/arcus
Apache License 2.0
70 stars 55 forks source link

nested prefix 기능 개발 #486

Open minkikim89 opened 4 years ago

minkikim89 commented 4 years ago

nested prefix 기능을 개발하도록 한다.

ARCUS는 현재 기본 delimiter로 콜론(:)을 사용하므로 parent_prefix:child_prefix:subkey 위와 같이 key가 들어올 때, parent_prefix의 child 는 child_prefix가 된다.

이 이슈에서는 아래와 같은 내용들을 처리하도록 한다.

추후 아래와 같은 작업을 별개 이슈로 진행한다.

matteblack9 commented 4 years ago

제가 맡도록 하겠습니다

matteblack9 commented 4 years ago

stats detail dump로 prefix들의 연산 통계 정보를 구했을 때에, "item들의 개수 = collections들의 개수 합 + kv아이템 개수 합"으로 나타내는데, child prefix도 아이템 개수들의 합으로 나타내는 것이 맞을까요?

예를 들어, prefix를 pfx, prefix size를 psz로 나타낸다고 가정했을 때에

PREFIX a itm 7 pfx 2 kitm 5 litm 0 sitm 0 mitm 0 bitm 0 tsz 504 psz 128 ktsz 376 ltsz 0 stsz 0 mtsz 0 btsz 0 time 20121105152422
이렇게 나타내는 것이 맞는건지 아니면, 아이템과 prefix는 별개로
PREFIX a pfx 2 itm 5 kitm 5 litm 0 sitm 0 mitm 0 bitm 0 psz 128 tsz 376 ktsz 376 ltsz 0 stsz 0 mtsz 0 btsz 0 time 20121105152422
이렇게 나타내는 것이 맞는건지 모르겠습니다. . child prefix를 하나의 item으로 봐야할지, 아니면 별개의 데이터로 봐야할지 말씀해주셨으면 합니다.
matteblack9 commented 4 years ago

parent prefix를 flush 하는 경우, prefix_t내에 *parent_prefix 뿐 아니라, **child_prefix와 같은 것들을 추가해서 child prefix들도 모두 flush 하게 하는 것이 맞을까요?

minkikim89 commented 4 years ago

@HarryKim93 질문하신 내용에 대해 토의하기 전에 현재 설계한 nested prefix 기능의 설계에 대해 검토를 진행해야할 것 같습니다. 이미 prefix.c에 구현되어 있는 코드를 기반으로 해서 개발을 진행하셨을 텐데요. 이에 대해서 점검하기 위해서 기 구현되어있던 부분과, 현재 개발하신 부분을 총합해서 어떤 식으로 설계/구현 하셨는지를 정리해서 공유해주시면 감사하겠습니다.

jhpark816 commented 4 years ago

@HarryKim93 @minkikim89 몇 가지 질문 및 문의의 답변입니다.

matteblack9 commented 4 years ago

develop branch에서 주석처리된 nested prefix 구현부로 test파일을 돌려보니 2단계이상의 nested prefix도 잘 작동합니다. 현재는 3단계로 제한하고 있습니다.

현재 구현하려는 nested prefix 개념은 mongoDB의 Embedded Documents(depth를 100으로 제한)와 거의 흡사하게 생각하고 있습니다. nested prefix를 통해서 root prefix와 prefix관계 뿐만아니라 prefix와 prefix 사이의 일대다 관계를 만듦으로서, prefix에 속해있는 데이터들 사이의 관계를 명확히 하게하고, 연산을 최소화하기 위함입니다.

예를 들어 A라는 prefix와 A의 세부정보를 포함하는 child prefix가 있을 때, flush와 같은 연산 한번으로 A와 관련된 세부정보들을 한번의 query만으로 다룰 수 있게 됩니다.

그래서 결론적으로는 query를 최소화하기 위해서 nested prefix 개념이 사용된다 생각하고 있습니다.

jhpark816 commented 4 years ago

@minkikim89

Nested prefix는 예전 아래 문제로 보류해 두었던 기능입니다.

이번에 nested prefix 기능을 추가한다면, "기능 spec 명세화"가 필요합니다. 1개 prefix인 경우는 기능 명세가 직관적이지만, nested prefix인 경우는 이를 어떻게 제공할 지를 결정해 두어야 합니다. 예를 들어, nested prefix인 경우 아래 기능들이 정의되어 공유되어야 하고, 그 정의에 맞게 PR이 구현된 것인지를 확인하는 것이 필요합니다.

1) prefix 단위로 item 제거 기능

그리고, nested prefixes 기능이 응용의 어떤 경우에 활용하면 유용한 지도 정리하면 좋을 것입니다. 현재 당장 떠오르지 않습니다.

위의 기능 spec을 잘 구현하기 위하여, 구현 방식이 달라질 수도 있을 것 같습니다. 예를 들어, child prefixes들을 tree 구조처럼 관리하는 것이 나을 수도 있습니다.

따라서, 이번 PR을 어느 선의 spec까지 구현할 것인지가 관련자들 모두에게 잘 공유되어야 PR 받아서 처리는 데 문제가 없을 것입니다.

이번에는 어떤 spec으로 정리하는 것이 좋을까요 ?

minkikim89 commented 4 years ago

stats의 경우 stats prefixes로 전체 prefix들을 조회할 경우는 inclusive item count를, 특정 prefix를 조회하는 경우는 exclusive item count를 사용하면 될 것 같다고 생각합니다. 즉, 아래와 같이 출력되는 것을 생각하고 있습니다.(pcnt=prefix count)

stats prefixes
PREFIX <null> pcnt 0 itm 1 kitm 1 litm 0 sitm 0 mitm 0 bitm 0 tsz 88 ktsz 88 ltsz 0 stsz 0 mtsz 0 btsz 0 time 20200909204708
PREFIX pfx1 pcnt 2 itm 10 kitm 10 litm 0 sitm 0 mitm 0 bitm 0 tsz 88 ktsz 88 ltsz 0 stsz 0 mtsz 0 btsz 0 time 20200909204708
END

stats prefixes pfx1
PREFIX pfx1 pcnt 2 itm 2 kitm 2 litm 0 sitm 0 mitm 0 bitm 0 tsz 88 ktsz 88 ltsz 0 stsz 0 mtsz 0 btsz 0 time 20200909204708
PREFIX pfx1:sub1 pcnt 0 itm 5 kitm 5 litm 0 sitm 0 mitm 0 bitm 0 tsz 88 ktsz 88 ltsz 0 stsz 0 mtsz 0 btsz 0 time 20200909204708
PREFIX pfx1:sub2 pcnt 0 itm 3 kitm 3 litm 0 sitm 0 mitm 0 bitm 0 tsz 88 ktsz 88 ltsz 0 stsz 0 mtsz 0 btsz 0 time 20200909204708
END

@HarryKim93 stats 출력에 대해서 다른 좋은 의견이 있으시면 말씀해주시면 감사하겠습니다.

jhpark816 commented 4 years ago

@minkikim89 @HarryKim93

jhpark816 commented 4 years ago

@minkikim89 @HarryKim93 위 코멘트를 다시 수정하였으므로, 확인 바랍니다.

minkikim89 commented 4 years ago

@jhpark816 prefix operation stats 정보란게 어떤걸 말씀하시는 건가요? 그리고, 참고로 inclusive item count/bytes 구현 방식은 말씀하신 방법 중 이미 전자로 구현되어있습니다.

jhpark816 commented 4 years ago

@minkikim89 stats detail dump하면 나오는 내용을 말합니다.

PREFIX <null> get 2 hit 2 set 2 del 0
       lcs 0 lis 0 lih 0 lds 0 ldh 0 lgs 0 lgh 0
       scs 0 sis 0 sih 0 sds 0 sdh 0 sgs 0 sgh 0 ses 0 seh 0
       mcs 0 mis 0 mih 0 mus 0 muh 0 mds 0 mdh 0 mgs 0 mgh 0
       bcs 0 bis 0 bih 0 bus 0 buh 0 bds 0 bdh 0 bps 0 bph 0 bms 0 bmh 0 bgs 0 bgh 0 bns 0 bnh 0
       pfs 0 pfh 0 pgs 0 pgh 0
       gas 0 sas 0
PREFIX a get 5 hit 5 set 5 del 0 
       lcs 0 lis 0 lih 0 lds 0 ldh 0 lgs 0 lgh 0
       scs 0 sis 0 sih 0 sds 0 sdh 0 sgs 0 sgh 0 ses 0 seh 0
       mcs 0 mis 0 mih 0 mus 0 muh 0 mds 0 mdh 0 mgs 0 mgh 0
       bcs 0 bis 0 bih 0 bus 0 buh 0 bds 0 bdh 0 bps 0 bph 0 bms 0 bmh 0 bgs 0 bgh 0 bns 0 bnh 0
       pfs 0 pfh 0 pgs 0 pgh 0
       gas 0 sas 0
PREFIX b get 2 hit 2 set 2 del 0 
       lcs 0 lis 0 lih 0 lds 0 ldh 0 lgs 0 lgh 0
       scs 0 sis 0 sih 0 sds 0 sdh 0 sgs 0 sgh 0 ses 0 seh 0
       mcs 0 mis 0 mih 0 mus 0 muh 0 mds 0 mdh 0 mgs 0 mgh 0
       bcs 0 bis 0 bih 0 bus 0 buh 0 bds 0 bdh 0 bps 0 bph 0 bms 0 bmh 0 bgs 0 bgh 0 bns 0 bnh 0
       pfs 0 pfh 0 pgs 0 pgh 0
       gas 0 sas 0
END

아래 문서에서 "Prefix 통계 정보" 부분을 확인하세요 http://www.jam2in.com/arcus-docs/#/arcus-server/ARCUS-Server-Ascii-Protocol/1.11/ch11-command-administration

minkikim89 commented 4 years ago

@jhpark816 stats detail dump 를 나타내는 게 쉽지 않네요.. 지금 생각나는 것은 parent prefix에 대해서 맨 첫번째로는 inclusive 통계를 보여주고, 그 밑에 해당 prefix 의 exclusive 연산 통계, 그리고 밑에 차례대로 child를 보여주는 게 어떤가 싶습니다. 이때 exclusive 통계를 보여줄 때 어떻게 표현할지가 문제인데, 특수문자를 넣어서 표기하는 게 어떤가 싶습니다. 현재 '*' 문자가 prefix에서 사용될 수 없는 문자이기 때문에 아래에 이 문자를 통해서 exclusive 통계를 표현해보았습니다. 즉, prefix a 통계는 inclusive 통계, prefix a* 통계는 exclusive 통계입니다. 반대로 만약 backward compatibility를 고려하지 않는다면 inclusive 통계를 a:* 형태로 써도 괜찮을 것 같습니다.

PREFIX <null> get 2 hit 2 set 2 del 0
       lcs 0 lis 0 lih 0 lds 0 ldh 0 lgs 0 lgh 0
       scs 0 sis 0 sih 0 sds 0 sdh 0 sgs 0 sgh 0 ses 0 seh 0
       mcs 0 mis 0 mih 0 mus 0 muh 0 mds 0 mdh 0 mgs 0 mgh 0
       bcs 0 bis 0 bih 0 bus 0 buh 0 bds 0 bdh 0 bps 0 bph 0 bms 0 bmh 0 bgs 0 bgh 0 bns 0 bnh 0
       pfs 0 pfh 0 pgs 0 pgh 0
       gas 0 sas 0
PREFIX a get 30 hit 30 set 5 del 0 
       lcs 0 lis 0 lih 0 lds 0 ldh 0 lgs 0 lgh 0
       scs 0 sis 0 sih 0 sds 0 sdh 0 sgs 0 sgh 0 ses 0 seh 0
       mcs 0 mis 0 mih 0 mus 0 muh 0 mds 0 mdh 0 mgs 0 mgh 0
       bcs 0 bis 0 bih 0 bus 0 buh 0 bds 0 bdh 0 bps 0 bph 0 bms 0 bmh 0 bgs 0 bgh 0 bns 0 bnh 0
       pfs 0 pfh 0 pgs 0 pgh 0
       gas 0 sas 0
PREFIX a* get 5 hit 5 set 5 del 0 
       lcs 0 lis 0 lih 0 lds 0 ldh 0 lgs 0 lgh 0
       scs 0 sis 0 sih 0 sds 0 sdh 0 sgs 0 sgh 0 ses 0 seh 0
       mcs 0 mis 0 mih 0 mus 0 muh 0 mds 0 mdh 0 mgs 0 mgh 0
       bcs 0 bis 0 bih 0 bus 0 buh 0 bds 0 bdh 0 bps 0 bph 0 bms 0 bmh 0 bgs 0 bgh 0 bns 0 bnh 0
       pfs 0 pfh 0 pgs 0 pgh 0
       gas 0 sas 0
PREFIX a:subpfx1 get 10 hit 10 set 5 del 0 
       lcs 0 lis 0 lih 0 lds 0 ldh 0 lgs 0 lgh 0
       scs 0 sis 0 sih 0 sds 0 sdh 0 sgs 0 sgh 0 ses 0 seh 0
       mcs 0 mis 0 mih 0 mus 0 muh 0 mds 0 mdh 0 mgs 0 mgh 0
       bcs 0 bis 0 bih 0 bus 0 buh 0 bds 0 bdh 0 bps 0 bph 0 bms 0 bmh 0 bgs 0 bgh 0 bns 0 bnh 0
       pfs 0 pfh 0 pgs 0 pgh 0
       gas 0 sas 0
PREFIX a:subpfx2 get 15 hit 15 set 5 del 0 
       lcs 0 lis 0 lih 0 lds 0 ldh 0 lgs 0 lgh 0
       scs 0 sis 0 sih 0 sds 0 sdh 0 sgs 0 sgh 0 ses 0 seh 0
       mcs 0 mis 0 mih 0 mus 0 muh 0 mds 0 mdh 0 mgs 0 mgh 0
       bcs 0 bis 0 bih 0 bus 0 buh 0 bds 0 bdh 0 bps 0 bph 0 bms 0 bmh 0 bgs 0 bgh 0 bns 0 bnh 0
       pfs 0 pfh 0 pgs 0 pgh 0
       gas 0 sas 0
PREFIX b get 2 hit 2 set 2 del 0 
       lcs 0 lis 0 lih 0 lds 0 ldh 0 lgs 0 lgh 0
       scs 0 sis 0 sih 0 sds 0 sdh 0 sgs 0 sgh 0 ses 0 seh 0
       mcs 0 mis 0 mih 0 mus 0 muh 0 mds 0 mdh 0 mgs 0 mgh 0
       bcs 0 bis 0 bih 0 bus 0 buh 0 bds 0 bdh 0 bps 0 bph 0 bms 0 bmh 0 bgs 0 bgh 0 bns 0 bnh 0
       pfs 0 pfh 0 pgs 0 pgh 0
       gas 0 sas 0
END
jhpark816 commented 4 years ago

@minkikim89

minkikim89 commented 4 years ago

@jhpark816

jhpark816 commented 4 years ago

@minkikim89 stats prefixes 결과에서 child prefix count 정보도 뺄까요 ? 크게 의미가 없는 것 같고, 개별 prefix의 detail 정보를 요청할 때 제공해도 되지 않나 생각됩니다.

그리고, 기능 spec에 관련하여 이번 PR에 구현되어야 할 내용을 본 이슈의 첫번째 comment에 잘 정리해 두면, 관련자 분들이 보고 common sense를 가질 수 있을 것 같습니다.

minkikim89 commented 4 years ago

@jhpark816 child prefix count는 개인적으로는 필요하다고 생각합니다. stats prefixes를 했을 때 이제부터 default로 inclusive 통계가 나올텐데 child prefix count에 대한 내용이 없을 시, 캐시아이템들이 실제로는 child prefix에 속한 아이템 일 수 있다는 사실이 혼동스러울 것 같습니다.

@jhpark816 @HarryKim93 이슈 내용에 이번 PR에 구현해야할 내용 정리해두었습니다. prefix 별 통계(stats prefixes, stats detail dump)에서 exclusive stats를 출력하는 것은 다른 이슈에서 진행하고 이번 이슈에서는 단순히 최상위 prefix들에 대해서 inclusive stats만을 출력하도록 하면 될 것 같습니다.

jhpark816 commented 4 years ago

@minkikim89 @HarryKim93 이슈 내용 부분을 보완하였으므로, 참고 바랍니다.

jhpark816 commented 3 years ago

@HarryKim93 ARCUS에서 prefix는 캐시 아이템들의 논리적인 그룹으로 RDBMS에서 table에 해당하는 개념입니다. 현재 prefix 사용 목적은 아래 2가지 입니다.

Nested prefix에서 향후 작업은 2 작업으로 나누고 아래 순서로 진행하면 좋을 것 같습니다.

검토해 보시고, 다른 의견이 있다면 코멘트 바랍니다.