Aarkam / Aarkam Wiki / Installation / Rokka.StorageNode & Kdouja Engine Setup
Data Plane Installation

Rokka.StorageNode & Kdouja Engine Setup

Setting up raw data nodes, attaching NVMe block devices, and tuning Direct I/O segment storage.

Last updated: Sep 23, 2026

Rokka.StorageNode is the high-performance data daemon that executes on every storage host in the cluster. It embeds the Kdouja LSM Engine, receiving streaming chunk uploads over gRPC and writing them to raw NVMe disk segments via unbuffered Direct I/O.


1. Physical Disk Preparation

Every physical storage host must designate dedicated raw NVMe or enterprise SSD partitions for Kdouja segment storage:

# Identify NVMe block devices
lsblk -d -o NAME,SIZE,MODEL,ROTA

# Create dedicated mount point
sudo mkdir -p /mnt/aarkam/data01

# Format partition with 4KB sector alignment
sudo mkfs.ext4 -F -b 4096 /dev/nvme0n1p1

# Add persistent mount in /etc/fstab with noatime option
echo '/dev/nvme0n1p1 /mnt/aarkam/data01 ext4 defaults,noatime,nodiratime 0 2' | sudo tee -a /etc/fstab
sudo mount -a

2. Configuration (appsettings.json)

Configure /opt/rokka-storagenode/appsettings.json:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information"
    }
  },
  "StorageNode": {
    "NodeId": "storage-node-01",
    "FailureDomain": "Rack-A1",
    "DataDirectory": "/mnt/aarkam/data01",
    "MaxStorageBytes": 10995116277760,
    "EnableDirectIo": true,
    "SegmentSizeMb": 256
  },
  "Kdouja": {
    "MemTableSizeMb": 64,
    "WalSyncMode": "DirectWriteThrough",
    "CompactionThreads": 4
  },
  "Kestrel": {
    "Endpoints": {
      "gRPC-Http": {
        "Url": "http://0.0.0.0:7775",
        "Protocols": "Http2"
      },
      "gRPC-Https": {
        "Url": "https://0.0.0.0:57775",
        "Protocols": "Http2",
        "Certificate": {
          "Path": "/etc/ssl/certs/rokka-storage.pfx",
          "Password": "CertPasswordHere"
        }
      }
    }
  }
}

3. Systemd Service Setup

Create /etc/systemd/system/rokka-storagenode.service:

[Unit]
Description=Rokka Storage Node Daemon (Embedded Kdouja LSM)
After=network.target local-fs.target

[Service]
WorkingDirectory=/opt/rokka-storagenode
ExecStart=/usr/bin/dotnet /opt/rokka-storagenode/Rokka.StorageNode.dll
Restart=always
RestartSec=5
KillSignal=SIGINT
SyslogIdentifier=rokka-storagenode
User=rokka

# Storage Direct I/O Permissions
LimitNOFILE=1048576
LimitMEMLOCK=infinity

[Install]
WantedBy=multi-user.target

Start the storage service:

sudo systemctl daemon-reload
sudo systemctl enable --now rokka-storagenode

4. Registering the Node into the Hash Ring

Once the daemon is online, register the node into the active cluster topology using the am CLI:

# Register storage node with failure domain
am node add storage-node-01 \
    --address "https://192.168.1.21:57775" \
    --rack "Rack-A1" \
    --capacity 10TB

# Verify the node appears in the cluster ring
am node list