Charmed OpenSearch Tutorial | Scale horizontally

Charmed OpenSearch Tutorial > 6. Scale horizontally

Scale Charmed OpenSearch horizontally

After having indexed some data in our previous section, let’s take a look at the status of our charm:

juju status

The output should look similar to the following:

Model     Controller       Cloud/Region         Version  SLA          Timestamp
tutorial  opensearch-demo  localhost/localhost  3.5.3    unsupported  13:57:38Z

App                       Version  Status  Scale  Charm                     Channel        Rev  Exposed  Message
data-integrator                    active      1  data-integrator           latest/edge     59  no
opensearch                         active      3  opensearch                2/beta         117  no
self-signed-certificates           active      1  self-signed-certificates  latest/stable  155  no

Unit                         Workload  Agent  Machine  Public address  Ports     Message
data-integrator/0*           active    idle   4        10.95.38.22
opensearch/0*                active    idle   0        10.95.38.94     9200/tcp
opensearch/1                 active    idle   1        10.95.38.139    9200/tcp
opensearch/2                 active    idle   2        10.95.38.212    9200/tcp
self-signed-certificates/0*  active    idle   3        10.95.38.54

Machine  State    Address       Inst id        Base          AZ  Message
0        started  10.95.38.94   juju-be3883-0  ubuntu@22.04      Running
1        started  10.95.38.139  juju-be3883-1  ubuntu@22.04      Running
2        started  10.95.38.212  juju-be3883-2  ubuntu@22.04      Running
3        started  10.95.38.54   juju-be3883-3  ubuntu@22.04      Running
4        started  10.95.38.22   juju-be3883-4  ubuntu@22.04      Running

Integration provider                   Requirer                               Interface              Type     Message
data-integrator:data-integrator-peers  data-integrator:data-integrator-peers  data-integrator-peers  peer
opensearch:node-lock-fallback          opensearch:node-lock-fallback          node_lock_fallback     peer
opensearch:opensearch-client           data-integrator:opensearch             opensearch_client      regular
opensearch:opensearch-peers            opensearch:opensearch-peers            opensearch_peers       peer
opensearch:upgrade-version-a           opensearch:upgrade-version-a           upgrade                peer
self-signed-certificates:certificates  opensearch:certificates                tls-certificates       regular

Add node

You can add two additional nodes to your deployed OpenSearch application with the following command:

juju add-unit opensearch -n 1

Where -n 1 specifies the number of units to add. In this case, we are adding one unit to the OpenSearch application. You can add more units by changing the number after -n.

You can now watch the new units join the cluster with: juju status --watch 1s. It usually takes a few minutes for the new nodes to be added to the cluster formation. You’ll know that all three nodes are ready when juju status --watch 1s reports:

Model     Controller       Cloud/Region         Version  SLA          Timestamp
tutorial  opensearch-demo  localhost/localhost  3.5.3    unsupported  14:02:18Z

App                       Version  Status  Scale  Charm                     Channel        Rev  Exposed  Message
data-integrator                    active      1  data-integrator           latest/edge     59  no
opensearch                         active      4  opensearch                2/beta         117  no
self-signed-certificates           active      1  self-signed-certificates  latest/stable  155  no

Unit                         Workload  Agent  Machine  Public address  Ports     Message
data-integrator/0*           active    idle   4        10.95.38.22
opensearch/0*                active    idle   0        10.95.38.94     9200/tcp
opensearch/1                 active    idle   1        10.95.38.139    9200/tcp
opensearch/2                 active    idle   2        10.95.38.212    9200/tcp
opensearch/3                 active    idle   5        10.95.38.39     9200/tcp
self-signed-certificates/0*  active    idle   3        10.95.38.54

Machine  State    Address       Inst id        Base          AZ  Message
0        started  10.95.38.94   juju-be3883-0  ubuntu@22.04      Running
1        started  10.95.38.139  juju-be3883-1  ubuntu@22.04      Running
2        started  10.95.38.212  juju-be3883-2  ubuntu@22.04      Running
3        started  10.95.38.54   juju-be3883-3  ubuntu@22.04      Running
4        started  10.95.38.22   juju-be3883-4  ubuntu@22.04      Running
5        started  10.95.38.39   juju-be3883-5  ubuntu@22.04      Running

You can trust that Charmed OpenSearch added these nodes correctly, and that your replica shards are all assigned. But if you want to verify that your data is correctly replicated, you can also query the shards with the following command:

