2013-04-07 32 views
13

Gần đây tôi đã bắt đầu làm việc với cơ sở dữ liệu Cassandra. Tôi đã cài đặt single node cluster trong hộp địa phương của tôi. Và tôi đang làm việc với Cassandra 1.2.3.commitLog và SSTables trong cơ sở dữ liệu Cassandra

Tôi đã đọc bài viết trên internet và tôi thấy điều này line-

Cassandra viết đầu tiên được ghi vào một cam kết log (cho độ bền), và sau đó đến một cấu trúc bảng trong bộ nhớ gọi là memtable. Viết là thành công khi nó được ghi vào nhật ký cam kết và bộ nhớ, do đó, là I/O đĩa rất tối thiểu tại thời điểm ghi. Các mẩu tin được sắp xếp theo khối trong bộ nhớ và định kỳ được ghi vào đĩa thành một bảng liên tục. Cấu trúc được gọi là SSTable (bảng chuỗi được sắp xếp).

Vì vậy, để hiểu các dòng trên, tôi đã viết một chương trình đơn giản sẽ ghi vào cơ sở dữ liệu Cassandra sử dụng Pelops client. Và tôi đã có thể chèn dữ liệu vào cơ sở dữ liệu Cassandra.

Và bây giờ tôi đang cố gắng xem dữ liệu của mình được viết như thế nào vào commit log và nơi mà commit log file là? Và cũng làm thế nào SSTables được tạo ra và nơi tôi có thể tìm thấy rằng cũng như trong hộp địa phương của tôi và những gì nó cũng chứa.

Tôi muốn xem hai tệp này để tôi có thể hiểu thêm về cách Cassandra hoạt động sau hậu trường.

Trong file cassandra.yaml tôi, tôi có một cái gì đó như thế này

# directories where Cassandra should store data on disk. 
data_file_directories: 
    - S:\Apache Cassandra\apache-cassandra-1.2.3\storage\data 

# commit log 
commitlog_directory: S:\Apache Cassandra\apache-cassandra-1.2.3\storage\commitlog 

# saved caches 
saved_caches_directory: S:\Apache Cassandra\apache-cassandra-1.2.3\storage\savedcaches 

Nhưng khi tôi mở commitLog, trước hết là nó có rất nhiều dữ liệu để notepad ++ của tôi là không thể mở nó đúng cách và nếu nó được mở ra, tôi không thể nhìn thấy đúng vì một số mã hóa hoặc những gì. Và trong thư mục dữ liệu của tôi, tôi không thể tìm ra bất cứ điều gì?

Ý nghĩa thư mục này trống cho ME

S:\Apache Cassandra\apache-cassandra-1.2.3\storage\data\my_keyspace\users 

Có điều gì tôi đang thiếu ở đây? Ai có thể giải thích cho tôi làm thế nào để đọc các tập tin commitLog và SSTables và nơi tôi có thể tìm thấy hai tập tin này? Và cũng chính xác những gì xảy ra đằng sau hậu trường bất cứ khi nào tôi viết thư cho cơ sở dữ liệu Cassandra.

Cập nhật: -

Mã Tôi đang sử dụng để chèn vào Cassandra Database-

public class MyPelops { 

    private static final Logger log = Logger.getLogger(MyPelops.class); 

    public static void main(String[] args) throws Exception { 


     // ------------------------------------------------------------- 
     // -- Nodes, Pool, Keyspace, Column Family --------------------- 
     // ------------------------------------------------------------- 

     // A comma separated List of Nodes 
     String NODES = "localhost"; 

     // Thrift Connection Pool 
     String THRIFT_CONNECTION_POOL = "Test Cluster"; 

     // Keyspace 
     String KEYSPACE = "my_keyspace"; 

     // Column Family 
     String COLUMN_FAMILY = "users"; 

     // ------------------------------------------------------------- 
     // -- Cluster -------------------------------------------------- 
     // ------------------------------------------------------------- 

     Cluster cluster = new Cluster(NODES, 9160); 

     Pelops.addPool(THRIFT_CONNECTION_POOL, cluster, KEYSPACE); 

     // ------------------------------------------------------------- 
     // -- Mutator -------------------------------------------------- 
     // ------------------------------------------------------------- 

     Mutator mutator = Pelops.createMutator(THRIFT_CONNECTION_POOL); 

     log.info("- Write Column -"); 

     mutator.writeColumn(
       COLUMN_FAMILY, 
       "Row1", 
       new Column().setName(" Name ".getBytes()).setValue(" Test One ".getBytes()).setTimestamp(new Date().getTime())); 

     mutator.writeColumn(
       COLUMN_FAMILY, 
       "Row1", 
       new Column().setName(" Work ".getBytes()).setValue(" Engineer ".getBytes()).setTimestamp(new Date().getTime())); 

     log.info("- Execute -"); 
     mutator.execute(ConsistencyLevel.ONE); 

     // ------------------------------------------------------------- 
     // -- Selector ------------------------------------------------- 
     // ------------------------------------------------------------- 

     Selector selector = Pelops.createSelector(THRIFT_CONNECTION_POOL); 

     int columnCount = selector.getColumnCount(COLUMN_FAMILY, "Row1", 
       ConsistencyLevel.ONE); 
     System.out.println("- Column Count = " + columnCount); 

     List<Column> columnList = selector 
       .getColumnsFromRow(COLUMN_FAMILY, "Row1", 
         Selector.newColumnsPredicateAll(true, 10), 
         ConsistencyLevel.ONE); 
     System.out.println("- Size of Column List = " + columnList.size()); 

     for (Column column : columnList) { 
      System.out.println("- Column: (" + new String(column.getName()) + "," 
        + new String(column.getValue()) + ")"); 
     } 

     System.out.println("- All Done. Exit -"); 
     System.exit(0); 
    } 

} 

