Tôi đã triển khai một dịch vụ hazelcast lưu trữ dữ liệu của nó vào các bản đồ mapdb cục bộ thông qua MapStoreFactory và newMapLoader. Bằng cách này, các phím có thể được nạp nếu một cụm khởi động lại là cần thiết:Hazelcast và MapDB - triển khai một cơ sở dữ liệu phân tán đơn giản
public class HCMapStore<V> implements MapStore<String, V> {
Map<String, V> map;
/** specify the mapdb e.g. via
* DBMaker.newFileDB(new File("mapdb")).closeOnJvmShutdown().make()
*/
public HCMapStore(DB db) {
this.db = db;
this.map = db.createHashMap("someMapName").<String, Object>makeOrGet();
}
// some other store methods are omitted
@Override
public void delete(String k) {
logger.info("delete, " + k);
map.remove(k);
db.commit();
}
// MapLoader methods
@Override
public V load(String key) {
logger.info("load, " + key);
return map.get(key);
}
@Override
public Set<String> loadAllKeys() {
logger.info("loadAllKeys");
return map.keySet();
}
@Override
public Map<String, V> loadAll(Collection<String> keys) {
logger.info("loadAll, " + keys);
Map<String, V> partialMap = new HashMap<>();
for (String k : keys) {
partialMap.put(k, map.get(k));
}
return partialMap;
}}
Vấn đề bây giờ tôi đang phải đối mặt là loadAllKeys phương pháp của giao diện MapLoader từ Hazelcast đòi hỏi trả lại toàn bộ chìa khóa của toàn bộ cụm NHƯNG mỗi cửa hàng nút CHỈ các đối tượng mà nó sở hữu.
Ví dụ: Tôi có hai nút và lưu trữ 8 đối tượng, sau đó ví dụ: 5 đối tượng được lưu trữ trong mapdb của node1 và 3 trong mapdb của node2. Đối tượng nào được sở hữu bởi nút nào do hazelcast quyết định. Bây giờ khi khởi động lại node1 sẽ trả về 5 khóa cho loadAllKeys và node2 sẽ trả về 3. Hazelcast quyết định bỏ qua 3 mục và dữ liệu bị 'mất'.
Điều gì có thể là một giải pháp tốt cho điều này?
Cập nhật cho tiền thưởng: Here Tôi hỏi này nằm trong danh sách hc gửi thư nhắc đến 2 lựa chọn (Tôi sẽ thêm 1 trở lên) và tôi muốn biết nếu có điều gì như thế này là đã có thể với Hazelcast 3.2 hoặc 3.3:
Hiện tại giao diện MapStore chỉ nhận dữ liệu hoặc cập nhật từ nút cục bộ. Có thể thông báo cho giao diện MapStore của mọi hành động lưu trữ của toàn cụm sao? Hoặc có lẽ điều này là có thể với một số phép thuật người nghe? Có lẽ tôi có thể buộc hazelcast đặt tất cả các đối tượng vào một phân vùng và có 1 bản sao trên mỗi nút.
Nếu tôi khởi động lại, ví dụ: 2 nút sau đó giao diện MapStore được gọi chính xác với cơ sở dữ liệu cục bộ của tôi cho node1 và sau đó cho node2. Nhưng khi cả hai nút tham gia dữ liệu của node2 sẽ bị xóa vì Hazelcast giả định rằng chỉ có nút chính mới có thể chính xác. Tôi có thể dạy cho hazelcast chấp nhận dữ liệu từ cả hai nút không?
Cảm ơn - các tùy chọn là ý tưởng hay, nhưng tôi muốn biết tôi sẽ làm điều gì đó như thế và nếu điều đó có thể xảy ra. – Karussell
Cũng thấy dự án của bạn :) https://github.com/jankotek/mapdb-hz-offheap – Karussell