Skip to content

Tuning Voyager behavior

For the complete documentation index see: llms.txt

All documentation pages available in markdown.

A query gives up before it finishes. A scan slows down a cluster other people are using. A rate quota rejects your scans outright. A deleted record reappears after a restart. Each of those is something you change on the Policies page, one cluster at a time.

Voyager reaches your cluster through the same Aerospike client your application uses, so these settings are the standard client policies rather than a Voyager invention. Changing them here changes how Voyager behaves against that one connection, and leaves your application untouched.

Prerequisites

  • Aerospike Voyager 0.2.6 or later.
  • A saved, connected cluster. See Connecting to clusters.
  • The read quota behavior requires Aerospike Database Enterprise Edition with security and rate quotas enabled.

What do you want to change?

GoalSetting
Let a slow scan or query run longerQuery / scan > Total timeout
Stop a scan from loading a cluster other people are usingQuery / scan > Records per second
Run scans when a role read quota is rejecting themHow Voyager respects a read quota
Let a single-record read run longerRead > Total timeout
Retry a read that failed on a busy nodeRead > Max retries
Keep deleted records from reappearing after a cold restartWrite > Durable delete
Store the user key with records so reads return itWrite > Send key
Decide what happens when writing to a key that already existsWrite > Record exists action
Change how long Voyager waits when dialing a clusterConnect > Connection timeout
Read from same-rack nodesConnect > Rack aware

Settings that apply to Voyager as a whole, such as how many records a page shows or whether usage analytics are sent, live in Settings and preferences instead.

Open the Policies page

  1. Click the sliders icon at the bottom of the sidebar.

    Voyager opens a cluster overview listing every saved connection, with its server version, cluster size, connection status, and a count of policy areas.

  2. Click a cluster card.

    The page header reads Policies for followed by the cluster name. Cards for disconnected clusters are inactive, so connect the cluster first.

Policies overview listing a card for the enterprise-policies-test cluster, next to the sidebar with the Policies sliders icon highlighted Policies for enterprise-policies-test, with the Search policies box, the refresh icon, and the Read policy card showing Total timeout, Socket timeout, and Max retries above a collapsed Advanced options toggle

Two controls apply to the whole page:

  • Search policies filters by label, description, and field name across all five groups. Groups with no match are hidden, and matching advanced fields are revealed automatically.
  • The refresh icon, beside Last updated, refetches this connection’s saved values and re-reads your role quota from the cluster.
Searching for timeout filters the page to matching fields in every group and reveals the matching advanced fields, such as Timeout delay under Read policy

Each group shows its common fields first, with the rest behind an Advanced options toggle that reports how many fields it holds.

What each group applies to

GroupApplied toWhen a change takes effect
Read policySingle-record reads and batch readsNext operation
Write policyRecord writes and deletesNext operation
Query / scan policyScans and secondary-index queries in the data browserNext operation
Connect policyClient settings used when dialing the clusterNext time this connection reconnects
Info policyCluster info commandsNext time this connection reconnects

These are standard Aerospike client policies. Voyager has no policy system of its own: it talks to your cluster through the same Aerospike client your application uses, and this page is where you set that client’s policies per connection. Policies defines the command policies, and the Connection tuning guide defines the connection-pool and timeout parameters. In the following tables, a linked setting name points to its canonical definition, and the Effect column states what the setting changes about Voyager’s operations. A setting without a link has no canonical page of its own, so its Effect entry is the definition.

Read policy

Change these when individual record lookups time out, fail on a busy node, or need to come from a particular replica. Applied to single-record reads and batch reads.

SettingControlUnitDefaultValid valuesEffect
Total timeoutNumberms10000 to 3600000, 0 = no limitTotal time budget for the read command across all attempts.
Socket timeoutNumberms300000 to 3600000, 0 = no limitTime budget for a single attempt on the socket.
Max retriesNumbercount20 to 100How many retries Voyager makes before aborting. The initial attempt is not counted.

Read policy advanced options

