{"componentChunkName":"component---src-templates-tags-js","path":"/tags/migration/1","result":{"pageContext":{"tag":"migration","urlTag":"migration","chunk":[{"content":"<p dir=\"auto\"><a href=\"https://github.com/datastax/cql-proxy/actions/workflows/test.yml\"><img src=\"https://github.com/datastax/cql-proxy/actions/workflows/test.yml/badge.svg\" alt=\"GitHub Action\" class=\"c13\" referrerpolicy=\"no-referrer\" /></a> <a href=\"https://goreportcard.com/report/github.com/datastax/cql-proxy\" rel=\"nofollow\"><img src=\"https://camo.githubusercontent.com/e1c32ff51117d37ba38fd853bb54c63214d25a3a367d0de90a00a03124924acb/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f64617461737461782f63716c2d70726f7879\" alt=\"Go Report Card\" data-canonical-src=\"https://goreportcard.com/badge/github.com/datastax/cql-proxy\" class=\"c13\" referrerpolicy=\"no-referrer\" /></a></p><p dir=\"auto\"><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/datastax/cql-proxy/blob/main/cql-proxy.png\"><img src=\"https://github.com/datastax/cql-proxy/raw/main/cql-proxy.png\" alt=\"cql-proxy\" class=\"c13\" referrerpolicy=\"no-referrer\" /></a></p><p dir=\"auto\"><code>cql-proxy</code> is designed to forward your application's CQL traffic to an appropriate database service. It listens on a local address and securely forwards that traffic.</p><p dir=\"auto\">The <code>cql-proxy</code> sidecar enables unsupported CQL drivers to work with <a href=\"https://astra.datastax.com/\" rel=\"nofollow\">DataStax Astra</a>. These drivers include both legacy DataStax <a href=\"https://docs.datastax.com/en/driver-matrix/doc/driver_matrix/common/driverMatrix.html\" rel=\"nofollow\">drivers</a> and community-maintained CQL drivers, such as the <a href=\"https://github.com/gocql/gocql\">gocql</a> driver and the <a href=\"https://github.com/scylladb/scylla-rust-driver\">rust-driver</a>.</p><p dir=\"auto\"><code>cql-proxy</code> also enables applications that are currently using <a href=\"https://cassandra.apache.org/\" rel=\"nofollow\">Apache Cassandra</a> or <a href=\"https://www.datastax.com/products/datastax-enterprise\" rel=\"nofollow\">DataStax Enterprise (DSE)</a> to use Astra without requiring any code changes. Your application just needs to be configured to use the proxy.</p><p dir=\"auto\">If you're building a new application using DataStax <a href=\"https://docs.datastax.com/en/driver-matrix/doc/driver_matrix/common/driverMatrix.html\" rel=\"nofollow\">drivers</a>, <code>cql-proxy</code> is not required, as the drivers can communicate directly with Astra. DataStax drivers have excellent support for Astra out-of-the-box, and are well-documented in the <a href=\"https://docs.datastax.com/en/astra/docs/connecting-to-astra-databases-using-datastax-drivers.html\" rel=\"nofollow\">driver-guide</a> guide.</p><p dir=\"auto\">Use the <code>-h</code> or <code>--help</code> flag to display a listing all flags and their corresponding descriptions and environment variables (shown below as items starting with <code>$</code>):</p><div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"$ ./cql-proxy -h Usage: cql-proxy Flags: -h, --help Show context-sensitive help. -b, --astra-bundle=STRING Path to secure connect bundle for an Astra database. Requires '--username' and '--password'. Ignored if using the token or contact points option ($ASTRA_BUNDLE). -t, --astra-token=STRING Token used to authenticate to an Astra database. Requires '--astra-database-id'. Ignored if using the bundle path or contact points option ($ASTRA_TOKEN). -i, --astra-database-id=STRING Database ID of the Astra database. Requires '--astra-token' ($ASTRA_DATABASE_ID) --astra-api-url=&quot;https://api.astra.datastax.com&quot; URL for the Astra API ($ASTRA_API_URL) --astra-timeout=10s Timeout for contacting Astra when retrieving the bundle and metadata ($ASTRA_TIMEOUT) -c, --contact-points=CONTACT-POINTS,... Contact points for cluster. Ignored if using the bundle path or token option ($CONTACT_POINTS). -u, --username=STRING Username to use for authentication ($USERNAME) -p, --password=STRING Password to use for authentication ($PASSWORD) -r, --port=9042 Default port to use when connecting to cluster ($PORT) -n, --protocol-version=&quot;v4&quot; Initial protocol version to use when connecting to the backend cluster (default: v4, options: v3, v4, v5, DSEv1, DSEv2) ($PROTOCOL_VERSION) -m, --max-protocol-version=&quot;v4&quot; Max protocol version supported by the backend cluster (default: v4, options: v3, v4, v5, DSEv1, DSEv2) ($MAX_PROTOCOL_VERSION) -a, --bind=&quot;:9042&quot; Address to use to bind server ($BIND) -f, --config=CONFIG YAML configuration file ($CONFIG_FILE) --debug Show debug logging ($DEBUG) --health-check Enable liveness and readiness checks ($HEALTH_CHECK) --http-bind=&quot;:8000&quot; Address to use to bind HTTP server used for health checks ($HTTP_BIND) --heartbeat-interval=30s Interval between performing heartbeats to the cluster ($HEARTBEAT_INTERVAL) --idle-timeout=60s Duration between successful heartbeats before a connection to the cluster is considered unresponsive and closed ($IDLE_TIMEOUT) --readiness-timeout=30s Duration the proxy is unable to connect to the backend cluster before it is considered not ready ($READINESS_TIMEOUT) --idempotent-graph If true it will treat all graph queries as idempotent by default and retry them automatically. It may be dangerous to retry some graph queries -- use with caution ($IDEMPOTENT_GRAPH). --num-conns=1 Number of connection to create to each node of the backend cluster ($NUM_CONNS) --proxy-cert-file=STRING Path to a PEM encoded certificate file with its intermediate certificate chain. This is used to encrypt traffic for proxy clients ($PROXY_CERT_FILE) --proxy-key-file=STRING Path to a PEM encoded private key file. This is used to encrypt traffic for proxy clients ($PROXY_KEY_FILE) --rpc-address=STRING Address to advertise in the 'system.local' table for 'rpc_address'. It must be set if configuring peer proxies ($RPC_ADDRESS) --data-center=STRING Data center to use in system tables ($DATA_CENTER) --tokens=TOKENS,... Tokens to use in the system tables. It's not recommended ($TOKENS)\"><pre>$ ./cql-proxy -h\nUsage: cql-proxy\nFlags:\n  -h, --help                                              Show context-sensitive help.\n  -b, --astra-bundle=STRING                               Path to secure connect bundle for an Astra database. Requires '--username' and '--password'. Ignored if using the\n                                                          token or contact points option ($ASTRA_BUNDLE).\n  -t, --astra-token=STRING                                Token used to authenticate to an Astra database. Requires '--astra-database-id'. Ignored if using the bundle path\n                                                          or contact points option ($ASTRA_TOKEN).\n  -i, --astra-database-id=STRING                          Database ID of the Astra database. Requires '--astra-token' ($ASTRA_DATABASE_ID)\n      --astra-api-url=\"https://api.astra.datastax.com\"    URL for the Astra API ($ASTRA_API_URL)\n      --astra-timeout=10s                                 Timeout for contacting Astra when retrieving the bundle and metadata ($ASTRA_TIMEOUT)\n  -c, --contact-points=CONTACT-POINTS,...                 Contact points for cluster. Ignored if using the bundle path or token option ($CONTACT_POINTS).\n  -u, --username=STRING                                   Username to use for authentication ($USERNAME)\n  -p, --password=STRING                                   Password to use for authentication ($PASSWORD)\n  -r, --port=9042                                         Default port to use when connecting to cluster ($PORT)\n  -n, --protocol-version=\"v4\"                             Initial protocol version to use when connecting to the backend cluster (default: v4, options: v3, v4, v5, DSEv1,\n                                                          DSEv2) ($PROTOCOL_VERSION)\n  -m, --max-protocol-version=\"v4\"                         Max protocol version supported by the backend cluster (default: v4, options: v3, v4, v5, DSEv1, DSEv2)\n                                                          ($MAX_PROTOCOL_VERSION)\n  -a, --bind=\":9042\"                                      Address to use to bind server ($BIND)\n  -f, --config=CONFIG                                     YAML configuration file ($CONFIG_FILE)\n      --debug                                             Show debug logging ($DEBUG)\n      --health-check                                      Enable liveness and readiness checks ($HEALTH_CHECK)\n      --http-bind=\":8000\"                                 Address to use to bind HTTP server used for health checks ($HTTP_BIND)\n      --heartbeat-interval=30s                            Interval between performing heartbeats to the cluster ($HEARTBEAT_INTERVAL)\n      --idle-timeout=60s                                  Duration between successful heartbeats before a connection to the cluster is considered unresponsive and closed\n                                                          ($IDLE_TIMEOUT)\n      --readiness-timeout=30s                             Duration the proxy is unable to connect to the backend cluster before it is considered not ready\n                                                          ($READINESS_TIMEOUT)\n      --idempotent-graph                                  If true it will treat all graph queries as idempotent by default and retry them automatically. It may be\n                                                          dangerous to retry some graph queries -- use with caution ($IDEMPOTENT_GRAPH).\n      --num-conns=1                                       Number of connection to create to each node of the backend cluster ($NUM_CONNS)\n      --proxy-cert-file=STRING                            Path to a PEM encoded certificate file with its intermediate certificate chain. This is used to encrypt traffic\n                                                          for proxy clients ($PROXY_CERT_FILE)\n      --proxy-key-file=STRING                             Path to a PEM encoded private key file. This is used to encrypt traffic for proxy clients ($PROXY_KEY_FILE)\n      --rpc-address=STRING                                Address to advertise in the 'system.local' table for 'rpc_address'. It must be set if configuring peer proxies\n                                                          ($RPC_ADDRESS)\n      --data-center=STRING                                Data center to use in system tables ($DATA_CENTER)\n      --tokens=TOKENS,...                                 Tokens to use in the system tables. It's not recommended ($TOKENS)</pre></div><p dir=\"auto\">To pass configuration to <code>cql-proxy</code>, either command-line flags, environment variables, or a configuration file can be used. Using the <code>docker</code> method as an example, the following samples show how the token and database ID are defined with each method.</p><div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"docker run -p 9042:9042 --rm datastax/cql-proxy:v0.1.5 --astra-token &lt;astra-token&gt; --astra-database-id &lt;astra-datbase-id&gt;\"><pre>docker run -p 9042:9042 \\\n  --rm datastax/cql-proxy:v0.1.5 \\\n  --astra-token &lt;astra-token&gt; --astra-database-id &lt;astra-datbase-id&gt;</pre></div><div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"docker run -p 9042:9042 --rm datastax/cql-proxy:v0.1.5 -e ASTRA_TOKEN=&lt;astra-token&gt; -e ASTRA_DATABASE_ID=&lt;astra-datbase-id&gt;\"><pre>docker run -p 9042:9042  \\\n  --rm datastax/cql-proxy:v0.1.5 \\\n  -e ASTRA_TOKEN=&lt;astra-token&gt; -e ASTRA_DATABASE_ID=&lt;astra-datbase-id&gt;</pre></div><p dir=\"auto\">Proxy settings can also be passed using a configuration file with the <code>--config /path/to/proxy.yaml</code> flag. This can be mixed and matched with command-line flags and environment variables. Here are some example configuration files:</p><div class=\"highlight highlight-source-yaml notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"contact-points: - 127.0.0.1 username: cassandra password: cassandra port: 9042 bind: 127.0.0.1:9042 # ...\"><pre>contact-points:\n  - 127.0.0.1\nusername: cassandra\npassword: cassandra\nport: 9042\nbind: 127.0.0.1:9042\n# ...</pre></div><p dir=\"auto\">or with a Astra token:</p><div class=\"highlight highlight-source-yaml notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"astra-token: &lt;astra-token&gt; astra-database-id: &lt;astra-database-id&gt; bind: 127.0.0.1:9042 # ...\"><pre>astra-token: &lt;astra-token&gt;\nastra-database-id: &lt;astra-database-id&gt;\nbind: 127.0.0.1:9042\n# ...</pre></div><p dir=\"auto\">All configuration keys match their command-line flag counterpart, e.g. <code>--astra-bundle</code> is <code>astra-bundle:</code>, <code>--contact-points</code> is <code>contact-points:</code> etc.</p><p dir=\"auto\">Multi-region failover with DC-aware load balancing policy is the most useful case for a multiple proxy setup.</p><p dir=\"auto\">When configuring <code>peers:</code> it is required to set <code>--rpc-address</code> (or <code>rpc-address:</code> in the yaml) for each proxy and it must match is corresponding <code>peers:</code> entry. Also, <code>peers:</code> is only available in the configuration file and cannot be set using a command-line flag.</p><p dir=\"auto\">Here's an example of configuring multi-region failover with two proxies. A proxy is started for each region of the cluster connecting to it using that region's bundle. They all share a common configuration file that contains the full list of proxies.</p><p dir=\"auto\"><em>Note:</em> Only bundles are supported for multi-region setups.</p><div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"cql-proxy --astra-bundle astra-region1-bundle.zip --username token --password &lt;astra-token&gt; --bind 127.0.0.1:9042 --rpc-address 127.0.0.1 --data-center dc-1 --config proxy.yaml\"><pre>cql-proxy --astra-bundle astra-region1-bundle.zip --username token --password &lt;astra-token&gt; \\\n  --bind 127.0.0.1:9042 --rpc-address 127.0.0.1 --data-center dc-1 --config proxy.yaml</pre></div><div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"cql-proxy ---astra-bundle astra-region2-bundle.zip --username token --password &lt;astra-token&gt; --bind 127.0.0.2:9042 --rpc-address 127.0.0.2 --data-center dc-2 --config proxy.yaml\"><pre>cql-proxy ---astra-bundle astra-region2-bundle.zip --username token --password &lt;astra-token&gt; \\\n  --bind 127.0.0.2:9042 --rpc-address 127.0.0.2 --data-center dc-2 --config proxy.yaml</pre></div><p dir=\"auto\">The peers settings are configured using a yaml file. It's a good idea to explicitly provide the <code>--data-center</code> flag, otherwise; these values are pulled from the backend cluster and would need to be pulled from the <code>system.local</code> and <code>system.peers</code> table to properly setup the peers <code>data-center:</code> values. Here's an example <code>proxy.yaml</code>:</p><div class=\"highlight highlight-source-yaml notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"peers: - rpc-address: 127.0.0.1 data-center: dc-1 - rpc-address: 127.0.0.2 data-center: dc-2\"><pre>peers:\n  - rpc-address: 127.0.0.1\n    data-center: dc-1\n  - rpc-address: 127.0.0.2\n    data-center: dc-2</pre></div><p dir=\"auto\"><em>Note:</em> It's okay for the <code>peers:</code> to contain entries for the current proxy itself because they'll just be omitted.</p><p dir=\"auto\">There are three methods for using <code>cql-proxy</code>:</p><ul dir=\"auto\"><li>Locally build and run <code>cql-proxy</code></li>\n<li>Run a docker image that has <code>cql-proxy</code> installed</li>\n<li>Use a Kubernetes container to run <code>cql-proxy</code></li>\n</ul><ol dir=\"auto\"><li>\n<p dir=\"auto\">Build <code>cql-proxy</code>.</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"go build\"><pre>go build</pre></div>\n</li>\n<li>\n<p dir=\"auto\">Run with your desired database.</p>\n<ul dir=\"auto\"><li>\n<p dir=\"auto\"><a href=\"https://astra.datastax.com/\" rel=\"nofollow\">DataStax Astra</a> cluster:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"./cql-proxy --astra-token &lt;astra-token&gt; --astra-database-id &lt;astra-database-id&gt;\"><pre>./cql-proxy --astra-token &lt;astra-token&gt; --astra-database-id &lt;astra-database-id&gt;</pre></div>\n<p dir=\"auto\">The <code>&lt;astra-token&gt;</code> can be generated using these <a href=\"https://docs.datastax.com/en/astra/docs/manage-application-tokens.html\" rel=\"nofollow\">instructions</a>. The proxy also supports using the <a href=\"https://docs.datastax.com/en/astra/docs/obtaining-database-credentials.html#_getting_your_secure_connect_bundle\" rel=\"nofollow\">Astra Secure Connect Bundle</a> along with a client ID and secret generated using these <a href=\"https://docs.datastax.com/en/astra/docs/manage-application-tokens.html\" rel=\"nofollow\">instructions</a>:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"./cql-proxy --astra-bundle &lt;your-secure-connect-zip&gt; --username &lt;astra-client-id&gt; --password &lt;astra-client-secret&gt;\"><pre>./cql-proxy --astra-bundle &lt;your-secure-connect-zip&gt; \\\n--username &lt;astra-client-id&gt; --password &lt;astra-client-secret&gt;\n</pre></div>\n</li>\n<li>\n<p dir=\"auto\"><a href=\"https://cassandra.apache.org/\" rel=\"nofollow\">Apache Cassandra</a> cluster:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"./cql-proxy --contact-points &lt;cluster node IPs or DNS names&gt; [--username &lt;username&gt;] [--password &lt;password&gt;]\"><pre>./cql-proxy --contact-points &lt;cluster node IPs or DNS names&gt; [--username &lt;username&gt;] [--password &lt;password&gt;]</pre></div>\n</li>\n</ul></li>\n</ol><ol dir=\"auto\"><li>\n<p dir=\"auto\">Run with your desired database.</p>\n<ul dir=\"auto\"><li>\n<p dir=\"auto\"><a href=\"https://astra.datastax.com/\" rel=\"nofollow\">DataStax Astra</a> cluster:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"docker run -p 9042:9042 datastax/cql-proxy:v0.1.5 --astra-token &lt;astra-token&gt; --astra-database-id &lt;astra-database-id&gt;\"><pre>docker run -p 9042:9042 \\\n  datastax/cql-proxy:v0.1.5 \\\n  --astra-token &lt;astra-token&gt; --astra-database-id &lt;astra-database-id&gt;</pre></div>\n<p dir=\"auto\">The <code>&lt;astra-token&gt;</code> can be generated using these <a href=\"https://docs.datastax.com/en/astra/docs/manage-application-tokens.html\" rel=\"nofollow\">instructions</a>. The proxy also supports using the <a href=\"https://docs.datastax.com/en/astra/docs/obtaining-database-credentials.html#_getting_your_secure_connect_bundle\" rel=\"nofollow\">Astra Secure Connect Bundle</a>, but it requires mounting the bundle to a volume in the container:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"docker run -v &lt;your-secure-connect-bundle.zip&gt;:/tmp/scb.zip -p 9042:9042 --rm datastax/cql-proxy:v0.1.5 --astra-bundle /tmp/scb.zip --username &lt;astra-client-id&gt; --password &lt;astra-client-secret&gt;\"><pre>docker run -v &lt;your-secure-connect-bundle.zip&gt;:/tmp/scb.zip -p 9042:9042 \\\n--rm datastax/cql-proxy:v0.1.5 \\\n--astra-bundle /tmp/scb.zip --username &lt;astra-client-id&gt; --password &lt;astra-client-secret&gt;</pre></div>\n</li>\n<li>\n<p dir=\"auto\"><a href=\"https://cassandra.apache.org/\" rel=\"nofollow\">Apache Cassandra</a> cluster:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"docker run -p 9042:9042 datastax/cql-proxy:v0.1.5 --contact-points &lt;cluster node IPs or DNS names&gt; [--username &lt;username&gt;] [--password &lt;password&gt;]\"><pre>docker run -p 9042:9042 \\\n  datastax/cql-proxy:v0.1.5 \\\n  --contact-points &lt;cluster node IPs or DNS names&gt; [--username &lt;username&gt;] [--password &lt;password&gt;]</pre></div>\n</li>\n</ul></li>\n</ol><p dir=\"auto\">If you wish to have the docker image removed after you are done with it, add <code>--rm</code> before the image name <code>datastax/cql-proxy:v0.1.5</code>.</p><p dir=\"auto\">Using Kubernetes with <code>cql-proxy</code> requires a number of steps:</p><ol dir=\"auto\"><li>\n<p dir=\"auto\">Generate a token following the Astra <a href=\"https://docs.datastax.com/en/astra/docs/manage-application-tokens.html#_create_application_token\" rel=\"nofollow\">instructions</a>. This step will display your Client ID, Client Secret, and Token; make sure you download the information for the next steps. Store the secure bundle in <code>/tmp/scb.zip</code> to match the example below.</p>\n</li>\n<li>\n<p dir=\"auto\">Create <code>cql-proxy.yaml</code>. You'll need to add three sets of information: arguments, volume mounts, and volumes. A full example can be found <a href=\"https://github.com/datastax/cql-proxy/blob/main/k8s/cql-proxy.yml\">here</a>.</p>\n</li>\n</ol><ul dir=\"auto\"><li>\n<p dir=\"auto\">Argument: Modify the local bundle location, username and password, using the client ID and client secret obtained in the last step to the container argument.</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"command: [&quot;./cql-proxy&quot;] args: [&quot;--astra-bundle=/tmp/scb.zip&quot;,&quot;--username=Client ID&quot;,&quot;--password=Client Secret&quot;]\"><pre>command: [\"./cql-proxy\"]\nargs: [\"--astra-bundle=/tmp/scb.zip\",\"--username=Client ID\",\"--password=Client Secret\"]\n</pre></div>\n</li>\n<li>\n<p dir=\"auto\">Volume mounts: Modify <code>/tmp/</code> as a volume mount as required.</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"volumeMounts: - name: my-cm-vol mountPath: /tmp/\"><pre>volumeMounts:\n  - name: my-cm-vol\n  mountPath: /tmp/\n</pre></div>\n</li>\n<li>\n<p dir=\"auto\">Volume: Modify the <code>configMap</code> filename as required. In this example, it is named <code>cql-proxy-configmap</code>. Use the same name for the <code>volumes</code> that you used for the <code>volumeMounts</code>.</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"volumes: - name: my-cm-vol configMap: name: cql-proxy-configmap\"><pre>volumes:\n  - name: my-cm-vol\n    configMap:\n      name: cql-proxy-configmap        \n</pre></div>\n</li>\n</ul><ol start=\"3\" dir=\"auto\"><li>\n<p dir=\"auto\">Create a configmap. Use the same secure bundle that was specified in the <code>cql-proxy.yaml</code>.</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"kubectl create configmap cql-proxy-configmap --from-file /tmp/scb.zip\"><pre>kubectl create configmap cql-proxy-configmap --from-file /tmp/scb.zip </pre></div>\n</li>\n<li>\n<p dir=\"auto\">Check the configmap that was created.</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"kubectl describe configmap cql-proxy-configmap Name: cql-proxy-configmap Namespace: default Labels: &lt;none&gt; Annotations: &lt;none&gt; Data ==== BinaryData ==== scb.zip: 12311 bytes\"><pre>kubectl describe configmap cql-proxy-configmap\n  Name:         cql-proxy-configmap\n  Namespace:    default\n  Labels:       &lt;none&gt;\n  Annotations:  &lt;none&gt;\n  Data\n  ====\n  BinaryData\n  ====\n  scb.zip: 12311 bytes</pre></div>\n</li>\n<li>\n<p dir=\"auto\">Create a Kubernetes deployment with the YAML file you created:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"kubectl create -f cql-proxy.yaml\"><pre>kubectl create -f cql-proxy.yaml</pre></div>\n</li>\n<li>\n<p dir=\"auto\">Check the logs:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"kubectl logs &lt;deployment-name&gt;\"><pre>kubectl logs &lt;deployment-name&gt;</pre></div>\n</li>\n</ol><p dir=\"auto\">Drivers that use token-aware load balancing may print a warning or may not work when using cql-proxy. Because cql-proxy abstracts the backend cluster as a single endpoint this doesn't always work well with token-aware drivers that expect there to be at least \"replication factor\" number of nodes in the cluster. Many drivers print a warning (which can be ignored) and fallback to something like round-robin, but other drivers might fail with an error. For the drivers that fail with an error it is required that they disable token-aware or configure the round-robin load balancing policy.</p>","id":"515fda8f-d1a1-5d7c-bfc6-6d72984fb6c1","title":"GitHub - datastax/cql-proxy: A client-side CQL proxy/sidecar.","origin_url":"https://github.com/datastax/cql-proxy","url":"https://github.com/datastax/cql-proxy","wallabag_created_at":"2024-11-01T17:26:01+00:00","published_at":null,"published_by":"['datastax']","reading_time":8,"domain_name":"github.com","preview_picture":"https://opengraph.githubassets.com/c2528e3426d98910ed27819e048b4c1081fab2ed2c7adbea6e6a3b1872deb30a/datastax/cql-proxy","tags":["migration","proxy","cassandra","cql"],"description":" cql-proxy is designed to forward your application's CQL traffic to an appropriate database service. It listens on a local address and securely forwards that traffic.The cql-proxy sidecar enables unsu..."},{"content":"<header>\n</header><p>Zero Downtime Migration (ZDM) Proxy is an open-source component developed in Go and based on client-server architecture. It enables you to migrate from one Apache Cassandra® cluster to another without downtime or code changes in the application client.</p><p>For details on ZDM Proxy, see <a href=\"https://github.com/datastax/zdm-proxy\" target=\"_blank\" rel=\"noopener noreferrer\">zdm-proxy GitHub</a>.</p><p>When using ZDM Proxy, the client connects to the proxy rather than to the source cluster. The proxy connects both to the source cluster and the target cluster. It sends read requests to the source cluster only, while write requests are forwarded to both clusters.</p><p>For details on how ZDM Proxy works, see <a href=\"https://docs.datastax.com/en/data-migration/introduction.html\" target=\"_blank\" rel=\"noopener noreferrer\">Introduction to Zero Downtime Migration</a>.</p><ul><li>Apache Cassandra instance to migrate to the Aiven platform (migration source)</li>\n<li>Aiven for Apache Cassandra service where to migrate your external instance (migration target)</li>\n<li><a href=\"https://aiven.io/docs/tools/cli\">Aiven CLI client installed</a></li>\n<li><code>cqlsh</code> <a href=\"https://cassandra.apache.org/doc/latest/cassandra/getting_started/installing.html\" target=\"_blank\" rel=\"noopener noreferrer\">installed</a></li>\n</ul><p><a href=\"https://aiven.io/docs/products/cassandra/howto/connect-cqlsh-cli\">Connect to your Aiven for Apache Cassandra service</a> using <code>cqlsh</code>, for example.</p><div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block codeBlockContent_biex c3\"><pre class=\"codeBlockLines_e6Vv\">cqlsh --ssl-u avnadmin -p YOUR_SECRET_PASSWORD cassandra-target-cluster-name.a.avns.net 12345<br /></pre></div><p>You can expect to receive output similar to the following:</p><div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block codeBlockContent_biex c3\"><pre class=\"codeBlockLines_e6Vv\">Connected to a1b2c3d4-1a2b-3c4d-5e6f-a1b2c3d4e5f6 at cassandra-target-cluster-name.a.avns.net:12345<br />[cqlsh 6.1.0 | Cassandra 4.0.11 | CQL spec 3.4.5 | Native protocol v5]<br /></pre></div><p>In your target service, create the same keyspaces and tables you have in your source Apache Cassandra cluster.</p><div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block codeBlockContent_biex c3\"><pre class=\"codeBlockLines_e6Vv\">create keyspace KEYSPACE_NAME with replication ={'class':'SimpleStrategy', 'replication_factor':3};<br />create table KEYSPACE_NAME.TABLE_NAME (n_id int, value int, primary key (n_id));<br /></pre></div><p>Download the ZDM Proxy's binary from <a href=\"https://github.com/datastax/zdm-proxy/releases\" target=\"_blank\" rel=\"noopener noreferrer\">ZDM Proxy releases</a>.</p><div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block codeBlockContent_biex c3\"><pre class=\"codeBlockLines_e6Vv\">wget https://github.com/datastax/zdm-proxy/releases/download/v2.1.0/zdm-proxy-linux-amd64-v2.1.0.tgz<br />tar xf zdm-proxy-linux-amd64-v2.1.0.tgz<br /></pre></div><p>Check if the binary has been downloaded successfully using <code>ls</code> in the relevant directory. You can expect to receive output similar to the following:</p><div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block codeBlockContent_biex c3\"><pre class=\"codeBlockLines_e6Vv\">LICENSE  zdm-proxy-linux-amd64-v2.1.0.tgz  zdm-proxy-v2.1.0<br /></pre></div><ol><li>\n<p>Specify connection information by setting <code>ZDM_TARGET_*</code> and <code>ZDM_ORIGIN_*</code> environment variables using the <code>export</code> command.</p>\n<div class=\"theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary\"><p>note</p><div class=\"admonitionContent_BuS1\"><p><code>ORIGIN</code> refers to the source service.</p></div></div>\n</li>\n<li>\n<p>Run the binary.</p>\n</li>\n</ol><div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block codeBlockContent_biex c3\"><pre class=\"codeBlockLines_e6Vv\">exportZDM_ORIGIN_CONTACT_POINTS=localhost<br />exportZDM_ORIGIN_USERNAME=cassandra<br />exportZDM_ORIGIN_PASSWORD=cassandra<br />exportZDM_ORIGIN_PORT=1234<br />exportZDM_TARGET_CONTACT_POINTS=cassandra-target-cluster-name.a.avns.net<br />exportZDM_TARGET_USERNAME=avnadmin<br />exportZDM_TARGET_PASSWORD=YOUR_SECRET_PASSWORD<br />exportZDM_TARGET_PORT=12345<br />exportZDM_TARGET_TLS_SERVER_CA_PATH=\"/tmp/ca.pem\"<br />exportZDM_TARGET_ENABLE_HOST_ASSIGNMENT=false<br /># ZDM_ORIGIN_ENABLE_HOST_ASSIGNMENT=false  # (may be needed, see note)<br />./zdm-proxy-v2.1.0<br /></pre></div><div class=\"theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary\"><p>ENABLE_HOST_ASSIGNMENT</p><div class=\"admonitionContent_BuS1\"><p>Make sure you set the ZDM_TARGET_ENABLE_HOST_ASSIGNMENT variable. Otherwise, ZDM Proxy tries to connect to one of internal addresses of the cluster nodes, which are unavailable from outside. If this occurs to your source cluster, set <code>ZDM_ORIGIN_ENABLE_HOST_ASSIGNMENT=false</code>.</p></div></div><p>To connect to ZDM Proxy, use, for example, <code>cqlsh</code>. Provide connection details and, if your source or target require authentication, specify target username and password.</p><p>Check more details on using the credentials in <a href=\"https://docs.datastax.com/en/data-migration/introduction.html\" target=\"_blank\" rel=\"noopener noreferrer\">Client application credentials</a>.</p><p>The port that ZDM Proxy uses is 14002, which can be overridden.</p><ol><li>\n<p>Connect using ZDM Proxy.</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block codeBlockContent_biex c3\"><pre class=\"codeBlockLines_e6Vv\">cqlsh -u avnadmin -p YOUR_SECRET_PASSWORD localhost 14002<br /></pre></div>\n<p>You can expect to receive output similar to the following:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block codeBlockContent_biex c3\"><pre class=\"codeBlockLines_e6Vv\">Connected to CLUSTER_NAME at localhost:14002<br />[cqlsh 6.1.0 | Cassandra 4.1.3 | CQL spec 3.4.6 | Native protocol v4]<br /></pre></div>\n</li>\n<li>\n<p>Check data in the table.</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block codeBlockContent_biex c3\"><pre class=\"codeBlockLines_e6Vv\">select * from KEYSPACE_NAME.TABLE_NAME;<br /></pre></div>\n<p>You can expect to receive output similar to the following:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block codeBlockContent_biex c3\"><pre class=\"codeBlockLines_e6Vv\">n_id | value<br />------+-------<br />1|42<br />2|44<br />3|46<br />(3 rows)<br /></pre></div>\n</li>\n<li>\n<p>Insert more data into the table to test how ZDM Proxy handles write request.</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block codeBlockContent_biex c3\"><pre class=\"codeBlockLines_e6Vv\">insert into KEYSPACE_NAME.TABLE_NAME (n_id, value) values (4, 48);<br />insert into KEYSPACE_NAME.TABLE_NAME (n_id, value) values (5, 50);<br /></pre></div>\n</li>\n<li>\n<p>Check again data inside the table.</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block codeBlockContent_biex c3\"><pre class=\"codeBlockLines_e6Vv\">select * from KEYSPACE_NAME.TABLE_NAME;<br /></pre></div>\n<p>You can expect to receive output similar to the following:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block codeBlockContent_biex c3\"><pre class=\"codeBlockLines_e6Vv\">n_id | value<br />------+-------<br />5|50<br />1|42<br />2|44<br />4|48<br />3|46<br />(5 rows)<br /></pre></div>\n</li>\n</ol><ol><li>\n<p>Connect to the source:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block codeBlockContent_biex c3\"><pre class=\"codeBlockLines_e6Vv\">cqlsh localhost 1234<br /></pre></div>\n<p>You can expect to receive output similar to the following:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block codeBlockContent_biex c3\"><pre class=\"codeBlockLines_e6Vv\">Connected to SOURCE_CLUSTER_NAME at localhost:1234<br />[cqlsh 6.1.0 | Cassandra 4.1.3 | CQL spec 3.4.6 | Native protocol v5]<br /></pre></div>\n</li>\n<li>\n<p>Check data in the table:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block codeBlockContent_biex c3\"><pre class=\"codeBlockLines_e6Vv\">select * from KEYSPACE_NAME.TABLE_NAME;<br /></pre></div>\n<p>You can expect to receive output similar to the following:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block codeBlockContent_biex c3\"><pre class=\"codeBlockLines_e6Vv\">n_id | value<br />------+-------<br />5|50<br />1|42<br />2|44<br />4|48<br />3|46<br />(5 rows)<br /></pre></div>\n<p>ZDM Proxy has forwarded both the write request and the read request to the source cluster. As a result, all the values are there: both newly-added ones (<code>50</code> and <code>48</code>) and previously added ones (<code>42</code>, <code>44</code>, and <code>46</code>).</p>\n</li>\n</ol><ol><li>\n<p>Connect to the target service.</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block codeBlockContent_biex c3\"><pre class=\"codeBlockLines_e6Vv\">cqlsh --ssl-u avnadmin -p YOUR_SECRET_PASSWORD cassandra-target-cluster-name.a.avns.net 12345<br /></pre></div>\n<p>You can expect to receive output similar to the following:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block codeBlockContent_biex c3\"><pre class=\"codeBlockLines_e6Vv\">Connected to a1b2c3d4-1a2b-3c4d-5e6f-a1b2c3d4e5f6 at cassandra-target-cluster-name.a.avns.net:12345<br />[cqlsh 6.1.0 | Cassandra 4.0.11 | CQL spec 3.4.5 | Native protocol v5]<br /></pre></div>\n</li>\n<li>\n<p>Check data in the table.</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block codeBlockContent_biex c3\"><pre class=\"codeBlockLines_e6Vv\">select * from KEYSPACE_NAME.TABLE_NAME;<br /></pre></div>\n<p>You can expect to receive output similar to the following:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block codeBlockContent_biex c3\"><pre class=\"codeBlockLines_e6Vv\">n_id | value<br />------+-------<br />5|50<br />4|48<br />(2 rows)<br /></pre></div>\n<p><code>50</code> and <code>48</code> are there in the target table since ZDM Proxy has forwarded the write request to the target service. <code>42</code>, <code>44</code>, and <code>46</code> are not there since ZDM Proxy has not sent the read request to the target service.</p>\n</li>\n</ol><ul><li><a href=\"https://github.com/datastax/zdm-proxy\" target=\"_blank\" rel=\"noopener noreferrer\">zdm-proxy GitHub</a></li>\n<li><a href=\"https://docs.datastax.com/en/data-migration/introduction.html\" target=\"_blank\" rel=\"noopener noreferrer\">Introduction to Zero Downtime Migration</a></li>\n<li><a href=\"https://github.com/datastax/zdm-proxy/releases\" target=\"_blank\" rel=\"noopener noreferrer\">ZDM Proxy releases</a></li>\n<li><a href=\"https://docs.datastax.com/en/data-migration/connect-clients-to-target.html\" target=\"_blank\" rel=\"noopener noreferrer\">Client application credentials</a></li>\n</ul>","id":"c5cf2b78-00ff-560c-a008-3227fd0643b3","title":"Migrate to Aiven for Apache Cassandra® with no downtime | Aiven docs","origin_url":"https://aiven.io/docs/products/cassandra/howto/zdm-proxy","url":"https://aiven.io/docs/products/cassandra/howto/zdm-proxy","wallabag_created_at":"2024-11-01T17:25:08+00:00","published_at":null,"published_by":null,"reading_time":4,"domain_name":"aiven.io","preview_picture":"https://aiven.io/docs/images/site-preview.png","tags":["migration","proxy","cassandra","aiven"],"description":"\nZero Downtime Migration (ZDM) Proxy is an open-source component developed in Go and based on client-server architecture. It enables you to migrate from one Apache Cassandra® cluster to another withou..."},{"content":"<p dir=\"auto\">The ZDM Proxy is client-server component written in Go that enables users to migrate with zero downtime from an Apache Cassandra® cluster to another (which may be an <a href=\"https://astra.datastax.com/\" rel=\"nofollow\">Astra</a> cluster) and not requiring code changes in the application client.</p><p dir=\"auto\">The only change to the client is pointing it to the proxy rather than directly to the original cluster (Origin). In turn, the proxy connects to both Origin and Target clusters.</p><p dir=\"auto\">By default, the proxy will forward read requests only to the Origin cluster, though you can optionally configure it to forward reads to both clusters asynchronously, while writes will always be sent to both clusters concurrently.</p><p dir=\"auto\">An overview of the proxy architecture and logical flow can be viewed <a href=\"https://docs.datastax.com/en/data-migration/introduction.html#migration-phases\" rel=\"nofollow\">here</a>.</p><p dir=\"auto\">In order to run the proxy, you'll need to set some environment variables or pass reference to YAML configuration file. Below you'll find a list with the most important variables along with their default values. The required ones are marked with a comment. Variable names for YAML configuration file do not have <code>ZDM_</code> prefix and are lower-cased.</p><div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"ZDM_ORIGIN_CONTACT_POINTS=10.0.0.1 #required ZDM_ORIGIN_USERNAME=cassandra #required ZDM_ORIGIN_PASSWORD=cassandra #required ZDM_ORIGIN_PORT=9042 ZDM_TARGET_CONTACT_POINTS=10.0.0.2 #required ZDM_TARGET_USERNAME=cassandra #required ZDM_TARGET_PASSWORD=cassandra #required ZDM_TARGET_PORT=9042 ZDM_PROXY_LISTEN_PORT=14002 ZDM_PROXY_LISTEN_ADDRESS=127.0.0.1 ZDM_PRIMARY_CLUSTER=ORIGIN ZDM_READ_MODE=PRIMARY_ONLY ZDM_LOG_LEVEL=INFO\"><pre>ZDM_ORIGIN_CONTACT_POINTS=10.0.0.1  #required\nZDM_ORIGIN_USERNAME=cassandra       #required\nZDM_ORIGIN_PASSWORD=cassandra       #required\nZDM_ORIGIN_PORT=9042\nZDM_TARGET_CONTACT_POINTS=10.0.0.2  #required\nZDM_TARGET_USERNAME=cassandra       #required\nZDM_TARGET_PASSWORD=cassandra       #required\nZDM_TARGET_PORT=9042\nZDM_PROXY_LISTEN_PORT=14002\nZDM_PROXY_LISTEN_ADDRESS=127.0.0.1\nZDM_PRIMARY_CLUSTER=ORIGIN\nZDM_READ_MODE=PRIMARY_ONLY\nZDM_LOG_LEVEL=INFO</pre></div><p dir=\"auto\">The environment variables (or YAM configuration file) must be set for the proxy to work.</p><p dir=\"auto\">In order to get started quickly, in your local environment, grab a copy of the binary distribution in the <a href=\"https://github.com/datastax/zdm-proxy/releases\">Releases</a> page. For the recommended installation in a production environment, check the <a href=\"https://github.com/datastax/zdm-proxy#production-setup\">Production Setup</a> section below.</p><p dir=\"auto\">Now, suppose you have two clusters running at <code>10.0.0.1</code> and <code>10.0.0.2</code> with <code>cassandra/cassandra</code> credentials and the same key-value <a href=\"https://github.com/datastax/zdm-proxy/blob/main/nb-tests/schema.cql\">schema</a>. You can start the proxy and connect it to these clusters like this:</p><div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"$ export ZDM_ORIGIN_CONTACT_POINTS=10.0.0.1 \\ export ZDM_TARGET_CONTACT_POINTS=10.0.0.2 export ZDM_ORIGIN_USERNAME=cassandra export ZDM_ORIGIN_PASSWORD=cassandra export ZDM_TARGET_USERNAME=cassandra export ZDM_TARGET_PASSWORD=cassandra ./zdm-proxy-v2.0.0 # run the ZDM proxy executable\"><pre>$ export ZDM_ORIGIN_CONTACT_POINTS=10.0.0.1 \\ \nexport ZDM_TARGET_CONTACT_POINTS=10.0.0.2 \\\nexport ZDM_ORIGIN_USERNAME=cassandra \\\nexport ZDM_ORIGIN_PASSWORD=cassandra \\\nexport ZDM_TARGET_USERNAME=cassandra \\\nexport ZDM_TARGET_PASSWORD=cassandra \\\n./zdm-proxy-v2.0.0 # run the ZDM proxy executable</pre></div><p dir=\"auto\">If you prefer to use YAML configuration file, an equivalent setup would look like:</p><div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"$ cat zdm-config.yml origin_contact_points: 10.0.0.1 target_contact_points: 10.0.0.2 origin_username: cassandra origin_password: cassandra target_username: cassandra target_password: cassandra $ ./zdm-proxy-v2.0.0 --config=./zdm-config.yml # run the ZDM proxy executable\"><pre>$ cat zdm-config.yml\norigin_contact_points: 10.0.0.1\ntarget_contact_points: 10.0.0.2\norigin_username: cassandra\norigin_password: cassandra\ntarget_username: cassandra\ntarget_password: cassandra\n$ ./zdm-proxy-v2.0.0 --config=./zdm-config.yml # run the ZDM proxy executable</pre></div><p dir=\"auto\">At this point, you should be able to connect some client such as <a href=\"https://downloads.datastax.com/#cqlsh\" rel=\"nofollow\">CQLSH</a> to the proxy and write data to it and the proxy will take care of forwarding the requests to both clusters concurrently.</p><div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"$ cqlsh &lt;proxy-ip-address&gt; 14002 # this is the proxy's default listen port\"><pre>$ cqlsh &lt;proxy-ip-address&gt; 14002 # this is the proxy's default listen port</pre></div><p dir=\"auto\">From the CQLSH prompt:</p><div class=\"highlight highlight-source-sql notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"cqlsh&gt; INSERT INTO test.keyvalue (key, value) VALUES (1, 'ABC'); cqlsh&gt; INSERT INTO test.keyvalue (key, value) VALUES (2, 'DEF'); cqlsh&gt; SELECT * FROM test.keyvalue; cqlsh&gt; UPDATE test.keyvalue SET value='GYEKJF' WHERE key = 1; cqlsh&gt; DELETE FROM test.keyvalue WHERE key = 2;\"><pre>cqlsh&gt; INSERT INTO test.keyvalue (key, value) VALUES (1, 'ABC');\ncqlsh&gt; INSERT INTO test.keyvalue (key, value) VALUES (2, 'DEF');\ncqlsh&gt; SELECT * FROM test.keyvalue;\ncqlsh&gt; UPDATE test.keyvalue SET value='GYEKJF' WHERE key = 1;\ncqlsh&gt; DELETE FROM test.keyvalue WHERE key = 2;</pre></div><p dir=\"auto\">You can confirm that the data is stored in both clusters by querying them directly in other cqlsh sessions.</p><p dir=\"auto\">Note: For the moment, the keyspace must be specified when accessing a table, even after using <code>USE &lt;keyspace&gt;</code>.</p><p dir=\"auto\">If you don't have test clusters readily available to try with, check the <a href=\"https://github.com/datastax/zdm-proxy/blob/main/CONTRIBUTING.md#running-on-localhost-with-docker-compose\">alternative</a> method with docker-compose in the <a href=\"https://github.com/datastax/zdm-proxy/blob/main/CONTRIBUTING.md\">Contributor's guide</a>, which will set up all the dependencies, including two test clusters and a proxy instance, in a containerized sandbox environment.</p><p dir=\"auto\"><strong>ZDM Proxy supports protocol versions v2, v3, v4, DSE_V1 and DSE_V2.</strong></p><p dir=\"auto\">It technically doesn't support v5, but handles protocol negotiation so that the client application properly downgrades the protocol version to v4 if v5 is requested. This means that any client application using a recent driver that supports protocol version v5 can be migrated using the ZDM Proxy (as long as it does not use v5-specific functionality).</p><p dir=\"auto\">ZDM Proxy requires origin and target clusters to have at least one protocol version in common. It is therefore not feasible to configure Apache Cassandra 2.0 as origin and 3.x / 4.x as target. Below table displays protocol versions supported by various C* versions:</p><table><thead><tr><th>Apache Cassandra</th>\n<th>Protocol Version</th>\n</tr></thead><tbody><tr><td>2.0</td>\n<td>V2</td>\n</tr><tr><td>2.1</td>\n<td>V2, V3</td>\n</tr><tr><td>2.2</td>\n<td>V2, V3, V4</td>\n</tr><tr><td>3.x</td>\n<td>V3, V4</td>\n</tr><tr><td>4.x</td>\n<td>V3, V4, V5</td>\n</tr></tbody></table><hr /><p dir=\"auto\">⚠️ <strong>Thrift is not supported by ZDM Proxy.</strong> If you are using a very old driver or cluster version that only supports Thrift then you need to change your client application to use CQL and potentially upgrade your cluster before starting the migration process.</p><hr /><p dir=\"auto\">In practice this means that ZDM Proxy supports the following cluster versions (as Origin and / or Target):</p><ul dir=\"auto\"><li>Apache Cassandra from 2.0+ up to (and including) Apache Cassandra 4.x. (although both clusters have to support a common protocol version as mentioned above).</li>\n<li>DataStax Enterprise 4.8+. DataStax Enterprise 4.6 and 4.7 support will be introduced when protocol version v2 is supported.</li>\n<li>DataStax Astra DB (both Serverless and Classic)</li>\n</ul><p dir=\"auto\">The setup we described above is only for testing in a local environment. It is <strong>NOT</strong> recommended for a production installation where the minimum number of proxy instances is 3.</p><p dir=\"auto\">For a comprehensive guide with the recommended production setup check the documentation available at <a href=\"https://docs.datastax.com/en/astra-serverless/docs/migrate/introduction.html\" rel=\"nofollow\">Datastax Migration</a>.</p><p dir=\"auto\">There you'll find information about an Ansible-based tool that automates most of the process.</p><p dir=\"auto\">For information on the packaged dependencies of the Zero Downtime Migration (ZDM) Proxy and their licenses, check out our <a href=\"https://app.fossa.com/reports/ccfe72e5-68ea-4c02-ad48-d92061e6d0b0\" rel=\"nofollow\">open source report</a>.</p><p dir=\"auto\">For frequently asked questions, please refer to our separate <a href=\"https://docs.datastax.com/en/astra-serverless/docs/migrate/faqs.html\" rel=\"nofollow\">FAQ</a> page.</p>","id":"b5e34283-1bc1-59b3-890c-c53a44c6cf98","title":"GitHub - datastax/zdm-proxy: An open-source component designed to seamlessly handle the real-time client application activity while a migration is in progress.","origin_url":"https://github.com/datastax/zdm-proxy","url":"https://github.com/datastax/zdm-proxy","wallabag_created_at":"2024-11-01T17:23:20+00:00","published_at":null,"published_by":"['datastax']","reading_time":4,"domain_name":"github.com","preview_picture":"https://opengraph.githubassets.com/2d9ec70e3a53cb00af12aa2c8f6c9f9568324cfe693483d667268c95dc17d22b/datastax/zdm-proxy","tags":["migration","proxy","datastax","cassandra"],"description":"The ZDM Proxy is client-server component written in Go that enables users to migrate with zero downtime from an Apache Cassandra® cluster to another (which may be an Astra cluster) and not requiring c..."},{"content":"<div id=\"js-flash-container\" data-turbo-replace=\"\"><div class=\"flash flash-full {{ className }} px-2\"><p>{{ message }}</p></div>\n</div><div class=\"application-main\" data-commit-hovercards-enabled=\"\" data-discussion-hovercards-enabled=\"\" data-issue-and-pr-hovercards-enabled=\"\"><main id=\"js-repo-pjax-container\"><div id=\"repository-container-header\" class=\"pt-3 hide-full-screen c6\" data-turbo-replace=\"\"><div class=\"d-flex flex-wrap flex-justify-end mb-3 px-3 px-md-4 px-lg-5 c4\"><p> / <strong itemprop=\"name\" class=\"mr-2 flex-self-stretch\"><a data-pjax=\"#repo-content-pjax-container\" data-turbo-frame=\"repo-content-turbo-frame\" href=\"https://github.com/eighty4/cquill\">cquill</a></strong> Public</p><div id=\"repository-details-container\" data-turbo-replace=\"\"><ul class=\"pagehead-actions flex-shrink-0 d-none d-md-inline c3\"><li><a href=\"https://github.com/login?return_to=%2Feighty4%2Fcquill\" rel=\"nofollow\" data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;notification subscription menu watch&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/eighty4/cquill&quot;,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"243a6393922ecd5fbd3d7ed3da86a6a835cad78bc685e9f5d67c02ff3e702a3b\" aria-label=\"You must be signed in to change notification settings\" data-view-component=\"true\" class=\"tooltipped tooltipped-s btn-sm btn\">Notifications</a></li>\n<li><a id=\"fork-button\" href=\"https://github.com/login?return_to=%2Feighty4%2Fcquill\" rel=\"nofollow\" data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;repo details fork button&quot;,&quot;repository_id&quot;:606605784,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/eighty4/cquill&quot;,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"b9a66a0b376171268ee35295f717b477dcd9df04523d3c96f3887043c568f19d\" data-view-component=\"true\" class=\"btn-sm btn\">Fork 2</a></li>\n<li>\n<p><a href=\"https://github.com/login?return_to=%2Feighty4%2Fcquill\" rel=\"nofollow\" data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;star button&quot;,&quot;repository_id&quot;:606605784,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/eighty4/cquill&quot;,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"1af0db7174c7c69f784584ca3f7aa61a70b337c827567abc6a5784fc18cd6729\" aria-label=\"You must be signed in to star a repository\" data-view-component=\"true\" class=\"tooltipped tooltipped-s btn-sm btn BtnGroup-item\"> Star 1</a> </p>\n</li>\n</ul></div></div><div class=\"d-block d-md-none mb-2 px-3 px-md-4 px-lg-5\" id=\"responsive-meta-container\" data-turbo-replace=\"\"><p class=\"f4 mb-3\">Versioned CQL migrations for Cassandra and ScyllaDB</p><h3 class=\"sr-only\">License</h3><p><a href=\"https://github.com/eighty4/cquill/blob/main/LICENSE\" class=\"Link--muted\" data-analytics-event=\"{&quot;category&quot;:&quot;Repository Overview&quot;,&quot;action&quot;:&quot;click&quot;,&quot;label&quot;:&quot;location:sidebar;file:license&quot;}\"> MIT license</a></p><p><a class=\"Link--secondary no-underline mr-3\" href=\"https://github.com/eighty4/cquill/stargazers\"> 1 star</a> <a class=\"Link--secondary no-underline mr-3\" href=\"https://github.com/eighty4/cquill/forks\"> 2 forks</a> <a class=\"Link--secondary no-underline d-inline-block\" href=\"https://github.com/eighty4/cquill/activity\"> Activity</a></p><div class=\"d-flex flex-wrap gap-2\"><p><a href=\"https://github.com/login?return_to=%2Feighty4%2Fcquill\" rel=\"nofollow\" data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;star button&quot;,&quot;repository_id&quot;:606605784,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/eighty4/cquill&quot;,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"1af0db7174c7c69f784584ca3f7aa61a70b337c827567abc6a5784fc18cd6729\" aria-label=\"You must be signed in to star a repository\" data-view-component=\"true\" class=\"tooltipped tooltipped-s btn-sm btn btn-block BtnGroup-item\"> Star</a> </p><p><a href=\"https://github.com/login?return_to=%2Feighty4%2Fcquill\" rel=\"nofollow\" data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;notification subscription menu watch&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/eighty4/cquill&quot;,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"243a6393922ecd5fbd3d7ed3da86a6a835cad78bc685e9f5d67c02ff3e702a3b\" aria-label=\"You must be signed in to change notification settings\" data-view-component=\"true\" class=\"tooltipped tooltipped-s btn-sm btn btn-block\">Notifications</a></p></div></div></div>\n</main></div><p> You can’t perform that action at this time.</p><details class=\"details-reset details-overlay details-overlay-dark lh-default color-fg-default hx_rsm\" open=\"open\">\n\n</details>","id":"224ccef4-d879-51af-856a-02ba457a8730","title":"GitHub - eighty4/cquill: Versioned CQL migrations for Cassandra and ScyllaDB","origin_url":"https://github.com/eighty4/cquill","url":"https://github.com/eighty4/cquill","wallabag_created_at":"2023-12-02T16:52:29+00:00","published_at":null,"published_by":"['eighty4']","reading_time":null,"domain_name":"github.com","preview_picture":"https://opengraph.githubassets.com/00886de67360da230128871de2a210c368c15ce47adec6af8125c20688f7a6d0/eighty4/cquill","tags":["migration","schema","scylladb","cassandra","schema.managements"],"description":"{{ message }}\n / cquill PublicNotifications\nFork 2\n\n Star 1 \n\nVersioned CQL migrations for Cassandra and ScyllaDBLicense MIT license 1 star  2 forks  Activity Star Notifications\n You can’t perform tha..."},{"content":"<div id=\"js-flash-container\" data-turbo-replace=\"\"><div class=\"flash flash-full {{ className }} px-2\"><p>{{ message }}</p></div>\n</div><div class=\"application-main\" data-commit-hovercards-enabled=\"\" data-discussion-hovercards-enabled=\"\" data-issue-and-pr-hovercards-enabled=\"\"><main id=\"js-repo-pjax-container\"><div id=\"repository-container-header\" class=\"pt-3 hide-full-screen c6\" data-turbo-replace=\"\"><div class=\"d-flex flex-wrap flex-justify-end mb-3 px-3 px-md-4 px-lg-5 c4\"><p> / <strong itemprop=\"name\" class=\"mr-2 flex-self-stretch\"><a data-pjax=\"#repo-content-pjax-container\" data-turbo-frame=\"repo-content-turbo-frame\" href=\"https://github.com/embulk/embulk\">embulk</a></strong> Public</p><div id=\"repository-details-container\" data-turbo-replace=\"\"><ul class=\"pagehead-actions flex-shrink-0 d-none d-md-inline c3\"><li><a href=\"https://github.com/login?return_to=%2Fembulk%2Fembulk\" rel=\"nofollow\" data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;notification subscription menu watch&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/embulk/embulk&quot;,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"c8b67ee18acde297e993cb710324046ffdb601329a0c4c5eb8141cc0f4842aab\" aria-label=\"You must be signed in to change notification settings\" data-view-component=\"true\" class=\"tooltipped tooltipped-s btn-sm btn\">Notifications</a></li>\n<li><a id=\"fork-button\" href=\"https://github.com/login?return_to=%2Fembulk%2Fembulk\" rel=\"nofollow\" data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;repo details fork button&quot;,&quot;repository_id&quot;:24084730,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/embulk/embulk&quot;,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"d084fecb624f91e1df2f8b1fab3617c8d355f34a7581bf5fd89e1a7d92531bb0\" data-view-component=\"true\" class=\"btn-sm btn\">Fork 205</a></li>\n<li>\n<p><a href=\"https://github.com/login?return_to=%2Fembulk%2Fembulk\" rel=\"nofollow\" data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;star button&quot;,&quot;repository_id&quot;:24084730,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/embulk/embulk&quot;,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"28dcb37034a44fde4fa1b0679aadb225140532b6bed83ec0462a5d5ffd36dd3c\" aria-label=\"You must be signed in to star a repository\" data-view-component=\"true\" class=\"tooltipped tooltipped-s btn-sm btn BtnGroup-item\"> Star 1.7k</a> </p>\n</li>\n</ul></div></div><div class=\"d-block d-md-none mb-2 px-3 px-md-4 px-lg-5\" id=\"responsive-meta-container\" data-turbo-replace=\"\"><p class=\"f4 mb-3\">Embulk: Pluggable Bulk Data Loader.</p><p><a title=\"https://www.embulk.org/\" role=\"link\" target=\"_blank\" class=\"text-bold\" rel=\"noopener noreferrer\" href=\"https://www.embulk.org/\">www.embulk.org/</a></p><h3 class=\"sr-only\">License</h3><details class=\"details-reset details-overlay details-overlay-dark lh-default color-fg-default d-inline mb-2\"><summary class=\"Link--muted\"> Apache-2.0 and 4 other licenses found</summary><p>\n</p><h3 class=\"Box-title\">Licenses found</h3>\n<a class=\"Link--primary no-underline\" aria-label=\"Apache-2.0 license\" href=\"https://github.com/embulk/embulk/blob/master/LICENSE\">\n<div class=\"Box-row Box-row--hover-gray border-top rounded-0\"><p>Apache-2.0</p>LICENSE</div>\n</a> <a class=\"Link--primary no-underline\" aria-label=\"Apache-2.0 license\" href=\"https://github.com/embulk/embulk/blob/master/LICENSE-jctools\">\n<div class=\"Box-row Box-row--hover-gray border-top rounded-0\"><p>Apache-2.0</p>LICENSE-jctools</div>\n</a> <a class=\"Link--primary no-underline\" aria-label=\"Unknown license\" href=\"https://github.com/embulk/embulk/blob/master/LICENSE-logback\">\n<div class=\"Box-row Box-row--hover-gray border-top rounded-0\"><p>Unknown</p>LICENSE-logback</div>\n</a> <a class=\"Link--primary no-underline\" aria-label=\"MIT license\" href=\"https://github.com/embulk/embulk/blob/master/LICENSE-slf4j\">\n<div class=\"Box-row Box-row--hover-gray border-top rounded-0\"><p>MIT</p>LICENSE-slf4j</div>\n</a> <a class=\"Link--primary no-underline\" aria-label=\"MIT license\" href=\"https://github.com/embulk/embulk/blob/master/LICENSE-slf4j-netty\">\n<div class=\"Box-row Box-row--hover-gray border-top rounded-0\"><p>MIT</p>LICENSE-slf4j-netty</div>\n</a></details><p><a class=\"Link--secondary no-underline mr-3\" href=\"https://github.com/embulk/embulk/stargazers\"> 1.7k stars</a> <a class=\"Link--secondary no-underline mr-3\" href=\"https://github.com/embulk/embulk/forks\"> 205 forks</a> <a class=\"Link--secondary no-underline d-inline-block\" href=\"https://github.com/embulk/embulk/activity\"> Activity</a></p><div class=\"d-flex flex-wrap gap-2\"><p><a href=\"https://github.com/login?return_to=%2Fembulk%2Fembulk\" rel=\"nofollow\" data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;star button&quot;,&quot;repository_id&quot;:24084730,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/embulk/embulk&quot;,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"28dcb37034a44fde4fa1b0679aadb225140532b6bed83ec0462a5d5ffd36dd3c\" aria-label=\"You must be signed in to star a repository\" data-view-component=\"true\" class=\"tooltipped tooltipped-s btn-sm btn btn-block BtnGroup-item\"> Star</a> </p><p><a href=\"https://github.com/login?return_to=%2Fembulk%2Fembulk\" rel=\"nofollow\" data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;notification subscription menu watch&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/embulk/embulk&quot;,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"c8b67ee18acde297e993cb710324046ffdb601329a0c4c5eb8141cc0f4842aab\" aria-label=\"You must be signed in to change notification settings\" data-view-component=\"true\" class=\"tooltipped tooltipped-s btn-sm btn btn-block\">Notifications</a></p></div></div></div>\n</main></div><p> You can’t perform that action at this time.</p><details class=\"details-reset details-overlay details-overlay-dark lh-default color-fg-default hx_rsm\" open=\"open\">\n\n</details>","id":"6a67fb02-1f67-546f-9b11-bf0908226c91","title":"GitHub - embulk/embulk: Embulk: Pluggable Bulk Data Loader.","origin_url":"https://github.com/embulk/embulk","url":"https://github.com/embulk/embulk","wallabag_created_at":"2023-12-01T02:40:41+00:00","published_at":null,"published_by":"['embulk']","reading_time":null,"domain_name":"github.com","preview_picture":"https://opengraph.githubassets.com/710726da5afbe5bac1b38fd385c4e7c1e62d1ee9a922a947bbc3f958828f9974/embulk/embulk","tags":["hive","elasticsearch","cassandra","data.processing","elastic","migration","mysql","etl","redis"],"description":"{{ message }}\n / embulk PublicNotifications\nFork 205\n\n Star 1.7k \n\nEmbulk: Pluggable Bulk Data Loader.www.embulk.org/License Apache-2.0 and 4 other licenses found\nLicenses found\n\nApache-2.0LICENSE\n \nA..."},{"content":"<div id=\"js-flash-container\" data-turbo-replace=\"\"><div class=\"flash flash-full   {{ className }}\"><div class=\"px-2\"><div aria-atomic=\"true\" role=\"alert\" class=\"js-flash-alert\"><p>{{ message }}</p></div></div></div>\n  </div><div class=\"application-main\" data-commit-hovercards-enabled=\"\" data-discussion-hovercards-enabled=\"\" data-issue-and-pr-hovercards-enabled=\"\"><div itemscope=\"itemscope\" itemtype=\"http://schema.org/SoftwareSourceCode\" class=\"\"><main id=\"js-repo-pjax-container\"><div id=\"repository-container-header\" class=\"pt-3 hide-full-screen\" data-turbo-replace=\"\"><div class=\"d-flex flex-wrap flex-justify-end mb-3  px-3 px-md-4 px-lg-5\"><div class=\"flex-auto min-width-0 width-fit mr-3\"><p>    \n    /\n    <strong itemprop=\"name\" class=\"mr-2 flex-self-stretch\">\n      <a data-pjax=\"#repo-content-pjax-container\" data-turbo-frame=\"repo-content-turbo-frame\" href=\"https://github.com/datastax/dsbulk-migrator\">dsbulk-migrator</a>\n    </strong>\n    Public</p></div><div id=\"repository-details-container\" data-turbo-replace=\"\"><ul class=\"pagehead-actions flex-shrink-0 d-none d-md-inline\"><li>\n            <a href=\"https://github.com/login?return_to=%2Fdatastax%2Fdsbulk-migrator\" rel=\"nofollow\" data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;notification subscription menu watch&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/datastax/dsbulk-migrator&quot;,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"9b3c79f7859a6fecd53f45fe8cf0b034c24a2fbb419659b4ca71f13428381f74\" aria-label=\"You must be signed in to change notification settings\" data-view-component=\"true\" class=\"tooltipped tooltipped-s btn-sm btn\">    Notifications\n</a>\n  </li>\n  <li>\n          <a id=\"fork-button\" href=\"https://github.com/login?return_to=%2Fdatastax%2Fdsbulk-migrator\" rel=\"nofollow\" data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;repo details fork button&quot;,&quot;repository_id&quot;:539921030,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/datastax/dsbulk-migrator&quot;,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"e022fed6ca06db121fc11268868665c1295c9caf5e1e93ffd1a2c605689b1d59\" data-view-component=\"true\" class=\"btn-sm btn\">    Fork\n    8\n</a>\n  </li>\n  <li>\n        <p><a href=\"https://github.com/login?return_to=%2Fdatastax%2Fdsbulk-migrator\" rel=\"nofollow\" data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;star button&quot;,&quot;repository_id&quot;:539921030,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/datastax/dsbulk-migrator&quot;,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"f2acfee52fdcbdd9a169d1b41c0b06dc5cf41afdb5d1ad0c912069d208e578d6\" aria-label=\"You must be signed in to star a repository\" data-view-component=\"true\" class=\"tooltipped tooltipped-s btn-sm btn BtnGroup-item\">    \n          Star\n          8\n</a>        </p>\n  </li>\n</ul></div></div><div id=\"responsive-meta-container\" data-turbo-replace=\"\"><div class=\"d-block d-md-none mb-2 px-3 px-md-4 px-lg-5\"><h3 class=\"sr-only\">License</h3><p><a href=\"https://github.com/datastax/dsbulk-migrator/blob/main/LICENSE\" class=\"Link--muted\" data-analytics-event=\"{&quot;category&quot;:&quot;Repository Overview&quot;,&quot;action&quot;:&quot;click&quot;,&quot;label&quot;:&quot;location:sidebar;file:license&quot;}\">\n      \n     Apache-2.0 license\n    </a></p><p><a class=\"Link--secondary no-underline mr-3\" href=\"https://github.com/datastax/dsbulk-migrator/stargazers\">\n          \n          8\n          stars\n</a>        <a class=\"Link--secondary no-underline mr-3\" href=\"https://github.com/datastax/dsbulk-migrator/forks\">\n          \n          8\n          forks\n</a>        <a class=\"Link--secondary no-underline d-inline-block\" href=\"https://github.com/datastax/dsbulk-migrator/activity\">\n          \n          Activity\n</a></p><div class=\"d-flex flex-wrap gap-2\"><p><a href=\"https://github.com/login?return_to=%2Fdatastax%2Fdsbulk-migrator\" rel=\"nofollow\" data-hydro-click=\"{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;notification subscription menu watch&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/datastax/dsbulk-migrator&quot;,&quot;user_id&quot;:null}}\" data-hydro-click-hmac=\"9b3c79f7859a6fecd53f45fe8cf0b034c24a2fbb419659b4ca71f13428381f74\" aria-label=\"You must be signed in to change notification settings\" data-view-component=\"true\" class=\"tooltipped tooltipped-s btn-sm btn btn-block\">    Notifications\n</a></p></div></div></div></div>\n<div id=\"repo-content-pjax-container\" class=\"repository-content\"><div class=\"clearfix container-xl px-md-4 px-lg-5 px-3 mt-4\"><div><div id=\"spoof-warning\" class=\"mt-0 pb-3\" hidden=\"hidden\" aria-hidden=\"\"><div data-view-component=\"true\" class=\"flash flash-warn mt-0 clearfix\"><p>This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.</p></div></div></div></div></div>\n</main></div></div><p>\n    You can’t perform that action at this time.</p><details class=\"details-reset details-overlay details-overlay-dark lh-default color-fg-default hx_rsm\" open=\"open\"><details class=\"Box Box--overlay d-flex flex-column anim-fade-in fast hx_rsm-dialog hx_rsm-modal\">\n      \n    </details></details>","id":"147c0a49-bc35-52b1-bf83-313db9594f8a","title":"GitHub - datastax/dsbulk-migrator","origin_url":"https://github.com/datastax/dsbulk-migrator","url":"https://github.com/datastax/dsbulk-migrator","wallabag_created_at":"2023-11-29T16:29:48+00:00","published_at":null,"published_by":"['datastax']","reading_time":null,"domain_name":"github.com","preview_picture":"https://opengraph.githubassets.com/70a4f3f9f9136c4594ab14ccf9bebd688f1fcfa48020f7ca19db5d95af4a417b/datastax-archive/dsbulk-migrator","tags":["migration","datastax","astra","cassandra","datastax.astra","dsbulk"],"description":"{{ message }}\n    \n    /\n    \ndsbulk-migrator\n\n    Public\n    Notifications\n\n\n\n    Fork\n    8\n\n\n\n    \n          Star\n          8\n \n\nLicense\n      \n     Apache-2.0 license\n    \n          \n          8\n ..."},{"content":"<article><div class=\"l\"><div class=\"l\"><section><div><div class=\"eo ep eq er es\"><div class=\"ab ca\"><div class=\"ch bg dx dy dz ea\"><div><div><h2 id=\"61e4\" class=\"pw-subtitle-paragraph fs eu ev be b ft fu fv fw fx fy fz ga gb gc gd ge gf gg gh cp gi\">Author: <a class=\"af gj\" href=\"https://fr.linkedin.com/in/alexander-dejanovski-2a9912a\" rel=\"noopener ugc nofollow\" target=\"_blank\">Alexander Dejanovski</a></h2><div class=\"gk gl gm gn go\"><div class=\"speechify-ignore ab co\"><div class=\"speechify-ignore bg l\"><div class=\"gp gq gr gs gt ab\"><div><div class=\"ab gu\"><a rel=\"noopener follow\" href=\"https://medium.com/@datastax?source=post_page-----f824f5bbf50b--------------------------------\"><div><div class=\"bl\" aria-hidden=\"false\"><div class=\"l gv gw bx gx gy\"><div class=\"l hc\"><img alt=\"DataStax\" class=\"l ec bx dc dd cw\" src=\"https://miro.medium.com/v2/resize:fill:88:88/1*armpUA9HCxIkYBeqlKqWvA.png\" width=\"44\" height=\"44\" data-testid=\"authorPhoto\" referrerpolicy=\"no-referrer\" /></div></div></div></div></a><a href=\"https://medium.com/building-the-open-data-stack?source=post_page-----f824f5bbf50b--------------------------------\" rel=\"noopener follow\"><div class=\"hd ab hc\"><div><div class=\"bl\" aria-hidden=\"false\"><div class=\"l he hf bx gx hg\"><div class=\"l hc\"><img alt=\"Building Real-World, Real-Time AI\" class=\"l ec bx bq hh cw\" src=\"https://miro.medium.com/v2/resize:fill:48:48/1*-Zpv5B7sIixLS1_VVKJbpA.png\" width=\"24\" height=\"24\" data-testid=\"publicationPhoto\" referrerpolicy=\"no-referrer\" /></div></div></div></div></div></a></div></div><div class=\"bm bg l\"><div class=\"ab\"><div><div class=\"hi ab q\"><div class=\"ab q hj\"><div class=\"ab q\"><div><div class=\"bl\" aria-hidden=\"false\"><p class=\"be b hk hl bj\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar hm\" data-testid=\"authorName\" rel=\"noopener follow\" href=\"https://medium.com/@datastax?source=post_page-----f824f5bbf50b--------------------------------\">DataStax</a></p></div></div></div>·<p class=\"be b hk hl gi\"><a class=\"hp hq ah ai aj ak al am an ao ap aq ar hr hs ht\" rel=\"noopener follow\" href=\"https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fsubscribe%2Fuser%2Ffc9a2aaa8a2a&amp;operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fbuilding-the-open-data-stack%2Fhow-to-migrate-your-cassandra-database-to-kubernetes-with-zero-downtime-f824f5bbf50b&amp;user=DataStax&amp;userId=fc9a2aaa8a2a&amp;source=post_page-fc9a2aaa8a2a----f824f5bbf50b---------------------post_header-----------\">Follow</a></p></div></div></div></div><div class=\"l hu\"><div class=\"ab cm hv hw hx\"><div class=\"hy hz ab\"><div class=\"be b bf z gi ab ia\">Published in<div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar hm ab q\" data-testid=\"publicationName\" href=\"https://medium.com/building-the-open-data-stack?source=post_page-----f824f5bbf50b--------------------------------\" rel=\"noopener follow\"><p class=\"be b bf z ic id ie if ig ih ii ij bj\">Building Real-World, Real-Time AI</p></a></div></div></div><div class=\"h k\">·</div></div><div class=\"ab ae\">8 min read<div class=\"ik il l\" aria-hidden=\"true\">·</div>Feb 23, 2022</div></div></div></div></div><div class=\"ab co im in io ip iq ir is it iu iv iw ix iy iz ja jb\"><div class=\"h k w jr js q\"><div class=\"jt l\"><div class=\"ab q ju\"><div class=\"pw-multi-vote-icon hc ib jv jw jx\"><div class=\"\"><div class=\"jy jz ka kb kc kd ke am kf kg kh jx\"></div></div><div class=\"pw-multi-vote-count l ki kj kk kl km kn ko\"><p class=\"be b kp z gi\">--</p></div></div></div><div><div class=\"bl\" aria-hidden=\"false\"></div></div><div class=\"ab q jc jd je jf jg jh ji jj jk jl jm jn jo jp jq\"><div class=\"ec kx cm\"><div class=\"l ae\"><div class=\"ab ca\"><div class=\"ky kz la lb lc ld ch bg\"><div class=\"ab\"><div class=\"bl bg\" aria-hidden=\"false\"><div><div class=\"bl\" aria-hidden=\"false\"></div></div></div></div></div></div></div><div class=\"bl\" aria-hidden=\"false\" aria-describedby=\"postFooterSocialMenu\" aria-labelledby=\"postFooterSocialMenu\"><div><div class=\"bl\" aria-hidden=\"false\"></div></div></div></div></div></div></div></div><figure class=\"lz ma mb mc md me lw lx paragraph-image\"><div role=\"button\" tabindex=\"0\" class=\"mf mg hc mh bg mi\"><div class=\"lw lx ly\"></div></div></figure><p id=\"526d\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\"><a class=\"af gj\" href=\"https://dtsx.io/3IIrfZN\" rel=\"noopener ugc nofollow\" target=\"_blank\"><em class=\"ng\">K8ssandra</em></a><em class=\"ng\"> is a cloud-native distribution of the </em><a class=\"af gj\" href=\"https://cassandra.apache.org/_/index.html\" rel=\"noopener ugc nofollow\" target=\"_blank\"><em class=\"ng\">Apache Cassandra®</em></a><em class=\"ng\"> database that runs on Kubernetes, with a suite of tools to ease and automate operational tasks. In this post, we’ll walk you through a database migration from a Cassandra cluster running in AWS Amazon Elastic Compute Cloud (EC2) to a K8ssandra cluster running in Kubernetes on AWS Elastic Kubernetes Service (EKS), with zero downtime.</em></p><p id=\"aa21\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">As a Cassandra user, your expectation should be that migrating to K8ssandra would happen without downtime. To achieve zero downtime, you can use “classic” clusters running on virtual machines or bare metal instances and the data center (DC) switch technique, commonly used in the Cassandra community, to transfer clusters to different hardware or environments. The good news is that it’s not very different for clusters running in Kubernetes because most Container Network Interfaces (CNI) will provide routable pod IPs.</p><h1 id=\"3397\" class=\"nh ni ev be nj nk nl fv nm nn no fy np nq nr ns nt nu nv nw nx ny nz oa ob oc bj\">Routable pod IPs in Kubernetes</h1><p id=\"893b\" class=\"pw-post-body-paragraph mk ml ev mm b ft od mo mp fw oe mr ms mt of mv mw mx og mz na nb oh nd ne nf eo bj\">A common misconception about Kubernetes networking is that services are the only way to expose pods outside the cluster and that pods themselves are only reachable directly from within the cluster.</p><p id=\"5f53\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">Looking at the <a class=\"af gj\" href=\"https://docs.projectcalico.org/networking/determine-best-networking\" rel=\"noopener ugc nofollow\" target=\"_blank\">Calico documentation</a>, we can read the following:</p><blockquote class=\"oi oj ok\"><p id=\"6b00\" class=\"mk ml ng mm b ft mn mo mp fw mq mr ms ol mu mv mw om my mz na on nc nd ne nf eo bj\">“If the pod IP addresses are routable outside of the cluster then pods can connect to the outside world without Source Network Address Translation (SNAT), and the outside world can connect directly to pods without going via a Kubernetes service or Kubernetes ingress.”</p></blockquote><p id=\"82a0\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">The same documentation tells us that the default CNI used in AWS EKS, Azure AKS, and GCP GKE provide routable pod IPs within a virtual private cloud (VPC).</p><p id=\"4e2f\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">A VPC is necessary because Cassandra nodes in both data centers will need to communicate without going through services. Each Cassandra node stores the list of all the other nodes in the cluster in the <code class=\"cw oo op oq or b\">system.peers(_v2)</code> table and communicates with them using the IP addresses stored there. If pod IPs aren’t routable, there’s no (easy) way to create a hybrid Cassandra cluster that would span outside a Kubernetes cluster’s boundaries.</p><h1 id=\"dbc1\" class=\"nh ni ev be nj nk nl fv nm nn no fy np nq nr ns nt nu nv nw nx ny nz oa ob oc bj\">Database migration using Cassandra data center switch</h1><p id=\"c78a\" class=\"pw-post-body-paragraph mk ml ev mm b ft od mo mp fw oe mr ms mt of mv mw mx og mz na nb oh nd ne nf eo bj\">The traditional technique to migrate a cluster to a different set of hardware or environment is to:</p><ul class=\"\"><li id=\"db6f\" class=\"mk ml ev mm b ft mn mo mp fw mq mr ms mt os mv mw mx ot mz na nb ou nd ne nf ov ow ox bj\">Locate nodes in the target infrastructure and add a new data center to the cluster</li><li id=\"b91c\" class=\"mk ml ev mm b ft oy mo mp fw oz mr ms mt pa mv mw mx pb mz na nb pc nd ne nf ov ow ox bj\">Configure keyspaces so that Cassandra replicates data to the new data center</li><li id=\"39e2\" class=\"mk ml ev mm b ft oy mo mp fw oz mr ms mt pa mv mw mx pb mz na nb pc nd ne nf ov ow ox bj\">Switch traffic to the new data center once it’s up to date</li><li id=\"7ac2\" class=\"mk ml ev mm b ft oy mo mp fw oz mr ms mt pa mv mw mx pb mz na nb pc nd ne nf ov ow ox bj\">Decommission the old infrastructure</li></ul><p id=\"c9b8\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">While this procedure was brilliantly documented by my co-worker Alain Rodriguez on the <a class=\"af gj\" href=\"https://thelastpickle.com/blog/2019/02/26/data-center-switch.html\" rel=\"noopener ugc nofollow\" target=\"_blank\">TLP blog</a>, there are some subtleties related to running our new data center in Kubernetes, and more precisely, using K8ssandra, which we’ll cover in detail here.</p><p id=\"80f5\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">Here are the steps we’ll go through to perform the migration:</p><ol class=\"\"><li id=\"1c46\" class=\"mk ml ev mm b ft mn mo mp fw mq mr ms mt os mv mw mx ot mz na nb ou nd ne nf pd ow ox bj\">Restrict traffic to the existing data center</li><li id=\"2553\" class=\"mk ml ev mm b ft oy mo mp fw oz mr ms mt pa mv mw mx pb mz na nb pc nd ne nf pd ow ox bj\">Expand the Cassandra cluster by adding a new data center in a Kubernetes cluster using K8ssandra</li><li id=\"95c3\" class=\"mk ml ev mm b ft oy mo mp fw oz mr ms mt pa mv mw mx pb mz na nb pc nd ne nf pd ow ox bj\">Rebuild the newly created data center</li><li id=\"9d07\" class=\"mk ml ev mm b ft oy mo mp fw oz mr ms mt pa mv mw mx pb mz na nb pc nd ne nf pd ow ox bj\">Switch traffic over to the K8ssandra data center</li><li id=\"1304\" class=\"mk ml ev mm b ft oy mo mp fw oz mr ms mt pa mv mw mx pb mz na nb pc nd ne nf pd ow ox bj\">Decommission the original Cassandra data center</li></ol><h1 id=\"bccb\" class=\"nh ni ev be nj nk nl fv nm nn no fy np nq nr ns nt nu nv nw nx ny nz oa ob oc bj\">Performing the migration</h1><h2 id=\"42ba\" class=\"pe ni ev be nj pf pg ph nm pi pj pk np mt pl pm pn mx po pp pq nb pr ps pt pu bj\">Initial state</h2><p id=\"451d\" class=\"pw-post-body-paragraph mk ml ev mm b ft od mo mp fw oe mr ms mt of mv mw mx og mz na nb oh nd ne nf eo bj\">Our starting point is a Cassandra 4.0-rc1 cluster running in AWS on EC2 instances:</p><figure class=\"lz ma mb mc md me\"><div class=\"pv ic l hc\"></div></figure><p id=\"6b4c\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">In the AWS console, we can access the details of a node in the EC2 service and locate its VPC id, which we’ll need later to create a peering connection with the EKS cluster VPC:</p><figure class=\"lz ma mb mc md me lw lx paragraph-image\"><div role=\"button\" tabindex=\"0\" class=\"mf mg hc mh bg mi\"><div class=\"lw lx py\"></div></div><figcaption class=\"pz qa qb lw lx qc qd be b bf z gi\">Figure 1. Finding the VPC id.</figcaption></figure><p id=\"6826\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">The next step is to create an EKS cluster with the correct settings so that pod IPs will be reachable from the existing EC2 instances.</p><h1 id=\"6cc5\" class=\"nh ni ev be nj nk nl fv nm nn no fy np nq nr ns nt nu nv nw nx ny nz oa ob oc bj\">Creating the EKS cluster</h1><p id=\"e40e\" class=\"pw-post-body-paragraph mk ml ev mm b ft od mo mp fw oe mr ms mt of mv mw mx og mz na nb oh nd ne nf eo bj\">We’ll use the <a class=\"af gj\" href=\"https://github.com/k8ssandra/k8ssandra-terraform\" rel=\"noopener ugc nofollow\" target=\"_blank\">k8ssandra-terraform</a> project to spin up an EKS cluster with three nodes (see the guide on <a class=\"af gj\" href=\"https://dtsx.io/3KKsJ7w\" rel=\"noopener ugc nofollow\" target=\"_blank\">how to install K8ssandra on EKS</a> for help).</p><p id=\"6b43\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">After cloning the project locally, we initialize a few env variables to get started:</p><figure class=\"lz ma mb mc md me\"><div class=\"pv ic l hc\"></div></figure><p id=\"7c8d\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">Then, we go to the env directory and initialize our Terraform files:</p><figure class=\"lz ma mb mc md me\"><div class=\"pv ic l hc\"></div></figure><p id=\"cb06\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">We can then update the <code class=\"cw oo op oq or b\">variables.tf</code> file and adjust it to our needs:</p><figure class=\"lz ma mb mc md me\"><div class=\"pv ic l hc\"></div></figure><p id=\"ebcd\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">Ensure the private classless inter-domain routing (CIDR) blocks are different from those used in the EC2 cluster VPC otherwise, you may end up with IP addresses conflicts.</p><p id=\"9093\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">Now create the EKS cluster and the three worker nodes:</p><figure class=\"lz ma mb mc md me\"><div class=\"pv ic l hc\"></div></figure><p id=\"9737\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">The operation will take a few minutes to complete and output something similar to this:</p><figure class=\"lz ma mb mc md me\"><div class=\"pv ic l hc\"></div></figure><p id=\"0d5f\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">Note the <code class=\"cw oo op oq or b\">connect_cluster</code> command, which will allow us to create the kubeconfig context entry to interact with the cluster using <code class=\"cw oo op oq or b\">kubectl</code>:</p><figure class=\"lz ma mb mc md me\"><div class=\"pv ic l hc\"></div></figure><p id=\"f648\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">We can now check the list of worker nodes in our Kubernetes cluster:</p><figure class=\"lz ma mb mc md me\"><div class=\"pv ic l hc\"></div></figure><h1 id=\"e028\" class=\"nh ni ev be nj nk nl fv nm nn no fy np nq nr ns nt nu nv nw nx ny nz oa ob oc bj\">VPC peering and security groups</h1><p id=\"4d97\" class=\"pw-post-body-paragraph mk ml ev mm b ft od mo mp fw oe mr ms mt of mv mw mx og mz na nb oh nd ne nf eo bj\">Our Terraform scripts will create a specific VPC for the EKS cluster. For our Cassandra nodes to communicate with the K8ssandra nodes, we’ll need to create a peering connection between both VPCs. Follow the documentation provided by AWS on this topic to create the peering connection: <a class=\"af gj\" href=\"https://docs.aws.amazon.com/vpc/latest/peering/create-vpc-peering-connection.html\" rel=\"noopener ugc nofollow\" target=\"_blank\">VPC Peering Connection</a>.</p><p id=\"57d8\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">Once the VPC peering connection is created, and the route tables are updated in both VPCs, update the inbound rules of the security groups for both the EC2 Cassandra nodes and the EKS worker nodes. You’ll want to accept all TCP traffic on ports 7000 and 7001, which Cassandra nodes use to communicate with each other (unless configured otherwise).</p><h1 id=\"0e21\" class=\"nh ni ev be nj nk nl fv nm nn no fy np nq nr ns nt nu nv nw nx ny nz oa ob oc bj\">Preparing the Cassandra cluster for the expansion</h1><p id=\"69ee\" class=\"pw-post-body-paragraph mk ml ev mm b ft od mo mp fw oe mr ms mt of mv mw mx og mz na nb oh nd ne nf eo bj\">When expanding a Cassandra cluster to another data center, assuming you haven’t created your cluster with the <code class=\"cw oo op oq or b\"><a class=\"af gj\" href=\"https://dtsx.io/3shIsCT\" rel=\"noopener ugc nofollow\" target=\"_blank\">SimpleSnitch</a></code> (otherwise, you’ll have to <a class=\"af gj\" href=\"https://dtsx.io/3g3sq9F\" rel=\"noopener ugc nofollow\" target=\"_blank\">switch snitches first</a>), you need to make sure your keyspaces use the <code class=\"cw oo op oq or b\"><a class=\"af gj\" href=\"https://dtsx.io/3AIUN6S\" rel=\"noopener ugc nofollow\" target=\"_blank\">NetworkTopologyStrategy</a></code> (NTS). This replication strategy is the only one that is DC and rack aware. The default <code class=\"cw oo op oq or b\"><a class=\"af gj\" href=\"https://dtsx.io/3KQMGcO\" rel=\"noopener ugc nofollow\" target=\"_blank\">SimpleStrategy</a></code> will not consider DCs and behave as if all nodes were collocated in the same DC and rack.</p><figure class=\"lz ma mb mc md me lw lx paragraph-image\"><div role=\"button\" tabindex=\"0\" class=\"mf mg hc mh bg mi\"><div class=\"lw lx qe\"></div></div><figcaption class=\"pz qa qb lw lx qc qd be b bf z gi\">Figure 2. Original Cassandra cluster.</figcaption></figure><p id=\"f449\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">We’ll use <code class=\"cw oo op oq or b\">cqlsh</code> on one of the EC2 Cassandra nodes to list the existing keyspaces and update their replication strategy.</p><figure class=\"lz ma mb mc md me\"><div class=\"pv ic l hc\"></div></figure><p id=\"777c\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">Several system keyspaces use the special <code class=\"cw oo op oq or b\">LocalStrategy</code> and are not replicated across nodes. They contain only node-specific information and cannot be altered in any way.</p><p id=\"fee8\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">We’ll alter the following keyspaces to make them use NTS and only put replicas on the existing data center:</p><ul class=\"\"><li id=\"bba5\" class=\"mk ml ev mm b ft mn mo mp fw mq mr ms mt os mv mw mx ot mz na nb ou nd ne nf ov ow ox bj\"><code class=\"cw oo op oq or b\">system_auth</code> (contains user credentials for authentication purposes)</li><li id=\"b212\" class=\"mk ml ev mm b ft oy mo mp fw oz mr ms mt pa mv mw mx pb mz na nb pc nd ne nf ov ow ox bj\"><code class=\"cw oo op oq or b\">system_distributed</code> (contains repair history data and MV build status)</li><li id=\"ce13\" class=\"mk ml ev mm b ft oy mo mp fw oz mr ms mt pa mv mw mx pb mz na nb pc nd ne nf ov ow ox bj\"><code class=\"cw oo op oq or b\">system_traces</code> (contains probabilistic tracing data)</li><li id=\"0c21\" class=\"mk ml ev mm b ft oy mo mp fw oz mr ms mt pa mv mw mx pb mz na nb pc nd ne nf ov ow ox bj\"><code class=\"cw oo op oq or b\">tlp_stress</code> (user-created keyspace)</li></ul><p id=\"671a\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">Add any other user-created keyspace to the list. Here we only have the <code class=\"cw oo op oq or b\">tlp_stress</code> keyspace, created by the <a class=\"af gj\" href=\"https://thelastpickle.com/tlp-stress/\" rel=\"noopener ugc nofollow\" target=\"_blank\">tlp-stress</a> tool to generate some data for this migration.</p><p id=\"9043\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">We’ll now run the following command on all the above keyspaces using the existing data center name, in our case <code class=\"cw oo op oq or b\">us-west-2</code>:</p><figure class=\"lz ma mb mc md me\"><div class=\"pv ic l hc\"></div></figure><p id=\"1f79\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">You should make sure to pin client traffic to the <code class=\"cw oo op oq or b\">us-west-2</code> data center by specifying it as the local data center. You can do this by using the <code class=\"cw oo op oq or b\">DCAwareRoundRobinPolicy</code> in some older versions of the <a class=\"af gj\" href=\"https://dtsx.io/3KRxFHR\" rel=\"noopener ugc nofollow\" target=\"_blank\">DataStax drivers</a> or by specifying it as a local data center when creating a new <code class=\"cw oo op oq or b\">CqlSession</code> object in the<a class=\"af gj\" href=\"https://dtsx.io/34jkChm\" rel=\"noopener ugc nofollow\" target=\"_blank\"> 4.x branch of the Java Driver</a>:</p><figure class=\"lz ma mb mc md me\"><div class=\"pv ic l hc\"></div></figure><p id=\"94d8\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">You can find more information in the driver’s documentation.</p><h1 id=\"9d5c\" class=\"nh ni ev be nj nk nl fv nm nn no fy np nq nr ns nt nu nv nw nx ny nz oa ob oc bj\">Deploying K8ssandra as a new data center</h1><p id=\"7ee8\" class=\"pw-post-body-paragraph mk ml ev mm b ft od mo mp fw oe mr ms mt of mv mw mx og mz na nb oh nd ne nf eo bj\">​​K8ssandra ships with <a class=\"af gj\" href=\"https://dtsx.io/3KQ9FVu\" rel=\"noopener ugc nofollow\" target=\"_blank\">cass-operator</a>, which orchestrates the Cassandra nodes and handles their configuration. Cass-operator exposes an <code class=\"cw oo op oq or b\">additionalSeeds</code> setting which allows us to add seed nodes that are not managed by the local instance of cass-operator and, by doing so, create a new data center that will expand an existing cluster.</p><figure class=\"lz ma mb mc md me lw lx paragraph-image\"><div role=\"button\" tabindex=\"0\" class=\"mf mg hc mh bg mi\"><div class=\"lw lx qe\"></div></div><figcaption class=\"pz qa qb lw lx qc qd be b bf z gi\">Figure 3. Creating a K8ssandra deployment for the new data center.</figcaption></figure><p id=\"f02a\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">We’ll put all our existing Cassandra nodes as additional seeds, and you shouldn’t need more than three nodes in this list, even if your original cluster is larger. The following <code class=\"cw oo op oq or b\">migration.yaml</code> values file will be used for our K8ssandra Helm chart:</p><figure class=\"lz ma mb mc md me\"><div class=\"pv ic l hc\"></div></figure><p id=\"2d1b\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">Note that the cluster name must match the value used for the EC2 Cassandra nodes, and the data center should be named differently than the existing one(s). We’ll only install Cassandra in our K8ssandra data center, but you could deploy other components during this phase.</p><p id=\"08ec\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">Let’s deploy K8ssandra and have it join the Cassandra cluster:</p><figure class=\"lz ma mb mc md me\"><div class=\"pv ic l hc\"></div></figure><p id=\"ab57\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">You can monitor the logs of the Cassandra pods to see if they’re joining appropriately:</p><figure class=\"lz ma mb mc md me\"><div class=\"pv ic l hc\"></div></figure><p id=\"4109\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">Cass-operator will only start one node at a time. So, if you get a message that looks like the following, try checking the logs of another pod:</p><figure class=\"lz ma mb mc md me\"><div class=\"pv ic l hc\"></div></figure><p id=\"395c\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">If VPC peering is done appropriately, the nodes should join the cluster one by one, and after a while, <code class=\"cw oo op oq or b\">nodetool status</code> should give an output that looks like this:</p><figure class=\"lz ma mb mc md me\"><div class=\"pv ic l hc\"></div></figure><h1 id=\"76df\" class=\"nh ni ev be nj nk nl fv nm nn no fy np nq nr ns nt nu nv nw nx ny nz oa ob oc bj\">Rebuilding the new data center</h1><p id=\"7401\" class=\"pw-post-body-paragraph mk ml ev mm b ft od mo mp fw oe mr ms mt of mv mw mx og mz na nb oh nd ne nf eo bj\">Now that our K8ssandra data center has joined the cluster, we’ll alter the replication strategies to create replicas in the <code class=\"cw oo op oq or b\">k8s-1</code> DC for the keyspaces we previously altered:</p><figure class=\"lz ma mb mc md me\"><div class=\"pv ic l hc\"></div></figure><figure class=\"lz ma mb mc md me lw lx paragraph-image\"><div role=\"button\" tabindex=\"0\" class=\"mf mg hc mh bg mi\"><div class=\"lw lx qe\"></div></div><figcaption class=\"pz qa qb lw lx qc qd be b bf z gi\">Figure 4. Replicating data to the new data center by rebuilding.</figcaption></figure><p id=\"5eb9\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">After altering all required keyspaces, rebuild the newly added nodes by running the following command for each Cassandra pod:</p><figure class=\"lz ma mb mc md me\"><div class=\"pv ic l hc\"></div></figure><p id=\"62db\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">Once all three nodes are rebuilt, the load should be similar on all nodes:</p><figure class=\"lz ma mb mc md me\"><div class=\"pv ic l hc\"></div></figure><p id=\"1917\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">Note that K8ssandra will create a new superuser and that the existing users in the cluster will be retained as well after the migration. You can forcefully recreate the existing superuser credentials in the K8ssandra data center by adding the following block in the “cassandra” section of the Helm values file:</p><figure class=\"lz ma mb mc md me\"><div class=\"pv ic l hc\"></div></figure><h1 id=\"371c\" class=\"nh ni ev be nj nk nl fv nm nn no fy np nq nr ns nt nu nv nw nx ny nz oa ob oc bj\">Switching traffic to the new data center</h1><p id=\"6825\" class=\"pw-post-body-paragraph mk ml ev mm b ft od mo mp fw oe mr ms mt of mv mw mx og mz na nb oh nd ne nf eo bj\">Client traffic can now be directed at the <code class=\"cw oo op oq or b\">k8s-1</code> data center, the same way we previously restricted it to <code class=\"cw oo op oq or b\">us-west-2</code>. If your clients are running from within the Kubernetes cluster, use the Cassandra service exposed by K8ssandra as a contact point for the driver.</p><p id=\"094f\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">If the clients are running outside of the Kubernetes cluster, you’ll need to enable Ingress and configure it appropriately (which is outside the scope of this blog post).</p><figure class=\"lz ma mb mc md me lw lx paragraph-image\"><div role=\"button\" tabindex=\"0\" class=\"mf mg hc mh bg mi\"><div class=\"lw lx qe\"></div></div><figcaption class=\"pz qa qb lw lx qc qd be b bf z gi\">Figure 5. Redirecting client traffic to the new data center.</figcaption></figure><h1 id=\"ddfe\" class=\"nh ni ev be nj nk nl fv nm nn no fy np nq nr ns nt nu nv nw nx ny nz oa ob oc bj\">Decommissioning the old data center and finishing the migration</h1><p id=\"2fca\" class=\"pw-post-body-paragraph mk ml ev mm b ft od mo mp fw oe mr ms mt of mv mw mx og mz na nb oh nd ne nf eo bj\">Once all the client apps/services have been restarted, we can alter our keyspaces to only replicate them on <code class=\"cw oo op oq or b\">k8s-1</code>:</p><figure class=\"lz ma mb mc md me\"><div class=\"pv ic l hc\"></div></figure><figure class=\"lz ma mb mc md me lw lx paragraph-image\"><div role=\"button\" tabindex=\"0\" class=\"mf mg hc mh bg mi\"><div class=\"lw lx qe\"></div></div><figcaption class=\"pz qa qb lw lx qc qd be b bf z gi\">Figure 6. Decommission the original data center.</figcaption></figure><p id=\"a276\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">Then ssh into each of the Cassandra nodes in <code class=\"cw oo op oq or b\">us-west-2</code> and run the following command to decommission them:</p><figure class=\"lz ma mb mc md me\"><div class=\"pv ic l hc\"></div></figure><p id=\"81bb\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">They will appear as leaving (UL) while the decommission is running:</p><figure class=\"lz ma mb mc md me\"><div class=\"pv ic l hc\"></div></figure><p id=\"fb0a\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">The operation should be fairly fast as no streaming will take place since we no longer have keyspaces replicated on <code class=\"cw oo op oq or b\">us-west-2</code>.</p><p id=\"0f14\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">Once all three nodes were decommissioned, we should be left with the <code class=\"cw oo op oq or b\">k8s-1</code> data center only:</p><figure class=\"lz ma mb mc md me\"><div class=\"pv ic l hc\"></div></figure><p id=\"d6fc\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">As a final step, we can now delete the VPC peering connection as it is no longer necessary.</p><p id=\"581c\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\">Note that the cluster can run in hybrid mode for as long as necessary. There’s no requirement to delete the <code class=\"cw oo op oq or b\">us-west-2</code> data center if it makes sense to keep it alive.</p><h1 id=\"9db3\" class=\"nh ni ev be nj nk nl fv nm nn no fy np nq nr ns nt nu nv nw nx ny nz oa ob oc bj\">Conclusion</h1><p id=\"768b\" class=\"pw-post-body-paragraph mk ml ev mm b ft od mo mp fw oe mr ms mt of mv mw mx og mz na nb oh nd ne nf eo bj\">In this post, I’ve illustrated that it’s indeed possible to migrate existing Cassandra clusters to K8ssandra without downtime by leveraging flat networking. This allows Cassandra nodes running in VMs to connect to Cassandra pods running in Kubernetes directly. If you haven’t explored <a class=\"af gj\" href=\"https://dtsx.io/3IIrfZN\" rel=\"noopener ugc nofollow\" target=\"_blank\">K8ssandra</a> yet, I strongly encourage you to check it out!</p><p id=\"54ef\" class=\"pw-post-body-paragraph mk ml ev mm b ft mn mo mp fw mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf eo bj\"><em class=\"ng\">Follow the </em><a class=\"af gj\" href=\"https://dtsx.io/34hV4kJ\" rel=\"noopener ugc nofollow\" target=\"_blank\"><em class=\"ng\">DataStax Tech Blog</em></a><em class=\"ng\"> for more developer stories. Check out our </em><a class=\"af gj\" href=\"https://dtsx.io/3G8W34a\" rel=\"noopener ugc nofollow\" target=\"_blank\"><em class=\"ng\">YouTube</em></a><em class=\"ng\"> channel for tutorials and </em><a class=\"af gj\" href=\"https://dtsx.io/3L2p05A\" rel=\"noopener ugc nofollow\" target=\"_blank\"><em class=\"ng\">DataStax Developers on Twitter</em></a><em class=\"ng\"> for the latest news about our dev community.</em></p><h1 id=\"bc6d\" class=\"nh ni ev be nj nk nl fv nm nn no fy np nq nr ns nt nu nv nw nx ny nz oa ob oc bj\">Resources</h1><ol class=\"\"><li id=\"1591\" class=\"mk ml ev mm b ft od mo mp fw oe mr ms mt qf mv mw mx qg mz na nb qh nd ne nf pd ow ox bj\"><a class=\"af gj\" href=\"https://dtsx.io/3IIrfZN\" rel=\"noopener ugc nofollow\" target=\"_blank\">K8ssandra</a></li><li id=\"b3a6\" class=\"mk ml ev mm b ft oy mo mp fw oz mr ms mt pa mv mw mx pb mz na nb pc nd ne nf pd ow ox bj\"><a class=\"af gj\" href=\"https://projectcalico.docs.tigera.io/networking/determine-best-networking\" rel=\"noopener ugc nofollow\" target=\"_blank\">Calico — Determining Best Networking Option</a></li><li id=\"403d\" class=\"mk ml ev mm b ft oy mo mp fw oz mr ms mt pa mv mw mx pb mz na nb pc nd ne nf pd ow ox bj\"><a class=\"af gj\" href=\"https://thelastpickle.com/blog/2019/02/26/data-center-switch.html\" rel=\"noopener ugc nofollow\" target=\"_blank\">Apache Cassandra — Data Center Switch</a></li><li id=\"9a3b\" class=\"mk ml ev mm b ft oy mo mp fw oz mr ms mt pa mv mw mx pb mz na nb pc nd ne nf pd ow ox bj\"><a class=\"af gj\" href=\"https://dtsx.io/3ANHlP6\" rel=\"noopener ugc nofollow\" target=\"_blank\">K8ssandra Terraform</a></li><li id=\"2d67\" class=\"mk ml ev mm b ft oy mo mp fw oz mr ms mt pa mv mw mx pb mz na nb pc nd ne nf pd ow ox bj\"><a class=\"af gj\" href=\"https://thelastpickle.com/tlp-stress/\" rel=\"noopener ugc nofollow\" target=\"_blank\">TLP-Stress</a></li><li id=\"2e8c\" class=\"mk ml ev mm b ft oy mo mp fw oz mr ms mt pa mv mw mx pb mz na nb pc nd ne nf pd ow ox bj\"><a class=\"af gj\" href=\"https://dtsx.io/3KQ9FVu\" rel=\"noopener ugc nofollow\" target=\"_blank\">Cass Operator</a></li><li id=\"8381\" class=\"mk ml ev mm b ft oy mo mp fw oz mr ms mt pa mv mw mx pb mz na nb pc nd ne nf pd ow ox bj\"><a class=\"af gj\" href=\"https://dtsx.io/3u7OtEp\" rel=\"noopener ugc nofollow\" target=\"_blank\">K8ssandra Discord Community</a></li><li id=\"bf3f\" class=\"mk ml ev mm b ft oy mo mp fw oz mr ms mt pa mv mw mx pb mz na nb pc nd ne nf pd ow ox bj\"><a class=\"af gj\" href=\"https://dtsx.io/3Hc9Ecn\" rel=\"noopener ugc nofollow\" target=\"_blank\">K8ssandra Forum</a></li></ol></div></div></div></div></div></div></div></div></div></section></div></div></article><article class=\"vb\"><div class=\"vb qz l\"><div class=\"bg vb\"><div class=\"vb l\"><div class=\"vb vc vd ve vf vg vh vi vj vk vl vm vn vo\"><div class=\"vp\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" aria-label=\"What’s a Vector Database?\" rel=\"noopener follow\" href=\"https://medium.com/building-the-open-data-stack/whats-a-vector-database-c3e8b6bb0436?source=author_recirc-----f824f5bbf50b----0---------------------bd1e9651_9cfb_491c_a4a5_575eb1b0fbe8-------\"><div class=\"vr vs vt vu vv\"><img alt=\"What’s a Vector Database?\" class=\"bg vw vx vy vz bw\" src=\"https://miro.medium.com/v2/resize:fit:1358/1*fBdr42heD8esXvK_omWZWA.png\" referrerpolicy=\"no-referrer\" /></div></a></div><div class=\"vq ab ca cn\"><div class=\"wa wb wc wd we ab\"><div class=\"ql l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/@datastax?source=author_recirc-----f824f5bbf50b----0---------------------bd1e9651_9cfb_491c_a4a5_575eb1b0fbe8-------\"><div class=\"l hc\"><img alt=\"DataStax\" class=\"l ec bx wg wh cw\" src=\"https://miro.medium.com/v2/resize:fill:40:40/1*armpUA9HCxIkYBeqlKqWvA.png\" width=\"20\" height=\"20\" referrerpolicy=\"no-referrer\" /></div></a></div></div></div><div class=\"wi l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar hm ab q\" rel=\"noopener follow\" href=\"https://medium.com/@datastax?source=author_recirc-----f824f5bbf50b----0---------------------bd1e9651_9cfb_491c_a4a5_575eb1b0fbe8-------\"><p class=\"be b kp z ic id ie if ig ih ii ij bj\">DataStax</p></a></div></div></div><div class=\"wi l\"><p class=\"be b kp z gi\">in</p></div><div class=\"l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar hm ab q\" href=\"https://medium.com/building-the-open-data-stack?source=author_recirc-----f824f5bbf50b----0---------------------bd1e9651_9cfb_491c_a4a5_575eb1b0fbe8-------\" rel=\"noopener follow\"><p class=\"be b kp z ic id ie if ig ih ii ij bj\">Building Real-World, Real-Time AI</p></a></div></div></div></div><div class=\"wj wk wl wm wn wo wp wq wr ws l eo\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/building-the-open-data-stack/whats-a-vector-database-c3e8b6bb0436?source=author_recirc-----f824f5bbf50b----0---------------------bd1e9651_9cfb_491c_a4a5_575eb1b0fbe8-------\"><div title=\"\"><h2 class=\"be ew nk fv wt wu nm nn fy wv ww np mt pm wx wy pn mx pp wz xa pq nb ps xb xc pt ic ie if ih ij bj\">What’s a Vector Database?</h2></div><div class=\"xd l\"><h3 class=\"be b hk z ic xe ie if xf ih ij gi\">By Bill McLane</h3></div></a></div><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/building-the-open-data-stack/whats-a-vector-database-c3e8b6bb0436?source=author_recirc-----f824f5bbf50b----0---------------------bd1e9651_9cfb_491c_a4a5_575eb1b0fbe8-------\"><div class=\"ab q\">8 min read·Sep 18</div></a><div class=\"xg xh xi xj xk l\"><div class=\"ab co\"><div class=\"am xl xm xn xo xp xq xr xs xt xu ab q\"><div class=\"ab q ju\"><div class=\"pw-multi-vote-icon hc ib jv jw jx\"><div class=\"\"><div class=\"jy jz ka kb kc kd ke am kf kg kh jx\"></div></div><div class=\"pw-multi-vote-count l ki kj kk kl km kn ko\"><p class=\"be b kp z gi\">--</p></div></div><div class=\"xv l\"><div><div class=\"bl\" aria-hidden=\"false\"></div></div></div></div></div><div class=\"j i d\"></div></div></div></div></div></div></div></div></article><article class=\"vb\"><div class=\"vb qz l\"><div class=\"bg vb\"><div class=\"vb l\"><div class=\"vb vc vd ve vf vg vh vi vj vk vl vm vn vo\"><div class=\"vp\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" aria-label=\"7 Reasons to Choose Apache Pulsar over Apache Kafka\" rel=\"noopener follow\" href=\"https://medium.com/building-the-open-data-stack/7-reasons-to-choose-apache-pulsar-over-apache-kafka-cb111087eadb?source=author_recirc-----f824f5bbf50b----1---------------------bd1e9651_9cfb_491c_a4a5_575eb1b0fbe8-------\"><div class=\"vr vs vt vu vv\"><img alt=\"7 Reasons to Choose Apache Pulsar over Apache Kafka\" class=\"bg vw vx vy vz bw\" src=\"https://miro.medium.com/v2/resize:fit:1358/1*yuVzMhCJyDENbyhwAsrkwA.png\" referrerpolicy=\"no-referrer\" /></div></a></div><div class=\"vq ab ca cn\"><div class=\"wa wb wc wd we ab\"><div class=\"ql l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/@datastax?source=author_recirc-----f824f5bbf50b----1---------------------bd1e9651_9cfb_491c_a4a5_575eb1b0fbe8-------\"><div class=\"l hc\"><img alt=\"DataStax\" class=\"l ec bx wg wh cw\" src=\"https://miro.medium.com/v2/resize:fill:40:40/1*armpUA9HCxIkYBeqlKqWvA.png\" width=\"20\" height=\"20\" referrerpolicy=\"no-referrer\" /></div></a></div></div></div><div class=\"wi l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar hm ab q\" rel=\"noopener follow\" href=\"https://medium.com/@datastax?source=author_recirc-----f824f5bbf50b----1---------------------bd1e9651_9cfb_491c_a4a5_575eb1b0fbe8-------\"><p class=\"be b kp z ic id ie if ig ih ii ij bj\">DataStax</p></a></div></div></div><div class=\"wi l\"><p class=\"be b kp z gi\">in</p></div><div class=\"l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar hm ab q\" href=\"https://medium.com/building-the-open-data-stack?source=author_recirc-----f824f5bbf50b----1---------------------bd1e9651_9cfb_491c_a4a5_575eb1b0fbe8-------\" rel=\"noopener follow\"><p class=\"be b kp z ic id ie if ig ih ii ij bj\">Building Real-World, Real-Time AI</p></a></div></div></div></div><div class=\"wj wk wl wm wn wo wp wq wr ws l eo\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/building-the-open-data-stack/7-reasons-to-choose-apache-pulsar-over-apache-kafka-cb111087eadb?source=author_recirc-----f824f5bbf50b----1---------------------bd1e9651_9cfb_491c_a4a5_575eb1b0fbe8-------\"><div title=\"\"><h2 class=\"be ew nk fv wt wu nm nn fy wv ww np mt pm wx wy pn mx pp wz xa pq nb ps xb xc pt ic ie if ih ij bj\">7 Reasons to Choose Apache Pulsar over Apache Kafka</h2></div><div class=\"xd l\"><h3 class=\"be b hk z ic xe ie if xf ih ij gi\">By Chris Bartholomew, Streaming Engineering, DataStax</h3></div></a></div><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/building-the-open-data-stack/7-reasons-to-choose-apache-pulsar-over-apache-kafka-cb111087eadb?source=author_recirc-----f824f5bbf50b----1---------------------bd1e9651_9cfb_491c_a4a5_575eb1b0fbe8-------\"><div class=\"ab q\">6 min read·May 13, 2021</div></a><div class=\"xg xh xi xj xk l\"><div class=\"ab co\"><div class=\"am xl xm xn xo xp xq xr xs xt xu ab q\"><div class=\"ab q ju\"><div class=\"pw-multi-vote-icon hc ib jv jw jx\"><div class=\"\"><div class=\"jy jz ka kb kc kd ke am kf kg kh jx\"></div></div><div class=\"pw-multi-vote-count l ki kj kk kl km kn ko\"><p class=\"be b kp z gi\">--</p></div></div><div class=\"xv l\"><div><div class=\"bl\" aria-hidden=\"false\"></div></div></div></div></div><div class=\"j i d\"></div></div></div></div></div></div></div></div></article><article class=\"vb\"><div class=\"vb qz l\"><div class=\"bg vb\"><div class=\"vb l\"><div class=\"vb vc vd ve vf vg vh vi vj vk vl vm vn vo\"><div class=\"vp\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" aria-label=\"A Vector Primer: Understanding the Basics of Generative AI\" rel=\"noopener follow\" href=\"https://medium.com/building-the-open-data-stack/a-vector-primer-understanding-the-basics-of-generative-ai-28ff4c1934a7?source=author_recirc-----f824f5bbf50b----2---------------------bd1e9651_9cfb_491c_a4a5_575eb1b0fbe8-------\"><div class=\"vr vs vt vu vv\"><img alt=\"A Vector Primer: Understanding the Basics of Generative AI\" class=\"bg vw vx vy vz bw\" src=\"https://miro.medium.com/v2/resize:fit:1358/1*7DP0VZACGZzOkbPZ2uTq0A.png\" referrerpolicy=\"no-referrer\" /></div></a></div><div class=\"vq ab ca cn\"><div class=\"wa wb wc wd we ab\"><div class=\"ql l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/@datastax?source=author_recirc-----f824f5bbf50b----2---------------------bd1e9651_9cfb_491c_a4a5_575eb1b0fbe8-------\"><div class=\"l hc\"><img alt=\"DataStax\" class=\"l ec bx wg wh cw\" src=\"https://miro.medium.com/v2/resize:fill:40:40/1*armpUA9HCxIkYBeqlKqWvA.png\" width=\"20\" height=\"20\" referrerpolicy=\"no-referrer\" /></div></a></div></div></div><div class=\"wi l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar hm ab q\" rel=\"noopener follow\" href=\"https://medium.com/@datastax?source=author_recirc-----f824f5bbf50b----2---------------------bd1e9651_9cfb_491c_a4a5_575eb1b0fbe8-------\"><p class=\"be b kp z ic id ie if ig ih ii ij bj\">DataStax</p></a></div></div></div><div class=\"wi l\"><p class=\"be b kp z gi\">in</p></div><div class=\"l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar hm ab q\" href=\"https://medium.com/building-the-open-data-stack?source=author_recirc-----f824f5bbf50b----2---------------------bd1e9651_9cfb_491c_a4a5_575eb1b0fbe8-------\" rel=\"noopener follow\"><p class=\"be b kp z ic id ie if ig ih ii ij bj\">Building Real-World, Real-Time AI</p></a></div></div></div></div><div class=\"wj wk wl wm wn wo wp wq wr ws l eo\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/building-the-open-data-stack/a-vector-primer-understanding-the-basics-of-generative-ai-28ff4c1934a7?source=author_recirc-----f824f5bbf50b----2---------------------bd1e9651_9cfb_491c_a4a5_575eb1b0fbe8-------\"><div title=\"\"><h2 class=\"be ew nk fv wt wu nm nn fy wv ww np mt pm wx wy pn mx pp wz xa pq nb ps xb xc pt ic ie if ih ij bj\">A Vector Primer: Understanding the Basics of Generative AI</h2></div><div class=\"xd l\"><h3 class=\"be b hk z ic xe ie if xf ih ij gi\">By Charna Parkey</h3></div></a></div><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/building-the-open-data-stack/a-vector-primer-understanding-the-basics-of-generative-ai-28ff4c1934a7?source=author_recirc-----f824f5bbf50b----2---------------------bd1e9651_9cfb_491c_a4a5_575eb1b0fbe8-------\"><div class=\"ab q\">4 min read·Oct 19</div></a><div class=\"xg xh xi xj xk l\"><div class=\"ab co\"><div class=\"am xl xm xn xo xp xq xr xs xt xu ab q\"><div class=\"ab q ju\"><div class=\"pw-multi-vote-icon hc ib jv jw jx\"><div class=\"\"><div class=\"jy jz ka kb kc kd ke am kf kg kh jx\"></div></div><div class=\"pw-multi-vote-count l ki kj kk kl km kn ko\"><p class=\"be b kp z gi\">--</p></div></div><div class=\"xv l\"><div><div class=\"bl\" aria-hidden=\"false\"></div></div></div></div></div><div class=\"j i d\"></div></div></div></div></div></div></div></div></article><article class=\"vb\"><div class=\"vb qz l\"><div class=\"bg vb\"><div class=\"vb l\"><div class=\"vb vc vd ve vf vg vh vi vj vk vl vm vn vo\"><div class=\"vp\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" aria-label=\"Reclaiming Persistent Volumes in Kubernetes\" rel=\"noopener follow\" href=\"https://medium.com/building-the-open-data-stack/reclaiming-persistent-volumes-in-kubernetes-5e035ba8c770?source=author_recirc-----f824f5bbf50b----3---------------------bd1e9651_9cfb_491c_a4a5_575eb1b0fbe8-------\"><div class=\"vr vs vt vu vv\"><img alt=\"Reclaiming Persistent Volumes in Kubernetes\" class=\"bg vw vx vy vz bw\" src=\"https://miro.medium.com/v2/resize:fit:1358/1*G13CLQVHRE1sD6-vPcijCA.jpeg\" referrerpolicy=\"no-referrer\" /></div></a></div><div class=\"vq ab ca cn\"><div class=\"wa wb wc wd we ab\"><div class=\"ql l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/@datastax?source=author_recirc-----f824f5bbf50b----3---------------------bd1e9651_9cfb_491c_a4a5_575eb1b0fbe8-------\"><div class=\"l hc\"><img alt=\"DataStax\" class=\"l ec bx wg wh cw\" src=\"https://miro.medium.com/v2/resize:fill:40:40/1*armpUA9HCxIkYBeqlKqWvA.png\" width=\"20\" height=\"20\" referrerpolicy=\"no-referrer\" /></div></a></div></div></div><div class=\"wi l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar hm ab q\" rel=\"noopener follow\" href=\"https://medium.com/@datastax?source=author_recirc-----f824f5bbf50b----3---------------------bd1e9651_9cfb_491c_a4a5_575eb1b0fbe8-------\"><p class=\"be b kp z ic id ie if ig ih ii ij bj\">DataStax</p></a></div></div></div><div class=\"wi l\"><p class=\"be b kp z gi\">in</p></div><div class=\"l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar hm ab q\" href=\"https://medium.com/building-the-open-data-stack?source=author_recirc-----f824f5bbf50b----3---------------------bd1e9651_9cfb_491c_a4a5_575eb1b0fbe8-------\" rel=\"noopener follow\"><p class=\"be b kp z ic id ie if ig ih ii ij bj\">Building Real-World, Real-Time AI</p></a></div></div></div></div><div class=\"wj wk wl wm wn wo wp wq wr ws l eo\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/building-the-open-data-stack/reclaiming-persistent-volumes-in-kubernetes-5e035ba8c770?source=author_recirc-----f824f5bbf50b----3---------------------bd1e9651_9cfb_491c_a4a5_575eb1b0fbe8-------\"><div title=\"\"><h2 class=\"be ew nk fv wt wu nm nn fy wv ww np mt pm wx wy pn mx pp wz xa pq nb ps xb xc pt ic ie if ih ij bj\">Reclaiming Persistent Volumes in Kubernetes</h2></div><div class=\"xd l\"><h3 class=\"be b hk z ic xe ie if xf ih ij gi\">Author: Frank Rosner</h3></div></a></div><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/building-the-open-data-stack/reclaiming-persistent-volumes-in-kubernetes-5e035ba8c770?source=author_recirc-----f824f5bbf50b----3---------------------bd1e9651_9cfb_491c_a4a5_575eb1b0fbe8-------\"><div class=\"ab q\">8 min read·Sep 29, 2021</div></a><div class=\"xg xh xi xj xk l\"><div class=\"ab co\"><div class=\"am xl xm xn xo xp xq xr xs xt xu ab q\"><div class=\"ab q ju\"><div class=\"pw-multi-vote-icon hc ib jv jw jx\"><div class=\"\"><div class=\"jy jz ka kb kc kd ke am kf kg kh jx\"></div></div><div class=\"pw-multi-vote-count l ki kj kk kl km kn ko\"><p class=\"be b kp z gi\">--</p></div></div><div class=\"xv l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ks ah jy aj ak al kr an ao ap aq ar as at kq ab q kt ku\" aria-label=\"responses\" rel=\"noopener follow\" href=\"https://medium.com/building-the-open-data-stack/reclaiming-persistent-volumes-in-kubernetes-5e035ba8c770?responsesOpen=true&amp;sortBy=REVERSE_CHRON&amp;source=author_recirc-----f824f5bbf50b----3---------------------bd1e9651_9cfb_491c_a4a5_575eb1b0fbe8-------\"><p class=\"be b kp z gi\">1</p></a></div></div></div></div></div></div></div></div></div></div></div></div></article><article class=\"vb\"><div class=\"vb qz l\"><div class=\"bg vb\"><div class=\"vb l\"><div class=\"vb vc vd ve vf vg vh vi vj vk vl vm vn vo\"><div class=\"vp\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" aria-label=\"Mastering Kubernetes Pod-to-Pod Communication: A Comprehensive Guide\" rel=\"noopener follow\" href=\"https://medium.com/@extio/mastering-kubernetes-pod-to-pod-communication-a-comprehensive-guide-46832b30556b?source=read_next_recirc-----f824f5bbf50b----0---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><div class=\"vr vs vt vu vv\"><img alt=\"Mastering Kubernetes Pod-to-Pod Communication: A Comprehensive Guide\" class=\"bg vw vx vy vz bw\" src=\"https://miro.medium.com/v2/resize:fit:1358/1*nRKAzsavaIORIdLKOUwRhQ.png\" referrerpolicy=\"no-referrer\" /></div></a></div><div class=\"vq ab ca cn\"><div class=\"wa wb wc wd we ab\"><div class=\"ql l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/@extio?source=read_next_recirc-----f824f5bbf50b----0---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><div class=\"l hc\"><img alt=\"Extio Technology\" class=\"l ec bx wg wh cw\" src=\"https://miro.medium.com/v2/resize:fill:40:40/1*Oyj9IDqBiRL4auVApS_WyQ.png\" width=\"20\" height=\"20\" referrerpolicy=\"no-referrer\" /></div></a></div></div></div><div class=\"wi l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar hm ab q\" rel=\"noopener follow\" href=\"https://medium.com/@extio?source=read_next_recirc-----f824f5bbf50b----0---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><p class=\"be b kp z ic id ie if ig ih ii ij bj\">Extio Technology</p></a></div></div></div></div><div class=\"wj wk wl wm wn wo wp wq wr ws l eo\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/@extio/mastering-kubernetes-pod-to-pod-communication-a-comprehensive-guide-46832b30556b?source=read_next_recirc-----f824f5bbf50b----0---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><div title=\"\"><h2 class=\"be ew nk fv wt wu nm nn fy wv ww np mt pm wx wy pn mx pp wz xa pq nb ps xb xc pt ic ie if ih ij bj\">Mastering Kubernetes Pod-to-Pod Communication: A Comprehensive Guide</h2></div><div class=\"xd l\"><h3 class=\"be b hk z ic xe ie if xf ih ij gi\">Introduction</h3></div></a></div><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/@extio/mastering-kubernetes-pod-to-pod-communication-a-comprehensive-guide-46832b30556b?source=read_next_recirc-----f824f5bbf50b----0---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><div class=\"ab q\">6 min read·Jun 16</div></a><div class=\"xg xh xi xj xk l\"><div class=\"ab co\"><div class=\"am xl xm xn xo xp xq xr xs xt xu ab q\"><div class=\"ab q ju\"><div class=\"pw-multi-vote-icon hc ib jv jw jx\"><div class=\"\"><div class=\"jy jz ka kb kc kd ke am kf kg kh jx\"></div></div><div class=\"pw-multi-vote-count l ki kj kk kl km kn ko\"><p class=\"be b kp z gi\">--</p></div></div><div class=\"xv l\"><div><div class=\"bl\" aria-hidden=\"false\"></div></div></div></div></div><div class=\"j i d\"></div></div></div></div></div></div></div></div></article><article class=\"vb\"><div class=\"vb qz l\"><div class=\"bg vb\"><div class=\"vb l\"><div class=\"vb vc vd ve vf vg vh vi vj vk vl vm vn vo\"><div class=\"vp\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" aria-label=\"MongoDB vs ScyllaDB: Architecture Comparison\" rel=\"noopener follow\" href=\"https://medium.com/@scylladb/mongodb-vs-scylladb-architecture-comparison-03cca33b6f26?source=read_next_recirc-----f824f5bbf50b----1---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><div class=\"vr vs vt vu vv\"><img alt=\"MongoDB vs ScyllaDB: Architecture Comparison\" class=\"bg vw vx vy vz bw\" src=\"https://miro.medium.com/v2/resize:fit:1358/0*jseuivP9RMorQtcr.png\" referrerpolicy=\"no-referrer\" /></div></a></div><div class=\"vq ab ca cn\"><div class=\"wa wb wc wd we ab\"><div class=\"ql l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/@scylladb?source=read_next_recirc-----f824f5bbf50b----1---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><div class=\"l hc\"><img alt=\"ScyllaDB\" class=\"l ec bx wg wh cw\" src=\"https://miro.medium.com/v2/resize:fill:40:40/0*DeUrrPkDtQjv5Vk_.jpg\" width=\"20\" height=\"20\" referrerpolicy=\"no-referrer\" /></div></a></div></div></div><div class=\"wi l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar hm ab q\" rel=\"noopener follow\" href=\"https://medium.com/@scylladb?source=read_next_recirc-----f824f5bbf50b----1---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><p class=\"be b kp z ic id ie if ig ih ii ij bj\">ScyllaDB</p></a></div></div></div></div><div class=\"wj wk wl wm wn wo wp wq wr ws l eo\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/@scylladb/mongodb-vs-scylladb-architecture-comparison-03cca33b6f26?source=read_next_recirc-----f824f5bbf50b----1---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><div title=\"\"><h2 class=\"be ew nk fv wt wu nm nn fy wv ww np mt pm wx wy pn mx pp wz xa pq nb ps xb xc pt ic ie if ih ij bj\">MongoDB vs ScyllaDB: Architecture Comparison</h2></div><div class=\"xd l\"><h3 class=\"be b hk z ic xe ie if xf ih ij gi\">benchANT compares MongoDB and ScyllaDB architectures, with a focus on what the differences mean for performance and scalability</h3></div></a></div><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/@scylladb/mongodb-vs-scylladb-architecture-comparison-03cca33b6f26?source=read_next_recirc-----f824f5bbf50b----1---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><div class=\"ab q\">11 min read·6 days ago</div></a><div class=\"xg xh xi xj xk l\"><div class=\"ab co\"><div class=\"am xl xm xn xo xp xq xr xs xt xu ab q\"><div class=\"ab q ju\"><div class=\"pw-multi-vote-icon hc ib jv jw jx\"><div class=\"\"><div class=\"jy jz ka kb kc kd ke am kf kg kh jx\"></div></div><div class=\"pw-multi-vote-count l ki kj kk kl km kn ko\"><p class=\"be b kp z gi\">--</p></div></div><div class=\"xv l\"><div><div class=\"bl\" aria-hidden=\"false\"></div></div></div></div></div></div></div></div></div></div></div></div></article><article class=\"vb\"><div class=\"vb qz l\"><div class=\"bg vb\"><div class=\"vb l\"><div class=\"vb vc vd ve vf vg vh vi vj vk vl vm vn vo\"><div class=\"vp\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" aria-label=\"Bing Image Generator prompt: a cute boxing battle between python programming language and javascript programming language, in a cute nature themed environment\" rel=\"noopener follow\" href=\"https://medium.com/@hugohjerten/pulumi-after-years-of-terraform-079616eb4049?source=read_next_recirc-----f824f5bbf50b----0---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><div class=\"vr vs vt vu vv\"><img alt=\"Bing Image Generator prompt: a cute boxing battle between python programming language and javascript programming language, in a cute nature themed environment\" class=\"bg vw vx vy vz bw\" src=\"https://miro.medium.com/v2/resize:fit:1358/1*SVQCcapccHaqX0zko0DMxg.jpeg\" referrerpolicy=\"no-referrer\" /></div></a></div><div class=\"vq ab ca cn\"><div class=\"wa wb wc wd we ab\"><div class=\"ql l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/@hugohjerten?source=read_next_recirc-----f824f5bbf50b----0---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><div class=\"l hc\"><img alt=\"Hugo Hjerten\" class=\"l ec bx wg wh cw\" src=\"https://miro.medium.com/v2/resize:fill:40:40/0*MYqhdIVsDOpxbP5h\" width=\"20\" height=\"20\" referrerpolicy=\"no-referrer\" /></div></a></div></div></div><div class=\"wi l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar hm ab q\" rel=\"noopener follow\" href=\"https://medium.com/@hugohjerten?source=read_next_recirc-----f824f5bbf50b----0---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><p class=\"be b kp z ic id ie if ig ih ii ij bj\">Hugo Hjerten</p></a></div></div></div></div><div class=\"wj wk wl wm wn wo wp wq wr ws l eo\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/@hugohjerten/pulumi-after-years-of-terraform-079616eb4049?source=read_next_recirc-----f824f5bbf50b----0---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><div title=\"\"><h2 class=\"be ew nk fv wt wu nm nn fy wv ww np mt pm wx wy pn mx pp wz xa pq nb ps xb xc pt ic ie if ih ij bj\">Pulumi after years of Terraform</h2></div><div class=\"xd l\"><h3 class=\"be b hk z ic xe ie if xf ih ij gi\">Is it worth changing IaC tool?</h3></div></a></div><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/@hugohjerten/pulumi-after-years-of-terraform-079616eb4049?source=read_next_recirc-----f824f5bbf50b----0---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><div class=\"ab q\">7 min read·Oct 27</div></a><div class=\"xg xh xi xj xk l\"><div class=\"ab co\"><div class=\"am xl xm xn xo xp xq xr xs xt xu ab q\"><div class=\"ab q ju\"><div class=\"pw-multi-vote-icon hc ib jv jw jx\"><div class=\"\"><div class=\"jy jz ka kb kc kd ke am kf kg kh jx\"></div></div><div class=\"pw-multi-vote-count l ki kj kk kl km kn ko\"><p class=\"be b kp z gi\">--</p></div></div><div class=\"xv l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ks ah jy aj ak al kr an ao ap aq ar as at kq ab q kt ku\" aria-label=\"responses\" rel=\"noopener follow\" href=\"https://medium.com/@hugohjerten/pulumi-after-years-of-terraform-079616eb4049?responsesOpen=true&amp;sortBy=REVERSE_CHRON&amp;source=read_next_recirc-----f824f5bbf50b----0---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><p class=\"be b kp z gi\">4</p></a></div></div></div></div></div></div><div class=\"j i d\"></div></div></div></div></div></div></div></article><article class=\"vb\"><div class=\"vb qz l\"><div class=\"bg vb\"><div class=\"vb l\"><div class=\"vb vc vd ve vf vg vh vi vj vk vl vm vn vo\"><div class=\"vp\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" aria-label=\"Installing Clickhouse on a kubernetes cluster\" rel=\"noopener follow\" href=\"https://medium.com/@sairamkrish/installing-clickhouse-on-a-kubernetes-cluster-b2721c883e55?source=read_next_recirc-----f824f5bbf50b----1---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><div class=\"vr vs vt vu vv\"><img alt=\"Installing Clickhouse on a kubernetes cluster\" class=\"bg vw vx vy vz bw\" src=\"https://miro.medium.com/v2/resize:fit:1358/1*yuVzMhCJyDENbyhwAsrkwA.png\" referrerpolicy=\"no-referrer\" /></div></a></div><div class=\"vq ab ca cn\"><div class=\"wa wb wc wd we ab\"><div class=\"ql l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/@sairamkrish?source=read_next_recirc-----f824f5bbf50b----1---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><div class=\"l hc\"><img alt=\"Sairam Krish\" class=\"l ec bx wg wh cw\" src=\"https://miro.medium.com/v2/resize:fill:40:40/1*0A_klD-hVH5ff6gN7i8gCA.jpeg\" width=\"20\" height=\"20\" referrerpolicy=\"no-referrer\" /></div></a></div></div></div><div class=\"wi l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar hm ab q\" rel=\"noopener follow\" href=\"https://medium.com/@sairamkrish?source=read_next_recirc-----f824f5bbf50b----1---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><p class=\"be b kp z ic id ie if ig ih ii ij bj\">Sairam Krish</p></a></div></div></div></div><div class=\"wj wk wl wm wn wo wp wq wr ws l eo\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/@sairamkrish/installing-clickhouse-on-a-kubernetes-cluster-b2721c883e55?source=read_next_recirc-----f824f5bbf50b----1---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><div title=\"\"><h2 class=\"be ew nk fv wt wu nm nn fy wv ww np mt pm wx wy pn mx pp wz xa pq nb ps xb xc pt ic ie if ih ij bj\">Installing Clickhouse on a kubernetes cluster</h2></div><div class=\"xd l\"><h3 class=\"be b hk z ic xe ie if xf ih ij gi\">Clickhouse is the fastest and most resource efficient open-source database for real-time apps and analytics. Installing clickhouse on a…</h3></div></a></div><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/@sairamkrish/installing-clickhouse-on-a-kubernetes-cluster-b2721c883e55?source=read_next_recirc-----f824f5bbf50b----1---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><div class=\"ab q\">3 min read·Jun 6</div></a><div class=\"xg xh xi xj xk l\"><div class=\"ab co\"><div class=\"am xl xm xn xo xp xq xr xs xt xu ab q\"><div class=\"ab q ju\"><div class=\"pw-multi-vote-icon hc ib jv jw jx\"><div class=\"\"><div class=\"jy jz ka kb kc kd ke am kf kg kh jx\"></div></div><div class=\"pw-multi-vote-count l ki kj kk kl km kn ko\"><p class=\"be b kp z gi\">--</p></div></div><div class=\"xv l\"><div><div class=\"bl\" aria-hidden=\"false\"></div></div></div></div></div><div class=\"j i d\"></div></div></div></div></div></div></div></div></article><article class=\"vb\"><div class=\"vb qz l\"><div class=\"bg vb\"><div class=\"vb l\"><div class=\"vb vc vd ve vf vg vh vi vj vk vl vm vn vo\"><div class=\"vp\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" aria-label=\"Demystifying Kubernetes Ingress: ALB vs. Nginx\" rel=\"noopener follow\" href=\"https://medium.com/@yakuphanbilgic3/demystifying-kubernetes-ingress-alb-vs-nginx-56db64962e93?source=read_next_recirc-----f824f5bbf50b----2---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><div class=\"vr vs vt vu vv\"><img alt=\"Demystifying Kubernetes Ingress: ALB vs. Nginx\" class=\"bg vw vx vy vz bw\" src=\"https://miro.medium.com/v2/resize:fit:1358/1*xSmwPuo6GqcKaTn4KqBoYA.jpeg\" referrerpolicy=\"no-referrer\" /></div></a></div><div class=\"vq ab ca cn\"><div class=\"wa wb wc wd we ab\"><div class=\"ql l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/@yakuphanbilgic3?source=read_next_recirc-----f824f5bbf50b----2---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><div class=\"l hc\"><img alt=\"Yakuphan\" class=\"l ec bx wg wh cw\" src=\"https://miro.medium.com/v2/resize:fill:40:40/1*Fb24ZKOIbHu0NCy3KrFOrw.jpeg\" width=\"20\" height=\"20\" referrerpolicy=\"no-referrer\" /></div></a></div></div></div><div class=\"wi l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar hm ab q\" rel=\"noopener follow\" href=\"https://medium.com/@yakuphanbilgic3?source=read_next_recirc-----f824f5bbf50b----2---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><p class=\"be b kp z ic id ie if ig ih ii ij bj\">Yakuphan</p></a></div></div></div></div><div class=\"wj wk wl wm wn wo wp wq wr ws l eo\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/@yakuphanbilgic3/demystifying-kubernetes-ingress-alb-vs-nginx-56db64962e93?source=read_next_recirc-----f824f5bbf50b----2---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><div title=\"\"><h2 class=\"be ew nk fv wt wu nm nn fy wv ww np mt pm wx wy pn mx pp wz xa pq nb ps xb xc pt ic ie if ih ij bj\">Demystifying Kubernetes Ingress: ALB vs. Nginx</h2></div><div class=\"xd l\"><h3 class=\"be b hk z ic xe ie if xf ih ij gi\">Introduction: In the dynamic world of Kubernetes, efficiently managing incoming traffic to your services is paramount. Two popular…</h3></div></a></div><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/@yakuphanbilgic3/demystifying-kubernetes-ingress-alb-vs-nginx-56db64962e93?source=read_next_recirc-----f824f5bbf50b----2---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><div class=\"ab q\">4 min read·Aug 12</div></a><div class=\"xg xh xi xj xk l\"><div class=\"ab co\"><div class=\"am xl xm xn xo xp xq xr xs xt xu ab q\"><div class=\"ab q ju\"><div class=\"pw-multi-vote-icon hc ib jv jw jx\"><div class=\"\"><div class=\"jy jz ka kb kc kd ke am kf kg kh jx\"></div></div><div class=\"pw-multi-vote-count l ki kj kk kl km kn ko\"><p class=\"be b kp z gi\">--</p></div></div><div class=\"xv l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ks ah jy aj ak al kr an ao ap aq ar as at kq ab q kt ku\" aria-label=\"responses\" rel=\"noopener follow\" href=\"https://medium.com/@yakuphanbilgic3/demystifying-kubernetes-ingress-alb-vs-nginx-56db64962e93?responsesOpen=true&amp;sortBy=REVERSE_CHRON&amp;source=read_next_recirc-----f824f5bbf50b----2---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><p class=\"be b kp z gi\">1</p></a></div></div></div></div></div></div><div class=\"j i d\"></div></div></div></div></div></div></div></article><article class=\"vb\"><div class=\"vb qz l\"><div class=\"bg vb\"><div class=\"vb l\"><div class=\"vb vc vd ve vf vg vh vi vj vk vl vm vn vo\"><div class=\"vp\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" aria-label=\"Boosting Your Kubernetes Productivity: Essential kubectl Plugins for Efficient Cluster Management\" rel=\"noopener follow\" href=\"https://medium.com/@tamber/boosting-your-kubernetes-productivity-essential-kubectl-plugins-for-efficient-cluster-management-46b568222e8c?source=read_next_recirc-----f824f5bbf50b----3---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><div class=\"vr vs vt vu vv\"><img alt=\"Boosting Your Kubernetes Productivity: Essential kubectl Plugins for Efficient Cluster Management\" class=\"bg vw vx vy vz bw\" src=\"https://miro.medium.com/v2/resize:fit:1358/0*qObojEKDqaADmrt0.jpeg\" referrerpolicy=\"no-referrer\" /></div></a></div><div class=\"vq ab ca cn\"><div class=\"wa wb wc wd we ab\"><div class=\"ql l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/@tamber?source=read_next_recirc-----f824f5bbf50b----3---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><div class=\"l hc\"><img alt=\"Tommer Amber\" class=\"l ec bx wg wh cw\" src=\"https://miro.medium.com/v2/resize:fill:40:40/1*7O_oGL_tJ1b-P0e4bQfMyw.jpeg\" width=\"20\" height=\"20\" referrerpolicy=\"no-referrer\" /></div></a></div></div></div><div class=\"wi l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar hm ab q\" rel=\"noopener follow\" href=\"https://medium.com/@tamber?source=read_next_recirc-----f824f5bbf50b----3---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><p class=\"be b kp z ic id ie if ig ih ii ij bj\">Tommer Amber</p></a></div></div></div></div><div class=\"wj wk wl wm wn wo wp wq wr ws l eo\"><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/@tamber/boosting-your-kubernetes-productivity-essential-kubectl-plugins-for-efficient-cluster-management-46b568222e8c?source=read_next_recirc-----f824f5bbf50b----3---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><div title=\"Boosting Your Kubernetes Productivity: Essential kubectl Plugins for Efficient Cluster Management\"><h2 class=\"be ew nk fv wt wu nm nn fy wv ww np mt pm wx wy pn mx pp wz xa pq nb ps xb xc pt ic ie if ih ij bj\">Boosting Your Kubernetes Productivity: Essential kubectl Plugins for Efficient Cluster Management</h2></div><div class=\"xd l\"><h3 class=\"be b hk z ic xe ie if xf ih ij gi\">Intro</h3></div></a></div><a class=\"af ag ah ai aj ak al am an ao ap aq ar as at\" rel=\"noopener follow\" href=\"https://medium.com/@tamber/boosting-your-kubernetes-productivity-essential-kubectl-plugins-for-efficient-cluster-management-46b568222e8c?source=read_next_recirc-----f824f5bbf50b----3---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><div class=\"ab q\">3 min read·Oct 30</div></a><div class=\"xg xh xi xj xk l\"><div class=\"ab co\"><div class=\"am xl xm xn xo xp xq xr xs xt xu ab q\"><div class=\"ab q ju\"><div class=\"pw-multi-vote-icon hc ib jv jw jx\"><div class=\"\"><div class=\"jy jz ka kb kc kd ke am kf kg kh jx\"></div></div><div class=\"pw-multi-vote-count l ki kj kk kl km kn ko\"><p class=\"be b kp z gi\">--</p></div></div><div class=\"xv l\"><div><div class=\"bl\" aria-hidden=\"false\"><a class=\"af ks ah jy aj ak al kr an ao ap aq ar as at kq ab q kt ku\" aria-label=\"responses\" rel=\"noopener follow\" href=\"https://medium.com/@tamber/boosting-your-kubernetes-productivity-essential-kubectl-plugins-for-efficient-cluster-management-46b568222e8c?responsesOpen=true&amp;sortBy=REVERSE_CHRON&amp;source=read_next_recirc-----f824f5bbf50b----3---------------------c865ec84_bce9_41a8_9e18_cb90c288679d-------\"><p class=\"be b kp z gi\">2</p></a></div></div></div></div></div></div></div></div></div></div></div></div></article>","id":"a5bb7282-c872-58a8-8f53-5755c93aeef4","title":"How to Migrate Your Cassandra Database to Kubernetes with Zero Downtime","origin_url":"https://medium.com/building-the-open-data-stack/how-to-migrate-your-cassandra-database-to-kubernetes-with-zero-downtime-f824f5bbf50b","url":"https://medium.com/building-the-open-data-stack/how-to-migrate-your-cassandra-database-to-kubernetes-with-zero-downtime-f824f5bbf50b","wallabag_created_at":"2023-11-15T19:59:15+00:00","published_at":"2022-02-23T14:06:03+00:00","published_by":"['DataStax']","reading_time":10,"domain_name":"medium.com","preview_picture":"https://miro.medium.com/v2/resize:fit:1200/1*5yg7lSEpN9Qvi44eLqGE2w.jpeg","tags":["migration","cassandra","kubernetes"],"description":"Author: Alexander DejanovskiDataStax·FollowPublished inBuilding Real-World, Real-Time AI·8 min read·Feb 23, 2022--K8ssandra is a cloud-native distribution of the Apache Cassandra® database that runs o..."},{"content":"<header class=\"section-hero-copy\">\n</header><section class=\"section-vanity-numbers\"><div class=\"page-padding container-large numbers-component w-layout-grid vanity-metrics\"><div class=\"brand-tile\"><p>500kops/s<br /></p><p>Transfer 1 terabyte of data in less than 30 minutes</p></div><div id=\"w-node-_69bce2ed-a263-dfb1-ea9c-dd5de6b6a2d1-63cbac1b\" class=\"brand-tile centre\"><p>100+</p><p>Deployments over 3 continents and counting</p></div><div class=\"brand-tile\"><p>150TB<br /></p><p>Moved securely, reliably &amp; in real-time every month</p></div></div></section><section class=\"section-product-release\"><div class=\"page-padding container-large padding-vertical w-layout-grid event-feature-component-copy event_feature_content\"><p class=\"feature-paragraph\">And also includes 3 new connectors:</p><div class=\"margin-top margin-medium\"><p><a href=\"https://www.arcion.io/blog/announcing-arcion-august-2022-release\" class=\"content-button bright w-button\">Read more</a></p></div></div></section><section class=\"section-additional-features\"><div class=\"page-padding container-large padding-vertical padding-huge client-profile-component\"><div class=\"title-wrapper wide\"><p><a id=\"w-node-_69bce2ed-a263-dfb1-ea9c-dd5de6b6a2ee-63cbac1b\" href=\"https://www.arcion.io/solutions\" class=\"content-button bright w-button\">Explore industries</a><a id=\"w-node-_69bce2ed-a263-dfb1-ea9c-dd5de6b6a2f0-63cbac1b\" href=\"https://www.arcion.io/solutions\" class=\"content-button bright w-button\">Explore use cases</a></p></div><div data-current=\"Tab 1\" data-easing=\"ease-out-quart\" data-duration-in=\"100\" data-duration-out=\"100\" class=\"use-cases-tabs w-tabs\"><div class=\"use-case-tab-content w-tab-content\"><div data-w-tab=\"Tab 1\" class=\"use-case-tab w-tab-pane w--tab-active use-case-content-grid\"><p class=\"feature-paragraph\">Cloud security leader. Arcion consolidates data from MongoDB instances with 250 shards, all at once, in real-time.</p></div><div data-w-tab=\"Tab 2\" class=\"use-case-tab w-tab-pane use-case-content-grid\"><p class=\"feature-paragraph\">Fortune 500 investment bank. Arcion replicates transactional data to a real-time data analytics platform for real-time fraud analytics, consolidates data from 10+ databases to a distributed real-time target.</p></div><div data-w-tab=\"Tab 3\" class=\"use-case-tab w-tab-pane use-case-content-grid\"><p class=\"feature-paragraph\">Global consumer-electronics vendor. Arcion unifies 3 data sources to power real-time analytics to increase sales team productivity, streaming 300 million rows per day.</p></div><div data-w-tab=\"Tab 4\" class=\"use-case-tab w-tab-pane use-case-content-grid\"><p class=\"feature-paragraph\">Top 5 global bank. Arcion migrates 70TB of data from Oracle to MySQL with zero downtime to power one of the most critical applications.</p></div><div data-w-tab=\"Tab 5\" class=\"use-case-tab w-tab-pane use-case-content-grid\"><p class=\"feature-paragraph\">One of three credit reporting agencies. Arcion streams data from Informix to Kafka and processes 200 million events per day, powering real-time fraud detection.</p></div><div data-w-tab=\"Tab 6\" class=\"use-case-tab w-tab-pane use-case-content-grid\"><p class=\"feature-paragraph\">The biggest digital payment provider in China. Uses Arcion to migrate petabyte-scale account data from Oracle to Cassandra across three data centers in different regions.</p></div></div></div></div></section><section class=\"section-cloud-promo\"><div class=\"page-padding container-large padding-vertical w-layout-grid cloud-promo\"><div class=\"ui-component-content-right\"><img src=\"https://assets.website-files.com/61acd54a60fc632b98cbac1a/624e9daa0a1755530c42842a_Arcion_cloud_logo.svg\" width=\"300\" height=\"85\" alt=\"Arcion Cloud logo\" referrerpolicy=\"no-referrer\" /><p class=\"text-size-medium max-width-small\">Deploy production-ready change data capture pipelines for high-volume, real-time data replication - without a single line of code. </p><div class=\"margin-top margin-medium w-layout-grid button-grid homepage\"><a id=\"w-node-_69bce2ed-a263-dfb1-ea9c-dd5de6b6a3ab-63cbac1b\" data-w-id=\"69bce2ed-a263-dfb1-ea9c-dd5de6b6a3ab\" href=\"https://www.arcion.io/cloud\" class=\"cloud-button-outline w-inline-block\">\n<p>Learn more about Arcion Cloud</p>\n</a></div></div><img src=\"https://assets.website-files.com/61acd54a60fc632b98cbac1a/625ea0650380e186639de64d_Arcion%20Cloud.svg\" id=\"w-node-_7c88f07b-482f-096d-7c58-c8e0f4c0c6e7-63cbac1b\" alt=\"Arcion cloud illustration\" class=\"cloud-promo-image-responsive\" referrerpolicy=\"no-referrer\" /></div></section><section class=\"section-feature\"><div class=\"page-padding container-large padding-vertical padding-huge\"><p></p><h2 class=\"section-pretitle gradient-highlight-cloud\">No code, no hassle, no limit to scale</h2>\n<div data-w-id=\"69bce2ed-a263-dfb1-ea9c-dd5de6b6a3b9\" class=\"w-layout-grid feature_component\"><div class=\"w-layout-grid homepage-feature-list left\"><div class=\"layout29_item\"><p class=\"feature-paragraph\">Supercharged Change Data Capture. Enjoy automatic schema conversion, end-to-end replication, flexible deployment, and more with Arcion’s distributed Change Data Capture (CDC).</p></div><div id=\"w-node-_69bce2ed-a263-dfb1-ea9c-dd5de6b6a3c0-63cbac1b\" class=\"layout29_item\"><p class=\"feature-paragraph\">Transactional integrity guaranteed. Leverage Arcion’s zero data loss architecture for guaranteed end-to-end data consistency, built-in checkpointing, and more without any custom code.</p></div><div class=\"layout29_item\"><p class=\"feature-paragraph\">Limitless scalability. Leave scalability and performance concerns behind with a highly-distributed, highly parallel architecture supporting 10x faster data replication, </p></div></div><div class=\"feature_image-wrapper-sticky\"><div class=\"ui-1\"><img src=\"https://assets.website-files.com/61acd54a60fc632b98cbac1a/624ee5fac88ab8ae6d404c52_UI-1.svg\" width=\"400\" height=\"250\" alt=\"\" class=\"row-replication homepage\" referrerpolicy=\"no-referrer\" /><img src=\"https://assets.website-files.com/61acd54a60fc632b98cbac1a/624ee08df149f9c7cf608df7_UI-needle.svg\" alt=\"\" class=\"ui-needle\" referrerpolicy=\"no-referrer\" /></div></div></div><div data-w-id=\"69bce2ed-a263-dfb1-ea9c-dd5de6b6a3ed\" class=\"w-layout-grid feature_component\"><div class=\"feature_image-wrapper-sticky\"><img src=\"https://assets.website-files.com/61acd54a60fc632b98cbac1a/6254332b6684ea8846278a8a_Scalable.svg\" width=\"480\" height=\"480\" alt=\"\" class=\"illustration\" referrerpolicy=\"no-referrer\" /></div><div id=\"w-node-_69bce2ed-a263-dfb1-ea9c-dd5de6b6a3f9-63cbac1b\" class=\"w-layout-grid homepage-feature-list right\"><div class=\"layout29_item\"><p class=\"feature-paragraph\">Fully managed CDC in the cloud. Reduce DevOps overhead with Arcion Cloud, the only fully-managed CDC offering. Enjoy autoscaling, built-in high availability, monitoring console, and more.</p></div><div class=\"layout29_item\"><p class=\"feature-paragraph\">One solution for all OLTP &amp; OLAP systems. Simplify &amp; standardize data pipelines architecture, and zero downtime workload migration from on-prem to cloud.</p></div><div class=\"layout29_item\"><p class=\"feature-paragraph\">Lower total cost of ownership. Arcion’s zero-maintenance data pipelines reduce the total cost of ownership through log-based CDC, efficient data compression, and Read Once, Write Multiple technology.</p></div></div></div></div></section><section data-w-id=\"69bce2ed-a263-dfb1-ea9c-dd5de6b6a409\" class=\"section-connectors\"><div class=\"container-large page-padding padding-vertical padding-large title-wrapper\"><p></p><h2>Everything you need for enterprise-grade data replication</h2><p><a id=\"w-node-_69bce2ed-a263-dfb1-ea9c-dd5de6b6a417-63cbac1b\" href=\"https://www.arcion.io/connectors\" class=\"content-button bright w-button\">See all supported connectors</a></p></div></section><section class=\"section-industries\"><div class=\"page-padding container-large padding-vertical w-layout-grid industry-feature-component\"><div class=\"feature_content\"><h2 class=\"section-pretitle gradient-highlight-cloud\">Financial services</h2><p class=\"feature-paragraph\">In a competitive landscape where every second counts, Arcion helps financial institutions and companies save weeks and months while maintaining enterprise-grade security and compliance standards.</p><p><a data-w-id=\"cd34b98b-4595-1378-2ace-58bd13c6a9af\" href=\"https://www.arcion.io/industry-solutions/financial-services\" class=\"cloud-button w-button\">Read why financial services love Arcion</a><a href=\"https://www.arcion.io/solutions\" class=\"content-button bright w-button\">Explore all industries</a></p></div><div class=\"feature_image-wrapper right\"><img src=\"https://assets.website-files.com/61acd54a60fc632b98cbac1a/6251bb3a39aff1c5507f082b_Financial%20Service.svg\" width=\"480\" height=\"375\" alt=\"Arcion for Financial Services\" referrerpolicy=\"no-referrer\" /></div></div></section><section class=\"section-product-cta\"><div class=\"page-padding container-large margin-bottom margin-huge final-cta-component\"><p></p><h3 id=\"w-node-_69bce2ed-a263-dfb1-ea9c-dd5de6b6a447-63cbac1b\">Take Arcion for a Spin</h3><p class=\"feature-paragraph max-width-medium\">Deploy the only cloud-native data replication platform you’ll ever need. Get real-time, high-performance data pipelines today.</p><div class=\"w-layout-grid grid-9\"><div id=\"w-node-_69bce2ed-a263-dfb1-ea9c-dd5de6b6a44c-63cbac1b\" class=\"final-cta-wrapper div-block-10\"><img src=\"https://assets.website-files.com/61acd54a60fc632b98cbac1a/624e9daa0a1755530c42842a_Arcion_cloud_logo.svg\" width=\"300\" height=\"85\" alt=\"Arcion Cloud logo\" class=\"pretitle-logo\" referrerpolicy=\"no-referrer\" /><a href=\"https://cloud.arcion.io/login\" target=\"_blank\" class=\"content-button bright w-button\">Get started for free</a><div class=\"hosted-content_item-list-symbol\"><div id=\"w-node-_69bce2ed-a263-dfb1-ea9c-dd5de6b6a450-63cbac1b\" class=\"list_item\"><div class=\"layout18_item-icon-wrapper\"><img src=\"https://assets.website-files.com/61acd54a60fc632b98cbac1a/625301f361ccdcbb9808b562_check.svg\" alt=\"\" class=\"icon-1x1-xsmall-2\" referrerpolicy=\"no-referrer\" /></div><div class=\"layout18_item-text-wrapper\"><p>5 connectors: Oracle, MySQL, Databricks, Snowflake, SingleStore</p></div></div><div id=\"w-node-_69bce2ed-a263-dfb1-ea9c-dd5de6b6a456-63cbac1b\" class=\"list_item\"><div class=\"layout18_item-icon-wrapper\"><img src=\"https://assets.website-files.com/61acd54a60fc632b98cbac1a/625301f361ccdcbb9808b562_check.svg\" alt=\"\" class=\"icon-1x1-xsmall-2\" referrerpolicy=\"no-referrer\" /></div><div class=\"layout18_item-text-wrapper\"><p>Pre-configured enterprise instance</p></div></div><div id=\"w-node-_69bce2ed-a263-dfb1-ea9c-dd5de6b6a45c-63cbac1b\" class=\"list_item\"><div class=\"layout18_item-icon-wrapper\"><img src=\"https://assets.website-files.com/61acd54a60fc632b98cbac1a/625301f361ccdcbb9808b562_check.svg\" alt=\"\" class=\"icon-1x1-xsmall-2\" referrerpolicy=\"no-referrer\" /></div><div class=\"layout18_item-text-wrapper\"><p>Available in four US AWS regions</p></div></div></div></div><div id=\"w-node-_69bce2ed-a263-dfb1-ea9c-dd5de6b6a464-63cbac1b\" class=\"final-cta-wrapper div-block-10\"><div class=\"div-block-12\"><img src=\"https://assets.website-files.com/61acd54a60fc632b98cbac1a/62ffa2000879657834dfb48d_Arcion_slef-hosted_dark-background.svg\" width=\"500\" height=\"85\" alt=\"\" class=\"pretitle-logo\" referrerpolicy=\"no-referrer\" /></div><a data-w-id=\"69bce2ed-a263-dfb1-ea9c-dd5de6b6a47b\" href=\"https://www.arcion.io/\" class=\"self-hosted-button w-button\">Free download</a><div class=\"hosted-content_item-list-blogpage\"><div id=\"w-node-_69bce2ed-a263-dfb1-ea9c-dd5de6b6a469-63cbac1b\" class=\"list_item\"><div class=\"layout18_item-icon-wrapper\"><img src=\"https://assets.website-files.com/61acd54a60fc632b98cbac1a/625301f361ccdcbb9808b562_check.svg\" alt=\"\" class=\"icon-1x1-xsmall-2\" referrerpolicy=\"no-referrer\" /></div><div class=\"layout18_item-text-wrapper\"><p>20+ enterprise source and target connectors</p></div></div><div id=\"w-node-_69bce2ed-a263-dfb1-ea9c-dd5de6b6a46f-63cbac1b\" class=\"list_item\"><div class=\"layout18_item-icon-wrapper\"><img src=\"https://assets.website-files.com/61acd54a60fc632b98cbac1a/625301f361ccdcbb9808b562_check.svg\" alt=\"\" class=\"icon-1x1-xsmall-2\" referrerpolicy=\"no-referrer\" /></div><div class=\"layout18_item-text-wrapper\"><p>Deploy on-prem or VPC</p></div></div><div id=\"w-node-_69bce2ed-a263-dfb1-ea9c-dd5de6b6a475-63cbac1b\" class=\"list_item\"><div class=\"layout18_item-icon-wrapper\"><img src=\"https://assets.website-files.com/61acd54a60fc632b98cbac1a/625301f361ccdcbb9808b562_check.svg\" alt=\"\" class=\"icon-1x1-xsmall-2\" referrerpolicy=\"no-referrer\" /></div><div class=\"layout18_item-text-wrapper\"><p>Satisfy security requirements</p></div></div></div></div></div></div></section>","id":"e62be533-3e2f-51d0-9126-87cda55c371b","title":"Real-time Database Replication Platform | Arcion","origin_url":"https://www.arcion.io/","url":"https://www.arcion.io/","wallabag_created_at":"2022-08-22T16:00:20+00:00","published_at":null,"published_by":null,"reading_time":2,"domain_name":"www.arcion.io","preview_picture":"https://assets.website-files.com/61acd54a60fc632b98cbac1a/6256792469e58455de14d602_OpenGraph.svg","tags":["migration","cassandra","cosmos"],"description":"\n500kops/sTransfer 1 terabyte of data in less than 30 minutes100+Deployments over 3 continents and counting150TBMoved securely, reliably & in real-time every monthAnd also includes 3 new connectors:Re..."}],"skip":0,"limit":8,"totalCount":17,"currentPage":1,"url":"/tags/migration"}},"staticQueryHashes":[]}