Riak doc의 Vector Clocks를 의역해 봤습니다.
12007 단어 riak
대략적인 의역은 번역하기 어려운 곳은 영어로 옮겨 싣는다.
http://docs.basho.com/riak/1.3.2/references/appendices/concepts/Vector-Clocks/
Overview
어느 노드든지 모든 요청을 받아들일 수 있습니다. 모든 노드가 모든 요청에 참여해야 하는 것은 아닙니다. 이것은values의 버전이 최신 버전인지 거슬러 올라가는 방법이 필요합니다.Vector Clock은 이 작업에 유용합니다.
새 value가 Rik에 저장되면 첫 번째 버전이 Vector Clock으로 설정되어 표시됩니다.각각의 업데이트 시 object의 두 버전을 다음 조건에 따라 비교하여 Vector Clock을 확장합니다.
Siblings
Siblings는 Rik이 저장된 Object의 정규 버전을 해결할 수 없을 때 생성됩니다.bucket's properties의'allow mult'에'진짜'가 설정되어 있으면 다음 세 가지 상황에 따라 단일 Object에서siblings가 생성됩니다.
# allow_mult を true に設定した bucket を作成します
$ curl -v -XPUT -H "Content-Type: application/json" -d '{"props":{"allow_mult":true}}' http://127.0.0.1:8098/riak/kitchen
> PUT /riak/kitchen HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: 127.0.0.1:8098
> Accept: */*
> Content-Type: application/json
> Content-Length: 29
>
< HTTP/1.1 204 No Content
< Vary: Accept-Encoding
< Server: MochiWeb/1.1 WebMachine/1.10.0 (never breaks eye contact)
< Date: Thu, 04 Jul 2013 09:44:11 GMT
< Content-Type: application/json
< Content-Length: 0
<
# object を作成します
$ curl -v -X POST -H "Content-Type: application/json" -d '{"dishes":11}' http://127.0.0.1:8098/riak/kitchen/sink?returnbody=true
> POST /riak/kitchen/sink?returnbody=true HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: 127.0.0.1:8098
> Accept: */*
> Content-Type: application/json
> Content-Length: 13
>
< HTTP/1.1 200 OK
< X-Riak-Vclock: a85hYGBgzGDKBVIc1ze/yQg8qH40gymRMY+VgfGA52m+LAA=
< Vary: Accept-Encoding
< Server: MochiWeb/1.1 WebMachine/1.10.0 (never breaks eye contact)
< Link: </riak/kitchen>; rel="up"
< Last-Modified: Thu, 04 Jul 2013 09:44:33 GMT
< ETag: "6FTuzD45wjEgvNOpKMlT8w"
< Date: Thu, 04 Jul 2013 09:44:33 GMT
< Content-Type: application/json
< Content-Length: 13
<
* Connection #0 to host 127.0.0.1 left intact
* Closing connection #0
{"dishes":11}
# Vector Clock を指定せずに object を更新することで sibling を作成します
$ curl -v -XPUT -H "Content-Type: application/json" -d '{"dishes":9}' http://127.0.0.1:8098/riak/kitchen/sink?returnbody=true
> PUT /riak/kitchen/sink?returnbody=true HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: 127.0.0.1:8098
> Accept: */*
> Content-Type: application/json
> Content-Length: 12
>
< HTTP/1.1 300 Multiple Choices
< X-Riak-Vclock: a85hYGBgzGDKBVIc1ze/yQg8qH40gymRKY+VQeCA52m+LAA=
< Vary: Accept-Encoding
< Server: MochiWeb/1.1 WebMachine/1.10.0 (never breaks eye contact)
< Last-Modified: Thu, 04 Jul 2013 09:44:48 GMT
< ETag: "5nhfALuggOCcAHlLH60m6B"
< Date: Thu, 04 Jul 2013 09:44:48 GMT
< Content-Type: multipart/mixed; boundary=EJcMmbfshYJ04SJH7YVgfdjE2h9
< Content-Length: 412
<
--EJcMmbfshYJ04SJH7YVgfdjE2h9
Content-Type: application/json
Link: </riak/kitchen>; rel="up"
Etag: 3gMc93QhPKRSRtuLwcGeBz
Last-Modified: Thu, 04 Jul 2013 09:44:48 GMT
{"dishes":9}
--EJcMmbfshYJ04SJH7YVgfdjE2h9
Content-Type: application/json
Link: </riak/kitchen>; rel="up"
Etag: 6FTuzD45wjEgvNOpKMlT8w
Last-Modified: Thu, 04 Jul 2013 09:44:33 GMT
{"dishes":11}
--EJcMmbfshYJ04SJH7YVgfdjE2h9--
V-Tag이 점은 여러 개의 응답을 되돌릴 수 있다.sibling이 있는 Object를 얻으면 두 가지 선택을 할 수 있습니다.sibling 목록을 가져오는 방법을 기록합니다.이 응답의 형식은 같지만 출력 내용은 달라야 합니다.
# 全ての siblings の vtag リストを取得する
$ curl http://127.0.0.1:8098/riak/kitchen/sink
Siblings:
3gMc93QhPKRSRtuLwcGeBz
6FTuzD45wjEgvNOpKMlT8w
여러 개의values의 Object를 읽으면 "300Multiple Choice"의 응답과 모든sibling의 "vg"목록을 출력합니다."vtag"에서는 Object의 sibling을 볼 수 있습니다."Object의 URL에""vtag""매개 변수를 추가하여 지정된 sibling을 가져올 수 있습니다."# vtag=6FTuzD45wjEgvNOpKMlT8w の sibling を取得する
$ curl http://127.0.0.1:8098/riak/kitchen/sink?vtag=6FTuzD45wjEgvNOpKMlT8w
{"dishes":9}
"multiper/mixed"페이지의 앞머리 Accept를 사용하면 모든 siblings를 한 번의 요청으로 얻을 수 있습니다.# 全ての siblings を取得する
$ curl http://127.0.0.1:8098/riak/kitchen/sink -H "Accept: multipart/mixed"
--7id5AcJe2ChS6GptGQ2G6x59PcW
Content-Type: application/json
Link: </riak/kitchen>; rel="up"
Etag: 3gMc93QhPKRSRtuLwcGeBz
Last-Modified: Thu, 04 Jul 2013 09:44:48 GMT
{"dishes":9}
--7id5AcJe2ChS6GptGQ2G6x59PcW
Content-Type: application/json
Link: </riak/kitchen>; rel="up"
Etag: 6FTuzD45wjEgvNOpKMlT8w
Last-Modified: Thu, 04 Jul 2013 09:44:33 GMT
{"dishes":11}
--7id5AcJe2ChS6GptGQ2G6x59PcW--
Conflict Resolution"allow mult"를 진짜로 설정하면 conflict가 발생할 때 정확한value를 확인해야 합니다.응용 프로그램에서 사용자 conflicct의 Object를 자동으로 수정하거나 프롬프트합니다.릭으로 적절한 value로 업데이트하려면 최신 Vector Clock이 필요하죠."{'dishes': 11}"이 올바른value라고 가정하면 다음과 같이 업데이트됩니다.
# 最新の Vector Clock のために Object を読み込みます
$ curl -v http://127.0.0.1:8098/riak/kitchen/sink
> GET /riak/kitchen/sink HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: 127.0.0.1:8098
> Accept: */*
>
< HTTP/1.1 300 Multiple Choices
< X-Riak-Vclock: a85hYGBgzGDKBVIc1ze/yQg8qH40gymRKY+VQeCA52m+LAA=
< Vary: Accept, Accept-Encoding
< Server: MochiWeb/1.1 WebMachine/1.10.0 (never breaks eye contact)
< Last-Modified: Thu, 04 Jul 2013 09:44:48 GMT
< ETag: "5nhfALuggOCcAHlLH60m6B"
< Date: Thu, 04 Jul 2013 11:21:55 GMT
< Content-Type: text/plain
< Content-Length: 56
<
Siblings:
3gMc93QhPKRSRtuLwcGeBz
6FTuzD45wjEgvNOpKMlT8w
# Vector Clock を指定して正しい value に更新します
$ curl -v -XPUT -H "Content-Type: application/json" -d '{"dishes":11}' -H "X-Riak-Vclock: a85hYGBgzGDKBVIc1ze/yQg8qH40gymRKY+VQeCA52m+LAA=" http://127.0.0.1:8098/riak/kitchen/sink?returnbody=true
> PUT /riak/kitchen/sink?returnbody=true HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: 127.0.0.1:8098
> Accept: */*
> Content-Type: application/json
> X-Riak-Vclock: a85hYGBgzGDKBVIc1ze/yQg8qH40gymRKY+VQeCA52m+LAA=
> Content-Length: 13
>
< HTTP/1.1 200 OK
< X-Riak-Vclock: a85hYGBgzGDKBVIc1ze/yQg8qH40gymROY+VoeK652m+LAA=
< Vary: Accept-Encoding
< Server: MochiWeb/1.1 WebMachine/1.10.0 (never breaks eye contact)
< Link: </riak/kitchen>; rel="up"
< Last-Modified: Thu, 04 Jul 2013 11:24:40 GMT
< ETag: "2FSsoEDUHPt67UbcjnNwBr"
< Date: Thu, 04 Jul 2013 11:24:40 GMT
< Content-Type: application/json
< Content-Length: 13
<
{"dishes":11}
Concurrent conflict resolutionconflicts를 자동으로 해결하려면 두 클라이언트가 동시에 해결하면 새로운 conflicts가 생길 수 있음을 주의해야 한다.To avoid a pathological divergence you should be sure to limit the number of reconciliations and fail once that limit has been exceeded.
Sibling Explosion
Sibling explosion occurs when an object rapidly collects siblings without being reconciled. 이것은 무수한 문제를 가져올 것이다.Having an enormous object in your node can cause reads of that object to crash the entire node. Other issues are increased cluster latency as the object is replicated and out of memory errors.
Vector Clock Explosion
sibling explosion 이외에 짧은 시간 내에 Object를 대량으로 업데이트하면 Vector Clock이 과도하게 성장합니다.Object에 대한 대량 업데이트는 권장되지 않습니다.Vector Clock의 과도한 증가를 방지하기 위해 Vector Clock의 삽입 레벨을 조정할 수 있습니다.
How does last_write_wins affect resolution?
'allow mult'을'가짜'로 설정하는 것과'last write wins'를'진짜'로 설정하는 것은 같은 행동으로 보이지만 미묘한 차이가 있다.
두 가지 설정이 하나의value를 클라이언트에게 되돌려주더라도, "allow mult=가짜"는 Vector Clock으로 해결되지만, "last write wins=진짜"는 시간stamp을 읽어서 최신 버전을 정합니다.시스템 내부에서'allow mult=가짜'는 동시 쓰기나 네트워크 분할을 통해siblings가 존재할 수 있지만'last write wins=true'는 다음 시간stamp의value만 덮어씁니다.
만약 당신이 sibling의 제작을 좋아하지 않는다면, "allow mult=가짜"는 당신에게 최신value를 얻게 하고, 네트워크를 분할할 때도 우아하게 처리할 것입니다.그러나 키스나 새value를 자주 다시 쓰거나 구value에 의존하지 않는 상황에서'last write wins=true'는 더 좋은 성능을 제공합니다."last write wins=true"를 사용하려고 할 수도 있습니다. 세션 저장소와 업데이트가 없고 삽입만 하는 경우입니다.
주의: 버킷의properties에서 "allow mult=진짜"와 "last write wins=진짜"를 사용합니다. 정의되지 않은 행위이기 때문에 사용할 수 없습니다.
Vector Clock Pruning
Rik은 Bucket당 설정할 수 있는 4개 매개변수에 따라 Vector Clock을 주기적으로 차단하여 과도한 증가를 방지합니다.
"young vclock"및 "old vclock"매개 변수는 각 Vector Clock에 저장된 timestamp을 참조합니다.목록의 길이가 "smal vclock"과 "big vclock"사이에 있으면 timestamp을 확인하십시오.timestamp이 "young vclock"보다 젊으면 끊을 수 없습니다.timestamp이 "old vclock"보다 오래되면 잘립니다.
Client vs Vnode Vector Clocks
Riak 1.0 이전 버전에서는 모든 PUT 요청이 클라이언트 ID와 함께 게시되어야 합니다.The jobs of coordinating a put request and incrementing the associated vector clock were handled by the vnode which received the request. 클라이언트 ID가 게시되지 않은 경우 임의로 생성된 클라이언트 ID를 사용하여 Vector Clock을 증가시킵니다.This resulted in potentially unbounded vector clock growth with poorly-behaved clients.
Riak 1.0에서 Vector Clock은 vnodes를 통해 내부 카운터와 식별자를 직접 관리합니다.이렇게 하면 Vector Clock의 증가는 억제되지만 쓰기가 지연됩니다.
More Information
Vector Clock에 대한 정보:
기본적으로 Vector Clock을 사용하는 것이 좋지만 로그만 저장하는 데 사용한다면'last write wins = 진짜'로 고속화를 실현하는 것도 좋다.
Reference
이 문제에 관하여(Riak doc의 Vector Clocks를 의역해 봤습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/na_ga/items/db6d7381f382e8cd714a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)