<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Jesse S</title>
    <description>The latest articles on Forem by Jesse S (@jdogmcsteezy).</description>
    <link>https://forem.com/jdogmcsteezy</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F584482%2Fb91fe1d0-c45a-43b3-82b7-e1224b0ab4ef.jpeg</url>
      <title>Forem: Jesse S</title>
      <link>https://forem.com/jdogmcsteezy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jdogmcsteezy"/>
    <language>en</language>
    <item>
      <title>Determine root cause of Aerospike stop-writes in a new simple command</title>
      <dc:creator>Jesse S</dc:creator>
      <pubDate>Wed, 06 Sep 2023 16:58:36 +0000</pubDate>
      <link>https://forem.com/aerospike/determine-root-cause-of-aerospike-stop-writes-in-a-new-simple-command-1l6i</link>
      <guid>https://forem.com/aerospike/determine-root-cause-of-aerospike-stop-writes-in-a-new-simple-command-1l6i</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5trLGv8T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://developer-hub.s3.us-west-1.amazonaws.com/624699834/eric-prouzet-bA45dDtYysc-unsplash_1690397829619.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5trLGv8T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://developer-hub.s3.us-west-1.amazonaws.com/624699834/eric-prouzet-bA45dDtYysc-unsplash_1690397829619.jpg" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Like a well-prepared community bracing for the impact of a natural disaster, databases must be equipped to face unforeseen challenges. In the world of databases, few things are as dreaded as running out of memory, a situation referred to as OOM. Enter Aerospike's savior: the stop-writes condition, a protective measure designed to avert the nightmarish scenario of OOM. It acts as a vigilant sentinel, ensuring your database stays far from the brink of unrecoverable states. Think of it as your emergency go-bag or the life vest under your seat, offering respite when you need it most, though you hope never to use it.&lt;/p&gt;

&lt;p&gt;But let's face it, encountering the stop-writes condition can still be quite unsettling and determining the root cause challenging. This is why we're introducing the &lt;code&gt;show stop-writes&lt;/code&gt; command. With this powerful tool at your fingertips, you'll swiftly navigate through stop-writes scenarios and get your database back on track. Let's delve into the world of this invaluable command and discover how it ensures the safety and stability of your precious data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stop-write configuration
&lt;/h2&gt;

&lt;p&gt;Before we delve into asadm's newest command, let's explore all the different ways you can configure and, more importantly, trigger stop-writes. The configuration you choose depends on what you want to protect. &lt;/p&gt;

&lt;p&gt;To restrict a set from going over a certain size or number of records:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://docs.aerospike.com/reference/configuration/index.html#stop-writes-count"&gt;&lt;code&gt;stop-writes-count&lt;/code&gt;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aerospike.com/reference/configuration/index.html#stop-writes-size"&gt;&lt;code&gt;stop-writes-size&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To restrict a namespace:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://docs.aerospike.com/reference/configuration/index.html#min-avail-pct"&gt;&lt;code&gt;min-avail-pct&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aerospike.com/reference/configuration/index.html#max-used-pct"&gt;&lt;code&gt;max-used-pct&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aerospike.com/reference/configuration/index.html#stop-writes-sys-memory-pct"&gt;&lt;code&gt;stop-writes-sys-memory-pct&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aerospike.com/reference/configuration/index.html#stop-writes-pct"&gt;&lt;code&gt;stop-writes-pct&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There is one other way the server protects itself, but this feature is not configurable:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://docs.aerospike.com/reference/configuration/index.html#cluster_clock_skew_stop_writes_sec"&gt;&lt;code&gt;cluster_clock_skew_stop_writes_sec&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As you can see, there are several ways to configure stop-writes, and as a result many ways stop-writes can occur. &lt;/p&gt;

&lt;h2&gt;
  
  
  Uh Oh! I'm in stop-writes!
&lt;/h2&gt;

