From 58ba5f8a47ea5dd4633501ef79f5effa0fab7949 Mon Sep 17 00:00:00 2001 From: Byron Ruth Date: Wed, 22 Feb 2023 08:35:28 -0500 Subject: [PATCH] Update to use leaf nodes Signed-off-by: Byron Ruth --- .../use-cases/active-active-kv/cli/Dockerfile | 19 +++ .../use-cases/active-active-kv/cli/main.sh | 130 ++++++++++++++++++ .../cli/n1-edit.json | 17 ++- .../cli/n2-edit.json | 17 ++- .../docker-compose.yaml | 0 examples/use-cases/active-active-kv/meta.yaml | 5 + .../use-cases/faux-active-active/cli/main.sh | 76 ---------- .../use-cases/faux-active-active/cli/n1.json | 21 --- .../use-cases/faux-active-active/cli/n2.json | 21 --- .../use-cases/faux-active-active/meta.yaml | 2 - 10 files changed, 174 insertions(+), 134 deletions(-) create mode 100644 examples/use-cases/active-active-kv/cli/Dockerfile create mode 100644 examples/use-cases/active-active-kv/cli/main.sh rename examples/use-cases/{faux-active-active => active-active-kv}/cli/n1-edit.json (58%) rename examples/use-cases/{faux-active-active => active-active-kv}/cli/n2-edit.json (58%) rename examples/use-cases/{faux-active-active => active-active-kv}/docker-compose.yaml (100%) create mode 100644 examples/use-cases/active-active-kv/meta.yaml delete mode 100644 examples/use-cases/faux-active-active/cli/main.sh delete mode 100644 examples/use-cases/faux-active-active/cli/n1.json delete mode 100644 examples/use-cases/faux-active-active/cli/n2.json delete mode 100644 examples/use-cases/faux-active-active/meta.yaml diff --git a/examples/use-cases/active-active-kv/cli/Dockerfile b/examples/use-cases/active-active-kv/cli/Dockerfile new file mode 100644 index 00000000..7d345ac1 --- /dev/null +++ b/examples/use-cases/active-active-kv/cli/Dockerfile @@ -0,0 +1,19 @@ +FROM golang:1.19-alpine3.17 AS build + +RUN apk update && apk add git + +RUN go install github.com/nats-io/natscli/nats@main +RUN go install github.com/nats-io/nats-server/v2@dev + +FROM alpine:3.17 + +RUN apk add bash curl + +COPY --from=build /go/bin/nats-server /usr/local/bin/ +COPY --from=build /go/bin/nats /usr/local/bin/ + +COPY . . + +ENTRYPOINT ["bash"] + +CMD ["main.sh"] diff --git a/examples/use-cases/active-active-kv/cli/main.sh b/examples/use-cases/active-active-kv/cli/main.sh new file mode 100644 index 00000000..6d234fcd --- /dev/null +++ b/examples/use-cases/active-active-kv/cli/main.sh @@ -0,0 +1,130 @@ +#!/bin/sh + +set -euo pipefail + +# Define configuration for two nodes. +cat <<- EOF > n1.conf +port: 4222 +http_port: 8222 +server_name: n1 + +mappings: { + "\$KV.mykv.>" : "\$KV.mykv.n1.>" +} + +jetstream: { + domain: n1 + store_dir: "./n1" +} + +leafnodes: { + port: 7422 + remotes = [ + { + url: "nats-leaf://localhost:7423" + } + ] +} +EOF + +cat <<- EOF > n2.conf +port: 4223 +http_port: 8223 +server_name: n2 + +mappings: { + "\$KV.mykv.>" : "\$KV.mykv.n2.>" +} + +jetstream: { + domain: n2 + store_dir: "./n2" +} + +leafnodes: { + port: 7423 + remotes = [ + { + url: "nats-leaf://localhost:7422" + } + ] +} +EOF + + +# Start the servers and sleep for a few seconds to startup. +nats-server -c n1.conf > /dev/null 2>&1 & +N1_PID=$! + +nats-server -c n2.conf > /dev/null 2>&1 & +N2_PID=$! + +sleep 3 + +# Wait until the servers are healthy. +curl --fail --silent \ + --retry 10 \ + --retry-delay 1 \ + http://localhost:8222/healthz > /dev/null + +curl --fail --silent \ + --retry 10 \ + --retry-delay 1 \ + http://localhost:8223/healthz > /dev/null + +# Save two contexts, one for each leaf. +nats context save n1 \ + --server nats://localhost:4222 + +nats context save n2 \ + --server nats://localhost:4223 + +# Create a KV on each leaf. +nats --context=n1 kv add mykv --history=10 +nats --context=n2 kv add mykv --history=10 + +# Edit to source from one another with a subject transform. +# e.g. $KV.mykv.> -> $KV.mykv.> and vice versa for the other. +nats --context=n1 stream edit --force --config n1-edit.json KV_mykv +nats --context=n2 stream edit --force --config n2-edit.json KV_mykv + +# Put one value each. +nats --context=n1 kv put mykv foo '' +nats --context=n2 kv put mykv foo '' + +echo 'Messages in n1 KV...' +nats --context=n1 stream view KV_mykv + +echo 'Messages in n2 KV...' +nats --context=n2 stream view KV_mykv + +# Report the streams. Each should have two messages. +nats --context=n1 stream report +nats --context=n2 stream report + +# Take n1 down. +nats-server --signal=quit=$N1_PID + +# Put two more keys in n2. +nats --context=n2 kv put mykv baz '' +nats --context=n2 kv put mykv qux '' + +# Report on n2, which should not have four messages. +nats --context=n2 stream report +nats --context=n2 stream view KV_mykv + +# Turn n1 back on. +nats-server -c n1.conf & #> /dev/null 2>&1 & +N1_PID=$! + +sleep 2 + +# Wait for healthy. +curl --fail --silent \ + --retry 10 \ + --retry-delay 1 \ + http://localhost:8222/healthz > /dev/null + +# Let n1 catch up with messages from n2 +nats --context=n1 stream report +nats --context=n1 stream view KV_mykv diff --git a/examples/use-cases/faux-active-active/cli/n1-edit.json b/examples/use-cases/active-active-kv/cli/n1-edit.json similarity index 58% rename from examples/use-cases/faux-active-active/cli/n1-edit.json rename to examples/use-cases/active-active-kv/cli/n1-edit.json index eb12d28d..32046ee5 100644 --- a/examples/use-cases/faux-active-active/cli/n1-edit.json +++ b/examples/use-cases/active-active-kv/cli/n1-edit.json @@ -1,11 +1,12 @@ { - "name": "KV_n1", + "name": "KV_mykv", "subjects": [ - "$KV.n1.\u003e" + "$KV.mykv.\u003e" ], + "placement": {}, "retention": "limits", "max_consumers": -1, - "max_msgs_per_subject": 5, + "max_msgs_per_subject": 10, "max_msgs": -1, "max_bytes": -1, "max_age": 0, @@ -13,7 +14,7 @@ "storage": "file", "discard": "new", "num_replicas": 1, - "duplicate_window": 12000000000, + "duplicate_window": 120000000000, "sealed": false, "deny_delete": true, "deny_purge": false, @@ -21,9 +22,11 @@ "allow_direct": true, "sources": [ { - "name": "KV_n2", - "filter_subject": "$KV.n2.\u003e", - "subject_transform_dest": "$KV.n1.\u003e" + "name": "KV_mykv", + "filter_subject": "$KV.mykv.n2.\u003e", + "external": { + "api": "$JS.n2.API" + } } ] } diff --git a/examples/use-cases/faux-active-active/cli/n2-edit.json b/examples/use-cases/active-active-kv/cli/n2-edit.json similarity index 58% rename from examples/use-cases/faux-active-active/cli/n2-edit.json rename to examples/use-cases/active-active-kv/cli/n2-edit.json index 54eec320..7f006aa4 100644 --- a/examples/use-cases/faux-active-active/cli/n2-edit.json +++ b/examples/use-cases/active-active-kv/cli/n2-edit.json @@ -1,11 +1,12 @@ { - "name": "KV_n2", + "name": "KV_mykv", "subjects": [ - "$KV.n2.\u003e" + "$KV.mykv.\u003e" ], + "placement": {}, "retention": "limits", "max_consumers": -1, - "max_msgs_per_subject": 5, + "max_msgs_per_subject": 10, "max_msgs": -1, "max_bytes": -1, "max_age": 0, @@ -13,7 +14,7 @@ "storage": "file", "discard": "new", "num_replicas": 1, - "duplicate_window": 12000000000, + "duplicate_window": 120000000000, "sealed": false, "deny_delete": true, "deny_purge": false, @@ -21,9 +22,11 @@ "allow_direct": true, "sources": [ { - "name": "KV_n1", - "filter_subject": "$KV.n1.\u003e", - "subject_transform_dest": "$KV.n2.\u003e" + "name": "KV_mykv", + "filter_subject": "$KV.mykv.n1.\u003e", + "external": { + "api": "$JS.n1.API" + } } ] } diff --git a/examples/use-cases/faux-active-active/docker-compose.yaml b/examples/use-cases/active-active-kv/docker-compose.yaml similarity index 100% rename from examples/use-cases/faux-active-active/docker-compose.yaml rename to examples/use-cases/active-active-kv/docker-compose.yaml diff --git a/examples/use-cases/active-active-kv/meta.yaml b/examples/use-cases/active-active-kv/meta.yaml new file mode 100644 index 00000000..e37fce18 --- /dev/null +++ b/examples/use-cases/active-active-kv/meta.yaml @@ -0,0 +1,5 @@ +title: Active-active KV +description: |- + This example shows how to model two KV streams, placed on + separate nodes (on a two-node cluster) that will source + entries from each other. diff --git a/examples/use-cases/faux-active-active/cli/main.sh b/examples/use-cases/faux-active-active/cli/main.sh deleted file mode 100644 index eb374b91..00000000 --- a/examples/use-cases/faux-active-active/cli/main.sh +++ /dev/null @@ -1,76 +0,0 @@ -#!/bin/sh - -set -euo pipefail - -# Define configuration for two nodes. -cat <<- EOF > n1.conf -port: 4222 -http_port: 8222 -server_name: n1 - -jetstream: {} - -cluster: { - name: c1, - port: 6222, - routes: [ - "nats-route://0.0.0.0:6222" - "nats-route://0.0.0.0:6223" - ], -} -EOF - -cat <<- EOF > n2.conf -port: 4223 -http_port: 8223 -server_name: n2 - -jetstream: {} - -cluster: { - name: c1, - port: 6223, - routes: [ - "nats-route://0.0.0.0:6222" - "nats-route://0.0.0.0:6223" - ], -} -EOF - - -# Start the servers and sleep for a few seconds to startup. -nats-server -c n1.conf > /dev/null 2>&1 & -nats-server -c n2.conf > /dev/null 2>&1 & - -sleep 3 - -# Wait until the servers are healthy. -curl --fail --silent \ - --retry 10 \ - --retry-delay 1 \ - http://localhost:8222/healthz > /dev/null - -# Create the two streams with their own respective subjects. -nats kv add n1 --history=10 -nats kv add n2 --history=10 - -# Edit the streams to source from each other, filtered to the -# stream's bounded subject. -nats stream edit --force --config n1-edit.json KV_n1 -nats stream edit --force --config n2-edit.json KV_n2 - -# Publish a message to each stream. -nats kv put n1 foo -nats kv put n2 bar - -# Both streams should have two messages (in different orders). -echo 'List n1:' -nats kv list n1 -nats stream view KV_n1 - -echo 'List n2:' -nats kv list n2 -nats stream view KV_n2 - -nats stream report -nats stream report diff --git a/examples/use-cases/faux-active-active/cli/n1.json b/examples/use-cases/faux-active-active/cli/n1.json deleted file mode 100644 index 44bdd595..00000000 --- a/examples/use-cases/faux-active-active/cli/n1.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "KV_n1", - "subjects": [ - "n1.\u003e" - ], - "retention": "limits", - "max_consumers": -1, - "max_msgs_per_subject": 10, - "max_msgs": -1, - "max_bytes": -1, - "max_age": 0, - "max_msg_size": -1, - "storage": "file", - "discard": "old", - "num_replicas": 1, - "duplicate_window": 12000000000, - "sealed": false, - "deny_delete": false, - "deny_purge": false, - "allow_rollup_hdrs": true -} diff --git a/examples/use-cases/faux-active-active/cli/n2.json b/examples/use-cases/faux-active-active/cli/n2.json deleted file mode 100644 index d6abf5ab..00000000 --- a/examples/use-cases/faux-active-active/cli/n2.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "KV_n2", - "subjects": [ - "n2.\u003e" - ], - "retention": "limits", - "max_consumers": -1, - "max_msgs_per_subject": 10, - "max_msgs": -1, - "max_bytes": -1, - "max_age": 0, - "max_msg_size": -1, - "storage": "file", - "discard": "old", - "num_replicas": 1, - "duplicate_window": 12000000000, - "sealed": false, - "deny_delete": false, - "deny_purge": false, - "allow_rollup_hdrs": true -} diff --git a/examples/use-cases/faux-active-active/meta.yaml b/examples/use-cases/faux-active-active/meta.yaml deleted file mode 100644 index a88775d6..00000000 --- a/examples/use-cases/faux-active-active/meta.yaml +++ /dev/null @@ -1,2 +0,0 @@ -title: Faux active-active with stream sources -description: |-