Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Clarify actor state store support for MongoDB #3990

Merged
merged 9 commits into from
Feb 2, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -47,67 +47,54 @@ spec:
The above example uses secrets as plain strings. It is recommended to use a secret store for the secrets as described [here]({{< ref component-secrets.md >}}).
{{% /alert %}}

If you wish to use MongoDB as an actor store, append the following to the yaml.
### Actor state store and transactions support

When using as an actor state store or to leverage transactions, MongoDB must be running in a [Replica Set](https://www.mongodb.com/docs/manual/replication/).

If you wish to use MongoDB as an actor store, add this metadata option to your Component YAML:

```yaml
- name: actorStateStore
value: "true"
```


## Spec metadata fields

| Field | Required | Details | Example |
|--------------------|:--------:|---------|---------|
| server | Y<sup>*</sup> | The server to connect to, when using DNS SRV record | `"server.example.com"`
| host | Y<sup>*</sup> | The host to connect to | `"mongo-mongodb.default.svc.cluster.local:27017"`
| server | Y<sup>1</sup> | The server to connect to, when using DNS SRV record | `"server.example.com"`
| host | Y<sup>1</sup> | The host to connect to | `"mongo-mongodb.default.svc.cluster.local:27017"`
| username | N | The username of the user to connect with (applicable in conjunction with `host`) | `"admin"`
| password | N | The password of the user (applicable in conjunction with `host`) | `"password"`
| databaseName | N | The name of the database to use. Defaults to `"daprStore"` | `"daprStore"`
| collectionName | N | The name of the collection to use. Defaults to `"daprCollection"` | `"daprCollection"`
| writeConcern | N | The write concern to use | `"majority"`
| readConcern | N | The read concern to use | `"majority"`, `"local"`,`"available"`, `"linearizable"`, `"snapshot"`
| operationTimeout | N | The timeout for the operation. Defaults to `"5s"` | `"5s"`
| params | N<sup>**</sup> | Additional parameters to use | `"?authSource=daprStore&ssl=true"`
| params | N<sup>2</sup> | Additional parameters to use | `"?authSource=daprStore&ssl=true"`

> <sup>[*]</sup> The `server` and `host` fields are mutually exclusive. If neither or both are set, Dapr will return an error.
> <sup>[1]</sup> The `server` and `host` fields are mutually exclusive. If neither or both are set, Dapr returns an error.

> <sup>[**]</sup> The `params` field accepts a query string that specifies connection specific options as `<name>=<value>` pairs, separated by `"&"` and prefixed with `"?"`. e.g. to use "daprStore" db as authentication database and enabling SSL/TLS in connection, specify params as `"?authSource=daprStore&ssl=true"`. See [the mongodb manual](https://docs.mongodb.com/manual/reference/connection-string/#std-label-connections-connection-options) for the list of available options and their use cases.
> <sup>[2]</sup> The `params` field accepts a query string that specifies connection specific options as `<name>=<value>` pairs, separated by `&` and prefixed with `?`. e.g. to use "daprStore" db as authentication database and enabling SSL/TLS in connection, specify params as `?authSource=daprStore&ssl=true`. See [the mongodb manual](https://docs.mongodb.com/manual/reference/connection-string/#std-label-connections-connection-options) for the list of available options and their use cases.

## Setup MongoDB
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be great if we could point to a resource on how to set up mongoDB replica sets easily as pointed out here https://stackoverflow.com/questions/51461952/mongodb-v4-0-transaction-mongoerror-transaction-numbers-are-only-allowed-on-a. Do you have a suggestion, or better still is there a public container image that could be downloaded and used?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

  • Docker: I added a link to how to set up a RS using Docker. It's not a simple process, and requires a bunch of steps, so I think it's best to link to the official docs
  • K8s: Looks like the Helm chart we recommended for K8s was archived. I've changed the recommendation to use the Helm chart by Bitnami, which also supports configuring Replica Sets. Since there are many options, and it depends on the architecture you choose (single node or RS), I've just added a link


{{< tabs "Self-Hosted" "Kubernetes" >}}

{{% codetab %}}
You can run MongoDB locally using Docker:
You can run a single MongoDB instance locally using Docker:

```
```sh
docker run --name some-mongo -d mongo
```

You can then interact with the server using `localhost:27017`.

If you do not specify a `databaseName` value in your component definition, make sure to create a database named `daprStore`.
You can then interact with the server at `localhost:27017`. If you do not specify a `databaseName` value in your component definition, make sure to create a database named `daprStore`.

In order to use the MongoDB state store for transactions and as an actor state store, you will need to run MongoDB as a Replica Set. Please refer to [the official documentation](https://www.mongodb.com/compatibility/deploying-a-mongodb-cluster-with-docker) for how to create a 3-node Replica Set using Docker.
msfussell marked this conversation as resolved.
Show resolved Hide resolved
{{% /codetab %}}

{{% codetab %}}
The easiest way to install MongoDB on Kubernetes is by using the [Helm chart](https://github.com/helm/charts/tree/master/stable/mongodb):

```
helm install mongo stable/mongodb
```

This installs MongoDB into the `default` namespace.
To interact with MongoDB, find the service with: `kubectl get svc mongo-mongodb`.

For example, if installing using the example above, the MongoDB host address would be:

`mongo-mongodb.default.svc.cluster.local:27017`


Follow the on-screen instructions to get the root password for MongoDB.
The username is `admin` by default.
You can conveniently install MongoDB on Kubernetes using the [Helm chart packaged by Bitnami](https://github.com/bitnami/charts/tree/main/bitnami/mongodb/). Please refer to the documentation for the Helm chart for deploying MongoDB, both as a standalone server, and with a Replica Set (required for using transactions and actors).
msfussell marked this conversation as resolved.
Show resolved Hide resolved
{{% /codetab %}}

{{< /tabs >}}
Expand All @@ -117,6 +104,7 @@ The username is `admin` by default.
This state store supports [Time-To-Live (TTL)]({{< ref state-store-ttl.md >}}) for records stored with Dapr. When storing data using Dapr, you can set the `ttlInSeconds` metadata property to indicate when the data should be considered "expired".

## Related links

- [Basic schema for a Dapr component]({{< ref component-schema >}})
- Read [this guide]({{< ref "howto-get-save-state.md#step-2-save-and-retrieve-a-single-state" >}}) for instructions on configuring state store components
- [State management building block]({{< ref state-management >}})
Loading