&lt;p&gt;Picture this: you find yourself in the unfortunate stop-writes state, perhaps noticing a surge in client write errors.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jLld__7I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://developer-hub.s3.us-west-1.amazonaws.com/624699834/Screenshot2023-07-24at409PM_1690243164330.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jLld__7I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://developer-hub.s3.us-west-1.amazonaws.com/624699834/Screenshot2023-07-24at409PM_1690243164330.png" width="800" height="166"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or you see an alert in Grafana.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--l_oYB6zX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://developer-hub.s3.us-west-1.amazonaws.com/624699834/Screenshot2023-07-24at511PM_1690243342829.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l_oYB6zX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://developer-hub.s3.us-west-1.amazonaws.com/624699834/Screenshot2023-07-24at511PM_1690243342829.png" width="800" height="535"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or you see a cryptic logline that reads something like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Jul 25 2023 23:02:02 GMT: WARNING (nsup): (nsup.c:936) {test} breached stop-writes limit (sys-memory), sys-memory pct:78, memory sz:0 (0 + 0 + 0 + 0) limit:3865470566, disk avail-pct:100 used-pct:0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Need for a tool (asadm)
&lt;/h2&gt;

&lt;p&gt;To fix the issue, use our new &lt;a href="https://docs.aerospike.com/tools/asadm/live_cluster_mode_guide#stop-writes"&gt;&lt;code&gt;show stop-writes&lt;/code&gt;&lt;/a&gt; command, available in &lt;a href="https://download.aerospike.com/download/tools/notes.html#8.4.0"&gt;Aerospike Tools package 8.4.0&lt;/a&gt; (asadm 2.15.0) and later.&lt;/p&gt;

&lt;p&gt;When we start &lt;code&gt;asadm&lt;/code&gt;, a helpful warning message displays (added in &lt;code&gt;asadm&lt;/code&gt; 2.17.0) letting you know that you are in stop-writes and should run &lt;code&gt;show stop-writes&lt;/code&gt; for further analysis.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---JCWsH3S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://developer-hub.s3.us-west-1.amazonaws.com/624699834/Screenshot2023-07-24at532PM_1690243486497.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---JCWsH3S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://developer-hub.s3.us-west-1.amazonaws.com/624699834/Screenshot2023-07-24at532PM_1690243486497.png" width="800" height="179"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--esBqNP7_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://developer-hub.s3.us-west-1.amazonaws.com/624699834/Screenshot2023-07-24at539PM_1690243671005.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--esBqNP7_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://developer-hub.s3.us-west-1.amazonaws.com/624699834/Screenshot2023-07-24at539PM_1690243671005.png" width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the table, you'll spot some key details that give us valuable insights into the stop-writes condition. First, the &lt;code&gt;test&lt;/code&gt; namespace triggered the stop-writes, and the culprit behind it is the configured &lt;code&gt;stop-writes-sys-memory-pct&lt;/code&gt;, set at &lt;code&gt;72%&lt;/code&gt;. By comparing this parameter to the &lt;code&gt;system_free_mem_pct&lt;/code&gt; metric, which is at &lt;code&gt;26%&lt;/code&gt;, we can see that the stop-writes were activated when the system reached &lt;code&gt;74%&lt;/code&gt; memory usage. &lt;/p&gt;

&lt;p&gt;You've got a couple of options to tackle this situation: either increase the memory size allocated for the database or free up some space by removing unnecessary records. Meanwhile, while you work on the permanent fix, you can temporarily raise the configured threshold to get your Aerospike cluster back up and running. So let's do just that using asadm's &lt;a href="https://docs.aerospike.com/tools/asadm/live_cluster_mode_guide#dynamic-configuration"&gt;&lt;code&gt;manage config&lt;/code&gt;&lt;/a&gt; command.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7WZQ0d1n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://developer-hub.s3.us-west-1.amazonaws.com/624699834/Screenshot2023-07-24at516PM_1690245208747.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7WZQ0d1n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://developer-hub.s3.us-west-1.amazonaws.com/624699834/Screenshot2023-07-24at516PM_1690245208747.png" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And voilà! You are now out of stop-writes and can start working on a more permanent solution. Just don't treat the problem like dishes in your sink and leave it for next week.&lt;/p&gt;

&lt;h3&gt;
  
  
  Learn more about Aerospike Observability &amp;amp; Management
&lt;/h3&gt;