SettingControlUnitDefaultValid valuesEffect
Send keySwitchn/aOffOn, OffSends the user key on reads. Rarely needed.
Replica policyDropdownn/aSequenceMaster, Master + replicas, Sequence, Prefer rack, RandomWhich node serves the read.
Read mode (AP)Toggle groupn/aOneOne, AllRead mode used in availability (AP) namespaces.
Read mode (SC)Dropdownn/aSessionSession, Linearize, Allow replica, Allow unavailableRead mode used in strong consistency (SC) namespaces.
Sleep between retriesNumberms10 to 3600000Delay inserted between retries. Ignored when Max retries is 0.
Use compressionSwitchn/aOffOn, OffCompresses command buffers. Enterprise Edition only.
Read touch TTL percentNumberpercent0-1 to 100Resets a record’s TTL on read when the remaining TTL is within this percent of the last write TTL. 0 uses the server default, and -1 never touches.
Exit fast on exhausted poolSwitchn/aOffOn, OffFails immediately instead of waiting when the connection pool is exhausted.
Timeout delayNumberms00 to 3600000, 0 = disabledDelay before background socket recovery starts after a read timeout.

The namespace’s server-side strong consistency configuration decides which read mode governs a read: a read in an availability namespace uses Read mode (AP), and a read in a strong consistency namespace uses Read mode (SC). Set both when your connections span both namespace types.

Write policy

Change these when you need deletes to survive a cold restart, want the user key stored with the record, or need to control what happens when a key already exists. Applied to record writes and deletes.

An Aerospike role can also carry a write rate quota. The server enforces it on every write and delete, and the Aerospike client offers no write rate control, so a Rate quota exceeded error on a write means the edit rate passed the role’s quota. Space out edits, or ask an administrator to raise the quota.

SettingControlUnitDefaultValid valuesEffect
Send keySwitchn/aOnOn, OffStores the user key alongside the record so it can be retrieved later.
Record exists actionDropdownn/aUpdateUpdate, Update only, Replace, Replace only, Create onlyBehavior when writing to a key that already exists.
Durable deleteSwitchn/aOffOn, OffWrites a tombstone for deleted records. Enterprise Edition only.
ExpirationNumberseconds00 to 4294967295Record TTL. 0 uses the namespace default, 4294967295 never expires, 4294967294 keeps the record’s existing TTL.
Total timeoutNumberms10000 to 3600000, 0 = no limitTotal time budget for the write command across all attempts.
Socket timeoutNumberms300000 to 3600000, 0 = no limitTime budget for a single attempt on the socket.
Max retriesNumbercount00 to 100How many retries Voyager makes before aborting. Writes default to 0 because they are not idempotent.

Write policy advanced options

SettingControlUnitDefaultValid valuesEffect
Generation policyDropdownn/aNoneNone, Expect generation equal, Expect generation greaterRestricts the write by record generation.
Commit levelToggle groupn/aAll replicasAll replicas, Master onlyConsistency guarantee required before the write is acknowledged.
Sleep between retriesNumberms10 to 3600000Delay inserted between retries. Ignored when Max retries is 0.
Use compressionSwitchn/aOffOn, OffCompresses command buffers. Enterprise Edition only.
Exit fast on exhausted poolSwitchn/aOffOn, OffFails immediately instead of waiting when the connection pool is exhausted.
Timeout delayNumberms00 to 3600000, 0 = disabledDelay before background socket recovery starts after a write timeout.

Query / scan policy

Change these when a scan is too slow, is loading a shared cluster too heavily, or is being rejected by a rate quota. Applied to scans and secondary-index queries when browsing records.

SettingControlUnitDefaultValid valuesEffect
Records per secondNumberrecords/sec per node00 to 100000000Throttles how many records each server node returns per second. 0 lets the server decide: no client limit, or your role’s read quota when one is set. See How Voyager respects a read quota.
Total timeoutNumberms00 to 3600000, 0 = no limitOverall deadline for a scan or query, including retries.

Query / scan policy advanced options

SettingControlUnitDefaultValid valuesEffect
Socket timeoutNumberms300000 to 3600000, 0 = no limitTime budget for a single attempt on the socket.
Max retriesNumbercount50 to 100How many retries Voyager makes before aborting the scan or query. The initial attempt is not counted.
Max concurrent nodesNumbercount00 to 10000, 0 = all nodesHow many server nodes are queried in parallel. Lower this to spread a large scan over time.
Expected durationDropdownn/aLongLong, Short, Long (relax AP)Tells the server how long the query is expected to run so it can schedule resources.

