2013-04-18 65 views
20

Tôi đang làm việc trên cơ sở dữ liệu được phân phối. Tôi đang cố gắng tạo một ID duy nhất sẽ đóng vai trò là khóa chính của gia đình cột trong .Cassandra: Tạo một ID duy nhất?

Tôi đọc một số bài viết về cách thực hiện điều này với Java bằng cách sử dụng UUID nhưng có vẻ như có khả năng xảy ra xung đột (ngay cả khi nó rất thấp).

Tôi tự hỏi liệu có cách nào để tạo ID duy nhất dựa trên thời gian có thể không?

Trả lời

23

Bạn có thể sử dụng loại TimeUUID ở Cassandra, mặt sau là Loại 1 UUID. Điều này sử dụng thời gian hiện tại và địa chỉ MAC của người tạo và số thứ tự. Nếu số TimeUUID được tạo chính xác, điều này có thể được thực hiện với không va chạm (bạn có thể sử dụng CQL now()method hoặc chèn của riêng bạn, java SDK cung cấp một số triển khai an toàn thread). Ưu điểm chính của TimeUUIDs là các ID có thể được đặt hàng theo thời gian. Xem http://wiki.apache.org/cassandra/TimeBaseUUIDNotes để biết thêm thông tin.

Tuy nhiên, việc sắp xếp thời gian có vẻ không hữu ích đối với các khóa chính hàng, vì thứ tự là vô ích khi sử dụng trình phân đoạn băm, mặc dù có thể sử dụng clustering key. Và sự phức tạp của việc tạo ra một ID duy nhất có thể là một nguồn gốc của các lỗi nếu bạn tự mình cuộn. Cassandra cũng hỗ trợ Loại 4 UUIDs bằng cách sử dụng loại UUID. Đây chỉ là những bit ngẫu nhiên. Có xác suất va chạm, nhưng xác suất va chạm (giả sử các nguồn số ngẫu nhiên không tương quan, mà nó sẽ là nếu bạn tạo ra trong Java) là cực kỳ thấp - nếu bạn tạo 1 tỷ giây trong 100 năm xác suất của một va chạm là khoảng 50% . (Xem http://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates để biết thêm chi tiết.)

+0

Cảm ơn bạn đã trả lời. Nếu tôi sử dụng loại UUID loại 1, ví dụ: TẠO TABLE dòng thời gian (thoát uuid, PRIMARY KEY (thoát)) Tôi làm cách nào để tạo lối thoát và Chèn nó vào CF? (Tôi đọc về một phương pháp gọi là now() trong Cassandra nhưng tôi không biết cách sử dụng nó) – user2090879

+2

Bạn nên sử dụng kiểu timeuuid nếu bạn đang sử dụng loại UUID loại 1. Điều này sẽ hoạt động: TẠO TABLE dòng thời gian (thoát timeuuid, PRIMARY KEY (thoát)); chèn vào các giá trị dòng thời gian (thoát) (bây giờ()); – Richard

+0

Tôi gặp lỗi này: thiếu EOF tại ')'. nó giống như nó không nhận ra phương thức ngay bây giờ(). ps: Tôi đang sử dụng Cassandra 1.2.0 – user2090879

2

Bạn nên điều tra bằng cách sử dụng Twitter Snowflake. Từ dự án readme:

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.

Bông tuyết sử dụng thuật toán trực quan tạo ra thời gian dài vừa được đặt hàng và độc đáo. Vì cơ sở dữ liệu của bạn được phân phối, dịch vụ này phải phù hợp với nhu cầu của bạn.

+0

cảm ơn bạn rất nhiều! – user2090879

5

Như đã nói bởi Richard, bạn có thể sử dụng TimeUUID và tạo giá trị TimeUUID không phải là vấn đề lớn. Chỉ cần theo dõi câu hỏi thường gặp của cassandra timeuuid.

+0

cảm ơn sự giúp đỡ :) – user2090879

2

Bạn cần sử dụng chức năng cassandra now() để tạo timeuuid và sử dụng chức năng uuid() để tạo chuỗi loại uuid.