&lt;p&gt;Learn how Aerospike is adopting open standards like YAML, Open Telemetry and how to find clarity in complex systems in our &lt;a href="https://aerospike.zoom.us/webinar/register/5116909188905/WN_ZZLrBxBcT3WyJZTEXSwtIw#/registration"&gt;upcoming Webinar - September 6th, 2023&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>aerospike</category>
      <category>database</category>
      <category>datamodeling</category>
      <category>nosql</category>
    </item>
    <item>
      <title>The REST Gateway 2.0 Gets a Re-Model (formerly, the REST Client)</title>
      <dc:creator>Jesse S</dc:creator>
      <pubDate>Tue, 15 Nov 2022 20:32:05 +0000</pubDate>
      <link>https://forem.com/aerospike/the-rest-gateway-20-gets-a-re-model-formerly-the-rest-client-2maf</link>
      <guid>https://forem.com/aerospike/the-rest-gateway-20-gets-a-re-model-formerly-the-rest-client-2maf</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WluwAvu4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1600/0%2AQUvoUoRZ_oI_Cw9w" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WluwAvu4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1600/0%2AQUvoUoRZ_oI_Cw9w" alt="(Source: Photo by benjamin lehman on Unsplash" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Source: Photo by benjamin lehman on &lt;a href="https://unsplash.com/"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/aerospike/aerospike-rest-gateway"&gt;REST Gateway&lt;/a&gt; provides you with a well known interface to your Aerospike Database, and a Swiss army knife-like solution to a variety of architectural problems where you might not want to integrate a full fledged Aerospike client into every application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Re-Name and Refresh
&lt;/h2&gt;

&lt;p&gt;The Aerospike REST Client is now the &lt;a href="https://github.com/aerospike/aerospike-rest-gateway"&gt;REST Gateway 2.0&lt;/a&gt;, including a major overhaul. We've added support for Aerospike Database server 6.0 and  server 6.1 features, as well as complete retooling of the Operations API. These new features come with some deprecations and breaking changes, which this post will cover. &lt;br&gt;
Here are the new features and changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A new &lt;a href="https://aerospike.github.io/aerospike-rest-gateway/#/Operate%20operations/operateNamespaceSetKey"&gt;Operations API&lt;/a&gt; backed by swagger documentation. &lt;strong&gt;Deprecation of &lt;a href="https://aerospike.github.io/aerospike-rest-gateway/#/Operate%20operations/operateNamespaceSetKey_1"&gt;&lt;code&gt;/v1/operation&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://aerospike.github.io/aerospike-rest-gateway/#/Execute%20Operations/executeScanNamespace_1"&gt;&lt;code&gt;/v1/execute&lt;/code&gt;&lt;/a&gt; endpoints.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Query support with query by partition, response pagination, and secondary index filtering. &lt;strong&gt;Deprecation of &lt;a href="https://aerospike.github.io/aerospike-rest-gateway/#/Scan%20Operations/performScan"&gt;&lt;code&gt;/v1/scan&lt;/code&gt;&lt;/a&gt; endpoint.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Batch Write, Batch Delete, and Batch UDF support. Rewrite of old &lt;a href="https://aerospike.github.io/aerospike-rest-gateway/#/Batch%20Operations/performBatchGet"&gt;&lt;code&gt;/v1/batch&lt;/code&gt;&lt;/a&gt; API. &lt;strong&gt;This causes a breaking change.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The ability to read and write to nested Complex Data Types (CDT). Rewrite of old CTX API. &lt;strong&gt;This causes a breaking change with &lt;a href="https://aerospike.github.io/aerospike-rest-gateway/#/Operate%20operations/operateNamespaceSetKey_1"&gt;&lt;code&gt;/v1/operation&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://aerospike.github.io/aerospike-rest-gateway/#/Execute%20Operations/executeScanNamespace_1"&gt;&lt;code&gt;/v1/execute&lt;/code&gt;&lt;/a&gt; endpoints.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Prometheus-compatible metrics for spring-boot, tomcat, and the resilience4j circuit breaker via the &lt;code&gt;/actuator/prometheus&lt;/code&gt; endpoint.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lastly, we renamed the REST Client to the REST Gateway for a few reasons. Most notably, the Gateway was never really a client but a piece of useful middleware that uses a client under the hood. So keep this in mind when searching the documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operations V2
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://aerospike.github.io/aerospike-rest-gateway/#/Operate%20operations/operateNamespaceSetKey"&gt;Rest Gateway 2.0&lt;/a&gt; marks the release of a new API which we think you will find easier to understand and more robust. The old operations API had its benefits but could be difficult to use in practice. The schema of each model was highly restricted, causing some bloat, and while It worked well for basic ops, it had problems with list and map operations and lacked support for Bit and HLL ops. &lt;br&gt;
Every available Operation model has been redesigned and is now documented in our &lt;a href="https://docs.aerospike.com/apidocs/rest"&gt;API documentation&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Query by Partition
&lt;/h2&gt;

