RocksDb
RocksDb Store
The RocksDb store implementation will persist the application state to a RocksDb database within the local filesystem.
To use it, ensure that the nstream.persist.store.rocksdb
module is available on the module path. Additionally, it
always requires the key-value adapter to be available on the module path.
Dependencies
Gradle
implementation 'io.nstream:nstream-persist-kernel:4.13.21'
implementation 'io.nstream:nstream-persist-kv:4.13.21'
implementation 'io.nstream:nstream-store-rocksdb:4.13.21'
implementation 'io.nstream:nstream-store-s3snapshot:4.13.21'
Maven
<dependency>
<groupId>io.nstream</groupId>
<artifactId>nstream-persist-kernel</artifactId>
<version>4.13.21</version>
<type>module</type> <!-- Remove or comment this line for non-modular projects -->
</dependency>
<dependency>
<groupId>io.nstream</groupId>
<artifactId>nstream-persist-kv</artifactId>
<version>4.13.21</version>
<type>module</type> <!-- Remove or comment this line for non-modular projects -->
</dependency>
<dependency>
<groupId>io.nstream</groupId>
<artifactId>nstream-store-rocksdb</artifactId>
<version>4.13.21</version>
<type>module</type> <!-- Remove or comment this line for non-modular projects -->
</dependency>
<dependency>
<groupId>io.nstream</groupId>
<artifactId>nstream-store-s3snapshot</artifactId>
<version>4.13.21</version>
<type>module</type> <!-- Remove or comment this line for non-modular projects -->
</dependency>
N.B. The dependency on nstream-store-s3snapshot
is only required if snapshotting is used.
Configuration
The RocksDB store is configured as follows:
storeName: @store {
implName: KeyValueAdapter
parameters: {
implName: RocksDB
parameters: {
path: "/path/to/db"
}
}
}
Here, /path/to/db
is the path in the local filesystem where the database files will be located.
Snapshots
By default, the RocksDB database storing the state is kept in the local file system only. However, it is also possible to periodically copy snapshots to a remote repository. When the application is restarted, if a copy of the database is not available locally, it can be restored from the most recent snapshot. Currently, the only supported remote repository is S3 (or any other object store that uses the S3 protocol. Snapshot support is configured as follows:
storeName: @store {
implName: KeyValueAdapter
parameters: {
implName: RocksDB
parameters: {
enableSnapshots: true
snapshotInterval: 120000
remoteSnapshotsRoot: "s3://bucket_name/snapshots/"
snapshotStoreConfig: {
# Parameters for the store implementation.
}
path: "/path/to/local/repository"
}
}
}
Setting enableSnapshots
to true
will cause the RocksDB tore to try to find a snapshotting implementation on the
module/classpath. The URI specified in remoteSnapshotsRoot
determines the location where the remote snapshots will
be stored and is used to select an appropriate snapshotting implementation if multiple are available.
The path
argument is used to specify where in the local filesystem the database should be stored. In contrast to the
case without snapshots, the store will expect there to be sub-directories called db
and checkpoints
under the path.
If they do not exist at startup, it will attempt to create them. On startup, if a snapshot exists in the remote
repository, the store will attempt to restore it to the db
directory. The checkpoints
directory is used to create
RocksDB checkpoints that are used to create the snapshots. By default, these checkpoints are deleted immediately after
the snapshot completes.
The snapshotInterval
parameter determines how frequently the snapshots are taken (in ms).
Configuration Options Table
The following additional parameters control how the store implementation uses RocksDB.
Parameter | Description |
---|---|
writeBufferSize |
Controls memory usage by write buffers and write-ahead log size. |
maxWalSize |
Maximum size of the write-ahead log on disk. |
smallDb |
Flag to enable optimizations for small databases in RocksDB. |
All of these directly determined parameters in RocksDB. For the details of what they do, consult the RocksDB documentation.
Additionally, when snapshots are enabled, the following additional parameters are available.
Parameter | Default | Description |
---|---|---|
initialRetryDelay |
0 | Initial time to wait (ms) before retrying a failed snapshot. |
maxRetry |
0 | Maximum number of retry attempts (delay doubles each time from the initial value). |
keepHistory |
0 | Number of RocksDB checkpoints to keep in the local filesystem. |
S3 Snapshots
The S3 snapshot implementation will be chosen for URIs of the form s3://bucket_name/path/to/snapshots/
where
bucket_name
is the name of the bucket to use and /path/to/snapshots
is used as the prefix for all objects in
the store. The S3 store is configured as follows:
snapshotStoreConfig: {
tag: "server1",
credentials: @basic {
accessKey: "ACCESS_KEY"
secretKey: "SECRET KEY"
}
region: "aws-global"
endpoint: "http://host:9000"
}
The tag
is an arbitrary string that is appended to the root path to distinguish snapshot repositories for different
servers within a single store. ACCESS_KEY
and SECRET_KEY
should be replaced with your credentials to connect. The
region
selects the appropriate S3 region to use (this is irrelevant for other S3 compatible stores).
The endpoint
parameter is optional. If it is not specified, AWS S3 will be assumed. Otherwise, the client will attempt
to connect to an S3 compatible store, hosted at the URL specified here.
Nstream is licensed under the Redis Source Available License 2.0 (RSALv2).