Connect policy

Client settings applied when dialing the cluster. Changes take effect the next time this connection reconnects.

These fields are the defaults Voyager dials with. An individual connection carries its own Timeout and Login timeout fields in the connection dialog, which override these defaults and accept a wider range. The Aerospike client itself sets no upper bound on either value. The ranges in the following table are what this page accepts.

SettingControlUnitDefaultValid valuesEffect
Connection timeoutNumberseconds301 to 3600Time allowed for the initial connection. A timeout set on an individual connection overrides this default.
Use services alternateSwitchn/aOffOn, OffUses the services-alternate addresses advertised during cluster tend, for cloud and Kubernetes deployments. A value set on the connection itself overrides this default.

Connect policy advanced options

SettingControlUnitDefaultValid valuesEffect
Login timeoutNumberseconds100 to 3600, 0 = client defaultTime allowed for external (LDAP) login. A value set on the connection overrides this default.
Cluster nameTextn/aemptyAny cluster IDExpected cluster ID. Nodes must report this name to join the client’s view of the cluster. Leave blank to skip the check.
Idle timeoutNumberseconds00 to 3600, 0 = client defaultCloses and discards a connection after this much idle time. On a cluster that sets proto-fd-idle-ms, set this a few seconds lower than that value so Voyager discards idle connections before the server reaps them. Server 8.1 and later deprecate proto-fd-idle-ms.
Tend intervalNumberms100010 to 3600000How often the client polls the cluster for state changes.
Config intervalNumberseconds50 to 3600How often the client checks for configuration changes.
Connection queue sizeNumbercount1001 to 100000Size of the per-node connection queue cache.
Min connections per nodeNumbercount00 to 100000Connections preallocated to each node.
Opening connection thresholdNumbercount00 to 100000, 0 = no limitCeiling on connections being opened in parallel.
Max error rateNumbercount1000 to 1000000, 0 = disabledErrors allowed per node per error-rate window before the circuit breaker trips.
Error rate windowNumbertend iterations11 to 100Length of the circuit-breaker error window, measured in tend iterations.
Fail if not connectedSwitchn/aOnOn, OffFails client creation when no seed host can be reached.
Limit connections to queue sizeSwitchn/aOnOn, OffCaps open connections per node at the connection queue size.
Rack awareSwitchn/aOffOn, OffTracks rack information and prefers same-rack nodes for reads. Use with the Prefer rack replica policy.
Rack IDsTextn/aemptyComma-separated integers, for example 1, 2, 3Preferred rack IDs in order of preference. Requires Rack aware.
Seed only clusterSwitchn/aOffOn, OffUses only the seed addresses and skips peer discovery.
Ignore other subnet aliasesSwitchn/aOffOn, OffIgnores node aliases outside the main subnet.
Application IDTextn/aemptyAny identifierCorrelates this client’s operations with server-side metrics.

Info policy

Change this when cluster statistics are slow to load. Applied to cluster info commands.

SettingControlUnitDefaultValid valuesEffect
Info timeoutNumberms20000 to 3600000Socket timeout for cluster info commands. Any remaining request deadline still applies.

How values are stored and resolved

Every field on the Policies page belongs to the connection you have open. Voyager resolves each field in this order and uses the first value it finds:

  1. The value saved on this connection.
  2. The global value, where one exists. Preferences > Advanced > Connection settings holds the global values, and it covers the Connect and Info groups only.
  3. The built-in default listed in the preceding tables.

Read, Write, and Query / scan fields have no global tier. Those are set per connection, so applying the same read timeout to several clusters means setting it on each one.

A field you have never edited on this connection is unset at connection scope, so the global value or the built-in default applies. Editing the field on the Policies page writes a connection-scoped value that from then on wins over the global one for that connection only. Other connections are unaffected.

Separately, several numeric fields treat 0 as a sentinel meaning “no client-side limit” or “use the server default.” The Valid values column in the preceding tables states what 0 means for each field.

Edits save automatically. There is no Save button. Voyager batches edits made in quick succession and writes them to the connection a fraction of a second after you stop typing.

Values are validated as you type. A number outside its valid range shows an inline error and is not saved, so the last valid value stays in effect until you correct the entry. Text fields validate the same way: Rack IDs, for example, rejects anything that is not a comma-separated list of integers.

