2013-04-18 6 views
20

저는 분산 데이터베이스에서 일하고 있습니다. 난 열 패밀리 기본 키에서 역할을하는 고유 한 ID를 생성하려고합니다.카산드라 : 고유 ID를 생성 하시겠습니까?

UUID을 사용하여 Java로이 작업을 수행하는 방법에 대한 기사를 읽었지만 충돌 가능성이 있습니다 (매우 낮더라도).

시간에 따라 고유 ID를 생성하는 방법이 있는지 궁금합니다.

답변

23

유형 1 UUID을 나타내는 Cassandra에서 TimeUUID 유형을 사용할 수 있습니다. 현재 시간과 생성자의 MAC 주소 및 시퀀스 번호를 사용합니다. TimeUUID 번호가 올바르게 생성되면 0 충돌로 수행 할 수 있습니다 (CQL now()method을 사용하거나 직접 삽입 할 수 있습니다. Java SDK는 스레드 안전 구현을 제공합니다). TimeUUIDs의 가장 큰 장점은 ID를 시간 순서대로 지정할 수 있다는 점입니다. 자세한 내용은 http://wiki.apache.org/cassandra/TimeBaseUUIDNotes을 참조하십시오.

그러나 해시 분할자를 사용할 때 순서가 유용하지는 않지만 clustering key을 사용하더라도 순서 기본 키는 행 기본 키에 유용하지 않을 수 있습니다. 또한 고유 ID를 생성하는 복잡성으로 인해 고유 ID를 생성하는 경우 버그가 발생할 수 있습니다. 카산드라는 UUID 유형을 사용하여 유형 4UUID도 지원합니다. 이들은 단지 임의의 비트입니다. 충돌 확률이 있지만 충돌 확률 (Java에서 생성하는 경우 상관없는 무작위 수 소스를 가정 할 때)은 매우 낮습니다. 100 년 동안 초당 10 억을 작성하면 충돌 가능성은 약 50 %입니다. . (자세한 내용은 http://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates을 참조하십시오.)

+0

답장을 보내 주셔서 감사합니다. 유형 1 UUID를 사용하는 경우 예 : CREATE TABLE 타임 라인 (제거 UUID, PRIMARY KEY (제거)) 어떻게 제거하고 CF에 삽입합니까? (카산드라에서 now()라는 메소드에 대해 읽었지 만 사용법은 모르겠다.) – user2090879

+2

타입 1 UUID를 사용한다면 timeuuid 타입을 사용해야한다. 이것은 작동해야합니다 : CREATE TABLE timeline (rid timeuuid, PRIMARY KEY (rid)); 타임 라인 (제거) 값에 삽입 (now()); – Richard

+0

이 오류가 있습니다 : ')'에 EOF가 없습니다. 메소드()를 인식하지 못하는 것 같습니다. 추신 : 나는 Cassandra 1.2.0을 사용하고있다. – user2090879

2

Twitter Snowflake을 사용하여 조사해야합니다. 프로젝트 추가 정보에서 :

As we at Twitter move away from Mysql towards Cassandra, we've needed a new way to generate id numbers. There is no sequential id generation facility in Cassandra, nor should there be.

Snowflake는 시간 순서가 지정되고 고유 한 long을 생성하는 직관적 인 알고리즘을 사용합니다. 데이터베이스가 배포되므로이 서비스는 사용자의 요구에 잘 맞아야합니다.

+0

정말 고마워요! – user2090879

5

Richard가 말한 것처럼 TimeUUID를 사용할 수 있으며 TimeUUID 값을 생성하는 것은 큰 문제가 아닙니다. 그냥 cassandra FAQ timeuuid을 따르십시오.

+0

도움을 주셔서 감사합니다 :) – user2090879

2

timeuuid를 생성하고 uuid() 함수를 사용하여 uuid 유형 문자열을 생성하려면 cassandra 함수 now()을 사용해야합니다.

관련 문제