&lt;p&gt;Aerospike server 6.0 added the ability to &lt;a href="https://aerospike.github.io/aerospike-rest-gateway/#/Query%20Operations/performNamespaceQuery"&gt;query by partition&lt;/a&gt; and paginate queries. Before the release of Gateway 2.0, we only supported scans, now called Primary Index Queries (PI query), which could only scan one partition at a time before returning the provided number of maxRecords. Throughput and potential use cases were limited. Now, with query partition, we can query partitions concurrently while still allowing for pagination via a returned token. We also support Secondary Index Queries (SI query) by providing an optional query filter.&lt;br&gt;
 &lt;br&gt;
&lt;strong&gt;Note:&lt;/strong&gt; &lt;code&gt;/v1/query&lt;/code&gt; endpoints currently only provide a way to perform foreground PI and SI queries. Use &lt;code&gt;/v1/execute&lt;/code&gt; for background queries.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aerospike.github.io/aerospike-rest-gateway/#/Query%20Operations/performNamespaceQuery"&gt;&lt;code&gt;/v1/query&lt;/code&gt;&lt;/a&gt; provides a few new endpoints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/v1/query/&amp;lt;namespace&amp;gt;&lt;/code&gt; query an entire namespace&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/v1/query/&amp;lt;namespace&amp;gt;/&amp;lt;set&amp;gt;&lt;/code&gt; query a set&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/v1/query/&amp;lt;namespace&amp;gt;/&amp;lt;begin&amp;gt;/&amp;lt;count&amp;gt;&lt;/code&gt; query &lt;code&gt;&amp;lt;count&amp;gt;&lt;/code&gt; sequential partitions of a namespace starting at &lt;code&gt;&amp;lt;begin&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/v1/query/&amp;lt;namespace&amp;gt;/&amp;lt;set&amp;gt;/&amp;lt;begin&amp;gt;/&amp;lt;count&amp;gt;&lt;/code&gt; query &lt;code&gt;&amp;lt;count&amp;gt;&lt;/code&gt; sequential partitions of a set starting at &lt;code&gt;&amp;lt;begin&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pagination
&lt;/h3&gt;

&lt;p&gt;To use pagination, provide the maxRecord query parameter (default 10,000) to specify the desired page size. To receive a token to be used for your next page request, provide the getToken=true query parameter (default: false). A token will then be received in the response body that can be used in the next request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Filtering
&lt;/h3&gt;

&lt;p&gt;Another major benefit of queries is providing an optional filter on a sindex. Furthermore, with Aerospike Server 6.1, sindexs can now be applied to nested CDTs. The following filters are currently supported, and the schemas can be found in our &lt;a href="https://docs.aerospike.com/apidocs/rest"&gt;API documentation&lt;/a&gt;. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;QueryEqualsStringFilter&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;QueryEqualLongFilter&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;QueryRangeFilter&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;QueryContainsStringFilter&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;QueryContainsLongFilter&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;QueryGeoWithinPolygonFilter&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;QueryGeoWithinRadiusFilter&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;QueryGeoContainsPointFilter&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  New Batch API
&lt;/h2&gt;

&lt;p&gt;Aerospike Server 6.0 added support for BatchWrite, BatchDelete, and BatchUDF commands to complement the existing BatchRead command. BatchWrite allows you to define a list of operations to perform on a record. These operations can contain both reads and writes. BatchDelete allows you to delete a record and filter based on generationPolicy or use a filter expression. BatchUDF allows you to run server-side User Defined Functions (UDFs) on a given record. BatchRead allows you to read specific bins from a record or CDTs using read operations.&lt;/p&gt;

&lt;p&gt;Before Gateway 2.0, you had to use the &lt;a href="https://aerospike.github.io/aerospike-rest-gateway/#/Batch%20Operations/performBatchGet"&gt;&lt;code&gt;/v1/batch&lt;/code&gt;&lt;/a&gt; endpoint to read different bins from different records, as opposed to the &lt;a href="https://aerospike.github.io/aerospike-rest-gateway/#/Operate%20operations/operateNamespaceSetKey"&gt;&lt;code&gt;/v2/operate/read&lt;/code&gt;&lt;/a&gt; endpoint, which allows you to read the same bins from multiple records. The old &lt;a href="https://aerospike.github.io/aerospike-rest-gateway/#/Batch%20Operations/performBatchGet"&gt;&lt;code&gt;/v1/batch&lt;/code&gt;&lt;/a&gt; endpoint also did not support reading from CDTs.  To add support for BatchWrites, BatchDeletes, and BatchUDFs, we redesigned the body of the &lt;a href="https://aerospike.github.io/aerospike-rest-gateway/#/Batch%20Operations/performBatchGet"&gt;&lt;code&gt;/v1/batch&lt;/code&gt;&lt;/a&gt; endpoint to support all four types rather than just a BatchRead. Another added benefit of the new API is that every Batch object type can specify its own unique policy.&lt;/p&gt;