Keyspace và Cột gia đình mà tôi có created-

create keyspace my_keyspace with placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy' and strategy_options = {replication_factor:1}; 
use my_keyspace; 
create column family users with column_type = 'Standard' and comparator = 'UTF8Type'; 

Trả lời

34

Bạn đang ở gần đó trong sự hiểu biết của bạn. Tuy nhiên, thiếu một số chi tiết phút.

Vì vậy, giải thích mọi thứ theo một cách có cấu trúc, chu kỳ cassandra ghi cuộc sống hoạt động được chia thành các bước sau

  • commitlog viết
  • memtable ghi
  • sstable ghi

Cassandra viết là đầu tiên được ghi vào nhật ký cam kết (cho độ bền), và sau đó đến cấu trúc bảng trong bộ nhớ được gọi là memtable. Một ghi được cho là thành công khi nó được ghi vào nhật ký cam kết và bộ nhớ, vì vậy có rất ít đĩa I/O vào thời điểm viết. Khi bao giờ memtable hết dung lượng, tức là khi số lượng vượt quá giới hạn nhất định (128 là mặc định) hoặc khi nó đạt đến khoảng thời gian (cụm đồng hồ), nó được lưu trữ vào không gian không ổn định, không thay đổi (Cơ chế này được gọi là Flushing). Sau khi ghi được thực hiện trên SSTable, sau đó bạn có thể xem các dữ liệu tương ứng trong thư mục dữ liệu, trong trường hợp của bạn là S:\Apache Cassandra\apache-cassandra-1.2.3\storage\data. Mỗi SSTable soạn chủ yếu là 2 tác phẩm - tập tin Index và dữ liệu tập tin

  • tập tin Index chứa - lọc Bloom và Key-offset cặp

    • Bloom lọc: Một bộ lọc Bloom, là một không gian hiệu quả xác suất cấu trúc dữ liệu được sử dụng để kiểm tra xem một phần tử có phải là thành viên của một tập hợp hay không. Sai tích cực là có thể, nhưng âm tính giả thì không. Cassandra sử dụng bộ lọc nở để lưu IO khi thực hiện tra cứu khóa: mỗi SSTable có bộ lọc nở liên quan đến bộ lọc mà Cassandra kiểm tra trước khi thực hiện bất kỳ tìm kiếm đĩa nào, truy vấn các khóa không tồn tại gần như miễn phí
    • (Khóa, bù đắp) cặp (điểm vào tập tin dữ liệu)
  • tập tin dữ liệu chứa các dữ liệu cột thực tế

Và liên quan đến file commitlog, đây là những file đã được mã hóa duy trì bản chất của Cassandra, mà bạn không thể nhìn thấy bất cứ điều gì đúng.

UPDATE:

Memtable là một bộ nhớ cache trong bộ nhớ với nội dung được lưu trữ như là chìa khóa/cột (dữ liệu được sắp xếp theo key). Mỗi cột-gia đình có một Memtable riêng biệt và lấy dữ liệu cột từ khóa. Vì vậy, bây giờ tôi hy vọng bạn đang ở trong trạng thái rõ ràng của tâm trí để hiểu một thực tế, tại sao chúng ta không thể xác định vị trí chúng trong đĩa của chúng tôi.

Trong trường hợp của bạn, memtable của bạn không đầy đủ như ngưỡng có thể đọc được sẽ không được tẩy trắng nhưng không dẫn đến xả. Bạn có thể biết thêm về MemtableThresholds here mặc dù bạn không nên chạm vào Quay số đó.

SSTableStructure:

  • thư mục dữ liệu của bạn
    • KEYSPACE
      • CF
        • CompressionInfo.db
        • Data.db
        • Filter.db
        • Index.db
        • Statistics.db
        • snapshot // nếu chụp được lấy

Để biết thêm thông tin, hãy tham khảo sstable

+0

Cảm ơn rất nhiều vì đã giải thích chi tiết. Điều đó làm rõ phần lớn sự nghi ngờ của tôi nhưng lại gặp một số câu hỏi khác. :). Hy vọng bạn không nhớ trả lời những người là tốt. Thứ nhất, bạn đã đề cập nó đến một cấu trúc bảng trong bộ nhớ gọi là memtable'. Có bất kỳ vị trí nào của các cấu trúc bảng 'này mà tôi có thể thấy nó trông như thế nào không? Và nó chứa cái gì? Thứ hai, bạn đề cập đến nó được viết để ổn định chỉ khi memtable chạy ra khỏi không gian. Vì vậy, trong trường hợp của tôi, tôi không thể thấy ổn định được tạo ra bên trong thư mục dữ liệu. Tôi đã tạo 'người dùng' làm nhóm cột và tôi chèn hai hàng vào đó. – ferhan

+0

Tiếp tục, từ trên cao. Nó có thể là có thể memtable không phải là đầy đủ trong trường hợp của tôi khi tôi chèn hai hàng và đó là lý do tại sao nó không phải là flushed để SSTable phải không? Và tôi đã cập nhật câu hỏi của mình với mã mà tôi đang làm việc để chèn vào cơ sở dữ liệu Cassandra. Thứ ba, trong trường hợp của tôi, Nếu tôi cần phải nhìn thấy 'SSTable' và nó trông như thế nào và nó chứa gì? sau đó tôi cần phải chắc chắn 'memtable' là đầy đủ sau đó chỉ nó sẽ tuôn ra để SSTable phải và sau đó nó sẽ được tạo ra bên trong thư mục dữ liệu? Nếu có, làm thế nào tôi có thể chắc chắn rằng memtable đầy đủ từ chương trình của tôi? – ferhan

+0

@TechGeeky xem phần cập nhật – abhi

Các vấn đề liên quan