Charmed MongoDB K8s Tutorial (replica set) | 3. Access a replica set

Charmed MongoDB K8s Tutorials > Deploy a replica set > 3. Access a replica set

Access a replica set

MongoDB databases can be accessed via the mongosh, the MongoDB shell. This shell comes pre-installed in the juju units hosting the Charmed MongoDB K8s application as mongosh.

Connecting to the database requires a Uniform Resource Identifier (URI). MongoDB expects a MongoDB-specific URI that contains information used to authenticate us to the database.

In this part of the tutorial, we will fetch all the information needed to generate a URI that will grant us access to MongoDB, connect to the mongo shell, and create a test database.

Warning: This part of the tutorial accesses the sharded MongoDB cluster via the operator user. This is the admin user in Charmed MongoDB.

Do not directly interface with the operator user in a production environment.

Always connect to MongoDB via a separate user. We will cover this later in this tutorial when we learn how to integrate with other applications.

Summary


Retrieve URI data

To access MongoDB K8s via mongos, we need to build a URI of the format

mongodb://$DB_USERNAME:$DB_PASSWORD@$HOST_IP/$DB_NAME?replicaSet=$REPL_SET_NAME

We use a URI of the format:

mongo://<username>:<password>@<hosts>/<database name>?replicaSet=<replica set name>

Connecting via URI requires that you know the values for username, password, hosts, database name, and the replica set name. We will show you how to retrieve the necessary fields and set them to environment variables.

Username | $DB_USERNAME

In this case, we are using the operator user to connect to MongoDB. Use operator as the username:

export DB_USERNAME="operator"

The operator user is the admin user in Charmed MongoDB K8s.

Password | $DB_PASSWORD

Run the get-password action on the Charmed MongoDB application:

juju run mongodb-k8s/leader get-password

The command should output:

Running operation 1 with 1 task
  - task 2 on unit-mongodb-k8s-0

Waiting for task 2...
password: INIsjvJmDsuaPY2Rta0fPzas0zVKO5AJ

The command below sets the environment variable automatically by running get-password and filtering the password field:

export DB_PASSWORD=$(juju run mongodb-k8s/leader get-password  | grep password |  awk '{print $2}')

Hosts | $HOST_IP

In this case, we are connecting to mongo inside mongodb-k8s/0.

Set the variable HOST_IP to the IP address to mongodb-k8s-0.mongodb-k8s-endpoints:

export HOST_IP="mongodb-k8s-0.mongodb-k8s-endpoints"

Database name | $DB_NAME

In this case, we are connecting to the admin database. Use admin as the database name.

Once we access the database via the MongoDB URI, we will create a test-db database to store data.

export DB_NAME="admin"

Replica set name | $REPL_SET_NAME

The replica set name is the name of the application on Juju hosting MongoDB. The application name in this tutorial is mongodb-k8s. Use mongodb-k8s as the replica set name.

export REPL_SET_NAME="mongodb-k8s"

Generate the full URI

To summarize:

export DB_USERNAME="operator"
export DB_PASSWORD=$(juju run mongodb-k8s/leader get-password  | grep password |  awk '{print $2}')
export HOST_IP="mongodb-k8s-0.mongodb-k8s-endpoints"
export DB_NAME="admin"
export REPL_SET_NAME="mongodb-k8s"

Create the full URI with:

export URI=mongodb://$DB_USERNAME:$DB_PASSWORD@$HOST_IP:27017/$DB_NAME?replicaSet=$REPL_SET_NAME

Now echo the URI and save it, as you won’t be able to rely on this environment variable when you ssh into a unit in the next step.

echo $URI

Connect via MongoDB URI

To access the unit hosting Charmed MongoDB K8s, ssh into it pod:

juju ssh --container=mongod mongodb-k8s/0

If at any point you’d like to leave the unit, type exit.

While ssh’d into mongodb-k8s/0 unit, we can access mongo, using the URI that we saved in the previous step.

mongosh <URI>

You should now see something similar to the following:

Current Mongosh Log ID: <your connection id>
Connecting to:          mongodb://<credentials>@mongodb-k8s-0.mongodb-k8s-endpoints:27017/admin?replicaSet=mongodb-k8s&appName=mongosh+2.0.1
Using MongoDB:          6.0.6-5
Using Mongosh:          2.0.1
mongosh 2.0.2 is available for download: https://www.mongodb.com/try/download/shell

For mongosh info see: https://docs.mongodb.com/mongodb-shell/


To help improve our products, anonymous usage data is collected and sent to MongoDB periodically (https://www.mongodb.com/legal/privacy-policy).
You can opt-out by running the disableTelemetry() command.

------
   The server generated these startup warnings when booting
   2023-11-09T06:40:15.609+00:00: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine. See http://dochub.mongodb.org/core/prodnotes-filesystem
   2023-11-09T06:40:16.238+00:00: vm.max_map_count is too low
------

mongodb-k8s [primary] admin> 

You can now interact with MongoDB directly using any MongoDB commands.

For example, entering show dbs should output something like:

admin   0.000GB
config  0.000GB
local   0.000GB

Create a database

Now that we have access to MongoDB we can create a database named test-db.

In the MongoDB shell, run:

use test-db

Now create a user called testUser with read/write access to test-db:

db.createUser({
  user: "testUser",
  pwd: "password",
  roles: [
    { role: "readWrite", db: "test-db" }
  ]
})

You can verify that you added the user correctly by entering the command show users into the mongo shell. This will output:

{
  ok: 1,
  '$clusterTime': {
    clusterTime: Timestamp({ t: 1699533481, i: 1 }),
    signature: {
      hash: Binary.createFromBase64("/cRpojgyhSuF0UIS8kM0GZhAPss=", 0),
      keyId: Long("7299439113034268679")
    }
  },
  operationTime: Timestamp({ t: 1699533481, i: 1 })
}

Feel free to test out any other MongoDB commands. When you’re ready to leave the MongoDB shell, just type exit. You will be back in the host of Charmed MongoDB (mongodb/0).

Exit this host by once again typing exit. Now you will be in your original shell where you can interact with Juju and MicroK8s.

If you accidentally exit one more time or close your terminal session at some point, note that all the environment variables used in the URI will be removed.

If this happens, simply re-export these variables as described in the section Retrieve URI data.

Next step: 4. Scale your replicas