&lt;p&gt;You can take a look at the batch &lt;a href="https://docs.aerospike.com/apidocs/rest"&gt;API documentation&lt;/a&gt; and schemas in our swagger documentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Batch operations are not the same as multi-record transactions. Their execution is not guaranteed to be in the order provided.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it out!
&lt;/h2&gt;

&lt;p&gt;Thank you for reading! If you need help or have problems, feel free to open an issue on GitHub or ask a question on the Aerospike Community Forum.&lt;/p&gt;

</description>
      <category>aerospike</category>
      <category>query</category>
      <category>parallelism</category>
      <category>pagination</category>
    </item>
    <item>
      <title>New Features Coming to Asadm — Aerospike’s Admin Tool</title>
      <dc:creator>Jesse S</dc:creator>
      <pubDate>Tue, 23 Feb 2021 01:29:42 +0000</pubDate>
      <link>https://forem.com/jdogmcsteezy/new-features-coming-to-asadm-aerospike-s-admin-tool-20en</link>
      <guid>https://forem.com/jdogmcsteezy/new-features-coming-to-asadm-aerospike-s-admin-tool-20en</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qNkS5JJ3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2ARtxsWDsf4gIldyGi" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qNkS5JJ3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2ARtxsWDsf4gIldyGi" alt="Photo by [NeONBRAND](https://unsplash.com/@neonbrand?utm_source=medium&amp;amp;utm_medium=referral) on [Unsplash](https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral)"&gt;&lt;/a&gt;Photo by &lt;a href="https://unsplash.com/@neonbrand?utm_source=medium&amp;amp;utm_medium=referral"&gt;NeONBRAND&lt;/a&gt; on &lt;a href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Aerospike Admin (Asadm)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.aerospike.com/docs/tools/asadm/index.html"&gt;Asadm&lt;/a&gt; used to be Aerospike Database’s primary tool for monitoring performance and configuration, but it now has the ability to do common administrative tasks. Funnily enough, until now, Aerospike users would need to use another tool, aql, to do everyday administrative tasks like create a new user or update a user-defined function (UDF). With the latest Aerospike Tools 5.1.0, asadm will have the ability to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Manage user and roles&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add and remove UDFs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create and delete secondary indexes (sindexes)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As well as some other convenient features I will touch on later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Suite of New manage Commands to Administer your Aerospike Database&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Admin+&amp;gt; manage acl create user superwoman roles sys-admin
Enter password for new user superwoman:
Successfully created user superwoman.
Admin+&amp;gt;
Admin+&amp;gt; show users
~~~~~~Users (2021-02-18 20:49:01 UTC)~~~~~~~
      User|                            Roles
admin     |read-write, sys-admin, user-admin
superwoman|                        sys-admin
Number of rows: 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;To access the new feature set, there is a new &lt;code&gt;manage&lt;/code&gt; command. The manage command, you guessed it, helps you manage your users, roles, sindexes, and UDFs. There are quite a few manage sub-commands, which I will cover later on with some examples, but from a top-level view, there is &lt;code&gt;manage sindex&lt;/code&gt;, &lt;code&gt;manage udfs&lt;/code&gt;, and &lt;code&gt;manage acl&lt;/code&gt; (access control list). The new manage commands are also accompanied by a new show commands &lt;code&gt;show users&lt;/code&gt;, &lt;code&gt;show roles&lt;/code&gt;, &lt;code&gt;show udfs&lt;/code&gt;, and &lt;code&gt;show sindex&lt;/code&gt;. Together, the &lt;code&gt;show&lt;/code&gt; and &lt;code&gt;manage&lt;/code&gt; commands can be used to administer your Aerospike Database with ease.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A New Privileged Mode in Asadm&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Admin&amp;gt; asinfo -v build
ERROR: User must be in privileged mode to issue "asinfo"
       commands.
       Type "enable" to enter privileged mode.
