原子刷新

如果将DB选项atomic_flush设置为true,则RocksDB支持多个列族的原子刷新。使用”全有或全无”保证(逻辑上)将刷新多个列族的执行结果写入清单。 使用原子刷新,感兴趣的列族的所有或没有memtable都会被持久化到SST文件中,并添加到数据库中。

如果多个列族中的数据必须彼此一致,这可能是可取的。例如,假设有一个元数据列族meta_cf和一个数据列族data_cf。 每次我们向data_cf写入一条新记录时,我们也将它的元数据写入meta_cf。meta_cf和data_cf必须被自动刷新。 如果其中一个持久化了,而另一个没有持久化,那么数据库就会变得不一致。原子刷新提供了很好的保证。 假设某一时刻,kv1存在于meta_cf的memtables中,kv2存在于data_cf的memtables中。 在原子刷新这两个列族之后,如果刷新成功,kv1和kv2都是持久性的。否则,它们在数据库中都不存在。

由于原子刷新也通过write_thread,因此可以保证在写批处理过程中不会发生刷新。

作为一个DB选项,启用/禁用原子刷新很容易。要打开启用了原子刷新的数据库,

  1. Options options;
  2. ... // Set other options
  3. options.atomic_flush = true;
  4. DBOptions db_opts(options);
  5. DB* db = nullptr;
  6. Status s = DB::Open(db_opts, dbname, column_families, &handles, &db);

目前,在手动刷新的情况下,用户负责指定要自动刷新的列族。

  1. w_opts.disable_wal = true;
  2. db->Put(w_opts, cf_handle1, key1, value1);
  3. db->Put(w_opts, cf_handle2, key2, value2);
  4. FlushOptions flush_opts;
  5. Status s = db->Flush(flush_opts, {cf_handle1, cf_handle2});

在RocksDB在内部触发自动刷新的情况下,为了简单起见,我们目前刷新数据库中的所有列族。