From ce3996faabba9196572c7ac1ffb868962b7b1214 Mon Sep 17 00:00:00 2001 From: Colin Sullivan Date: Sun, 28 Feb 2021 14:43:16 -0700 Subject: [PATCH] add replication Signed-off-by: Colin Sullivan --- assets/images/replication-setup.png | Bin 0 -> 18016 bytes assets/images/replication.png | Bin 0 -> 15453 bytes jetstream/data_replication/replication.md | 169 ++++++++++++++++++++++ 3 files changed, 169 insertions(+) create mode 100644 assets/images/replication-setup.png create mode 100644 assets/images/replication.png create mode 100644 jetstream/data_replication/replication.md diff --git a/assets/images/replication-setup.png b/assets/images/replication-setup.png new file mode 100644 index 0000000000000000000000000000000000000000..7d14c7d0e31828d5f2e59d0b6f98b18e32d9851b GIT binary patch literal 18016 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 qEJgqOI5POc6{Md7Re3tI+ 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 literal 0 HcmV?d00001 diff --git a/jetstream/data_replication/replication.md b/jetstream/data_replication/replication.md new file mode 100644 index 0000000..632f22f --- /dev/null +++ b/jetstream/data_replication/replication.md @@ -0,0 +1,169 @@ +## Data Replication + +Replication allow you to move data between streams in either a 1:1 mirror style or by multiplexing multiple source streams into a new stream. In future builds this will allow data to be replicated between accounts as well, ideal for sending data from a Leafnode into a central store. + +![](../../assets/images/replication.png) + +Here we have 2 main streams - _ORDERS_ and _RETURNS_ - these streams are clustered across 3 nodes. These Streams have short retention periods and are memory based. + +We create a _ARCHIVE_ stream that has 2 _sources_ set, the _ARCHIVE_ will pull data from the sources into itself. This stream has a very long retention period and is file based and replicated across 3 nodes. Additional messages can be added to the ARCHIVE by sending to it directly. + +Finally, we create a _REPORT_ stream mirrored from _ARCHIVE_ that is not clustered and retains data for a month. The _REPORT_ Stream does not listen for any incoming messages, it can only consume data from _ARCHIVE_. + +### Mirrors + +A *mirror* copies data from 1 other stream, as far as possible IDs and ordering will match exactly the source. A *mirror* does not listen on a subject for any data to be added. The Start Sequence and Start Time can be set, but no subject filter. A stream can only have 1 *mirror* and if it is a mirror it cannot also have any *source*. + +### Sources + +A *source* is a stream where data is copied from, one stream can have multiple sources and will read data in from them all. The stream will also listen for messages on it's own subject. We can therefore not maintain absolute ordering, but data from 1 single source will be in the correct order but mixed in with other streams. You might also find the timestamps of streams can be older and newer mixed in together as a result. + +A Stream with sources may also listen on subjects, but could have no listening subject. When using the `nats` CLI to create sourced streams use `--subjects` to supply subjects to listen on. + +A source can have start time or start sequence and can filter by a subject. + +### Configuration + +The ORDERS and RETURNS streams as normal, I will not show how to create them. + +```nohighlight +$ nats s report +Obtaining Stream stats + ++---------+---------+----------+-----------+----------+-------+------+---------+----------------------+ +| Stream | Storage | Template | Consumers | Messages | Bytes | Lost | Deleted | Cluster | ++---------+---------+----------+-----------+----------+-------+------+---------+----------------------+ +| ORDERS | Memory | | 0 | 0 | 0 B | 0 | 0 | n1-c2, n2-c2*, n3-c2 | +| RETURNS | Memory | | 0 | 0 | 0 B | 0 | 0 | n1-c2*, n2-c2, n3-c2 | ++---------+---------+----------+-----------+----------+-------+------+---------+----------------------+ +``` + +We now add the ARCHIVE: + +```nohighlight +$ nats s add ARCHIVE --source ORDERS --source RETURNS +? Storage backend file +? Retention Policy Limits +? Discard Policy Old +? Message count limit -1 +? Message size limit -1 +? Maximum message age limit -1 +? Maximum individual message size -1 +? Duplicate tracking time window 2m +? Number of replicas to store 3 +? ORDERS Source Start Sequence 0 +? ORDERS Source UTC Time Stamp (YYYY:MM:DD HH:MM:SS) +? ORDERS Source Filter source by subject +? RETURNS Source Start Sequence 0 +? RETURNS Source UTC Time Stamp (YYYY:MM:DD HH:MM:SS) +? RETURNS Source Filter source by subject +``` + +And we add the REPORT: + +```nohighlight +$ nats s add REPORT --mirror ARCHIVE +? Storage backend file +? Retention Policy Limits +? Discard Policy Old +? Message count limit -1 +? Message size limit -1 +? Maximum message age limit 1M +? Maximum individual message size -1 +? Duplicate tracking time window 2m +? Number of replicas to store 1 +? Mirror Start Sequence 0 +? Mirror Start Time (YYYY:MM:DD HH:MM:SS) +? Mirror subject filter +``` + +When configured we'll see some additional information in a `nats stream info` output: + +```nohighlight +$ nats stream info ARCHIVE +... +Source Information: + + Stream Name: ORDERS + Lag: 0 + Last Seen: 2m23s + + Stream Name: RETURNS + Lag: 0 + Last Seen: 2m15s +... + +$ nats stream info REPORT +... +Mirror Information: + + Stream Name: ARCHIVE + Lag: 0 + Last Seen: 2m35s +... +``` + +Here the `Lag` is how far behind we were reported as being last time we saw a message. + +We can confirm all our setup using a `nats stream report`: + +```nohighlight +$ nats s report ++-------------------------------------------------------------------------------------------------------------------+ +| Stream Report | ++---------+---------+----------+-------------+-----------+----------+-------+------+---------+----------------------+ +| Stream | Storage | Template | Replication | Consumers | Messages | Bytes | Lost | Deleted | Cluster | ++---------+---------+----------+-------------+-----------+----------+-------+------+---------+----------------------+ +| ARCHIVE | File | | Sourced | 1 | 0 | 0 B | 0 | 0 | n1-c2*, n2-c2, n3-c2 | +| ORDERS | Memory | | | 1 | 0 | 0 B | 0 | 0 | n1-c2, n2-c2*, n3-c2 | +| REPORT | File | | Mirror | 0 | 0 | 0 B | 0 | 0 | n1-c2* | +| RETURNS | Memory | | | 1 | 0 | 0 B | 0 | 0 | n1-c2, n2-c2, n3-c2* | ++---------+---------+----------+-------------+-----------+----------+-------+------+---------+----------------------+ + ++---------------------------------------------------------+ +| Replication Report | ++---------+--------+---------------+--------+-----+-------+ +| Stream | Kind | Source Stream | Active | Lag | Error | ++---------+--------+---------------+--------+-----+-------+ +| ARCHIVE | Source | ORDERS | never | 0 | | +| ARCHIVE | Source | RETURNS | never | 0 | | +| REPORT | Mirror | ARCHIVE | never | 0 | | ++---------+--------+---------------+--------+-----+-------+ +``` + +We then create some data in both ORDERS and RETURNS: + +```nohighlight +$ nats req ORDERS.new "ORDER {{Count}}" --count 100 +$ nats req RETURNS.new "RETURN {{Count}}" --count 100 +``` + +We can now see from a Stream Report that the data has been replicated: + +```nohighlight +$ nats s report --dot replication.dot +Obtaining Stream stats + ++---------+---------+----------+-----------+----------+---------+------+---------+----------------------+ +| Stream | Storage | Template | Consumers | Messages | Bytes | Lost | Deleted | Cluster | ++---------+---------+----------+-----------+----------+---------+------+---------+----------------------+ +| ORDERS | Memory | | 1 | 100 | 3.3 KiB | 0 | 0 | n1-c2, n2-c2*, n3-c2 | +| RETURNS | Memory | | 1 | 100 | 3.5 KiB | 0 | 0 | n1-c2*, n2-c2, n3-c2 | +| ARCHIVE | File | | 1 | 200 | 27 KiB | 0 | 0 | n1-c2, n2-c2, n3-c2* | +| REPORT | File | | 0 | 200 | 27 KiB | 0 | 0 | n1-c2* | ++---------+---------+----------+-----------+----------+---------+------+---------+----------------------+ + ++---------------------------------------------------------+ +| Replication Report | ++---------+--------+---------------+--------+-----+-------+ +| Stream | Kind | Source Stream | Active | Lag | Error | ++---------+--------+---------------+--------+-----+-------+ +| ARCHIVE | Source | ORDERS | 14.48s | 0 | | +| ARCHIVE | Source | RETURNS | 9.83s | 0 | | +| REPORT | Mirror | ARCHIVE | 9.82s | 0 | | ++---------+--------+---------------+--------+-----+-------+ +``` + +Here we also pass the `--dot replication.dot` argument that writes a GraphViz format map of the replication setup. + +![](../../assets/images/replication-setup.png) \ No newline at end of file