Admin&amp;gt; enable
Admin+&amp;gt; asinfo -v build
ubuntu:3000 (192.168.173.203) returned:
5.4.0.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Unlike existing asadm commands that monitor Aerospike’s DB state, the &lt;code&gt;manage&lt;/code&gt; commands mutate data in the database, which adds a level of risk not seen before in asadm. There is an exception: the &lt;code&gt;asinfo&lt;/code&gt; command, which allows some unfettered access to the Aerospike Database. A new “privileged” mode has been created, allowing users to access any risky commands like &lt;code&gt;asinfo&lt;/code&gt; and asadm’s new suite of &lt;code&gt;manage&lt;/code&gt; commands. The privileged mode is intended to keep users from inadvertently making changes to the Aerospike Database. The &lt;code&gt;enable&lt;/code&gt; command also changes the prompt from &lt;code&gt;Admin&amp;gt;&lt;/code&gt; to &lt;code&gt;Admin+&amp;gt;&lt;/code&gt; to signify the added risk.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Admin&amp;gt; enable --warn
Admin+&amp;gt; manage sindex delete age-index ns test
The secondary index age-index has 654 keys indexed.
Confirm that you want to proceed by typing x4b862, or 
cancel by typing anything else.
x4b862
Successfully deleted sindex age-index.
Admin+&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Privileged mode has another level of protection added by the &lt;code&gt;--warn&lt;/code&gt; flag, which, when possible, tries to inform you of the implications of the command. In the example above, you can see the &lt;code&gt;manage sindex delete&lt;/code&gt; command informs the user about the number of keys currently stored in the index and requires a random six-digit hex code to continue.&lt;/p&gt;

&lt;p&gt;To exit privileged mode and be kept from issuing &lt;code&gt;asinfo&lt;/code&gt; or &lt;code&gt;manage&lt;/code&gt; commands, use the &lt;code&gt;disable&lt;/code&gt; command.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Now let's look at some examples.&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Before we begin&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Using Aerospike Enterprise Edition (EE) with &lt;a href="https://www.aerospike.com/docs/reference/configuration/index.html#enable-security"&gt;security&lt;/a&gt; enabled requires the &lt;code&gt;data-admin&lt;/code&gt; credential for &lt;code&gt;manage udf&lt;/code&gt; and &lt;code&gt;manage sindex&lt;/code&gt; commands. Similarly, to use the &lt;code&gt;manage acl&lt;/code&gt; commands you must have the &lt;code&gt;user-admin&lt;/code&gt; credential.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Managing User-Defined Functions (UDF)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There are two commands available for UDF management, &lt;code&gt;manage udfs add&lt;/code&gt; and &lt;code&gt;manage udfs remove&lt;/code&gt;. First, let's add a UDF module to the Aerospike DB.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Admin&amp;gt; enable
Admin+&amp;gt; manage udfs add foo.lua path path/to/foo.lua
Successfully added UDF foo.lua.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Let’s verify with the new &lt;code&gt;show udf&lt;/code&gt; command.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Admin+&amp;gt; show udfs
~~~~~~~~~~UDF Modules (2021-02-18 01:11:39 UTC)~~~~~~~~~~~
    Filename|                                    Hash|Type