How Voyager respects a read quota

An Aerospike role can carry a rate quota that limits how many records per second a user reads. When the connected user’s role has a read quota, Voyager keeps its query rate within that limit instead of letting the server reject the work.

Records per second in the Query / scan group drives this behavior:

Your settingEffect under a read quota of 200 records per second
Unset, or 0Voyager requests the full quota, 200 records per second. This leaves no headroom, so the scan is rejected if the user has any other read activity.
A value below the quota, such as 150Voyager keeps your value and runs at 150 records per second.
A value above the quotaRejected. Voyager reports the maximum you can set.

0 does not mean unthrottled when you have a quota, and it is not the safest setting. Voyager fills in your full quota, and the server admits a scan only when the requested rate, your current transaction rate, and the rate of any queries already running all fit inside the quota. Requesting the whole quota leaves nothing for the rest, so set an explicit value below the quota whenever this user does anything else against the cluster.

How the cap is discovered. When the Policies page loads for a cluster, and again each time you click the refresh icon, Voyager looks up the user named on that connection and reads its effective read quota from the cluster. A user’s effective quota is the largest read quota among that user’s roles, and it applies at each server node. See Rate quotas for the full model.

The cap is enforced, not advisory. With a cap in place:

  • The field does not accept a value above the quota. Typing one shows Maximum is N (your role's read quota). Choose N or lower. and the value is not saved.
  • The increment control stops at the quota.
  • A badge reads Uses role limit while the field is 0, and At role limit once the value reaches the quota.
  • The field description states the quota and the range you can choose from.
Records per second at 0 with an orange Uses role limit badge and the caption Your role's read quota caps this at 200 rec/sec Records per second showing 250 outlined in red with the error Maximum is 200 (your role's read quota). Choose 200 or lower.

When there is no cap. Voyager shows no cap and leaves the field’s full range available when any of the following is true:

  • The connection has no username saved.
  • The cluster reports that security is not enabled.
  • The connected user is not permitted to read its own quota, or the lookup fails for any other reason.

In the last case, a quota might still be enforced by the server even though Voyager cannot display it. Set Records per second manually to a value at or below the quota your administrator assigned.

If a scan is rejected with a rate-quota error, set Records per second below your quota. The server admits a scan only when its requested rate, together with your other read activity, stays inside the quota, so a value with headroom is what lets it run. A value like three quarters of the quota saves automatically and applies to the next scan.

Query / scan policy with Records per second set to 150 and the caption noting the 200 rec/sec role quota

If your quota changes on the server, click the refresh icon on the Policies page so Voyager re-reads it. Voyager sends a stored value greater than 0 to the server exactly as saved, so a value saved before an administrator lowered your quota keeps failing until you lower the field to the new limit. The field’s validation message states the new maximum after a refresh.

Verify

Confirm a policy took effect any of these ways:

  • Reopen the field on the Policies page and check the stored value.
  • For a read quota, check that the field shows the quota note, and that the Uses role limit or At role limit badge matches what you set.
  • Confirm the quota the server holds with Aerospike Admin (asadm): run show users in the asadm shell and read the quota column for the connected user.

Troubleshoot

SymptomCauseFix
Rate quota exceeded on a scan or queryThe requested rate, together with your other read activity, passed the role’s read quotaSet Records per second below your quota, or ask an administrator to raise the quota.
Rate quota exceeded on a write or deleteThe edit rate passed the role’s write quota, which has no client-side controlSpace out edits, or ask an administrator to raise the quota.
Quotas not enabledThe cluster does not have rate quotas enabledEnable quotas in the Aerospike server configuration.
Insufficient permissionsThe connected user’s role lacks a required privilegeConnect as a user whose role carries the privilege, or ask an administrator to grant it.
No quota note appears on a cluster that has oneVoyager could not read the quota for the connected userVerify the connection authenticates as a named user and that the user’s role carries a read quota, then click the refresh icon.
A saved Records per second value starts failingAn administrator lowered the quota below your saved valueClick the refresh icon so Voyager picks up the new limit, then lower the field below the new quota. Clearing the field to 0 does not recover it, because 0 requests the full quota and leaves no headroom.

For other problems, see Voyager troubleshooting.

Next steps