前端开发入门到精通的在线学习网站

网站首页 > 资源文章 正文

聊聊chronos的BackupDB(crosscheck backupset)

qiguaw 2024-09-02 20:20:27 资源文章 60 ℃ 0 评论

本文主要研究一下chronos的BackupDB



BackupDB

DDMQ/carrera-chronos/src/main/java/com/xiaojukeji/chronos/db/BackupDB.java

public class BackupDB {
 ?  private static final Logger LOGGER = LogUtils.BACKUP_RESTORE_LOGGER;
?
 ?  public static final String DB_PATH_BACKUP = ConfigManager.getConfig().getDbConfig().getDbPathBackup();
 ?  public static final String DB_PATH_RESTORE = ConfigManager.getConfig().getDbConfig().getDbPathRestore();
 ?  private static volatile boolean backuping = false;
 ?  private static volatile boolean restoring = false;
?
 ?  public static BackupState backup() {
 ? ? ?  if (backuping) {
 ? ? ? ? ?  LOGGER.info("is backuping, return");
 ? ? ? ? ?  return BackupState.BEING_BACKUP;
 ? ? ?  }
?
 ? ? ?  LOGGER.info("start backup");
 ? ? ?  backuping = true;
 ? ? ?  try (final BackupableDBOptions bopt = new BackupableDBOptions(DB_PATH_BACKUP);
 ? ? ? ? ? ? final BackupEngine be = BackupEngine.open(Env.getDefault(), bopt)) {
?
 ? ? ? ? ?  /**
 ? ? ? ? ? ? * Captures the state of the database in the latest backup
 ? ? ? ? ? ? *
 ? ? ? ? ? ? * @param db The database to backup
 ? ? ? ? ? ? * @param flushBeforeBackup When true, the Backup Engine will first issue a
 ? ? ? ? ? ? * ? ? ? ? ? ? ? ? ? ? ? ?  memtable flush and only then copy the DB files to
 ? ? ? ? ? ? * ? ? ? ? ? ? ? ? ? ? ? ?  the backup directory. Doing so will prevent log
 ? ? ? ? ? ? * ? ? ? ? ? ? ? ? ? ? ? ?  files from being copied to the backup directory
 ? ? ? ? ? ? * ? ? ? ? ? ? ? ? ? ? ? ?  (since flush will delete them).
 ? ? ? ? ? ? * ? ? ? ? ? ? ? ? ? ? ? ?  When false, the Backup Engine will not issue a
 ? ? ? ? ? ? * ? ? ? ? ? ? ? ? ? ? ? ?  flush before starting the backup. In that case,
 ? ? ? ? ? ? * ? ? ? ? ? ? ? ? ? ? ? ?  the backup will also include log files
 ? ? ? ? ? ? * ? ? ? ? ? ? ? ? ? ? ? ?  corresponding to live memtables. The backup will
 ? ? ? ? ? ? * ? ? ? ? ? ? ? ? ? ? ? ?  always be consistent with the current state of the
 ? ? ? ? ? ? * ? ? ? ? ? ? ? ? ? ? ? ?  database regardless of the flushBeforeBackup
 ? ? ? ? ? ? * ? ? ? ? ? ? ? ? ? ? ? ?  parameter.
 ? ? ? ? ? ? *
 ? ? ? ? ? ? * Note - This method is not thread safe
 ? ? ? ? ? ? *
 ? ? ? ? ? ? * @throws RocksDBException thrown if a new backup could not be created
 ? ? ? ? ? ? */
 ? ? ? ? ?  boolean flushBeforeBackup = false;
 ? ? ? ? ?  be.createNewBackup(RDB.DB, flushBeforeBackup);
?
 ? ? ? ? ?  List<BackupInfo> backupInfos = be.getBackupInfo();
 ? ? ? ? ?  for (int i = 0; i < backupInfos.size(); i++) {
 ? ? ? ? ? ? ?  LOGGER.info("backupInfo[{}}, backupId:{}, timestamp:{}, size:{}, numberFiles:{}", i, backupInfos.get(i).backupId(),
 ? ? ? ? ? ? ? ? ? ? ?  backupInfos.get(i).timestamp(), backupInfos.get(i).size(), backupInfos.get(i).numberFiles());
 ? ? ? ? ?  }
?
 ? ? ? ? ?  return BackupState.SUCCESS;
 ? ? ?  } catch (RocksDBException e) {
 ? ? ? ? ?  LOGGER.error("error while backup, path:{}, err:{}", DB_PATH_BACKUP, e.getMessage(), e);
 ? ? ? ? ?  return BackupState.FAIL;
 ? ? ?  } finally {
 ? ? ? ? ?  backuping = false;
 ? ? ? ? ?  LOGGER.info("end backup");
 ? ? ?  }
 ?  }
?
 ?  public static RestoreState restore() throws RocksDBException {
 ? ? ?  if (restoring) {
 ? ? ? ? ?  LOGGER.info("is restoring, return");
 ? ? ? ? ?  return RestoreState.BEING_RESTORE;
 ? ? ?  }
?
 ? ? ?  LOGGER.info("start restore");
 ? ? ?  restoring = true;
 ? ? ?  RocksDB restoreDB = null;
 ? ? ?  try (final BackupableDBOptions bopt = new BackupableDBOptions(DB_PATH_BACKUP);
 ? ? ? ? ? ? final BackupEngine be = BackupEngine.open(Env.getDefault(), bopt)) {
 ? ? ? ? ?  // restore db from first backup
?
 ? ? ? ? ?  /**
 ? ? ? ? ? ? * @param keepLogFiles If true, restore won't overwrite the existing log files
 ? ? ? ? ? ? * ? in wal_dir. It will also move all log files from archive directory to
 ? ? ? ? ? ? * ? wal_dir. Use this option in combination with
 ? ? ? ? ? ? * ? BackupableDBOptions::backup_log_files = false for persisting in-memory
 ? ? ? ? ? ? * ? databases.
 ? ? ? ? ? ? * ? Default: false
 ? ? ? ? ? ? */
 ? ? ? ? ?  boolean keepLogFiles = false;
 ? ? ? ? ?  be.restoreDbFromLatestBackup(DB_PATH_RESTORE, DB_PATH_RESTORE, new RestoreOptions(keepLogFiles));
 ? ? ? ? ?  // open database again.
 ? ? ? ? ?  restoreDB = RocksDB.open(OptionsConfig.DB_OPTIONS, DB_PATH_RESTORE, CFManager.CF_DESCRIPTORS, CFManager.CF_HANDLES);
?
 ? ? ? ? ?  int i = 0;
 ? ? ? ? ?  try (RocksIterator it = restoreDB.newIterator()) {
 ? ? ? ? ? ? ?  for (it.seekToFirst(); it.isValid(); it.next()) {
 ? ? ? ? ? ? ? ? ?  LOGGER.info("i:{}, key:{}, value:{}", i++, new String(it.key()), new String(it.value()));
 ? ? ? ? ? ? ? ? ?  if (i == 10) {
 ? ? ? ? ? ? ? ? ? ? ?  break;
 ? ? ? ? ? ? ? ? ?  }
 ? ? ? ? ? ? ?  }
 ? ? ? ? ?  }
?
 ? ? ? ? ?  return RestoreState.SUCCESS;
 ? ? ?  } catch (RocksDBException e) {
 ? ? ? ? ?  LOGGER.error("error while restore, path:{}, err:{}", DB_PATH_RESTORE, e.getMessage(), e);
 ? ? ? ? ?  return RestoreState.FAIL;
 ? ? ?  } finally {
 ? ? ? ? ?  if (restoreDB != null) {
 ? ? ? ? ? ? ?  restoreDB.close();
 ? ? ? ? ?  }
?
 ? ? ? ? ?  restoring = false;
 ? ? ? ? ?  LOGGER.info("end restore");
 ? ? ?  }
 ?  }
}
  • BackupDB提供了两个静态方法,分别是backup及restore;backup方法通过BackupEngine的createNewBackup来进行backup;restore方法通过BackupEngine的restoreDbFromLatestBackup来进行restore