abc.123     |dceaf7f1acddf1d6e12a1752d499d80cfadfc24b|LUA 
bar.lua     |591d2536acb21a329040beabfd9bfaf110d35c18|LUA 
foo.lua     |f6eaf2b22d8b29b3597ef1ad9113d0907425ecd0|LUA 
mymodule.lua|7fae110826972135a3c3b8a812d43243e7c7a23c|LUA 
test.lua    |9f78214b275e306596d8e7120103585f3ee6adcc|LUA 
Number of rows: 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;We can then enter privileged mode with the &lt;code&gt;--warn&lt;/code&gt; flag and update a UDF module.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Admin+&amp;gt; disable
Admin&amp;gt; enable --warn
Admin+&amp;gt; manage udfs add bar.lua path test.lua
You are about to write over an existing UDF module.
Confirm that you want to proceed by typing 6a9cb8, or
cancel by typing anything else.
6a9cb8
Successfully added UDF bar.lua.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;As you can see, asadm first checks if the UDF module already existed and warned that it would be overwritten by running the command. Lastly, let’s delete a UDF module.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Admin+&amp;gt; manage udfs remove foo.lua
You are about to remove a UDF module that may be in use.
Confirm that you want to proceed by typing 1629e6, or
cancel by typing anything else.
1629e6
Successfully removed UDF foo.lua.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Again, asadm first prompts you to make sure that you understand the risks of issuing a command to remove a UDF.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NG9GYeJV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/6124/0%2AHbsS9cVnfYIsG6zZ" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NG9GYeJV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/6124/0%2AHbsS9cVnfYIsG6zZ" alt="Photo by [Martin Adams](https://unsplash.com/@martinadams?utm_source=medium&amp;amp;utm_medium=referral) on [Unsplash](https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral)"&gt;&lt;/a&gt;&lt;em&gt;Photo by &lt;a href="https://unsplash.com/@martinadams?utm_source=medium&amp;amp;utm_medium=referral"&gt;Martin Adams&lt;/a&gt; on &lt;a href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Managing Secondary Indexes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There are two new commands available for sindex management. They are &lt;code&gt;manage sindex create&lt;/code&gt; and &lt;code&gt;manage sindex delete&lt;/code&gt;. Let’s assume we have some data in the namespace “bar” and the set “testset” with the basic structure below.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PK   | name  | age
------------------
key1 | Jack  | 26
key2 | Jill  | 20
key3 | Sean  | 26
key4 | Sally | 24
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Now let’s create a numeric sindex on bin “age”.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Admin+&amp;gt; manage sindex create numeric age-index ns bar set testset bin age
Adding a secondary index will cause longer restart times.
Confirm that you want to proceed by typing 52bf49, or
cancel by typing anything else.
52bf49
Successfully created sindex age-index.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Notice the warning provided by asadm. Next, we verify using the new &lt;code&gt;show sindex&lt;/code&gt; command.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Admin+&amp;gt; show sindex
~~~~Secondary Indexes (2021-02-18 01:52:46 UTC)~~~~
    Index|Namespace|    Set|Bin|    Bin|Index|State
     Name|         |       |   |   Type| Type|     
age-index|bar      |testset|age|NUMERIC|NONE |RW   
Number of rows: 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Now let’s delete the sindex since we no longer need it, and it causes longer restart times.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Admin+&amp;gt; manage sinde delete age-index ns bar
The secondary index age-index has 10 keys indexed.
Confirm that you want to proceed by typing 5ec3e3, or
cancel by typing anything else.
5ec3e3
Successfully deleted sindex age-index.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;And there you have it. You can now manage your sindexes without breaking a sweat!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KGUcu27---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/5514/0%2AziZ9p2MCVAmxqIwF" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KGUcu27---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/5514/0%2AziZ9p2MCVAmxqIwF" alt="Photo by [Jason Dent](https://unsplash.com/@jdent?utm_source=medium&amp;amp;utm_medium=referral) on [Unsplash](https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral)"&gt;&lt;/a&gt;&lt;em&gt;Photo by &lt;a href="https://unsplash.com/@jdent?utm_source=medium&amp;amp;utm_medium=referral"&gt;Jason Dent&lt;/a&gt; on &lt;a href="https://unsplash.com?utm_source=medium&amp;amp;utm_medium=referral"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Managing the Access Control List (ACL)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Configuring your ACL is essential to keeping unwanted users out of your Enterprise Edition of Aerospike Database. In Aerospike EE, users are assigned roles, and roles are assigned privileges. Note that privileges are predefined for you and cannot be changed. You can read more about &lt;a href="https://www.aerospike.com/docs/operations/configure/security/access-control/"&gt;configuring access control&lt;/a&gt; in the Aerospike technical documentation.&lt;/p&gt;

&lt;p&gt;To use the new &lt;code&gt;manage acl&lt;/code&gt; commands we must first make sure &lt;a href="https://www.aerospike.com/docs/reference/configuration/index.html#enable-security"&gt;security&lt;/a&gt; is enabled in our &lt;code&gt;aerospike.conf&lt;/code&gt; file. The default location of the config file is &lt;code&gt;/etc/aerospike/aerospike.conf&lt;/code&gt;. To log in with your credential run &lt;code&gt;asadm -U &amp;lt;username&amp;gt;&lt;/code&gt; and you will be prompted for your password. If you are just getting started with your Aerospike DB then the default username and password is admin, admin (be sure to change your password using the new set-password command below). As stated previously, &lt;code&gt;manage acl&lt;/code&gt; commands require the &lt;code&gt;user-admin&lt;/code&gt; credential.&lt;/p&gt;

&lt;p&gt;Now on to an example.&lt;/p&gt;

