Riak doc의 Vector Clocks를 의역해 봤습니다.

12007 단어 riak
Vector Clocks
대략적인 의역은 번역하기 어려운 곳은 영어로 옮겨 싣는다.
http://docs.basho.com/riak/1.3.2/references/appendices/concepts/Vector-Clocks/
Overview
어느 노드든지 모든 요청을 받아들일 수 있습니다. 모든 노드가 모든 요청에 참여해야 하는 것은 아닙니다. 이것은values의 버전이 최신 버전인지 거슬러 올라가는 방법이 필요합니다.Vector Clock은 이 작업에 유용합니다.
새 value가 Rik에 저장되면 첫 번째 버전이 Vector Clock으로 설정되어 표시됩니다.각각의 업데이트 시 object의 두 버전을 다음 조건에 따라 비교하여 Vector Clock을 확장합니다.
  • 대상이 또 다른 직접적인 자손인지 여부
  • 대상이 공동부모의 자손인지 여부
  • Whether the objects are unrelated in recent heritage.
  • 이 표지를 사용하면 릭은 동기화되지 않은 데이터를 자동으로 복구하거나 프로그램이 지정한 방식으로 클라이언트를 수정할 수 있는 기회를 제공할 것입니다.
    Siblings
    Siblings는 Rik이 저장된 Object의 정규 버전을 해결할 수 없을 때 생성됩니다.bucket's properties의'allow mult'에'진짜'가 설정되어 있으면 다음 세 가지 상황에 따라 단일 Object에서siblings가 생성됩니다.
  • 동시 쓰기: 고객이 동시에 생성한 두 개의 쓰기가 같은 Vector Clock을 가지고 있으면 Rick은 저장된 Object를 결정할 수 없으며 Object에 두 개의 sibling을 줄 것입니다.이 기록은 같은 노드나 다른 노드에서 발생할 수 있습니다.
  • 이전 Vector Clock: 일부 클라이언트는 이전 Vector Clock을 사용하여 쓸 수 있습니다.클라이언트가 쓰기 전에 객체 object의 최신 Vector Clock을 읽는 스키마입니다.읽기 쓰기 주기 동안 서로 다른 클라이언트 쓰기가 발생할 수 있습니다.이전 Vector Clock으로 쓰기를 수행하면 sibling이 생성됩니다.오래된 Vector Clock으로 습관적으로 쓰기를 하면, 끊임없이 sibling을 생성합니다.
  • Missing Vector Clock: 존재하는 Object에서 Vector Clock을 지정하지 않고 쓰는 경우가 있습니다.이것은 클라이언트의 'X-Rikk-Vclock' 을 사용하여 페이지의 끝을 지정하는 것을 잊어버릴 때 발생하는 것입니다. 예를 들어'curl '입니다.
  • Riak uses siblings because it is impossible to order events with respect to time in a distributed system, this means they must be ordered causally. "allow mult"이 사실인 경우 Rick은 발생하는 conflict를 해결하지 않습니다.발생한 sibling 중 하나를 선택하거나 다른 Object로 교체해야 합니다.
    # 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 resolution
    conflicts를 자동으로 해결하려면 두 클라이언트가 동시에 해결하면 새로운 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을 주기적으로 차단하여 과도한 증가를 방지합니다.
  • small_vclock
  • big_vclock
  • young_vclock
  • old_vclock
  • "smal vclock"및 "big vclock"매개 변수는 Vector Clock 목록의 길이와 관련됩니다.목록의 길이가 "smal vclock"보다 작으면 잘릴 수 없습니다.목록의 길이가 "big 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 Clocks on Wikipedia
  • Why Vector Clocks are Easy
  • Why Vector Clocks are Hard
  • The vector clocks used in Riak are based on the work of Leslie Lamport .
  • End
    기본적으로 Vector Clock을 사용하는 것이 좋지만 로그만 저장하는 데 사용한다면'last write wins = 진짜'로 고속화를 실현하는 것도 좋다.

    좋은 웹페이지 즐겨찾기