Charmed MongoDB Tutorials > Deploy a sharded cluster > 6. Integrate with other applications
Integrate MongoDB with other applications
While mongos
exists inside our application config-server
, its only purpose is to perform database admin operations. We have used this process throughout the tutorial so far to simplify our environment while learning about MongoDB operations, but doing so is not suitable for a production deployment.
In order to access the cluster safely, we will use Juju integrations to connect to Charmed Mongos - a charm that acts as a router to connect client applications to sharded clusters.
Integrations are the easiest way to create a user for MongoDB in Charmed MongoDB. An integration automatically creates a username, password, and database for the desired user/application. In this section of the tutorial, we will learn how to correctly access our MongoDB cluster by integrating with Charmed MongoDB. We will also see how user management works via integrations.
Summary
- Deploy
mongos
anddata-integrator
charms - Integrate with MongoDB
- Access the integrated database
- Remove a user
- Recreate a user
Deploy the mongos
and data-integrator
charms
Since Charmed Mongos is a subordinate charm, it requires a principal charm to host it. For this tutorial, we will use the data-integrator
charm to host the mongos
charm.
Deploy mongos
and data-integrator
juju deploy data-integrator --config database-name=test-database
juju deploy mongos --channel 6/edge
Watch juju status --watch 1s
until the data-integrator
status is blocked
and the mongos
status is unknown
Model Controller Cloud/Region Version SLA Timestamp
tutorial overlord localhost/localhost 3.1.7 unsupported 14:30:39+01:00
App Version Status Scale Charm Channel Rev Exposed Message
config-server active 1 mongodb 6/beta 149 no Primary
data-integrator blocked 1 data-integrator stable 19 no Please specify either topic, index, or database name
mongos unknown 0 mongos 6/edge 5 no
shard0 active 1 mongodb 6/beta 149 no Primary
shard1 active 1 mongodb 6/beta 149 no Primary
Unit Workload Agent Machine Public address Ports Message
config-server/0* active idle 0 10.67.56.193 27017-27018/tcp Primary
data-integrator/0* blocked idle 4 10.67.56.157 Please specify either topic, index, or database name
shard0/0* active idle 1 10.67.56.197 27017/tcp Primary
shard1/0* active idle 2 10.67.56.194 27017/tcp Primary
Machine State Address Inst id Base AZ Message
0 started 10.67.56.193 juju-5646f0-0 ubuntu@22.04 Running
1 started 10.67.56.197 juju-5646f0-1 ubuntu@22.04 Running
2 started 10.67.56.194 juju-5646f0-2 ubuntu@22.04 Running
4 started 10.67.56.157 juju-5646f0-4 ubuntu@22.04 Running
Integration provider Requirer Interface Type Message
config-server:config-server shard0:sharding shards regular
config-server:config-server shard1:sharding shards regular
config-server:database-peers config-server:database-peers mongodb-peers peer
data-integrator:data-integrator-peers data-integrator:data-integrator-peers data-integrator-peers peer
mongos:router-peers mongos:router-peers mongos-peers peer joining
shard0:database-peers shard0:database-peers mongodb-peers peer
shard1:database-peers shard1:database-peers mongodb-peers peer
Integrate with MongoDB
Now we will connect our client application,data-integrator
, to the cluster via our mongos
router:
juju integrate mongos data-integrator
juju integrate mongos config-server
The data-integrator
status will stay
Please relate the data-integator with the desired product
until mongos is integrated with the config-server.
This is because mongos acts as a proxy and data-integrator waits for the actual url to connect to the cluster.
Watch juju status --watch 1s --relations
until the integrations are ready.
Model Controller Cloud/Region Version SLA Timestamp
tutorial overlord localhost/localhost 3.1.7 unsupported 18:40:10+01:00
App Version Status Scale Charm Channel Rev Exposed Message
config-server active 1 mongodb 6/beta 149 no Primary
data-integrator active 1 data-integrator edge 19 no
mongos active 1 mongos 6/edge 5 no
shard0 active 1 mongodb 6/beta 149 no Primary
shard1 active 1 mongodb 6/beta 149 no Primary
Unit Workload Agent Machine Public address Ports Message
config-server/0* active idle 0 10.67.56.193 27017-27018/tcp Primary
data-integrator/0* active idle 6 10.67.56.187
mongos/0* active idle 10.67.56.187 27018/tcp
shard0/0* active idle 1 10.67.56.197 27017/tcp Primary
shard1/0* active idle 2 10.67.56.194 27017/tcp Primary
Machine State Address Inst id Base AZ Message
0 started 10.67.56.193 juju-5646f0-0 ubuntu@22.04 Running
1 started 10.67.56.197 juju-5646f0-1 ubuntu@22.04 Running
2 started 10.67.56.194 juju-5646f0-2 ubuntu@22.04 Running
6 started 10.67.56.187 juju-5646f0-6 ubuntu@22.04 Running
Integration provider Requirer Interface Type Message
config-server:cluster mongos:cluster config-server regular
config-server:config-server shard0:sharding shards regular
config-server:config-server shard1:sharding shards regular
config-server:database-peers config-server:database-peers mongodb-peers peer
data-integrator:data-integrator-peers data-integrator:data-integrator-peers data-integrator-peers peer
data-integrator:mongos mongos:mongos_proxy mongos_client subordinate
mongos:router-peers mongos:router-peers mongos-peers peer
shard0:database-peers shard0:database-peers mongodb-peers peer
shard1:database-peers shard1:database-peers mongodb-peers peer
Retrieve the mongos
URI
juju run data-integrator/leader get-credentials
This should output something like:
Running operation 19 with 1 task
- task 20 on unit-data-integrator-2
Waiting for task 20...
mongos:
data: '{"database": "test-database", "external-node-connectivity": "true", "requested-secrets":
"[\"username\", \"password\", \"tls\", \"tls-ca\", \"uris\"]"}'
database: test-database
password: gRBRV3SAVV9hKWHxocI7KyZgkQgP184W
uris: mongodb://relation-16:gRBRV3SAVV9hKWHxocI7KyZgkQgP184W@10.67.56.187:27018/test-database?&authSource=admin
username: relation-16
ok: "True"
Save the value listed under uris
. We will use this later to access the database through mongos
.
Access the integrated database
Instead of connecting tomongos
via the config-server
application like we did in 3. Access a sharded cluster, we will access mongos
directly via the host application. This is because each application related to the sharded mongodb cluster will have their own mongos
router.
Additionally, the sharded cluster from Charmed MongoDB will automatically create a special username and password for the data-integrator
charm. This is the best way to access the sharded Charmed MongoDB cluster.
Access the unit hosting mongos
:
juju ssh mongos/0
Then, access the MongoDB shell with the URI you saved in the previous step. Make sure to wrap the URI in "
with no trailing whitespace:
charmed-mongodb.mongosh "<URI>"
You are now in the MongoDB shell as a new user created specifically for the data-integrator
charm.
When you relate two applications, Charmed MongoDB automatically sets up a user and database for you. Enter db.getName()
into the MongoDB shell, this will output:
test-database
This is the name of the database we specified when we first deployed the data-integrator
charm.
To create a collection in test-database
and then show the collection, enter:
db.createCollection("test-collection")
show collections
Now insert a document into this database:
db.test_collection.insertOne(
{
First_Name: "Jammy",
Last_Name: "Jellyfish",
})
You can verify this document was inserted by running:
db.test_collection.find()
Leave the MongoDB shell by typing exit
.
You will be back in the host of Charmed MongoDB (mongodb/0
). Exit this host by typing exit
again.
You should now be at the original shell where you can interact with Juju and LXD.
Remove the user
Removing the integration automatically removes the user that was created with it, and stops themongos
router.
To remove the relation, run:
juju remove-relation mongos config-server
Now try again to connect to the same URI you just used to access the integrated database:
juju ssh mongos/0
charmed-mongodb.mongosh "<URI>"
You will see an error like the one shown below, since the user no longer exists.
MongoNetworkError: connect ECONNREFUSED 10.67.56.187:27018
Now run exit
once to leave the unit.
You should now be in the shell you started in where you can interact with Juju and LXD.
Recreate the user
If you wanted to recreate this user all you would need to do is relate the the two applications again:
juju integrate config-server mongos
Re-relating generates a new password for this user, and therefore a new URI you can see the new URI with:
juju run data-integrator/leader get-credentials
Next step: 7. Enable security