curl --cacert demo-ca.pem -XGET https://username:password@opensearch_node_ip:9200/_cat/shards

Which should result in the following output:

test-index                       0 r STARTED  0    208b 10.95.38.94  opensearch-0.0f3
test-index                       0 p STARTED  0    208b 10.95.38.139 opensearch-1.0f3
.plugins-ml-config               0 r STARTED  1   3.9kb 10.95.38.94  opensearch-0.0f3
.plugins-ml-config               0 r STARTED  1   3.9kb 10.95.38.139 opensearch-1.0f3
.plugins-ml-config               0 p STARTED  1   3.9kb 10.95.38.212 opensearch-2.0f3
.opensearch-observability        0 r STARTED  0    208b 10.95.38.94  opensearch-0.0f3
.opensearch-observability        0 p STARTED  0    208b 10.95.38.139 opensearch-1.0f3
.opensearch-observability        0 r STARTED  0    208b 10.95.38.212 opensearch-2.0f3
albums                           0 r STARTED  4  10.7kb 10.95.38.139 opensearch-1.0f3
albums                           0 p STARTED  4  10.7kb 10.95.38.212 opensearch-2.0f3
.opensearch-sap-log-types-config 0 r STARTED            10.95.38.94  opensearch-0.0f3
.opensearch-sap-log-types-config 0 r STARTED            10.95.38.139 opensearch-1.0f3
.opensearch-sap-log-types-config 0 p STARTED            10.95.38.212 opensearch-2.0f3
.opendistro_security             0 r STARTED 10  54.2kb 10.95.38.94  opensearch-0.0f3
.opendistro_security             0 r STARTED 10  54.2kb 10.95.38.139 opensearch-1.0f3
.opendistro_security             0 p STARTED 10 155.1kb 10.95.38.212 opensearch-2.0f3
.charm_node_lock                 0 r STARTED  1   3.8kb 10.95.38.94  opensearch-0.0f3
.charm_node_lock                 0 r STARTED  1   6.9kb 10.95.38.139 opensearch-1.0f3
.charm_node_lock                 0 p STARTED  1  11.8kb 10.95.38.212 opensearch-2.0f3

Notice that the shards are distributed across all nodes.

Remove nodes

Note: Refer to safe-horizontal-scaling guide to understand how to safely remove units in a production environment.

Warning: In highly available deployment, only scaling down to 3 nodes is safe. If only 2 nodes are online, neither can be unavailable nor removed. The service will become unavailable and data may be lost if scaling below 2 nodes.

Removing a unit from the Juju application scales down your OpenSearch cluster by one node. Before we scale down the nodes we no longer need, list all the units with juju status. Here you will see four units / nodes: opensearch/0, opensearch/1, opensearch/2, opensearch/3. To remove the unit opensearch/3 run:

juju remove-unit opensearch/3

You’ll know that the node was successfully removed when juju status --watch 1s reports:

Model     Controller       Cloud/Region         Version  SLA          Timestamp
tutorial  opensearch-demo  localhost/localhost  3.5.3    unsupported  14:05:58Z

App                       Version  Status  Scale  Charm                     Channel        Rev  Exposed  Message
data-integrator                    active      1  data-integrator           latest/edge     59  no
opensearch                         active      3  opensearch                2/beta         117  no
self-signed-certificates           active      1  self-signed-certificates  latest/stable  155  no

Unit                         Workload  Agent  Machine  Public address  Ports     Message
data-integrator/0*           active    idle   4        10.95.38.22
opensearch/0*                active    idle   0        10.95.38.94     9200/tcp
opensearch/1                 active    idle   1        10.95.38.139    9200/tcp
opensearch/2                 active    idle   2        10.95.38.212    9200/tcp
self-signed-certificates/0*  active    idle   3        10.95.38.54

Machine  State    Address       Inst id        Base          AZ  Message
0        started  10.95.38.94   juju-be3883-0  ubuntu@22.04      Running
1        started  10.95.38.139  juju-be3883-1  ubuntu@22.04      Running
2        started  10.95.38.212  juju-be3883-2  ubuntu@22.04      Running
3        started  10.95.38.54   juju-be3883-3  ubuntu@22.04      Running
4        started  10.95.38.22   juju-be3883-4  ubuntu@22.04      Running

Next step: 7. Clean up the environment.