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';
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
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
@TechGeeky xem phần cập nhật – abhi