BackupEngine

rocksdbjni-5.7.2-sources.jar!/org/rocksdb/BackupEngine.java

public class BackupEngine extends RocksObject implements AutoCloseable {
?
  protected BackupEngine(final long nativeHandle) {
 ?  super(nativeHandle);
  }
?
  public void createNewBackup(
 ? ?  final RocksDB db, final boolean flushBeforeBackup)
 ? ?  throws RocksDBException {
 ?  assert (isOwningHandle());
 ?  createNewBackup(nativeHandle_, db.nativeHandle_, flushBeforeBackup);
  }
?
  private native void createNewBackup(final long handle, final long dbHandle,
 ? ?  final boolean flushBeforeBackup) throws RocksDBException;
?
?
  public void restoreDbFromLatestBackup(
 ? ?  final String dbDir, final String walDir,
 ? ?  final RestoreOptions restoreOptions) throws RocksDBException {
 ?  assert (isOwningHandle());
 ?  restoreDbFromLatestBackup(nativeHandle_, dbDir, walDir,
 ? ? ?  restoreOptions.nativeHandle_);
  }
?
  private native void restoreDbFromLatestBackup(final long handle,
 ? ?  final String dbDir, final String walDir, final long restoreOptionsHandle)
 ? ?  throws RocksDBException;
?
  //......
}
  • createNewBackup方法接收RocksDB及flushBeforeBackup参数;restoreDbFromLatestBackup接收dbDir、walDir、restoreOptions参数

小结

BackupDB提供了两个静态方法,分别是backup及restore;backup方法通过BackupEngine的createNewBackup来进行backup;restore方法通过BackupEngine的restoreDbFromLatestBackup来进行restore

doc

  • carrera-chronos

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表