&lt;p&gt;First, let’s create a user named Fred Rogers.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Admin&amp;gt; enable
Admin+&amp;gt; manage acl create user Mr-Rogers
Enter password for new user Mr-Rogers:
Successfully created user Mr-Rogers.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;To verify that we created the user, let’s use the new &lt;code&gt;show users&lt;/code&gt; command.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Admin+&amp;gt; show users
~~~~~~Users (2021-02-18 00:23:40 UTC)~~~~~~
     User|                            Roles
Mr-Rogers|                               --
admin    |read-write, sys-admin, user-admin
Number of rows: 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;And there he is, but he has no roles. Now let's create a few roles.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Admin+&amp;gt; manage acl create role Bad-Neighbor priv read ns test set testset
Successfully created role Bad-Neighbor.
Admin+&amp;gt;
Admin+&amp;gt; manage acl create role Good-Neighbor priv sys-admin
Successfully created role Good-Neighbor.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The first role is “Bad-Neighbor,” which has the &lt;code&gt;read&lt;/code&gt; privilege but only for the namespace “test” and set “testset”. The second privilege is named “Good-Neighbor” and has the privilege &lt;code&gt;sys-admin&lt;/code&gt;, which is globally applied.&lt;/p&gt;

&lt;p&gt;Now let’s verify with the new &lt;code&gt;show roles&lt;/code&gt; command.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Admin+&amp;gt; show roles
~Roles (2021-02-18 00:35:02 UTC)~
          Role|       Privileges
Bad-Neighbor  |read.test.testset
Good-Neighbor |        sys-admin
data-admin    |       data-admin
read          |             read
read-write    |       read-write
read-write-udf|   read-write-udf
sys-admin     |        sys-admin
user-admin    |       user-admin
write         |            write
Number of rows: 9
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;There they are! Now let's assign those roles to Mr-Rogers.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Admin+&amp;gt; manage acl grant user Mr-Rogers roles Good-Neighbor Bad-Neighbor
Successfully granted roles to user Mr-Rogers.
Admin+&amp;gt;
Admin+&amp;gt; show users
~~~~~~Users (2021-02-18 00:39:00 UTC)~~~~~~
     User|                            Roles
Mr-Rogers|        Bad-Neighbor, Good-Neighbor
admin    |read-write, sys-admin, user-admin
Number of rows: 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;But that doesn’t look right?!?! After all, Mr-Rogers was a good neighbor. Let’s revoke the role “Bad-Neighbor” from Mr-Rogers.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Admin+&amp;gt; manage acl revoke user Mr-Rogers roles Bad-Neighbor
Successfully revoked roles from user Mr-Rogers.
Admin+&amp;gt;
Admin+&amp;gt; show users
~~~~~~Users (2021-02-18 00:43:00 UTC)~~~~~~
     User|                            Roles
Mr-Rogers|                     Good-Neigbor
admin    |read-write, sys-admin, user-admin
Number of rows: 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Ahhh, that’s better. Although, we still have a bad neighbor lurking around. Let’s restrict Bad-Neighbor's access even more by issuing the role an &lt;em&gt;allowlist&lt;/em&gt;. That is, addresses Bad-Neighbor can connect from.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Admin+&amp;gt; manage acl allowlist role Bad-Neighbor allow 192.168.2.1
Successfully updated allowlist for role Bad-Neighbor.
Admin+&amp;gt; show roles
~~~~~~Roles (2021-02-18 00:47:34 UTC)~~~~~~~
          Role|       Privileges|  Allowlist
Bad-Neighbor  |read.test.testset|192.168.2.1
Good-Neighbor |        sys-admin|         --
data-admin    |       data-admin|         --
read          |             read|         --
read-write    |       read-write|         --
read-write-udf|   read-write-udf|         --
sys-admin     |        sys-admin|         --
user-admin    |       user-admin|         --
write         |            write|         --
Number of rows: 9
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Now we have another column of &lt;em&gt;allowlist&lt;/em&gt; that is returned by &lt;code&gt;show roles&lt;/code&gt;. “Bad-Neighbor” will only be able to connect from the address &lt;code&gt;192.168.2.1&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Asadm is your new one-stop-shop&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;As you can see asadm is coming closer to be the singular tool required to monitor, administer, and configure your Aerospike Database. Now, you no longer are required to use aql when you need to manage users and roles, add and remove UDFs, and create and delete secondary indexes. There are also plans in the works to add more features to make interacting with your Aerospike Database easier than ever before, so please stay tuned!&lt;/p&gt;

</description>
      <category>aerospike</category>
      <category>nosql</category>
      <category>database</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
