Creating MuleSoft Persistent Object Store using Persistence Gateway on RTF on EKS
Authors: Joyce Thoppil, Chandradeep Bhattacharjee
Date: 9th May 2022
Abstract
This article enlists the steps required for setting up MuleSoft RTF Persistent Object Store and verify the object store data in the postgres db used for the same
Anypoint Runtime Fabric provides Persistence Gateway, which enables Mule applications deployed to a Mule runtime instance to store and share data across application replicas and restarts.
During configuration, Persistence Gateway creates the required database schema. Afterwards, when an application deployed to Runtime Fabric is configured to use persistent object storage, the Persistence Gateway writes the necessary rows to the database.
This article will show the creation of this Persistence Gateway using an external Postgres db and verify the object store data in the same.
Prerequisites
· Postgres database - We’ll need a postgres database to use as an external data store. This database must be compatible with a supported version of PostgresSQL.
In order to successfully deploy Mule applications to Runtime Fabric you also need:
Steps to create the Persistence Gateway using Postgres db:
Step 1. Create a Kubernetes secret:
kubectl create secret generic <SECRET NAME> -n rtf --from-literal=persistence-gateway-creds=postgres://username:pass@host:port/databasename
o Do not change --from-literal=persistence-gateway-creds. You can replace <SECRET NAME> with any value you want to use for the secret.
o Do not use the "@" character in the database username.
Note: After creation of the secret, if we get unknown host error in the pod logs, then try replacing the host with cluster IP by following below steps:
To get the cluster ip of the postgres db,
1. kubectl config set-context --current --namespace=<namespace where postgres database is installed>
2. kubectl get services -n <namespace where postgres database is installed>
and use the ip of the db host
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
estoredb ClusterIP 10.100.54.107 <none> 5432/TCP 24d
3. use the ip in the command below eg:
kubectl create secret generic cbrtf -n rtf --from-literal=persistence-gateway-creds= postgres://username:pass@10.100.54.107:port/databasename
Step 2: Create a custom resource for your data store. For doing this,
Copy the custom resource template like below to a file called custom-resource.yaml.
apiVersion: rtf.mulesoft.com/v1
kind: PersistenceGateway
metadata:
name: default
namespace: rtf
spec:
objectStore:
backendDriver: postgresql
maxBackendConnectionPool: 20
replicas: 2
secretRef:
name: <SECRET NAME>
resources:
limits:
cpu: 250m
memory: 250Mi
requests:
cpu: 200m
memory: 75Mi
Step 3. Ensure the value of secretRef: name matches the name field defined in your Kubernetes secret file.
Step 4. Run kubectl apply -f custom-resource.yaml.
Step 5. Check the logs of the Persistence Gateway pod to ensure it can communicate with the database:
kubectl get pods -n rtf
(Note: rtf is the namespace used in the template)
Recommended by LinkedIn
Step 6. Look for pods with the name prefix persistence-gateway
kubectl logs -f persistence-gateway-6dfb98949c-7xns9 -n rtf
The output of this command should be similar to the following:
2021/04/09 16:35:31 Connecting to PostgreSQL backend...
2021/04/09 16:35:32 Starting watcher for /var/run/secrets/rtf-object-store/persistence-gateway-creds
2021/04/09 16:35:32 Watching for changes on /var/run/secrets/rtf-object-store/persistence-gateway-creds
2021/04/09 16:35:35 Succesfully connected to the PostgreSQL backend.
192.168.2.101 - - [09/Apr/2021:16:35:55 +0000] "GET /api/v1/status/ready HTTP/1.1" 200 2 "" "kube-probe/1.18+"
Steps to verify the object store data is stored in the persistent store of postgres database :
Step1: Go to the namespace of the database
kubectl config set-context --current --namespace=<namespace of the postgresdb>
Step2: Find the podname where the DB is installed:
kubectl get pods -n <namespace of the db cluster>
NAME READY STATUS RESTARTS AGE
postgres-6d58bffb7-vh4bk 1/1 Running 0 22d
Step3: Go to the pod where DB is installed:
kubectl exec <podname> -c postgres -i -t -- bash -il
Step4: After executing above command, you will be entering in the pod where we can run the below psql command
psql -d <dbname> -U <username>
Step 5: Once inside the database, run below command to get list of tables:
\dt
Example Output:
List of relations
Schema | Name | Type | Owner
--------+-----------------+-------+--------
public | cart | table | estore
public | product_inventy | table | estore
public | products | table | estore
(3 rows)
Then run the below command to verify the object store data is present in your required table:
select * from "items"; (where items is example of your table name)
eg output:
3 | 1 | 104 | Object_store | BINARY | 0 | | \x9692d7ad08010100cb016f72672e6d756c652e72756e74696d652e636f72652e696e7465726e616c2e6576656e742e44656661756c744576656e74436
f6e74657874244368696c644576656e74436f6e74657874800101016a6176612e7574696c2e636f6e63757272656e742e6c6f636b732e5265656e7472616e745265616457726974654c6f63eb800101026a6176612e7574696c2e636f6e63757272656e742e6
Conclusion
With this, we can verify our object store data is stored inside the external persistent object store which is postgres db using persistence gateway for our RTF MuleSoft instance
Reference:
Joyce Thoppil - very detailed and insight writeup. Thanks for sharing.