From dcab056a1bae5338479fbab8218140d4c0eba5ab Mon Sep 17 00:00:00 2001 From: Kathryn Hancox <44557882+kathancox@users.noreply.github.com> Date: Fri, 26 Apr 2024 11:33:26 -0400 Subject: [PATCH 01/25] Remove config profile flags from pcr and update responses from show virtual cluster (#18488) --- .../interface-virtual-cluster.md | 2 +- .../interface-virtual-cluster.md | 4 +- .../show-virtual-cluster-data-state.md | 2 +- .../show-virtual-cluster-responses.md | 7 +- src/current/v23.2/create-virtual-cluster.md | 2 +- src/current/v23.2/cutover-replication.md | 14 +- ...physical-cluster-replication-monitoring.md | 2 +- .../physical-cluster-replication-overview.md | 4 +- .../set-up-physical-cluster-replication.md | 24 +-- src/current/v23.2/show-virtual-cluster.md | 2 +- .../v23.2/work-with-virtual-clusters.md | 4 +- src/current/v24.1/alter-virtual-cluster.md | 8 +- src/current/v24.1/create-virtual-cluster.md | 14 +- src/current/v24.1/cutover-replication.md | 44 +++--- src/current/v24.1/drop-virtual-cluster.md | 4 +- ...physical-cluster-replication-monitoring.md | 19 ++- .../physical-cluster-replication-overview.md | 18 +-- .../set-up-physical-cluster-replication.md | 144 ++++++++---------- src/current/v24.1/show-virtual-cluster.md | 33 +++- .../v24.1/work-with-virtual-clusters.md | 9 +- 20 files changed, 184 insertions(+), 176 deletions(-) diff --git a/src/current/_includes/v23.2/physical-replication/interface-virtual-cluster.md b/src/current/_includes/v23.2/physical-replication/interface-virtual-cluster.md index 96c5ddd74ab..8fb43c6ee1c 100644 --- a/src/current/_includes/v23.2/physical-replication/interface-virtual-cluster.md +++ b/src/current/_includes/v23.2/physical-replication/interface-virtual-cluster.md @@ -1,2 +1,2 @@ -- The system virtual cluster manages the cluster's control plane and the replication of the cluster's data. Admins connect to the system virtual cluster to configure and manage the underlying CockroachDB cluster, set up physical cluster replication, create and manage a virtual clusters, and observe metrics and logs for the CockroachDB cluster and each virtual cluster. +- The system virtual cluster manages the cluster's control plane and the replication of the cluster's data. Admins connect to the system virtual cluster to configure and manage the underlying CockroachDB cluster, set up physical cluster replication, create and manage a virtual cluster, and observe metrics and logs for the CockroachDB cluster and each virtual cluster. - Each other virtual cluster manages its own data plane. Users connect to a virtual cluster by default, rather than the system virtual cluster. To connect to the system virtual cluster, the connection string must be modified. Virtual clusters contain user data and run application workloads. When physical cluster replication is enabled, the non-system virtual cluster on both primary and secondary clusters is named `application`. diff --git a/src/current/_includes/v24.1/physical-replication/interface-virtual-cluster.md b/src/current/_includes/v24.1/physical-replication/interface-virtual-cluster.md index 96c5ddd74ab..aaca2fd0cb0 100644 --- a/src/current/_includes/v24.1/physical-replication/interface-virtual-cluster.md +++ b/src/current/_includes/v24.1/physical-replication/interface-virtual-cluster.md @@ -1,2 +1,2 @@ -- The system virtual cluster manages the cluster's control plane and the replication of the cluster's data. Admins connect to the system virtual cluster to configure and manage the underlying CockroachDB cluster, set up physical cluster replication, create and manage a virtual clusters, and observe metrics and logs for the CockroachDB cluster and each virtual cluster. -- Each other virtual cluster manages its own data plane. Users connect to a virtual cluster by default, rather than the system virtual cluster. To connect to the system virtual cluster, the connection string must be modified. Virtual clusters contain user data and run application workloads. When physical cluster replication is enabled, the non-system virtual cluster on both primary and secondary clusters is named `application`. +- The system virtual cluster manages the cluster's control plane and the replication of the cluster's data. Admins connect to the system virtual cluster to configure and manage the underlying CockroachDB cluster, set up physical cluster replication, create and manage a virtual cluster, and observe metrics and logs for the CockroachDB cluster and each virtual cluster. +- Each other virtual cluster manages its own data plane. Users connect to a virtual cluster by default, rather than the system virtual cluster. To connect to the system virtual cluster, the connection string must be modified. Virtual clusters contain user data and run application workloads. When physical cluster replication is enabled, the non-system virtual cluster on both primary and secondary clusters is named `main`. diff --git a/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-data-state.md b/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-data-state.md index a39bef0fe3e..c0a3163e8f3 100644 --- a/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-data-state.md +++ b/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-data-state.md @@ -5,5 +5,5 @@ State | Description `replicating` | The replication job has started and is replicating data. `replication paused` | The replication job is paused due to an error or a manual request with [`ALTER VIRTUAL CLUSTER ... PAUSE REPLICATION`]({% link {{ page.version.version }}/alter-virtual-cluster.md %}). `replication pending cutover` | The replication job is running and the cutover time has been set. Once the the replication reaches the cutover time, the cutover will begin automatically. -`replication cutting over` | The job has started cutting over. The cutover time can no longer be changed. Once cutover is complete, A virtual cluster will be available for use with [`ALTER VIRTUAL CLUSTER ... START SHARED SERVICE`]({% link {{ page.version.version }}/alter-virtual-cluster.md %}). +`replication cutting over` | The job has started cutting over. The cutover time can no longer be changed. Once cutover is complete, a virtual cluster will be available for use with [`ALTER VIRTUAL CLUSTER ... START SHARED SERVICE`]({% link {{ page.version.version }}/alter-virtual-cluster.md %}). `replication error` | An error has occurred. You can find more detail in the error message and the logs. diff --git a/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-responses.md b/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-responses.md index a537bc94939..545fc73058c 100644 --- a/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-responses.md +++ b/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-responses.md @@ -3,12 +3,13 @@ Field | Response `id` | The ID of a virtual cluster. `name` | The name of the standby (destination) virtual cluster. `data_state` | The state of the data on a virtual cluster. This can show one of the following: `initializing replication`, `ready`, `replicating`, `replication paused`, `replication pending cutover`, `replication cutting over`, `replication error`. Refer to [Data state](#data-state) for more detail on each response. -`service_mode` | The service mode shows whether a virtual cluster is ready to accept SQL requests. This can show one `none` or `shared`. When `shared`, a virtual cluster's SQL connections will be served by the same nodes that are serving the system virtual cluster. +`service_mode` | The service mode shows whether a virtual cluster is ready to accept SQL requests. This can show `none` or `shared`. When `shared`, a virtual cluster's SQL connections will be served by the same nodes that are serving the system virtual cluster. `source_tenant_name` | The name of the primary (source) virtual cluster. `source_cluster_uri` | The URI of the primary (source) cluster. The standby cluster connects to the primary cluster using this URI when [starting a replication stream]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}#step-4-start-replication). -`replication_job_id` | The ID of the replication job. -`replicated_time` | The latest timestamp at which the standby cluser has consistent data — that is, the latest time you can cut over to. This time advances automatically as long as the replication proceeds without error. `replicated_time` is updated periodically (every `30s`). +`replicated_time` | The latest timestamp at which the standby cluster has consistent data — that is, the latest time you can cut over to. This time advances automatically as long as the replication proceeds without error. `replicated_time` is updated periodically (every `30s`). `retained_time` | The earliest timestamp at which the standby cluster has consistent data — that is, the earliest time you can cut over to. +`replication_lag` | The time between the most up-to-date replicated time and the actual time. Refer to the [Technical Overview]({% link {{ page.version.version }}/physical-cluster-replication-technical-overview.md %}) for more detail. `cutover_time` | The time at which the cutover will begin. This can be in the past or the future. Refer to [Cut over to a point in time]({% link {{ page.version.version }}/cutover-replication.md %}#cut-over-to-a-point-in-time). +`status` | The status of the replication stream. This can show one of the following: `initializing replication`, `ready`, `replicating`, `replication paused`, `replication pending cutover`, `replication cutting over`, `replication error`. Refer to [Data state](#data-state) for more detail on each response. `capability_name` | The [capability]({% link {{ page.version.version }}/create-virtual-cluster.md %}#capabilities) name. `capability_value` | Whether the [capability]({% link {{ page.version.version }}/create-virtual-cluster.md %}#capabilities) is enabled for a virtual cluster. diff --git a/src/current/v23.2/create-virtual-cluster.md b/src/current/v23.2/create-virtual-cluster.md index 52a9214901c..377a280cf4a 100644 --- a/src/current/v23.2/create-virtual-cluster.md +++ b/src/current/v23.2/create-virtual-cluster.md @@ -57,7 +57,7 @@ When you [initiate a replication stream]({% link {{ page.version.version }}/set- {% include_cached copy-clipboard.html %} ~~~ -'postgresql://{replication user}:{password}@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full&sslrootcert=certs/{primary cert}.crt' +'postgresql://{replication user}:{password}@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full&sslrootcert=certs/{primary cert}.crt' ~~~ To form a connection string similar to the example, include the following values and query parameters. Replace values in `{...}` with the appropriate values for your configuration: diff --git a/src/current/v23.2/cutover-replication.md b/src/current/v23.2/cutover-replication.md index b6da91cf3de..1f767452159 100644 --- a/src/current/v23.2/cutover-replication.md +++ b/src/current/v23.2/cutover-replication.md @@ -44,9 +44,9 @@ SHOW VIRTUAL CLUSTER application WITH REPLICATION STATUS; {% include_cached copy-clipboard.html %} ~~~ - id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time ------+--------------------+-------------+--------------+--------------------+-----------------------------------------------------------------------------------------------------------------------+--------------------+------------------------------+-------------------------------+--------------- - 5 | application | replicating | none | application | postgresql://user:redacted@host/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 911803003607220225 | 2023-10-26 17:36:52.27978+00 | 2023-10-26 14:36:52.279781+00 | NULL + id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time +-----+--------------------+-------------+--------------+--------------------+-----------------------------------------------------------------------------------------------------+--------------------+------------------------------+-------------------------------+--------------- + 5 | application | replicating | none | application | postgresql://user:redacted@host?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 911803003607220225 | 2023-10-26 17:36:52.27978+00 | 2023-10-26 14:36:52.279781+00 | NULL ~~~ Run the following from the standby cluster's SQL shell to start the cutover: @@ -82,7 +82,7 @@ The `retained_time` response provides the earliest time to which you can cut ove ~~~ id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time ---+--------------------+--------------------+--------------+--------------------+----------------------------------------------------------------------------------------------------------------------+--------------------+-------------------------------+-------------------------------+--------------- -3 | application | replicating | none | application | postgresql://{user}:redacted@{hostname}:26257/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL +3 | application | replicating | none | application | postgresql://{user}:redacted@{hostname}:26257?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL (1 row) ~~~ @@ -117,9 +117,9 @@ To monitor for when the replication stream completes, use [`SHOW VIRTUAL CLUSTER SHOW VIRTUAL CLUSTER application WITH REPLICATION STATUS; ~~~ ~~~ - id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time - -----+---------------------+-----------------------------+--------------+--------------------+-------------------------------------------------------------------------------------------------------------------+--------------------+------------------------------+-------------------------------+--------------------------------- - 4 | application | replication pending cutover | none | application | postgresql://user:redacted@3ip:26257/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 903895265809498113 | 2023-09-28 17:41:18.03092+00 | 2023-09-28 16:09:04.327473+00 | 1695922878030920020.0000000000 + id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time + -----+---------------------+-----------------------------+--------------+--------------------+---------------------------------------------------------------------------------------------------------------------+--------------------+------------------------------+-------------------------------+--------------------------------- + 4 | application | replication pending cutover | none | application | postgresql://{user}:{password}@{hostname}:26257?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 903895265809498113 | 2023-09-28 17:41:18.03092+00 | 2023-09-28 16:09:04.327473+00 | 1695922878030920020.0000000000 (1 row) ~~~ diff --git a/src/current/v23.2/physical-cluster-replication-monitoring.md b/src/current/v23.2/physical-cluster-replication-monitoring.md index bf0c8075833..a99e1b6547c 100644 --- a/src/current/v23.2/physical-cluster-replication-monitoring.md +++ b/src/current/v23.2/physical-cluster-replication-monitoring.md @@ -35,7 +35,7 @@ Refer to [Responses](#responses) for a description of each field. ~~~ id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time ---+--------------------+--------------------+--------------+--------------------+----------------------------------------------------------------------------------------------------------------------+--------------------+-------------------------------+-------------------------------+--------------- -3 | application | replicating | none | application | postgresql://{user}:{password}@{hostname}:26257/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL +3 | application | replicating | none | application | postgresql://{user}:{password}@{hostname}:26257?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL (1 row) ~~~ diff --git a/src/current/v23.2/physical-cluster-replication-overview.md b/src/current/v23.2/physical-cluster-replication-overview.md index 5f90783055e..4c904174d4c 100644 --- a/src/current/v23.2/physical-cluster-replication-overview.md +++ b/src/current/v23.2/physical-cluster-replication-overview.md @@ -91,14 +91,14 @@ To connect to a virtualized cluster using the SQL shell: {% include_cached copy-clipboard.html %} ~~~ shell - cockroach sql --url "postgresql://root@{your IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full" --certs-dir "certs" + cockroach sql --url "postgresql://root@{your IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full" --certs-dir "certs" ~~~ - For the application virtual cluster, include the `options=-ccluster=application` parameter in the `postgresql` connection URL: {% include_cached copy-clipboard.html %} ~~~ shell - cockroach sql --url "postgresql://root@{your IP or hostname}:26257/?options=-ccluster=application&sslmode=verify-full" --certs-dir "certs" + cockroach sql --url "postgresql://root@{your IP or hostname}:26257?options=-ccluster=application&sslmode=verify-full" --certs-dir "certs" ~~~ {{site.data.alerts.callout_info}} diff --git a/src/current/v23.2/set-up-physical-cluster-replication.md b/src/current/v23.2/set-up-physical-cluster-replication.md index 4259f4d5a19..1d97e29a142 100644 --- a/src/current/v23.2/set-up-physical-cluster-replication.md +++ b/src/current/v23.2/set-up-physical-cluster-replication.md @@ -78,7 +78,7 @@ Connect to your primary cluster's system virtual cluster using [`cockroach sql`] {% include_cached copy-clipboard.html %} ~~~ shell cockroach sql --url \ - "postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full" \ + "postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full" \ --certs-dir "certs" ~~~ @@ -147,7 +147,7 @@ The standby cluster connects to the primary cluster's system virtual cluster usi {% include_cached copy-clipboard.html %} ~~~ shell - cockroach workload init movr "postgresql://root@{node_advertise_address}:{node_advertise_port}/?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key" + cockroach workload init movr "postgresql://root@{node_advertise_address}:{node_advertise_port}?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key" ~~~ Replace `{node_advertise_address}` and `{node_advertise_port}` with a node's [`--advertise-addr`]({% link {{ page.version.version }}/cockroach-start.md %}#flags-advert-addr) IP address or hostname and port. @@ -165,7 +165,7 @@ The standby cluster connects to the primary cluster's system virtual cluster usi {% include_cached copy-clipboard.html %} ~~~ shell - cockroach workload run movr --duration=5m "postgresql://root@{node_advertise_address}:{node_advertise_port}/?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key" + cockroach workload run movr --duration=5m "postgresql://root@{node_advertise_address}:{node_advertise_port}?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key" ~~~ 1. To connect to the primary cluster's application virtual cluster, use the `ccluster=application` parameter: @@ -173,7 +173,7 @@ The standby cluster connects to the primary cluster's system virtual cluster usi {% include_cached copy-clipboard.html %} ~~~ shell cockroach sql --url \ - "postgresql://root@{node IP or hostname}:26257/?options=-ccluster=application&sslmode=verify-full" \ + "postgresql://root@{node IP or hostname}:26257?options=-ccluster=application&sslmode=verify-full" \ --certs-dir "certs" ~~~ @@ -219,7 +219,7 @@ Connect to your standby cluster's system virtual cluster using [`cockroach sql`] {% include_cached copy-clipboard.html %} ~~~ shell cockroach sql --url \ - "postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full" \ + "postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full" \ --certs-dir "certs" ~~~ @@ -310,7 +310,7 @@ The system virtual cluster in the standby cluster initiates and controls the rep ~~~ sql CREATE VIRTUAL CLUSTER application LIKE template FROM REPLICATION OF application - ON 'postgresql://{replication user}:{password}@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full&sslrootcert=certs/{primary cert}.crt'; + ON 'postgresql://{replication user}:{password}@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full&sslrootcert=certs/{primary cert}.crt'; ~~~ {% include {{ page.version.version }}/physical-replication/like-description.md %} @@ -356,9 +356,9 @@ The system virtual cluster in the standby cluster initiates and controls the rep {% include_cached copy-clipboard.html %} ~~~ - id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time - ---+--------------------+--------------------+--------------+--------------------+----------------------------------------------------------------------------------------------------------------------+--------------------+-------------------------------+-------------------------------+--------------- - 3 | application | replicating | none | application | postgresql://{user}:{password}@{hostname}:26257/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL + id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time + ---+--------------------+--------------------+--------------+--------------------+---------------------------------------------------------------------------------------------------------------------+--------------------+-------------------------------+-------------------------------+--------------- + 3 | application | replicating | none | application | postgresql://{user}:{password}@{hostname}:26257?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL (1 row)s ~~~ @@ -372,9 +372,9 @@ For additional detail on the standard CockroachDB connection parameters, refer t Cluster | Interface | Usage | URL and Parameters --------+-----------+-------+------------+---- -Primary | System | Set up a replication user and view running virtual clusters. Connect with [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}). | `"postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full"`

Use the `--certs-dir` flag to specify the path to your certificate. -Primary | Application | Add and run a workload with [`cockroach workload`]({% link {{ page.version.version }}/cockroach-workload.md %}). | `"postgresql://root@{node IP or hostname}:{26257}/?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key"`

{% include {{ page.version.version }}/connect/cockroach-workload-parameters.md %} As a result, for the example in this tutorial, you will need:

-Standby | System | Manage the replication stream. Connect with [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}). | `"postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full"`

Use the `--certs-dir` flag to specify the path to your certificate. +Primary | System | Set up a replication user and view running virtual clusters. Connect with [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}). | `"postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full"`

Use the `--certs-dir` flag to specify the path to your certificate. +Primary | Application | Add and run a workload with [`cockroach workload`]({% link {{ page.version.version }}/cockroach-workload.md %}). | `"postgresql://root@{node IP or hostname}:{26257}?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key"`

{% include {{ page.version.version }}/connect/cockroach-workload-parameters.md %} As a result, for the example in this tutorial, you will need:

+Standby | System | Manage the replication stream. Connect with [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}). | `"postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full"`

Use the `--certs-dir` flag to specify the path to your certificate. ## What's next diff --git a/src/current/v23.2/show-virtual-cluster.md b/src/current/v23.2/show-virtual-cluster.md index 761c3f2ae41..a10395705a9 100644 --- a/src/current/v23.2/show-virtual-cluster.md +++ b/src/current/v23.2/show-virtual-cluster.md @@ -77,7 +77,7 @@ SHOW VIRTUAL CLUSTER application; ~~~ id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time -----+--------------------+-------------+--------------+--------------------+-----------------------------------------------------------------------------------------------------------------------+--------------------+------------------------------+-------------------------------+--------------- - 5 | application | replicating | none | application | postgresql://user:redacted@host/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 911803003607220225 | 2023-10-26 17:36:52.27978+00 | 2023-10-26 14:36:52.279781+00 | NULL + 5 | application | replicating | none | application | postgresql://user:redacted@host?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 911803003607220225 | 2023-10-26 17:36:52.27978+00 | 2023-10-26 14:36:52.279781+00 | NULL ~~~ ### Show replication status diff --git a/src/current/v23.2/work-with-virtual-clusters.md b/src/current/v23.2/work-with-virtual-clusters.md index 8ec5cc4409f..972b00508b7 100644 --- a/src/current/v23.2/work-with-virtual-clusters.md +++ b/src/current/v23.2/work-with-virtual-clusters.md @@ -34,7 +34,7 @@ For example: {% include_cached copy-clipboard.html %} ~~~ shell cockroach sql --url \ -"postgresql://root@{node IP or hostname}:26257/?options=-options=-ccluster={virtual_cluster_name}&sslmode=verify-full" \ +"postgresql://root@{node IP or hostname}:26257?options=-options=-ccluster={virtual_cluster_name}&sslmode=verify-full" \ --certs-dir "certs" ~~~ @@ -58,7 +58,7 @@ For example, to connect to the system virtual cluster using the `cockroach sql` {% include_cached copy-clipboard.html %} ~~~ shell cockroach sql --url \ -"postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full" \ +"postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full" \ --certs-dir "certs" ~~~ diff --git a/src/current/v24.1/alter-virtual-cluster.md b/src/current/v24.1/alter-virtual-cluster.md index 3253008dc52..8c63dbf8632 100644 --- a/src/current/v24.1/alter-virtual-cluster.md +++ b/src/current/v24.1/alter-virtual-cluster.md @@ -60,7 +60,7 @@ To start the [cutover]({% link {{ page.version.version }}/cutover-replication.md {% include_cached copy-clipboard.html %} ~~~ sql -ALTER VIRTUAL CLUSTER application COMPLETE REPLICATION TO {cutover time specification}; +ALTER VIRTUAL CLUSTER main COMPLETE REPLICATION TO {cutover time specification}; ~~~ You can use either: @@ -74,7 +74,7 @@ You can change the retention window to protect data from [garbage collection]({% {% include_cached copy-clipboard.html %} ~~~ sql -ALTER VIRTUAL CLUSTER application SET REPLICATION RETENTION = '24h'; +ALTER VIRTUAL CLUSTER main SET REPLICATION RETENTION = '24h'; ~~~ {% include {{ page.version.version }}/physical-replication/retention.md %} @@ -85,14 +85,14 @@ When a virtual cluster is [`ready`]({% link {{ page.version.version }}/show-virt {% include_cached copy-clipboard.html %} ~~~ sql -ALTER VIRTUAL CLUSTER application START SHARED SERVICE; +ALTER VIRTUAL CLUSTER main START SHARED SERVICE; ~~~ To stop the `shared` service for a virtual cluster and prevent it from accepting SQL connections: {% include_cached copy-clipboard.html %} ~~~ sql -ALTER VIRTUAL CLUSTER application STOP SERVICE; +ALTER VIRTUAL CLUSTER main STOP SERVICE; ~~~ ## See also diff --git a/src/current/v24.1/create-virtual-cluster.md b/src/current/v24.1/create-virtual-cluster.md index 44b989c75a5..1f886e276f3 100644 --- a/src/current/v24.1/create-virtual-cluster.md +++ b/src/current/v24.1/create-virtual-cluster.md @@ -57,7 +57,7 @@ When you [initiate a replication stream]({% link {{ page.version.version }}/set- {% include_cached copy-clipboard.html %} ~~~ -'postgresql://{replication user}:{password}@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full&sslrootcert=certs/{primary cert}.crt' +'postgresql://{replication user}:{password}@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full&sslrootcert=certs/{primary cert}.crt' ~~~ To form a connection string similar to the example, include the following values and query parameters. Replace values in `{...}` with the appropriate values for your configuration: @@ -77,20 +77,20 @@ Value | Description Cockroach Labs does not recommend changing the default capabilities of created virtual clusters. {{site.data.alerts.end}} -_Capabilities_ control what a virtual cluster can do. The [configuration profile]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}#start-the-standby-cluster) included at startup creates the `template` virtual cluster with the same set of capabilities per CockroachDB version. When you start a replication stream, you can specify the `template` VC with `LIKE` to ensure other virtual clusters on the standby cluster will work in the same way. `LIKE` will refer to a virtual cluster on the CockroachDB cluster you're running the statement from. +_Capabilities_ control what a virtual cluster can do. When you start a replication stream, you can specify a virtual cluster with `LIKE` to ensure other virtual clusters on the standby cluster will work in the same way. `LIKE` will refer to a virtual cluster on the CockroachDB cluster you're running the statement from. ## Examples ### Start a replication stream -To start a replication stream to the standby of the primary's application virtual cluster: +To start a replication stream to the standby of the primary's virtual cluster: {% include_cached copy-clipboard.html %} ~~~ sql -CREATE VIRTUAL CLUSTER application LIKE template FROM REPLICATION OF application ON 'postgresql://{connection string to primary}'; +CREATE VIRTUAL CLUSTER main FROM REPLICATION OF main ON 'postgresql://{connection string to primary}'; ~~~ -This will create a virtual cluster in the standby cluster that is based on the `template` virtual cluster, which is created during [cluster startup with `--config-profile`]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}#start-the-primary-cluster). The standby's system virtual cluster will connect to the primary cluster to initiate the replication stream job. For detail on the replication stream, refer to the [Responses]({% link {{ page.version.version }}/show-virtual-cluster.md %}#responses) for `SHOW VIRTUAL CLUSTER`. +This will create a `main` virtual cluster in the standby cluster. The standby's system virtual cluster will connect to the primary cluster to initiate the replication stream job. For detail on the replication stream, refer to the [Responses]({% link {{ page.version.version }}/show-virtual-cluster.md %}#responses) for `SHOW VIRTUAL CLUSTER`. ### Specify a retention window for a replication stream @@ -98,10 +98,10 @@ When you initiate a replication stream, you can specify a retention window to pr {% include_cached copy-clipboard.html %} ~~~ sql -CREATE VIRTUAL CLUSTER application LIKE template FROM REPLICATION OF application ON 'postgresql://{connection string to primary}' WITH RETENTION '36h'; +CREATE VIRTUAL CLUSTER main FROM REPLICATION OF main ON 'postgresql://{connection string to primary}' WITH RETENTION '36h'; ~~~ -This will initiate a replication stream from the primary cluster into the standby cluster's new `standbyapplication` virtual cluster. The `RETENTION` option allows you to specify a timestamp in the past for cutover to the standby cluster. After cutover, the `standbyapplication` will be transactionally consistent to any timestamp within that retention window. +This will initiate a replication stream from the primary cluster into the standby cluster's new `main` virtual cluster. The `RETENTION` option allows you to specify a timestamp in the past for cutover to the standby cluster. After cutover, the standby `main` virtual cluster will be transactionally consistent to any timestamp within that retention window. {% include {{ page.version.version }}/physical-replication/retention.md %} diff --git a/src/current/v24.1/cutover-replication.md b/src/current/v24.1/cutover-replication.md index 0ead39ad859..c29b1b1c8b5 100644 --- a/src/current/v24.1/cutover-replication.md +++ b/src/current/v24.1/cutover-replication.md @@ -39,21 +39,22 @@ To view the current replication timestamp, use: {% include_cached copy-clipboard.html %} ~~~ sql -SHOW VIRTUAL CLUSTER application WITH REPLICATION STATUS; +SHOW VIRTUAL CLUSTER main WITH REPLICATION STATUS; ~~~ {% include_cached copy-clipboard.html %} ~~~ - id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time ------+--------------------+-------------+--------------+--------------------+-----------------------------------------------------------------------------------------------------------------------+--------------------+------------------------------+-------------------------------+--------------- - 5 | application | replicating | none | application | postgresql://user:redacted@host/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 911803003607220225 | 2023-10-26 17:36:52.27978+00 | 2023-10-26 14:36:52.279781+00 | NULL + id | name | source_tenant_name | source_cluster_uri | retained_time | replicated_time | replication_lag | cutover_time | status +-----+------+--------------------+-------------------------------------------------+---------------------------------+------------------------+-----------------+--------------+-------------- + 3 | main | main | postgresql://user@hostname or IP:26257?redacted | 2024-04-18 10:07:45.000001+00 | 2024-04-18 14:07:45+00 | 00:00:19.602682 | NULL | replicating +(1 row) ~~~ Run the following from the standby cluster's SQL shell to start the cutover: {% include_cached copy-clipboard.html %} ~~~ sql -ALTER VIRTUAL CLUSTER application COMPLETE REPLICATION TO LATEST; +ALTER VIRTUAL CLUSTER main COMPLETE REPLICATION TO LATEST; ~~~ The `cutover_time` is the timestamp at which the replicated data is consistent. The cluster will revert any data above this timestamp: @@ -73,16 +74,15 @@ To select a [specific time]({% link {{ page.version.version }}/as-of-system-time {% include_cached copy-clipboard.html %} ~~~ sql -SHOW VIRTUAL CLUSTER application WITH REPLICATION STATUS; +SHOW VIRTUAL CLUSTER main WITH REPLICATION STATUS; ~~~ The `retained_time` response provides the earliest time to which you can cut over. -{% include_cached copy-clipboard.html %} ~~~ -id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time ----+--------------------+--------------------+--------------+--------------------+----------------------------------------------------------------------------------------------------------------------+--------------------+-------------------------------+-------------------------------+--------------- -3 | application | replicating | none | application | postgresql://{user}:redacted@{hostname}:26257/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL + id | name | source_tenant_name | source_cluster_uri | retained_time | replicated_time | replication_lag | cutover_time | status +-----+------+--------------------+-------------------------------------------------+-------------------------------+------------------------+-----------------+--------------+-------------- + 3 | main | main | postgresql://user@hostname or IP:26257?redacted | 2024-04-18 10:07:45.000001+00 | 2024-04-18 14:07:45+00 | 00:00:19.602682 | NULL | replicating (1 row) ~~~ @@ -90,7 +90,7 @@ Specify a timestamp: {% include_cached copy-clipboard.html %} ~~~ sql -ALTER VIRTUAL CLUSTER application COMPLETE REPLICATION TO SYSTEM TIME '-1h'; +ALTER VIRTUAL CLUSTER main COMPLETE REPLICATION TO SYSTEM TIME '-1h'; ~~~ Refer to [Using different timestamp formats]({% link {{ page.version.version }}/as-of-system-time.md %}#using-different-timestamp-formats) for more information. @@ -99,13 +99,16 @@ Similarly, to cut over to a specific time in the future: {% include_cached copy-clipboard.html %} ~~~ sql -ALTER VIRTUAL CLUSTER application COMPLETE REPLICATION TO SYSTEM TIME '+5h'; +ALTER VIRTUAL CLUSTER main COMPLETE REPLICATION TO SYSTEM TIME '+5h'; ~~~ A future cutover will proceed once the replicated data has reached the specified time. {{site.data.alerts.callout_info}} -To monitor for when the replication stream completes, use [`SHOW VIRTUAL CLUSTER ... WITH REPLICATION STATUS`]({% link {{ page.version.version }}/show-virtual-cluster.md %}) to find the replication stream's `replication_job_id`, which you can pass to `SHOW JOB WHEN COMPLETE job_id` as the `job_id`. Refer to the `SHOW JOBS` page for [details]({% link {{ page.version.version }}/show-jobs.md %}#parameters) and an [example]({% link {{ page.version.version }}/show-jobs.md %}#show-job-when-complete). +To monitor for when the replication stream completes, do the following: + +1. Find the replication stream's `job_id` using `SELECT * FROM [SHOW JOBS] WHERE job_type = 'REPLICATION STREAM INGESTION';` +1. Run `SHOW JOB WHEN COMPLETE job_id`. Refer to the `SHOW JOBS` page for [details]({% link {{ page.version.version }}/show-jobs.md %}#parameters) and an [example]({% link {{ page.version.version }}/show-jobs.md %}#show-job-when-complete). {{site.data.alerts.end}} ## Step 2. Complete the cutover @@ -114,12 +117,12 @@ To monitor for when the replication stream completes, use [`SHOW VIRTUAL CLUSTER {% include_cached copy-clipboard.html %} ~~~ sql - SHOW VIRTUAL CLUSTER application WITH REPLICATION STATUS; + SHOW VIRTUAL CLUSTER main WITH REPLICATION STATUS; ~~~ ~~~ - id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time - -----+---------------------+-----------------------------+--------------+--------------------+-------------------------------------------------------------------------------------------------------------------+--------------------+------------------------------+-------------------------------+--------------------------------- - 4 | application | replication pending cutover | none | application | postgresql://user:redacted@3ip:26257/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 903895265809498113 | 2023-09-28 17:41:18.03092+00 | 2023-09-28 16:09:04.327473+00 | 1695922878030920020.0000000000 + id | name | source_tenant_name | source_cluster_uri | retained_time | replicated_time | replication_lag | cutover_time | status + ---+------+--------------------+-------------------------------------------------+-------------------------------+------------------------------+-----------------+--------------------------------+-------------- + 3 | main | main | postgresql://user@hostname or IP:26257?redacted | 2023-09-28 16:09:04.327473+00 | 2023-09-28 17:41:18.03092+00 | 00:00:19.602682 | 1695922878030920020.0000000000 | replication pending cutover (1 row) ~~~ @@ -129,15 +132,14 @@ To monitor for when the replication stream completes, use [`SHOW VIRTUAL CLUSTER {% include_cached copy-clipboard.html %} ~~~ sql - ALTER VIRTUAL CLUSTER application START SERVICE SHARED; + ALTER VIRTUAL CLUSTER main START SERVICE SHARED; ~~~ ~~~ id | name | data_state | service_mode -----+---------------------+--------------------+--------------- 1 | system | ready | shared - 2 | template | ready | none - 3 | application | ready | shared + 3 | main | ready | shared (3 rows) ~~~ @@ -145,7 +147,7 @@ To monitor for when the replication stream completes, use [`SHOW VIRTUAL CLUSTER {% include_cached copy-clipboard.html %} ~~~ sql - SET CLUSTER SETTING server.controller.default_target_cluster='application'; + SET CLUSTER SETTING server.controller.default_target_cluster='main'; ~~~ At this point, the primary and standby clusters are entirely independent. You will need to use your own network load balancers, DNS servers, or other network configuration to direct application traffic to the standby (now primary). To enable physical cluster replication again, from the new primary to the original primary (or a completely different cluster), refer to [Cut back to the primary cluster](#cut-back-to-the-primary-cluster). diff --git a/src/current/v24.1/drop-virtual-cluster.md b/src/current/v24.1/drop-virtual-cluster.md index 03bb7a7de7f..f9471bb839e 100644 --- a/src/current/v24.1/drop-virtual-cluster.md +++ b/src/current/v24.1/drop-virtual-cluster.md @@ -55,7 +55,7 @@ To remove a virtual cluster from a CockroachDB cluster: {% include_cached copy-clipboard.html %} ~~~ sql -DROP VIRTUAL CLUSTER IF EXISTS application; +DROP VIRTUAL CLUSTER IF EXISTS main; ~~~ ### Remove a virtual cluster without waiting for garbage collection @@ -64,7 +64,7 @@ Use `IMMEDIATE` to drop a virtual cluster instead of waiting for data to be garb {% include_cached copy-clipboard.html %} ~~~ sql -DROP VIRTUAL CLUSTER IF EXISTS application IMMEDIATE; +DROP VIRTUAL CLUSTER IF EXISTS main IMMEDIATE; ~~~ ## See also diff --git a/src/current/v24.1/physical-cluster-replication-monitoring.md b/src/current/v24.1/physical-cluster-replication-monitoring.md index 2a3c4e62d0b..c4dd13f4082 100644 --- a/src/current/v24.1/physical-cluster-replication-monitoring.md +++ b/src/current/v24.1/physical-cluster-replication-monitoring.md @@ -26,16 +26,15 @@ In the standby cluster's SQL shell, you can query `SHOW VIRTUAL CLUSTER ... WITH {% include_cached copy-clipboard.html %} ~~~ sql -SHOW VIRTUAL CLUSTER application WITH REPLICATION STATUS; +SHOW VIRTUAL CLUSTER main WITH REPLICATION STATUS; ~~~ Refer to [Responses](#responses) for a description of each field. -{% include_cached copy-clipboard.html %} ~~~ -id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time ----+--------------------+--------------------+--------------+--------------------+----------------------------------------------------------------------------------------------------------------------+--------------------+-------------------------------+-------------------------------+--------------- -3 | application | replicating | none | application | postgresql://{user}:{password}@{hostname}:26257/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL +id | name | source_tenant_name | source_cluster_uri | retained_time | replicated_time | replication_lag | cutover_time | status +---+------+--------------------+-------------------------------------------------+-------------------------------+------------------------------+-----------------+--------------------------------+-------------- +3 | main | main | postgresql://user@hostname or IP:26257?redacted | 2023-09-28 16:09:04.327473+00 | 2023-09-28 17:41:18.03092+00 | 00:00:19.602682 | 1695922878030920020.0000000000 | replicating (1 row) ~~~ @@ -109,7 +108,7 @@ To verify that the data at a certain point in time is correct on the standby clu {% include_cached copy-clipboard.html %} ~~~ sql - SELECT replicated_time FROM [SHOW VIRTUAL CLUSTER standbyapplication WITH REPLICATION STATUS]; + SELECT replicated_time FROM [SHOW VIRTUAL CLUSTER standbymain WITH REPLICATION STATUS]; ~~~ ~~~ replicated_time @@ -124,12 +123,12 @@ To verify that the data at a certain point in time is correct on the standby clu {% include_cached copy-clipboard.html %} ~~~ sql - SELECT * FROM [SHOW EXPERIMENTAL_FINGERPRINTS FROM VIRTUAL CLUSTER application] AS OF SYSTEM TIME '2024-01-09 16:15:45.291575+00'; + SELECT * FROM [SHOW EXPERIMENTAL_FINGERPRINTS FROM VIRTUAL CLUSTER main] AS OF SYSTEM TIME '2024-01-09 16:15:45.291575+00'; ~~~ ~~~ tenant_name | end_ts | fingerprint ------------+--------------------------------+---------------------- - application | 1704816945291575000.0000000000 | 2646132238164576487 + main | 1704816945291575000.0000000000 | 2646132238164576487 (1 row) ~~~ @@ -139,12 +138,12 @@ To verify that the data at a certain point in time is correct on the standby clu {% include_cached copy-clipboard.html %} ~~~ sql - SELECT * FROM [SHOW EXPERIMENTAL_FINGERPRINTS FROM VIRTUAL CLUSTER standbyapplication] AS OF SYSTEM TIME '2024-01-09 16:15:45.291575+00'; + SELECT * FROM [SHOW EXPERIMENTAL_FINGERPRINTS FROM VIRTUAL CLUSTER standbymain] AS OF SYSTEM TIME '2024-01-09 16:15:45.291575+00'; ~~~ ~~~ tenant_name | end_ts | fingerprint --------------------+--------------------------------+---------------------- - standbyapplication | 1704816945291575000.0000000000 | 2646132238164576487 + standbymain | 1704816945291575000.0000000000 | 2646132238164576487 (1 row) ~~~ diff --git a/src/current/v24.1/physical-cluster-replication-overview.md b/src/current/v24.1/physical-cluster-replication-overview.md index 80b1ac8550a..47f10380a97 100644 --- a/src/current/v24.1/physical-cluster-replication-overview.md +++ b/src/current/v24.1/physical-cluster-replication-overview.md @@ -23,7 +23,7 @@ You can use physical cluster replication in a disaster recovery plan to: - Meet your RTO (Recovery Time Objective) and RPO (Recovery Point Objective) requirements. Physical cluster replication provides lower RTO and RPO than [backup and restore]({% link {{ page.version.version }}/backup-and-restore-overview.md %}). - Automatically replicate everything in your primary cluster to recover quickly from a control plane or full cluster failure. -- Protect against region failure when you cannot use individual [multi-region clusters]({% link {{ page.version.version }}/multiregion-overview.md %}) — for example, if you have a two-datacenter architecture and do not have access to three regions; or, you need low-write latency in a single region. Physical cluster replication allows for an active-passive (primary-standby) structure across two clusters with the passive cluster in different region. +- Protect against region failure when you cannot use individual [multi-region clusters]({% link {{ page.version.version }}/multiregion-overview.md %}) — for example, if you have a two-datacenter architecture and do not have access to three regions; or, you need low-write latency in a single region. Physical cluster replication allows for an active-passive (primary-standby) structure across two clusters with the passive cluster in a different region. - Avoid conflicts in data after recovery; the replication completes to a transactionally consistent state as of a certain point in time. ## Features @@ -56,18 +56,18 @@ For more comprehensive guides, refer to: ### Start clusters -To initiate physical cluster replication on clusters, you must [start]({% link {{ page.version.version }}/cockroach-start.md %}) the primary and standby CockroachDB clusters with the `--config-profile` flag. This enables [cluster virtualization]({% link {{ page.version.version }}/cluster-virtualization-overview.md %}) and sets up each cluster ready for replication. +To use physical cluster replication on clusters, you must [initialize]({% link {{ page.version.version }}/cockroach-start.md %}) the primary and standby CockroachDB clusters with the `--virtualized` and `--virtualized-empty` flags respectively. This enables [cluster virtualization]({% link {{ page.version.version }}/cluster-virtualization-overview.md %}) and sets up each cluster ready for replication. The active primary cluster that serves application traffic: ~~~shell -cockroach start ... --config-profile replication-source +cockroach init ... --virtualized ~~~ The passive standby cluster that will ingest the replicated data: ~~~shell -cockroach start ... --config-profile replication-target +cockroach init ... --virtualized-empty ~~~ The node topology of the two clusters does not need to be the same. For example, you can provision the standby cluster with fewer nodes. However, consider that: @@ -91,14 +91,14 @@ To connect to a virtualized cluster using the SQL shell: {% include_cached copy-clipboard.html %} ~~~ shell - cockroach sql --url "postgresql://root@{your IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full" --certs-dir "certs" + cockroach sql --url "postgresql://root@{your IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full" --certs-dir "certs" ~~~ -- For the application virtual cluster, include the `options=-ccluster=application` parameter in the `postgresql` connection URL: +- For the virtual cluster, include the `options=-ccluster=main` parameter in the `postgresql` connection URL: {% include_cached copy-clipboard.html %} ~~~ shell - cockroach sql --url "postgresql://root@{your IP or hostname}:26257/?options=-ccluster=application&sslmode=verify-full" --certs-dir "certs" + cockroach sql --url "postgresql://root@{your IP or hostname}:26257?options=-ccluster=main&sslmode=verify-full" --certs-dir "certs" ~~~ {{site.data.alerts.callout_info}} @@ -122,11 +122,11 @@ Statement | Action ### Cluster versions and upgrades -The standby cluster host will need to be at the same major version as, or one version ahead of, the primary's application virtual cluster at the time of cutover. +The standby cluster host will need to be at the same major version as, or one version ahead of, the primary's virtual cluster at the time of cutover. To [upgrade]({% link {{ page.version.version }}/upgrade-cockroach-version.md %}) a virtualized cluster, you must carefully and manually apply the upgrade. For details, refer to [Upgrades]({% link {{ page.version.version }}/work-with-virtual-clusters.md %}#upgrade-a-cluster) in the [Cluster Virtualization Overview]({% link {{ page.version.version }}/cluster-virtualization-overview.md %}). -When physical cluster replication is enabled, we recommend following this procedure on the standby cluster first, before upgrading the primary cluster. It is preferable to avoid a situation in which the application virtual cluster, which is being replicated, is a version higher than what the standby cluster can serve if you were to cut over. +When physical cluster replication is enabled, we recommend following this procedure on the standby cluster first, before upgrading the primary cluster. It is preferable to avoid a situation in which the virtual cluster, which is being replicated, is a version higher than what the standby cluster can serve if you were to cut over. ## Demo video diff --git a/src/current/v24.1/set-up-physical-cluster-replication.md b/src/current/v24.1/set-up-physical-cluster-replication.md index 03b30fca72e..f3b6fe0f8db 100644 --- a/src/current/v24.1/set-up-physical-cluster-replication.md +++ b/src/current/v24.1/set-up-physical-cluster-replication.md @@ -34,7 +34,7 @@ The high-level steps in this tutorial are: {% include enterprise-feature.md %} - Two separate CockroachDB clusters (primary and standby) with a minimum of three nodes each, and each using the same CockroachDB {{page.version.version}} version. - - To set up each cluster, you can follow [Deploy CockroachDB on Premises]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}). When you start each node in your cluster with the `cockroach start` command, you **must** pass the `--config-profile` flag with a `replication` value. Refer to cluster creation steps for the [primary cluster](#start-the-primary-cluster) and for the [standby cluster](#start-the-standby-cluster) for details. + - To set up each cluster, you can follow [Deploy CockroachDB on Premises]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}). When you initialize the cluster with the [`cockroach init`]({% link {{ page.version.version }}/cockroach-init.md %}) command, you **must** pass the `--virtualized` or `--virtualized-empty` flag. Refer to the cluster creation steps for the [primary cluster](#initialize-the-primary-cluster) and for the [standby cluster](#initialize-the-standby-cluster) for details. - The [Deploy CockroachDB on Premises]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}) tutorial creates a self-signed certificate for each {{ site.data.products.core }} cluster. To create certificates signed by an external certificate authority, refer to [Create Security Certificates using OpenSSL]({% link {{ page.version.version }}/create-security-certificates-openssl.md %}). - All nodes in each cluster will need access to the Certificate Authority for the other cluster. Refer to [Copy certificates](#step-3-copy-certificates). - An [{{ site.data.products.enterprise }} license]({% link {{ page.version.version }}/enterprise-licensing.md %}) on the primary **and** standby clusters. You must use the system virtual cluster on the primary and standby clusters to enable your {{ site.data.products.enterprise }} license. @@ -42,29 +42,17 @@ The high-level steps in this tutorial are: ## Step 1. Create the primary cluster -### Start the primary cluster +### Initialize the primary cluster -To enable physical cluster replication, it is necessary to start each node with the appropriate _configuration profile_ set with the `--config-profile` flag. A configuration profile applies a custom configuration to the server at initialization time. When using physical cluster replication, the `replication-source` and `replication-target` configuration profiles are used to create a virtualized cluster with a system virtual cluster and an application virtual cluster. +To enable physical cluster replication, it is necessary to initialize the CockroachDB cluster with the appropriate flag to create the appropriate virtual clusters on the primary and standby cluster. -The primary cluster requires the following value: +When initializing the [primary cluster](#initialize-the-primary-cluster), you pass the `--virtualized` flag to create a [_virtualized cluster_]({% link {{ page.version.version }}/cluster-virtualization-overview.md %}) with a `system` virtual cluster and a `main` virtual cluster. When initializing the [standby cluster](#initialize-the-standby-cluster), you pass the `--virtualized-empty` flag to create a virtualized standby cluster that contains a `system` virtual cluster. -{% include_cached copy-clipboard.html %} -~~~ shell ---config-profile replication-source -~~~ - -For example, a `cockroach start` command according to the [prerequisite deployment guide]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}#step-3-start-nodes): +For example, the `cockroach init` command to initialize the primary cluster (according to the [prerequisite deployment guide]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}#step-3-start-nodes)): {% include_cached copy-clipboard.html %} ~~~ shell -cockroach start \ ---certs-dir=certs \ ---advertise-addr= \ ---join=,, \ ---cache=.25 \ ---max-sql-memory=.25 \ ---background \ ---config-profile replication-source +cockroach init --certs-dir=certs --host={address of any node on --join list} --virtualized ~~~ Ensure that you follow the [prerequisite deployment guide]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}#step-4-initialize-the-cluster) to initialize your cluster before continuing to set up physical cluster replication. @@ -78,14 +66,14 @@ Connect to your primary cluster's system virtual cluster using [`cockroach sql`] {% include_cached copy-clipboard.html %} ~~~ shell cockroach sql --url \ - "postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full" \ + "postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full" \ --certs-dir "certs" ~~~ The prompt will include `system` when you are connected to the system virtual cluster. {{site.data.alerts.callout_info}} - You should only connect to the system virtual cluster for cluster administration. To work with databases, tables, or workloads, connect to the application virtual cluster. + You should only connect to the system virtual cluster for cluster administration. To work with databases, tables, or workloads, connect to a virtual cluster. {{site.data.alerts.end}} 1. Add your cluster organization and [{{ site.data.products.enterprise }} license]({% link {{ page.version.version }}/enterprise-licensing.md %}) to the cluster: @@ -99,6 +87,13 @@ Connect to your primary cluster's system virtual cluster using [`cockroach sql`] SET CLUSTER SETTING enterprise.license = 'your enterprise license'; ~~~ +1. Set the `kv.rangefeed.enabled` cluster setting to `true`. The replication job connects to a long-lived request, a _rangefeed_, which pushes changes as they happen: + + {% include_cached copy-clipboard.html %} + ~~~ sql + SET CLUSTER SETTING kv.rangefeed.enabled = true; + ~~~ + 1. Confirm the status of your virtual cluster: {% comment %}Link to SQL ref page here{% endcomment %} {% include_cached copy-clipboard.html %} @@ -106,18 +101,17 @@ Connect to your primary cluster's system virtual cluster using [`cockroach sql`] SHOW VIRTUAL CLUSTERS; ~~~ - The output will include the `system` interface and the `application` virtual cluster: + The output will include the `system` virtual cluster and the `main` virtual cluster: ~~~ - id | name | data_state | service_mode - ---+-------------+------------+--------------- - 1 | system | ready | shared - 2 | template | ready | none - 3 | application | ready | shared - (3 rows) + id | name | data_state | service_mode + -----+--------+------------+--------------- + 1 | system | ready | shared + 3 | main | ready | shared + (2 rows) ~~~ - Because this is the primary cluster rather than the standby cluster, `data_state` of all rows is `ready`, rather than `replicating` or another status.{% comment %}link to SQL reference or monitoring page here{% endcomment %} + Because this is the primary cluster rather than the standby cluster, the `data_state` of all rows is `ready`, rather than `replicating` or another [status]({% link {{ page.version.version }}/physical-cluster-replication-monitoring.md %}). ### Create a replication user and password @@ -130,7 +124,7 @@ The standby cluster connects to the primary cluster's system virtual cluster usi CREATE USER {your username} WITH PASSWORD '{your password}'; ~~~ -1. Grant the [`REPLICATION` system privilege]({% link {{ page.version.version }}/security-reference/authorization.md %}#supported-privileges) to your user: {% comment %}Link to detail on replication system privilege{% endcomment %} +1. Grant the [`REPLICATION` system privilege]({% link {{ page.version.version }}/security-reference/authorization.md %}#supported-privileges) to your user: {% include_cached copy-clipboard.html %} ~~~ sql @@ -141,19 +135,19 @@ The standby cluster connects to the primary cluster's system virtual cluster usi ### Connect to the primary virtual cluster (optional) -1. If you would like to run a sample workload on the primary's application virtual cluster, open a new terminal window and use [`cockroach workload`]({% link {{ page.version.version }}/cockroach-workload.md %}) to run the workload. +1. If you would like to run a sample workload on the primary's virtual cluster, open a new terminal window and use [`cockroach workload`]({% link {{ page.version.version }}/cockroach-workload.md %}) to run the workload. For example, to initiate the [`movr`]({% link {{ page.version.version }}/movr.md %}) workload: {% include_cached copy-clipboard.html %} ~~~ shell - cockroach workload init movr "postgresql://root@{node_advertise_address}:{node_advertise_port}/?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key" + cockroach workload init movr "postgresql://root@{node_advertise_address}:{node_advertise_port}?options=-ccluster=main&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key" ~~~ Replace `{node_advertise_address}` and `{node_advertise_port}` with a node's [`--advertise-addr`]({% link {{ page.version.version }}/cockroach-start.md %}#flags-advert-addr) IP address or hostname and port. {% include {{ page.version.version }}/connect/cockroach-workload-parameters.md %} As a result, for the example in this tutorial, you will need: - - `options=-ccluster=application` + - `options=-ccluster=main` - `sslmode=verify-full` - `sslrootcert={path}/certs/ca.crt`: the path to the CA certificate. - `sslcert={path}/certs/client.root.crt`: the path to the client certificate. @@ -165,21 +159,21 @@ The standby cluster connects to the primary cluster's system virtual cluster usi {% include_cached copy-clipboard.html %} ~~~ shell - cockroach workload run movr --duration=5m "postgresql://root@{node_advertise_address}:{node_advertise_port}/?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key" + cockroach workload run movr --duration=5m "postgresql://root@{node_advertise_address}:{node_advertise_port}?options=-ccluster=main&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key" ~~~ -1. To connect to the primary cluster's application virtual cluster, use the `ccluster=application` parameter: +1. To connect to the primary cluster's virtual cluster, use the `options=-ccluster={virtual_cluster_name}` parameter: {% include_cached copy-clipboard.html %} ~~~ shell cockroach sql --url \ - "postgresql://root@{node IP or hostname}:26257/?options=-ccluster=application&sslmode=verify-full" \ + "postgresql://root@{node IP or hostname}:26257?options=-ccluster=main&sslmode=verify-full" \ --certs-dir "certs" ~~~ - The prompt will include `application` when you are connected to the application virtual cluster. + The prompt will include `main` when you are connected to the virtual cluster. -1. Create a user for your primary cluster's application virtual cluster: +1. Create a user for your primary cluster's `main` virtual cluster: {% include_cached copy-clipboard.html %} ~~~ sql @@ -190,22 +184,15 @@ The standby cluster connects to the primary cluster's system virtual cluster usi ## Step 2. Create the standby cluster -### Start the standby cluster +### Initialize the standby cluster -Similarly to the primary cluster, each node on the standby cluster must be started with the `--config-profile` flag set to `replication-target`. This creates a _virtualized cluster_ with a system virtual cluster and an application virtual cluster, and sets up all the required configuration for starting a replication stream. +Similarly to the primary cluster, you must initialize the standby cluster with the `--virtualized-empty` flag. This creates a _virtualized cluster_ with a system virtual cluster. -For example, a `cockroach start` command according to the [prerequisite deployment guide]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}#step-3-start-nodes): +For example, the `cockroach init` command to initialize the standby cluster (according to the [prerequisite deployment guide]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}#step-3-start-nodes)): {% include_cached copy-clipboard.html %} ~~~ shell -cockroach start \ ---certs-dir=certs \ ---advertise-addr= \ ---join=,, \ ---cache=.25 \ ---max-sql-memory=.25 \ ---background \ ---config-profile replication-target +cockroach init --certs-dir=certs --host={address of any node on --join list} --virtualized-empty ~~~ Ensure that you follow the [prerequisite deployment guide]({% link {{ page.version.version }}/deploy-cockroachdb-on-premises.md %}#step-4-initialize-the-cluster) to initialize your cluster before continuing to set up physical cluster replication. @@ -219,7 +206,7 @@ Connect to your standby cluster's system virtual cluster using [`cockroach sql`] {% include_cached copy-clipboard.html %} ~~~ shell cockroach sql --url \ - "postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full" \ + "postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full" \ --certs-dir "certs" ~~~ @@ -236,6 +223,15 @@ Connect to your standby cluster's system virtual cluster using [`cockroach sql`] SET CLUSTER SETTING enterprise.license = 'your enterprise license'; ~~~ +1. Set the `kv.rangefeed.enabled` cluster setting to `true`. The replication job connects to a long-lived request, a _rangefeed_, which pushes changes as they happen: + + {% include_cached copy-clipboard.html %} + ~~~ sql + SET CLUSTER SETTING kv.rangefeed.enabled = true; + ~~~ + + {% comment %}While not strictly needed, it is necessary if a user then replicates from the promoted standby to the original primary. Add a note on this once the fast cutback work is published.{% endcomment %} + 1. Confirm the status of your virtual cluster: {% include_cached copy-clipboard.html %} @@ -243,18 +239,15 @@ Connect to your standby cluster's system virtual cluster using [`cockroach sql`] SHOW VIRTUAL CLUSTERS; ~~~ - The output will show the `system` interface, but no `application` virtual cluster: + The output will show the `system` virtual cluster, but no `main` virtual cluster: ~~~ id | name | data_state | service_mode ---+----------+------------+--------------- 1 | system | ready | shared - 2 | template | ready | none - (2 rows) + (1 rows) ~~~ - {% include {{ page.version.version }}/physical-replication/template-description.md %} - ### Create a user for the standby cluster If you would like to access the [DB Console]({% link {{ page.version.version }}/ui-overview.md %}) to observe your replication, you will need to create a user: @@ -308,13 +301,11 @@ The system virtual cluster in the standby cluster initiates and controls the rep {% include_cached copy-clipboard.html %} ~~~ sql - CREATE VIRTUAL CLUSTER application LIKE template - FROM REPLICATION OF application - ON 'postgresql://{replication user}:{password}@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full&sslrootcert=certs/{primary cert}.crt'; + CREATE VIRTUAL CLUSTER main + FROM REPLICATION OF main + ON 'postgresql://{replication user}:{password}@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full&sslrootcert=certs/{primary cert}.crt'; ~~~ - {% include {{ page.version.version }}/physical-replication/like-description.md %} - Once the standby cluster has made a connection to the primary cluster, the standby will pull the topology of the primary cluster and will distribute the replication work across all nodes in the primary and standby. 1. To view all virtual clusters on the standby, run: @@ -324,15 +315,14 @@ The system virtual cluster in the standby cluster initiates and controls the rep SHOW VIRTUAL CLUSTERS; ~~~ - The standby cluster will show the `application` virtual cluster is in a `replicating` state. + The standby cluster will show the `main` virtual cluster is in a `replicating` state. ~~~ - id | name | data_state | service_mode - ---+--------------------+--------------------+--------------- - 1 | system | ready | shared - 2 | template | ready | none - 3 | application | replicating | none - (3 rows) + id | name | data_state | service_mode + -----+--------+-------------+--------------- + 1 | system | ready | shared + 3 | main | replicating | none + (2 rows) ~~~ The standby cluster's virtual cluster is offline while the replication stream is running. To bring it online, you must explicitly [start its service after cutover]({% link {{ page.version.version }}/cutover-replication.md %}#step-2-complete-the-cutover). @@ -341,25 +331,25 @@ The system virtual cluster in the standby cluster initiates and controls the rep {% include_cached copy-clipboard.html %} ~~~ sql - ALTER VIRTUAL CLUSTER application PAUSE REPLICATION; + ALTER VIRTUAL CLUSTER main PAUSE REPLICATION; ~~~ {% include_cached copy-clipboard.html %} ~~~ sql - ALTER VIRTUAL CLUSTER application RESUME REPLICATION; + ALTER VIRTUAL CLUSTER main RESUME REPLICATION; ~~~ {% include_cached copy-clipboard.html %} ~~~ sql - SHOW VIRTUAL CLUSTER application WITH REPLICATION STATUS; + SHOW VIRTUAL CLUSTER main WITH REPLICATION STATUS; ~~~ {% include_cached copy-clipboard.html %} ~~~ - id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time - ---+--------------------+--------------------+--------------+--------------------+----------------------------------------------------------------------------------------------------------------------+--------------------+-------------------------------+-------------------------------+--------------- - 3 | application | replicating | none | application | postgresql://{user}:{password}@{hostname}:26257/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 899090689449132033 | 2023-09-11 22:29:35.085548+00 | 2023-09-11 16:51:43.612846+00 | NULL - (1 row)s + id | name | source_tenant_name | source_cluster_uri | retained_time | replicated_time | replication_lag | cutover_time | status + ---+------+--------------------+--------------------------------------------------------+-------------------------------+------------------------+-----------------+--------------+-------------- + 3 | main | main | postgresql://user@{node IP or hostname}:26257?redacted | 2024-04-17 20:14:31.952783+00 | 2024-04-17 20:18:50+00 | 00:00:08.738176 | NULL | replicating + (1 row) ~~~ With the replication stream running, you can monitor the job via the DB Console, SQL shell, or Prometheus. You can also verify data is correct on the standby cluster at a specific point in time. For more detail, refer to [Physical Cluster Replication Monitoring]({% link {{ page.version.version }}/physical-cluster-replication-monitoring.md %}). @@ -370,11 +360,11 @@ This table outlines the connection strings you will need for this setup tutorial For additional detail on the standard CockroachDB connection parameters, refer to [Client Connection Parameters]({% link {{ page.version.version }}/connection-parameters.md %}#connect-using-a-url). -Cluster | Interface | Usage | URL and Parameters +Cluster | Virtual Cluster | Usage | URL and Parameters --------+-----------+-------+------------+---- -Primary | System | Set up a replication user and view running virtual clusters. Connect with [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}). | `"postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full"`

  • `options=-ccluster=system`
  • `sslmode=verify-full`
Use the `--certs-dir` flag to specify the path to your certificate. -Primary | Application | Add and run a workload with [`cockroach workload`]({% link {{ page.version.version }}/cockroach-workload.md %}). | `"postgresql://root@{node IP or hostname}:{26257}/?options=-ccluster=application&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key"`

{% include {{ page.version.version }}/connect/cockroach-workload-parameters.md %} As a result, for the example in this tutorial, you will need:

  • `options=-ccluster=application`
  • `sslmode=verify-full`
  • `sslrootcert={path}/certs/ca.crt`
  • `sslcert={path}/certs/client.root.crt`
  • `sslkey={path}/certs/client.root.key`
-Standby | System | Manage the replication stream. Connect with [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}). | `"postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full"`

  • `options=-ccluster=system`
  • `sslmode=verify-full`
Use the `--certs-dir` flag to specify the path to your certificate. +Primary | System | Set up a replication user and view running virtual clusters. Connect with [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}). | `"postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full"`

  • `options=-ccluster=system`
  • `sslmode=verify-full`
Use the `--certs-dir` flag to specify the path to your certificate. +Primary | Main | Add and run a workload with [`cockroach workload`]({% link {{ page.version.version }}/cockroach-workload.md %}). | `"postgresql://root@{node IP or hostname}:{26257}?options=-ccluster=main&sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key"`

{% include {{ page.version.version }}/connect/cockroach-workload-parameters.md %} As a result, for the example in this tutorial, you will need:

  • `options=-ccluster={virtual_cluster_name}`
  • `sslmode=verify-full`
  • `sslrootcert={path}/certs/ca.crt`
  • `sslcert={path}/certs/client.root.crt`
  • `sslkey={path}/certs/client.root.key`
+Standby | System | Manage the replication stream. Connect with [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}). | `"postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full"`

  • `options=-ccluster=system`
  • `sslmode=verify-full`
Use the `--certs-dir` flag to specify the path to your certificate. ## What's next diff --git a/src/current/v24.1/show-virtual-cluster.md b/src/current/v24.1/show-virtual-cluster.md index 185bc876e20..a257fd92887 100644 --- a/src/current/v24.1/show-virtual-cluster.md +++ b/src/current/v24.1/show-virtual-cluster.md @@ -49,8 +49,19 @@ This table lists all possible responses from the different `SHOW VIRTUAL CLUSTER {% include {{ page.version.version }}/physical-replication/show-virtual-cluster-responses.md %} +{{site.data.alerts.callout_success}} +To find the job ID for the replication stream, use the [`SHOW JOBS`]({% link {{ page.version.version }}/show-jobs.md %}) statement. For example: + +{% include_cached copy-clipboard.html %} +~~~ sql +SELECT * FROM [SHOW JOBS] WHERE job_type = 'REPLICATION STREAM INGESTION'; +~~~ +{{site.data.alerts.end}} + ### Data state +The `data_state` and `status` fields show the current state of a virtual cluster's data and progress of the replication stream job. + {% include {{ page.version.version }}/physical-replication/show-virtual-cluster-data-state.md %} ## Examples @@ -66,22 +77,22 @@ SHOW VIRTUAL CLUSTERS; ### Show a virtual cluster -To show more details about the `application` virtual cluster: +To show more details about the `main` virtual cluster: {% include_cached copy-clipboard.html %} ~~~ sql -SHOW VIRTUAL CLUSTER application; +SHOW VIRTUAL CLUSTER main; ~~~ {% include_cached copy-clipboard.html %} ~~~ - id | name | data_state | service_mode | source_tenant_name | source_cluster_uri | replication_job_id | replicated_time | retained_time | cutover_time ------+--------------------+-------------+--------------+--------------------+-----------------------------------------------------------------------------------------------------------------------+--------------------+------------------------------+-------------------------------+--------------- - 5 | application | replicating | none | application | postgresql://user:redacted@host/?options=-ccluster%3Dsystem&sslmode=verify-full&sslrootcert=redacted | 911803003607220225 | 2023-10-26 17:36:52.27978+00 | 2023-10-26 14:36:52.279781+00 | NULL + id | name | data_state | service_mode +-----+------+-------------+--------------- + 3 | main | replicating | none +(1 row) ~~~ ### Show replication status -{% comment %}this code block and output could be in an include. This is in several place e.g., cutover page, monitoring{% endcomment %} To show the replication status of all virtual clusters: @@ -90,11 +101,17 @@ To show the replication status of all virtual clusters: SHOW VIRTUAL CLUSTERS WITH REPLICATION STATUS; ~~~ -To show the replication status of the `application` virtual cluster: +To show the replication status of the `main` virtual cluster: {% include_cached copy-clipboard.html %} ~~~ sql -SHOW VIRTUAL CLUSTER application WITH REPLICATION STATUS; +SHOW VIRTUAL CLUSTER main WITH REPLICATION STATUS; +~~~ +~~~ + id | name | source_tenant_name | source_cluster_uri | retained_time | replicated_time | replication_lag | cutover_time | status +-----+------+--------------------+-----------------------------------------------+-------------------------------+------------------------+-----------------+--------------+-------------- + 3 | main | main | postgresql://user@hostname or IP:26257?redacted | 2024-04-18 10:07:45.000001+00 | 2024-04-18 14:07:45+00 | 00:00:19.602682 | NULL | replicating +(1 row) ~~~ ## See also diff --git a/src/current/v24.1/work-with-virtual-clusters.md b/src/current/v24.1/work-with-virtual-clusters.md index 8ec5cc4409f..d047f0bb0e7 100644 --- a/src/current/v24.1/work-with-virtual-clusters.md +++ b/src/current/v24.1/work-with-virtual-clusters.md @@ -16,7 +16,7 @@ docs_area: deploy This section shows how to use [SQL clients](#sql-clients) or the [DB Console](#db-console) to connect to a virtual cluster. {% capture pcr_application_cluster_note %} -When [Physical Cluster Replication]({% link {{ page.version.version }}/physical-cluster-replication-overview.md %}) is enabled, the virtual cluster is named `application`. +When [Physical Cluster Replication]({% link {{ page.version.version }}/physical-cluster-replication-overview.md %}) is enabled, the virtual cluster is named `main`. {% endcapture %} {{ pcr_application_cluster_note }} @@ -25,7 +25,7 @@ When [Physical Cluster Replication]({% link {{ page.version.version }}/physical- This section shows how to connect using [`cockroach sql`]({% link {{ page.version.version }}/cockroach-sql.md %}) when cluster virtualization is enabled. -Unless you specify which virtual cluster to connect to, when you connect using a SQL client, you are logged into the default virtual cluster. When [Physical Cluster Replication]({% link {{ page.version.version }}/physical-cluster-replication-overview.md %}) is enabled, the default virtual cluster is named `application`. +Unless you specify which virtual cluster to connect to, when you connect using a SQL client, you are logged into the default virtual cluster. When [Physical Cluster Replication]({% link {{ page.version.version }}/physical-cluster-replication-overview.md %}) is enabled, the default virtual cluster is named `main`. To connect to a specific virtual cluster, add the `GET` URL parameter `options=-ccluster={virtual_cluster_name}` to the connection URL. Replace `{virtual_cluster_name}` with the name of the virtual cluster. You must use `--url` rather than `--host`. @@ -34,7 +34,7 @@ For example: {% include_cached copy-clipboard.html %} ~~~ shell cockroach sql --url \ -"postgresql://root@{node IP or hostname}:26257/?options=-options=-ccluster={virtual_cluster_name}&sslmode=verify-full" \ +"postgresql://root@{node IP or hostname}:26257?options=-ccluster={virtual_cluster_name}&sslmode=verify-full" \ --certs-dir "certs" ~~~ @@ -58,7 +58,7 @@ For example, to connect to the system virtual cluster using the `cockroach sql` {% include_cached copy-clipboard.html %} ~~~ shell cockroach sql --url \ -"postgresql://root@{node IP or hostname}:26257/?options=-ccluster=system&sslmode=verify-full" \ +"postgresql://root@{node IP or hostname}:26257?options=-ccluster=system&sslmode=verify-full" \ --certs-dir "certs" ~~~ @@ -70,7 +70,6 @@ Unless you specify which virtual cluster to connect to, when you connect using t To connect to a specific virtual cluster, add the `GET` URL parameter `options=-ccluster={virtual_cluster_name}` to the DB Console URL. Replace `{virtual_cluster_name}` with the name of the virtual cluster. - If the same SQL user has the `admin` role on the system virtual cluster and also has roles on other virtual clusters, that user can switch among them from the top of the DB Console. #### Connect to the system virtual cluster From b378dba5c6d6e8381a0dbc99fc8c399b34054d02 Mon Sep 17 00:00:00 2001 From: Florence Morris Date: Fri, 26 Apr 2024 13:50:00 -0400 Subject: [PATCH 02/25] DOC-9892 PR #120490 - ui: show license expiration alert in Db Console (#18501) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (1) In ui-overview.md, added a section for License expiration message. (2) In licensing-faqs.md, updated Monitor for license expiry section with a link to the new License expiration message section. * Incorporated David’s feedback. * Incorporated Ryan’s feedback. --- src/current/v24.1/licensing-faqs.md | 5 ++++- src/current/v24.1/ui-overview.md | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/current/v24.1/licensing-faqs.md b/src/current/v24.1/licensing-faqs.md index 97fce8eafa6..1b9bd2a5abd 100644 --- a/src/current/v24.1/licensing-faqs.md +++ b/src/current/v24.1/licensing-faqs.md @@ -139,7 +139,10 @@ I171116 18:11:48.279604 1514 sql/event_log.go:102 [client=[::1]:56357,user=root ## Monitor for license expiry -You can monitor the time until your license expires with [Prometheus]({% link {{ page.version.version }}/monitor-cockroachdb-with-prometheus.md %}). The `seconds_until_enterprise_license_expiry` metric reports the number of seconds until the Enterprise license on a cluster expires. It will report 0 if there is no license or a negative number if the license has already expired. For more information, see [Monitoring and Alerting]({% link {{ page.version.version }}/monitoring-and-alerting.md %}). +You can monitor the time until your license expires in two ways: + +1. [DB console]({% link {{ page.version.version }}/ui-overview.md %}): The [license expiration message]({% link {{ page.version.version }}/ui-overview.md %}#license-expiration-message) displays the number of days until the expiration date or the days since the expiration date. +1. [Prometheus]({% link {{ page.version.version }}/monitor-cockroachdb-with-prometheus.md %}): The `seconds_until_enterprise_license_expiry` metric reports the number of seconds until the enterprise license on a cluster expires. It will report `0` if there is no license, and a negative number if the license has already expired. For more information, see [Monitoring and Alerting]({% link {{ page.version.version }}/monitoring-and-alerting.md %}). ## Renew an expired license diff --git a/src/current/v24.1/ui-overview.md b/src/current/v24.1/ui-overview.md index 6ccc7f48b8a..1d1f144d077 100644 --- a/src/current/v24.1/ui-overview.md +++ b/src/current/v24.1/ui-overview.md @@ -146,6 +146,10 @@ The DB Console stores temporary data in a time-series database in order to gener By default, the DB Console shares anonymous usage details with Cockroach Labs. For information about the details shared and how to opt-out of reporting, see [Diagnostics Reporting]({% link {{ page.version.version }}/diagnostics-reporting.md %}). +## License expiration message + +If you have [set a license]({% link {{ page.version.version }}/licensing-faqs.md %}#set-a-license) to use [enterprise features]({% link {{ page.version.version }}/enterprise-licensing.md %}), a license expiration message is displayed at the top-right of the DB Console. While the license is valid, the message will read `License expires in X days`, where `X` is the number of days. If the license is no longer valid, the message will read `License expired X days ago`. Hovering over either message displays a tooltip with the expiration date of the license. + ## See also - [Troubleshooting Overview]({% link {{ page.version.version }}/troubleshooting-overview.md %}) From 2be4c42018dcd923cd0fa7617c71fafc5df5b436 Mon Sep 17 00:00:00 2001 From: Florence Morris Date: Mon, 29 Apr 2024 09:47:29 -0400 Subject: [PATCH 03/25] DOC-9004 Create a physical cluster replication metrics dashboard page when PCR goes GA (#18489) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (1) Added ui-physical-cluster-replication-dashboard.md, moved content from DB Console section of physical-cluster-replication-monitoring.md. (2) In physical-cluster-replication-monitoring.md, ui-overview.md and self-hosted-deployments.json, added links to ui-physical-cluster-replication-dashboard.md. (3) In ui-replication-dashboard.md, added callout regarding ui-physical-cluster-replication-dashboard.md. * Incorporated Kathryn’s feedback. * Incorporated Ryan’s feedback. --- .../sidebar-data/self-hosted-deployments.json | 6 ++ ...physical-cluster-replication-monitoring.md | 38 +----------- src/current/v24.1/ui-overview.md | 1 + ...-physical-cluster-replication-dashboard.md | 59 +++++++++++++++++++ src/current/v24.1/ui-replication-dashboard.md | 6 +- 5 files changed, 73 insertions(+), 37 deletions(-) create mode 100644 src/current/v24.1/ui-physical-cluster-replication-dashboard.md diff --git a/src/current/_includes/v24.1/sidebar-data/self-hosted-deployments.json b/src/current/_includes/v24.1/sidebar-data/self-hosted-deployments.json index a357aab89dd..883cf637457 100644 --- a/src/current/_includes/v24.1/sidebar-data/self-hosted-deployments.json +++ b/src/current/_includes/v24.1/sidebar-data/self-hosted-deployments.json @@ -459,6 +459,12 @@ "/${VERSION}/ui-ttl-dashboard.html" ] }, + { + "title": "Physical Cluster Replication Dashboard", + "urls": [ + "/${VERSION}/ui-physical-cluster-replication-dashboard.html" + ] + }, { "title": "Custom Chart", "urls": [ diff --git a/src/current/v24.1/physical-cluster-replication-monitoring.md b/src/current/v24.1/physical-cluster-replication-monitoring.md index c4dd13f4082..e7aacd012ea 100644 --- a/src/current/v24.1/physical-cluster-replication-monitoring.md +++ b/src/current/v24.1/physical-cluster-replication-monitoring.md @@ -12,7 +12,7 @@ docs_area: manage You can monitor a physical cluster replication stream using: - [`SHOW VIRTUAL CLUSTER ... WITH REPLICATION STATUS`](#sql-shell) in the SQL shell. -- The [Physical Replication dashboard](#db-console) on the DB Console. +- The [**Physical Cluster Replication** dashboard]({% link {{ page.version.version }}/ui-physical-cluster-replication-dashboard.md %}) on the [DB Console](#db-console). - [Prometheus and Alertmanager](#prometheus) to track and alert on replication metrics. - [`SHOW EXPERIMENTAL_FINGERPRINTS`](#data-verification) to verify data at a point in time is correct on the standby cluster. @@ -48,41 +48,7 @@ id | name | source_tenant_name | source_cluster_uri ## DB Console -You can access the [DB Console]({% link {{ page.version.version }}/ui-overview.md %}) for your standby cluster at `https://{your IP or hostname}:8080/`. Select the **Metrics** page from the left-hand navigation bar, and then select **Physical Cluster Replication** from the **Dashboard** dropdown. The user that accesses the DB Console must have `admin` privileges to view this dashboard. - -{% include {{ page.version.version }}/ui/ui-metrics-navigation.md %} - -{{site.data.alerts.callout_info}} -The **Physical Cluster Replication** dashboard tracks metrics related to physical cluster replication jobs. This is distinct from the [**Replication** dashboard]({% link {{ page.version.version }}/ui-replication-dashboard.md %}), which tracks metrics related to how data is replicated across the cluster, e.g., range status, replicas per store, and replica quiescence. -{{site.data.alerts.end}} - -The **Physical Cluster Replication** dashboard contains graphs for monitoring: - -### Logical bytes - -DB Console Logical Bytes graph showing results over the past hour - -The **Logical Bytes** graph shows you the throughput of the replicated bytes. - -Hovering over the graph displays: - -- The date and time. -- The number of logical bytes replicated in MiB. - -{{site.data.alerts.callout_info}} -When you [start a replication stream]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}#step-4-start-replication), the **Logical Bytes** graph will record a spike of throughput as the initial scan completes. {% comment %}link to technical details here{% endcomment %} -{{site.data.alerts.end}} - -### SST bytes - -DB Console SST bytes graph showing results over the past hour - -The **SST Bytes** graph shows you the rate at which all [SST]({% link {{ page.version.version }}/architecture/storage-layer.md %}#ssts) bytes are sent to the [KV layer]({% link {{ page.version.version }}/architecture/storage-layer.md %}) by physical cluster replication jobs. - -Hovering over the graph displays: - -- The date and time. -- The number of SST bytes replicated in MiB. +You can use the [**Physical Cluster Replication** dashboard]({% link {{ page.version.version }}/ui-physical-cluster-replication-dashboard.md %}) of the [DB Console]({% link {{ page.version.version }}/ui-overview.md %}) to monitor [logical bytes]({% link {{ page.version.version }}/ui-physical-cluster-replication-dashboard.md %}#logical-bytes) and [SST bytes]({% link {{ page.version.version }}/ui-physical-cluster-replication-dashboard.md %}#sst-bytes) on the standby cluster. ## Prometheus diff --git a/src/current/v24.1/ui-overview.md b/src/current/v24.1/ui-overview.md index 1d1f144d077..5d83e9a805c 100644 --- a/src/current/v24.1/ui-overview.md +++ b/src/current/v24.1/ui-overview.md @@ -51,6 +51,7 @@ The Metrics page provides dashboards for all types of CockroachDB metrics. - [Changefeeds dashboard]({% link {{ page.version.version }}/ui-cdc-dashboard.md %}) has metrics about the [changefeeds]({% link {{ page.version.version }}/change-data-capture-overview.md %}) created across your cluster. - [Overload dashboard]({% link {{ page.version.version }}/ui-overload-dashboard.md %}) has metrics about the performance of the parts of your cluster relevant to the cluster's [admission control system]({% link {{ page.version.version }}/admission-control.md %}). - [TTL dashboard]({% link {{ page.version.version }}/ui-ttl-dashboard.md %}) has metrics about the progress and performance of [batch deleting expired data using Row-Level TTL]({% link {{ page.version.version }}/row-level-ttl.md %}) from your cluster. +- [Physical Cluster Replication dashboard]({% link {{ page.version.version }}/ui-physical-cluster-replication-dashboard.md %}) has metrics about the [physical cluster replication]({% link {{ page.version.version }}/physical-cluster-replication-overview.md %}) streams between a primary and standby cluster. ### Databases diff --git a/src/current/v24.1/ui-physical-cluster-replication-dashboard.md b/src/current/v24.1/ui-physical-cluster-replication-dashboard.md new file mode 100644 index 00000000000..936a499e1eb --- /dev/null +++ b/src/current/v24.1/ui-physical-cluster-replication-dashboard.md @@ -0,0 +1,59 @@ +--- +title: Physical Cluster Replication Dashboard +summary: The Physical Cluster Replication Dashboard lets you monitor and observe replication streams between a primary and standby cluster. +toc: true +docs_area: reference.db_console +--- + +{{site.data.alerts.callout_info}} +{% include feature-phases/preview.md %} +{{site.data.alerts.end}} + +The **Physical Cluster Replication** dashboard in the DB Console lets you monitor the [physical cluster replication]({% link {{ page.version.version }}/physical-cluster-replication-overview.md %}) streams between a primary and standby cluster. + +To view this dashboard, [access the DB Console]({% link {{ page.version.version }}/ui-overview.md %}#db-console-access) for your standby cluster, click **Metrics** on the left-hand navigation bar, and select **Physical Cluster Replication** from the **Dashboard** dropdown. + +{{site.data.alerts.callout_info}} +The **Physical Cluster Replication** dashboard is distinct from the [**Replication** dashboard]({% link {{ page.version.version }}/ui-replication-dashboard.md %}), which tracks metrics related to how data is replicated across the cluster, e.g., range status, replicas per store, and replica quiescence. +{{site.data.alerts.end}} + +## Dashboard navigation + +{% include {{ page.version.version }}/ui/ui-metrics-navigation.md %} + +The **Physical Cluster Replication** dashboard displays the following time-series graphs: + +## Logical bytes + +DB Console Logical Bytes graph showing results over the past hour + +The **Logical Bytes** graph displays the throughput of the replicated bytes. The graph displays the rate at which the logical bytes (sum of keys + values) are ingested by all replication jobs. + +Hovering over the graph displays: + +- The date and time. +- The number of logical bytes replicated. + +{{site.data.alerts.callout_info}} +When you [start a replication stream]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}#step-4-start-replication), the **Logical Bytes** graph will record a spike of throughput as the initial scan completes. {% comment %}link to technical details here{% endcomment %} +{{site.data.alerts.end}} + +## SST bytes + +DB Console SST bytes graph showing results over the past hour + +The **SST Bytes** graph displays the rate at which all [SST]({% link {{ page.version.version }}/architecture/storage-layer.md %}#ssts) bytes are sent to the [KV layer]({% link {{ page.version.version }}/architecture/storage-layer.md %}) by physical cluster replication jobs. + +Hovering over the graph displays: + +- The date and time. +- The number of SST bytes replicated. + +{% include {{ page.version.version }}/ui/ui-summary-events.md %} + +## See also + +- [Physical Cluster Replication Overview]({% link {{ page.version.version }}/physical-cluster-replication-overview.md %}) +- [Physical Cluster Replication Monitoring]({% link {{ page.version.version }}/physical-cluster-replication-monitoring.md %}) +- [Troubleshooting Overview]({% link {{ page.version.version }}/troubleshooting-overview.md %}) +- [Support Resources]({% link {{ page.version.version }}/support-resources.md %}) diff --git a/src/current/v24.1/ui-replication-dashboard.md b/src/current/v24.1/ui-replication-dashboard.md index 1f1c1006af2..a7682c2b769 100644 --- a/src/current/v24.1/ui-replication-dashboard.md +++ b/src/current/v24.1/ui-replication-dashboard.md @@ -5,10 +5,14 @@ toc: true docs_area: reference.db_console --- -The **Replication** dashboard in the DB Console lets you monitor the replication metrics for your cluster. +The **Replication** dashboard in the DB Console lets you monitor the replication metrics for your cluster, such as range status, replicas per store, and replica quiescence. To view this dashboard, [access the DB Console]({% link {{ page.version.version }}/ui-overview.md %}#db-console-access), click **Metrics** in the left-hand navigation, and select **Dashboard** > **Replication**. +{{site.data.alerts.callout_info}} +The **Replication** dashboard is distinct from the [**Physical Cluster Replication** dashboard]({% link {{ page.version.version }}/ui-physical-cluster-replication-dashboard.md %}), which tracks metrics related to physical cluster replication jobs. +{{site.data.alerts.end}} + ## Review of CockroachDB terminology - **Range**: CockroachDB stores all user data and almost all system data in a giant sorted map of key-value pairs. This keyspace is divided into "ranges", contiguous chunks of the keyspace, so that every key can always be found in a single range. From 0fef87eb57a8d4150db815cfee435425356f769f Mon Sep 17 00:00:00 2001 From: Kathryn Hancox <44557882+kathancox@users.noreply.github.com> Date: Tue, 30 Apr 2024 12:22:55 -0400 Subject: [PATCH 04/25] v24.1.0-beta.3 release notes (#18504) --- src/current/_data/releases.yml | 27 +++++++++ .../releases/v24.1/v24.1.0-beta.3.md | 60 +++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 src/current/_includes/releases/v24.1/v24.1.0-beta.3.md diff --git a/src/current/_data/releases.yml b/src/current/_data/releases.yml index eb92170f17f..216aeb7598a 100644 --- a/src/current/_data/releases.yml +++ b/src/current/_data/releases.yml @@ -5897,3 +5897,30 @@ docker_arm_limited_access: false source: true previous_release: v24.1.0-beta.1 + +- release_name: v24.1.0-beta.3 + major_version: v24.1 + release_date: '2024-04-30' + release_type: Testing + go_version: go1.22.0 + sha: aea98c134a954d4dbba4916bb22aa6ad23f81004 + has_sql_only: true + has_sha256sum: true + mac: + mac_arm: true + mac_arm_experimental: true + mac_arm_limited_access: true + windows: true + linux: + linux_arm: true + linux_arm_experimental: false + linux_arm_limited_access: false + linux_intel_fips: true + linux_arm_fips: false + docker: + docker_image: cockroachdb/cockroach-unstable + docker_arm: true + docker_arm_experimental: false + docker_arm_limited_access: false + source: true + previous_release: v24.1.0-beta.2 diff --git a/src/current/_includes/releases/v24.1/v24.1.0-beta.3.md b/src/current/_includes/releases/v24.1/v24.1.0-beta.3.md new file mode 100644 index 00000000000..0852831e401 --- /dev/null +++ b/src/current/_includes/releases/v24.1/v24.1.0-beta.3.md @@ -0,0 +1,60 @@ +## v24.1.0-beta.3 + +Release Date: April 30, 2024 + +{% include releases/release-downloads-docker-image.md release=include.release %} + +

SQL language changes

+ +- Updated the [`SHOW GRANTS`]({% link v24.1/show-grants.md %}) responses to display the `object_type` and `object_name`, which has replaced the `relation_name` column. [#122823][#122823] +- Added [external connection]({% link v24.1/create-external-connection.md %}) granted privileges to the [`SHOW GRANTS`]({% link v24.1/show-grants.md %}) command. [#122823][#122823] +- Introduced three new [cluster settings]({% link v24.1/cluster-settings.md %}) for controlling table statistics forecasting: + - [`sql.stats.forecasts.min_observations`]({% link v24.1/cluster-settings.md %}#setting-sql-stats-forecasts-min-observations) is the minimum number of observed statistics required to produce a forecast. + - [`sql.stats.forecasts.min_goodness_of_fit`]({% link v24.1/cluster-settings.md %}#setting-sql-stats-forecasts-min-goodness-of-fit) is the minimum R² (goodness of fit) measurement required from all predictive models to use a forecast. + - [`sql.stats.forecasts.max_decrease`]({% link v24.1/cluster-settings.md %}#setting-sql-stats-forecasts-max-decrease) is the most a prediction can decrease, expressed as the minimum ratio of the prediction to the lowest prior observation. [#122459][#122459] + +

Bug fixes

+ +- Fixed a bug that could lead to descriptors having privileges to roles that no longer exist. Added an automated clean up for [dropped roles]({% link v24.1/drop-role.md %}) inside descriptors. [#122701][#122701] +- Fixed a bug where [client certificate authentication]({% link v24.1/authentication.md %}#client-authentication) combined with [identity maps]({% link v24.1/sso-sql.md %}#identity-map-configuration) (`server.identity_map.configuration`) did not work since v23.1. For the feature to work correctly, the client must specify a valid db user in the [connection string]({% link v24.1/connection-parameters.md %}). [#122738][#122738] +- Fixed a bug where the [row-based execution engine]({% link v24.1/architecture/sql-layer.md %}#query-execution) could drop a [`LIMIT`]({% link v24.1/limit-offset.md %}) clause when there was an [`ORDER BY`]({% link v24.1/order-by.md %}) clause, and the ordering was partially provided by an input operator. For example, this bug could occur with an ordering such as `ORDER BY a, b` when the scanned index was only ordered on column `a`. The impact of this bug was that more rows may have been returned than specified by the `LIMIT` clause. This bug is only present when not using the [vectorized execution engine]({% link v24.1/architecture/sql-layer.md %}#vectorized-query-execution). That is, when running with `SET vectorize = off;`. This bug has existed since CockroachDB v22.1. [#122837][#122837] +- Previously, CockroachDB could run into an internal error when evaluating [PL/pgSQL]({% link v24.1/plpgsql.md %}) routines with nested blocks. The bug is only present in 24.1.0-beta versions. This bug is now fixed. [#122939][#122939] +- Fixed a bug where [`UPDATE`]({% link v24.1/update.md %}) and [`UPSERT`]({% link v24.1/upsert.md %}) queries with a subquery were sometimes inappropriately using implicit [`FOR UPDATE`]({% link v24.1/select-for-update.md %}) locking within the subquery. This bug has existed since implicit `FOR UPDATE` locking was introduced in v20.1. [#121391][#121391] +- [Dropping]({% link v24.1/alter-table.md %}#drop-column) and [adding]({% link v24.1/alter-table.md %}#add-column) a column with the same name no longer results in a `"column already exists error"`. [#122631][#122631] +- Fixed a bug that could cause an internal error of the form `invalid datum type given: ..., expected ...` when a `RECORD`-returning [user-defined function]({% link v24.1/user-defined-functions.md %}), used as a data source, was supplied a column definition list with mismatched types. This bug has existed since v23.1. [#122305][#122305] +- Fixed a bug that could result in an internal error when attempting to create a [PL/pgSQL]({% link v24.1/plpgsql.md %}) routine using the (unsupported) `%ROWTYPE` syntax for a variable declaration. Now, an expected syntax error is returned instead. [#122966][#122966] +- Fixed a bug that could result in an assertion error during evaluation of [PL/pgSQL]({% link v24.1/plpgsql.md %}) routines that invoke procedures while using `DEFAULT` arguments. The bug was present in v24.1.0-beta releases and is now fixed. [#122943][#122943] +- Previously, privileges granted for [external connections]({% link v24.1/create-external-connection.md %}) were displaying in `SHOW SYSTEM GRANTS` with no associated object name. Now these privileges are no longer displayed. Instead, the statement `SHOW GRANTS ON EXTERNAL CONNECTION` should be used to view external connection privileges with their associated object name. [#122857][#122857] +- Statistics forecasts of zero rows can cause suboptimal [query plans]({% link v24.1/cost-based-optimizer.md %}). Forecasting will now avoid predicting zero rows for most downward-trending statistics. [#122459][#122459] +- Fixed a bug introduced in v23.2 that could cause a [PL/pgSQL]({% link v24.1/plpgsql.md %}) variable assignment to not be executed if the variable was never referenced after the assignment. [#123045][#123045] + +

Performance improvements

+ +- More efficient [query plans]({% link v24.1/cost-based-optimizer.md %}) are now generated for queries with text similarity filters, for example, `text_col % 'foobar'`. These plans are generated if the `optimizer_use_trigram_similarity_optimization` [session setting]({% link v24.1/set-vars.md %}) is enabled. It is disabled by default. [#122838][#122838] +- The [optimizer]({% link v24.1/cost-based-optimizer.md %}) now costs `distinct-on` operators more accurately. It may produce more efficient query plans in some cases. [#122850][#122850] +- Improved the speed for optimization of some statements using `GROUP BY` or `DISTINCT` or `ON CONFLICT` by skipping the [optimizer]({% link v24.1/cost-based-optimizer.md %}) rule `SplitGroupByScanIntoUnionScans` when it is not needed. [#123034][#123034] + +
+ +

Contributors

+ +This release includes 56 merged PRs by 25 authors. + +
+ +[#121391]: https://github.com/cockroachdb/cockroach/pull/121391 +[#122305]: https://github.com/cockroachdb/cockroach/pull/122305 +[#122459]: https://github.com/cockroachdb/cockroach/pull/122459 +[#122631]: https://github.com/cockroachdb/cockroach/pull/122631 +[#122701]: https://github.com/cockroachdb/cockroach/pull/122701 +[#122738]: https://github.com/cockroachdb/cockroach/pull/122738 +[#122823]: https://github.com/cockroachdb/cockroach/pull/122823 +[#122837]: https://github.com/cockroachdb/cockroach/pull/122837 +[#122838]: https://github.com/cockroachdb/cockroach/pull/122838 +[#122850]: https://github.com/cockroachdb/cockroach/pull/122850 +[#122857]: https://github.com/cockroachdb/cockroach/pull/122857 +[#122939]: https://github.com/cockroachdb/cockroach/pull/122939 +[#122943]: https://github.com/cockroachdb/cockroach/pull/122943 +[#122966]: https://github.com/cockroachdb/cockroach/pull/122966 +[#123034]: https://github.com/cockroachdb/cockroach/pull/123034 +[#123045]: https://github.com/cockroachdb/cockroach/pull/123045 From a550b11937c1173c5978121430019266ada821ef Mon Sep 17 00:00:00 2001 From: Florence Morris Date: Tue, 30 Apr 2024 13:10:59 -0400 Subject: [PATCH 05/25] DOC-9399 PR #116411 - ui: update label "CPU" to "SQL CPU" (#18505) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * In ui-statements-page.md, replaced CPU Time with SQL CPU Time in text and images. * Incorporated Ryan’s feedback. --- .../_includes/v24.1/ui/statement-details.md | 4 ++-- .../_includes/v24.1/ui/statements-filter.md | 2 +- .../_includes/v24.1/ui/statements-table.md | 2 +- .../v24.1/ui_statement_fingerprint_charts.png | Bin 153982 -> 288755 bytes .../ui_statement_fingerprint_overview.png | Bin 255261 -> 423110 bytes 5 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/current/_includes/v24.1/ui/statement-details.md b/src/current/_includes/v24.1/ui/statement-details.md index 690cc701eaa..2155d1c685b 100644 --- a/src/current/_includes/v24.1/ui/statement-details.md +++ b/src/current/_includes/v24.1/ui/statement-details.md @@ -30,7 +30,7 @@ The **Overview** section also displays the SQL statement fingerprint statistics |**Execution Retries** | The number of [retries]({{ link_prefix }}transactions.html#transaction-retries). | |**Execution Count** | The total number of executions. It is calculated as the sum of first attempts and retries. | |**Contention Time** | The amount of time spent waiting for resources. For more information about contention, see [Understanding and avoiding transaction contention]({{ link_prefix }}performance-best-practices-overview.html#understanding-and-avoiding-transaction-contention). | -|**CPU Time** | The amount of CPU time spent executing the statement. The CPU time represents the time spent and work done within SQL execution operators. | +|**SQL CPU Time** | The amount of SQL CPU time spent executing the statement. The SQL CPU time represents the time spent and work done within SQL execution operators. It does not include SQL planning time or KV execution time. | |**Client Wait Time** | The time spent waiting for the client to send the statement while holding the transaction open. A high wait time indicates that you should revisit the entire transaction and [batch your statements]({{ link_prefix }}transactions.html#batched-statements). | The following screenshot shows the statement fingerprint of the query described in [Use the right index]({{ link_prefix }}apply-statement-performance-rules.html#rule-2-use-the-right-index): @@ -60,7 +60,7 @@ Charts following the execution attributes display statement fingerprint statisti |**Execution Retries** | The number of [retries]({{ link_prefix }}transactions.html#transaction-retries). | |**Execution Count** | The total number of executions. It is calculated as the sum of first attempts and retries. | |**Contention Time** | The amount of time spent waiting for resources. For more information about contention, see [Understanding and avoiding transaction contention]({{ link_prefix }}performance-best-practices-overview.html#understanding-and-avoiding-transaction-contention). | -|**CPU Time** | The amount of CPU time spent executing the statement. The CPU time represents the time spent and work done within SQL execution operators. | +|**SQL CPU Time** | The amount of SQL CPU time spent executing the statement. The SQL CPU time represents the time spent and work done within SQL execution operators. It does not include SQL planning time or KV execution time. | |**Client Wait Time** | The time spent waiting for the client to send the statement while holding the transaction open. A high wait time indicates that you should revisit the entire transaction and [batch your statements]({{ link_prefix }}transactions.html#batched-statements). | The following charts summarize the executions of the statement fingerprint illustrated in [Overview](#overview): diff --git a/src/current/_includes/v24.1/ui/statements-filter.md b/src/current/_includes/v24.1/ui/statements-filter.md index d5a34084385..c750a860614 100644 --- a/src/current/_includes/v24.1/ui/statements-filter.md +++ b/src/current/_includes/v24.1/ui/statements-filter.md @@ -7,7 +7,7 @@ The statement fingerprints returned are determined by the selected **Search Crit By default, the **Top** `100` statement fingerprints **By** [`% of All Runtime`](#percent-of-all-runtime) for the `Past Hour` are returned. 1. To change the number of results returned, select `25`, `50`, `100`, or `500` from the **Top** dropdown. To return a larger number, select `More` and choose an option: `1000`, `5000`, `10000`. -1. To change the sort column, from the **By** dropdown, select a commonly sorted column: `% of All Runtime`, `CPU Time`, `Contention Time`, `Execution Count`, `P99 Latency`, `Statement Time`. To sort by other columns, select `More` from the dropdown and choose an option: `Last Execution Time`, `Max Latency`,`Max Memory`, `Min Latency`, `Network`, `P50 Latency`, `P90 Latency`, `Retries`, `Rows Processed`. +1. To change the sort column, from the **By** dropdown, select a commonly sorted column: `% of All Runtime`, `SQL CPU Time`, `Contention Time`, `Execution Count`, `P99 Latency`, `Statement Time`. To sort by other columns, select `More` from the dropdown and choose an option: `Last Execution Time`, `Max Latency`,`Max Memory`, `Min Latency`, `Network`, `P50 Latency`, `P90 Latency`, `Retries`, `Rows Processed`. {{site.data.alerts.callout_info}} The `More` options may increase the page loading time and are not generally recommended. {{site.data.alerts.end}} diff --git a/src/current/_includes/v24.1/ui/statements-table.md b/src/current/_includes/v24.1/ui/statements-table.md index ea89ec91e6d..321d3f06f80 100644 --- a/src/current/_includes/v24.1/ui/statements-table.md +++ b/src/current/_includes/v24.1/ui/statements-table.md @@ -13,7 +13,7 @@ Application Name | The name specified by the [`application_name`]({{ link_prefix Statement Time | Average [planning and execution time]({{ link_prefix }}architecture/sql-layer.html#sql-parser-planner-executor) of statements with this statement fingerprint within the time interval.

The gray bar indicates the mean latency. The blue bar indicates one standard deviation from the mean. Hover over the bar to display exact values. % of All Runtime | The percentage of execution time taken by this statement fingerprint compared to all other statements executed within the time period, including those not displayed. Runtime is calculated as the mean execution latency multiplied by the execution count.

Note: The sum of the values in this column may not equal 100%. Each fingerprint's percentage is calculated by dividing the fingerprint's runtime by the sum of the runtimes for all statement fingerprints in the time interval. "All statement fingerprints" means all user statement fingerprints (not only those displayed by the [search criteria](#search-criteria)), as well as internal statement fingerprints that are never included in the displayed result set. The search criteria are applied after the `% of All Runtime` calculation. Contention Time | Average time statements with this fingerprint were [in contention]({{ link_prefix }}performance-best-practices-overview.html#understanding-and-avoiding-transaction-contention) with other transactions within the time interval.

The gray bar indicates mean contention time. The blue bar indicates one standard deviation from the mean. Hover over the bar to display exact values. -CPU Time | Average CPU time spent executing within the specified time interval. The gray bar indicates mean CPU time. The blue bar indicates one standard deviation from the mean.

The CPU time includes time spent in the [SQL layer]({{ link_prefix }}architecture/sql-layer.html). It does not include time spent in the [storage layer]({{ link_prefix }}architecture/storage-layer.html). +SQL CPU Time | Average SQL CPU time spent executing within the specified time interval. It does not include SQL planning time or KV execution time. The gray bar indicates mean SQL CPU time. The blue bar indicates one standard deviation from the mean.

The SQL CPU time includes time spent in the [SQL layer]({{ link_prefix }}architecture/sql-layer.html). It does not include time spent in the [storage layer]({{ link_prefix }}architecture/storage-layer.html). P50 Latency | The 50th latency percentile for sampled statement executions with this fingerprint. P90 Latency | The 90th latency percentile for sampled statement executions with this fingerprint. P99 Latency | The 99th latency percentile for sampled statement executions with this fingerprint. diff --git a/src/current/images/v24.1/ui_statement_fingerprint_charts.png b/src/current/images/v24.1/ui_statement_fingerprint_charts.png index fd65961ceb81fe0a5f33451dc2b96b49178c762f..5ab63bfe0fb3fb14ef7b04a13b8cd9f706bfe9cf 100644 GIT binary patch literal 288755 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 sj-5~XDZ$XUXu+4R>_?RcxoBIgFg3Tb#@2tS# z)jvez!F+!>Fkyj-IGQ;&~Lya!|*{nfE0 zprEM#r5+ZgHhTw@^-_T(LX#mZ*eJD9N2c=(=_~p9V~y;mt1JYJ7}w@UVyiaBrm$>I zAfo_M7_>&gU;2iB1l^VR1J}HDq@j@wkZ>X_djn_*Lnjc;2k5knL zgpt3Zz(51jNTiYr{3D$FZ}ndD$fMucJQ^Z$Np$f@hIb>3djmQ_T_{4hC@QjbjTl5| zaN1yT>ET5hX&BlNXd3a5bYAPW!PfiNX^*^P`03*?t?*<0xpR-GskH~}rwa@l5g`@| zOo7UfBlpPHjAuUItgu;mJT?)XV{NCvex5zR{7+UEO_AW)It&CktN=S6P3}jM5TjWs z;D>>Qq_plS8VPXDdrnmu&3Rs0)yqirzj@nom$Y{3oJ$c<8gM$8iI~L`0Cg!J=DMjQ z(1`t#Wz77BuQ%9;{SSPTANk4?@JWCs)A3q|*Fl)cFBbQ5cARX9{SSbKlP1 zssMbi_)Nm_G`W7JnRAjMn03)xVQmbFc5b8V@gc4$L!OK0+Fx1!@5o+N*?*G*g6kiX zW(GKKalF>0`IdRr2K-9tu-OgYUt+XZCiZ`+B7T5wuQppl-`xPIwRGwJ)k>I)@R7FV zfdoA9yTF($Y|Eaq(R20JI5`sI>lx#Xy^?_ZqQQmlUiNp~>)$v}0JY)zmIsR#fX$_Y zBCYqEtSq0k$f-gIsC1`_LRzKXTs4k=mTVu_e6?#MtvxX2MHbAqY1=mh!(RSZ$N{}+ zIIPMohhd=a2v(9$1oM50K~5|S=CFu~4s{k9mCM~b-zXP;mu4TdcR*rCh_#G=w)v19 z3CA|4S#+wstJY6A_lK05D(LBV-CQkLe9VHU z^+O?aS63oX+`3fX1;;1!We{&qW?DL^Kiiyi znc&%{X{VE&{@zkkm65v!@6hQ$1ycAD&A+m_ANJJ`Y{iVp*F^OrZ8wl*W zF2<8hru*70H?&$M0FfHB$NU3E*5yrTA#(hCQvKBFPswqB2Z+#5X6RiKLnXPRR>7no zc1SQGs(f(5&pPttqMBvAgoETx?+VqsYe;Bc6fxWq zNi(om&w=*6KLpwc0-#jDb8^^Un+E0vMF8sUMMbpB$&$uG`BY$Xdc1=#5D94_2w3ZC z4nRD^wNzaK2C-Qk*{fbGVIfX+3{gSilvqPjBD*m4y4)NgEvYqa25Um-5c-upklfEgrR#P@jba~ zNH_ic(^Tm}P2f*W#xn`%Ct?HdO(L*^SuFD|r*ke)Ig#1v&TTQMCXIv?b6OnldD1dCVN z^Ey)q6ia*p)v&RKEJQY8>q*#c^fV2dD4P+HLgxowxh3MIlh8AWCCPH@Z63u#po}Z` zy`Q=N5v16FN@QT{>n9MQ+K#--Rn3oer2$=>Y1EU(j>CeG0w{(@R7sC6Gl&Ugby(qu}ObqwD~qcEMo<3`9$iv;DbAA*E-0l4b) zJDr@N9o$FD+rH};-25S2gQDoqfz^1wIr5Shwi~7GTXj%^p!gHh7x9k0A5!ftpgOaZ zSDOZu$)CJ%%!I)#8bZ1$j=6mTmKz^=!P8VS{BY#1#Th~KRx|Rsd=))bqh)glqSwzK zJ3D=)nWP*4pE0cfw+*?X$MeU-GNZZUtXDidA| zH@r1?`v&mCnK!Pd!(p*&Au&>p)PV-ey3gS9i!Y?$5OXezpgQ1Bdw& zK^gHDYgcOWb0HMqZg0X^00HjB;v_0fMK}^ZnOsbeohtuHb}GVe1}K?Fa&iJdG=^Cq z43$;@(Hf_uoy&hSn$w_<_tCKPNc-id+__gOx?vd7gx}uVSiskj2w_&Ed zUlXVWEe!Qd{w|Qwh=Q_*_oL}_Z}~iRaqydWSO-iCo5>WTIe4#NKZLC3M{FH8&2(-( z5`SVnR48mP4NFfz{jlB&a0Ec_4Tga|jwd<B1_S4L87@6R5%q0db^IANKp;n1y#3!(oln3hnO3mO)y3$bOWW4 zpQX4j2N{42`|tG0q4uA$zD)dqmj!{MDh(w7s6mt!wzBeSl0dhB8<4E?sa04tGYe-L zH*~+OGukWXRJ-nYLI$;{?4MUee<>Wi<6>|dJ+(>I?qrVVj8W7y!EyC1L@7mDNUEBu zt7!ps+ifm=->s}5PHvVl6aED4@kuKuT;!p3Vvr!5%Sxf*F_6Dh|3+=X>w@)j2^vIM zPFGbxqJT2L)45g_xCTCudva~a3gDRJ!;HF|oj?>m6n-Fv(pa1#FG*`bW5?shdsW?hBV;ZYBWP92U)p7EfXQQR<%@;o6(3b>fz{1? zQ${)>b|(Nv{8t6jzfpBzH`uW4sz4&yTWM=P1R59&0nq3z)DwN&o#KNXw*DnVAm$ad zLN|DnBA{Z{q>SQAq6t(-sgM@}eGP1B9%~>^p`8-H-5_3w2e8E($r-z_6YS@UX z%CTyMkMg8j#dhl@7M)6ITNUyG@UE|+ZU}(QBR*mYJ+r5|3rc*q7_~hQr0_*IuDKXH z$|021<};o19;@GBS{bcHoF?Ogi(SDrN-7Np*pwQWvmawj7_*Y@D!k1LAn~W zNYLPa#JBqNK>wf;=)(t*TmiBfVZ*P1S?!gTOa+$Pj|)nhRlH!o7zk6Kj)UOe z1Hk%&ai=}JlLbi^rm5GE{&D02m;_1R4OY;*peyL6)Xv+;mof~v;tW=B>2KT;-GjTr zxG{NyUH$%`cqz?04J$kzneKJETUHyzF^BIkPdMbTl+zw!rW*Gl8T5eQpa?FKFvq+V z9(s0qFt<>55t#%d*Lk-nA$I}eU}dx$@^g*~>+$t76v;~m5-pzSh_--xzc0qr0QXl}SNG$&GFHtg{hKm&fM}>t;V!L4 zDvl-)A;Ujcn|DFs*6n<*v?ApZf8}Jb8+~qrtchSwcAerlL0-M3>=73bX!3HnNfi@V zk7Vnu;A#=#AIeg_gCwLakc3o{Rv0RKdJidRIO)No@EkNtw)JpSh2bDFA%%`#Y>-6T z2(j9!ewc3;5eZaSYGjh`3(ENPApR2yyEP2bLhgNoOaJFb%t zP>@sDZCAyhs%FsY;q@>bM;g=(9&X!x-1p&e7qIjVa4eb6_3bY2!oO#KGqc7AVFFzc7{V1IdZ+ zWW0P6V^Zj2Pq+x0vwR|~&@?FbMnxR~HOAaJ#s#*gAVtVAs9wo}`JPLCL*Z^HwJFv> zD40fHv;Q6!cAS*eao1#0Z{F<#)k;Q zSGmkgjePf@L>;^2-6x*EHynQJ%^9{b9l1}MFi|(O7rd0eT2DbnCekxBHs;PdPc07W> zF+WNZ>hek_{J(_bt#i)B52vUqrWcK@z=_eBDnWw9NrL@)z%u9C;otS}DPL%QjH#TL zaJFM0>h}SdC2>uaBsKkv${R?}oEVq(nZL*&Ck;9M*uQjs#9cmDS+>B5qNeq5aba50A2YP_W{0%&MyS> z$K1qY`&;%?rS_pyj8|IEOqRS8mQxQVi>J5LBW?~)k~gU@)6ZBqn)$KjQkU*Oj5kwg z*;Zfl;fXL(@g%~}Xh9RG2s9I2PI*d4&7D@xIU2ri%wy_DzXlYGC6bgpE1fLn?|B0s zEG{yY?vPoNwbu2eKZtaQ6Ymvuw$sqNa3^+^lG$Yp0lJxbP-HMA(83x<+-7aUMEf zCb{Wig$$WvOeZEmX1$}4%I3C#x68&jRZU^P^}W3E_}++4RF@UzgHVTYmwi?JgW;w@F;!lSWNuQs+4Pf>v zO-LRND6;0Tm|+ic(hJq;l+jpRWFHFOEU(T<=+$#k@T$00I&~@^GetQ=d{8AhBoasd zVdq0$Z$bE>|D=t`=ehBuW0L!T3gVly&9rgxe|Dg98-1_~Q+@o|*0l|BW6pt@drJYA zYe63rzi5-n1hNn|IqM0+3sPhsY zB;%`sCNB906uvhZ<{y?t zXCfYR&}x)LJWnjn!WNESP8D2&mYV8Iq~)BN}- zlmO|ALVtE%%(|OwJ>?;m_;O^yqK$F=FOgcR9+%&%gIysSk(aD*5Nxzx3E<0fS!zOl(Be&ow*R{lt zfhpb;1kU?}JM&${1*kl!mY~HHEwAEsEE=^Py2z1+^Fb=M-%Uh;XCt@;Tu_o;afKrPyerOzZpx7R!MZV z-J=DoIVZnN6s2=hduy_$0;UK^dg`d$6d&a z=m`(jTaOVz*uK+h z<%hhxbQz|`GAiQ1+?AVE$scLS{`EU7YZMikyLbYXlXwD4G89Z}6w%*%sLK3r-`trehuaTLc$_9PN(lOHE9+x-Ii+PuW+1{J1w& z6mzTi`Z!z(OOVP?cSX&k@jBy14SxkqrKkMXNyhI#)!83`UQ~tT8;d9C^FkE~?@uqv?%`|>; z2C)VmIRr2HNYuDG1{BFb^p()CIgNWBWG7^z^YG&$W8M!!Tjr%!TK z%nnpMVBNLgMpWj+XJ5=n_HMEOMYlx2dqmFyr=W2N_D#TrJc`X9*^MSwhHOulfw;t2?O7C1GggD~2Ku*w-Bm_mHnuQUfrNIpnjf^9WU2_o^rOy^ z``9&C0H-*1Jca4e^6<8G!I=fr6qLa6Tanx4^JxwzA7agurecQ3Ku_^8bEl-sVNVJB z?8|$(iUsd!Nc*cDZHN9J_Wm*~%d~3)hD}5TK|wkc6;Qwn=|)9Bq(lWN32Et+Mx{|e zL_kR?kuK?y?#_!GK)R$G-gPqi+!Ojd%>8ZOyS+c=$ILdsz;(uP9BZw8?fbp}?VjTE z4Ko^wxwpo9Ypd-vB_2O-nPfs0-mQEdc7Efsc;?$S%fd$(G=KpUn@|?9qeAo@5QN+;%}b%^fd`n;*aC`*{@0lr0WmgS3EYcK?5j`!^a;Ldm;WlD|V{ds^g3nV>GUo zmyZ&-d+}{(57F43;@>hdeHgfsuE&*5%0F19tFu@UM)S1PIIz|d>_RfitWe9I%sZP> z$AKh3$^XljmA?0~tm~Wu@|jr^F;D?^fYvA9pBJpSZ5sn-#b82_#%j&l1ydB>X za)%nVi}r+93`@ES%`IQRADJB9V{Qu~I?Z3w7?Um|0;MI_|MB}E@WBgr3%L7RKzajE ziV@dyE;upk^W4`i#cs}IQSNcDtqyfY=wv@TpbGSsi@&6|%$e^AQz#ba3O5^Gxxx?* zfxPLolL-4De3jt%z%)aoP&7im-6j4Z8Q3F-?n@t-=0=9%tVF@I*-)Et_M&xcJ77dD z0U^HyMiEHz+}`8FIpIm1BX|X9t7G2S?=2{ig8ehB(Sq{t=CMt==kiTIwZz7R-a&LN zFk0t?S~xE8#WbXgBlB3wf$LwaIrpPGCW!#6{_IHknVbNWvuLfbXvb4rZU{QY zjA;#UqIT1V8>75}h-U!NK zphmW`<={~S#@y5Tb?YWK10JX2Kg2iuikXq%PUUg$BM3#~nVQ@Y7yl1udcQCpl(^%w z*9rWzpXRZKTQ6AUPar&u=ZB98JwXz+jpZrAYGDk_zw@{M(AWM0mGl!&&F|E)w-omW zSsiw45&lz#POA$-4D1H+vAba?_r`dnd)O5cW=$;VhYx*wwFCN@c&?ulgT|36#nsD< zX5j=$hh0=D+!8) zhX~-gYaF~>eiZBe0Xclf@S{=qgp6Vb)upgp2wvY){K9zjwcs@(`Ri8>69Sz8(Lzw% z9bBG>3A+b_FLXdxjzHu0=K(Edn!Aj&V-bSsglF;LBWI8f<3TTt(?s$w?id{|J;HHW zaPQhb?C09wo;RV#0&5r3J$4i{{q8vXu%W4g{!`Bw zeGJQYz3c6Z@IN(}7v?T}Upkg2k`dXwW=>9!VIi95#$Kljl$xNGe z6uw@{S?5jex_<5?e1t~$*}0Q0^NML-U#Jqut19m`c&_fJ!IS3Jo2F6gcI*b^FqDsA zaEB26Bs!f20hNRpNqDVU9$Ag}foc|~8D`%c3;#!|gWq{G)=|!#2pDK$3X@Yh@3M>O*9218rsiGTF4A5pg6P?`JZYU&^ry|-S36dpi?!p9QE!y+$^eWLP7MV(~? ziB@0sbKKLOH%ZG}0aEb|L~rXw&P}4K4HJyQXDI4KC|50xboqQ>Ee4Z!gsq+BaqPoR zdxu3ONnhfS=7IO{2gV&AyalQ&`FP93(Hb$=$KH~^)LSLX7xn;Rt}f8=;?`mY5Ef# z{g2-+-2VLrz7o_DGi%}|Cp6`lYPBBV*Do7BXRk#E%0q-z{YR;h*Q7zP%m1eA{4OU` z*E5ykYL>>}#A?IhFy9no5@~gWDn`iM*CuAed4cv3D z4t|eWv4sCDX0hsa5S@1`Ki5xTzoyDH`cCZ?FHHL(fmvIrkVF^&kB+}W&;?_s_V0{= zu7^lx+(~plopIo8&Rwzo>LWafanrc{9Dcdf4J8uTJ<)$xIQ)&9RTHWBz5RXdtdg?r z{897iE*}szN%Ah^&j9%zil5#R;2Mup?yem}L=ZrxA{|OS-7odFfq+64qV0)ABa!Ff zCo_!58L<|t-t6&K!U^`rTbU0rm6n!9IEAKKy&rBkjsqc#*=m80YGtB3gAO^{A_TLa zUH@lP{5#&Czga`)dqRtU^Szv=S3uaXXRW2L@o9dMvf+=2z!`Dt;*nM#|BYV(ZXoTF zbT>w(Qv7>|J=^{c`(PfavZqz#R$qPga31L5Q~rT5d-KYlsImVSWA+YC z%C|T3O}jgDyMe2x=Q-SKEr&^`EV&o!m=W`^B_!X0l+eI`&Hzq<%cTzIUJF6SpyTw1 zMC8h&tDPsIqYq|FzmV_$IXjj`AS=dX;{Wb|&(K3Nam{8A*KN8ZjWopO&3wG6nB`kFO<0rPLnWPQ z=&pLt<}WrZxeOjWB#4B)BW350yPRtBhGc6J2y92(=|lurIB`D$kBE9G^~wt;^45mt zcTy$V`F_Q%t=VusyA9m*mpzs_IqrBg_bR=}uU+*x?38~C$&LSn*gOv3Q&N1~&(nt7 z7z`xb<|1@KY?xZF?4POMgY=fQTl5T5iZO`go#-%M6RR&?4{8j7=IufE!w~m4uhYdH zauK{v_C{s=K;owpLZAextmxd#^r zsbj^1*l^vaQ%mmugy~1KZ>FD+#Ir>C43ALz4V^$R)`Tv`OGI?n4em- zawf&RP8;XC7g2EkCZuc%Q>6e4%jqBT>}&#ljU_;Y?nz7gSvkaijVFL zq|xP@w|Ak&UfZuYOm}@@#H?NVVKWe#s4@%+*EMs$m7I(PamGKD``8bdBCTd`y2W9K zay3c}VLCWkvLv%f_bw5(%Rs%4L50OSQ;P3Txlx>@bHNE3R)}4%gebN$_u* z4L!xT15y)0dpMQt6%h4Kd&-JaX;Yq$Dnu z9Z?Npgmm{OMo1?HM)u4;YyVLEE2M+IQeqHshPyAx>!)P5EZq$jag$F#M_XW4L9EpT z(^#(~K!8&O7ZW2WNN(2r69q}TA&*t8L1A-}h%Ys+_avdd;Aa=$RWtq|SMA?x7tS)L z2*jiXy!&o?^Y3sVma^uot~iti{vkFaeh;-9c~_n8{#P~7hUXZf-vk~f5hSkf+0g2E zuRJFS4bfT1#p3=~7waEt1Buux+|Pi{2hzB8XBkSGj@F$g@UT>Xy$i?X!T(0YuuM8J zursNajFe(+B+tGqB_lelp)G1i`}O zA|>%pg6AKq_}>Mgzo$zJv;p5G3-6fnhQt@vcm)wjXrJ9`U$%P^(U}$*q^$lEHZDuE zN2cc4UjzvLa;6jhqCa9bfLNM=6R0N=dB8`NwYe{ON}lxO3lf?|W14q4=!AX39ViVtR>sB*(WQZY02aHR_6KyyrN zEjRXvqf+}xkIzuiyzX)i2qxt)ItTn#H)KZcliuuWyz^yvdje!+%k6<-27M&DMl|1G z3>sw5h^za_*N*$(-5##=j#1v8d{|)$aEuv{;!Y1RtOEbS7Zf!7z7EZT zgw0UiUI$eu5!NL}L8-U!>>|GFH~)a{32qlN)?Cy*MWlI&VEI@nt*=R)&-XhyO|Vx8 zV3TvT@kl+me_sIMMFJpQ#gg)*{mPKTbS-=P{MsiFXcCb|4?Da5U9GW~{TS_M?cZ@H z!`WlgS%ZLUPf`r1Vc@~j5BE;)d(Q=<5Y|1Q%*>00RL_H2SUhfgLDU4h?!T-e2d2K8 zm+|lo1r1vcYh(v7C}!GV#5DV9$|Y#-l0Yi^4$Ol_aR=0 zf~k^No343fUTH z;fMYoHb;XD#{sF0fI9RvO1Ltj39>|i0-M#30yw;H5l6P)U*3>7EM;$>WF5 zKX)uR3%f&3^^O@#eEwg%f+lkp_dqzRJfoU5w}b;$Dc|SYj5*6Wr4HxKNJ~fT$1=pcZh?tm!{^I;~9k8j; zB+h;GwD0UqDL33Rpj0~Vw?C!QdSc@q1bTmP8NgJ;{#yu-Mj{HydjS%afDI6hz#JOc z>z5$Dqd4gs4SWx~GC~{N+d#69Ww|*qqVn#4CoNmOtu=hQ*QR-QA{oHNCO|5M zXL_+qKul&qS&A+)n(Bz0E0pY>v{(e%V{rfmlZN5911!Bz> z2tl_XHnSuu=Cokmq{ku$b7`}x^R9Pc2*kNFXf@}UpX3D+pt9OmUQn}t3(je^tG!Ve zFK^}796~j2Ll064GTu*M^Y$^j>*1sd&Y_rU-_WbOERylX~gz`Kk8Sq;P0lsz-Z`1TARSFiXb(}e(nW6V+dr7 z7=kXvD{o(EtAg`VckAZ++s~dIMFRZwJH`h~@vjqKzuiQiwv6RUsET$vxH z{o9x4W&j_w?qyE1*%!7!Z8%CUG!b?P2N#@1?1B%2(QXW;%PiLKr`oTLL;vFw_fIT( zkxK*@%BF+I$gYDm;GSh2GL(jE$nAnQ*n+TtEhI9a2AhKC9a8rMa+$}S_5sz^qOs1k4`Y3=f87yMphq~n=;LvLo~iO{g54s@Mm=LW-=oo zkP(Fe*ye2e`oO`Tde9(g&%Qip{=tSojt~%+N9ZQyROCB;g2W#w@tTW|QHs$$Oo{?_ z+&yHUAciI4Z0IABc<6BFfS(++GXH-%Xe}E{?!xp91e?V`)R71W71_MtBzgY-%|jn? znGs1GVi~I(apzw-_xcu~BO+#hXx@rk_1%GvvC+OX$o*8S1H&T+7CN8>wL5xoE^UJ* z%cW)GBI1@F_z|_NuGt zT{P`e!oo#C*k#Rn{{Z8ZT*|c z+sMN|;Z zj}C9+x=b8tVQs>JFF%lwEG6iTVR=O?pcPm0M*I~@wD=a^ukD`4vAWFxJi$`H-YAQ% zym^%&VN5D&2P2kFDQ^uCs&$)&ZT5a^+}&zaooI>1e!tL6lt{vS-p@disDv@(x-oWc z{}An&QW-5T6L|sD)UZ-Z%%5!JM5cK!T~PZ?aHs^mCvR_0kw^2q9J4?Cx{{ zWR%@@&Su~wq(iFLS&pn|-9zP;Ip=40qG9Tq~udDBPYgbk*V+CQcn)iEc^{ zT~06phagvhQ=Cx~>~01?PXG4o7|*$_r5Ju}Z@X!=$gQ&v6;GeyU20Ov^#XP_?SMY{ z+?n4l>z~!=+=>cq5$#D4NywHhPT?>kBG8I?!-(%bbRO$v`h5{1k6ZJ&F6C&y)Tk_W zuLu*lyP4@IN2RqALKj4S+tqn1GsL)pcrek>PB$Cwvh-@+^ciw~YQy1>m#9JxGVrt; zjCgtV1kgzJ-tK}$7?}hZ!pe?*iu5Xx!jBcJr$n>zpO0ROjg`*vx+23!Z@|8H1wEN) z)~E88+X|@Tlsn%-1}RU45qId{OL89VP0^R<)!v}1biG+S&E6lyXk1CD5Jz9n)?O4M z_9$ZKY5tZ(T1d^h871hJW@)+Drc*a1(80=m6g#xiZl+gb6o_3Wuxg`jtRPP{zFL-Y zy-K(Qpc4v%g5{2ijULdz;k+b7d5PAdnNIE;Q`BGB0?6ysF$znSNWY@>dcz3EDsF!x zeAaJbB4zf5H9I|llQ8u8-5ajA+aDOkvd;Z=|FjbO-*5~~UXS>M)$t@T5}aWoS^YM|!h9}}Nh z5FsTyXxf67pJ2PJ;YGz@buIhCt3qm`k3B>#jAAselb+jSmYN-!AQ^X^z!G=l&Fg+s z#b(T(5EPnhjE^1foZDIJ{}tM;j>Cq@-6p2iat-!j?ZGEkf|6FalkTvu$MB3?Hh!N2 zyNb@^t`B9K=!n^OA9Xi~wRoNu980~Xl3(;fONT=hAs3VFJ5WRxewlLoT=h}%ZJ z8AALugC++gK3 z#zX|e{wR%3L4^fNJw5s`R+dc?(m`4h5?`|!&ab%!1b z4XjnL2L|)AeMr5r0hDV3V2^*x-g?35srMdZv$;c}2S}feoPG(1ds5NVUeCmDCn^=> z4$>ltf8Ayob}8TUjMJ{Fq_lR_#VL|1`emwJ7J_1yad*}F{bB`1FXd)e<&dZm2_gEV;pkQ>;dDP-3R{IJwPCG!&)jD|h!WoM zEM2GdGF$-EUz|S~34lpnV)|{AIePiI{^R3aM4c7k8xh(tT!O=6+TU9rEsKnK&U^SSO&7j-A zo^oTM-5oY;4~dJTs&-=x+dv+~tdDfT&@h2#8F=oC;{!Uif(da$4~a0!?QvmoWqfpZ z?~1~$Ij|}rmB8SBpMm~TO_4dX3%)bM--5?@Xl$W^^EPbPxqC_Oq<90yEi4xvzv9aJ zq`=o{S(Gy`0Tg~Gp1+OZ@U^)aR;j|?LH#`jA|a76B%Gxy{S~&;Xgz8FCCR$}m3-&O z+cI?fY>K-*i+Nj#MWa}BJEz8hWprlz8P`DIroZ;MP zH*0FF!=WHD2*oXyE1AjdY&dU9phemlRp$R`6WwS}pd8Fhqo zEXfLnD=Y0d!)Axg->;Dh2I!x1*j!9iZRDM-eR^tf@tq<1!*Foz#4Xi#4R=Xgwt3o^ z8NI0F^xOo9r#$GAFkLCEwbknN8XGNR%aQdK?WspI{P#MN{P&V!8go_hG+2j zAkYo$=(QGB4kxWF`!J-c7`BUKjiicW9}N1?WQdO@6#Vnq{nH2bYP2x)d3`@!T67Wt z1DdrhEo5cM1g@FwjOGr(~?U&<~ zog=-tuE_NG2W|d#jQ?E$b`Cwg{AXHv<3VFVp$S2ZtAYD6?U=q_pd_-)pj zFIe@xdkVCPQcKKN$taKM@+#GxE5?|2%@Yn`aYsyW9(Li4d~%v)Ah&>K!6oa_8NQ|B zI;kZ_GQk3VMN5b|Hg!K@PEY-yKPe^QN>^X-jJb^^wzLNlgGrGX{NYApCz94N5ZB&R zP?~)-XZ>*P%P~IOfe-2I!{F0jX9WI$6WJ1Z7<#a>$PQV}(A=@Ut zk+=6t94WVcGlB+VxduU0-Vq|9B#+02c=#(0(2g*k$nnt~Kf;FTGGV0pBj|jOLGKz; z#7OcBjPd=dP0)>jT541_bghLoS%d@7D%&!GX*5o{$pvg)j!3?oeKEw-S+gOSxKbdK z$#JHqtGYr;K53SB&PvjOk_>6 zU2aZpC$J*e?8+C+>2a!3ieAf!C z(2A$+deg(ElvYoMyJC}^x$t7!tHVc_g4iLeeW-=_=sL5;kp;Ya_ho#}P!hRJR5+>{ zyX5*;pgj1TB58x_YgJZq@sk6VjSX>r-)w@Xy&^Ce8%8iZN=_3I2tAB@k!vwbd&LK> z{@Fs>AfWTAxJKTHh>MX4CSprM{MU>DUfx}7Y-@r{Qw(7#PW`K-@-y|9)ltnli&lLt z*44gPgI{q0yANSTZuvtt#v=z~e0SA&W?|06aJUN8M5|r?RmaGx^b^mgRGGc0Y#8Zp zCfaK3W!QW@tk_Nqj#NEa;)gFWe^%FXcS%&ps>oN}J)L+aFxtrPeH-1YBq>}MY<%Yn zjP$?y&j&|YiI{BQp8O^PujpEQ-X+=8?!6Gc)m7C}@XFJ(qN3uW1jmshKzd_8^!+OP zlz(xRB~oo-kzEw4Zy)#8$lTdm7wKfnkr4hdU~-^e+* zncNT+WG9!ij_-Ix-o{c0;jGcYE=cgU5kVFhF_~cKS+599lJb@882n+G%zJywD`@1? zT-9mtitUT~MY*R^)d0WSp2C?(f9xQ2RLjf}q#mSAy0Q9@Oz?5nWSx|R?zo0sujmGn zulz>4kN^chD{W>aZ!}R>nqNx>sjw89Uf5393&?8|)XvBQkJ9}>i4?iH7#ql!4+I=B z1S}eUqm6T^*U{j_gpRKP&5tU$Xx~+EjV9+Lx5*Lkj%UC8^Nr0yl!j~%Ry_&2+8fYy zGUG1(UT&XoyhZVZ~9RD8mW-uR88gOP9Y1j=Qy$;?3Q4Sxn`h27p)8RWSX4Uh8NjE>g5*k z6Mrngzt`iRTrjX*rh|*69$*Kx)|en$yH8^84Gxi*Ih0FXbV+O=8~N;_)KOUwCAm7E zi{(YtctTi;+4HeY?|lzrI)%%R^5BTCH)(tN6**B1?(IGB?{DPC3u0x_W>iPOjVE2f zGX9Q$+D%xz_`YQ}>Hgg^KSxOZ-7VfbD(hANV{!=sf`AHkKloY z&@=0m=?}QXXN7>8TG&6w0eNY95LmmHtq6L+CFY%v2w@a7E)3KB!l>Jkkf}zFwk`KK zI|yzB*g&Xwr4|cx@Jv4xyWc`bDBMWT4+u1aVBZkvnc8ZVqRqa!5-`Of+yPhl%D_43 zdk^*u>{xKXK$a5F+(ax^G2s`@SCE#zR9cEKs=gG!B5w`dC}$A#`X7{XtZEa2n;OIU z#Z4*f-IOg`z_uQl+17j|JIOcT?C=JIXQe7AW3@@9wDr{0A|k!{a?iu~++(h$jlAsB zFf&+u0sA18uLSarzW#Veb`|>uM8B9Ybs*v+|ErHkfIXz;oZiUCt=E^!nm=?l857(P(QMidX|7<;kB#N(}Jl-d!#Nz!t#RCUV>xL>07L% zUEI8e54v0Caf+=?^=y={#0em8Z4Sv!vmN6$*1%9O9)#6bbm^Ev z;-D&yjchhJ=nn@7O%h)7<-dRP9RGP|@eTIF|I=>oU(M2I9^3kiOD?F@N4ztb@?N!% zTDd=%G?R7L>?W_c7ml-kw_$#g4x__%YIJjp-u>;K>b6Uh4wbcY7kgrZ5g{DUJ++xMJv*hpBFAC8al&zp|`)L ze(L;YUpNi#gov?KPC)+GOU?6Y3v5IilMjnXLRa(0%CklgAJ7ySV#o-Se80s#EV!Zv z%2$N9c=g7VaFGX$YQY|*59GD6P*kv6Qs7x5fHuly7=@c8m(G@uX=>$4Uedsgs!OVz z;EInZzN;}@onpNlm_nULO`!U2^L=652VEVSF_V*T3h`9B*wgM2G%d0!u^Gx!TD;TuiU=_sGeH>!PxJ=py69R&s^P6C%q!VnZ+f~cIR7}ntjWk_cX*pd{5Pa)h2*;cM56kr=bv2b?8Gppk3yG=aE0Bl{q4xB)Pfwn{F#kw z4uu8SMc6BLuU%9rQ@GqpQVzeP@EvCUl8|b&A-sdzzuVE1e$T$HDe_Di(;>E$R8G$M zDf17$)#RCKYm1#Y*m(>gA)FI&HrOMI68t`(Fl$1{J_QGuA;J{X1|MKRUK7hfqhpEp zD$-ETr;FFY!1l3kWP)>+mE143zs1|V zS3ecCm1)1dk@C3QgOQDmAbol*^SwdOgRtz@;V`Az+Y;ezW2=4!;f=MGmtu0qM*Ie@ zvOLO^lPkXz!;<{aithnuwL+-(7`Y&@4YkSQeGQUZDQk!P15gmKM{Jd1veg$i3i1Oc zE{=^b7zD|#ag8lTeAtX+x-(gp64YQDx?)Ej4UV*O&TkesJruNqCi`bC-}q5bZtzgD zzuziEjSW-Bh%YzUv%4r2dB-O>_q8w#P)h2rj@Vkk|6rkjVk!&{$jZ*NEqFUNMJq=+ zy8OOEj`^c2>5jGJ8X7f+*_!T@W2)KNIFj#ON=H=~a=oH1+psJ9au8Yf8O;W=liah} zj^;`9YI(A{^m$|YeFUR(JTzpcZ9^%o!4s-e1^rZpmHGARHmKIPJkvYec1pRA3Zu~< z)#waVxviq%ifhc{z|r60YLJ(bw^~{sTXIZL@W}fFw)TRsg)39FYuO7u&IL8G3Dtxe zGI*RIE5qp##FrGgNgp*^W6F}z}rdZ83DmyLg z1mk+rXUtnFHK%=CFQ!{$y0L!1_l4 zV`sj4%F;19-ms5$Hm00&v}sInuGQ;yFXIzRXpQD5!~9V_2FjHaQKc;f5~xm5MUAs} z!kjNxuINvc-K}g&wIil{81f)Y!m34WAy$F?QQyJ_XHut{aZiHhx|yhMG1V5n|>YFuS~5de@rwaP;K|q5LijwzQn0bR>SrXY_LUtLZcdS}Y8S28$a2`s`qnpR&%OnEH+{3) zq*y>|kvs`%SX;%b#TWuB17z2gcNPMM=Wr)x^rqec>G6gyw&l{%H{1_i1xhHiNQCf( zHSVZjzI()a{t~IagQGoTC6PG;(0dsn4t1BVZRIeR#uS;@S)z}3YMiJ)Saj);@g>$S z1=E!Qif36X*S`qeq2^}TnjX4Pa!q*lOh;1Bn@0+HuRd5e$qStZ;%z((d=FQZGR!mydn^7ve~67sa4m>i5!%%nKLa7ZoJ)1j^-Cd5Ks zw$Ro}(O%)y#glVSi#E%7HV=txmr(Wv6J!n@QoA6j@p!1BOG%bxbX0HjWyB6=>5ou# zIgOt|fm1_+jXmQscfc69k4#(Fc5pwR*)|eT#?r_C%xdFf&^nqc5WafBEA*>{3-ridGfLRj zpSUF+^FBmk`@e*b3wDhBBTNaW2`fei+S>fJ+F7aj_t+wCK( zsH5xh5(a2XtU7~oRJ%xH4DK;b3&mvdAlInhm16&B`zhz>Y@32=R3N5acQ#*wTpo2@ z<^bE}FLyJw@5%d+XN1_?F?K9X;mBk1e~S?18m%`-s{EV5Po%U|PAlYWKv;Uf1jWub z*UACXv;mzARCk@RI_fd+&}nZ>_I^vXE^v=2fk?QaQZ({}jyBkG$lbUcW3%P9^2#C^ zAFJKXu_%TNgUn_^!8>7r@_tjF9v>|ovH%8|#g*d%KC~1iDIDB>PT{xlaa3i49}$bz z^aEM&F)#5nVbPjk3Z>$5PdTA7*|A&x7A41NZUGH0$xzf@(QdhY5L78{gg9VDV9x=L zY28;7n=V#0MB%0!Ke34tZjK@|D?4?l)XWjG%E8HYu7Ia*zT!P;mnJNAlh~71T*4U$ zwIsY)b?c1#`30y~CKEUVY^F^6qExy(8^*s*pu49FsDj=peOB)r+}J*1v&aR++&vnm zQa0nxfuur`$xVt3UW_NkjlmK7J50&A0n&XQBdO5fx%Ib*F2xIgts_?119-w!0?4?-oLSCOBbR@jEu>rq*e`4&1?h8N!oahUI+3%@AD zzq5=Cf^@ecW!6%?kk9dbNHW-lkj6rIe|~K&Y$ZTUvT3b3PmS=TjQ5CXh_2xeGKatM zq$a=fr2eRb_?^{=aN6Ts3Uo$rkq6Spu`j0D@^_}%59QK-h*O@P2sy9+vx(dBt|R5$ z8M?zbGglR}jofs(@}(VBbM^mvxqIg$%kSJp$MR1wL!m3GAI2(|_U4$D!raEVmg(o2 zcrFthf8~Sy{)@=Nz|fVd^r41YY*J+xOqj^wkYZ`k5BXF9!H)i~4{=WxgCPJSD;0)G z*-M8I-3^duF+siQy&K=QawFrc%f!Y1^TVJV+bbm@q1FVqh<$%t5S#u97^aKOtXYQ% zh*845)?*zqL?0vf0Jk5^Fd&NkUg~yX3QG|u2$G*aa1itQfkU{@4jegm;Q8~@O)8ke z&0k(eV1EDB??0tIe-L^6eodASi2wWpiR+H%$pp)Z@16Pc_xXSSg#rK1KmPdde`(zD z8S;oWp1IJ%2ma@?8BLBL%a6t6WAu&RFXsEtuCpH^!5XBU6msYJ&xOLzRN9Vf>p4Yg zw=sxsQu{rVNU%7T!80Nm#FiLxyNAWET1(zKFOjlurbg0SK4wL}fL?OF;Bz|Rx{~_G zK#`(K!bpn|kIc>*wEtMr(pKt%$@-S+fMI3IeT77ZzHZ%-sAOM76jNyfy)u6WIz~Z0 zCJ~PmH6Rf)^0cMrr9`qr7mT#%iA|JQHJHgTY3US6B7Co^#-e1`ris$h3CWbu%g?VF z)9{Gja8Wh5j8nQ)LykS*<$jGfOKGjZ+jAmU%0gy780!iS;rP8(h`PRFP_ammUP! z*)b%xcDQ>6JY3IDXerQBsu(*RCVyy>l*8j=$0;(qTbScclWoB;;=p;LHHJOSym;Ee zhfGpS0PS|GLf5beYjGjdFrRmE>)N75jSJgAsO|RR46{`akFPCp52d7G9+QSRshNU} zYAC;Ep%_|rw1?SkL(-|?Mw@Pg8CGt=I-ka-bP)wXM&Aeh`=2S^iqf1@0BX0EI|k<0 z<6q~v`34$zd$ty}*sc6#1clNfaV?M!74P5KoYz)zDB`O9!Z9GEJoa`)UT(mlpkM0c zQ#IMBL@T@XZTvj^*hclY)mg^4mBE-Hj-NVjO%SQuBzmJAl3X2AW&GgZ=h^b*)kVn! zOLZ?ikvVf{=OY;O$1y&g?S(3~BxYW+!q4ExZ$_>1bL0R*s&#%q%!1p9HGD>GVs6 zJ84dFOQlp;l~X-SrMT7;u8KHW0|76W1h@_3&3N^mhLB{ipz(y8Kgs#8h_N0FQOM=* zNspv%_tP?01Xxiv$3z2>m6d{^z3WqEb(aIbdyL79nS3$WeL7>4vaxs;C)B}YynJ!*A(cip_XyMqQQi*dmza~Y)m zhW680WkXu%BKg$dM4_qHzLMCO)ACx+q1(@U>L6KOyO#Q z;j5roC`0<9c@4WWvM>b>tCJN0BG^tb?6KhX*?mtn|ze%u_ZXln%3xdQ$b zF0cG9FS6ZsskpIa2$I@v#6_t4e(1v6Zq`o4*6R=a?6t9Xz)AO>&2NV(WqUx6@dU^6 z%i$p_twG<=rKoOzTV-o8Cb6#)H0Nvq4*h8*#g&(SjaN;rvqk@*u``i&S4+dTtMbUO@_5*sQm zY*fFkC5XRxX74pQRR)6wdr@_YZXEhTu;f6L3T;fh9^`51%Cm(l zZ?0AHQ-l>wTP=Y$HjbEdp836A%V!JlY-5{V=&Iz)w1DPE*jH zNHqzudCq{bwK@I;nBC{@?L9Nlot@pRff7tPZ+Cl+vhp_Dz&!lx+|D-E=@5?5f+TWTQW`J?G%i zTQnZ=GUAnit>+;D5@HsCWr2x|Z>-5y;_7N*4%<`8?6)68Q_4H0Cm$WoSphY2zUJ;s ze)_JY?GWDZ^=1rKi-sP~SbIwlQwtj)Rkm4*+%B^Vyz2lGtoRn3O^r|X+9Pd^uR^vv zSu>w>mf91?QJV1f_G@jxPh_K~!mq{EQ0EQN#(9+MjH%-rMRh&_lFrwdES>+hc-{=6z}wGH!4|N z>FG!;*k<~CT&m~mJ7(8lPfxxDAMabE$UY*qR6j<_j()d%31ubnHubnpkJ+@)^YdO< zZ^AdiyNdv6?7jd3=c)=N5(Jd&J|~4N5Vm7zWYklIq7!GM9+~>s!j#f#ZdI95RJtj; zLL?I{`rhAA&CF)~TL}7PW+uutsv3E03Y)5*?7I>TAI?~Jp#U1u{YD6gGV_j)NiBEuLqbOtd?%j>AE)J7efT>aE3OaUm5BY89Un-N)Fr;aWkd*hYWM&Dz*Q<7Zr>T52^qrm0 zMFp=X{L=yFJ4-uk?i69Q zB+t-zjin!~)9CMQzZ9u!op~kzQDM#3;`AWx&WJ~K&!fZ}b21+b%4NE%d`k5WJ&)A> zLc%`0T5`%OcuCR|u0z3dgorww3NP{c`IyvY0aC}FnkzBECU+v=iTCmk9+&(?4kP%k ziFdkQS%QUY!mC#hvsC+f3KHD7M>wQ}@gBGKDw@-dt#!p`nvSdEeaYPN*I&u>3m&y-aIeLa2 z6Ld~`eKXxix4BBxuCCvV)vKbTB@XtiYSnVeHgB}D3s=D2D7(BC5Q%!kVogr_f70#2+_yj`#_W`tYp+BW=uA z1-y=vbWhWt&-4V`%G7!PH4B<%8Axk)ewviob*=Fh;{*QBno~z5NpUV4Y`3zh$-rI> zo++XvB&JdLs4%Rr_INBUu|rjjhV%J!{DmGCwls~L#5wdwdpT$OE*#jAGjo@>nZ8=f z#*fU^ZZjoxFEc8=yRuZd;i%8yaYfxMkSp~_QsKtr+UsF*K{g#d96lIiH>LJ&+ejM= zdYA)i=iVm!NQgy`nLl|m1$lsJn_BKFc$Wz&O2p?=OpvZH4k*PNO1V_jknyirgcn>} z1p^LF(6MvX%V|xsylyWm@>n#@0t~F z3;VQc-U@++Hp(B(R0XGu>yT5SrzERfa=^&+$eEs{1Wi#V4Svjl*Q6FoGn4F?E+0E( zf>X|3RsuA+vb5{O`Hn_CR@|OfA$G)SI+6W2+v`z0AnHib=!AEwPkwSe>OCc5*xk{L3{> z>hZRaUU*M_+<6wM{eVF%kJ|GYg~`&lND;C4XWOp}c&Ej}_zJES8#Ejz#V;5aL_Nt* z)JWsH%+N0qQ{8oR%c{{v$@WWUVDpMb^Ion6W*zs^gF^L{l*NdK_(QsNrDp@eiO}`6 z{q#H&QNBY0+lc~dXv)mNP*z>0o%fMH5 z-EZ9W@tGUFo0aw-(81mtA!Ji@g+;OhOiCRN`o5<)d-d+g*D^yY8@IhW^zsI~OK5aM z;}&a&x|pFfl9PFyhI@UJvd#3?_H452jv{$`b`mJegxX6!>t4a^vWni!q_*3>IJ)PX zVY?JX!y9XHe`VQQevo5ILVJt;LLVE0C+^cU{x`K#4|46;;*VK{)RCzBHCKmQjP&U8crf9M zp7fjp^H+lRJ@t|jIGfGlJ)iL%6YUHvnxDz&MK-oVOX_Dqv0Gb36ADO%^J`4bCw~l62bDCiOVf z7hY6Kw>Q;ahAO0e%H^wr3}L))yZ9 zIQ_ux&T3^q$!AJt(FHABELK1%@utxO{vzpPhirsilTSx;6>z{|`pHz})v}HFB>$bP zq=>Q0+o#e!&+50XDJZ9-TkNdeC9K=#;GwLP-tA1myt;Xz5GwAE-*0i+HN0UYP6@{@ zjJQ2}OR zhZ*dg@|T2_BWJLiN-0)Sy7w}>J82|X6Emey6x$Q^gLT88^}FT3E#7EK7qCLoS%S#X z6Ho`Y7!o91NKtXJ(`~oeypLMN2;Vb1Ri{7dOp~dU{h8J)s&sT+%hJkg|tr!groX32+0RzzNBaz%;5jp6&M%86|*FuroDYfIk&5Dw+NhB zE4RT}2*t%WeKZxSIqm>6KAoHy=(#d4tXgHhcrl*~{HsXE`k|Gctjt(S#2m?cm_{`I z9{*Bsgj>kFZTIdk0uZ&s0F5ZY_scd*{@;=CB zytcX=(=Pudc>%;7rt*dqLq9W%Vx28f#sb3Dr?xS*Ttr?kb}+`yZX`$^nN{!XG;|N# z1|A-2a;O(vJ(%GNa>TqeB0JEwtDsC(i;NYWT)I#CLpimD<@`Gv#nL1%6A`R2mrIYF zrvs??k49gh#+u;t-(mw8-ex?EIlYuP%>)VroO`VZrqu zGIpKAm3GLo*&v#z9sJzXH;YWWjRsdlfM+%j7CO&$5N&WpM|9RB>PPo#+wlsIffWWv zmU~`bjh>emJUyNb3dz3Qdz;LO$h|&a^1R)cjx18Rm}=g-3T&}T9`l^oimR|QzFrk> zvGNRNc{g?^AV^p)79@1|P~Bz1PQnY~B*AjtGO4$aeYrI?cf5Y^#3>igh1yt~ds(~S z3Hy!^%7uH)-mt<{`M7bV&mGiL|4{-U38Az_nJxq(GVhCtxWKtU{@Rj4h`?};Xv_^b zs4s2gRaVaZo}JU~!lSnGxqaX~pahtMa(uFXRsb3lX9z1=G?D4%He9waG$dV2)iK_y zXco@9gess9)FWB0qxxExzTMb8FHk`@@XMvWQ+zxUX{3c%Hqu`8W=8a5j%*W1wMsDD zNC;A5?=V@W7)>jGW_@X#?mPUY7f306@BRh6Sv1w$N;us}1Xo-qxT~+yw64L4F*Ql=;Nf-mBV$oHnb#ALWwl8Igi;Xv(c+Z2 zH<&72KPu#3wTc@dcDhu{MB^0X@5LB|hORVmBR|yh$F4b~gfh5XSQONRuqZ2Yb8TF($~L+6<40PMrv@8gv1wR9Q%K}1BA+OJ8y!Or(!g)e z$dp7oCQJ#3B|Tg4Z)v0TX^{EQrUUz(0O^)mv2(*k_C|p8p?5G@(vNTR-8cn{>8A)a z4ZU4j=+-eC6v>KQY8t)QJPq^HcsC42Mp-2nTPHr88@{@K4QbTga?2?vV5Oe-&ilvw z48&iIIiHd3PJ`N4Pws)6F&jZ45WQBb@DbkEKIV{>y0R6U%69_74PeelP@L=RD{Jj+ z{A3VXtpr|qE6)G={IG8R^tUr4M8lir#Q48%ULC6a^`qlJtL&}T5J0k?(vRAdk5hZW z50nCYv|bs-S(Vqyi;f-Tq}0NYAm}{su6!uU8@FSq3w$HXHKrgz%@x6#>z;wSB{w}e z+VXadkc+&f9bJ&|l9h?#!`0EoPC}|ckPP8lWmnbZ4!hvDitB7U?y;PE4e7}6Ol~94 zdN^L|p}VVLQQ`Z59X*qobUZ>zUWCI>9r30u!3f(s!#AC2u9|SZdl1Xd-}>3w@)O^e zB5O;{+8PbtIYb+mQ*?l}KwS$na)c#}c56o27=T{^U`Njl8poDv(*Uy~C^qY|r731R zyq_-4^+_ba*x2~}`%pLus5*ziiZQg2MAWae)!Yl~G^iy4X&yT+^Fc+m+n&R>cM4bJ za)-_qM`%#PY9opZl_?GqpKrG+Z7%u$V4f_mAwm@(j5@cbJ+$gLLmr8ul)ROU09^(q zlqdV?KeJZ}S&vlnu?@L93_)CUUG)|01j3S>1I?MPoQ_q>Dx2JOnA2V8^VYkw&s(=P z^Py{bd(q@IY;<~eO2omgkL+mb!teR{({A6DF z6tBqH=u;~{qM5-zyE~dnA}bAPyEH$V>m6Vz<5Q>WVKA_UtZ>#EVjgcJvbt~R24_{P z*+Rm5E9nL@Uq>{!=6o_WGU$ZuSIm+h+z$c!g4zm2_i>+HrIGsB6?Y>{+JOSyaiO{WZ3Tx(1N7Uextho6&YV0s8@4WMpJ07p><&tc2C#x3 zo;FsTj{YC6XlTSPLFKA)t@9nnpHrjJz%s74LQGPp9j71|;C_WO|GB7O?%SG0z4_eu9qKw; zBKb%yU30Jn?HSv+HGuc;6qNE4L+G={;g{be7A}9+o@=}0`gDl7Mz`vFx-R{)RN5$a zAa_1lw!&gfNusVccM5$O<1iupPv_-qcqxgUWx7Zob4~nbwKkUGu#nGTS{Mrt~qlSZ(+lyj5&d5cx{h~RG^~Ggroa35s(#uMW*txofbLLziSJyzA zd>QKrrqjREgx|E(E@FLgndUTcpglQp7<2TAA%P6#=EZJI>T=&&CKP)fxW|K%eeqBk ztLudA@Vnl=M{sfi?H&I-!hJSIL@W~ofthPivD@bBr;fU-@)$rB4a`! z(D)bc@^<)RQ84=V178R|v3d|IJ%`C$X6U%4m!AA06 z$=|C3NU?OBtW`!>D~4bX2!1@}lGyXy*fYk#<-H7&+NX{C9$q+F;tfX}vj4LJE6+%nZj%!Th4@8aBx@ZyZlNv-q?O_B_(!j-@DVg0dfL zQAwj7{Fb5z3p51S;}!fZMS^`w*RY3m{g|K3uQMlK#eTx|_YY}Lr5q+~ zvdc;zQ}-4R4HR4Gdyi+%6nY~Sdwz~&$Lm)Ke+b9^LgY7(E84%7#G2m?spB4Qm}pR+ z`I`$c#C$7ryy7$OuhU~s!sPcPOj!H)u_loaaJ*wcryEoVKlz2)>to7dU_b(_FJ57m z;=0EfEM8Xn{rW6N&II^LUd~|nEp**`yx2P%%t?=DeCGVclbwns5d7vpJgYuw>@UcE z3(@rlf><4MefYfwALdh)Pj>u5Ec~|+-QfC;&15~lg{Y^1F&A5if`98iZl6ytv1CP7 z_L!u%_!ywr%!e;=ya;FN-(12TE8Fi$P=+WgVtw)C`friAzK}$Qy*fI-g-C}?8C$75 zx%B&qOHZ86VZZA6Zy|baEg_FRzn{PL8KVo=4i(-$FD-u7<^A zq*0H53(?~x8ba*x^8e;0{x&6g>|ufA2F4Uga3|AXKjHZM2}em~VeBUgelMU_o;kJ< zwf<)DxuUD3*g|v(bWvj3u~hJMPS~jDgT5r#MnRf(i-k^YLq{WGv9EEn%8o>cQ;!sE z7ob;ziPPc;V{yhQT;9%a$`1^&SD!@+ta2?=)~8_$HY^T%cO#*&$6hel^ldY-uY3N3kd5r(CE_`)VrlaxHqpZ3iTAj6+g1#&;Rc@^>9w!BB8Bd?v7JmYct{IIV z5F1S==?6M4Rz|d~5jerxFA!3#j>%+`Vv~!Zo8AxOck7}(*xE-ejD|k5w+Vw{f~14f zag_YFTJ!_CwTvr}QCmzUY%lfxc;WZh?BQ|KesmH|XWAZ3J3nN1%BJ}Aqi{S%ot25g z9>~hwPi58+%PvvwjW$C;xt!P=YYhP4s%@ACvH4c%ne*bZPt}iod6N@5k8Jis1TgFZmSys7aQq zS8c`$IC6e!=xMz}X}lK*+4L8DLx#;7qzgeWP?SBb5v&bhOI@SFupL=P6t`6ZXE%i# zxi+h{7_Ya^P_?_NmXqR+r_}H!38uQU@$ecI@%U6O{Zb3|+f-%04U9}wyUQIq3{-Bp zQ7;q`ko6XLHcOY?-yMNwzpN3v>oos%Z#0k0@%|_5N0Sv9u9{hg8Yg!+7zMZ!Qku@Z z)jp%^sBo%}Mk?)Aw)r-x$$R;$cVB@mD<%#mqzm~)2r<^%Qxk*RrD!8hx3nPL@?X!C`{p8LLWQurN|1% z-5|*=(HCQ-5aRFEOKQJ2)V$&Ddo>ce^w_joer{w@)%~NgkAb0xaGl-e`1ZpIu%%$I zZO2Acc*(Ql4tz63b(8X-#Ma@XIxSmXN9$19{ru#(k2~eDKEC%umZRX$s-SXnUc?b; z-LSct4~51VUx_;prBtH>$t>dzcjrjicNl#a?M5cO2EFOh`vLB z!9Z_Grh@Dia{QOOdmpTiEpJosbAzq>2MekL$Jk%BdUvn16?ZHx%y1Vr#@im`v^?LZ z?dOkJzHRJ2zO+0#J)_Y%*s)VO*QegOX(Gy*{5)OBgZUHE`xZcPw&a!_|as zlD{;wcJRpVuD(cDv%KojWiT0;wl;G^NY2~*;>|6{54lJY1pT6#$I(4^RP2t6-r{?M zkGmEhwmiI|!6_Z*{rmL0kj)K)IWK{T!tS!e4R6S^vCgy+qReRy~B(rdQy740sUpCH3=DebP!R@TJ$npd0$?^?F=MtvO*j6LC zs`9+~g(3>7GP@CFW403Zcv}niD{{rTA9FU2Y%n6#R_65TCXwV)Jf; z995h1i(nMm1KWQtq@6l9XFbVpSLY!s+|lN#O@DX4`s?W4`z5ZMpal5Hnu*ugv(2K<12(GrK5btVB08G4nztPHs}Ft3J+_k>4H@&xb;o%4 zY0D-TD`Ivbt?fE{hN>_*Y`8FMhjir-Fo;RV*)+XXpr!R`zyIS=; zXCHGM=kna9`@T202Eknb?)e3DcAqE0BJ#F2VGUhGA@68T&g96?1FsO6$tL7ees`o@ zfxQJ!kv3*`lK>F_x{|Ax(G0p!{ z@qc0Qe|hnLO4C2&`d6a=7Y+6QtJ1+=X37e9hcd)WAx9PJMB|!V+Fgsrmr@;T17%eg zwg8&0WgZj7nv>3-&f3x7I_Kq6Rl#|Kc6=miFi{ZJw*}cmj<-J2w36iymQ< zGQ2JFy|svFeB2=WzU!h0d%jHb8u~e3(0)j;3W{BS0TY^ zWig`0n7WU$-Kef!+_Iq5bf=XwD!>1;gwVTE!ND*u=Iz|Dsmu08)X=ozU2lzN)rS`> z!Rg|Uh1IqQ1bp3r6}D`O9NAoCG21VSk5sN!WvZc+{Q(@2u3ZPtK5!y_?>RUXXBRV~ zHfe<}kKu@i&7?8=z6Fy>o---o)Caz;_P)FROsZV`LAW!Euj-uA=%pGe-H z?!qD+&FUHuuefke{r%_pjg@R1u0u`P0sd zUGj65QKo5zo^_7lw>^hB{ZeY9`;kS;2#bvqMsPv-8ahm^d((~y?#Erf__nBj=BwNA zme65)65qtmrw9aF=kWh0;OS~zkxL>y>tx)Q&hz?e#uufN&V`@l#i24AUH;CYOW>{; z%K6So=9PB>Z!JgdDb=&7x^=Jy@#M}qayRmE@f{l6m1QdBS;MagpET(L(lqS zjIn{{8w%fQuj|x!sB2Yj#&Ovly=>R!4dM)u9-HSS!5VXv7futc)b4=GTv1g+Sh3r= zkVrO*EN?yPB<28GtPz~TskxYeKC;kvg|awN<`NN7fp`_(#QQmMnfSWO9|qNfK?&Tr zv-ZL1>fIcY<-xoQApOW{cnNXp>K|CxWk1Y`xySL`JngaNWOCgUk`I~x=+@>uxg+^7 zp;uq=>)3vdpEzj&XYfFtK0PJJ#4RUso0+@HXHQem{xP;Y zI03X$;Cy$ZFeXxs=BA8{El!<3+$8P(161H*!T}{CF0iguGP3Cuv4$myi%XIG(dAn) zNV2)Y2Q-JixM+cMvROI;j6%7T4UUaQ1_pp;qe5H+c7HnOrkE_nC9vKA zRJGrwZ_2z%U;n_T@gD*2n!zFo8`OIt#tJ5w`}iTYa~}8#ba;&$7mD4X^k>lgo{yc_ zzu$(|?LV~uPM8X@eL!56I%12{CuhaLHHM)z7) z2J6YOF(^rcC2lq6TOvBajDEqS-;~uZO7=a*?yeQQBKpoY4R$8(ayX#Y#<}+=Gfd!R z456Tz*XI)kaN}CUwQhI}E)VUK@G*2xCLM^;vCA)Y=^kY&zRJtGjZx51EMOpM!S|a_ z4jS;91R$O|o4nAqQ+~aqT(F1Zeud-Wy+0o%{VdM3{t8Vrm?X`K%UUk8(Ln2{j<^n6 z7#(ca3;BFELOOivr9Oa^&40i-o?4^Cx4cEy4ufJ-d96Z66D@FNS!uM4y=sw2jyUry z7Ew<5Ig$Ya*dmoZfmnV&XMQI~wV2;_jQlgZ;l*ON5euKFyKV|Y1xAt;>*X(}c~jI6CaDpt|9d+3$%vr**g13xz0qOQp*T))(wut3fA;&lD1>j@bNn{Q5& zH>q`z4_++KOzDtGrNa{?J3YRV{)bk*-@#5LVX+{H;e8N>#L>iQD^C-LDV{&}XbZhU5 z5J#Tp{uhxqT9-<7i%o4v?er_qhlhs^9jJ|?y}qsk+okO(dRLf5{u~t>JZ|>S}kXYA5 zu2#U#>+{c=WLiqed(Ig8xg-;>G~57nq*_|(9~L2MY1hs%yf}sP6YmgB#zcOrJP8ly zxZ$sV3Yc-ogZZUGZAisV`E{^OalZ5xa?ipa->5heT4eM_pl~u76xrQ!vcrN_l0&+L zb6;;{zhjQrZc|1hrw)r^!)OGbdwL&h1 zm5qunTl$#^H_*NFNCCm;6|QcY%ddfH{5MZ2gg&1UIe zZnIfHE{IgYQJ(i%>pE*Z-ReTo!?`m7rvPQ&#l1jR#Y!l9*p^72I*kjc`qw`y6bVY7 zvdG~WI$yf9PW8K zL1IcZeu>;xkj5ur03R>L(6mc6U~{h21SL4Fd=Rx7bW1K0kH?B7L#1i+YOXGf-~kxH zXpyMKtL5@@wp;Utc}m;9W(IjMX`fV0x|MX}Fp-pkcfWQwB)L3chi&+a$SYgUjknU5 zX2}H2Rg~5RH&&L_Z$xDlH*<_GmR&_(ys!965mC3pPwc(wE$rC1D2VzrgR(90YLd;> zDb;~ysS}5pc`N^*(lkA~&-m3{O>`kfXuyt9v9HHWFLx<|VEfyYuleL>cEH6KjVGYV zXdijR@<9KXA(cga!>vS~cy*z^^Z&xEAbRRG|Ab-&dw9qFB<<@7s5B@{> z<2C5L1jtWG6?zen{{z`&t_6dddrx1s;z=d6bqXstJKtyX(%P+XyKPxzb2X^kKIXnj zG$hW&<~iwI!ya9ka?yu|KB(9UB7z&XuASVp7ohy|R|A*RkGLfBYXvk^(>hcTS?VR| z+Nw-RWLehbu`rwIq+1a5dzk;#+T6a4*syMxq2hoLy;oj@cww4ckiSd+^x4JqFLeuF zs3!U=&c|DA^v;b~mDBbYh||*cLsBn{)R`C=J!@)>5X|j@*0W`NS?WoR&D)o;6GkHf^_^KvcJvhjh^X>Mvq?N zvr$uQ#&60HcD170nXapcFHiWuBr8WJ5i1T~=i6iRk#ye5h6>SnFTYvD3rA;4BeDb+ z_mWHW+ihm_L^W`m7&RF@E%way1@_LvhcfbPYijMLhIlLZCM==nf+c4rP!HpMj^vfj zv82bPJ1ciYLtW6xT~-Hg4f}K3E=CL4`AuBr5x4S3(GM2p?o2G()f46I;$(A5WRnTf zXElzLv6R^7<%d4kjrZAz9fNPU+SKNT!JRXx`}1{&(q^Se-(!|;j2tXujC-o)Ngbx- zipxYE5vyl^^Be=I_-WsbRhh3UJTj+C7uRS=&+#=I3SIFC!pMVkEJH zRi0dDEb_`k3d&u_A<;_%1O&Gm)3bg~l=|ydtM@cJ`3!#2v?VdUj>@aqy)PByWqFbxme1*1FW2YAfF}zBeFJlmnWZGrT68fUi5yH{FcV zpQ($_^)H)LF=p&kN`+8Bb2=$?kY;f@E8R+6B8QpOr8%kWR%!z;6VC1YNIp{{R}2T` zqg3=gI!J}LN1APmdJdX7a#5=3bii;?_ZvcAK8@{iTiMvSg3*!*&rhS>7vi;kx~ykR-PRUQ}KRVi1NwhZ9=<&@GZ(^zpEb06`eA;JSqdW>thVNdS8bmdOE}t z7cjOde(H);I?DKUw2i)|+u_<3DQ}KiW%T|OD=pNNME`JC715;m(YbA0@hl#_#U7de zOWn!{RU{dwa_mw><7gIY@;rPlSp7z`LO+bhr|-;QY-X5DX`iuTT^dy&T4sxi1Nta- z6kjTXa>NLEd!+19BXKYt$^D%qjvDx+V44fhxZt{qKHroAYQ4|8bgbqJzUageEI_bg)%~MZaj~eTH zb#yq%^U2`3OG#(l(P=nD-h148*<^(Io{w2fe0=^{dSB&6x~qAu6s${g&9*8i4;SZF zZB6rmuXsi|WP+u{cJSQ>tCil%2tPM^)p0m6z#4GEe=g-IP#cwK#TLMQ{(5^dL_%zk{zz* zN&L-U=_wz3xQVKGBfnmnu!XmWyu|5CiAVIim}PjDcSZ}^q;*!#-uB*Z)Dz~Z$QQ(I z3LAhESiHAb1|rF2Rsn^`s8YQ8<5Z!Rc)dnx1mfy?xo;6{`ym?(9I7?W1P-o@*?Sk%7UJNI(t!laI$~6j~9V$vgA_6HGDqo40jfot-Kp-W4 zky(@p6en09JQ$SB&yZa|OuQQhQC}5!$hffqC;#<6P!B(-{ zH+}1+_FXF%@h)TMoh$kX<8{5bki2UBd><|;bnOOP>{#x{+AoLx2L?VdB4~#=y2{11 zCGz$=j^)u?&9j73hTc3Eqrqod);rv3iltQI0aSv(z<#BG{^D=Ct{K!R|O4aO6}5(6;VMNhZ{1_ zV`|+dqo|`eH5)(6Biho7U7BlZT#km*$vdBK?$6R<^ejW=3pDbpgt8;64kk4C$CSog z7fUo(?H|GizZ!asbM$MlK}ybL_10a>gB*b@&GOGQY)0c?)oUibg*ZZky-Ft62ma7P@Z7VGGEq}L{?!gmRUMLN(9jrsUn<_Ca<=EB5 zq}6JUrRDp4&92H9(rtDV@$!#D&cq|y?t?JE6m^8W10@MVSGv_fTRhQ;pFLO8csi>T zCxELqW}$Y5_00_IYibXV%wqdD7{=|J zDjf)=$V3kFFWhrV*s;)(bDQ*X&|(^yN;ul}7cG-#CwH+fFUKdT)*|%LO`(GsWb=3vH-I=hS@NnhF@?SgL9vt>DPP-l>!g|yjSEt8x)T~s4lDg1E;;_GuV z`LZU&sRTze0!KK|}$85>pXDkuX@VC*&Z0i1W61 zr2yGEU237DDP&V#8n)QYALUo1&{cc?_K;-UDxH_RlD&48WR-pr1e%=zd`{=Z{d9{l zAu?$0TJA{cBjIsS0axqYJ@}XvpZgLKDp#8<)@5X4#HT7Pns?um&t{BkZ|p%atX*}` zKyxuX!QR<5JZ$=H(qjEvz|wR{gGWgJxQeoL1;Iq)ZrfS~B+^A^ryT z%t8{HtMBA*P^DXmsGBdF8nBwoP)1RE*lk+ZAQnnToOUUf+z?M{5EGG>Md~&+`-sP( zRcns4-5z%1&PYj*jSe^UWF3leXGG;RQLnuBX1G<`k;`Kek zVZY$$x_%m&Bg%9XavY+R{g%EFXKO6sJC|}(ERpHfZR%^F`4;08=L=wRWzX1oi;>ja z7h!vQcxNqqYSqL_J->&N#jy6Jw6I4_H1CA0C+)BdB0FO6Y_jQM%%ffNo}?!6={Y@{ zK@U%1-!AnLtKC?>>Ete#mCC!>3{1Qo1|<@nwyHAmp|MFj`nv& z+2mv1Ys+`-G(%$D`g08DvycLVmOF<{;`KR2A~eFP^xhtxT*c<)#J1uv{do6{jwc$> zC-C01_XZyJFQVZ?CF?uxZWHJdj>~(W)M`G=AHoc5uC$K`W-a4U?@y@3_Mybaokl69 zb75giK3_!k7Z~-&^PRZ*7S|4@o3#(>ob0;4zc*a&VdR8b)aT;BaMP%^>(q@!VzZ=t zb9y>;)dy3CnLc`sr-+ZJJrsSHROYhxFdIAJXPimr(zW?0Yq zC4!6Ht*D+Jdf5ClNV(9P;@vkDz`laA`0%nIo1&b&Ix~I6}{Fu4&rNVx)Z^ zGV_Dbzf#&A0-H8dt1=}<+}j^|BCR}AFs?c2l^5y*ib2^Js> z>f!yAOFIcKicR6v@VZF@!TAMAUb9sk;mz5QX}0TkV-~wz&%Sa1fxIS(=+R5l!#jp` zoVs+KzZM-fxdWs~d{>f>wrVHn(0&92oBpG-P}TfC2tJPs%Tl9aZGT&Sn8w_chV?$) zoc|RCeSd^Y!}Wf$E}}sY_@)Jmi;k{LszkipS*t}m*tbFSp))C+2YY?_h+o;sW3RFj z?zw!3<{uWkpQb2^lnxi&iuOSpn>??o@}b)9o~XB3JuIw{KH93-73sCI3sXl}Li@M+ z$@-r!vl9}^Vj{;i@AXWAO+x3NcxD-{xzrGs1xay-h4Lr!Q2r&_`&AYW?}DmU(QZob zbW>_}%r8!~+U$t#Z*Lf@@fZ+$5L<>2FI4&6jZX_m$0XWzby_3R*r zl1)w1XUG%R5VlT_@ml>-aE{iT2&5imnqy0`^@mddN%BvPZ-8Gt*&^H{G!ohTFjXl+ z!SYEnHJGA7s&F|nUn^7e<@HA$)anuO^pDG#=jUv%!fc5(Yb+yP<*G10VbeME)GEl- zuCZ*mmznn(-qt&bRubRGQ9m*i{n+$+dB=KeO8G{_H@YYe_RfX zk9hl>64MCS1uhPL$6x*p;<6kfp7(H;Bd}6*wIPc0P6et`qVZrZ?^_`UsOMc&H-dI~ zwmidB(J^vxZ`Ev-1@Yg)T#JOZiA;GPR7X-WD}5fIbE;27?cmHK8#&I&31U|`_v8?y!bAhPp) zW01<_De@QLGwPQ+9wyz5IiYnDW_;}HSO$Qe9G;?QJ$8b~O<>P|S1A8bBOm=WkhizUI~77}kGoZJqoF0<_V?Q~b9z5z@|5yxtsSV<8QAby=z+tTNP1H|nT_;;JmSql z7ZjJ~>ahGIdfjPZxonujK3_jOni985F`Al2v55drhn8*91!kjO>Dbi$3VrN9r*Htn z?ZT>a9ZM5nIn!@(@}4-XHRcBed`y+o%orE1TADiJHVC}?l-LIH|}51~U4Tkrw6pWj&gc3WHWRZsX&9z{x#NaD|a(RC<(eT!l>Z zOOCR!s4A3&qCt0e``)4wG*?w}W)dl3SBESGSGJ@O%n|md5B7)`CNsR=@T=W3g|Oha z>0N|vt6m@>ywO#2sGy`5O||2Nw4u(jiu7-IIzZMH2K|uQR>Hz`STg1$L+frX$9^GL zn?!_LkjWHvg|S-d!gL(*I5s027WZvCf#V=x-Tq zO#piSP89it^PqK|swr6Z)AnW(a`dZcWc?tC*Roe7H~~_ zMX~0|#@AuTtYqbOXT`wX-Q8q;;oi*?-^*eQ%%XNNHxSU4oM@cB>nMEIA zVwV5VNh}Qm$G@u~(SJ=!xC-uOOll{HL^7*O5nO&R$^iyK(F0-wSgJ$3*v=uVI>!TG`h3 z9;_wX!EklJ7`tKZ{jc)Qph(86^0+OYu(3SUo3-vlNxo+-q@Zj0)iUSW4$-3x67QX1 zv+10q=jFhya?RDq)k&?cu2xw%U-jC>wQ?q+_Eg|v48=H3W773S^jo6?Q>pTA1sM+y zM2(|rwR_mP*jPRsb*&;Fi;MfUMsmg<{YWhdK-WG_%=q+enE1qa&pl88ynjAzEWSTa zukw!9fRY1Ga9+i);B`tDdf!8b=Si!CQg_Gf{pmbcxWPKOO+WJLX>^gwkP4v;Xu3r} zCFR18?&9EF4X@&&$hR-w-;MIT$Xx;>mn4GY?3{c1*GFTAaYYlQZU#6Vw)5l`dA)Bs zppnG4S5hYzzXii<_1C5pEkh`S$JiJ&pV=>u$2-ooF6LFO_Oh3cC4myb7#0woSpfUN zpr9B8Wf`kS1;@^ZTXMhhSVum`-_`#Hvsmm+)hV<7!lIFrp;Kx}K^e*~?C4zfy*ti| zh`WSv=myt?zdqoBA}?9X)bsST!SO0YNb6WtTRBoj5a=mA%XB&;AL zmm-uJN{59Rc^GWy7++SrRbz5F4MvgA7r3F;s~h;AW|O{1fv%#1&B;t=@(3uAgWd@i zW_Sn37&0#Zqm%)P;IXYYdOfh5;?588%Cict<68ligL%2b#b((?je(HGw3z-nU-Wv0 zbU0n^4t#VOj7ej(%!V*tSM6ocm>PVu2#CkvK+O+GH5`l>nTYI-a1__namPMGa-zM#5G5ET4Xpfo$O3m?U3ld`}Iv{|wd zECJ=2tZnF#Vq9h(x)E5feuBNPo(RzNk(5MzTfu|Wjn7#Y*&Dfp^PlH(zfJ!zap&*m z$|^SgN#IJ{?b;^#kABAZ6L)}-&LCgWH(CG}AE|;!MVAB z@+2q5da#bYE$?rXKHvDYuHmc?aaINuo0%>}NW`fO;{ogcDcH{6XhS43r-_Rq_1EYV zt!hOUEAGcqnS1<~Dc3%>>JX_aw;u762N#J3ZJ*%n)3~i=7<1AYF51Hm8BJ<4_6U>GTzvucPqdl7NeO%Qa{WVqzsLdTKpvd*-pu38 zNxl7r4EQ|)o;zOyj=LlNw>yj*{Vy^9Wfd&5`>)*nt5yDrNl)SYt26&KK>wOo5QP3K z2>%Mgzk=|WAgI0ESxp%@Mz<;=!JRV{J_;qHL;R~w1_lOujLM#$BlAvCAyy_XKQ*T+ zkaa`?6Mt$;9T?cmAK03Rqe9zdEX{P7dE426 z-i%_O-*)$?*b3bvLvL}ox1m#EpEy!xlZ`=!K%~iOt%?&Q*TRcikr9cn@iOi5?H7-X zxdSbp+%gX~!inOgG>*b*HgQlz>krSxNGMY>evp(o5zP7BVa1?EsyxmMO8U+{Qi8~p z;yK$JyP#&}0=Vh8M*#L!Rcmj9u@>Z-d#39BUBImv%Wru)l|U2>aGrMs726BR;aLDC z3mE-0b&X8$%_*vs52sQKs2j=Oec-L!pqDBA zKmKANQhmjeb|tWBDy4#;kvuWjBG8EY9&=s;msAFg1!asKz^Ol|LHtg}YbLTUBzjC0 zf<)ifppTG^I6c3bLK=0OE63a8gmpnln*P@pZ#d7sm$6l1Ismt?l=dkIEuwZO!3LN$ zdOB!+-BA`mjut_=>T(5<{b#1+HuHKmvK8PW?4J}NEb3V))O?oKvaeh0{1d&;J^3eM z#l)}XciRKc9U=L6f{U){(%d*nv}eg6Chz#l=X-s$&ezu)AQIFa) zLVe7gh;iP?xwc5F?gViUfPc9Rn?wdQrD8Bu0KF#Dc`RJR0715iE#tkNsA=_099#ZD zfJe=8$g1aPVc-J-CzVal&RF3m=3Te`2+3U~>Fc#2q9%yBI!;w4mh3CPDo%p-45J{> zx0xq8Ak*H}O9B|xPYTa5_?#YhbL@*M-LA?nQeC2Guj%uZlRqdvgPZ1S>MvG~LSsEw zE3dMJpo~CmB%KoT_nTW=%sSs2K7BKbtOF+^m%>GllmZAS8ek7A$2Mg3Pc`=EUMl_0 z_5Sfv8~5XJ7G*givY#onG$)!-ZvBAB7%(l(f`;nU(-5rS;_aqAOt}PA@>mu6FWbpk0scg^Lp-)<9APmvf36l6ucG zekFC2zKB_pZ%-Q>#Ir7cCD$~Hx~|6E!NrEp*ra|r?VS2!9-@%?M-CK$%n}rRM2%1F zRrI71nWUJaPok{=*aaCwa~{Sas$jiq<}L589ZUz&tJQk#+iSe{H0aULwMk`+doF>w z)^?hR!R>=jBk|pZ5vzPCs87^5%yLw4umjIlPL^I=&acw|7^?pFD`W_`ir2pRpF(B1|Tb7Q!zHqzY6ZsddEu85p!1&gWKQFGN|!b z1Q&D;06Eo8Q=B3sxz{YZ-fivq^1ow9NC2~&&&K?L)&Qh+q<#MA!9WKQ2C7GZve`c= zUV}@wayw&%mI3U2-i%s3OYM|+g!E^Cq(+-uHAE8ii`}nwH8+#TY&%Lb$ zF!CP&7I)riPQM)a_1l}R<}LruV?i@`Qybd90%z4|YW zAWyHBH`^P3bdG!yl{fSQ&OJ7CbNtrjG}h0ta3JAk6Zb4nic1Tf-&c0>eX`aEnGefE zdR*DU%Yf6ivj1PjZf^~~>SlT}9X$Btzj?F_jD%8!j2|a`kh$QlLz0eoQA0&hR0%b& zd4h46fHX)_5Sm@#F3v~^(z0!WCB+HH|6y=|GyYoo)zI1w2KRKrhR9P{-#G;&4Uzqf z6ZTvJ&fVblVxJ4}nU}#8>E~TM5lg8cRg@_aKtLWM>sD=on!t$Twf`oL*LIM?7$fpO zApcptM00)ntHGEQ9aPg0TG&jN9l}|wB}3<)5_a#`IZSp;*RG~C&TI3LeB6C);QuBo zsX=Dgmv?^vw4dO=TCD#H;kHyt^nkK~5#T@#u-SUxhPh};4!w-sNnb-+A=mz^cGZc% zL9_rh?1>2<#R|ElDSfIejEwM{2Sl^^Z$$g=q06i_aN|rn$31LUh6U#sZ+Fz zO)Y+Xetn@ z1{ql@G?ju|zGM3bjH04d9dfzY6d2tG_ScpY`L_{K&>-`@zkc^u9}ZsK-y&*P*l0&9yA@UCmX z>;D99Kh3`-_c;R?*DUSgwA=F0DWJxuB=DDD15PHsZ$D?=n0@(4nD+k#697_)CNE&Z z55Kc?QA(~2ug+VJLrT4nuZXq%#NL7hdCJAVaU(G1998j^K<>*idlwt!Uxf@4HC}!z zfB1U(c0-eOpb?Su1z$j(#-FKHCo^73w{acwluBITBkLMYB=^@}c;zTjR5_gnuD^Vf;` za6|fN8nK)GLk`_sBi91zd1R~xZ4yKWb3bl678E;U_GJCNQ;W3ag;*y=@Zp;j&kH@^ zYOEx1DdDZJ+Ov^D#=DguYG7evYB?oP)ozN(bruI*3v@m0iTmT94?pt<>ytC%YefGy zEz{D)M9pLR7DNn*U>AlZCQJpANI&7xNf88U+ol6eW&w+Jn;&pW6`CmWvBSva|ML{& zu`HUA3-3+&V|Y$ z|EIk-4}`L9|A$+&-K0X62)DA7J!Q+%LI_E+Wlz$E?CX%bBKubMr4UNC?0Y5aU@S@Y z#Mqgv!;Il~T%PC2bbsr8pYQwr^ZVnz|CyZk%ynJod7a1hIX=g6BC?mDcnR1YMjoVm zpkq{eIvE&&Wl4 zv4XW~_(J_P<46@AvCl*tUSOctML^8vqTny?HcJSre=FbAI{X)6q;x<2YTqp5mS!Bi zARYWav&%MbFAwkT%k^EI2O0*)x(#=W^`99ANiTYtL9dx|MUmg^seN*F#R% z`}0$;gk2g4bfgH~bN}q|sLOMUj9g+DKX0qLajw48G_sdRmy#-M52sO(iA~ZCejydE zr_7Ti*ppT_>97|rjqf1e_)qzft4n-CqECn`C%W^~?|}E6CUf^QUjVE0HBj9hz*MTW znE1nNIoKB#=ZgCAioIUd#N@a1Rlm*dA0zevqiv0)Z9Dm<=jqudq0NIZO~M6@G7+;B zp>N{@t%H;L9D4Zmwcs%14Pq9Ax_}B5XFnNMlR`U0i!2E7vb`-D|{>-{t&m zQZ5f$iQ((H6K*A-mRjMOui(^@S77&E>*QQ_LQ6Q>tboAZ#x^|L04m@p;uA?}cC~t+ zaRK0=(_R0sJ#@rz*eA1m21sp{6CLT?Vh?Y@w3x?P;TTL8kPXeG3w!^NXCBXfE)KGB zFg2`Ol1jt&c;-Q`>ha_P>Z(t%zIPv+SWCXjs1iDr`t6#DPVA+bH%XVDo-R)2{z(~% z?m%Xx#?Ao8UpF6u)4d`VFdl0nW!1fKXv`Z3njSOVuTDa^Rx2wjbUqCuk$mk6)v$Ul zzg|7p3S!*gXWP~~iJ#y@&$fegK>t!NSeYNa3!1PSHi2gT9nB0dh`-HDJB_qcFU8TEQ;QW>hk#e`apI$M zZ=P_&jeg6VAt%(hqIu}BhL^?<{9Uwo=`svTMcvj~w(paA4s^WqyPcUOU;m=~l%{^9 zm?N~56ze*0Cq3ip%Ztz6KHD3Z(nxv#Y(qT9-&j{bzLGn#4N>(`Kcf;Oh-Dl$rz;26 z&_vryKZLzhwNF+mGh24tzclpm?vDq)CK|FlJ;`7a$)yuJ!dP=w$@YNP?Z2vT2b%me zT>oBv?Q|(xtS}z^o}!(TTx#oz{$;9$pB~e&tNYXYQFS5$9e^MFXF-hm@Xf=3=IH?U zxf!}yJ(!~T3ciEUFMWq~Qa`B~F}}?|8{emy8#nMzj4*Q7tv&3h|KesCmnty#?^xti z(??6%zlP(KM5e)4mP$&y{AAy&-S^c6e@iAJ*G_LM_dZUX!u%<{X?TG$`IbL8_i-YE zW~Iiv+*wxPaJ11~SOhJR2Jk4IukVNNwmIAMgOC4PEnmHNgvt-Abeq%bS6Vz)SLp?h z`4uIFpNxwCAOA98%@CjfS4ZpFam^3cgXbMZe0%xFwBG2v0MF$D2rGZm?ZNDZ*NDxD zdjD&ig9n?Vhmk)r`ZFqUQ5*4C0x=0HB^b+*7J!`S=zU7;#uEYH)CUj$DwrS9Tch1` z=h&mb{|f!d9=J(+)dz&;zZ3e&cogUKdlWjZKqSB{@sfdDL@yUmAQtXPXQn~=*@rvF zeR(r?R|6F-Q*6LZ1Hhu^;KH2P%OZYx$BrFzehr_U_~sR=KFM&h(PC3urK#rGk0qpDpW+Nv0{~D}}!E3%6#3~JEPpTkBW-bKY$$h-(b^Y51+i<=*!TBnT_xtr;?&Ti^ z40-W;)jn7xL&8icZUG?PG`&L0Yh_M37Xn#c(W*(QXBvMhvA=th?%9kJnow@7j)_0_ zzY}~bX)%|DTlrQ4hLFxd$cd-imhT%l4L&|3d|ggQDq7mL03u@qJu(&K#Wz9#+5NwI zAt9-DB7R$H}^sI@ve}s4^JNuAlUTG9cM-| zR-;@0YiiksV-u#N&4*+#79k#fj5#Lx^}+T}Z*)bbv#Y3Ia?AuBaWJ0^ug)B`?V|q* zp{eX|G)ot$87f476>;0WsB0RI619kSUt2LJ0s46dy5KvN7J~$)e0)aQlhM-(5JEDT zfmhZ;HG}S^oz<*$z6W{p?sUBV&ZO*Kd{^()70!cnbj$K(<_L1<;P$Jx^w;{#l)E_s z-~CTP1<)e!J~$bNPTY7RP`Nr6Acqiz7spynldv&&J!PZfgiXD6QZYW?#pWhNg=&@< z9c$ptLMXDLMbmLsxWLJ`XaNlXv-594eO|^jO(XY}mols0&m+v)IgC-aeyvjM0-%Et zn@ncL6e}$|N-96!WH?p+XX0~L(c|^ZsX5gbJj^0>!avbbbr}FR2oX&2KXmFMU=laR zaQ%h-E_YEtQYU zdG^lF<-Hh)1iFY%LFF5wuM;M|OHSK45 zopUj5v)pg3$``|_Wmmsv3n6S)p>$jYF;hRM?qJXooJf6t0P6eJ_>3y_5ucYcLO&7G zjTR^WaO(}w%6@*8qHMkGCG??yga4#D-spyXGdM(GO!0j7{Fv7s<2D_ClS4XtqOV78 z;R>k!F>GU(gDK?A1fQq%XgmK;HZ|?vCQsYYSsqBUtw5ozijp?$>g%7*YrjNkHD1tT zS-MgkGu@X^M}6p|A{=dZS=_H)I-&01!`^xebU43#pMB@}aF`mkAC+aTWgoOG&99<9 zeG5SRZd;7>hBV=T^REu3hez>V0ae$wVvZ1^M$UEljx_ZudcH(G(_3m%e?zYvs_s4c zT4|)g)8KW_+MnD61P35q+8lQ%a>|6CFerMc&2^kCwyIdUz+mK-LoGSRZs0*$w3&p& z7hV5n3tLVMuF`6t!Un_RGF#1nh46Ys*F5g!9|w<*fkLEq9H-Q?9c}I~be(<)`CcdezKfh$l5@;KB0((cL9V0of{3sFi!@;PKd!E5 zDlP2w_j)0n^*6=vugp?KObJdDl7)e->q)$zX*>A-MiFn?nAPJ5$PdZP@b~J!?G^FR zKP`55^aG{fCm_(%#IqB_E-Rly`P(*2aF@mPLh}4j{1?Iyk{=%SJqLkx?@qKiCO!l7 zq?de#vS9g1H?LNR1K8;E*WeV@$AuU_NBx;_drQ&K(!O}tVp3_u=_m(552?X@$JV$z zEZk17&r~sxx&$3@Ig`HbOVg`43>LV~T35%MUbMxeEYZPT_nv;Gz*3*pXiuqqP6F!1 z7$hWlV%6zNRqyew7Z)vB8nl}F7V?RPTe0;BEah5F_M1l3x(8Z>r5W6F#dnpLJ(k^B zX)z^Nz?JT5 zER24czAjtp0ClQW>-w=K_g24P-1YE=y*7n14jvV_oSte+Hey%45B}my)hUOZ=|1!I z<1YH{25{|y9Ng?T&JzngE0H-p1p77VXC$JiJ2QU9lxUVi{66is)KRzyS12-*FP!fo zqE?o2rdJ*6yO&V}N46s&FM=3)WE`So=_~uo84T!&x$9E{riIFjwo?T;38bYQ^r|_2 z#&G6~scflPg=!hbGRk#j`Z}?~y@{}1!dOqG(WiE=*D1kt=%XH6X=DDPpvTnsJzQZx zAJolrVt~UA>oBYtx?tYX) z-*rEJnzf{4xmjh~VjQK2??sI`6nXyi%+n25JVAW{MDn#l5G(U=+d++9!k116X_)(G zGTc_?nDtkEEW(=2Jvdyk&$RDAxNU>s^ex|F4Ye(G(z$6ymF^}v4b=_|lD+6Atycg8 znYb1h5hz^nBB@-t{DN7^M8vj-k@52S}1^WCG!E7iWmbAMJ zh}?%E+rpaCK`-Xvn+k}}1)WToDF(f1817@v-Dfz~%TMWip*6+YwCJ{Fj-Cl)dd}?x z;og&lUowRJJHF&$7%ijqrnDGq?hMbEualzBsn3i=#{abTH+LXmkT_UY^mjEdH&wdq zGxW9~Bu+Ze5;Y~@5)@U@@RlsocD>R_y#o=(Csnb&9wCiNa>-hqnMx zv?&zsF^e$xU`|^+%46U6&N$eWo#6gDKOt~=`CLeh`bS>- ztyCI?7eCQd$(?v5SSw_oF2^sdax{!!^JBQUSV|OunZ;~XvdH5E_S|g}8lY5zL74w;xzXo*EkC8aq#$+i}2Ta#msO0u0Q10hG!wF3@JtR09S$?@6V2xLdxPM-|u4k#G6&dA(lIe zluE&4X62aHzBVXzFnhgah^TJ2`{*^pyu-2)WeAt6=5NMjBa1|_Zt&%I@$4l!1Y2Ne z{$h>c>IODZ6&%MpN>~N&bI@WGeDeLx6Sv!ved0aVoPj~cUxtk-&4`hmqP^z;_n&m6Rh>ZxIi8IZZx=yBpWaI;U#{>@}>q?_M+a643r{5q#a`x8LK&LDU64@#)(D|3{?Vg=q6pU`Bnq#>Vt@LDzh?7i?}%1j2b0VQ~Y{J!WqNz z>l=1D{{DuEI&Y!w?>1B<4kkiSH_>V2vDfN6H1yK zFiME?`jqGPcB(KMPKyU7R}z!=3aMOt3VT$^Csg#E&@uJ4os3+Z4L&=eScxORZre{_ zPWG8*I^Wej!w}5bLyR&JWgfq$t8aAc_MK_q#Y?UXhgD&%%4WSJ?Z(c8q*3i_eCu*c zKlrWr&R>NpUn@sT2bgaD(vvrbkh>{CPQak#Y8bbg7WgIL3+8_B%UFk3tNHTc!TejT zA4qkSo_WZGM7u698y6i=>ZTM@iMf}wSE%>N(diwGDXImnI~gtILYKBtwR52x_O3d* zMF0m(H|iYqp`Yeebmr1Q-`ITF5Py3|bT6-IoO}kc)!3gpl zdiLtxeIYYLgnB{uORB;u-uZXb3kh8wn@4MpP8=|QyXaG3>Wr+0Ip#Mz*Xp+$DGYY* ziSho*l@Vs7(i19j)xD_?pF|PtfFyPiTu>!HrI#^(EQRky0#EZjzkZuN@HT%PMAV-P zIbz5CG)Q_WvRQn{|8gEMg8j~Xs5#4KaMd>KP!8ndfzu{q!-?Os1SBJdaBCQ#2GAoVk?rY?3P6v`Ow^?w0$q*s8D zzSc+$oGHf}?q!wI5iI-u7ZU1{=Fo!O0F^?9#B$0E8($2$cjjMdreD|VA@0r7bghiG zcb?l%8Nb_7nf4vJv*7@pDgR*3bWi~L2OdLU#s3#!+K{mZPcBeG>^^o|e-hTbGneRn zSL>4@d>Ly^T5J*jP=@#7zx$~dQ zVPdPt&m@K2PdDy!9awR(uOPMOmFqn>_c=jTK(9ar4ueS7AFNAos4u7^;NA)4RT}y0u|Bvbyi2lxW?MLtc*%19~W6#WziPzt|7c{#0$?6;g>hZgQTA_NU=X8Q%wR8&uq@cgCrHLdp*y z3B?Rb%k%1)`Vt$Nbx_&oM5&&)MtjM@mj z|2d0%LIBA->9m3)b49G*$#nS*hZwpp?nX&Z8$WCZ6k(wi{77`h==Jx@u~$Kp|71%q zg435Qr^IX=`IF&|MF2zYHbri7NA)=sC8E(VJOrG_I*8G=+Yk#_uW&;f0WcZfg)eNY zk3b>_F-pJ93H~<~zZAo-cw3@ zOX>C8mUoUfBTX0`7>#>dZe88a@NUQbPC01-Yvpgz#`=N2HJle{O?x@4{c7Z9gOk3U zqo8%%bDXs^jY6BQ`tirdY1U>@CSFk{T61e3h$)8cBtv{Du6$yGK!}aX%q&?PC>bd4 z!!44GG*RClvZ;71D0rOAa0Y{rQp9I))ZZNjlVM4P5KAB+EyjPtgmG(_OBGL(q1WJ) zOw~OzasRd{Gsfl_kwz`ApN6jx(F$UlbIh17i# zmuWyioAUslU6^sKJRRpYSHC@=5}=jT)BUr7H1gXY-y7pLKKDAI;npN$;7CW-$tw5b zNg1Z%(b|=5RK!>Q1%ZRN3`rM7rczHhPZBtNGvi9mohg~2PY&xe=I7YB)4y){j)qc2 zC6UL&v(cSd%u)rQIkRgOZqA0MNGxVS;@_S?MrvZ*o_;sg5#w`r7+-dwg<|{6BQvPH z)uYR)s=82KT@Ckt8ouKZwd(4=;Hd8+(99FcbH}6d&Q|jI9T7U+x4x7pK`9g)cB^?C)#%aa z+$~iSJ|leZ?*BaeWZQ}(Y0Sze(P!*Rz`xdWW0uB^6kHtYPjSi%1%>7O(u=RuRM%HA z>#@`l!@;_O(vI(UFeHavl6+NC;ar&;So0=8@ee=PaWH!|#7FBPr4v-{q zugw(!s(?6&$?5riwGc-F&bU%kYdR_!xMCj9E56#x6WsEp;z5?@dZ$ zMrD#O7+=OaIZoei=%K?i_r2}D`EaL*V5CH&|i6%Y*@^7-V3`8d%&OUqwfj3 z`lkT*&lfj^g(8|ZvPiCVwwBE(PIIAbR9Y~@uv~H)V%-|fk#9D((1b<}Ux6=ghj$+#t>hkO&AfYlt>-h!Jr>}2?{@shvWgeC4uHW z!%m?x@hoWjf4x(zeG*IirY*-6WC`jnEe~0*8n_5l=zL~Fb_ay*&MrgD1CfZ%H>c~c z=EEE_zGC(BF8}T3r;(>^4LEdmQ=hzJq*S?@$iqbmn{8}@RUYS5d%6u^txU)9;xWJF zw@i3JUv!J}en$Csk3R8SBcV@B;Z8JM^Gdq4D2UFkMDyHb3QX*%=Fg_(7z(zR*|7sn4)n>g7Yw_+Hp=nXQgXk0F}{ZEEq}-<11OQA%9lc zc+TyvA^WhD3+9=)AbXdS?3tSOAoFH)obJ}VT~q!v$gfHm=16CZJ(BQ7&kxr!^&Wyrbw zJ90hMUtRCfGD+N>EfC*G*vs73oj=)@uTjaJI=Hqoomugk(xz70;<*iW;RfyT?apAtpiWR{|C6p%#euM+8Kl zTtIZL!5!qkHyhm)v+Rv*2EL|U4U>5?kWXH6%gp+W&jxw8A=J&+BHnXR=ZaUu`Ssd% z$$a-*7~JO}Zs5Lx9XHwMs^ck&gkSI3}LhJDP&{6yr&3 zq_Iz&qMt9)^WQgW;*Q<(Y9+0y*LzSUXr=7BI9q-cQ7Cp?I6<3gG)dH!%}YdjWZrks z?NfK5+8RoNpqH42B8@&F(<+P}uxLAGl2+xH&_-)ENOfZy6sd->5?Z{q@;^qM3vwGi z(k=!bjNMdDtyX=KcskFT0kHAL!8AG(rp#qyW^5CPSFwTshTHX8*S>sW4_Th8*m;s4 z{c`r>nDgxTySPVJ4P|R*MAi1(;Pskkqox|QiooB9*;W(FxSL36y>(1R!#+rUDvuv)x4)`)!5#g@O zRctaxW@*DlWmoFe+8~D@f|4^LO=zc6s7vP@RX^F(UU#n7>iC*`0xS5L0W9Zxc+GVB zAO1}Nqxbgg|8w1a+CNcrA>5SQU=2wLY)7gOi$|sINz@7=mRNRSNRir`_Bgt$YSU{6v6S*e?>O-M*ywGwm@`2xe z&UIFP^}O9h=g1`bjPb=YiMKqx&%%P`rAqTxqrCee1);4JTcn__a!YDb7xTLL1mWE- z8KEO9wD^<0g5yxcXHwE0H}e$w1ZLAIB?0JhT6)Ghh}r2WaCtI9FM^{IoX41!C&Zk% zE(-8^9FOGK^M{c^is<`t*)r8kOJ|v^4^|y`PoOjZvdiqFCY1ukq(-a>+f(N^zVN{P zk-J##zmr-rj5e6Vb<)Ty4`tAkxpXDmh=`!#E9=%4jn?g-EvyW4%SsISC(5pb$-bJA zU+~o~yDnM3AJ5YewEVULcncE)sWOYN7Sa@?kE2$H*wps9ecf)Z|5_j-=&g0QvP!rU zU;LScyYa!@Z_SkLFQ^~&O{|({z`$Xgs!nasx4RSvzz5IS(yt-{~ z!Wgi}6oLG^>c1G|+-TYcy#qtO#Vb5yRZp$`M){FKp5)IF5zpKgJ2-Z;+*N4mAQS0S zRcn(A-uMge3Bp~kq?pB-_u1OXQ}#}QlSkIw`PENmN)H$PCu&4|f`3VdF+5JIJj2Tk zC*A(D?uM$mdPpE)e5o@hTvLsct*+L;PY*%vZQglN@AZN3OvuWCBMT0 z3ie2&#Rmxsq&_Hi7t+n z%2ob?N7H?~+#P?=l}!K&uP;2` zC7o7Mse0A5-+A;UqGHDPs5za>mu|l5Lp*>m({6(@82@4#lp&zb5Rr}+W*EHxnB^?U zCB>Vq@=VkZm`qMp9mw8EXC}Vo=A#ZOg?ERbTkDp{16m?1ThpuM=W*{_2WaH^XB53J zZCcTHU;a>}M`dR0fWgNmo#ep0E~7Eb>slXKR#r`B0FzQu&;_ab33lbE&_q z$v&759Q7?}#gN=d#w{!tYFfdu|h6#poSAK9d5Bt`6& zEyo#@ zJC6F&D~Wr&=qs`|Em{8N*A9STI}(QFK?5&sbH?f}`9%eRN=OPX#Nphy4Q!iEjf)l* zt4c1koF|57;qE$*Bk2=8kRWMuwv@dpTL2dmcQY_IySjLGYtf-XW zP&i)Qll*N{e?exz<5#i9pX-)~aZCtGT1-Ce>^vl5orr;aF-ibR7~T5jra`c^`K8;_u2}(e;*7`n%^ol?^xw0W6TlPA{Rc+9{}8y*=(N zyJ}KW&2K3jcljC;xKhBIIbyt*r{VsV#@*>mfe%hS=c(E%bmYxV@ok?UBvS2q=bs%t zxLb!`Aljoca4nqYjNg9LS+rCc5%q&fweP}bQe3dza>#Yg)Hp9?eZtN;x) z4svg&lLcYz#v#e<`fS-pxuv?YsJD08(y?@51>+&pHy@9G)381lQK=$UHn_Ka14Vem zE%ja(pfByDM`+TWb9d?jIQX5|fJ zaKP z*zM^n!A^V-mLRiYFEvVI-cV z6(K7mXZ8td-bNszvtww)VsW(0NPw*en%D_nQ$vufMbt#j+}yn$Q$3vU zqMmlpGju1qBf_@JDKjfeuoF#nTw9P0JzGb=!Z=s4Xpy7uF^rlkIqQ{MJ=GU()EOjP z%eD}U9vRioT$2>6wUwI7!KVvGG+9qz7A+RBJnh7i3L}(616DyMaMeY$%4L;c(=Qfp zuE*9hxri<3#HZtoi~>)PSb<1}L+-TF>Zi|$j?xxM(s6P-cQPO6noi*2NW+7hSXl6e~`Ja0lLG7I;I zffCmnmka|Lt3K13nY(@(YSa=akndWptCeY3a~>ebEMm*b2j;V}a~10D6<&*sIlWmK zRVgiwtAqR0Qe$l{K0E3wI2y7A z>8hDd+>fnn?$5ug{cP2FDL27@GklIovD}+kcqr7tIW)bFivfUKgDYE+`BmcY`51Pvw~bzj(h*yuba$M z%7>a+ElqZfy|2?!Zo-O z8u_8mB7xpyDPpAqV7k7>HyYg-ntHAvJ)u6{rYxu`R@&9{`kFxTaH!ovt3oQYHkcoe z$Cr)zM-Qnang&UWqQ;etE<)}0_55iBM+O_C3MRJaN=0hOqZX2n`YPtCr8#ja4rnQT8Xljr z-6kq5H1-sBsl`V|564~PR*h4)``S%v*H~Xjv-|RAx}+nDp zr*HQc*T5*U$%*a;K=QsIR`4x|v0(dNE2pZ3WNztWh<($bz0;!+dzdaFkqCyx(1Hjy zB^F87Y@nwE%6f#?bQ|g+#!)y|qYYS^*J!1I&YTOiP8?8EIBfrE!EAzlIruU2ImjXb zxrpl}bViXz1##4u{<$U9SBRzgcEJ@Y^L8dnJ<;A0d)tzmli`yy=p5YEs_8eMs63~8 z3R2R=jN-Iv%T-5AB8k^8v;>ybS>Q#?)($sA>dB&41Oa}TT`|IBz;DY=B#}7w5}XZ6 zqvdlYfJUE6@|wrU$^wPMG5s@wk86Ir1*WHiQ&ym2`I{ZFXTbf!3gQqTIm9muM~VIc zhJ3|mR4#w4jODpDw>|Q~A57tn991?|sxfn}&N#Y=kX~tfr4sR>YEw(kqUnqJ0s^5d z+D3mzph`ILYyx9W5ugxVg>S{V_agz^>!S$sy;;wh(Ejqg_Rw;a$+T| z0rV@oAG7`UWRQ`8xTH$h2t7f8v72}IoJAb8j}`SscP2F#^dbs3&}jjj^Y{)G#b+_U zarFj&>+0RWEnnC3_#{{uRtR1z9+Je9QexZy_V&jA-wP|BQJJvlFO!%q$M=sve@K1D zgfd$8h8Gs~?q}LXc5n7xK+n5dlmkP^R#22ukuJX&&q55Pyw{y~thy2kLQ~IEOWdfR zOn3y_2hZ_yG8{IOD9~W;oEMb1K;{E>^8w^A(r-JZERYQfG!NkvUa$5=s=PU~JZO&J z(CPR4oAZw(Jb~c0w|tn9%u&0Q3(#JSD<)@CG$QYVWbDBiHyt5k@mRxHP3gO>n^YBc zAw}>*gZ&qO1bXlf9Y*-xV{5v{WK)*kk9hT0|0KIB`(@f-p4TQiWNBC9GB6P}>9Q<) z{}V#PCBh&`I_ZphEr0%xVI^<(YE!-b3MlAtmnUSRi3^tgizL>hk28fH?UOt6#R7Q? zu+vp}wvlsHPj7eM_(aH6uOyB1^nVd#EuV2lSs9dLT?&JUlkQ#*yAN4JWt8U_1&XEh z3YpdPy}>Wr#7s___C2ppp$>(`WIeu5M-`*6CrxUX7c* z{v(p{y(2EgI$~qObt#52xB)%UtgMItY`;x;Pr2m<_MiZ0y&#z}ko_kV90(Ycy5g^T zpR$#@!@0Sl58fpMfTnsa=nf`!oAX#`{y zZigz%_I_6!s=TBYRjohWR4eOiGL?&%`1yo&sl(9n;`TZTk1@F^Wn|x>ISy3Om{viN zKk|mFuQQDZ9~!b4ZH_~-voWlW2F%`2R8`S`YxhGW5P()aDczrmhJnv=1_V7;(01S7 z@6tA%bvc`&WoO3HTzfw=$ATs0WTW_kbJ6JNoLh}anN{h6^B0`$owm=|wWmDMdGQ^r zWFk}}58GGY<%2a})H`g1QGEaEh*;`A)Y$oPND*Hu1Sa1Vl#R&e%7vGLssp4M$M&6#v2jS@-qsuei+kSX;}O;nvBDYWKldihcCFXSu35VPD?^Xd7f6hqFQH*%%G>b< zasQe%NUJO1E7wWwKxWrCdc*X(49$naGAutrmb~I02ihjt#%F!bbwwkAaFx(gN$Oe1 z&q8H%FNGJDagw?cNC;uK!>&ufzv|YM+g{TFchl0l3EuO<{wO!rnU!KGqpB}iehJ>K zGfM8mnA<*yN;75_Ns6IkaXYm+0&hB-B_k4E3kR5Durz|eLW2#({qdv{j*SMCl{ znkXaDCM?U@bDdW)u1+3@*3O2UuTu8iY-FJC{$4Z`nBGi9Xf&4zb6>}M$i}%7#y7%X zv$Zh=S;=zJw3V8gOIz6SXF(pTLz*5RDb|sA)NZDDG=-t!`{QFv_MOolosCq~rbBEopa9?qJ_64usm z>lKpBW4Q^Wd(T#VW^JLzi1v_BLv7@0dL<#8hltQLN1aLP1pmDApSB$%Z5NbUAfx7yZ*@%2ekLEcZ)# z?SW9r;rho$kXj$VAXcJ&%7@h_9*OHaqP7bc)0uI2+QO#hM^J)G=JC!W3)WDtxuRKY zEl`qAyJq}AByhtY=o8tw)I)I4%=8JT8G)O2JuGv^1gL|fJ!7|c>G!C zg1wUw+LUIfcu)AT+d4kuLgVx1KK+SqZ z;9wh)iYXc^#SZD!Sx4?2`fAH@G&I&)RR4=RY0@Z*E8EmnyT;_G+YnXa_do@yTC>q_ zHg4-cztJqu8tONmH4M!4vh*Or@q1OhUw4WrA`wdZM>AH_S@&}Ah&B7N_yo=~MI=mp z5ND}w88ul?IF@v11pgM$1KEhtyNo!ZfE(+D)1?b_vgbK{OFm6@U))4b-d#b63@-~x zYA&!hQ~8Q)pD@>V1C^C7U`p@NN(x$E4m!paIFzzvZ4?HmTGmC54(4EP{<)I=Nas-A z8RxkP?aGql^gd}ohg0aV(VsXTs#R`nQ)cZkV`0UDbK6^Woa^flRYuXOQEb4$JwZiM zMzPof<~ASAwjA+{puJz5nLwH{@6a`{u+vwpD!Os4SC%{Ug>_IQbN_d*_My{_-=-o# z$1y5{)y?Xcah5o}ujJ|=VR16um0o^scHjEgQr|#Ejqy<*OWT+pyX!1B z3(qv7ZJCxT)@@c+nV79PJUgFZs-{HQs=joN4#uU__PbG)5}X;e!U%N-BsQ4 zo9l9>9biUP`~yP7Rd#MBV6o#g&39mx8pWR!g^&>9$(>M%=95p99jc?wAe5(egrtSg z990HB$*AdkbbomLLew%tgreV#THukl%>)Z1qO&u@WzTFFQvx-Xq3~L+-8uA=_DTkp};x&yGLIl)% zc3+RDN{T5CGmb@)jpB4KHAIiegi$myH0!%Z=A-s&q~FZkmm2Ud&yeP^M%pD4K zFxNw+o4@`wyR*7+ve2^c8fU^c8*S&r zAwQ$l>m{SoxUPny3YMMc4&6jM1v0;@MVYJ(vaP+i7O3<>yp&g92O~bX0q>6R0JZw= za)ojzuvmZ0vylE=Bp~?6ME`@p%uCt`S$}j=ADH}0f)LcF=g`;tGonM5pIC+Q z$1GS!TFl$(yW^T2D{Ou7y$DV=j<@#@VAO-|0Y<*AhSR0EigD8f+&^xXVCuR%K52-tNx zY$9PLu^t|wJkg(6KMRm~Jkj(JNR;gQRGGZZ`NJzm8WC!anZ4HFN2PiYQaxVJnA3#S zS}(na9W=NA-pL81j=qCr^Q}VO+Bt84SU!**N-OMqAfjXt?J@mNfj6h!_g$vh(#OYdnZYOVtT5Z!ckfiB2M;z`VHG=13H3w^;C;O$Opc249#wn5 z$0T=FzU$6qS8w4}zshC5hOe29<#+9G=ZWhLA+FD}?_C8JdM=P0iQVuaiyRvf_td7* zEg=zE>0_2_@tCzcVMZ;2j|PFd+dI)%h`ewG5F}2t*#-eT-HsUg2^(Kw9|WU6 ziJTk~$LMWx09Wtk{6Vqt0tZj8EzLOMYM$C@%2y*tLcp8_5NU~Ov-EFQ!e;w}ln(># zTJ24LddSxR;$+!`W>$2CTIDvigYv)%* zsp!hJ$x5wSCUdr4FwL*S=XC{(x7t?w54UZk7u*%Bb<>MF)upb}5FgQAx}_P)6X=?` zL~Y85|N7+71*vZ`m!Zp`T|Nu`Y<<1ITaEg?CulV3J=^NpXJ7nIgxv7UJ<|`;tff>Y z<#~0-?e`v(CSOidPc~Idy+yZy#~CjGT<8fJyPOQ(A)y3odVH}jx&csU^Ei90ICGa` zOGd1k1or6!RUwiR8qcso-PIJ}4j7Wxt{DW&bqfhsyxJPQF;#t<*9-BZHud6fC>;mq zv-|s%44P#}IeoeEz4QIZ;^-7e$wkj>T@-wECjQnFbYt~V0+P?!phee5iwBGMu+NZa z%-L7J?vhOtU}7-))-RW1C7{8-x>RX$y+*DBn)d0(`Rq48E`NPEMXda`w94IZ@7uU+ zF9|J`ceO8xYoi`(sWv_$#@}c>X6ww5-fnb0<&i}}$p*3S_ecEE*rT^y=WhEsa8*54 z(Lv&2TwHD6)+DVz_kshH8USj_Hj$(G0uekD-8hpL9IMu%by!3de~nJ;F*r z)YO3|d%UIoWH8_Ji7kg;O>ua%|HR^)v-8u)9JSS#wlQo;d19+KMf`QTB;$u#C&SPm z31g+j*9+c@cIUMW2^E$msEbmSo^5tsFOb@If+f$rz`-n`tLBT4+0ArQmcqSn59PT> ziZ&KliJqh;DpL=Ip&LcDhze{2`44LvpD!lmC4(VOipjz-9`3# zm5&0%DcAD)&rP)Cc`p1kZrWup_m455HAEc`C@Y=&_j& zak7W2IRg(zCHekOGB~Tn2poz^zx>T<0i4Byz*(VmRhUnHH7@vR^kr@CAK%)# z?L2&KZ*}s1vLT8Qewe0}_q%17YJi%NIL+qeC|uxyUCxw|iQ|KJ+h8m43#HvB zd#8Lz71ak_U%Ac2+~VmD_aI$;LuS5=`4A{Gk(q^pY__z>BfpPJzrA_AZUGRRC04uD z&7s{JWiUnf;GxaywV1%fs2wX(HX&N}?4xj3QYjLEJw9UP5cMgVV``(0* zeeEQo4%jPRZ+>fkqyY$s1DhV%5c}oh?CMvK-|`@P5A>?=wbolZxPC}EP%b&y)o-wq zO-iT$=5E?^irSxSXYPUgTXb;XC#ub>g~4N-^eKO>O7>{Klu9pnt5np2WP6D{`zzdo z^3rj3vNuQx50ZB|^c&fuoOxaen1KhwU9x#GZigio9;5Iko5MRf*i5Q+_&Y2=uIKqb zRTcCI5QIlwLk;iVyq+DfJ<@UwvIfa!!50EgOmjA!yqNnJdX(YUo{Mc4OW7$2>gs{2$VV{rKe;Ps@#r zh(%EYlYAfRj%#W^p60>3>$@9It0QIEc8fK8HMHHnJcB}oKw)7*2}NJv;hy%I^pqLxlZy%-Kr)EER#pR%CR7d;`-Y4O^5D#?GrEblUN0%q8$=u|5w+-X zQ0=Zj5kD~$8N94DBbRbXzU+Hlb9tSg*j~v0#k01*3FRXx#dtDqbG1C>5ApzqV^Fg` zv5tX1eNB~rT36S?|D0>4Fl$z(>&HM_={fhxj2joq$~?*|`kkCB%PR2pZxZ+~2^e_< zq9$q&W(|b|4V7q%pci_=O-JTt^^L@OY@RmN?nkd2Abvbzm0nw9sob?r`qnw=ht)T) ze4Be%yFbhQk+Xq&rq!fDv)MNZ)-EYoqe6!fLYY83aawzz->SGmEl^mG+0}H|bjDzS zIUT=vkBHT&dRlKbZ`;o;JL)ndae8EFaV8ACWQl_>oQ}X1R#aq)UCQ)mu|*9KY|7mX z*)X$p7HxkgsktQbRZQL^>0_;~pf{taSSH@cu7rK2+&+@~Td1Ug+ zVhZ>p#_{?CRxLKD%C3fw1x_D@KS!iL+rAdVZ#Z?Lb7`xI`IMMm)ECj7+0Q-dMuDV> zTKcT{Bu7-gV8Q5GdPF_?VZ3dxQ?uE`9OleUt7n} zr&nZDu!Oiwj`j6t74)B2u@5{*{1hZ%g$p>g7gfc)$;9^WW3Ogbub6g_4!RHmk(PC!DGAb)%BFZy|9B-n^^-QS{i6h7ES4ZFw{mvUwGdlkv(jHOf!)PFigFDy`J%H(8gg1H3q%_j zxlYeWrxPCMZK@k&$M{mvbE!Yw_h&^N)(k_YB=_^|PixbWh|t_$n@K**E~H~@LM#7p zGKVZlNiHSG=7+u_V8Y*=XQBT4|M{Vnj9OV literal 153982 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�gGW~HF$<3%kK?FIPkDe+x;HWM?D`yP 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
    ={+(ydOgs5 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 | MAX integer, such as `9223372036854775807` | `80` -`server.cpu_profile.interval` | The period of time after which the [high-water mark](#high-water-mark-threshold) resets to the baseline value. | `5m0s` (5 minutes) | `1m40s` (100 seconds) -`server.cpu_profile.duration` | The length of time a CPU profile is taken. | `10s` (10 seconds) | `1s` or `2s` -`server.cpu_profile.total_dump_size_limit` | Maximum combined disk size for preserving CPU profiles. | `128 MiB` (128 Mebibytes) | - -### Enabling automatic CPU profile capture - -To enable automatic CPU profile capture, you must [set]({% link {{ page.version.version }}/set-cluster-setting.md %}) `server.cpu_profile.cpu_usage_combined_threshold` to a value between `0` and `100`. Preferably, use the [recommended value](#recommended-values). - -### Recommended values +Cluster Setting | Description | Default Value +----------------|-------------|--------------- +`server.cpu_profile.cpu_usage_combined_threshold` | The baseline threshold of CPU usage at which a CPU profile is taken from a node. This value is a percentage.
    • If a value of `0` is set, a profile is taken every time the `server.cpu_profile.interval` has passed or the provided usage is increasing.
    • If a value greater than `0` and less than or equal to `100` is set, the profiler is enabled (default)
    • If a value greater than `100` is set, the profiler is disabled.
    | `65` +`server.cpu_profile.interval` | The period of time after which the [high-water mark](#high-water-mark-threshold) resets to the baseline value. | `20m0s` (20 minutes) +`server.cpu_profile.duration` | The length of time a CPU profile is taken. | `10s` (10 seconds) +`server.cpu_profile.total_dump_size_limit` | Maximum combined disk size for preserving CPU profiles. | `128 MiB` (128 Mebibytes) -- Set `server.cpu_profile.cpu_usage_combined_threshold` to `80` for 80%. -- Set `server.cpu_profile.duration` to a lower value, for example `1s` or `2s`. This minimizes the impact of [overhead](#overhead) on your cluster compared to the current default value. -- Set `server.cpu_profile.interval` to a lower value, for example `1m40s` (1 minute 40 seconds). - -### High-water mark threshold +## High-water mark threshold The Automatic CPU Profiler runs asynchronously in the background. After every second, the Automatic CPU Profiler checks if the CPU usage exceeds the high-water mark threshold. If so, it captures a CPU profile. If a profile capture is already in progress, a second profile is not taken. -The Automatic CPU Profiler uses the configuration options to determine the high-water mark threshold. For example, with `duration` set to `2s` , `interval` set to `1m40s`, and `cpu_usage_combined_threshold` set to `80`: +The Automatic CPU Profiler uses the configuration options to determine the high-water mark threshold. For example, with `duration` set to `10s` , `interval` set to `20m0s`, and `cpu_usage_combined_threshold` set to `65`: -- At `time0` the CPU usage polled is 82 percent which exceeds the baseline threshold of `80`, so a `2s` profile is captured and the high-water mark threshold becomes `82`. -- After the `2s` profile capture, the Automatic CPU Profiler continues to check every second if the CPU usage now exceeds `82` percent. -- At `time1` the CPU usage polled is 85 percent, another profile is taken for `2s` and the high-water mark threshold becomes `85`. -- At `time2`, the `1m40s` interval after `time0`, the high-water mark threshold is reset to the baseline threshold of `80`. -- The Automatic CPU Profiler continues its every second polling and captures profiles when CPU usage exceeds the high-water mark threshold beginning at the `80` percent baseline. +- At `time0` the CPU usage polled is `70` percent. This exceeds the baseline threshold of `65`, so a `10s` profile is captured and the high-water mark threshold becomes `70`. +- After the `10s` profile capture, the Automatic CPU Profiler continues to check every second if the CPU usage now exceeds `70` percent. +- At `time1` the CPU usage polled is `80` percent, another profile is taken for `10s`, and the high-water mark threshold becomes `80`. +- At `time2`, the `20m0s` interval after `time0`, the high-water mark threshold is reset to the baseline threshold of `65`. +- The Automatic CPU Profiler continues to poll every second, and captures a profile whenever CPU usage exceeds the high-water mark threshold. ## Accessing CPU profiles @@ -55,19 +41,7 @@ The Automatic CPU Profiler uses the configuration options to determine the high- Enabling the automatic CPU profile capture on a cluster will add overhead to the cluster in the form of potential increases in latency and CPU usage. -{{site.data.alerts.callout_info}} -The decision to enable this feature should be done when advised by the [Cockroach Labs support team]({% link {{ page.version.version }}/support-resources.md %}). -{{site.data.alerts.end}} - - Monitor the following metrics: - [P99 latency]({% link {{ page.version.version }}/ui-sql-dashboard.md %}#service-latency-sql-99th-percentile) - P50 latency by creating a [custom chart]({% link {{ page.version.version }}/ui-custom-chart-debug-page.md %}) for the `sql.exec.latency-p50` metric - [CPU usage]({% link {{ page.version.version }}/ui-hardware-dashboard.md %}#cpu-percent) -- We anticipate a sub-10% regression on these foreground latency metrics. This overhead to your cluster may be deemed acceptable in order to collect CPU profiles that are necessary to troubleshoot problems in your cluster. Please consult with Cockroach Labs Support. -- Overhead only occurs during profile capture, not when it is idle. If the cluster can tolerate a `server.cpu_profile.duration` (for example, 1 second) increase in latency to capture the CPU profile, consider enabling the Automatic CPU Profiler. - -{{site.data.alerts.callout_danger}} -Do not have the Automatic CPU Profiler enabled by default. - -If you enabled the Automatic CPU Profiler and then notice unacceptable overhead to your cluster, we recommend you immediately disable the Automatic CPU Profiler. -{{site.data.alerts.end}} From df17963ae18ffd68c8f8e26467f1a077c16e8657 Mon Sep 17 00:00:00 2001 From: Kathryn Hancox <44557882+kathancox@users.noreply.github.com> Date: Tue, 30 Apr 2024 14:55:16 -0400 Subject: [PATCH 07/25] Add docs for session/cluster/table cdc filtering for row-level ttl v23.2 & v24.1 (#18496) --- .../releases/v24.1/v24.1.0-alpha.1.md | 2 +- .../releases/v24.1/v24.1.0-alpha.4.md | 20 +++++++------- .../v23.2/cdc/disable-replication-ttl.md | 1 + .../_includes/v23.2/misc/session-vars.md | 1 + .../v24.1/cdc/disable-replication-ttl.md | 26 +++++++++++++++++++ .../_includes/v24.1/misc/session-vars.md | 1 + src/current/v23.2/changefeed-messages.md | 26 +++++++++++++++++++ src/current/v23.2/row-level-ttl.md | 4 ++- src/current/v24.1/changefeed-messages.md | 26 +++++++++++++++++++ src/current/v24.1/create-changefeed.md | 7 +++++ src/current/v24.1/row-level-ttl.md | 7 ++++- 11 files changed, 108 insertions(+), 13 deletions(-) create mode 100644 src/current/_includes/v23.2/cdc/disable-replication-ttl.md create mode 100644 src/current/_includes/v24.1/cdc/disable-replication-ttl.md diff --git a/src/current/_includes/releases/v24.1/v24.1.0-alpha.1.md b/src/current/_includes/releases/v24.1/v24.1.0-alpha.1.md index 0a81af5176b..2ef2e4e9721 100644 --- a/src/current/_includes/releases/v24.1/v24.1.0-alpha.1.md +++ b/src/current/_includes/releases/v24.1/v24.1.0-alpha.1.md @@ -64,7 +64,7 @@ Release Date: March 7, 2024 - `OUT` and `INOUT` parameter classes are now supported in [user-defined functions]({% link v23.2/user-defined-functions.md %}). [#118610][#118610] - Out-of-process SQL servers will now start exporting a new `sql.aggregated_livebytes` [metric]({% link v23.2/metrics.md %}). This metric gets updated once every 60 seconds by default, and its update interval can be configured via the `tenant_global_metrics_exporter_interval` [cluster setting]({% link v23.2/cluster-settings.md %}). [#119140][#119140] - Added support for index hints with [`INSERT`]({% link v23.2/insert.md %}) and [`UPSERT`]({% link v23.2/upsert.md %}) statements. This allows `INSERT ... ON CONFLICT` and `UPSERT` queries to use index hints in the same way they are already supported for [`UPDATE`]({% link v23.2/update.md %}) and [`DELETE`]({% link v23.2/delete.md %}) statements. [#119104][#119104] -- Added a new `ttl_disable_changefeed_replication` table storage parameter that can be used to disable changefeed replication for [row-level TTL]({% link v23.2/row-level-ttl.md %}) on a per-table basis. [#119611][#119611] +- Added a new [`ttl_disable_changefeed_replication`]({% link v24.1/row-level-ttl.md %}#filter-changefeeds-for-tables-using-row-level-ttl) table storage parameter that can be used to disable changefeed replication for [row-level TTL]({% link v23.2/row-level-ttl.md %}) on a per-table basis. [#119611][#119611]

    Operational changes

    diff --git a/src/current/_includes/releases/v24.1/v24.1.0-alpha.4.md b/src/current/_includes/releases/v24.1/v24.1.0-alpha.4.md index ece44ea0cf8..bfea86439dc 100644 --- a/src/current/_includes/releases/v24.1/v24.1.0-alpha.4.md +++ b/src/current/_includes/releases/v24.1/v24.1.0-alpha.4.md @@ -10,15 +10,15 @@ Release Date: March 25, 2024

    General changes

    -- The following [metrics](../v24.1/metrics.html) were added for observability of per-store disk events: - - `storage.disk.read.count` - - `storage.disk.read.bytes` - - `storage.disk.read.time` - - `storage.disk.write.count` - - `storage.disk.write.bytes` - - `storage.disk.write.time` - - `storage.disk.io.time` - - `storage.disk.weightedio.time` +- The following [metrics](../v24.1/metrics.html) were added for observability of per-store disk events: + - `storage.disk.read.count` + - `storage.disk.read.bytes` + - `storage.disk.read.time` + - `storage.disk.write.count` + - `storage.disk.write.bytes` + - `storage.disk.write.time` + - `storage.disk.io.time` + - `storage.disk.weightedio.time` - `storage.disk.iopsinprogress` The metrics match the definitions of the `sys.host.disk.*` system metrics. [#119885][#119885] @@ -27,7 +27,7 @@ Release Date: March 25, 2024 - `server.controller.default_target_cluster` can now be set to any virtual cluster name by default, including a virtual cluster yet to be created or have service started. [#120080][#120080] - The [`READ COMMITTED`](../v24.1/read-committed.html) isolation level now requires the cluster to have a valid enterprise license. [#120154][#120154] -- The new boolean changefeed option `ignore_disable_changefeed_replication`, when set to `true`, prevents the changefeed from filtering events even if CDC filtering is configured via the `disable_changefeed_replication` [session variable](../v24.1/session-variables.html), `sql.ttl.changefeed_replication.disabled` [cluster setting](../v24.1/cluster-settings.html), or the `ttl_disable_changefeed_replication` [table storage parameter](../v24.1/alter-table.html#table-storage-parameters). [#120255][#120255] +- The new boolean changefeed option [`ignore_disable_changefeed_replication`](../v24.1/create-changefeed.html#ignore-disable-changefeed), when set to `true`, prevents the changefeed from filtering events even if CDC filtering is configured via the `disable_changefeed_replication` [session variable](../v24.1/session-variables.html), `sql.ttl.changefeed_replication.disabled` [cluster setting](../v24.1/cluster-settings.html), or the `ttl_disable_changefeed_replication` [table storage parameter](../v24.1/alter-table.html#table-storage-parameters). [#120255][#120255]

    SQL language changes

    diff --git a/src/current/_includes/v23.2/cdc/disable-replication-ttl.md b/src/current/_includes/v23.2/cdc/disable-replication-ttl.md new file mode 100644 index 00000000000..44f71135ac5 --- /dev/null +++ b/src/current/_includes/v23.2/cdc/disable-replication-ttl.md @@ -0,0 +1 @@ +{% include_cached new-in.html version="v23.2" %} To prevent changefeeds from emitting deletes issued by all TTL jobs on a cluster, set the `sql.ttl.changefeed_replication.disabled` [cluster setting]({% link {{ page.version.version }}/cluster-settings.md %}) to `true`. \ No newline at end of file diff --git a/src/current/_includes/v23.2/misc/session-vars.md b/src/current/_includes/v23.2/misc/session-vars.md index a0d4d56b65f..7d978c32894 100644 --- a/src/current/_includes/v23.2/misc/session-vars.md +++ b/src/current/_includes/v23.2/misc/session-vars.md @@ -15,6 +15,7 @@ |
    `default_transaction_quality_of_service` | The default transaction quality of service for the current session. The supported options are `regular`, `critical`, and `background`. See [Set quality of service level]({% link {{ page.version.version }}/admission-control.md %}#set-quality-of-service-level-for-a-session). | `regular` | Yes | Yes | | `default_transaction_read_only` | The default transaction access mode for the current session.
    If set to `on`, only read operations are allowed in transactions in the current session; if set to `off`, both read and write operations are allowed. See [`SET TRANSACTION`]({% link {{ page.version.version }}/set-transaction.md %}) for more details. | `off` | Yes | Yes | | `default_transaction_use_follower_reads` | If set to on, all read-only transactions use [`AS OF SYSTEM TIME follower_read_timestamp()`]({% link {{ page.version.version }}/as-of-system-time.md %}) to allow the transaction to use follower reads.
    If set to `off`, read-only transactions will only use follower reads if an `AS OF SYSTEM TIME` clause is specified in the statement, with an interval of at least 4.8 seconds. | `off` | Yes | Yes | +| `disable_changefeed_replication` | When `true`, [changefeeds]({% link {{ page.version.version }}/changefeed-messages.md %}#filtering-changefeed-messages) will not emit messages for any changes (e.g., `INSERT`, `UPDATE`) issued to watched tables during that session. | `false` | Yes | Yes | | `disallow_full_table_scans` | If set to `on`, queries on "large" tables with a row count greater than [`large_full_scan_rows`](#large-full-scan-rows) will not use full table or index scans. If no other query plan is possible, queries will return an error message. This setting does not apply to internal queries, which may plan full table or index scans without checking the session variable. | `off` | Yes | Yes | | `distsql` | The query distribution mode for the session. By default, CockroachDB determines which queries are faster to execute if distributed across multiple nodes, and all other queries are run through the gateway node. | `auto` | Yes | Yes | | `enable_auto_rehoming` | When enabled, the [home regions]({% link {{ page.version.version }}/alter-table.md %}#crdb_region) of rows in [`REGIONAL BY ROW`]({% link {{ page.version.version }}/alter-table.md %}#set-the-table-locality-to-regional-by-row) tables are automatically set to the region of the [gateway node]({% link {{ page.version.version }}/ui-sessions-page.md %}#session-details-gateway-node) from which any [`UPDATE`]({% link {{ page.version.version }}/update.md %}) or [`UPSERT`]({% link {{ page.version.version }}/upsert.md %}) statements that operate on those rows originate. | `off` | Yes | Yes | diff --git a/src/current/_includes/v24.1/cdc/disable-replication-ttl.md b/src/current/_includes/v24.1/cdc/disable-replication-ttl.md new file mode 100644 index 00000000000..27b658a747a --- /dev/null +++ b/src/current/_includes/v24.1/cdc/disable-replication-ttl.md @@ -0,0 +1,26 @@ +{% include_cached new-in.html version="v24.1" %} Use the `ttl_disable_changefeed_replication` table storage parameter to prevent changefeeds from sending `DELETE` messages issued by row-level TTL jobs for a table. Include the storage parameter when you create or alter the table. For example: + +{% include_cached copy-clipboard.html %} +~~~ sql +CREATE TABLE tbl ( + id UUID PRIMARY KEY default gen_random_uuid(), + value TEXT +) WITH (ttl_expire_after = '3 weeks', ttl_job_cron = '@daily', ttl_disable_changefeed_replication = 'true'); +~~~ + +{% include_cached copy-clipboard.html %} +~~~ sql +ALTER TABLE events SET (ttl_expire_after = '1 year', ttl_disable_changefeed_replication = 'true'); +~~~ + +You can also widen the scope to the cluster by setting the `sql.ttl.changefeed_replication.disabled` [cluster setting]({% link {{ page.version.version }}/cluster-settings.md %}) to `true`. This will prevent changefeeds from emitting deletes issued by all TTL jobs on a cluster. + +If you want to have a changefeed ignore the storage parameter or cluster setting that disables changefeed replication, you can set the changefeed option `ignore_disable_changefeed_replication` to `true`: + +{% include_cached copy-clipboard.html %} +~~~ sql +CREATE CHANGEFEED FOR TABLE table_name INTO 'external://changefeed-sink' + WITH resolved, ignore_disable_changefeed_replication = true; +~~~ + +This is useful when you have multiple use cases for different changefeeds on the same table. For example, you have a table with a changefeed streaming changes to another database for analytics workflows in which you do not want to reflect row-level TTL deletes. Secondly, you have a changefeed on the same table for audit-logging purposes for which you need to persist every change through the changefeed. \ No newline at end of file diff --git a/src/current/_includes/v24.1/misc/session-vars.md b/src/current/_includes/v24.1/misc/session-vars.md index 8659c3e3c91..4ba32c59e3e 100644 --- a/src/current/_includes/v24.1/misc/session-vars.md +++ b/src/current/_includes/v24.1/misc/session-vars.md @@ -16,6 +16,7 @@ | `default_transaction_quality_of_service` | The default transaction quality of service for the current session. The supported options are `regular`, `critical`, and `background`. See [Set quality of service level]({% link {{ page.version.version }}/admission-control.md %}#set-quality-of-service-level-for-a-session). | `regular` | Yes | Yes | | `default_transaction_read_only` | The default transaction access mode for the current session.
    If set to `on`, only read operations are allowed in transactions in the current session; if set to `off`, both read and write operations are allowed. See [`SET TRANSACTION`]({% link {{ page.version.version }}/set-transaction.md %}) for more details. | `off` | Yes | Yes | | `default_transaction_use_follower_reads` | If set to on, all read-only transactions use [`AS OF SYSTEM TIME follower_read_timestamp()`]({% link {{ page.version.version }}/as-of-system-time.md %}) to allow the transaction to use follower reads.
    If set to `off`, read-only transactions will only use follower reads if an `AS OF SYSTEM TIME` clause is specified in the statement, with an interval of at least 4.8 seconds. | `off` | Yes | Yes | +| `disable_changefeed_replication` | When `true`, [changefeeds]({% link {{ page.version.version }}/changefeed-messages.md %}#filtering-changefeed-messages) will not emit messages for any changes (e.g., `INSERT`, `UPDATE`) issued to watched tables during that session. | `false` | Yes | Yes | | `disallow_full_table_scans` | If set to `on`, queries on "large" tables with a row count greater than [`large_full_scan_rows`](#large-full-scan-rows) will not use full table or index scans. If no other query plan is possible, queries will return an error message. This setting does not apply to internal queries, which may plan full table or index scans without checking the session variable. | `off` | Yes | Yes || `distsql` | The query distribution mode for the session. By default, CockroachDB determines which queries are faster to execute if distributed across multiple nodes, and all other queries are run through the gateway node. | `auto` | Yes | Yes | | `enable_auto_rehoming` | When enabled, the [home regions]({% link {{ page.version.version }}/alter-table.md %}#crdb_region) of rows in [`REGIONAL BY ROW`]({% link {{ page.version.version }}/alter-table.md %}#set-the-table-locality-to-regional-by-row) tables are automatically set to the region of the [gateway node]({% link {{ page.version.version }}/ui-sessions-page.md %}#session-details-gateway-node) from which any [`UPDATE`]({% link {{ page.version.version }}/update.md %}) or [`UPSERT`]({% link {{ page.version.version }}/upsert.md %}) statements that operate on those rows originate. | `off` | Yes | Yes | | `enable_durable_locking_for_serializable` | Indicates whether CockroachDB replicates [`FOR UPDATE` and `FOR SHARE`]({% link {{ page.version.version }}/select-for-update.md %}#lock-strengths) locks via [Raft]({% link {{ page.version.version }}/architecture/replication-layer.md %}#raft), allowing locks to be preserved when leases are transferred. Note that replicating `FOR UPDATE` and `FOR SHARE` locks will add latency to those statements. This setting only affects `SERIALIZABLE` transactions and matches the default `READ COMMITTED` behavior when enabled. | `off` | Yes | Yes | diff --git a/src/current/v23.2/changefeed-messages.md b/src/current/v23.2/changefeed-messages.md index 9edddc161cb..57af36ec66b 100644 --- a/src/current/v23.2/changefeed-messages.md +++ b/src/current/v23.2/changefeed-messages.md @@ -17,6 +17,7 @@ This page describes the format and behavior of changefeed messages. You will fin - [Resolved messages](#resolved-messages): The resolved timestamp option and how to configure it. - [Duplicate messages](#duplicate-messages): The causes of duplicate messages from a changefeed. - [Schema changes](#schema-changes): The effect of schema changes on a changefeed. +- [Filtering changefeed messages](#filtering-changefeed-messages): The settings and syntax to prevent and filter the messages that changefeeds emit. - [Message formats](#message-formats): The limitations and type mapping when creating a changefeed with different message formats. {{site.data.alerts.callout_info}} @@ -478,6 +479,31 @@ Refer to the [`CREATE CHANGEFEED` option table]({% link {{ page.version.version {% include {{ page.version.version }}/cdc/virtual-computed-column-cdc.md %} {{site.data.alerts.end}} +## Filtering changefeed messages + +There are several ways to define messages, filter different types of message, or prevent all changefeed messages from emitting to the sink. The following sections outline configurable settings and SQL syntax to handle different use cases. + +### Prevent changefeeds from emitting row-level TTL deletes + +{% include_cached new-in.html version="v23.2" %} To prevent changefeeds from emitting deletes issued by all [TTL jobs]({% link {{ page.version.version }}/row-level-ttl.md %}) on a cluster, set the `sql.ttl.changefeed_replication.disabled` [cluster setting]({% link {{ page.version.version }}/cluster-settings.md %}) to `true`. + +### Disable changefeeds from emitting messages + +{% include_cached new-in.html version="v23.2" %} To prevent changefeeds from emitting messages for any changes (e.g., `INSERT`, `UPDATE`) issued to watched tables during that session, set the `disable_changefeed_replication` [session variable]({% link {{ page.version.version }}/session-variables.md %}) to `true`. + +### Define the change data emitted to a sink + +When you create a changefeed, use change data capture queries to define the change data emitted to your sink. + +For example: + +{% include_cached copy-clipboard.html %} +~~~ sql +CREATE CHANGEFEED INTO 'scheme://sink-URI' WITH updated AS SELECT column, column FROM table; +~~~ + +For details on syntax and examples, refer to the [Change Data Capture Queries]({% link {{ page.version.version }}/cdc-queries.md %}) page. + ## Message formats {% include {{ page.version.version }}/cdc/message-format-list.md %} diff --git a/src/current/v23.2/row-level-ttl.md b/src/current/v23.2/row-level-ttl.md index 228b8464162..a6278c4f231 100644 --- a/src/current/v23.2/row-level-ttl.md +++ b/src/current/v23.2/row-level-ttl.md @@ -135,7 +135,7 @@ SHOW CREATE TABLE ttl_test_per_table; The settings that control the behavior of Row-Level TTL are provided using [storage parameters]({% link {{ page.version.version }}/sql-grammar.md %}#opt_with_storage_parameter_list). These parameters can be set during table creation using [`CREATE TABLE`](#create-a-table-with-a-ttl_expiration_expression), added to an existing table using the [`ALTER TABLE`](#add-or-update-the-row-level-ttl-for-an-existing-table) statement, or [reset to default values](#reset-a-storage-parameter-to-its-default-value). -| Description | Option | Associated cluster setting | +| Option | Description | Associated cluster setting | |----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------| | `ttl_expiration_expression` | **Recommended in v22.2+**. SQL expression that defines the TTL expiration. Must evaluate to a [`TIMESTAMPTZ`]({% link {{ page.version.version }}/timestamp.md %}). This and/or [`ttl_expire_after`](#param-ttl-expire-after) are required to enable TTL. This parameter is useful when you want to set the TTL for individual rows in the table. For an example, see [Create a table with a `ttl_expiration_expression`](#create-a-table-with-a-ttl_expiration_expression). | N/A | | `ttl_expire_after` | The [interval]({% link {{ page.version.version }}/interval.md %}) when a TTL will expire. This and/or [`ttl_expiration_expression`](#param-ttl-expiration-expression) are required to enable TTL. Minimum value: `'1 microsecond'`. | N/A | @@ -556,6 +556,8 @@ Row-level TTL interacts with [changefeeds]({% link {{ page.version.version }}/cr - When expired rows are deleted, a [changefeed delete message]({% link {{ page.version.version }}/changefeed-messages.md %}#delete-messages) is emitted. +{% include {{ page.version.version }}/cdc/disable-replication-ttl.md %} + For guidance on how to filter changefeed messages to emit row-level TTL deletes only, refer to [Change Data Capture Queries]({% link {{ page.version.version }}/cdc-queries.md %}#reference-ttl-in-a-cdc-query). ## Backup and restore diff --git a/src/current/v24.1/changefeed-messages.md b/src/current/v24.1/changefeed-messages.md index 489481a3142..67492e0b81e 100644 --- a/src/current/v24.1/changefeed-messages.md +++ b/src/current/v24.1/changefeed-messages.md @@ -17,6 +17,7 @@ This page describes the format and behavior of changefeed messages. You will fin - [Resolved messages](#resolved-messages): The resolved timestamp option and how to configure it. - [Duplicate messages](#duplicate-messages): The causes of duplicate messages from a changefeed. - [Schema changes](#schema-changes): The effect of schema changes on a changefeed. +- [Filtering changefeed messages](#filtering-changefeed-messages): The settings and syntax to prevent and filter the messages that changefeeds emit. - [Message formats](#message-formats): The limitations and type mapping when creating a changefeed with different message formats. {{site.data.alerts.callout_info}} @@ -478,6 +479,31 @@ Refer to the [`CREATE CHANGEFEED` option table]({% link {{ page.version.version {% include {{ page.version.version }}/cdc/virtual-computed-column-cdc.md %} {{site.data.alerts.end}} +## Filtering changefeed messages + +There are several ways to define messages, filter different types of message, or prevent all changefeed messages from emitting to the sink. The following sections outline configurable settings and SQL syntax to handle different use cases. + +### Prevent changefeeds from emitting row-level TTL deletes + +{% include {{ page.version.version }}/cdc/disable-replication-ttl.md %} + +### Disable changefeeds from emitting messages + +To prevent changefeeds from emitting messages for any changes (e.g., `INSERT`, `UPDATE`) issued to watched tables during that session, set the `disable_changefeed_replication` [session variable]({% link {{ page.version.version }}/session-variables.md %}) to `true`. + +### Define the change data emitted to a sink + +When you create a changefeed, use change data capture queries to define the change data emitted to your sink. + +For example: + +{% include_cached copy-clipboard.html %} +~~~ sql +CREATE CHANGEFEED INTO 'scheme://sink-URI' WITH updated AS SELECT column, column FROM table; +~~~ + +For details on syntax and examples, refer to the [Change Data Capture Queries]({% link {{ page.version.version }}/cdc-queries.md %}) page. + ## Message formats {% include {{ page.version.version }}/cdc/message-format-list.md %} diff --git a/src/current/v24.1/create-changefeed.md b/src/current/v24.1/create-changefeed.md index 99884b4a267..6a084278824 100644 --- a/src/current/v24.1/create-changefeed.md +++ b/src/current/v24.1/create-changefeed.md @@ -175,6 +175,7 @@ Option | Value | Description `format` | `json` / `avro` / `csv` / `parquet` | Format of the emitted message.

    `avro`: For mappings of CockroachDB types to Avro types, [refer to the table]({% link {{ page.version.version }}/changefeed-messages.md %}#avro-types) and detail on [Avro limitations]({% link {{ page.version.version }}/changefeed-messages.md %}#avro-limitations). **Note:** [`confluent_schema_registry`](#confluent-registry) is required with `format=avro`.

    `csv`: You cannot combine `format=csv` with the [`diff`](#diff-opt) or [`resolved`](#resolved-option) options. Changefeeds use the same CSV format as the [`EXPORT`](export.html) statement. Refer to [Export data with changefeeds]({% link {{ page.version.version }}/export-data-with-changefeeds.md %}) for details using these options to create a changefeed as an alternative to `EXPORT`. **Note:** [`initial_scan = 'only'`](#initial-scan) is required with `format=csv`.

    `parquet`: Cloud storage is the only supported sink. The [`topic_in_value`](#topic-in-value) option is not compatible with `parquet` format.

    Default: `format=json`. `full_table_name` | N/A | Use fully qualified table name in topics, subjects, schemas, and record output instead of the default table name. This can prevent unintended behavior when the same table name is present in multiple databases.

    **Note:** This option cannot modify existing table names used as topics, subjects, etc., as part of an [`ALTER CHANGEFEED`]({% link {{ page.version.version }}/alter-changefeed.md %}) statement. To modify a topic, subject, etc., to use a fully qualified table name, create a new changefeed with this option.

    Example: `CREATE CHANGEFEED FOR foo... WITH full_table_name` will create the topic name `defaultdb.public.foo` instead of `foo`. `gc_protect_expires_after` | [Duration string](https://pkg.go.dev/time#ParseDuration) | Automatically expires protected timestamp records that are older than the defined duration. In the case where a changefeed job remains paused, `gc_protect_expires_after` will trigger the underlying protected timestamp record to expire and cancel the changefeed job to prevent accumulation of protected data.

    Refer to [Protect Changefeed Data from Garbage Collection]({% link {{ page.version.version }}/protect-changefeed-data.md %}) for more detail on protecting changefeed data. +New in v24.1:`ignore_disable_changefeed_replication` | [`BOOL`]({% link {{ page.version.version }}/bool.md %}) | When set to `true`, the changefeed **will emit** events even if CDC filtering for TTL jobs is configured using the `disable_changefeed_replication` [session variable]({% link {{ page.version.version }}/set-vars.md %}), `sql.ttl.changefeed_replication.disabled` [cluster setting]({% link {{ page.version.version }}/cluster-settings.md %}), or the `ttl_disable_changefeed_replication` [table storage parameter]({% link {{ page.version.version }}/row-level-ttl.md %}).

    Refer to [Filter changefeeds for tables using TTL](#filter-changefeeds-for-tables-using-row-level-ttl) for usage details. `initial_scan` | `yes`/`no`/`only` | Control whether or not an initial scan will occur at the start time of a changefeed. Only one `initial_scan` option (`yes`, `no`, or `only`) can be used. If none of these are set, an initial scan will occur if there is no [`cursor`](#cursor-option), and will not occur if there is one. This preserves the behavior from previous releases. With `initial_scan = 'only'` set, the changefeed job will end with a successful status (`succeeded`) after the initial scan completes. You cannot specify `yes`, `no`, `only` simultaneously.

    If used in conjunction with `cursor`, an initial scan will be performed at the cursor timestamp. If no `cursor` is specified, the initial scan is performed at `now()`.

    Although the [`initial_scan` / `no_initial_scan`](https://www.cockroachlabs.com/docs/v21.2/create-changefeed#initial-scan) syntax from previous versions is still supported, you cannot combine the previous and current syntax.

    Default: `initial_scan = 'yes'` `kafka_sink_config` | [`STRING`]({% link {{ page.version.version }}/string.md %}) | Set fields to configure the required level of message acknowledgement from the Kafka server, the version of the server, and batching parameters for Kafka sinks. Set the message file compression type. See [Kafka sink configuration]({% link {{ page.version.version }}/changefeed-sinks.md %}#kafka-sink-configuration) for more detail on configuring all the available fields for this option.

    Example: `CREATE CHANGEFEED FOR table INTO 'kafka://localhost:9092' WITH kafka_sink_config='{"Flush": {"MaxMessages": 1, "Frequency": "1s"}, "RequiredAcks": "ONE"}'` `key_column` | `'column'` | Override the key used in [message metadata]({% link {{ page.version.version }}/changefeed-messages.md %}). This changes the key hashed to determine downstream partitions. In sinks that support partitioning by message, CockroachDB uses the [32-bit FNV-1a](https://wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function) hashing algorithm to determine which partition to send to.

    **Note:** `key_column` does not preserve ordering of messages from CockroachDB to the downstream sink, therefore you must also include the [`unordered`](#unordered) option in your changefeed creation statement. It does not affect per-key [ordering guarantees]({% link {{ page.version.version }}/changefeed-messages.md %}#ordering-and-delivery-guarantees) or the output of [`key_in_value`](#key-in-value).

    See the [Define a key to determine the changefeed sink partition](#define-a-key-to-determine-the-changefeed-sink-partition) example. @@ -343,6 +344,12 @@ CREATE CHANGEFEED FOR TABLE table_name INTO 'external://kafka_sink' WITH resolved; ~~~ +### Filter changefeeds for tables using row-level TTL + +{% include {{ page.version.version }}/cdc/disable-replication-ttl.md %} + +For guidance on how to filter changefeed messages to emit [row-level TTL]({% link {{ page.version.version }}/row-level-ttl.md %}) deletes only, refer to [Change Data Capture Queries]({% link {{ page.version.version }}/cdc-queries.md %}#reference-ttl-in-a-cdc-query). + ### Manage a changefeed For {{ site.data.products.enterprise }} changefeeds, use [`SHOW CHANGEFEED JOBS`]({% link {{ page.version.version }}/show-jobs.md %}) to check the status of your changefeed jobs: diff --git a/src/current/v24.1/row-level-ttl.md b/src/current/v24.1/row-level-ttl.md index 92789afe213..ad82287efb2 100644 --- a/src/current/v24.1/row-level-ttl.md +++ b/src/current/v24.1/row-level-ttl.md @@ -135,7 +135,7 @@ SHOW CREATE TABLE ttl_test_per_table; The settings that control the behavior of Row-Level TTL are provided using [storage parameters]({% link {{ page.version.version }}/sql-grammar.md %}#opt_with_storage_parameter_list). These parameters can be set during table creation using [`CREATE TABLE`](#create-a-table-with-a-ttl_expiration_expression), added to an existing table using the [`ALTER TABLE`](#add-or-update-the-row-level-ttl-for-an-existing-table) statement, or [reset to default values](#reset-a-storage-parameter-to-its-default-value). -| Description | Option | Associated cluster setting | +| Option | Description | Associated cluster setting | |----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------| | `ttl_expiration_expression` | **Recommended in v22.2+**. SQL expression that defines the TTL expiration. Must evaluate to a [`TIMESTAMPTZ`]({% link {{ page.version.version }}/timestamp.md %}). This and/or [`ttl_expire_after`](#param-ttl-expire-after) are required to enable TTL. This parameter is useful when you want to set the TTL for individual rows in the table. For an example, see [Create a table with a `ttl_expiration_expression`](#create-a-table-with-a-ttl_expiration_expression). | N/A | | `ttl_expire_after` | The [interval]({% link {{ page.version.version }}/interval.md %}) when a TTL will expire. This and/or [`ttl_expiration_expression`](#param-ttl-expiration-expression) are required to enable TTL. Minimum value: `'1 microsecond'`. | N/A | @@ -147,6 +147,7 @@ The settings that control the behavior of Row-Level TTL are provided using [stor | `ttl_row_stats_poll_interval` | If set, counts rows and expired rows on the table to report as Prometheus metrics while the TTL job is running. Unset by default, meaning no stats are fetched and reported. | N/A | | `ttl_pause` | If set, stops the TTL job from executing. | N/A | | `ttl_job_cron` | Frequency at which the TTL job runs, specified using [CRON syntax](https://cron.help). Default: `'@daily'` (was `'@hourly'`). | N/A | +| `ttl_disable_changefeed_replication` | New in v24.1: Disables [changefeed]({% link {{ page.version.version }}/change-data-capture-overview.md %}) replication for the deletes performed by the TTL job. | `sql.ttl.changefeed_replication.disabled` | For more information about TTL-related cluster settings, see [View TTL-related cluster settings](#view-ttl-related-cluster-settings). @@ -556,6 +557,10 @@ Row-level TTL interacts with [changefeeds]({% link {{ page.version.version }}/cr - When expired rows are deleted, a [changefeed delete message]({% link {{ page.version.version }}/changefeed-messages.md %}#delete-messages) is emitted. +### Filter changefeeds for tables using row-level TTL + +{% include {{ page.version.version }}/cdc/disable-replication-ttl.md %} + For guidance on how to filter changefeed messages to emit row-level TTL deletes only, refer to [Change Data Capture Queries]({% link {{ page.version.version }}/cdc-queries.md %}#reference-ttl-in-a-cdc-query). ## Backup and restore From 23ddb923ceb028cbf4a1557d3606a89c5603767c Mon Sep 17 00:00:00 2001 From: Rafi Shamim Date: Tue, 30 Apr 2024 16:53:07 -0400 Subject: [PATCH 08/25] DOC-10032 Remove functions from USAGE privilege The USAGE privilege never applied to functions, so it was a bug that it got documented here. --- src/current/_includes/v22.2/sql/privileges.md | 2 +- src/current/_includes/v23.1/sql/privileges.md | 2 +- src/current/_includes/v23.2/sql/privileges.md | 2 +- src/current/_includes/v24.1/sql/privileges.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/current/_includes/v22.2/sql/privileges.md b/src/current/_includes/v22.2/sql/privileges.md index 0e57e08012b..bf3e8066507 100644 --- a/src/current/_includes/v22.2/sql/privileges.md +++ b/src/current/_includes/v22.2/sql/privileges.md @@ -18,7 +18,7 @@ Privilege | Levels | Description `RESTORE` | System, Database | Grants the ability to restore [backups]({% link {{ page.version.version }}/backup-and-restore-overview.md %}) at the system or database level. Refer to `RESTORE` [Required privileges]({% link {{ page.version.version }}/restore.md %}#required-privileges) for more details. `SELECT` | Table, Sequence | Grants the ability to run [selection queries]({% link {{ page.version.version }}/query-data.md %}) at the table or sequence level. `UPDATE` | Table, Sequence | Grants the ability to run [update statements]({% link {{ page.version.version }}/update-data.md %}) at the table or sequence level. -`USAGE` | Function, Schema, Sequence, Type | Grants the ability to use [functions]({% link {{ page.version.version }}/functions-and-operators.md %}), [schemas]({% link {{ page.version.version }}/schema-design-overview.md %}), [sequences]({% link {{ page.version.version }}/create-sequence.md %}), or [user-defined types]({% link {{ page.version.version }}/create-type.md %}). +`USAGE` | Schema, Sequence, Type | Grants the ability to use [schemas]({% link {{ page.version.version }}/schema-design-overview.md %}), [sequences]({% link {{ page.version.version }}/create-sequence.md %}), or [user-defined types]({% link {{ page.version.version }}/create-type.md %}). `VIEWACTIVITY` | System | Grants the ability to view other user's activity statistics of a cluster. `VIEWACTIVITYREDACTED` | System | Grants the ability to view other user's activity statistics, but prevents the role from accessing the statement diagnostics bundle in the DB Console, and viewing some columns in introspection queries that contain data about the cluster. `VIEWCLUSTERMETADATA` | System | Grants the ability to view range information, data distribution, store information, and Raft information. diff --git a/src/current/_includes/v23.1/sql/privileges.md b/src/current/_includes/v23.1/sql/privileges.md index e6d3456e398..23c0193653d 100644 --- a/src/current/_includes/v23.1/sql/privileges.md +++ b/src/current/_includes/v23.1/sql/privileges.md @@ -22,7 +22,7 @@ Privilege | Levels | Description `RESTORE` | System, Database | Grants the ability to restore [backups]({% link {{ page.version.version }}/backup-and-restore-overview.md %}) at the system or database level. Refer to `RESTORE` [Required privileges]({% link {{ page.version.version }}/restore.md %}#required-privileges) for more details. `SELECT` | Table, Sequence | Grants the ability to run [selection queries]({% link {{ page.version.version }}/query-data.md %}) at the table or sequence level. `UPDATE` | Table, Sequence | Grants the ability to run [update statements]({% link {{ page.version.version }}/update-data.md %}) at the table or sequence level. -`USAGE` | Function, Schema, Sequence, Type | Grants the ability to use [functions]({% link {{ page.version.version }}/functions-and-operators.md %}), [schemas]({% link {{ page.version.version }}/schema-design-overview.md %}), [sequences]({% link {{ page.version.version }}/create-sequence.md %}), or [user-defined types]({% link {{ page.version.version }}/create-type.md %}). +`USAGE` | Schema, Sequence, Type | Grants the ability to use [schemas]({% link {{ page.version.version }}/schema-design-overview.md %}), [sequences]({% link {{ page.version.version }}/create-sequence.md %}), or [user-defined types]({% link {{ page.version.version }}/create-type.md %}). `VIEWACTIVITY` | System | Grants the ability to view other user's activity statistics of a cluster. `VIEWACTIVITYREDACTED` | System | Grants the ability to view other user's activity statistics, but prevents the role from accessing the statement diagnostics bundle in the DB Console, and viewing some columns in introspection queries that contain data about the cluster. `VIEWCLUSTERMETADATA` | System | Grants the ability to view range information, data distribution, store information, and Raft information. diff --git a/src/current/_includes/v23.2/sql/privileges.md b/src/current/_includes/v23.2/sql/privileges.md index a3a25489b48..223ce20ad7c 100644 --- a/src/current/_includes/v23.2/sql/privileges.md +++ b/src/current/_includes/v23.2/sql/privileges.md @@ -22,7 +22,7 @@ Privilege | Levels | Description `RESTORE` | System, Database | Grants the ability to restore [backups]({% link {{ page.version.version }}/backup-and-restore-overview.md %}) at the system or database level. Refer to `RESTORE` [Required privileges]({% link {{ page.version.version }}/restore.md %}#required-privileges) for more details. `SELECT` | Table, Sequence | Grants the ability to run [selection queries]({% link {{ page.version.version }}/query-data.md %}) at the table or sequence level. `UPDATE` | Table, Sequence | Grants the ability to run [update statements]({% link {{ page.version.version }}/update-data.md %}) at the table or sequence level. -`USAGE` | Function, Schema, Sequence, Type | Grants the ability to use [functions]({% link {{ page.version.version }}/functions-and-operators.md %}), [schemas]({% link {{ page.version.version }}/schema-design-overview.md %}), [sequences]({% link {{ page.version.version }}/create-sequence.md %}), or [user-defined types]({% link {{ page.version.version }}/create-type.md %}). +`USAGE` | Schema, Sequence, Type | Grants the ability to use [schemas]({% link {{ page.version.version }}/schema-design-overview.md %}), [sequences]({% link {{ page.version.version }}/create-sequence.md %}), or [user-defined types]({% link {{ page.version.version }}/create-type.md %}). `VIEWACTIVITY` | System | Grants the ability to view other user's activity statistics of a cluster. `VIEWACTIVITYREDACTED` | System | Grants the ability to view other user's activity statistics, but prevents the role from accessing the statement diagnostics bundle in the DB Console, and viewing some columns in introspection queries that contain data about the cluster. `VIEWCLUSTERMETADATA` | System | Grants the ability to view range information, data distribution, store information, and Raft information. diff --git a/src/current/_includes/v24.1/sql/privileges.md b/src/current/_includes/v24.1/sql/privileges.md index a3a25489b48..223ce20ad7c 100644 --- a/src/current/_includes/v24.1/sql/privileges.md +++ b/src/current/_includes/v24.1/sql/privileges.md @@ -22,7 +22,7 @@ Privilege | Levels | Description `RESTORE` | System, Database | Grants the ability to restore [backups]({% link {{ page.version.version }}/backup-and-restore-overview.md %}) at the system or database level. Refer to `RESTORE` [Required privileges]({% link {{ page.version.version }}/restore.md %}#required-privileges) for more details. `SELECT` | Table, Sequence | Grants the ability to run [selection queries]({% link {{ page.version.version }}/query-data.md %}) at the table or sequence level. `UPDATE` | Table, Sequence | Grants the ability to run [update statements]({% link {{ page.version.version }}/update-data.md %}) at the table or sequence level. -`USAGE` | Function, Schema, Sequence, Type | Grants the ability to use [functions]({% link {{ page.version.version }}/functions-and-operators.md %}), [schemas]({% link {{ page.version.version }}/schema-design-overview.md %}), [sequences]({% link {{ page.version.version }}/create-sequence.md %}), or [user-defined types]({% link {{ page.version.version }}/create-type.md %}). +`USAGE` | Schema, Sequence, Type | Grants the ability to use [schemas]({% link {{ page.version.version }}/schema-design-overview.md %}), [sequences]({% link {{ page.version.version }}/create-sequence.md %}), or [user-defined types]({% link {{ page.version.version }}/create-type.md %}). `VIEWACTIVITY` | System | Grants the ability to view other user's activity statistics of a cluster. `VIEWACTIVITYREDACTED` | System | Grants the ability to view other user's activity statistics, but prevents the role from accessing the statement diagnostics bundle in the DB Console, and viewing some columns in introspection queries that contain data about the cluster. `VIEWCLUSTERMETADATA` | System | Grants the ability to view range information, data distribution, store information, and Raft information. From b70d369dee51f3e28de38ee5e20161fb149052a5 Mon Sep 17 00:00:00 2001 From: Mike Lewis <76072290+mikeCRL@users.noreply.github.com> Date: Wed, 1 May 2024 13:09:49 -0400 Subject: [PATCH 09/25] Release- and support-related content and data updates for LTS rollout [DOC-9239][DOC-9811][DOC-10129][DOC-5941] (#18500) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Release- and support-related content updates with LTS rollout * v24.1.0 beta.2 Release Notes (#18494) * Initial commit * Edits * removed a non-user-impacting note * Worked on feedback * [DOC-10129] Tooling updates for LTS - Add LTS fields to versions.csv and releases.yml - Add LTS support to Release Support Policy - In v23.1+, convert download buttons to tables, move source to a section - Add LTS support to the message on EOL release pages - Add LTS support to CRDB upgrade pages - Consolidate Releases TOCs * Fix metadata in 23.1.18 * Remove config profile flags from pcr and update responses from show virtual cluster (#18488) * DOC-9892 PR #120490 - ui: show license expiration alert in Db Console (#18501) (1) In ui-overview.md, added a section for License expiration message. (2) In licensing-faqs.md, updated Monitor for license expiry section with a link to the new License expiration message section. * Incorporated David’s feedback. * Incorporated Ryan’s feedback. * DOC-9004 Create a physical cluster replication metrics dashboard page when PCR goes GA (#18489) (1) Added ui-physical-cluster-replication-dashboard.md, moved content from DB Console section of physical-cluster-replication-monitoring.md. (2) In physical-cluster-replication-monitoring.md, ui-overview.md and self-hosted-deployments.json, added links to ui-physical-cluster-replication-dashboard.md. (3) In ui-replication-dashboard.md, added callout regarding ui-physical-cluster-replication-dashboard.md. * Incorporated Kathryn’s feedback. * Incorporated Ryan’s feedback. * Fix logic on upgrade pages * CSS adjustments - Move CSS rules from v23.2.0.md to corestyle.scss - Change os-tabs from an id to a class - Add a class to feature highlight tables in 23.1+ * Fix link to Cloud Support and Upgrade Policy * Fix CSS rules * Add a missing logic branch to unsupported versions include * Improve logic on release support page * Fix bad relative link --------- Co-authored-by: Matt Linville --- src/current/_data/releases.yml | 12 +- src/current/_data/versions.csv | 32 ++-- src/current/_includes/corestyle.scss | 43 ++++- .../new-release-downloads-docker-image.md | 103 +++++++++++ .../release-downloads-docker-image.md | 3 +- .../releases/v23.1/v23.1.0-alpha.1.md | 2 +- .../releases/v23.1/v23.1.0-alpha.2.md | 2 +- .../releases/v23.1/v23.1.0-alpha.3.md | 2 +- .../releases/v23.1/v23.1.0-alpha.4.md | 2 +- .../releases/v23.1/v23.1.0-alpha.5.md | 2 +- .../releases/v23.1/v23.1.0-alpha.6.md | 2 +- .../releases/v23.1/v23.1.0-alpha.7.md | 2 +- .../releases/v23.1/v23.1.0-alpha.8.md | 2 +- .../releases/v23.1/v23.1.0-alpha.9.md | 2 +- .../releases/v23.1/v23.1.0-beta.1.md | 2 +- .../releases/v23.1/v23.1.0-beta.2.md | 2 +- .../releases/v23.1/v23.1.0-beta.3.md | 2 +- .../_includes/releases/v23.1/v23.1.0-rc.1.md | 2 +- .../_includes/releases/v23.1/v23.1.0-rc.2.md | 2 +- .../_includes/releases/v23.1/v23.1.0.md | 6 +- .../_includes/releases/v23.1/v23.1.1.md | 2 +- .../_includes/releases/v23.1/v23.1.10.md | 2 +- .../_includes/releases/v23.1/v23.1.11.md | 2 +- .../_includes/releases/v23.1/v23.1.12.md | 2 +- .../_includes/releases/v23.1/v23.1.13.md | 2 +- .../_includes/releases/v23.1/v23.1.14.md | 22 +-- .../_includes/releases/v23.1/v23.1.15.md | 3 +- .../_includes/releases/v23.1/v23.1.16.md | 2 +- .../_includes/releases/v23.1/v23.1.17.md | 2 +- .../_includes/releases/v23.1/v23.1.18.md | 2 +- .../_includes/releases/v23.1/v23.1.19.md | 2 +- .../_includes/releases/v23.1/v23.1.2.md | 12 +- .../_includes/releases/v23.1/v23.1.3.md | 2 +- .../_includes/releases/v23.1/v23.1.4.md | 2 +- .../_includes/releases/v23.1/v23.1.5.md | 2 +- .../_includes/releases/v23.1/v23.1.6.md | 8 +- .../_includes/releases/v23.1/v23.1.7.md | 2 +- .../_includes/releases/v23.1/v23.1.8.md | 2 +- .../_includes/releases/v23.1/v23.1.9.md | 2 +- .../releases/v23.2/v23.2.0-alpha.1.md | 2 +- .../releases/v23.2/v23.2.0-alpha.2.md | 2 +- .../releases/v23.2/v23.2.0-alpha.3.md | 2 +- .../releases/v23.2/v23.2.0-alpha.4.md | 2 +- .../releases/v23.2/v23.2.0-alpha.5.md | 2 +- .../releases/v23.2/v23.2.0-alpha.6.md | 2 +- .../releases/v23.2/v23.2.0-alpha.7.md | 2 +- .../releases/v23.2/v23.2.0-beta.1.md | 4 +- .../releases/v23.2/v23.2.0-beta.2.md | 2 +- .../releases/v23.2/v23.2.0-beta.3.md | 2 +- .../_includes/releases/v23.2/v23.2.0-rc.1.md | 2 +- .../_includes/releases/v23.2/v23.2.0-rc.2.md | 2 +- .../_includes/releases/v23.2/v23.2.0.md | 45 +---- .../_includes/releases/v23.2/v23.2.1.md | 2 +- .../_includes/releases/v23.2/v23.2.2.md | 2 +- .../_includes/releases/v23.2/v23.2.3.md | 4 +- .../_includes/releases/v23.2/v23.2.4.md | 4 +- .../releases/v24.1/v24.1.0-alpha.1.md | 2 +- .../releases/v24.1/v24.1.0-alpha.2.md | 2 +- .../releases/v24.1/v24.1.0-alpha.3.md | 4 +- .../releases/v24.1/v24.1.0-alpha.4.md | 2 +- .../releases/v24.1/v24.1.0-alpha.5.md | 2 +- .../releases/v24.1/v24.1.0-beta.1.md | 2 +- .../releases/v24.1/v24.1.0-beta.2.md | 2 +- .../_includes/sidebar-all-releases.json | 32 +++- src/current/_includes/sidebar-data-v23.2.json | 3 +- src/current/_includes/sidebar-data-v24.1.json | 3 +- src/current/_includes/sidebar-releases.json | 45 +++-- src/current/_includes/unsupported-version.md | 29 ++- .../v23.2/sidebar-data/latest-releases.json | 7 - .../v23.2/sidebar-data/releases.json | 2 +- .../v24.1/sidebar-data/latest-releases.json | 7 - .../v24.1/sidebar-data/releases.json | 4 +- src/current/cockroachcloud/authorization.md | 2 +- src/current/cockroachcloud/ccloud-faq.md | 2 +- src/current/cockroachcloud/cloud-sso-sql.md | 2 +- .../cockroachcloud/cluster-overview-page.md | 2 +- src/current/cockroachcloud/cmek.md | 2 +- .../egress-perimeter-controls.md | 2 +- .../cockroachcloud/sql-audit-logging.md | 2 +- src/current/cockroachcloud/upgrade-policy.md | 39 ++-- src/current/releases/index.md | 42 +++-- .../releases/release-support-policy.md | 173 +++++++++++++++--- src/current/releases/v24.1.md | 2 +- src/current/v22.2/sso-sql.md | 2 +- src/current/v23.1/sso-sql.md | 2 +- .../v23.1/upgrade-cockroach-version.md | 10 +- src/current/v23.2/sso-sql.md | 2 +- .../v23.2/upgrade-cockroach-version.md | 10 +- src/current/v24.1/sso-sql.md | 2 +- .../v24.1/upgrade-cockroach-version.md | 14 +- 90 files changed, 558 insertions(+), 287 deletions(-) create mode 100644 src/current/_includes/releases/new-release-downloads-docker-image.md delete mode 100644 src/current/_includes/v23.2/sidebar-data/latest-releases.json diff --git a/src/current/_data/releases.yml b/src/current/_data/releases.yml index 216aeb7598a..4d07485be3b 100644 --- a/src/current/_data/releases.yml +++ b/src/current/_data/releases.yml @@ -5060,6 +5060,7 @@ major_version: v23.1 release_date: '2023-11-13' release_type: Production + lts: true go_version: go1.21 sha: d7e9824b4cd6ebf7a8548156f2a772ae6648257d has_sql_only: true @@ -5249,6 +5250,7 @@ major_version: v23.1 release_date: '2023-12-11' release_type: Production + lts: true go_version: go1.21 sha: 8d065df26e25a762a1abbbf2b1e475456b341a00 has_sql_only: true @@ -5357,6 +5359,7 @@ major_version: v23.1 release_date: '2024-01-17' release_type: Production + lts: true go_version: go1.21 sha: b95f2225b09cf25f9f2be31ef6a6f65c73a1b081 has_sql_only: true @@ -5472,6 +5475,7 @@ major_version: v23.1 release_date: '2024-02-20' release_type: Production + lts: true go_version: go1.21 sha: 69a32fafce429e5b75dba8f339ea15922286a0ba has_sql_only: true @@ -5526,6 +5530,7 @@ major_version: v23.1 release_date: '2024-02-27' release_type: Production + lts: true go_version: go1.21 sha: 37f75744ac468fe5a97b343a188ea248bce8fb4a has_sql_only: true @@ -5659,6 +5664,7 @@ major_version: v23.1 release_date: '2024-03-19' release_type: Production + lts: true go_version: go1.22.0 sha: d50ccb5a52cdf5a1f41cbb2fa61ef971c65e1346 has_sql_only: true @@ -5767,18 +5773,19 @@ major_version: v23.1 release_date: '2024-04-09' release_type: Production + lts: true go_version: go1.22.0 sha: 84cf36a2a05dcfcf6dfccf4014aad8f703ff6cef has_sql_only: true has_sha256sum: true mac: mac_arm: true - mac_arm_experimental: true + mac_arm_experimental: false mac_arm_limited_access: false windows: true linux: linux_arm: true - linux_arm_experimental: true + linux_arm_experimental: false linux_arm_limited_access: false linux_intel_fips: true linux_arm_fips: false @@ -5848,6 +5855,7 @@ major_version: v23.1 release_date: '2024-04-18' release_type: Production + lts: true go_version: go1.22.0 sha: 1bca2adcbc1deb23067e28369f8b24c99194f2bb has_sql_only: true diff --git a/src/current/_data/versions.csv b/src/current/_data/versions.csv index 3bc76b54574..d0f53f49767 100644 --- a/src/current/_data/versions.csv +++ b/src/current/_data/versions.csv @@ -1,16 +1,16 @@ -major_version,release_date,maint_supp_exp_date,asst_supp_exp_date,previous_version,crdb_branch_name -v1.0,2017-05-10,2018-05-10,2018-11-10,N/A,release-1.0 -v1.1,2017-10-12,2018-10-12,2019-04-12,v1.0,release-1.1 -v2.0,2018-04-04,2019-04-04,2019-10-04,v1.1,release-2.0 -v2.1,2018-10-30,2019-10-30,2020-04-30,v2.0,release-2.1 -v19.1,2019-04-30,2020-04-30,2020-10-30,v2.1,release-19.1 -v19.2,2019-11-12,2020-11-12,2021-05-12,v19.1,release-19.2 -v20.1,2020-05-12,2021-05-12,2021-11-12,v19.2,release-20.1 -v20.2,2020-11-10,2021-11-10,2022-05-10,v20.1,release-20.2 -v21.1,2021-05-18,2022-05-18,2022-11-18,v20.2,release-21.1 -v21.2,2021-11-16,2022-11-16,2023-05-16,v21.1,release-21.2 -v22.1,2022-05-24,2023-05-24,2023-11-24,v21.2,release-22.1 -v22.2,2022-12-05,2023-12-05,2024-06-05,v22.1,release-22.2 -v23.1,2023-05-15,2024-05-15,2024-11-15,v22.2,release-23.1 -v23.2,2024-02-05,2025-02-05,2025-08-05,v23.1,release-23.2 -v24.1,N/A,N/A,N/A,v23.2,release-24.1 +major_version,release_date,maint_supp_exp_date,asst_supp_exp_date,last_ga_patch,initial_lts_patch,initial_lts_release_date,lts_maint_supp_exp_date,lts_asst_supp_exp_date,previous_version,crdb_branch_name +v1.0,2017-05-10,2018-05-10,2018-11-10,N/A,N/A,N/A,N/A,N/A,N/A,release-1.0 +v1.1,2017-10-12,2018-10-12,2019-04-12,N/A,N/A,N/A,N/A,N/A,v1.0,release-1.1 +v2.0,2018-04-04,2019-04-04,2019-10-04,N/A,N/A,N/A,N/A,N/A,v1.1,release-2.0 +v2.1,2018-10-30,2019-10-30,2020-04-30,N/A,N/A,N/A,N/A,N/A,v2.0,release-2.1 +v19.1,2019-04-30,2020-04-30,2020-10-30,N/A,N/A,N/A,N/A,N/A,v2.1,release-19.1 +v19.2,2019-11-12,2020-11-12,2021-05-12,N/A,N/A,N/A,N/A,N/A,v19.1,release-19.2 +v20.1,2020-05-12,2021-05-12,2021-11-12,N/A,N/A,N/A,N/A,N/A,v19.2,release-20.1 +v20.2,2020-11-10,2021-11-10,2022-05-10,N/A,N/A,N/A,N/A,N/A,v20.1,release-20.2 +v21.1,2021-05-18,2022-05-18,2022-11-18,N/A,N/A,N/A,N/A,N/A,v20.2,release-21.1 +v21.2,2021-11-16,2022-11-16,2023-05-16,N/A,N/A,N/A,N/A,N/A,v21.1,release-21.2 +v22.1,2022-05-24,2023-05-24,2023-11-24,N/A,N/A,N/A,N/A,N/A,v21.2,release-22.1 +v22.2,2022-12-05,2023-12-05,2024-06-05,N/A,N/A,N/A,N/A,N/A,v22.1,release-22.2 +v23.1,2023-05-15,2024-05-15,2024-11-15,23.1.11,23.1.12,2023-11-13,2024-11-13,2025-11-13,v22.2,release-23.1 +v23.2,2024-02-05,2025-02-05,2025-08-05,N/A,N/A,N/A,N/A,N/A,v23.1,release-23.2 +v24.1,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A,v23.2,release-24.1 diff --git a/src/current/_includes/corestyle.scss b/src/current/_includes/corestyle.scss index 66220d02726..f9fc8a47611 100644 --- a/src/current/_includes/corestyle.scss +++ b/src/current/_includes/corestyle.scss @@ -63,7 +63,7 @@ h1, h2 { code { background-color: $neutral-100 !important; - color: $neutral-700 !important; + color: $neutral-700 !important; } } @@ -77,7 +77,7 @@ h3, h4, h5, h6 { code { background-color: $neutral-100 !important; - color: $neutral-700 !important; + color: $neutral-700 !important; } } @@ -951,9 +951,46 @@ a.btn-primary { } } +/* Used for feature highlights tables in .0 release pages and for release download tables in v23.1+ */ +div.os-tabs th, +div#feature-highlights th { + background-color: #E6EAF0; +} + +/* Used for feature highlights tables in .0 release pages */ + +div#feature-highlights th, +div#feature-highlights td { + border: none; + padding: 5px; + text-align: left; +} + +div#feature-highlights .center-align { + text-align: center; + vertical-align: middle; +} + +div#feature-highlights .icon-center { + text-align: center; +} + +div#feature-highlights .table-icon { + width: 26px; + border: none; +} + +div#feature-highlights .feature-summary { + font-weight: bold; +} + +div#feature-highlights .feature-description { + margin-top: 5px; +} @media (min-width: 700px) { - #os-tabs { + + .os-tabs { button { &#mac { diff --git a/src/current/_includes/releases/new-release-downloads-docker-image.md b/src/current/_includes/releases/new-release-downloads-docker-image.md new file mode 100644 index 00000000000..95b90d9a2b7 --- /dev/null +++ b/src/current/_includes/releases/new-release-downloads-docker-image.md @@ -0,0 +1,103 @@ +{% comment %}This include is used only in v23.1 and above. Newer versions use release-downloads-docker-image.md. {% endcomment %} +{% assign release = site.data.releases | where_exp: "release", "release.release_name == include.release" | first %} +{% assign version = site.data.versions | where_exp: "version", "version.major_version == release.major_version" | first %} + +

    Downloads

    {% comment %} take the version name, force it to be lowercase, and replace all periods with hyphens. {% endcomment %} + +{% if release.release_type == "Testing" %} +{% include releases/experimental-test-release.md version=release.release_name %} +{% endif %} + +{% if release.withdrawn == true %} +{% include releases/withdrawn.md %} +{% elsif release.cloud_only == true %} {% comment %}Show the Cloud-first info instead of download links {% endcomment %} +{{site.data.alerts.callout_info}} +{{ r.cloud_only_message }} +{{site.data.alerts.end}} +{% else %} + +{{site.data.alerts.callout_info}} +Experimental downloads are not qualified for production use and not eligible for support or uptime SLA commitments, whether they are for testing releases or production releases. +{{site.data.alerts.end}} + +{% comment %}Assign the JS for the experimental download prompt and store it in the Liquid variable experimental_download_js {% endcomment %} + {% capture experimental_download_js %}{% include_cached releases/experimental_download_dialog.md %}{% endcapture %} + {% capture onclick_string %}onclick="{{ experimental_download_js }}"{% endcapture %} + {% capture linux_arm_button_text_addendum %}{% if r.linux.linux_arm_experimental == true %}
    (Experimental){% endif %}{% if r.linux.linux_arm_limited_access == true %}
    (Limited Access){% endif %}{% endcapture %} + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Operating SystemArchitectureFull executableSQL-only executable
    LinuxIntelcockroach-{{ release.release_name }}.linux-amd64.tgz {% if r.has_sha256sum == true %}
    (SHA256){% endif %}
    {% if release.has_sql_only == true %}cockroach-sql-{{ release.release_name }}.linux-amd64.tgz{% if r.has_sha256sum == true %}
    (SHA256){% endif %}{% endif %}
    ARMcockroach-{{ release.release_name }}.linux-arm64.tgz {{linux_arm_button_text_addendum}}{% if r.has_sha256sum == true %}
    (SHA256{% endif %})
    {% if release.has_sql_only == true %}cockroach-sql-{{ release.release_name }}.linux-arm64.tgz {{linux_arm_button_text_addendum}}{% if r.has_sha256sum == true %}
    (SHA256){% endif %}{% endif %}
    Mac
    (Experimental)
    Intelcockroach-{{ release.release_name }}.darwin-10.9-amd64.tgz {% if r.has_sha256sum == true %}
    (SHA256){% endif %}
    {% if release.has_sql_only == true %}cockroach-sql-{{ release.release_name }}.darwin-10.9-amd64.tgz{% if r.has_sha256sum == true %}
    (SHA256){% endif %}{% endif %}
    ARMcockroach-{{ release.release_name }}.darwin-11.0-arm64.tgz{% if r.has_sha256sum == true %}
    (SHA256){% endif %}
    {% if release.has_sql_only == true %}cockroach-sql-{{ release.release_name }}.darwin-11.0-arm64.tgz{% if r.has_sha256sum == true %}
    (SHA256){% endif %}{% endif %}
    Windows
    (Experimental)
    Intelcockroach-{{ release.release_name }}.windows-6.2-amd64.zip{% if r.has_sha256sum == true %}
    (SHA256){% endif %}
    {% if release.has_sql_only == true %}cockroach-sql-{{ release.release_name }}.windows-6.2-amd64.zip{% if r.has_sha256sum == true %}
    (SHA256){% endif %}{% endif %}
    + +

    Docker image

    + + {% if release.docker.docker_arm == true %} +[Multi-platform images](https://docs.docker.com/build/building/multi-platform/) include support for both Intel and ARM. Multi-platform images do not take up additional space on your Docker host. + + {% if release.docker.docker_arm_limited_access == true %} +Within the multi-platform image:
    • The ARM image is in **Limited Access**.
    • The Intel image is **Generally Available** for production use.
    + {% elsif release.docker.docker_arm_experimental == true %} +Within the multi-platform image:
    • The ARM image is **Experimental** and not yet qualified for production use and not eligible for support or uptime SLA commitments.
    • The Intel image is **Generally Available** for production use.
    + {% else %} +Within the multi-platform image, both Intel and ARM images are **generally available** for production use. + {% endif %} + +To download the Docker image: + {% else %} +To download the Docker image (Intel-only): + {% endif %} + +{% include_cached copy-clipboard.html %} +~~~shell +docker pull {{ release.docker.docker_image }}:{{ release.release_name }} +~~~ + +

    Source tag

    + +To view or download the source code for CockroachDB {{ release.release_name }} on Github, visit {{ release.release_name }} source tag. + + {% if release.previous_release %} +

    Changelog

    +View a detailed changelog on GitHub: [{{ release.previous_release }}...{{ release.release_name }}](https://github.com/cockroachdb/cockroach/compare/{{ release.previous_release }}...{{ release.release_name }}) + {% endif %} + +{% endif %} diff --git a/src/current/_includes/releases/release-downloads-docker-image.md b/src/current/_includes/releases/release-downloads-docker-image.md index 14009e925c2..95a811c3d33 100644 --- a/src/current/_includes/releases/release-downloads-docker-image.md +++ b/src/current/_includes/releases/release-downloads-docker-image.md @@ -1,3 +1,4 @@ +{% comment %}This include is used only in v22.2 and below. Older versions use release-downloads-docker-image.md. {% endcomment %} {% assign release = site.data.releases | where_exp: "release", "release.release_name == include.release" | first %} {% assign version = site.data.versions | where_exp: "version", "version.major_version == release.major_version" | first %} @@ -25,7 +26,7 @@ Experimental downloads are not qualified for production use and not eligible for {% capture experimental_download_js %}{% include_cached releases/experimental_download_dialog.md %}{% endcapture %} {% capture onclick_string %}onclick="{{ experimental_download_js }}"{% endcapture %} -
    +
    {% if release.linux.linux_arm == true %} diff --git a/src/current/_includes/releases/v23.1/v23.1.0-alpha.1.md b/src/current/_includes/releases/v23.1/v23.1.0-alpha.1.md index 070fe0c8c31..f9a2115bd85 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-alpha.1.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-alpha.1.md @@ -2,7 +2,7 @@ Release Date: December 19, 2022 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Backward-incompatible changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0-alpha.2.md b/src/current/_includes/releases/v23.1/v23.1.0-alpha.2.md index d8d57276b29..04c3ec774d9 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-alpha.2.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-alpha.2.md @@ -2,7 +2,7 @@ Release Date: February 13, 2022 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Backward-incompatible changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0-alpha.3.md b/src/current/_includes/releases/v23.1/v23.1.0-alpha.3.md index 8c55ea76dc3..b161441e5d7 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-alpha.3.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-alpha.3.md @@ -2,7 +2,7 @@ Release Date: February 21, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    General changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0-alpha.4.md b/src/current/_includes/releases/v23.1/v23.1.0-alpha.4.md index f24b5aba37b..22a5e6e2041 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-alpha.4.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-alpha.4.md @@ -2,7 +2,7 @@ Release Date: February 27, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    {{ site.data.products.enterprise }} edition changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0-alpha.5.md b/src/current/_includes/releases/v23.1/v23.1.0-alpha.5.md index 13fe2eb2e34..b35fd4d8f6c 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-alpha.5.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-alpha.5.md @@ -2,7 +2,7 @@ Release Date: March 6, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0-alpha.6.md b/src/current/_includes/releases/v23.1/v23.1.0-alpha.6.md index f1995ee0e70..8e21d1dae7c 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-alpha.6.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-alpha.6.md @@ -2,7 +2,7 @@ Release Date: March 13, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    SQL language changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0-alpha.7.md b/src/current/_includes/releases/v23.1/v23.1.0-alpha.7.md index 860d65b8c38..7a908a9a498 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-alpha.7.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-alpha.7.md @@ -2,7 +2,7 @@ Release Date: March 20, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0-alpha.8.md b/src/current/_includes/releases/v23.1/v23.1.0-alpha.8.md index 83566d32b54..6617da3f750 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-alpha.8.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-alpha.8.md @@ -2,7 +2,7 @@ Release Date: March 27, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0-alpha.9.md b/src/current/_includes/releases/v23.1/v23.1.0-alpha.9.md index 25ce89f2861..1ec8d1aa96d 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-alpha.9.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-alpha.9.md @@ -2,7 +2,7 @@ Release Date: April 4, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Backward-incompatible changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0-beta.1.md b/src/current/_includes/releases/v23.1/v23.1.0-beta.1.md index d90783f13b3..4f22a1a4601 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-beta.1.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-beta.1.md @@ -2,7 +2,7 @@ Release Date: April 13, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    {{ site.data.products.enterprise }} edition changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0-beta.2.md b/src/current/_includes/releases/v23.1/v23.1.0-beta.2.md index fb77b43fe15..0e47c964ad1 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-beta.2.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-beta.2.md @@ -2,7 +2,7 @@ Release Date: April 17, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    {{ site.data.products.enterprise }} edition changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0-beta.3.md b/src/current/_includes/releases/v23.1/v23.1.0-beta.3.md index cb2d0ba34fc..ac37fbc1402 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-beta.3.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-beta.3.md @@ -2,7 +2,7 @@ Release Date: April 24, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Backward-incompatible changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0-rc.1.md b/src/current/_includes/releases/v23.1/v23.1.0-rc.1.md index d97e46bc2e8..0b41f9eb609 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-rc.1.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-rc.1.md @@ -2,7 +2,7 @@ Release Date: May 2, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    SQL language changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0-rc.2.md b/src/current/_includes/releases/v23.1/v23.1.0-rc.2.md index 9015eab3cc5..8da919350b2 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0-rc.2.md +++ b/src/current/_includes/releases/v23.1/v23.1.0-rc.2.md @@ -2,7 +2,7 @@ Release Date: May 4, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Bug fixes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.0.md b/src/current/_includes/releases/v23.1/v23.1.0.md index 89d652811d9..cd65a6571dc 100644 --- a/src/current/_includes/releases/v23.1/v23.1.0.md +++ b/src/current/_includes/releases/v23.1/v23.1.0.md @@ -4,7 +4,7 @@ Release Date: May 15, 2023 With the release of CockroachDB v23.1, we've added new capabilities in CockroachDB to help you migrate, build, and operate more efficiently. Check out a [summary of the most significant user-facing changes](#v23-1-0-feature-highlights) and then [upgrade to CockroachDB v23.1](https://www.cockroachlabs.com/docs/v23.1/upgrade-cockroach-version). -{% include releases/release-downloads-docker-image.md release=include.release advisory_key="a103220"%} +{% include releases/new-release-downloads-docker-image.md release=include.release advisory_key="a103220"%}

    Feature highlights

    @@ -32,6 +32,8 @@ The features highlighted below are freely available in CockroachDB {{ site.data. } +
    +

    SQL

    Queries
    @@ -429,6 +431,8 @@ This change will only apply to new clusters. Existing clusters will retain the 2 +
    +

    Backward-incompatible changes

    Before [upgrading to CockroachDB v23.1](https://www.cockroachlabs.com/docs/v23.1/upgrade-cockroach-version), be sure to review the following backward-incompatible changes, as well as key cluster setting changes, and adjust your deployment as necessary. diff --git a/src/current/_includes/releases/v23.1/v23.1.1.md b/src/current/_includes/releases/v23.1/v23.1.1.md index 593beea4824..8098b813b27 100644 --- a/src/current/_includes/releases/v23.1/v23.1.1.md +++ b/src/current/_includes/releases/v23.1/v23.1.1.md @@ -2,7 +2,7 @@ Release Date: May 16, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Bug fixes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.10.md b/src/current/_includes/releases/v23.1/v23.1.10.md index fb5db56f9e5..63e6b1f0015 100644 --- a/src/current/_includes/releases/v23.1/v23.1.10.md +++ b/src/current/_includes/releases/v23.1/v23.1.10.md @@ -2,7 +2,7 @@ Release Date: September 18, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Bug fixes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.11.md b/src/current/_includes/releases/v23.1/v23.1.11.md index c888032e31f..cc6ab8d2b3b 100644 --- a/src/current/_includes/releases/v23.1/v23.1.11.md +++ b/src/current/_includes/releases/v23.1/v23.1.11.md @@ -2,7 +2,7 @@ Release Date: October 2, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    SQL language changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.12.md b/src/current/_includes/releases/v23.1/v23.1.12.md index 04d969044aa..f82e0ee773e 100644 --- a/src/current/_includes/releases/v23.1/v23.1.12.md +++ b/src/current/_includes/releases/v23.1/v23.1.12.md @@ -2,7 +2,7 @@ Release Date: November 13, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    diff --git a/src/current/_includes/releases/v23.1/v23.1.13.md b/src/current/_includes/releases/v23.1/v23.1.13.md index d2a14a51091..25745b30199 100644 --- a/src/current/_includes/releases/v23.1/v23.1.13.md +++ b/src/current/_includes/releases/v23.1/v23.1.13.md @@ -2,7 +2,7 @@ Release Date: December 11, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    SQL language changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.14.md b/src/current/_includes/releases/v23.1/v23.1.14.md index a47a633ac6b..546e625a65b 100644 --- a/src/current/_includes/releases/v23.1/v23.1.14.md +++ b/src/current/_includes/releases/v23.1/v23.1.14.md @@ -2,7 +2,7 @@ Release Date: January 17, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    SQL language changes

    @@ -17,16 +17,16 @@ Release Date: January 17, 2024 - The [**Cluster Overview** page](https://www.cockroachlabs.com/docs/v23.1/ui-cluster-overview-page) now correctly renders the background color for email signups, fixing an issue where it was difficult to read the text. [#114546][#114546] - Updated the **CPU Time** label to **SQL CPU Time** on the [Overview page](https://www.cockroachlabs.com/docs/v23.1/ui-overview-dashboard) and clarified the tooltip. [#116448][#116448] -- Fixed an issue where the following `AggHistogram`-powered metrics reported quantiles incorrectly in the [Overview page](https://www.cockroachlabs.com/docs/v23.1/ui-overview-dashboard). The list of affected metrics is: - - `changefeed.message_size_hist` - - `changefeed.parallel_io_queue_nanos` - - `changefeed.sink_batch_hist_nanos` - - `changefeed.flush_hist_nanos` - - `changefeed.commit_latency` - - `changefeed.admit_latency` - - `jobs.row_level_ttl.span_total_duration` - - `jobs.row_level_ttl.select_duration` - - `jobs.row_level_ttl.delete_duration` +- Fixed an issue where the following `AggHistogram`-powered metrics reported quantiles incorrectly in the [Overview page](https://www.cockroachlabs.com/docs/v23.1/ui-overview-dashboard). The list of affected metrics is: + - `changefeed.message_size_hist` + - `changefeed.parallel_io_queue_nanos` + - `changefeed.sink_batch_hist_nanos` + - `changefeed.flush_hist_nanos` + - `changefeed.commit_latency` + - `changefeed.admit_latency` + - `jobs.row_level_ttl.span_total_duration` + - `jobs.row_level_ttl.select_duration` + - `jobs.row_level_ttl.delete_duration` This bug affected only DB Console dashboards and not the Prometheus-compatible endpoint `/_status/vars`. [#114747][#114747] - In the **SQL Activity Transaction Details** page, you can now view a transaction fingerprint ID across multiple applications by passing a comma-separated encoded string of transaction fingerprint IDs in the `appNames` URL search parameter. [#116102][#116102] diff --git a/src/current/_includes/releases/v23.1/v23.1.15.md b/src/current/_includes/releases/v23.1/v23.1.15.md index 2c1ba09eb34..732fcea9b4b 100644 --- a/src/current/_includes/releases/v23.1/v23.1.15.md +++ b/src/current/_includes/releases/v23.1/v23.1.15.md @@ -2,7 +2,7 @@ Release Date: February 20, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    @@ -71,4 +71,3 @@ We would like to thank the following contributors from the CockroachDB community [566a30300]: https://github.com/cockroachdb/cockroach/commit/566a30300 [7667710a0]: https://github.com/cockroachdb/cockroach/commit/7667710a0 [ce971160e]: https://github.com/cockroachdb/cockroach/commit/ce971160e - diff --git a/src/current/_includes/releases/v23.1/v23.1.16.md b/src/current/_includes/releases/v23.1/v23.1.16.md index bf41904e4a4..f6040c4ed7a 100644 --- a/src/current/_includes/releases/v23.1/v23.1.16.md +++ b/src/current/_includes/releases/v23.1/v23.1.16.md @@ -2,7 +2,7 @@ Release Date: February 27, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Bug fixes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.17.md b/src/current/_includes/releases/v23.1/v23.1.17.md index 798cb9438ff..9ff6f415e85 100644 --- a/src/current/_includes/releases/v23.1/v23.1.17.md +++ b/src/current/_includes/releases/v23.1/v23.1.17.md @@ -2,7 +2,7 @@ Release Date: March 19, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    diff --git a/src/current/_includes/releases/v23.1/v23.1.18.md b/src/current/_includes/releases/v23.1/v23.1.18.md index ed5e3422fa0..932db309005 100644 --- a/src/current/_includes/releases/v23.1/v23.1.18.md +++ b/src/current/_includes/releases/v23.1/v23.1.18.md @@ -2,7 +2,7 @@ Release Date: April 9, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    SQL language changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.19.md b/src/current/_includes/releases/v23.1/v23.1.19.md index 1aca1134d2d..ecae59e1828 100644 --- a/src/current/_includes/releases/v23.1/v23.1.19.md +++ b/src/current/_includes/releases/v23.1/v23.1.19.md @@ -2,7 +2,7 @@ Release Date: April 18, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Bug fixes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.2.md b/src/current/_includes/releases/v23.1/v23.1.2.md index db689d992b3..595b8442645 100644 --- a/src/current/_includes/releases/v23.1/v23.1.2.md +++ b/src/current/_includes/releases/v23.1/v23.1.2.md @@ -2,7 +2,7 @@ Release Date: May 30, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Backward-incompatible changes

    @@ -122,11 +122,11 @@ Release Date: May 30, 2023 - Fixed a bug where [`COPY`](https://www.cockroachlabs.com/docs/v23.1/copy-from) in v23.1.0 and beta versions would incorrectly encode data with multiple column families. The data must be dropped and re-imported to be encoded correctly. [#103355][#103355] - Optimized over-head of [`pg_catalog.pg_description`](https://www.cockroachlabs.com/docs/v23.1/pg-catalog) and [`pg_catalog.pg_shdescription`](https://www.cockroachlabs.com/docs/v23.1/pg-catalog), which can lead to performance regression relative to v22.2 [#103331][#103331] - Timeseries [metric](https://www.cockroachlabs.com/docs/v23.1/metrics) counts will now show cumulative counts for a histogram rather than a windowed count. A `-sum` timeseries is also exported to keep track of the cumulative sum of all samples in the histogram. [#103444][#103444] -- Fixed a bug where CockroachDB could produce incorrect results when evaluating queries with [`ORDER BY`](https://www.cockroachlabs.com/docs/v23.1/order-by) clause in rare circumstances. In particular, some rows could be duplicated if all of the following conditions were met: +- Fixed a bug where CockroachDB could produce incorrect results when evaluating queries with [`ORDER BY`](https://www.cockroachlabs.com/docs/v23.1/order-by) clause in rare circumstances. In particular, some rows could be duplicated if all of the following conditions were met: 1. The query had a `LIMIT` clause. 1. The `SORT` operation had to spill to disk (meaning that `LIMIT` number of rows used up non-trivial amounts of memory, e.g. the rows were "wide"). - 1. The `ORDER BY` clause contained multiple columns **and** the ordering on the prefix of those columns was already provided by the index. - + 1. The `ORDER BY` clause contained multiple columns **and** the ordering on the prefix of those columns was already provided by the index. + The bug has been present since at least v22.1. [#102790][#102790] - Fixed a bug where CockroachDB could previously encounter a nil pointer crash when populating data for [SQL Activity](https://www.cockroachlabs.com/docs/v23.1/ui-overview#sql-activity) page in some rare cases. The bug was present in v22.2.9 and v23.1.1 releases. [#103521][#103521] - Fixed calls to undefined objects. [#103520][#103520] @@ -153,8 +153,8 @@ Release Date: May 30, 2023 - Improved performance when joining with the `pg_description` table. [#103331][#103331] - Added concurrency to speed up the phase of the [restore](https://www.cockroachlabs.com/docs/v23.1/restore) that ingests backed up table statisitcs. [#102694][#102694] - Added support for constrained scans using computed columns which are part of an [index](https://www.cockroachlabs.com/docs/v23.1/indexes) when there is an `IN` list or `OR`'ed predicate on the columns that appear in the computed column expression. [#103412][#103412] -- Added two new statistics which are useful for tracking the efficiency of [snapshot transfers](https://www.cockroachlabs.com/docs/v23.1/architecture/replication-layer#snapshots). Some snapshots will always fail due to system level "races", but the goal is to keep it as low as possible. - - `range.snapshots.recv-failed` - The number of snapshots sent attempts that are initiated but not accepted by the recipient. +- Added two new statistics which are useful for tracking the efficiency of [snapshot transfers](https://www.cockroachlabs.com/docs/v23.1/architecture/replication-layer#snapshots). Some snapshots will always fail due to system level "races", but the goal is to keep it as low as possible. + - `range.snapshots.recv-failed` - The number of snapshots sent attempts that are initiated but not accepted by the recipient. - `range.snapshots.recv-unusable` - The number of snapshots that were fully transmitted but not used. [#101837][#101837]

    Build changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.3.md b/src/current/_includes/releases/v23.1/v23.1.3.md index 11efcc273c1..2fa09a04c6c 100644 --- a/src/current/_includes/releases/v23.1/v23.1.3.md +++ b/src/current/_includes/releases/v23.1/v23.1.3.md @@ -6,7 +6,7 @@ Release Date: June 13, 2023 A [bug](https://github.com/cockroachdb/cockroach/issues/104798) was discovered in a change included in v23.1.3 (this release). This bug can affect clusters upgrading to v23.1.3 from [v22.2.x]({% link releases/v22.2.md %}). In an affected cluster, jobs that were running during the upgrade could hang or fail to run after the upgrade is finalized. Users upgrading from v22.2.x are advised to use [v23.1.2](#v23-1-2) to upgrade, or to set the [`cluster.preserve_downgrade_option`](https://www.cockroachlabs.com/docs/v23.1/upgrade-cockroach-version#step-3-decide-how-the-upgrade-will-be-finalized) cluster setting to delay finalization of the upgrade until they can upgrade to v23.1.4. {{site.data.alerts.end}} -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    diff --git a/src/current/_includes/releases/v23.1/v23.1.4.md b/src/current/_includes/releases/v23.1/v23.1.4.md index a712fd8832a..5aec9530091 100644 --- a/src/current/_includes/releases/v23.1/v23.1.4.md +++ b/src/current/_includes/releases/v23.1/v23.1.4.md @@ -2,7 +2,7 @@ Release Date: June 20, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    diff --git a/src/current/_includes/releases/v23.1/v23.1.5.md b/src/current/_includes/releases/v23.1/v23.1.5.md index 34493bc3338..96e04fed756 100644 --- a/src/current/_includes/releases/v23.1/v23.1.5.md +++ b/src/current/_includes/releases/v23.1/v23.1.5.md @@ -2,7 +2,7 @@ Release Date: July 5, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    diff --git a/src/current/_includes/releases/v23.1/v23.1.6.md b/src/current/_includes/releases/v23.1/v23.1.6.md index 68876c7b85e..18fd56abd79 100644 --- a/src/current/_includes/releases/v23.1/v23.1.6.md +++ b/src/current/_includes/releases/v23.1/v23.1.6.md @@ -2,22 +2,22 @@ Release Date: July 24, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Bug fixes

    - Fixed a bug in v23.1.5 where [debug zips](https://www.cockroachlabs.com/docs/v23.1/cockroach-debug-zip) were empty in the `crdb_internal.cluster_settings.txt` file. Debug zips now properly show the information from `cluster_settings`. [#107105][#107105] - Fixed a bug where some primary indexes would incorrectly be treated internally as secondary indexes, which could cause schema change operations to fail. The bug could occur if [`ALTER PRIMARY KEY`](https://www.cockroachlabs.com/docs/v23.1/alter-table#alter-primary-key) was used on v21.1 or earlier, and the cluster was upgraded. [#106426][#106426] -- Extended the `cockroach debug doctor` to detect [indexes](https://www.cockroachlabs.com/docs/v23.1/indexes) which could potentially lose data by being dropped when a column is stored inside them and added a check inside [`DROP INDEX`](https://www.cockroachlabs.com/docs/v23.1/drop-index) to prevent dropping indexes with this problem to avoid data loss. [#106863][#106863] +- Extended the `cockroach debug doctor` to detect [indexes](https://www.cockroachlabs.com/docs/v23.1/indexes) which could potentially lose data by being dropped when a column is stored inside them and added a check inside [`DROP INDEX`](https://www.cockroachlabs.com/docs/v23.1/drop-index) to prevent dropping indexes with this problem to avoid data loss. [#106863][#106863]

    Contributors

    -This release includes 3 merged PRs by 15 authors. +This release includes 3 merged PRs by 15 authors.
    [#106863]: https://github.com/cockroachdb/cockroach/pull/106863 [#106426]: https://github.com/cockroachdb/cockroach/pull/106426 -[#107105]: https://github.com/cockroachdb/cockroach/pull/107105 \ No newline at end of file +[#107105]: https://github.com/cockroachdb/cockroach/pull/107105 diff --git a/src/current/_includes/releases/v23.1/v23.1.7.md b/src/current/_includes/releases/v23.1/v23.1.7.md index fc863616e63..9784e30fdb6 100644 --- a/src/current/_includes/releases/v23.1/v23.1.7.md +++ b/src/current/_includes/releases/v23.1/v23.1.7.md @@ -2,7 +2,7 @@ Release Date: July 31, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    SQL language changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.8.md b/src/current/_includes/releases/v23.1/v23.1.8.md index 1c529d95e80..43b294d26a2 100644 --- a/src/current/_includes/releases/v23.1/v23.1.8.md +++ b/src/current/_includes/releases/v23.1/v23.1.8.md @@ -2,7 +2,7 @@ Release Date: August 7, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    {{ site.data.products.enterprise }} edition changes

    diff --git a/src/current/_includes/releases/v23.1/v23.1.9.md b/src/current/_includes/releases/v23.1/v23.1.9.md index 5c9d7f5b71f..bfc1470fc0a 100644 --- a/src/current/_includes/releases/v23.1/v23.1.9.md +++ b/src/current/_includes/releases/v23.1/v23.1.9.md @@ -2,7 +2,7 @@ Release Date: September 7, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    General changes

    diff --git a/src/current/_includes/releases/v23.2/v23.2.0-alpha.1.md b/src/current/_includes/releases/v23.2/v23.2.0-alpha.1.md index 785b56990ef..ee50d8cf863 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0-alpha.1.md +++ b/src/current/_includes/releases/v23.2/v23.2.0-alpha.1.md @@ -2,7 +2,7 @@ Release Date: September 26, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Backward-incompatible changes

    diff --git a/src/current/_includes/releases/v23.2/v23.2.0-alpha.2.md b/src/current/_includes/releases/v23.2/v23.2.0-alpha.2.md index f8047b87ca8..bdc5629c8b9 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0-alpha.2.md +++ b/src/current/_includes/releases/v23.2/v23.2.0-alpha.2.md @@ -2,7 +2,7 @@ Release Date: October 2, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    diff --git a/src/current/_includes/releases/v23.2/v23.2.0-alpha.3.md b/src/current/_includes/releases/v23.2/v23.2.0-alpha.3.md index 5691946d35c..7c1c2745839 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0-alpha.3.md +++ b/src/current/_includes/releases/v23.2/v23.2.0-alpha.3.md @@ -2,7 +2,7 @@ Release Date: October 10, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Backward-incompatible changes

    diff --git a/src/current/_includes/releases/v23.2/v23.2.0-alpha.4.md b/src/current/_includes/releases/v23.2/v23.2.0-alpha.4.md index 5b28efae3ab..cf51f02ae8e 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0-alpha.4.md +++ b/src/current/_includes/releases/v23.2/v23.2.0-alpha.4.md @@ -2,7 +2,7 @@ Release Date: October 23, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    General changes

    diff --git a/src/current/_includes/releases/v23.2/v23.2.0-alpha.5.md b/src/current/_includes/releases/v23.2/v23.2.0-alpha.5.md index 036524d6713..4a6d73c0c02 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0-alpha.5.md +++ b/src/current/_includes/releases/v23.2/v23.2.0-alpha.5.md @@ -2,7 +2,7 @@ Release Date: October 30, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    SQL language changes

    diff --git a/src/current/_includes/releases/v23.2/v23.2.0-alpha.6.md b/src/current/_includes/releases/v23.2/v23.2.0-alpha.6.md index 02f11c49003..cef93cd3f22 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0-alpha.6.md +++ b/src/current/_includes/releases/v23.2/v23.2.0-alpha.6.md @@ -2,7 +2,7 @@ Release Date: November 7, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    General changes

    diff --git a/src/current/_includes/releases/v23.2/v23.2.0-alpha.7.md b/src/current/_includes/releases/v23.2/v23.2.0-alpha.7.md index deb0b8786cb..521e43cd835 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0-alpha.7.md +++ b/src/current/_includes/releases/v23.2/v23.2.0-alpha.7.md @@ -2,7 +2,7 @@ Release Date: November 20, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    SQL language changes

    diff --git a/src/current/_includes/releases/v23.2/v23.2.0-beta.1.md b/src/current/_includes/releases/v23.2/v23.2.0-beta.1.md index 1c1aafc07bb..674020e46e1 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0-beta.1.md +++ b/src/current/_includes/releases/v23.2/v23.2.0-beta.1.md @@ -2,7 +2,7 @@ Release Date: November 27, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    SQL language changes

    @@ -28,4 +28,4 @@ This release includes 33 merged PRs by 21 authors. [#114535]: https://github.com/cockroachdb/cockroach/pull/114535 [#114547]: https://github.com/cockroachdb/cockroach/pull/114547 [#114830]: https://github.com/cockroachdb/cockroach/pull/114830 -[#114833]: https://github.com/cockroachdb/cockroach/pull/114833 \ No newline at end of file +[#114833]: https://github.com/cockroachdb/cockroach/pull/114833 diff --git a/src/current/_includes/releases/v23.2/v23.2.0-beta.2.md b/src/current/_includes/releases/v23.2/v23.2.0-beta.2.md index ae87be0deff..2eb5033f704 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0-beta.2.md +++ b/src/current/_includes/releases/v23.2/v23.2.0-beta.2.md @@ -2,7 +2,7 @@ Release Date: December 5, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    General changes

    diff --git a/src/current/_includes/releases/v23.2/v23.2.0-beta.3.md b/src/current/_includes/releases/v23.2/v23.2.0-beta.3.md index ccd879f95f7..b99be77d2a6 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0-beta.3.md +++ b/src/current/_includes/releases/v23.2/v23.2.0-beta.3.md @@ -2,7 +2,7 @@ Release Date: December 13, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    General changes

    diff --git a/src/current/_includes/releases/v23.2/v23.2.0-rc.1.md b/src/current/_includes/releases/v23.2/v23.2.0-rc.1.md index 105ad186d41..be9223ac6d7 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0-rc.1.md +++ b/src/current/_includes/releases/v23.2/v23.2.0-rc.1.md @@ -2,7 +2,7 @@ Release Date: December 21, 2023 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    {{ site.data.products.enterprise }} edition changes

    diff --git a/src/current/_includes/releases/v23.2/v23.2.0-rc.2.md b/src/current/_includes/releases/v23.2/v23.2.0-rc.2.md index 942757d133a..7cdcddc0a66 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0-rc.2.md +++ b/src/current/_includes/releases/v23.2/v23.2.0-rc.2.md @@ -2,7 +2,7 @@ Release Date: January 9, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Bug fixes

    diff --git a/src/current/_includes/releases/v23.2/v23.2.0.md b/src/current/_includes/releases/v23.2/v23.2.0.md index 36933a62ac7..c4a60255be8 100644 --- a/src/current/_includes/releases/v23.2/v23.2.0.md +++ b/src/current/_includes/releases/v23.2/v23.2.0.md @@ -4,7 +4,7 @@ Release Date: February 5, 2024 With the release of CockroachDB v23.2, we've added new capabilities to help you migrate, build, and operate more efficiently. See our summary of the most significant user-facing changes under [Feature Highlights](#v23-2-0-feature-highlights). -{% include releases/release-downloads-docker-image.md release=include.release advisory_key="a103220"%} +{% include releases/new-release-downloads-docker-image.md release=include.release advisory_key="a103220"%}

    Feature highlights

    @@ -23,49 +23,12 @@ This section summarizes the most significant user-facing changes in v23.2.0 and - [Known limitations](#v23-2-0-known-limitations) - [Additional resources](#v23-2-0-additional-resources) - - {{ site.data.alerts.callout_info }} In CockroachDB Self-Hosted, all available features are free to use unless their description specifies that an Enterprise license is required. For more information, see the [Licensing FAQ](https://www.cockroachlabs.com/docs/stable/licensing-faqs). {{ site.data.alerts.end }} +
    +

    Observability

    @@ -380,6 +343,8 @@ In CockroachDB Self-Hosted, all available features are free to use unless their
    +
    +

    Backward-incompatible changes

    Before [upgrading to CockroachDB v23.2]({% link v23.2/upgrade-cockroach-version.md %}), be sure to review the following backward-incompatible changes, as well as [key cluster setting changes](#v23-2-0-cluster-settings), and adjust your deployment as necessary. diff --git a/src/current/_includes/releases/v23.2/v23.2.1.md b/src/current/_includes/releases/v23.2/v23.2.1.md index 3b4ed063546..929ae6c47c9 100644 --- a/src/current/_includes/releases/v23.2/v23.2.1.md +++ b/src/current/_includes/releases/v23.2/v23.2.1.md @@ -2,7 +2,7 @@ Release Date: February 20, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    diff --git a/src/current/_includes/releases/v23.2/v23.2.2.md b/src/current/_includes/releases/v23.2/v23.2.2.md index acc6b3b0d20..59485e3d30f 100644 --- a/src/current/_includes/releases/v23.2/v23.2.2.md +++ b/src/current/_includes/releases/v23.2/v23.2.2.md @@ -2,7 +2,7 @@ Release Date: February 27, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Bug fixes

    diff --git a/src/current/_includes/releases/v23.2/v23.2.3.md b/src/current/_includes/releases/v23.2/v23.2.3.md index f7f88b45031..a03ac245ca0 100644 --- a/src/current/_includes/releases/v23.2/v23.2.3.md +++ b/src/current/_includes/releases/v23.2/v23.2.3.md @@ -2,7 +2,7 @@ Release Date: March 20, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    @@ -110,4 +110,4 @@ This release includes 118 merged PRs by 42 authors. [#119738]: https://github.com/cockroachdb/cockroach/pull/119738 [#119768]: https://github.com/cockroachdb/cockroach/pull/119768 [#120076]: https://github.com/cockroachdb/cockroach/pull/120076 -[#120245]: https://github.com/cockroachdb/cockroach/pull/120245 \ No newline at end of file +[#120245]: https://github.com/cockroachdb/cockroach/pull/120245 diff --git a/src/current/_includes/releases/v23.2/v23.2.4.md b/src/current/_includes/releases/v23.2/v23.2.4.md index 15a74769583..f6b48661f8d 100644 --- a/src/current/_includes/releases/v23.2/v23.2.4.md +++ b/src/current/_includes/releases/v23.2/v23.2.4.md @@ -2,7 +2,7 @@ Release Date: April 11, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    SQL language changes

    @@ -53,4 +53,4 @@ This release includes 65 merged PRs by 37 authors [#120396]: https://github.com/cockroachdb/cockroach/pull/120396 [#120933]: https://github.com/cockroachdb/cockroach/pull/120933 [#121329]: https://github.com/cockroachdb/cockroach/pull/121329 -[#121875]: https://github.com/cockroachdb/cockroach/pull/121875 \ No newline at end of file +[#121875]: https://github.com/cockroachdb/cockroach/pull/121875 diff --git a/src/current/_includes/releases/v24.1/v24.1.0-alpha.1.md b/src/current/_includes/releases/v24.1/v24.1.0-alpha.1.md index 2ef2e4e9721..ee2f25d8dab 100644 --- a/src/current/_includes/releases/v24.1/v24.1.0-alpha.1.md +++ b/src/current/_includes/releases/v24.1/v24.1.0-alpha.1.md @@ -2,7 +2,7 @@ Release Date: March 7, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Backward-incompatible changes

    diff --git a/src/current/_includes/releases/v24.1/v24.1.0-alpha.2.md b/src/current/_includes/releases/v24.1/v24.1.0-alpha.2.md index 8e57623d088..ea68a2f6e10 100644 --- a/src/current/_includes/releases/v24.1/v24.1.0-alpha.2.md +++ b/src/current/_includes/releases/v24.1/v24.1.0-alpha.2.md @@ -2,7 +2,7 @@ Release Date: March 11, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    diff --git a/src/current/_includes/releases/v24.1/v24.1.0-alpha.3.md b/src/current/_includes/releases/v24.1/v24.1.0-alpha.3.md index 49b65e3da53..a9c256e8cf7 100644 --- a/src/current/_includes/releases/v24.1/v24.1.0-alpha.3.md +++ b/src/current/_includes/releases/v24.1/v24.1.0-alpha.3.md @@ -2,7 +2,7 @@ Release Date: March 18, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    {{ site.data.products.enterprise }} edition changes

    @@ -72,5 +72,3 @@ We would like to thank the following contributors from the CockroachDB community [#120097]: https://github.com/cockroachdb/cockroach/pull/120097 [#120137]: https://github.com/cockroachdb/cockroach/pull/120137 [#120145]: https://github.com/cockroachdb/cockroach/pull/120145 - - diff --git a/src/current/_includes/releases/v24.1/v24.1.0-alpha.4.md b/src/current/_includes/releases/v24.1/v24.1.0-alpha.4.md index bfea86439dc..0d48352728c 100644 --- a/src/current/_includes/releases/v24.1/v24.1.0-alpha.4.md +++ b/src/current/_includes/releases/v24.1/v24.1.0-alpha.4.md @@ -2,7 +2,7 @@ Release Date: March 25, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    diff --git a/src/current/_includes/releases/v24.1/v24.1.0-alpha.5.md b/src/current/_includes/releases/v24.1/v24.1.0-alpha.5.md index b8f0b770c62..e9e58c7fe06 100644 --- a/src/current/_includes/releases/v24.1/v24.1.0-alpha.5.md +++ b/src/current/_includes/releases/v24.1/v24.1.0-alpha.5.md @@ -2,7 +2,7 @@ Release Date: April 1, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    {{ site.data.products.enterprise }} edition changes

    diff --git a/src/current/_includes/releases/v24.1/v24.1.0-beta.1.md b/src/current/_includes/releases/v24.1/v24.1.0-beta.1.md index 5b59305b6c2..4a0ee755e5f 100644 --- a/src/current/_includes/releases/v24.1/v24.1.0-beta.1.md +++ b/src/current/_includes/releases/v24.1/v24.1.0-beta.1.md @@ -2,7 +2,7 @@ Release Date: April 17, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    SQL language changes

    diff --git a/src/current/_includes/releases/v24.1/v24.1.0-beta.2.md b/src/current/_includes/releases/v24.1/v24.1.0-beta.2.md index 6f5a9f0a481..d4110a09d5a 100644 --- a/src/current/_includes/releases/v24.1/v24.1.0-beta.2.md +++ b/src/current/_includes/releases/v24.1/v24.1.0-beta.2.md @@ -2,7 +2,7 @@ Release Date: April 24, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    Security updates

    diff --git a/src/current/_includes/sidebar-all-releases.json b/src/current/_includes/sidebar-all-releases.json index ec03c02ae25..266f6be8432 100644 --- a/src/current/_includes/sidebar-all-releases.json +++ b/src/current/_includes/sidebar-all-releases.json @@ -1,5 +1,17 @@ {%- assign versions = site.data.versions | where_exp: "versions", "versions.major_version != site.versions['dev']" | where_exp: "versions", "versions.major_version != site.versions['stable']" | map: "major_version" -%} {%- comment -%} versions iterates through the list of major versions (e.g., v21.2) in _data/versions.csv and returns all releases that are not dev or stable. We then pull only the major version name instead of the whole dictionary with map: "major_version" {%- endcomment -%} +{ + "title": "Latest Production Release", + "urls": [ + "/releases/{{ site.versions["stable"] }}.html" + ] +}{% unless site.versions["stable"] == site.versions["dev"] %}, +{ + "title": "Latest Testing Release", + "urls": [ + "/releases/{{ site.versions["dev"] }}.html" + ] +}{% endunless %}, { "title": "CockroachDB Releases", "urls": [ @@ -7,13 +19,7 @@ "/releases/" {% for v in versions %} ,"/releases/{{ v }}.html" - {% endfor %} - ] -}, -{ - "title": "CockroachDB Kubernetes Operator", - "urls": [ - "/releases/kubernetes-operator.html" + {% endfor %} ] }, { @@ -43,4 +49,16 @@ ,"{{ x.url }}" {% endfor %} ] +}, +{ + "title": "Cloud Releases", + "urls": [ + "/releases/cloud.html" + ] +}, +{ + "title": "Kubernetes Operator", + "urls": [ + "/releases/kubernetes-operator.html" + ] } diff --git a/src/current/_includes/sidebar-data-v23.2.json b/src/current/_includes/sidebar-data-v23.2.json index d253cde31b1..f2aedcaf392 100644 --- a/src/current/_includes/sidebar-data-v23.2.json +++ b/src/current/_includes/sidebar-data-v23.2.json @@ -7,7 +7,7 @@ ] }, {% include_cached v23.2/sidebar-data/get-started.json %}, - {% include_cached v23.2/sidebar-data/latest-releases.json %}, + {% include_cached v23.2/sidebar-data/releases.json %}, {% include_cached v23.2/sidebar-data/feature-overview.json %}, {% include_cached v23.2/sidebar-data/connect-to-cockroachdb.json %}, {% include_cached v23.2/sidebar-data/migrate.json %}, @@ -22,6 +22,5 @@ {% include_cached v23.2/sidebar-data/sql.json %}, {% include_cached v23.2/sidebar-data/reference.json %}, {% include_cached v23.2/sidebar-data/faqs.json %}, - {% include_cached v23.2/sidebar-data/releases.json %}, {% include_cached sidebar-data-cockroach-university.json %} ] diff --git a/src/current/_includes/sidebar-data-v24.1.json b/src/current/_includes/sidebar-data-v24.1.json index 5401d2dd934..d9eb75825d8 100644 --- a/src/current/_includes/sidebar-data-v24.1.json +++ b/src/current/_includes/sidebar-data-v24.1.json @@ -7,7 +7,7 @@ ] }, {% include_cached v24.1/sidebar-data/get-started.json %}, - {% include_cached v24.1/sidebar-data/latest-releases.json %}, + {% include_cached v24.1/sidebar-data/releases.json %}, {% include_cached v24.1/sidebar-data/feature-overview.json %}, {% include_cached v24.1/sidebar-data/connect-to-cockroachdb.json %}, {% include_cached v24.1/sidebar-data/migrate.json %}, @@ -22,6 +22,5 @@ {% include_cached v24.1/sidebar-data/sql.json %}, {% include_cached v24.1/sidebar-data/reference.json %}, {% include_cached v24.1/sidebar-data/faqs.json %}, - {% include_cached v24.1/sidebar-data/releases.json %}, {% include_cached sidebar-data-cockroach-university.json %} ] diff --git a/src/current/_includes/sidebar-releases.json b/src/current/_includes/sidebar-releases.json index 92e4984ad0c..26a6c95da8a 100644 --- a/src/current/_includes/sidebar-releases.json +++ b/src/current/_includes/sidebar-releases.json @@ -7,8 +7,20 @@ {% assign v_test = site.data.versions | where_exp: "v_test", "v_test.release_date == 'N/A'" | sort: "release_date" | last | map: "major_version" %} {% comment %} v_test iterates through the list of major versions in _data/versions.csv and returns the single latest testing version (if the release date is in the future or not otherwise specified). It's possible there is no testing release (in between GA of a version and the first alpha of the following version). {% endcomment %} { - "title": "CockroachDB", + "title": "CockroachDB Releases", "items": [ + { + "title": "Latest Production Release", + "urls": [ + "/releases/{{ site.versions["stable"] }}.html" + ] + }{% unless site.versions["stable"] == site.versions["dev"] %}, + { + "title": "Latest Testing Release", + "urls": [ + "/releases/{{ site.versions["dev"] }}.html" + ] + },{% endunless %} { "title": "All Releases", "urls": [ @@ -23,15 +35,12 @@ ] }, {% endfor %} - {% if v_test[0] %} {% comment %} check if a testing version is available {% endcomment %} { - "title": "Latest Testing Release", + "title": "Staged Release Process", "urls": [ - {% comment %} check if a testing version is available and pull the latest testing version {% endcomment %} - "/releases/{{ v_test[0] }}.html" + "/releases/staged-release-process.html" ] }, - {% endif %} { "title": "Release Support Policy", "urls": [ @@ -46,18 +55,6 @@ } ] }, -{ - "title": "CockroachDB Cloud", - "urls": [ - "/releases/cloud.html" - ] -}, -{ - "title": "CockroachDB Kubernetes Operator", - "urls": [ - "/releases/kubernetes-operator.html" - ] -}, {% assign advisories = site.pages | where_exp: "advisories", "advisories.path contains 'advisories'" | where_exp: "advisories", "advisories.index != 'true'" %} { "title": "Technical Advisories", @@ -67,4 +64,16 @@ ,"{{ x.url }}" {% endfor %} ] +}, +{ + "title": "Cloud Releases", + "urls": [ + "/releases/cloud.html" + ] +}, +{ + "title": "Kubernetes Operator", + "urls": [ + "/releases/kubernetes-operator.html" + ] } diff --git a/src/current/_includes/unsupported-version.md b/src/current/_includes/unsupported-version.md index 4588b7babab..a29ce9a863c 100644 --- a/src/current/_includes/unsupported-version.md +++ b/src/current/_includes/unsupported-version.md @@ -1,15 +1,34 @@ {% assign x = site.data.versions | where_exp: "m", "m.major_version == include.major_version" | first %} -{% unless x.maint_supp_exp_date == "N/A" or x.asst_supp_exp_date == "N/A" %} +{% unless x.maint_supp_exp_date == "N/A" or x.asst_supp_exp_date == "N/A" %}{% comment %}Not yet GA{% endcomment %} {% assign today = "today" | date: "%s" %} {% comment %} Fetch today's date and format it in seconds. {% endcomment %} {% assign m = x.maint_supp_exp_date | date: "%s" %} {% comment %} Format m_raw in seconds. {% endcomment %} {% assign a = x.asst_supp_exp_date | date: "%s" %} {% comment %} Format a_raw in seconds. {% endcomment %} - {% if a < today %} {% comment %} If the assistance support expiration date has passed, show the unsupported message. {% endcomment %} + {% unless x.lts_maint_supp_exp_date == "N/A" or x.lts_asst_supp_exp_date == "N/A" %}{% comment %}No LTS releases{% endcomment %} + {% assign lm = x.lts_maint_supp_exp_date | date: "%s" %} {% comment %} Format m_raw in seconds. {% endcomment %} + {% assign la = x.lts_asst_supp_exp_date | date: "%s" %} {% comment %} Format a_raw in seconds. {% endcomment %} + {% endunless %} +{% endunless %} + + {% if la < today %} {% comment %} If the LTS assistance support expiration date has passed, show the unsupported message. {% endcomment %} + {{site.data.alerts.callout_danger}} + CockroachDB {{ include.major_version }} (LTS) is no longer supported as of {{ x.lts_asst_supp_exp_date | date: "%B %e, %Y"}}. For more details, refer to the Release Support Policy. + {{site.data.alerts.end}} + {% elsif la >= today and lm < today %}{% comment %} If the LTS maintenance support expiration has passed but the version is still within the LTS assistance support period, show this message and pass the LTS assistance support expiration date. {% endcomment %} + {{site.data.alerts.callout_danger}} + Cockroach Labs will stop providing LTS Assistance Support for {{ include.major_version }} on {{ x.lts_asst_supp_exp_date | date: "%B %e, %Y" }}. Prior to that date, upgrade to a more recent version to continue receiving support. For more details, refer to the Release Support Policy. + {{site.data.alerts.end}} + {% elsif a < today and lm > today %} {% comment %} If the assistance support expiration date has passed but the LTS maintenance phase has not {% endcomment %} + {% if la > today %} + {{site.data.alerts.callout_danger}} + GA releases for CockroachDB {{ include.major_version }} are no longer supported. Cockroach Labs will stop providing LTS Assistance Support for {{ include.major_version }} LTS releases on {{ x.lts_asst_supp_exp_date | date: "%B %e, %Y" }}. Prior to that date, upgrade to a more recent version to continue receiving support. For more details, refer to the Release Support Policy. + {{site.data.alerts.end}} + {% endif %} + {% elsif a < today %}{% comment %}show the unsupported message. {% endcomment %} {{site.data.alerts.callout_danger}} - CockroachDB {{ include.major_version }} is no longer supported. For more details, see the Release Support Policy. + CockroachDB {{ include.major_version }} is no longer supported as of {{ x.asst_supp_exp_date | date: "%B %e, %Y"}}. For more details, refer to the Release Support Policy. {{site.data.alerts.end}} {% elsif a >= today and m < today %} {% comment %} If the maintenance support expiration has passed but the version is still within the assistance support period, show this message and pass the assistance support expiration date. {% endcomment %} {{site.data.alerts.callout_danger}} - Cockroach Labs will stop providing Assistance Support for {{ include.major_version }} on {{ x.asst_supp_exp_date | date: "%B %e, %Y" }}. Prior to that date, upgrade to a more recent version to continue receiving support. For more details, see the Release Support Policy. + Cockroach Labs will stop providing Assistance Support for {{ include.major_version }} on {{ x.asst_supp_exp_date | date: "%B %e, %Y" }}. Prior to that date, upgrade to a more recent version to continue receiving support. For more details, refer to the Release Support Policy. {{site.data.alerts.end}} {% endif %} -{% endunless %} diff --git a/src/current/_includes/v23.2/sidebar-data/latest-releases.json b/src/current/_includes/v23.2/sidebar-data/latest-releases.json deleted file mode 100644 index e25f8c0fa7a..00000000000 --- a/src/current/_includes/v23.2/sidebar-data/latest-releases.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "title": "Latest Releases", - "is_top_level": true, - "items": [ - {% include_cached sidebar-latest-releases.json %} - ] - } diff --git a/src/current/_includes/v23.2/sidebar-data/releases.json b/src/current/_includes/v23.2/sidebar-data/releases.json index fb49f7c9acc..8ee555fdc9a 100644 --- a/src/current/_includes/v23.2/sidebar-data/releases.json +++ b/src/current/_includes/v23.2/sidebar-data/releases.json @@ -1,5 +1,5 @@ { - "title": "CockroachDB Releases", + "title": "Releases", "is_top_level": true, "items": [ {% include_cached sidebar-all-releases.json %} diff --git a/src/current/_includes/v24.1/sidebar-data/latest-releases.json b/src/current/_includes/v24.1/sidebar-data/latest-releases.json index e25f8c0fa7a..e69de29bb2d 100644 --- a/src/current/_includes/v24.1/sidebar-data/latest-releases.json +++ b/src/current/_includes/v24.1/sidebar-data/latest-releases.json @@ -1,7 +0,0 @@ -{ - "title": "Latest Releases", - "is_top_level": true, - "items": [ - {% include_cached sidebar-latest-releases.json %} - ] - } diff --git a/src/current/_includes/v24.1/sidebar-data/releases.json b/src/current/_includes/v24.1/sidebar-data/releases.json index fb49f7c9acc..18f2a1b7c6a 100644 --- a/src/current/_includes/v24.1/sidebar-data/releases.json +++ b/src/current/_includes/v24.1/sidebar-data/releases.json @@ -1,7 +1,7 @@ { - "title": "CockroachDB Releases", + "title": "Releases", "is_top_level": true, "items": [ - {% include_cached sidebar-all-releases.json %} + {% include_cached sidebar-releases.json %} ] } diff --git a/src/current/cockroachcloud/authorization.md b/src/current/cockroachcloud/authorization.md index c92c2ce1f92..426e9d79479 100644 --- a/src/current/cockroachcloud/authorization.md +++ b/src/current/cockroachcloud/authorization.md @@ -1,6 +1,6 @@ --- title: CockroachDB Cloud Access Management (Authorization) Overview -summary: Learn about the CockroachDB {{ site.data.products.cloud }} Authorization features and concepts +summary: Learn about CockroachDB Cloud authorization features and concepts toc: true docs_area: manage --- diff --git a/src/current/cockroachcloud/ccloud-faq.md b/src/current/cockroachcloud/ccloud-faq.md index a9feebb4436..b17c95c12ce 100644 --- a/src/current/cockroachcloud/ccloud-faq.md +++ b/src/current/cockroachcloud/ccloud-faq.md @@ -1,6 +1,6 @@ --- title: CockroachDB Cloud Access Management (Authorization) FAQ -summary: Frequently asked questions about CockroachDB {{ site.data.products.cloud }} +summary: Frequently asked questions about CockroachDB Cloud toc: true docs_area: manage --- diff --git a/src/current/cockroachcloud/cloud-sso-sql.md b/src/current/cockroachcloud/cloud-sso-sql.md index a0852729cc6..86afd9cdada 100644 --- a/src/current/cockroachcloud/cloud-sso-sql.md +++ b/src/current/cockroachcloud/cloud-sso-sql.md @@ -1,6 +1,6 @@ --- title: Cluster Single Sign-on (SSO) using the Cloud Console -summary: Overview of Cluster Single Sign-on (SSO) for CockroachDB {{ site.data.products.cloud }}, review of authenticating users, configuring required cluster settings. +summary: Overview of Cluster Single Sign-on (SSO) for CockroachDB Cloud, review of authenticating users, configuring required cluster settings. toc: true docs_area: manage --- diff --git a/src/current/cockroachcloud/cluster-overview-page.md b/src/current/cockroachcloud/cluster-overview-page.md index 27df7c9043d..66f8f10d35f 100644 --- a/src/current/cockroachcloud/cluster-overview-page.md +++ b/src/current/cockroachcloud/cluster-overview-page.md @@ -1,6 +1,6 @@ --- title: Cluster Overview Page -summary: How to use the Cluster Overview page to view cluster details on CockroachDB {{ site.data.products.cloud }}. +summary: How to use the Cluster Overview page to view cluster details on CockroachDB Cloud. toc: true docs_area: manage --- diff --git a/src/current/cockroachcloud/cmek.md b/src/current/cockroachcloud/cmek.md index c7f9f75a170..eb4603ff144 100644 --- a/src/current/cockroachcloud/cmek.md +++ b/src/current/cockroachcloud/cmek.md @@ -1,6 +1,6 @@ --- title: Customer-Managed Encryption Keys (CMEK) Overview -summary: Use cryptographic keys that you manage to protect data at rest in a CockroachDB {{ site.data.products.dedicated }} cluster. +summary: Use cryptographic keys that you manage to protect data at rest in a CockroachDB Cloud cluster. toc: true docs_area: manage.security cloud: true diff --git a/src/current/cockroachcloud/egress-perimeter-controls.md b/src/current/cockroachcloud/egress-perimeter-controls.md index e5abfb6ab42..8797fe43af1 100644 --- a/src/current/cockroachcloud/egress-perimeter-controls.md +++ b/src/current/cockroachcloud/egress-perimeter-controls.md @@ -1,6 +1,6 @@ --- title: Egress Perimeter Controls for CockroachDB Dedicated -summary: Learn how to configure Egress Perimeter Controls for enhanced network security on a CockroachDB {{ site.data.products.dedicated }} cluster. +summary: Learn how to configure Egress Perimeter Controls for enhanced network security on a CockroachDB Cloud cluster. toc: true toc_not_nested: true docs_area: security diff --git a/src/current/cockroachcloud/sql-audit-logging.md b/src/current/cockroachcloud/sql-audit-logging.md index 665a093d4e4..e11be58c2d9 100644 --- a/src/current/cockroachcloud/sql-audit-logging.md +++ b/src/current/cockroachcloud/sql-audit-logging.md @@ -1,6 +1,6 @@ --- title: SQL Audit Logging -summary: Learn about the SQL Audit Logging feature for CockroachDB {{ site.data.products.cloud }} clusters. +summary: Learn about the SQL Audit Logging feature for CockroachDB Cloud clusters. toc: true docs_area: manage --- diff --git a/src/current/cockroachcloud/upgrade-policy.md b/src/current/cockroachcloud/upgrade-policy.md index 14a2b906b20..3ac7718365d 100644 --- a/src/current/cockroachcloud/upgrade-policy.md +++ b/src/current/cockroachcloud/upgrade-policy.md @@ -1,46 +1,45 @@ --- -title: CockroachDB Cloud Upgrade Policy +title: CockroachDB Cloud Support and Upgrade Policy summary: Learn about the upgrade policy for clusters deployed in CockroachDB Cloud. toc: true docs_area: manage --- -This page describes the upgrade policy for CockroachDB {{ site.data.products.cloud }}. For self-hosted clusters, see the CockroachDB [Release Support Policy](https://www.cockroachlabs.com/docs/releases/release-support-policy). +This page describes the support and upgrade policy for clusters deployed in CockroachDB {{ site.data.products.cloud }}. For CockroachDB Self-Hosted, refer to the CockroachDB [Release Support Policy](https://www.cockroachlabs.com/docs/releases/release-support-policy). -Cockroach Labs uses a three-component calendar versioning scheme to name CockroachDB [releases](https://cockroachlabs.com/docs/releases/index#production-releases). The format is `YY.R.PP`, where `YY` indicates the year, `R` indicates the release (“1” or “2”, representing a typical biannual cycle), and `PP` indicates the patch release version. Example: Version 23.1.0 (abbreviated v23.1.0). Leading up to a new major version's initial GA (Generally Available) release, multiple testing builds are produced, moving from Alpha to Beta to Release Candidate. CockroachDB began using this versioning scheme with v19.1. For more details, refer to [Release Naming](https://cockroachlabs.com/docs/releases/index#release-naming). +Cockroach Labs uses a three-component calendar versioning scheme to name CockroachDB [releases](https://cockroachlabs.com/docs/releases/index#production-releases). The format is `YY.R.PP`, where `YY` indicates the year, `R` indicates the release (historically “1” or “2”, representing a biannual cycle), and `PP` indicates the patch release version. For example: Version 23.1.0 (abbreviated v23.1.0). Leading up to a new major version's initial GA (Generally Available) release, multiple testing builds are produced, moving from Alpha to Beta to Release Candidate. CockroachDB began using this versioning scheme with v19.1. For more details, refer to [Release Naming](https://cockroachlabs.com/docs/releases/index#release-naming). -CockroachDB {{ site.data.products.cloud }} supports the latest major version of CockroachDB and the major version immediately preceding it. Support for these versions includes patch version upgrades and security patches. +CockroachDB {{ site.data.products.cloud }} provides support for the latest major version of CockroachDB and the major version immediately preceding it. -{{site.data.alerts.callout_success}} -Prior to the GA release of a major CockroachDB version, CockroachDB {{ site.data.products.dedicated }} clusters can optionally be upgraded to a [Pre-Production Preview](#pre-production-preview-upgrades) release—a beta or release candidate (RC) testing release for testing and validation of that next major version. To learn more, refer to [Upgrade to v23.2 Pre-Production Preview]({% link cockroachcloud/upgrade-to-v23.2.md %}). -{{site.data.alerts.end}} +CockroachDB Dedicated clusters are automatically upgraded to the latest patch of the cluster’s current major version of CockroachDB, but an account administrator must initiate an upgrade to a new major version. -{{site.data.alerts.callout_danger}} -[CockroachDB {{ site.data.products.serverless }}]({% link cockroachcloud/quickstart.md %}) clusters are subject to automatic upgrades for both major and patch releases. +CockroachDB Serverless clusters are upgraded to the latest major version and each patch automatically. + +{{site.data.alerts.callout_success}} +Prior to the GA release of a major CockroachDB version, CockroachDB {{ site.data.products.dedicated }} clusters can optionally be upgraded to a [Pre-Production Preview](#pre-production-preview-upgrades) release—a beta or release candidate (RC) testing release for testing and validation of that next major version. To learn more, refer to [Upgrade to v24.1 Pre-Production Preview]({% link cockroachcloud/upgrade-to-v24.1.md %}). {{site.data.alerts.end}} ## Patch version upgrades Patch version [releases](https://www.cockroachlabs.com/docs/releases), or "maintenance" releases, contain stable, backward-compatible improvements to the major versions of CockroachDB (for example, v23.1.12 and v23.1.13). -For CockroachDB {{ site.data.products.dedicated }} clusters, [Org Administrators]({% link cockroachcloud/authorization.md %}#org-administrator) can [set a weekly 6-hour maintenance window]({% link cockroachcloud/cluster-management.md %}#set-a-maintenance-window) during which available maintenance and patch upgrades will be applied. During the window, your cluster may experience restarts, degraded performance, and downtime for single-node clusters. Upgrades may not always be completed by the end of the window, and maintenance that is critical for security or stability may occur outside the window. Patch upgrades can also be [deferred for 60 days]({% link cockroachcloud/cluster-management.md %}#set-a-maintenance-window). If no maintenance window is configured, CockroachDB {{ site.data.products.dedicated }} clusters will be automatically upgraded to the latest supported patch version as soon as it becomes available. +For CockroachDB {{ site.data.products.dedicated }} clusters, [Org Administrator]({% link cockroachcloud/authorization.md %}#org-administrator) can [set a weekly 6-hour maintenance window]({% link cockroachcloud/cluster-management.md %}#set-a-maintenance-window) during which available patch upgrades will be applied. During the window, your cluster may experience restarts, degraded performance, and, for single-node clusters, downtime. Upgrades may not always be completed by the end of the window, and maintenance that is critical for security or stability may occur outside the window. Patch upgrades can also be [deferred for 60 days]({% link cockroachcloud/cluster-management.md %}#set-a-maintenance-window). If no maintenance window is configured, CockroachDB {{ site.data.products.dedicated }} clusters will be automatically upgraded to the latest supported patch version as soon as it becomes available. CockroachDB {{ site.data.products.serverless }} clusters are subject to automatic upgrades to the latest supported patch version. -**To minimize disruption to clients during cluster upgrades, it's important to use [connection retry logic]({% link cockroachcloud/production-checklist.md %}#keeping-connections-current) in your application.** - {{site.data.alerts.callout_danger}} Single-node clusters will experience some downtime during cluster maintenance. {{site.data.alerts.end}} ## Major version upgrades -Major version [releases](https://www.cockroachlabs.com/docs/releases) (for example, v23.1.0 and v23.2.0) contain new functionality and potentially backward-incompatible changes to CockroachDB. +Major version [releases](https://www.cockroachlabs.com/docs/releases) (for example, v23.1.0 and v23.2.0) contain new functionality and may include backward-incompatible changes to CockroachDB. -Major version upgrades are automatic for CockroachDB {{ site.data.products.serverless }} clusters and opt-in for CockroachDB {{ site.data.products.dedicated }} clusters. [Org Administrators]({% link cockroachcloud/authorization.md %}#org-administrator) must initiate major version upgrades for CockroachDB {{ site.data.products.dedicated }} clusters. When a new major version is available, Admins will be able to [start an upgrade]({% link cockroachcloud/upgrade-to-v23.1.md %}) from the CockroachDB {{ site.data.products.cloud }} Console for clusters using the paid version of CockroachDB {{ site.data.products.dedicated }}. When a major version upgrade is initiated for a cluster, it will upgrade to the latest patch version as well. +Major version upgrades are automatic for CockroachDB {{ site.data.products.serverless }} clusters and opt-in for CockroachDB {{ site.data.products.dedicated }} clusters. An [Org Administrator]({% link cockroachcloud/authorization.md %}#org-administrator) must initiate major version upgrades for CockroachDB {{ site.data.products.dedicated }} clusters. When a new major version is available, Admins will be able to [start an upgrade]({% link cockroachcloud/upgrade-to-v23.1.md %}) from the CockroachDB {{ site.data.products.cloud }} Console for clusters using CockroachDB {{ site.data.products.dedicated }}. When a major version upgrade is initiated for a cluster, it will upgrade to the latest patch version as well. ### Pre-production preview upgrades -Prior to the GA release of a major CockroachDB version, CockroachDB {{ site.data.products.cloud }} organizations can create new clusters or upgrade existing clusters to a Pre-Production Preview release for testing and experimentation using a beta or release candidate (RC) of that next major version. Upgrading to a Pre-Production Preview is a major-version upgrade. After a cluster is upgraded to a Pre-Production Preview release, it is automatically upgraded to all subsequent releases within the same major version—including additional beta and RC releases, the GA release, and subsequent patch releases after GA, as [patch version upgrades](#patch-version-upgrades). To learn more, refer to [Upgrade to v23.2 Pre-Production Preview](https://cockroachlabs.com/docs/cockroachcloud/upgrade-to-v23.2). + +Prior to the GA release of a major CockroachDB version, CockroachDB {{ site.data.products.cloud }} organizations can create new {{ site.data.products.dedicated }} clusters or upgrade existing clusters to a Pre-Production Preview release for testing and experimentation using a beta or release candidate (RC) of that next major version. Upgrading to a Pre-Production Preview is a major-version upgrade. After a cluster is upgraded to a Pre-Production Preview release, it is automatically upgraded to all subsequent releases within the same major version—including additional beta and RC releases, the GA release, and subsequent patch releases after GA, as [patch version upgrades](#patch-version-upgrades). To learn more, refer to [Upgrade to v23.2 Pre-Production Preview](https://cockroachlabs.com/docs/cockroachcloud/upgrade-to-v24.1). ### Rollback support @@ -52,18 +51,18 @@ To stop the upgrade and roll back to the latest patch release of the previous ma If you choose to roll back a major version upgrade, your cluster will be rolled back to the latest patch release of the previous major version, which may differ from the patch release you were running before you initiated the upgrade. {{site.data.alerts.end}} -During rollback, nodes are reverted to that prior version one at a time, without interrupting the cluster's health and availability. +During rollback, nodes are reverted to that prior major version's latest patch one at a time, without interrupting the cluster's health and availability. -If you see problems after a major version upgrade has been finalized, it will not be possible to roll back via the CockroachDB {{ site.data.products.cloud }} Console. For assistance, [contact support](https://support.cockroachlabs.com/hc/requests/new). +If you notice problems after a major version upgrade has been finalized, it will not be possible to roll back via the CockroachDB {{ site.data.products.cloud }} Console. For assistance, [contact support](https://support.cockroachlabs.com/hc/requests/new). -### End of Support for older CockroachDB versions +### End of Support for CockroachDB versions As CockroachDB releases new major versions, older versions reach their End of Support (EOS) on CockroachDB {{ site.data.products.cloud }}. A CockroachDB version reaches EOS when it is two major versions behind the latest version. For example, when CockroachDB v21.2 was released, CockroachDB v20.2 reached EOS. Clusters running unsupported CockroachDB versions are not eligible for our [availability SLA](https://www.cockroachlabs.com/cloud-terms-and-conditions/). Further downgrades in support may occur as per the [CockroachDB Release Support Policy](https://www.cockroachlabs.com/docs/releases/release-support-policy). -If you are running a CockroachDB version nearing EOS, you will be reminded at least one month before that version’s EOS that your clusters must be upgraded by the EOS date to avoid losing support. A Org Administrator can [upgrade your cluster]({% link cockroachcloud/upgrade-to-v23.1.md %}) directly from the CockroachDB {{ site.data.products.cloud }} Console. +If you are running a CockroachDB version nearing EOS, you will be reminded at minimum one month before that version’s EOS that your clusters must be upgraded by the EOS date to avoid losing support. A Org Administrator can [upgrade your cluster]({% link cockroachcloud/upgrade-to-v23.2.md %}) directly from the CockroachDB {{ site.data.products.cloud }} Console. -## See also +## Additional information For more details about the upgrade and finalization process, see [Upgrade to the Latest CockroachDB Version](https://cockroachlabs.com/docs/cockroachcloud/upgrade-to-v23.1). diff --git a/src/current/releases/index.md b/src/current/releases/index.md index 6ec063dfbc7..19655d9ffea 100644 --- a/src/current/releases/index.md +++ b/src/current/releases/index.md @@ -1,11 +1,11 @@ --- title: Releases -summary: Release notes for older versions of CockroachDB. +summary: Information about CockroachDB releases with an index of available releases and their release notes and binaries. toc: true docs_area: releases toc_not_nested: true -pre_production_preview: false -pre_production_preview_version: v23.2.0-beta.3 +pre_production_preview: true +pre_production_preview_version: v24.1.0-beta.1 --- {% comment %} @@ -14,11 +14,10 @@ of this file, block-level HTML is indented in relation to the other HTML, and bl indented in relation to the other Liquid. Please try to keep the indentation consistent. Thank you! {% endcomment %} -After downloading your desired release, learn how to [install CockroachDB](https://www.cockroachlabs.com/docs/stable/install-cockroachdb). Also be sure to review Cockroach Labs' [Release Support Policy]({% link releases/release-support-policy.md %}). +After downloading a supported CockroachDB binary, learn how to [install CockroachDB](https://www.cockroachlabs.com/docs/stable/install-cockroachdb). Be sure to review Cockroach Labs' [Release Support Policy]({% link releases/release-support-policy.md %}). -- **Generally Available (GA)** releases are qualified for production environments. -- **Limited Access** binaries allow you to validate CockroachDB on architectures that will soon become generally available. In certain cases, limited access binaries are available only to enrolled organizations. To enroll your organization, contact your account representative. -- **Testing** releases are intended for testing and experimentation only, and are not qualified for production environments and not eligible for support or uptime SLA commitments. Testing releases allow you to begin testing and validating the next major version of CockroachDB early. Testing releases are not eligible for support or uptime SLA commitments. +- **Generally Available (GA)** releases (also known as Production releases) are qualified for production environments. These may have either a default GA support type or an extended LTS (Long-Term Support) designation. Refer to [Release Support Policy]({% link releases/release-support-policy.md %}) for more information. +- **Testing** releases are intended for testing and experimentation only, and are not qualified for production environments and not eligible for support or uptime SLA commitments. Testing releases allow you to begin testing and validating the next major version of CockroachDB early. - **Experimental** binaries allow you to deploy and develop with CockroachDB on architectures that are not yet qualified for production use. Experimental binaries are not eligible for support or uptime SLA commitments, whether they are for testing releases or production releases. For more details, refer to [Release Naming](#release-naming). @@ -29,7 +28,7 @@ In CockroachDB v22.2.x and above, a cluster that is upgraded to an alpha binary ## Staged release process -As of 2024, CockroachDB is released under a staged delivery process. New releases are made available for CockroachDB Cloud clusters for two weeks before binaries are published for CockroachDB Self-Hosted downloads. +As of 2024, CockroachDB is released under a staged delivery process. New releases are made available for select CockroachDB Cloud organizations for two weeks before binaries are published for CockroachDB Self-Hosted downloads. {{ experimental_js_warning }} @@ -109,9 +108,12 @@ As of 2024, CockroachDB is released under a staged delivery process. New release {% for r in releases %} + + {% capture lts_link_linux %}{% if r.lts == true %} ([LTS]({% link releases/release-support-policy.md %}#support-types)){% endif %}{% endcapture %} + {% comment %} Add "Latest" class to release if it's the latest release. {% endcomment %} - {{ r.release_name }} {% comment %} Add link to each release r. {% endcomment %} + {{ r.release_name }}{{ lts_link_linux }}{% comment %} Add link to each release r, decorate with link about LTS if applicable. {% endcomment %} {% if r.release_name == latest_hotfix.release_name %} Latest {% comment %} Add "Latest" badge to release if it's the latest release. {% endcomment %} {% endif %} @@ -138,7 +140,7 @@ As of 2024, CockroachDB is released under a staged delivery process. New release {% if r.linux.linux_arm_experimental == true %}Experimental:{% endif %}
    Full Binary{% if r.has_sha256sum == true %} (SHA256{% endif %})
    {% comment %} If a sha256sum is available for a particular release, we display a link to the file containing the sha256sum alongside the download link of the release. {% endcomment %} {% if r.has_sql_only == true %} -
    SQL shell Binary{% if r.has_sha256sum == true %} (SHA256{% endif %})
    {% comment %} If a sha256sum is available for a particular release, we display a link to the file containing the sha256sum alongside the download link of the release. {% endcomment %} +
    SQL shell Binary{% if r.has_sha256sum == true %} (SHA256){% endif %}
    {% comment %} If a sha256sum is available for a particular release, we display a link to the file containing the sha256sum alongside the download link of the release. {% endcomment %} {% endif %} {% endif %} @@ -192,9 +194,9 @@ macOS downloads are **experimental**. Experimental downloads are not yet qualifi {% break %} {% else %} - +
    Full Binary{% if r.has_sha256sum == true %} (SHA256){% endif %}
    {% if r.has_sql_only == true %} - +
    SQL shell Binary{% if r.has_sha256sum == true %} (SHA256){% endif %}
    {% endif %} {% endif %} @@ -269,9 +271,14 @@ macOS downloads are **experimental**. Experimental downloads are not yet qualifi {% for r in releases %} + + {% capture lts_link_docker %}{% if r.lts == true %} ([LTS]({% link releases/release-support-policy.md %}#support-types)){% endif %}{% endcapture %} + {% comment %} Add "Latest" class to release if it's the latest release. {% endcomment %} - {{ r.release_name }} {% comment %} Add link to each release r. {% endcomment %} + {{ r.release_name }} {% comment %} Add link to each release r. +{% endcomment %} {% if r.release_name == latest_hotfix.release_name %} Latest {% comment %} Add "Latest" badge to release if it's the latest release. {% endcomment %} {% endif %} @@ -297,7 +304,7 @@ macOS downloads are **experimental**. Experimental downloads are not yet qualifi {% elsif r.docker.docker_arm_experimental == true %} **Intel**: GA
    **ARM**: Experimental {% else %} - GA + GA{{ lts_link_docker }} {% endif %} @@ -318,9 +325,10 @@ macOS downloads are **experimental**. Experimental downloads are not yet qualifi {% for r in releases %} + {% comment %} Add "Latest" class to release if it's the latest release. {% endcomment %} - {{ r.release_name }} {% comment %} Add link to each release r. {% endcomment %} + {{ r.release_name }}{% comment %} Add link to each release r {% endcomment %} {% if r.release_name == latest_hotfix.release_name %} Latest {% comment %} Add "Latest" badge to release if it's the latest release. {% endcomment %} {% endif %} @@ -353,7 +361,7 @@ macOS downloads are **experimental**. Experimental downloads are not yet qualifi ## Release naming -Cockroach Labs uses a three-component calendar versioning scheme to name CockroachDB [releases](https://cockroachlabs.com/docs/releases/index#production-releases). The format is `YY.R.PP`, where `YY` indicates the year, `R` indicates the release (“1” or “2”, representing a typical biannual cycle), and `PP` indicates the patch release version. Example: Version 23.1.0 (abbreviated v23.1.0). Leading up to a new major version's initial GA (Generally Available) release, multiple testing builds are produced, moving from Alpha to Beta to Release Candidate. CockroachDB began using this versioning scheme with v19.1. +Cockroach Labs uses a three-component calendar versioning scheme to name CockroachDB [releases](https://cockroachlabs.com/docs/releases/index#production-releases). The format is `YY.R.PP`, where `YY` indicates the year, `R` indicates the release (historically “1” or “2”, representing a typical biannual cycle), and `PP` indicates the patch release version. Example: Version 23.1.0 (abbreviated v23.1.0). Leading up to a new major version's initial GA (Generally Available) release, multiple testing builds are produced, moving from Alpha to Beta to Release Candidate. CockroachDB began using this versioning scheme with v19.1. A major release is typically produced twice a year indicating major enhancements to product functionality. A change in the `YY.R` component denotes a major release. @@ -364,5 +372,5 @@ During development of a major version of CockroachDB, releases are produced acco - Alpha releases are the earliest testing releases leading up to a major version's initial GA (generally available) release, and have `alpha` in the version name. Example: `v23.1.0-alpha.1`. - Beta releases are produced after the series of alpha releases leading up to a major version's initial GA release, and tend to be more stable and introduce fewer changes than alpha releases. They have `beta` in the version name. Example: `v23.1.0-beta.1`. - Release candidates are produced after the series of beta releases and are nearly identical to what will become the initial generally available (GA) release. Release candidates have `rc` in the version name. Example: `v23.1.0-rc.1`. -- A major version's GA release is produced after the series of release candidates for a major version, and ends with `0`. Example: `v23.1.0`. GA releases are validated and suitable for production environments. +- A major version's initial GA release is produced after the series of release candidates for a major version, and ends with `0`. Example: `v23.1.0`. GA releases are validated and suitable for production environments. - Patch (maintenance) releases are produced after a major version's GA release, and are numbered sequentially. Example: `v23.1.13`. diff --git a/src/current/releases/release-support-policy.md b/src/current/releases/release-support-policy.md index 755bab83c46..e897b9b4229 100644 --- a/src/current/releases/release-support-policy.md +++ b/src/current/releases/release-support-policy.md @@ -9,27 +9,38 @@ docs_area: releases {% assign versions = site.data.versions | where_exp: "versions", "versions.release_date <= today" | sort: "release_date" | reverse %} {% comment %} Get all versions (e.g., v21.2) sorted in reverse chronological order. {% endcomment %} -This page explains Cockroach Labs' policy for supporting [major releases]({% link releases/index.md %}) of CockroachDB. +This page explains Cockroach Labs' policy for supporting [production releases]({% link releases/index.md %}) of CockroachDB Self-Hosted. For clusters deployed in {{ site.data.products.cloud }}, refer to the [CockroachDB {{ site.data.products.cloud }} Support and Upgrade Policy](https://www.cockroachlabs.com/docs/cockroachcloud/upgrade-policy). -{{site.data.alerts.callout_info}} -For CockroachDB {{ site.data.products.cloud }} clusters, see the [CockroachDB {{ site.data.products.cloud }} Upgrade Policy](https://www.cockroachlabs.com/docs/cockroachcloud/upgrade-policy). -{{site.data.alerts.end}} +There are two support types: GA and LTS (Long-Term Support). Each patch release of CockroachDB is assigned one of these types. The default is GA, unless otherwise specified. -## Support cycle +Initially, a major release series has GA support. After the series demonstrates a continuously high level of stability and performance, new patch releases are designated as LTS releases, which provide extended support windows. Specifically, the distinction determines the time spans of a release’s support phases: Maintenance Support, Assistance Support, and EOL (End of Life). -Each major release of CockroachDB goes through the following support cycle: +## Support Phases -- **Maintenance Support:** For at least 365 days from the major release date, Cockroach Labs will produce regular patch releases that include critical security fixes and resolutions to problems identified by users. +- **Maintenance Support**: Cockroach Labs will produce regular patch releases that include critical security fixes and resolutions to problems identified by users. -- **Assistance Support:** Following the maintenance support period, Cockroach Labs will provide assistance support for at least an additional 180 days. During this period, the following guidelines will apply: - - New enhancements and error corrections will not be made to the major release. - - Cockroach Labs will direct customers to existing fixes/patches and workarounds applicable to the reported case. - - Cockroach Labs may direct customers to [upgrade](https://www.cockroachlabs.com/docs/stable/upgrade-cockroach-version) to a more current version of the product if a workaround does not exist. - - Cockroach Labs will continue to add critical security fixes to the major release in the form of patch releases. +- **Assistance Support**: Immediately follows the Maintenance Support period. During this period, the following guidelines apply: + - New enhancements will not be made to the major release. + - Cockroach Labs will continue to add critical security fixes to the major release in the form of patch releases. + - Patch releases for the purpose of resolving bugs or other errors may no longer be made to the major release. + - Cockroach Labs may direct customers to workarounds or other fixes applicable to the reported case. + - Cockroach Labs may direct customers to [upgrade](https://www.cockroachlabs.com/docs/stable/upgrade-cockroach-version) to a later version of the product, to resolve or further troubleshoot an issue. -- **End of Life (EOL):** Following the assistance support period, Cockroach Labs will no longer provide any support for the release. +- **End of Life (EOL)**: Following the assistance support period, Cockroach Labs will no longer provide any support for the release. -Cockroach Labs will notify you by mail or email 6 months in advance of a major release transitioning into **Assistance Support** or **EOL**. +## Support Types + +* **GA Support**: The default support type for production releases, starting with the initial production release of a major version, followed by each subsequent patch release before LTS releases begin for that major version. + * **Maintenance support ends**: + * **365 days** **after** the day of the **first production release** of the major version (i.e. the ‘GA release,’ ending in .0). + * **Assistance support ends**: + * **180 days after** the **Maintenance Support end date** of the release. + * Major versions prior to v23.1 will not have LTS releases. +* **LTS (Long-Term Support)**: Conferred to an initial LTS maintenance release of a given major version and its subsequent maintenance releases. LTS provides extended support windows while also indicating our highest level of expected release stability and performance. + * **Maintenance support ends**: + * **365 days** **after** the day of the **first LTS release** of the major version. + * **Assistance support ends**: + * **365 days after** the **Maintenance Support end date** of the release. ## Current supported releases @@ -40,22 +51,134 @@ Date format: YYYY-MM-DD - - + + + + - + + {% for v in versions %} {% assign r_latest = site.data.releases | where_exp: "r_latest", "r_latest.major_version == v.major_version" | where_exp: "r_latest", "r_latest.withdrawn != true" | sort: "release_date" | last | map: "version" %} {% comment %} Calculate the latest non-withdrawn release for a version v. {% endcomment %} - - - - - - - {% endfor %} {% comment %} Display each version, its release date, its maintenance support expiration date, and its assistance support expiration date. Also include links to the latest hotfix version. {% endcomment %} + {% comment %}Convert version (string) to numeric{% endcomment %} + {% assign major_version_numeric = v.major_version | remove_first: "v" | times:1 %} + + {% comment %}Initialize local variables {% endcomment %} + {% assign r_eol = false %} + {% assign r_has_lts = false %} + {% assign r_lts_eol = false %} + {% assign will_never_have_lts = false %} + + {% comment %}v23.1 and future will have LTS {% endcomment %} + {% if major_version_numeric < 23.1 %} + {% assign will_never_have_lts = true %} + {% endif %} + + {% comment %}Evaluate whether the version is EOL for GA or LTS or both{% endcomment %} + {% if v.asst_supp_exp_date < today %} + {% comment %}GA releases in this version are EOL{% endcomment %} + {% assign r_eol = true %} + {% if v.lts_asst_supp_exp_date != "N/A" %} + {% comment %}This major version has LTS releases{% endcomment %} + {% assign r_has_lts = true %} + {% if v.lts_asst_supp_exp_date < today %} + {% comment %}LTS releases exist for this major version and are EOL{% endcomment %} + {% assign r_lts_eol = true %} + {% endif %} + {% endif %} + {% endif %} + + + {% if r_eol != true and r_lts_eol != true %}{% comment %}Only show non-EOL releases {% endcomment %} + + {% if v.initial_lts_patch != "N/A" %}{% comment %} For LTS releases print an LTS row first{% endcomment %} + + + + + + + + + {% endif %} + + {% comment %} Always print a GA row. For 23.2+, add a link to the first footnote{% endcomment %} + + + + + + + + {% endif %} + + {% endfor %} {% comment %} Display each non-EOL version, its release date, its maintenance support expiration date, and its assistance support expiration date, and its LTS maintenance and assistance support dates. Also include links to the latest hotfix version. {% endcomment %} +
    VersionRelease DateMajor VersionPatch VersionsSupport TypeInitial Release Maintenance Support endsAssistance Support ends (EOL Date)Assistance Support ends
    {{ v.major_version }}{% if v.asst_supp_exp_date < today %}*{% endif %}{{ v.release_date }}{{ v.maint_supp_exp_date }}{{ v.asst_supp_exp_date }}
    {{ v.major_version }}{% if v.initial_lts_patch != "N/A" %}{{ v.initial_lts_patch }}+{% endif %}LTS{{ v.initial_lts_release_date }}{% if v.lts_maint_supp_exp_date != "N/A" %}{{ v.lts_maint_supp_exp_date }}{% endif %}{% if v.lts_asst_supp_exp_date != "N/A" %}{{ v.lts_asst_supp_exp_date }}{% endif %}
    {{ v.major_version }}{% if will_never_have_lts == false and v.initial_lts_patch == "N/A" %} *{% endif %}{% if v.last_ga_patch != "N/A" %}{{ v.major_version }}.0 - {{ v.last_ga_patch }}{% else %}{{ v.major_version }}.0+{% endif %}GA{{ v.release_date }}{% if v.maint_supp_exp_date != "N/A" %}{{ v.maint_supp_exp_date }}{% endif %}{% if v.asst_supp_exp_date != "N/A" %}{{ v.asst_supp_exp_date }}{% endif %}
    -* Version has reached EOL +*  : This major version will receive LTS patch releases, which will be listed on an additional row, upon their availability.
    + +## End-of-life (EOL) releases + +The following releases are no longer supported. + + + + + + + + + + + + + + {% for v in versions %} + {% assign r_latest = site.data.releases | where_exp: "r_latest", "r_latest.major_version == v.major_version" | where_exp: "r_latest", "r_latest.withdrawn != true" | sort: "release_date" | last | map: "version" %} {% comment %} Calculate the latest non-withdrawn release for a version v. {% endcomment %} + + {% comment %}Evaluate whether the version is EOL for GA or LTS or both{% endcomment %} + {% assign r_eol = false %} + {% assign r_lts_eol = false %} + {% if v.lts_asst_supp_exp_date != "N/A" %} + {% comment %}This major version has LTS releases{% endcomment %} + {% assign r_has_lts = true %} + {% if v.lts_asst_supp_exp_date < today %} + {% comment %}LTS releases exist for this major version and are EOL{% endcomment %} + {% assign r_lts_eol = true %} + {% endif %} + {% endif %} + {% if v.asst_supp_exp_date < today %} + {% comment %}GA releases in this version are EOL{% endcomment %} + {% assign r_eol = true %} + {% endif %} + + {% if r_eol == true %} + {% if r_lts_eol == true %} + {% comment %} For LTS releases print an LTS row first{% endcomment %} + + + + + + + + {% endif %} + + {% comment %} Always print a GA row{% endcomment %} + + + + + + + + + {% endif %} + + {% endfor %} {% comment %} Display each EOL version, its release date, its maintenance support expiration date, and its assistance support expiration date, and its LTS maintenance and assistance support dates. Also include links to the latest hotfix version. {% endcomment %} + +
    Major VersionPatch VersionsSupport TypeInitial ReleaseMaintenance Support endedAssistance Support ended
    {{ v.major_version }}{{ v.initial_lts_patch }}+LTS{{ v.initial_lts_release_date }}{% if v.lts_maint_supp_exp_date != "N/A" %}{{ v.lts_maint_supp_exp_date }}{% endif %}{% if v.lts_asst_supp_exp_date != "N/A" %}{{ v.lts_asst_supp_exp_date }}{% endif %}
    {{ v.major_version }}{% if v.last_ga_patch != "N/A" %}{{ v.major_version }}.0 - {{ v.last_ga_patch }}{% else %}{{ v.major_version }}.0+{% endif %}GA{{ v.release_date }}{% if v.maint_supp_exp_date != "N/A" %}{{ v.maint_supp_exp_date }}{% endif %}{% if v.asst_supp_exp_date != "N/A" %}{{ v.asst_supp_exp_date }}{% endif %}
    diff --git a/src/current/releases/v24.1.md b/src/current/releases/v24.1.md index 8e5bbbedc6d..3c1cb5de992 100644 --- a/src/current/releases/v24.1.md +++ b/src/current/releases/v24.1.md @@ -30,7 +30,7 @@ Get future release notes emailed to you: {% comment %} {% unless vers.release_date == "N/A" or vers.release_date > today %} -To upgrade to {{ page.major_version }}, see [Upgrade to CockroachDB {{ page.major_version }}](https://www.cockroachlabs.com/docs/{{ page.major_version }}/upgrade-cockroach-version). +To upgrade to {{ page.major_version }}, refer to [Upgrade to CockroachDB {{ page.major_version }}](https://www.cockroachlabs.com/docs/{{ page.major_version }}/upgrade-cockroach-version). {% endunless %} {% endcomment %} diff --git a/src/current/v22.2/sso-sql.md b/src/current/v22.2/sso-sql.md index fe480dffec6..444c562aa0d 100644 --- a/src/current/v22.2/sso-sql.md +++ b/src/current/v22.2/sso-sql.md @@ -1,6 +1,6 @@ --- title: Cluster Single Sign-on (SSO) using a JSON web token (JWT) -summary: Overview of Cluster Single Sign-on (SSO) for CockroachDB {{ site.data.products.core }}, review of authenticating users, configuring required cluster settings. +summary: Overview of Cluster Single Sign-on (SSO) for CockroachDB Cloud, review of authenticating users, configuring required cluster settings. toc: true docs_area: manage --- diff --git a/src/current/v23.1/sso-sql.md b/src/current/v23.1/sso-sql.md index 1f8baedfc7e..87cb19e3bd4 100644 --- a/src/current/v23.1/sso-sql.md +++ b/src/current/v23.1/sso-sql.md @@ -1,6 +1,6 @@ --- title: Cluster Single Sign-on (SSO) using JSON web tokens (JWTs) -summary: Overview of Cluster Single Sign-on (SSO) for CockroachDB {{ site.data.products.core }}, review of authenticating users, configuring required cluster settings. +summary: Overview of Cluster Single Sign-on (SSO) for CockroachDB Cloud, review of authenticating users, configuring required cluster settings. toc: true docs_area: manage --- diff --git a/src/current/v23.1/upgrade-cockroach-version.md b/src/current/v23.1/upgrade-cockroach-version.md index 368cae848d3..a8ff465b97c 100644 --- a/src/current/v23.1/upgrade-cockroach-version.md +++ b/src/current/v23.1/upgrade-cockroach-version.md @@ -14,16 +14,16 @@ docs_area: manage Because of CockroachDB's [multi-active availability]({% link {{ page.version.version }}/multi-active-availability.md %}) design, you can perform a "rolling upgrade" of your CockroachDB cluster. This means that you can upgrade nodes one at a time without interrupting the cluster's overall health and operations. -This page describes how to upgrade to the latest **{{ page.version.version }}** release, **{{ latest.release_name }}**. To upgrade CockroachDB on Kubernetes, refer to [single-cluster]({% link {{ page.version.version }}/upgrade-cockroachdb-kubernetes.md %}) or [multi-cluster]({% link {{ page.version.version }}/orchestrate-cockroachdb-with-kubernetes-multi-cluster.md %}#upgrade-the-cluster) instead. +This page describes how to upgrade to the latest **{{ page.version.version }}** release, **{{ latest.release_name }}**{% if latest.lts == true %} ([LTS]({% link releases/release-support-policy.md %}#support-types)){% endif %}. To upgrade CockroachDB on Kubernetes, refer to [single-cluster]({% link {{ page.version.version }}/upgrade-cockroachdb-kubernetes.md %}) or [multi-cluster]({% link {{ page.version.version }}/orchestrate-cockroachdb-with-kubernetes-multi-cluster.md %}#upgrade-the-cluster) instead. ## Terminology Before upgrading, review the CockroachDB [release](../releases/) terminology: -- A new *major release* is performed every 6 months. The major version number indicates the year of release followed by the release number, which will be either 1 or 2. For example, the latest major release is {{ actual_latest_prod.major_version }} (also written as {{ actual_latest_prod.major_version }}.0). -- Each [supported](https://www.cockroachlabs.com/docs/releases/release-support-policy) major release is maintained across *patch releases* that fix crashes, security issues, and data correctness issues. Each patch release increments the major version number with its corresponding patch number. For example, patch releases of {{ actual_latest_prod.major_version }} use the format {{ actual_latest_prod.major_version }}.x. -- All major and patch releases are suitable for production usage, and are therefore considered "production releases". For example, the latest production release is {{ actual_latest_prod.release_name }}. -- Prior to an upcoming major release, alpha and beta releases and release candidates are made available. These "testing releases" are not suitable for production usage. They are intended for users who need early access to a feature before it is available in a production release. These releases append the terms `alpha`, `beta`, or `rc` to the version number. +- A new *major release* is performed multiple times per year. The major version number indicates the year of release followed by the release number, starting with 1. For example, the latest major release is {{ actual_latest_prod.major_version }}. +- Each [supported](https://www.cockroachlabs.com/docs/releases/release-support-policy) major release is maintained across *patch releases* that contain improvements including performance or security enhancements and bug fixes. Each patch release increments the major version number with its corresponding patch number. For example, patch releases of {{ actual_latest_prod.major_version }} use the format {{ actual_latest_prod.major_version }}.x. +- All major and patch releases are suitable for production environments, and are therefore considered "production releases". For example, the latest production release is {{ actual_latest_prod.release_name }}. +- Prior to an upcoming major release, alpha, beta, and release candidate (RC) binaries are made available for users who need early access to a feature before it is available in a production release. These releases append the terms `alpha`, `beta`, or `rc` to the version number.These "testing releases" are not suitable for production environments and are not eligible for spuport or uptime SLA commitments. For more information, refer to the [Release Support Policy](https://www.cockroachlabs.com/docs/releases/release-support-policy). {{site.data.alerts.callout_info}} There are no "minor releases" of CockroachDB. diff --git a/src/current/v23.2/sso-sql.md b/src/current/v23.2/sso-sql.md index 163700877e4..aaf460bc01e 100644 --- a/src/current/v23.2/sso-sql.md +++ b/src/current/v23.2/sso-sql.md @@ -1,6 +1,6 @@ --- title: Cluster Single Sign-on (SSO) using JSON web tokens (JWTs) -summary: Overview of Cluster Single Sign-on (SSO) for CockroachDB {{ site.data.products.core }}, review of authenticating users, configuring required cluster settings. +summary: Overview of Cluster Single Sign-on (SSO) for CockroachDB Self-Hosted, review of authenticating users, configuring required cluster settings. toc: true docs_area: manage --- diff --git a/src/current/v23.2/upgrade-cockroach-version.md b/src/current/v23.2/upgrade-cockroach-version.md index 45ab6da0936..42be2dd9389 100644 --- a/src/current/v23.2/upgrade-cockroach-version.md +++ b/src/current/v23.2/upgrade-cockroach-version.md @@ -14,16 +14,16 @@ docs_area: manage Because of CockroachDB's [multi-active availability]({% link {{ page.version.version }}/multi-active-availability.md %}) design, you can perform a "rolling upgrade" of your CockroachDB cluster. This means that you can upgrade nodes one at a time without interrupting the cluster's overall health and operations. -This page describes how to upgrade to the latest **{{ page.version.version }}** release, **{{ latest.release_name }}**. To upgrade CockroachDB on Kubernetes, refer to [single-cluster]({% link {{ page.version.version }}/upgrade-cockroachdb-kubernetes.md %}) or [multi-cluster]({% link {{ page.version.version }}/orchestrate-cockroachdb-with-kubernetes-multi-cluster.md %}#upgrade-the-cluster) instead. +This page describes how to upgrade to the latest **{{ page.version.version }}** release, **{{ latest.release_name }}**{% if latest.lts == true %} ([LTS]({% link releases/release-support-policy.md %}#support-types)){% endif %}. To upgrade CockroachDB on Kubernetes, refer to [single-cluster]({% link {{ page.version.version }}/upgrade-cockroachdb-kubernetes.md %}) or [multi-cluster]({% link {{ page.version.version }}/orchestrate-cockroachdb-with-kubernetes-multi-cluster.md %}#upgrade-the-cluster) instead. ## Terminology Before upgrading, review the CockroachDB [release](../releases/) terminology: -- A new *major release* is performed every 6 months. The major version number indicates the year of release followed by the release number, which will be either 1 or 2. For example, the latest major release is {{ actual_latest_prod.major_version }} (also written as {{ actual_latest_prod.major_version }}.0). -- Each [supported](https://www.cockroachlabs.com/docs/releases/release-support-policy) major release is maintained across *patch releases* that fix crashes, security issues, and data correctness issues. Each patch release increments the major version number with its corresponding patch number. For example, patch releases of {{ actual_latest_prod.major_version }} use the format {{ actual_latest_prod.major_version }}.x. -- All major and patch releases are suitable for production usage, and are therefore considered "production releases". For example, the latest production release is {{ actual_latest_prod.release_name }}. -- Prior to an upcoming major release, alpha and beta releases and release candidates are made available. These "testing releases" are not suitable for production usage. They are intended for users who need early access to a feature before it is available in a production release. These releases append the terms `alpha`, `beta`, or `rc` to the version number. +- A new *major release* is performed multiple times per year. The major version number indicates the year of release followed by the release number, starting with 1. For example, the latest major release is {{ actual_latest_prod.major_version }}. +- Each [supported](https://www.cockroachlabs.com/docs/releases/release-support-policy) major release is maintained across *patch releases* that contain improvements including performance or security enhancements and bug fixes. Each patch release increments the major version number with its corresponding patch number. For example, patch releases of {{ actual_latest_prod.major_version }} use the format {{ actual_latest_prod.major_version }}.x. +- All major and patch releases are suitable for production environments, and are therefore considered "production releases". For example, the latest production release is {{ actual_latest_prod.release_name }}. +- Prior to an upcoming major release, alpha, beta, and release candidate (RC) binaries are made available for users who need early access to a feature before it is available in a production release. These releases append the terms `alpha`, `beta`, or `rc` to the version number.These "testing releases" are not suitable for production environments and are not eligible for spuport or uptime SLA commitments. For more information, refer to the [Release Support Policy](https://www.cockroachlabs.com/docs/releases/release-support-policy). {{site.data.alerts.callout_info}} There are no "minor releases" of CockroachDB. diff --git a/src/current/v24.1/sso-sql.md b/src/current/v24.1/sso-sql.md index 163700877e4..aaf460bc01e 100644 --- a/src/current/v24.1/sso-sql.md +++ b/src/current/v24.1/sso-sql.md @@ -1,6 +1,6 @@ --- title: Cluster Single Sign-on (SSO) using JSON web tokens (JWTs) -summary: Overview of Cluster Single Sign-on (SSO) for CockroachDB {{ site.data.products.core }}, review of authenticating users, configuring required cluster settings. +summary: Overview of Cluster Single Sign-on (SSO) for CockroachDB Self-Hosted, review of authenticating users, configuring required cluster settings. toc: true docs_area: manage --- diff --git a/src/current/v24.1/upgrade-cockroach-version.md b/src/current/v24.1/upgrade-cockroach-version.md index e0eb6562191..59be71b63c9 100644 --- a/src/current/v24.1/upgrade-cockroach-version.md +++ b/src/current/v24.1/upgrade-cockroach-version.md @@ -14,20 +14,16 @@ docs_area: manage Because of CockroachDB's [multi-active availability]({% link {{ page.version.version }}/multi-active-availability.md %}) design, you can perform a "rolling upgrade" of your CockroachDB cluster. This means that you can upgrade nodes one at a time without interrupting the cluster's overall health and operations. -This page describes how to upgrade to the latest **{{ page.version.version }}** release, **{{ latest.release_name }}**. To upgrade CockroachDB on Kubernetes, refer to [single-cluster]({% link {{ page.version.version }}/upgrade-cockroachdb-kubernetes.md %}) or [multi-cluster]({% link {{ page.version.version }}/orchestrate-cockroachdb-with-kubernetes-multi-cluster.md %}#upgrade-the-cluster) instead. - -{{site.data.alerts.callout_info}} -CockroachDB v23.2 is now generally available and production-ready for CockroachDB {{ site.data.products.dedicated }}, and is scheduled to be made available for CockroachDB {{ site.data.products.core }} on February 5, 2024. -{{site.data.alerts.end}} +This page describes how to upgrade to the latest **{{ page.version.version }}** release, **{{ latest.release_name }}**{% if latest.lts == true %} ([LTS]({% link releases/release-support-policy.md %}#support-types)){% endif %}. To upgrade CockroachDB on Kubernetes, refer to [single-cluster]({% link {{ page.version.version }}/upgrade-cockroachdb-kubernetes.md %}) or [multi-cluster]({% link {{ page.version.version }}/orchestrate-cockroachdb-with-kubernetes-multi-cluster.md %}#upgrade-the-cluster) instead. ## Terminology Before upgrading, review the CockroachDB [release](../releases/) terminology: -- A new *major release* is performed every 6 months. The major version number indicates the year of release followed by the release number, which will be either 1 or 2. For example, the latest major release is {{ actual_latest_prod.major_version }} (also written as {{ actual_latest_prod.major_version }}.0). -- Each [supported](https://www.cockroachlabs.com/docs/releases/release-support-policy) major release is maintained across *patch releases* that fix crashes, security issues, and data correctness issues. Each patch release increments the major version number with its corresponding patch number. For example, patch releases of {{ actual_latest_prod.major_version }} use the format {{ actual_latest_prod.major_version }}.x. -- All major and patch releases are suitable for production usage, and are therefore considered "production releases". For example, the latest production release is {{ actual_latest_prod.release_name }}. -- Prior to an upcoming major release, alpha and beta releases and release candidates are made available. These "testing releases" are not suitable for production usage. They are intended for users who need early access to a feature before it is available in a production release. These releases append the terms `alpha`, `beta`, or `rc` to the version number. +- A new *major release* is performed multiple times per year. The major version number indicates the year of release followed by the release number, starting with 1. For example, the latest major release is {{ actual_latest_prod.major_version }}. +- Each [supported](https://www.cockroachlabs.com/docs/releases/release-support-policy) major release is maintained across *patch releases* that contain improvements including performance or security enhancements and bug fixes. Each patch release increments the major version number with its corresponding patch number. For example, patch releases of {{ actual_latest_prod.major_version }} use the format {{ actual_latest_prod.major_version }}.x. +- All major and patch releases are suitable for production environments, and are therefore considered "production releases". For example, the latest production release is {{ actual_latest_prod.release_name }}. +- Prior to an upcoming major release, alpha, beta, and release candidate (RC) binaries are made available for users who need early access to a feature before it is available in a production release. These releases append the terms `alpha`, `beta`, or `rc` to the version number.These "testing releases" are not suitable for production environments and are not eligible for spuport or uptime SLA commitments. For more information, refer to the [Release Support Policy](https://www.cockroachlabs.com/docs/releases/release-support-policy). {{site.data.alerts.callout_info}} There are no "minor releases" of CockroachDB. From 395dcd1d04c3d61490f6759d8cadb13a7820df8f Mon Sep 17 00:00:00 2001 From: Rich Loveland Date: Wed, 1 May 2024 14:04:08 -0400 Subject: [PATCH 10/25] Add v23.1.20 release notes (#18508) * Add v23.1.20 release notes Fixes DOC-10136 --- src/current/_data/releases.yml | 27 ++++++++++++++ .../_includes/releases/v23.1/v23.1.20.md | 35 +++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 src/current/_includes/releases/v23.1/v23.1.20.md diff --git a/src/current/_data/releases.yml b/src/current/_data/releases.yml index 4d07485be3b..c8ffccdc869 100644 --- a/src/current/_data/releases.yml +++ b/src/current/_data/releases.yml @@ -5932,3 +5932,30 @@ docker_arm_limited_access: false source: true previous_release: v24.1.0-beta.2 + +- release_name: v23.1.20 + major_version: v23.1 + release_date: '2024-05-01' + release_type: Production + go_version: go1.22.0 + sha: 93a67980ee45391b8ef02d40a6d50ddb0245817b + has_sql_only: true + has_sha256sum: true + mac: + mac_arm: true + mac_arm_experimental: true + mac_arm_limited_access: false + windows: true + linux: + linux_arm: true + linux_arm_experimental: true + linux_arm_limited_access: false + linux_intel_fips: true + linux_arm_fips: false + docker: + docker_image: cockroachdb/cockroach + docker_arm: true + docker_arm_experimental: true + docker_arm_limited_access: false + source: true + previous_release: v23.1.19 diff --git a/src/current/_includes/releases/v23.1/v23.1.20.md b/src/current/_includes/releases/v23.1/v23.1.20.md new file mode 100644 index 00000000000..48a4ab3ceb3 --- /dev/null +++ b/src/current/_includes/releases/v23.1/v23.1.20.md @@ -0,0 +1,35 @@ +## v23.1.20 + +Release Date: May 1, 2024 + +{% include releases/release-downloads-docker-image.md release=include.release %} + +

    SQL language changes

    + +- Added a [session variable]({% link v23.1/set-vars.md %}) `optimizer_use_improved_multi_column_selectivity_estimate`, which if enabled, causes the [optimizer]({% link v23.1/cost-based-optimizer.md %}) to use an improved selectivity estimate for multi-column predicates. This setting will default to `true` on versions 24.2+, and `false` on prior versions. [#123152][#123152] +- Added three new [cluster settings]({% link v23.1/cluster-settings.md %}) for controlling [optimizer table statistics]({% link v23.1/cost-based-optimizer.md %}#table-statistics) forecasting: + 1. `sql.stats.forecasts.min_observations` is the minimum number of observed statistics required to produce a forecast. + 1. `sql.stats.forecasts.min_goodness_of_fit` is the minimum R² (goodness of fit) measurement required from all predictive models to use a forecast. + 1. `sql.stats.forecasts.max_decrease` is the most a prediction can decrease, expressed as the minimum ratio of the prediction to the lowest prior observation. [#123149][#123149] + +

    Bug fixes

    + +- Statistics forecasts of zero rows by [the optimizer]({% link v23.1/cost-based-optimizer.md %}#table-statistics) can cause bad plans. This commit changes forecasting to avoid predicting zero rows for most downward-trending statistics. [#123149][#123149] +- A [job]({% link v23.1/show-jobs.md %}) will now [log]({% link v23.1/logging.md %}#ops) rather than fail if it reports an out-of bound progress fraction. [#123133][#123133] + +

    Performance improvements

    + +- Added a new [session variable]({% link v23.1/set-vars.md %}) `optimizer_use_improved_zigzag_join_costing`. When enabled, the cost of [zigzag joins]({% link v23.1/cost-based-optimizer.md %}#zigzag-joins) is updated so zigzag joins will only be chosen over scans if the zigzag joins produce fewer rows. This change only applies if the session variable `enable_zigzag_join` is also `on`. [#123152][#123152] +- Improved the selectivity estimation of multi-column filters by the [optimizer]({% link v23.1/cost-based-optimizer.md %}) when the multi-column distinct count is high. This avoids cases where CockroachDB significantly over-estimates the selectivity of a multi-column predicate and as a result can prevent the optimizer from choosing a bad query plan. [#123152][#123152] + +
    + +

    Contributors

    + +This release includes 5 merged PRs by 5 authors. + +
    + +[#123133]: https://github.com/cockroachdb/cockroach/pull/123133 +[#123149]: https://github.com/cockroachdb/cockroach/pull/123149 +[#123152]: https://github.com/cockroachdb/cockroach/pull/123152 From e6a1f7d2053ef04a657c18224a6168e406ba2d50 Mon Sep 17 00:00:00 2001 From: Rich Loveland Date: Thu, 2 May 2024 16:06:56 -0400 Subject: [PATCH 11/25] Update v23.1.13 and v23.1.20 release metadata (#18513) * Update v23.1.13 and v23.1.20 release metadata Summary of changes: - Update v23.1.13: - Mark ARM as NOT experimental - Update v23.1.20: - Mark ARM as NOT experimental - Mark this as an LTS release * Correct some more metadata --------- Co-authored-by: Matt Linville --- src/current/_data/releases.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/current/_data/releases.yml b/src/current/_data/releases.yml index c8ffccdc869..ce05dca4433 100644 --- a/src/current/_data/releases.yml +++ b/src/current/_data/releases.yml @@ -5262,14 +5262,14 @@ windows: true linux: linux_arm: true - linux_arm_experimental: true + linux_arm_experimental: false linux_arm_limited_access: false linux_intel_fips: true linux_arm_fips: false docker: docker_image: cockroachdb/cockroach docker_arm: true - docker_arm_experimental: true + docker_arm_experimental: false docker_arm_limited_access: false source: true previous_release: v23.1.12 @@ -5323,7 +5323,7 @@ docker: docker_image: cockroachdb/cockroach-unstable docker_arm: true - docker_arm_experimental: false + docker_arm_experimental: true docker_arm_limited_access: true source: true previous_release: v23.2.0-beta.3 @@ -5350,7 +5350,7 @@ docker: docker_image: cockroachdb/cockroach-unstable docker_arm: true - docker_arm_experimental: false + docker_arm_experimental: true docker_arm_limited_access: true source: true previous_release: v23.2.0-rc.1 @@ -5792,7 +5792,7 @@ docker: docker_image: cockroachdb/cockroach docker_arm: true - docker_arm_experimental: true + docker_arm_experimental: false docker_arm_limited_access: false source: true previous_release: v23.1.17 @@ -5937,6 +5937,7 @@ major_version: v23.1 release_date: '2024-05-01' release_type: Production + lts: true go_version: go1.22.0 sha: 93a67980ee45391b8ef02d40a6d50ddb0245817b has_sql_only: true @@ -5948,14 +5949,14 @@ windows: true linux: linux_arm: true - linux_arm_experimental: true + linux_arm_experimental: false linux_arm_limited_access: false linux_intel_fips: true linux_arm_fips: false docker: docker_image: cockroachdb/cockroach docker_arm: true - docker_arm_experimental: true + docker_arm_experimental: false docker_arm_limited_access: false source: true previous_release: v23.1.19 From 8b9ffd8a9b0344377fc319a73275d04630911e80 Mon Sep 17 00:00:00 2001 From: "Matt Linville (he/him)" Date: Thu, 2 May 2024 15:51:23 -0700 Subject: [PATCH 12/25] [DOC-9256] Update Terraform page (#18474) - Remove machine_type field - Change wget examples to use curl to remove a dependency --- .../cockroachcloud/provision-a-cluster-with-terraform.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/current/cockroachcloud/provision-a-cluster-with-terraform.md b/src/current/cockroachcloud/provision-a-cluster-with-terraform.md index 94fd26fe304..425831c09aa 100644 --- a/src/current/cockroachcloud/provision-a-cluster-with-terraform.md +++ b/src/current/cockroachcloud/provision-a-cluster-with-terraform.md @@ -96,7 +96,6 @@ In this tutorial, you will create a CockroachDB {{ site.data.products.dedicated cloud_provider_regions = ["{cloud provider region}"] cluster_node_count = {number of nodes} storage_gib = {storage in GiB} - machine_type = "{cloud provider machine type}" allow_list_name = "{allow list name}" cidr_ip = "{allow list CIDR IP}" cidr_mask = {allow list CIDR mask} @@ -110,7 +109,6 @@ In this tutorial, you will create a CockroachDB {{ site.data.products.dedicated - `{cloud provider regions}` is the region code or codes for the cloud infrastructure provider. For multi-region clusters, separate each region with a comma. - `{number of nodes}` is the number of nodes in each region. Cockroach Labs recommends at least 3 nodes per region, and the same number of nodes in each region for multi-region clusters. - `{storage in GiB}` is the amount of storage specified in GiB. - - `{cloud provider machine type}` is the machine type for the cloud infrastructure provider. - `{allow list name}` is the name for the [IP allow list]({% link cockroachcloud/network-authorization.md %}#ip-allowlisting). Use a descriptive name to identify the IP allow list. - `{allow list CIDR IP}` is the Classless Inter-Domain Routing (CIDR) IP address base. - `{allow list CIDR mask}` is the CIDR mask. @@ -126,7 +124,6 @@ In this tutorial, you will create a CockroachDB {{ site.data.products.dedicated cloud_provider_regions = ["us-west2"] cluster_node_count = 3 storage_gib = 15 - machine_type = "n1-standard-2" allow_list_name = "Max's home network" cidr_ip = "1.2.3.4" cidr_mask = 32 @@ -251,7 +248,6 @@ Terraform will perform the following actions: + creator_id = (known after apply) + dedicated = { + disk_iops = (known after apply) - + machine_type = (known after apply) + memory_gib = (known after apply) + num_virtual_cpus = (known after apply) + storage_gib = (known after apply) @@ -288,7 +284,6 @@ Terraform will perform the following actions: + creator_id = (known after apply) + dedicated = { + disk_iops = (known after apply) - + machine_type = "n1-standard-2" + memory_gib = (known after apply) + num_virtual_cpus = (known after apply) + storage_gib = 15 @@ -362,7 +357,6 @@ cluster = { "creator_id" = tostring(null) "dedicated" = { "disk_iops" = 450 - "machine_type" = "n1-standard-2" "memory_gib" = 7.5 "num_virtual_cpus" = 2 "storage_gib" = 15 @@ -452,7 +446,6 @@ resource "cockroach_cluster" "example" { creator_id = "98e75f0a-072b-44dc-95d2-cc36cd425cab" dedicated = { disk_iops = 450 - machine_type = "n1-standard-2" memory_gib = 7.5 num_virtual_cpus = 2 storage_gib = 15 @@ -481,7 +474,6 @@ data "cockroach_cluster" "example" { cockroach_version = "v22.2.0" dedicated = { disk_iops = 450 - machine_type = "n1-standard-2" memory_gib = 7.5 num_virtual_cpus = 2 storage_gib = 15 @@ -506,7 +498,6 @@ cluster = { creator_id = null dedicated = { disk_iops = 450 - machine_type = "n1-standard-2" memory_gib = 7.5 num_virtual_cpus = 2 storage_gib = 15 From 8e777dfef9fc435d3540462a331fdceb4e1b079b Mon Sep 17 00:00:00 2001 From: shannonbradshaw Date: Fri, 3 May 2024 08:44:21 -0400 Subject: [PATCH 13/25] remove old training materials so that customers can no longer find them --- .../training/architecture-overview.md | 30 - src/archived/training/backup-and-restore.md | 335 ---------- .../client-connection-troubleshooting.md | 168 ----- .../training/cluster-startup-and-scaling.md | 319 ---------- .../cluster-unavailability-troubleshooting.md | 107 ---- src/archived/training/cluster-upgrade.md | 249 -------- .../data-corruption-troubleshooting.md | 185 ------ src/archived/training/data-import.md | 339 ---------- .../data-unavailability-troubleshooting.md | 304 --------- .../fault-tolerance-and-automated-repair.md | 281 --------- src/archived/training/geo-partitioning.md | 580 ------------------ .../training/how-cockroach-labs-debugs.md | 13 - src/archived/training/how-to-get-support.md | 38 -- src/archived/training/index.md | 24 - .../locality-and-replication-zones.md | 406 ------------ src/archived/training/logs.md | 13 - .../training/monitoring-and-alerting.md | 13 - .../network-partition-troubleshooting.md | 185 ------ src/archived/training/node-decommissioning.md | 119 ---- .../training/node-startup-troubleshooting.md | 322 ---------- .../training/orchestration-with-kubernetes.md | 525 ---------------- .../training/performance-benchmarking.md | 166 ----- src/archived/training/planned-maintenance.md | 195 ------ .../training/production-deployment.md | 13 - .../training/resources/docker-compose.yaml | 95 --- .../training/resources/mysql_dump.sql | 77 --- src/archived/training/resources/pg_dump.sql | 125 ---- .../training/resources/pg_dump_cleaned.sql | 119 ---- src/archived/training/security.md | 263 -------- .../software-panic-troubleshooting.md | 101 --- src/archived/training/sql-basics.md | 439 ------------- .../under-replication-troubleshooting.md | 111 ---- src/archived/training/users-and-privileges.md | 320 ---------- src/archived/training/why-cockroachdb.md | 30 - 34 files changed, 6609 deletions(-) delete mode 100644 src/archived/training/architecture-overview.md delete mode 100644 src/archived/training/backup-and-restore.md delete mode 100644 src/archived/training/client-connection-troubleshooting.md delete mode 100644 src/archived/training/cluster-startup-and-scaling.md delete mode 100644 src/archived/training/cluster-unavailability-troubleshooting.md delete mode 100644 src/archived/training/cluster-upgrade.md delete mode 100644 src/archived/training/data-corruption-troubleshooting.md delete mode 100644 src/archived/training/data-import.md delete mode 100644 src/archived/training/data-unavailability-troubleshooting.md delete mode 100644 src/archived/training/fault-tolerance-and-automated-repair.md delete mode 100644 src/archived/training/geo-partitioning.md delete mode 100644 src/archived/training/how-cockroach-labs-debugs.md delete mode 100644 src/archived/training/how-to-get-support.md delete mode 100644 src/archived/training/index.md delete mode 100644 src/archived/training/locality-and-replication-zones.md delete mode 100644 src/archived/training/logs.md delete mode 100644 src/archived/training/monitoring-and-alerting.md delete mode 100644 src/archived/training/network-partition-troubleshooting.md delete mode 100644 src/archived/training/node-decommissioning.md delete mode 100644 src/archived/training/node-startup-troubleshooting.md delete mode 100644 src/archived/training/orchestration-with-kubernetes.md delete mode 100644 src/archived/training/performance-benchmarking.md delete mode 100644 src/archived/training/planned-maintenance.md delete mode 100644 src/archived/training/production-deployment.md delete mode 100644 src/archived/training/resources/docker-compose.yaml delete mode 100644 src/archived/training/resources/mysql_dump.sql delete mode 100644 src/archived/training/resources/pg_dump.sql delete mode 100644 src/archived/training/resources/pg_dump_cleaned.sql delete mode 100644 src/archived/training/security.md delete mode 100644 src/archived/training/software-panic-troubleshooting.md delete mode 100644 src/archived/training/sql-basics.md delete mode 100644 src/archived/training/under-replication-troubleshooting.md delete mode 100644 src/archived/training/users-and-privileges.md delete mode 100644 src/archived/training/why-cockroachdb.md diff --git a/src/archived/training/architecture-overview.md b/src/archived/training/architecture-overview.md deleted file mode 100644 index 621efbbe5e9..00000000000 --- a/src/archived/training/architecture-overview.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Architecture Overview -summary: Learn more about CockroachDB's underlying architecture -toc: false -sidebar_data: sidebar-data-training.json ---- - -Watch the rest of Alex Robinson's talk, where he explains the CockroachDB architecture and how it was built. You can also read through a related set of slides. - -
    - - -
    -

    - -
    - - - -
    - -
    - - - -
    - -## What's next? - -[Cluster Startup and Scaling](cluster-startup-and-scaling.html) diff --git a/src/archived/training/backup-and-restore.md b/src/archived/training/backup-and-restore.md deleted file mode 100644 index 32cf9154bee..00000000000 --- a/src/archived/training/backup-and-restore.md +++ /dev/null @@ -1,335 +0,0 @@ ---- -title: Backup and Restore -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false ---- - - - - - -## Before you begin - -In this lab, you'll start with a fresh cluster, so make sure you've stopped and cleaned up the cluster from the previous labs. - -## Step 1. Start a 3-node cluster - -Start and initialize an insecure cluster like you did in previous modules. - -1. Start node 1: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node1 \ - --listen-addr=localhost:26257 \ - --http-addr=localhost:8080 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -2. Start node 2: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -3. Start node 3: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -4. Perform a one-time initialization of the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach init --insecure --host=localhost:26257 - ~~~ - -## Step 2. Perform a "core" backup - -1. Use the [`cockroach gen`](../cockroach-gen.html) command to generate an example `startrek` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach gen example-data startrek | cockroach sql --insecure - ~~~ - -2. Check the contents of the `startrek` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SELECT * FROM startrek.episodes LIMIT 1;" \ - --execute="SELECT * FROM startrek.quotes LIMIT 1;" - ~~~ - - ~~~ - id | season | num | title | stardate - +----+--------+-----+--------------+-------------+ - 1 | 1 | 1 | The Man Trap | 1531.100000 - (1 row) - quote | characters | stardate | episode - +----------------------------------------------------------------------+------------------------+----------+---------+ - "... freedom ... is a worship word..." "It is our worship word too." | Cloud William and Kirk | NULL | 52 - (1 row) - ~~~ - -3. Use the [`cockroach dump`](../cockroach-dump.html) command to create a SQL dump file for the `startrek` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach dump startrek \ - --insecure \ - --host=localhost:26257 > startrek_backup.sql - ~~~ - -4. Take a look at the generated `startrek_backup.sql` file. - - You'll see that it contains the SQL for recreating the two tables in the `startrek` database and inserting all current rows into those tables. - - ~~~ - CREATE TABLE episodes ( - id INT NOT NULL, - season INT NULL, - num INT NULL, - title STRING NULL, - stardate DECIMAL NULL, - CONSTRAINT "primary" PRIMARY KEY (id ASC), - FAMILY "primary" (id, season, num, title, stardate) - ); - - CREATE TABLE quotes ( - quote STRING NULL, - characters STRING NULL, - stardate DECIMAL NULL, - episode INT NULL, - CONSTRAINT fk_episode_ref_episodes FOREIGN KEY (episode) REFERENCES episodes (id), - INDEX quotes_episode_idx (episode ASC), - FAMILY "primary" (quote, characters, stardate, episode, rowid) - ); - - INSERT INTO episodes (id, season, num, title, stardate) VALUES - (1, 1, 1, 'The Man Trap', 1531.1), - (2, 1, 2, 'Charlie X', 1533.6), - (3, 1, 3, 'Where No Man Has Gone Before', 1312.4), - (4, 1, 4, 'The Naked Time', 1704.2), - (5, 1, 5, 'The Enemy Within', 1672.1), - ... - ~~~ - -## Step 3. Perform a "core" restore - -Now imagine the tables in the `startrek` database have changed and you want to restore them to their state at the time of the dump. - -1. Drop the tables in the `startrek` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="DROP TABLE startrek.episodes,startrek.quotes CASCADE;" - ~~~ - -2. Confirm that the tables in the `startrek` database are gone: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SHOW TABLES FROM startrek;" - ~~~ - - ~~~ - table_name - +------------+ - (0 rows) - ~~~ - -3. Restore the tables in the `startrek` database from the dump file: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --database=startrek < startrek_backup.sql - ~~~ - -3. Check the contents of the `startrek` database again: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SELECT * FROM startrek.episodes LIMIT 1;" \ - --execute="SELECT * FROM startrek.quotes LIMIT 1;" - ~~~ - - ~~~ - id | season | num | title | stardate - +----+--------+-----+--------------+-------------+ - 1 | 1 | 1 | The Man Trap | 1531.100000 - (1 row) - quote | characters | stardate | episode - +----------------------------------------------------------------------+------------------------+----------+---------+ - "... freedom ... is a worship word..." "It is our worship word too." | Cloud William and Kirk | NULL | 52 - (1 row) - ~~~ - -## Step 4. Perform an "enterprise" backup - -Next, you'll use the enterprise `BACKUP` feature to create a backup of the `startrek` database on S3. - -1. If you requested and enabled a trial enterprise license in the [Geo-Partitioning](geo-partitioning.html) module, skip to step 2. Otherwise, [request a trial enterprise license](https://www.cockroachlabs.com/get-cockroachdb/enterprise/) and then enable your license: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SET CLUSTER SETTING cluster.organization = '';" - ~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SET CLUSTER SETTING enterprise.license = '';" - ~~~ - -2. Use the `BACKUP` SQL statement to generate a backup of the `startrek` database and store it on S3. To ensure your backup doesn't conflict with anyone else's, prefix the filename with your name: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="BACKUP DATABASE startrek TO 's3://cockroach-training/[name]-training?AWS_ACCESS_KEY_ID={{site.training.aws_access_key}}&AWS_SECRET_ACCESS_KEY={{site.training.aws_secret_access_key}}';" - ~~~ - - ~~~ - job_id | status | fraction_completed | rows | index_entries | system_records | bytes - +--------------------+-----------+--------------------+------+---------------+----------------+-------+ - 441707640059723777 | succeeded | 1 | 279 | 200 | 0 | 30519 - (1 row) - ~~~ - -## Step 5. Perform an "enterprise" restore - -Again, imagine the tables in the `startrek` database have changed and you want to restore them from the enterprise backup. - -1. Drop the tables in the `startrek` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="DROP TABLE startrek.episodes,startrek.quotes CASCADE;" - ~~~ - -2. Confirm that the tables in the `startrek` database are gone: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SHOW TABLES FROM startrek;" - ~~~ - - ~~~ - table_name - +------------+ - (0 rows) - ~~~ - -3. Restore the `startrek` database from the enterprise backup, again making sure to prefix the filename with your name: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="RESTORE startrek.* FROM 's3://cockroach-training/[name]-training?AWS_ACCESS_KEY_ID={{site.training.aws_access_key}}&AWS_SECRET_ACCESS_KEY={{site.training.aws_secret_access_key}}';" - ~~~ - - ~~~ - job_id | status | fraction_completed | rows | index_entries | system_records | bytes - +--------------------+-----------+--------------------+------+---------------+----------------+-------+ - 441707928464261121 | succeeded | 1 | 279 | 200 | 0 | 30519 - (1 row) - ~~~ - -4. Check the contents of the `startrek` database again: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SELECT * FROM startrek.episodes LIMIT 1;" \ - --execute="SELECT * FROM startrek.quotes LIMIT 1;" - ~~~ - - ~~~ - id | season | num | title | stardate - +----+--------+-----+--------------+-------------+ - 1 | 1 | 1 | The Man Trap | 1531.100000 - (1 row) - quote | characters | stardate | episode - +----------------------------------------------------------------------+------------------------+----------+---------+ - "... freedom ... is a worship word..." "It is our worship word too." | Cloud William and Kirk | NULL | 52 - (1 row) - ~~~ - -## Step 6. Clean up - -In the next module, you'll start a new cluster from scratch, so take a moment to clean things up. - -1. Terminate all CockroachDB nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ pkill -9 cockroach - ~~~ - -2. Remove the nodes' data directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node1 node2 node3 - ~~~ - -## What's next? - -[Cluster Upgrade](cluster-upgrade.html) diff --git a/src/archived/training/client-connection-troubleshooting.md b/src/archived/training/client-connection-troubleshooting.md deleted file mode 100644 index b081ffc4543..00000000000 --- a/src/archived/training/client-connection-troubleshooting.md +++ /dev/null @@ -1,168 +0,0 @@ ---- -title: Client Connection Troubleshooting -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false ---- - - - - - -## Before you begin - -Make sure you have already completed [Node Startup Troubleshooting](node-startup-troubleshooting.html) and have 6 nodes running securely. - -## Problem 1: SSL required - -In this scenario, you try to connect a user without providing a client certificate. - -### Step 1. Simulate the problem - -1. In a new terminal, as the `root` users, create a new user called `kirk`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --certs-dir=certs \ - --host=localhost:26257 \ - --execute="CREATE USER kirk;" - ~~~ - -2. As the `kirk` user, try to connect to the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --certs-dir=certs \ - --host=localhost:26257 \ - --user=kirk \ - --execute="SHOW DATABASES;" - ~~~ - - Because `kirk` doesn't have a client certificate in the `certs` directory, the cluster asks for the user's password: - - ~~~ - Enter password: - ~~~ - -4. Because `kirk` doesn't have a password, press **Enter**. - - The connection attempt fails, and the following error is printed to `stderr`: - - ~~~ - Error: pq: invalid password - Failed running "sql" - ~~~ - -### Step 2. Resolve the problem - -To successfully connect the user, you must first either generate a client certificate or create a password for the user. It's generally best to use certificates over passwords, so do that here. - -1. Generate a client certificate for the `kirk` user: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach cert create-client \ - kirk \ - --certs-dir=certs \ - --ca-key=my-safe-directory/ca.key - ~~~ - -2. As the `kirk` user, try to connect to the cluster again: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --certs-dir=certs \ - --host=localhost:26257 \ - --user=kirk \ - --execute="SHOW DATABASES;" - ~~~ - - This time, the connection attempt succeeds: - - ~~~ - database_name - +---------------+ - (0 rows) - ~~~ - -## Problem 2: Wrong host or port - -In this scenario, you try to connect the `kirk` user again but specify a `--port` that is not in use by any of the existing nodes. - -### Step 1. Simulate the problem - -Try to connect the `kirk` user: - -{% include copy-clipboard.html %} -~~~ shell -$ cockroach sql \ ---certs-dir=certs \ ---host=localhost:26257 \ ---user=kirk \ ---port=20000 \ ---execute="SHOW DATABASES;" -~~~ - -The connection attempt fails, and the following is printed to `stderr`: - -~~~ -Error: unable to connect or connection lost. - -Please check the address and credentials such as certificates (if attempting to -communicate with a secure cluster). - -dial tcp [::1]:20000: connect: connection refused -Failed running "sql" -~~~ - -### Step 2. Resolve the problem - -To successfully connect the user, try again using a correct `--port`: - -{% include copy-clipboard.html %} -~~~ shell -$ cockroach sql \ ---certs-dir=certs \ ---host=localhost:26257 \ ---user=kirk \ ---port=26259 \ ---execute="SHOW DATABASES;" -~~~ - -This time, the connection attempt succeeds: - -~~~ - database_name -+---------------+ -(0 rows) -~~~ - -## Clean up - -In the next module, you'll start a new cluster from scratch, so take a moment to clean things up. - -1. Terminate all CockroachDB nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ pkill -9 cockroach - ~~~ - -2. Remove the nodes' data directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node1 node2 node3 node4 node5 node6 - ~~~ - -## What's next? - -[Under-Replication Troubleshooting](under-replication-troubleshooting.html) diff --git a/src/archived/training/cluster-startup-and-scaling.md b/src/archived/training/cluster-startup-and-scaling.md deleted file mode 100644 index bc6a1cadc3b..00000000000 --- a/src/archived/training/cluster-startup-and-scaling.md +++ /dev/null @@ -1,319 +0,0 @@ ---- -title: Cluster Startup and Scaling -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json ---- - - - - - -## Step 1. Install CockroachDB - -1. Download the CockroachDB archive for your OS, and extract the binary: - -
    - - -
    -

    - -
    - {% include copy-clipboard.html %} - ~~~ shell - $ curl https://binaries.cockroachdb.com/cockroach-{{ page.release_info.version }}.darwin-10.9-amd64.tgz \ - | tar -xz - ~~~ -
    - -
    - {% include copy-clipboard.html %} - ~~~ shell - $ curl https://binaries.cockroachdb.com/cockroach-{{ page.release_info.version }}.linux-amd64.tgz \ - | tar -xz - ~~~ -
    - -2. Move the binary into your `$PATH` so you can execute from any shell: - -
    - {% include copy-clipboard.html %} - ~~~ shell - $ mv cockroach-{{ page.release_info.version }}.darwin-10.9-amd64/cockroach \ - /usr/local/bin/ - ~~~ -
    - -
    - {% include copy-clipboard.html %} - ~~~ shell - $ mv cockroach-{{ page.release_info.version }}.linux-amd64/cockroach \ - /usr/local/bin/ - ~~~ -
    - - {{site.data.alerts.callout_info}} - If you get a permissions error, prefix the command with `sudo`. - {{site.data.alerts.end}} - -3. Clean up the directory where you unpacked the binary: - -
    - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf cockroach-{{ page.release_info.version }}.darwin-10.9-amd64 - ~~~ -
    - -
    - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf cockroach-{{ page.release_info.version }}.linux-amd64 - ~~~ -
    - - You can also execute the `cockroach` binary directly from its download - location, but the rest of training documentation assumes you have the - binary in your `PATH`. - -## Step 2. Start a node - -Use the [`cockroach start`](../cockroach-start.html) command to start a node: - -{% include copy-clipboard.html %} -~~~ shell -$ cockroach start \ ---insecure \ ---store=node1 \ ---listen-addr=localhost:26257 \ ---http-addr=localhost:8080 \ ---join=localhost:26257,localhost:26258,localhost:26259 \ ---background -~~~ - -You'll see the following message: - -~~~ -* -* WARNING: RUNNING IN INSECURE MODE! -* -* - Your cluster is open for any client that can access localhost. -* - Any user, even root, can log in without providing a password. -* - Any user, connecting as root, can read or write any data in your cluster. -* - There is no network encryption nor authentication, and thus no confidentiality. -* -* Check out how to secure your cluster: https://www.cockroachlabs.com/docs/v19.2/secure-a-cluster.html -* -* -* INFO: initial startup completed, will now wait for `cockroach init` -* or a join to a running cluster to start accepting clients. -* Check the log file(s) for progress. -* -~~~ - -## Step 3. Understand the flags you used - -Before moving on, take a moment to understand the flags you used with the `cockroach start` command: - -Flag | Description ------|------------ -`--insecure` | Indicates that the node will communicate without encryption.

    You'll start all other nodes with this flag, as well as all other `cockroach` commands you'll use against the cluster.

    Without this flag, `cockroach` expects to be able to find security certificates to encrypt its communication. More about these in a later module. -`--store` | The location where the node stores its data and logs.

    Since you'll be running all nodes on your computer, you need to specify a unique storage location for each node. In contrast, in a real deployment, with one node per machine, it's fine to let `cockroach` use its default storage location (`cockroach-data`). -`--listen-addr`
    `--http-addr` | The IP address/hostname and port to listen on for connections from other nodes and clients and for Admin UI HTTP request, respectively.

    Again, since you'll be running all nodes on your computer, you need to specify unique ports for each node. In contrast, in a real deployment, with one node per machine, it's fine to let `cockroach` use its default TPC port (`26257`) and HTTP port (`8080`). -`--join` | The addresses and ports of all of your initial nodes.

    You'll use this exact `--join` flag when starting all other nodes. -`--background` | The node will run in the background. - -{{site.data.alerts.callout_success}} -You can run `cockroach start --help` to get help on this command directly in your terminal and `cockroach --help` to get help on other commands. -{{site.data.alerts.end}} - -## Step 4. Start two more nodes - -Start two more nodes, using the same `cockroach start` command as earlier but with unique `--store`, `--listen-addr`, and `--http-addr` flags for each new node. - -1. Start the second node: - - {% include copy-clipboard.html %} - ~~~ shell - cockroach start \ - --insecure \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -2. Start the third node: - - {% include copy-clipboard.html %} - ~~~ shell - cockroach start \ - --insecure \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -## Step 5. Initialize the cluster - -1. Use the [`cockroach init`](../cockroach-init.html) command to perform a one-time initialization of the cluster, sending the request to any node: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach init --insecure --host=localhost:26257 - ~~~ - - You'll see the following message: - - ~~~ - Cluster successfully initialized - ~~~ - -2. Look at the startup details in the server log: - - {% include copy-clipboard.html %} - ~~~ shell - $ grep 'node starting' node1/logs/cockroach.log -A 11 - ~~~ - - The output will look something like this: - - ~~~ - CockroachDB node starting at 2019-10-01 20:14:55.358954 +0000 UTC (took 27.9s) - build: CCL {{page.release_info.version}} @ 2019/09/25 15:18:08 (go1.12.6) - webui: http://localhost:8080 - sql: postgresql://root@localhost:26257?sslmode=disable - client flags: cockroach --host=localhost:26257 --insecure - logs: /Users//cockroachdb-training/node1/logs - temp dir: /Users//cockroachdb-training/node1/cockroach-temp462678173 - external I/O path: /Users//cockroachdb-training/node1/extern - store[0]: path=/Users//cockroachdb-training/node1 - status: initialized new cluster - clusterID: fdc056a4-0cc0-4b29-b435-60e1db239f82 - nodeID: 1 - ~~~ - - Field | Description - ------|------------ - `build` | The version of CockroachDB you are running. - `webui` | The URL for accessing the Admin UI. - `sql` | The connection URL for your client. - `client flags` | The flags to use when connecting to the node via [`cockroach` client commands](../cockroach-commands.html). - `logs` | The directory containing debug log data. - `temp dir` | The temporary store directory of the node. - `external I/O path` | The external IO directory with which the local file access paths are prefixed while performing [backup](../backup.html) and [restore](../restore.html) operations using local node directories or NFS drives. - `store[n]` | The directory containing store data, where `[n]` is the index of the store, e.g., `store[0]` for the first store, `store[1]` for the second store. - `status` | Whether the node is the first in the cluster (`initialized new cluster`), joined an existing cluster for the first time (`initialized new node, joined pre-existing cluster`), or rejoined an existing cluster (`restarted pre-existing node`). - `clusterID` | The ID of the cluster. - `nodeID` | The ID of the node. - -## Step 6. Verify that the cluster is live - -1. Use the [`cockroach node status`](../cockroach-node.html) command to check that all 3 nodes are part of the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach node status --insecure --host=localhost:26257 - ~~~ - - ~~~ - id | address | sql_address | build | started_at | updated_at | locality | is_available | is_live - +----+-----------------+-----------------+-----------------------------------------+----------------------------------+----------------------------------+----------+--------------+---------+ - 1 | localhost:26257 | localhost:26257 | v19.2.0 | 2019-10-01 20:14:55.249457+00:00 | 2019-10-01 20:16:07.283866+00:00 | | true | true - 2 | localhost:26258 | localhost:26258 | v19.2.0 | 2019-10-01 20:14:55.445079+00:00 | 2019-10-01 20:16:02.972943+00:00 | | true | true - 3 | localhost:26259 | localhost:26259 | v19.2.0 | 2019-10-01 20:14:55.857631+00:00 | 2019-10-01 20:16:03.389338+00:00 | | true | true - (3 rows) - ~~~ - -2. Use the [`cockroach sql`](../cockroach-sql.html) command to query the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SHOW DATABASES;" - ~~~ - - ~~~ - database_name - +---------------+ - defaultdb - postgres - system - (3 rows) - ~~~ - - You just queried the node listening on `26257`, but every other node is a SQL gateway to the cluster as well. We'll learn more about CockroachDB SQL and the built-in SQL client in a later module. - -## Step 7. Look at the current state of replication - -1. To understand replication in CockroachDB, it's important to review a few concepts from the architecture: - - Concept | Description - --------|------------ - **Range** | CockroachDB stores all user data (tables, indexes, etc.) and almost all system data in a giant sorted map of key-value pairs. This keyspace is divided into "ranges", contiguous chunks of the keyspace, so that every key can always be found in a single range.

    From a SQL perspective, a table and its secondary indexes initially map to a single range, where each key-value pair in the range represents a single row in the table (also called the primary index because the table is sorted by the primary key) or a single row in a secondary index. As soon as a range reaches 512 MiB in size, it splits into two ranges. This process continues as the table and its indexes continue growing. - **Replica** | CockroachDB replicates each range 3 times by default and stores each replica on a different node.

    In a later module, you'll learn how to control replication. - -2. With those concepts in mind, open the Admin UI at http://localhost:8080 and view the **Node List**: - - CockroachDB Admin UI - - Note that the **Replicas** count is the same on all three nodes. This indicates: - - There are this many initial "ranges" of data in the cluster. These are all internal "system" ranges since you haven't added any table data yet. - - Each range has been replicated 3 times (according to the CockroachDB default). - - For each range, each replica is stored on different nodes. - -## Step 8. Scale the cluster - -Adding more nodes to your cluster is even easier than starting the cluster. Just like before, you use the `cockroach start` command with unique `--store`, `--listen-addr`, and `--http-addr` flags for each new node. But this time, you do not have to follow-up with the `cockroach init` command or any other commands. - -1. Start the fourth node: - - {% include copy-clipboard.html %} - ~~~ shell - cockroach start \ - --insecure \ - --store=node4 \ - --listen-addr=localhost:26260 \ - --http-addr=localhost:8083 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -2. Start the fifth node: - - {% include copy-clipboard.html %} - ~~~ shell - cockroach start \ - --insecure \ - --store=node5 \ - --listen-addr=localhost:26261 \ - --http-addr=localhost:8084 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - - As soon as you run these commands, the nodes join the cluster. There's no need to run the `cockroach init` command or any other commands. - -## Step 9. Watch data rebalance across all 5 nodes - -Go back to the **Live Nodes** list in the Admin UI and watch how the **Replicas** are automatically rebalanced to utilize the additional capacity of the new nodes: - -CockroachDB Admin UI - -Another way to observe this is to click **Metrics** in the upper left and scroll down to the **Replicas per Node** graph: - -CockroachDB Admin UI - -## What's next? - -[Fault Tolerance and Automated Repair](fault-tolerance-and-automated-repair.html) diff --git a/src/archived/training/cluster-unavailability-troubleshooting.md b/src/archived/training/cluster-unavailability-troubleshooting.md deleted file mode 100644 index f14010dcf44..00000000000 --- a/src/archived/training/cluster-unavailability-troubleshooting.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -title: Cluster Unavailability Troubleshooting -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false ---- - - - - - -## Before you begin - -Make sure you have already completed [Under-Replication Troubleshooting](under-replication-troubleshooting.html) and have a cluster of 3 nodes running. - -## Step 1. Simulate the problem - -1. In the terminal where node 2 is running, press **CTRL-C**. - -2. In the terminal where node 3 is running, press **CTRL-C**. You may need to press **CRTL + C** a second time to force this node to terminate. - -## Step 2. Troubleshoot the problem - -1. Go back to the Admin UI: - - CockroachDB Admin UI - - You'll notice that an error is shown and timeseries metrics are no longer being reported. - -2. In a new terminal, try to query the one node that was not terminated: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SHOW DATABASES;" \ - --logtostderr=WARNING - ~~~ - - Because all ranges in the cluster, specifically the system ranges, no longer have a majority of their replicas, the cluster as a whole cannot make progress, and so the query will hang indefinitely. - -## Step 3. Resolve the problem - -1. In the terminal where node 2 was running, restart the node: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~ - -2. In the terminal where node 3 was running, restart the node: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~ - -3. Go back to the terminal where you issued the query. - - All ranges have a majority of their replicas again, and so the query executes and succeeds: - - ~~~ - database_name - +---------------+ - defaultdb - postgres - system - (3 rows) - ~~~ - -## Clean up - -In the next module, you'll start a new cluster from scratch, so take a moment to clean things up. - -1. Terminate all CockroachDB nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ pkill -9 cockroach - ~~~ - -2. Remove the nodes' data directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node1 node2 node3 - ~~~ - -## What's next? - -[Data Unavailability Troubleshooting](data-unavailability-troubleshooting.html) diff --git a/src/archived/training/cluster-upgrade.md b/src/archived/training/cluster-upgrade.md deleted file mode 100644 index d82f12b67cc..00000000000 --- a/src/archived/training/cluster-upgrade.md +++ /dev/null @@ -1,249 +0,0 @@ ---- -title: Cluster Upgrade -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false ---- - - - - - -## Before you begin - -In this lab, you'll start with a fresh cluster, so make sure you've stopped and cleaned up the cluster from the previous labs. - -## Step 1. Install CockroachDB v19.1 - -1. Download the CockroachDB v19.1 archive for your OS, and extract the binary: - -
    - - -
    -

    - -
    - {% include copy-clipboard.html %} - ~~~ shell - $ curl https://binaries.cockroachdb.com/cockroach-v19.1.1.darwin-10.9-amd64.tgz \ - | tar -xz - ~~~ -
    - -
    - {% include copy-clipboard.html %} - ~~~ shell - $ curl https://binaries.cockroachdb.com/cockroach-v19.1.1.linux-amd64.tgz \ - | tar -xz - ~~~ -
    - -2. Move the v19.1 binary into the parent `cockroachdb-training` directory: - -
    - {% include copy-clipboard.html %} - ~~~ shell - $ mv cockroach-v19.1.1.darwin-10.9-amd64/cockroach ./cockroach-v19.1 \ - ; rm -rf cockroach-v19.1.1.darwin-10.9-amd64 - ~~~ -
    - -
    - {% include copy-clipboard.html %} - ~~~ shell - $ mv cockroach-v19.1.1.linux-amd64/cockroach ./cockroach-v19.1 \ - ; rm -rf cockroach-v19.1.1.linux-amd64 - ~~~ -
    - -## Step 2. Start a cluster running v19.1 - -Start and initialize a cluster like you did in previous modules, but this time using the v19.1 binary. - -1. In a new terminal, start node 1: - - {% include copy-clipboard.html %} - ~~~ shell - $ ./cockroach-v19.1 start \ - --insecure \ - --store=node1 \ - --host=localhost \ - --port=26257 \ - --http-port=8080 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~~ - -2. In a new terminal, start node 2: - - {% include copy-clipboard.html %} - ~~~ shell - $ ./cockroach-v19.1 start \ - --insecure \ - --store=node2 \ - --host=localhost \ - --port=26258 \ - --http-port=8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~ - -3. In a new terminal, start node 3: - - {% include copy-clipboard.html %} - ~~~ shell - $ ./cockroach-v19.1 start \ - --insecure \ - --store=node3 \ - --host=localhost \ - --port=26259 \ - --http-port=8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~ - -4. In a new terminal, perform a one-time initialization of the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ ./cockroach-v19.1 init --insecure - ~~~ - -{{site.data.alerts.callout_info}} -You can disable a (manual or automatic) cluster version upgrade from the specified version until you reset your cluster by using the `cluster.preserve_downgrade_option` cluster setting. See the full [Cluster Upgrade](../upgrade-cockroach-version.html) documentation for details. -{{site.data.alerts.end}} - -## Step 3. Upgrade the first node to v19.2 - -1. In node 1's terminal, press **CTRL-C** to terminate the `cockroach` process. - -2. Verify that node 1 has been terminated: - - {% include copy-clipboard.html %} - ~~~ shell - $ ps | grep cockroach - ~~~ - - You should **not** see a `cockroach` process with `--store=node1` and `--port=26257`. - - ~~~ - 49659 ttys001 0:02.43 ./cockroach-v19.1 start --insecure --store=node2 --host=localhost --port=26258 --http-port=8081 --join=localhost:26257,localhost:26258,localhost:26259 - 49671 ttys002 0:02.32 ./cockroach-v19.1 start --insecure --store=node3 --host=localhost --port=26259 --http-port=8082 --join=localhost:26257,localhost:26258,localhost:26259 - 49705 ttys015 0:00.00 grep cockroach - ~~~~ - -3. In node 1's terminal, restart the node using the v19.2 binary: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node1 \ - --listen-addr=localhost:26257 \ - --http-addr=localhost:8080 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~~ - -4. Go to the Admin UI at http://localhost:8081 to view the **Node List** and then verify that the node has rejoined the cluster using the new version of the binary. - -## Step 4. Upgrade the rest of the nodes to v19.2 - -1. In node 2's terminal, press **CTRL-C** to terminate the `cockroach` process. - -2. Verify that node 2 has been terminated: - - {% include copy-clipboard.html %} - ~~~ shell - $ ps | grep cockroach - ~~~ - - You should not see a `cockroach` process with `--store=node2` and `--port=26258`. - - ~~~ - 49659 ttys001 0:07.05 ./cockroach-v19.1 start --insecure --store=node3 --host=localhost --port=26259 --http-port=8082 --join=localhost:26257,localhost:26258,localhost:26259 - 49824 ttys002 0:00.00 grep cockroach - 49717 ttys015 0:05.76 ./cockroach start --insecure --store=node1 --listen-addr=localhost:26257 --http-addr=localhost:8080 --join=localhost:26257,localhost:26258,localhost:26259 - ~~~ - -3. Restart the node using the v19.2 binary: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~~ - -4. Wait 1 minute. - -5. In node 3's terminal, press **CTRL-C** to terminate the `cockroach` process. - -6. Verify that node 3 has been terminated: - - {% include copy-clipboard.html %} - ~~~ shell - $ ps | grep cockroach - ~~~ - - You should not see a `cockroach` process with `--store=node3` and `--port=26259`. - - ~~~ - 49869 ttys001 0:00.01 grep cockroach - 49849 ttys002 0:02.38 ./cockroach start --insecure --store=node2 --listen-addr=localhost:26258 --http-addr=localhost:8081 --join=localhost:26257,localhost:26258,localhost:26259 - 49717 ttys015 0:10.88 ./cockroach start --insecure --store=node1 --listen-addr=localhost:26257 --http-addr=localhost:8080 --join=localhost:26257,localhost:26258,localhost:26259 - ~~~ - -7. Restart the node using the v19.2 binary: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~~ - -## Step 5. Check your cluster's versions - -Back in the Admin UI, you'll see that all 3 nodes now have the same, upgraded version. You can also use the `cockroach node status` command to check each node's version: - -{% include copy-clipboard.html %} -~~~ shell -$ cockroach node status \ ---insecure -~~~ - -~~~ - id | address | sql_address | build | started_at | updated_at | locality | is_available | is_live -+----+-----------------+-----------------+-----------------------------------------+----------------------------------+----------------------------------+----------+--------------+---------+ - 1 | localhost:26257 | localhost:26257 | v19.2.0-alpha.20190606-2479-gd98e0839dc | 2019-10-01 20:14:55.249457+00:00 | 2019-10-01 20:16:07.283866+00:00 | | true | true - 2 | localhost:26258 | localhost:26258 | v19.2.0-alpha.20190606-2479-gd98e0839dc | 2019-10-01 20:14:55.445079+00:00 | 2019-10-01 20:16:02.972943+00:00 | | true | true - 3 | localhost:26259 | localhost:26259 | v19.2.0-alpha.20190606-2479-gd98e0839dc | 2019-10-01 20:14:55.857631+00:00 | 2019-10-01 20:16:03.389338+00:00 | | true | true -(3 rows) -~~~ - -## Step 6. Clean up - -This is the last module of the training, so feel free to stop you cluster and clean things up. - -1. Stop all CockroachDB nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ pkill -9 cockroach - ~~~ - -2. Remove the nodes' data directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node1 node2 node3 - ~~~ diff --git a/src/archived/training/data-corruption-troubleshooting.md b/src/archived/training/data-corruption-troubleshooting.md deleted file mode 100644 index 71ce5a7e675..00000000000 --- a/src/archived/training/data-corruption-troubleshooting.md +++ /dev/null @@ -1,185 +0,0 @@ ---- -title: Data Corruption Troubleshooting -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false ---- - - - - - -## Before you begin - -In this lab, you'll start with a fresh cluster, so make sure you've stopped and cleaned up the cluster from the previous labs. - -## Step 1. Start a 3-node cluster - -1. In a new terminal, start node 1: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node1 \ - --listen-addr=localhost:26257 \ - --http-addr=localhost:8080 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --logtostderr=WARNING - ~~~~ - -2. In a new terminal, start node 2: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --logtostderr=WARNING - ~~~ - -3. In a new terminal, start node 3: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --logtostderr=WARNING - ~~~ - -4. In a new terminal, perform a one-time initialization of the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach init --insecure --host=localhost:26257 - ~~~ - -## Step 2. Prepare to simulate the problem - -Before you can manually corrupt data, you need to import enough data so that the cluster creates persistent `.sst` files. - -1. Create a database into which you'll import a new table: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="CREATE DATABASE import_test;" - ~~~ - -2. Run the [`IMPORT`](../import.html) command, using schema and data files we've made publicly available on Google Cloud Storage: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --database="import_test" \ - --execute="IMPORT TABLE orders CREATE USING 'https://storage.googleapis.com/cockroach-fixtures/tpch-csv/schema/orders.sql' CSV DATA ('https://storage.googleapis.com/cockroach-fixtures/tpch-csv/sf-1/orders.tbl.1') WITH delimiter = '|';" - ~~~ - - The import will take a minute or two. Once it completes, you'll see a confirmation with details: - - ~~~ - job_id | status | fraction_completed | rows | index_entries | system_records | bytes - +--------------------+-----------+--------------------+--------+---------------+----------------+----------+ - 378521252933861377 | succeeded | 1 | 187500 | 375000 | 0 | 26346739 - (1 row) - ~~~ - -## Step 2. Simulate the problem - -1. In the same terminal, look in the data directory of `node3`: - - {% include copy-clipboard.html %} - ~~~ shell - $ ls node3 - ~~~ - - ~~~ - 000003.log IDENTITY OPTIONS-000005 cockroach.http-addr - 000006.sst LOCK auxiliary cockroach.listen-addr - COCKROACHDB_VERSION MANIFEST-000001 cockroach-temp478417278 logs - CURRENT MANIFEST-000007 cockroach.advertise-addr temp-dirs-record.txt - ~~~ - -2. Delete one of the `.sst` files. - -3. In the terminal where node 3 is running, press **CTRL-C** to stop it. - -4. Try to restart node 3: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --logtostderr=WARNING - ~~~ - - The startup process will fail, and you'll see the following printed to `stderr`: - - ~~~ - W180209 10:45:03.684512 1 cli/start.go:697 Using the default setting for --cache (128 MiB). - A significantly larger value is usually needed for good performance. - If you have a dedicated server a reasonable setting is --cache=25% (2.0 GiB). - W180209 10:45:03.805541 37 gossip/gossip.go:1241 [n?] no incoming or outgoing connections - E180209 10:45:03.808537 1 cli/error.go:68 cockroach server exited with error: failed to create engines: could not open rocksdb instance: Corruption: Sst file size mismatch: /Users/jesseseldess/cockroachdb-training/cockroach-{{page.release_info.version}}.darwin-10.9-amd64/node3/000006.sst. Size recorded in manifest 2626945, actual size 2626210 - * - * ERROR: cockroach server exited with error: failed to create engines: could not open rocksdb instance: Corruption: Sst file size mismatch: /Users/jesseseldess/cockroachdb-training/cockroach-{{page.release_info.version}}.darwin-10.9-amd64/node3/000006.sst. Size recorded in manifest 2626945, actual size 2626210 - * - * - Failed running "start" - ~~~ - - The error tells you that the failure has to do with RocksDB-level (i.e., storage-level) corruption. Because the node's data is corrupt, the node will not restart. - -## Step 3. Resolve the problem - -Because only 1 node's data is corrupt, the solution is to completely remove the node's data directory and restart the node. - -1. Remove the `node3` data directory: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node3 - ~~~ - -2. In the terminal where node 3 was running, restart the node: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --logtostderr=WARNING - ~~~ - -In this case, the cluster repairs the node using data from the other nodes. In more severe emergencies where multiple disks are corrupted, there are tools like `cockroach debug rocksdb` to let you inspect the files in more detail and try to repair them. If enough nodes/files are corrupted, [restoring to a enterprise backup](../restore.html) is best. - -{{site.data.alerts.callout_danger}} -In all cases of data corruption, you should [get support from Cockroach Labs](how-to-get-support.html). -{{site.data.alerts.end}} - -## What's next? - -[Software Panic Troubleshooting](software-panic-troubleshooting.html) diff --git a/src/archived/training/data-import.md b/src/archived/training/data-import.md deleted file mode 100644 index f447c3aec50..00000000000 --- a/src/archived/training/data-import.md +++ /dev/null @@ -1,339 +0,0 @@ ---- -title: Data Import -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false ---- - - - - - -## Before you begin - -In this lab, you'll start with a fresh cluster, so make sure you've stopped and cleaned up the cluster from the previous lab. - -## Step 1. Start a 3-node cluster - -Start and initialize a cluster like you did in previous modules. - -{{site.data.alerts.callout_info}} -To simplify the process of running multiple nodes on your local computer, you'll start them in the [background](../cockroach-start.html#general) instead of in separate terminals. -{{site.data.alerts.end}} - -1. In a new terminal, start node 1: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node1 \ - --listen-addr=localhost:26257 \ - --http-addr=localhost:8080 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -2. Start node 2: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -3. Start node 3: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -4. Perform a one-time initialization of the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach init --insecure --host=localhost:26257 - ~~~ - -## Step 2. Import CSV data from remote file storage - -1. In a new terminal, create a database into which you'll import a new table: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="CREATE DATABASE IF NOT EXISTS tabular_import;" - ~~~ - -2. Run the [`IMPORT`](../import.html) statement, using schema and data files we've made publicly available on Google Cloud Storage: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --database="tabular_import" \ - --execute="IMPORT TABLE orders CREATE USING 'https://storage.googleapis.com/cockroach-fixtures/tpch-csv/schema/orders.sql' CSV DATA ('https://storage.googleapis.com/cockroach-fixtures/tpch-csv/sf-1/orders.tbl.1') WITH delimiter = '|';" - ~~~ - - The import will take a minute or two. To check the status of the import, navigate to the **Admin UI > [Jobs page](../admin-ui-jobs-page.html)**. Once it completes, you'll see a confirmation with details: - - ~~~ - job_id | status | fraction_completed | rows | index_entries | system_records | bytes - +--------------------+-----------+--------------------+--------+---------------+----------------+----------+ - 378471816945303553 | succeeded | 1 | 187500 | 375000 | 0 | 26346739 - (1 row) - ~~~ - -3. Check the schema of the imported `orders` table: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --database="tabular_import" \ - --execute="SHOW CREATE orders;" - ~~~ - - ~~~ - table_name | create_statement - +------------+---------------------------------------------------------------------------------------------------------------------------------------------+ - orders | CREATE TABLE orders ( - | o_orderkey INTEGER NOT NULL, - | o_custkey INTEGER NOT NULL, - | o_orderstatus STRING(1) NOT NULL, - | o_totalprice DECIMAL(15,2) NOT NULL, - | o_orderdate DATE NOT NULL, - | o_orderpriority STRING(15) NOT NULL, - | o_clerk STRING(15) NOT NULL, - | o_shippriority INTEGER NOT NULL, - | o_comment STRING(79) NOT NULL, - | CONSTRAINT "primary" PRIMARY KEY (o_orderkey ASC), - | INDEX o_ck (o_custkey ASC), - | INDEX o_od (o_orderdate ASC), - | FAMILY "primary" (o_orderkey, o_custkey, o_orderstatus, o_totalprice, o_orderdate, o_orderpriority, o_clerk, o_shippriority, o_comment) - | ) - (1 row) - ~~~ - - {{site.data.alerts.callout_info}} - You can also view the schema by navigating to the **Admin UI > [Databases](../admin-ui-databases-page.html)** page and clicking on the table name. - {{site.data.alerts.end}} - -4. Read some data from the imported `orders` table: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --database="tabular_import" \ - --execute="SELECT o_orderkey, o_custkey, o_comment FROM orders WHERE o_orderstatus = 'O' LIMIT 10;" - ~~~ - - ~~~ - o_orderkey | o_custkey | o_comment - +------------+-----------+-------------------------------------------------------------------------------+ - 1 | 36901 | nstructions sleep furiously among - 2 | 78002 | foxes. pending accounts at the pending, silent asymptot - 4 | 136777 | sits. slyly regular warthogs cajole. regular, regular theodolites acro - 7 | 39136 | ly special requests - 32 | 130057 | ise blithely bold, regular requests. quickly unusual dep - 34 | 61001 | ly final packages. fluffily final deposits wake blithely ideas. spe - 35 | 127588 | zzle. carefully enticing deposits nag furio - 36 | 115252 | quick packages are blithely. slyly silent accounts wake qu - 38 | 124828 | haggle blithely. furiously express ideas haggle blithely furiously regular re - 39 | 81763 | ole express, ironic requests: ir - (10 rows) - ~~~ - -## Step 3. Import a PostgreSQL dump file - -If you're importing data from a PostgreSQL database, you can import the `.sql` file generated by the [`pg_dump`][pg_dump] command, after editing the file to be compatible with CockroachDB. - -{{site.data.alerts.callout_success}} -The `.sql` files generated by `pg_dump` provide better performance because they use the `COPY` statement instead of bulk `INSERT` statements. -{{site.data.alerts.end}} - -1. Download our sample [`pg_dump.sql`](resources/pg_dump.sql) file using [`curl`][curl] or [`wget`][wget], depending on which you have installed: - - {% include copy-clipboard.html %} - ~~~ shell - $ curl -O {{site.url}}/docs/{{page.version.version}}/training/resources/pg_dump.sql - ~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ wget {{site.url}}/docs/{{page.version.version}}/training/resources/pg_dump.sql - ~~~ - -2. Take a look at the `pg_dump.sql` file, which contains 2 tables, `customers` and `accounts`, as well as some constraints on both tables. - - Before this file can be imported into CockroachDB, it must be edited for compatibility as follows: - - The `CREATE SCHEMA` statement must be removed. - - The `ALTER SCHEMA` statement must be removed. - -3. Instead of manually cleaning the file, you can download our pre-cleaned version using [`curl`][curl] or [`wget`][wget]: - - {% include copy-clipboard.html %} - ~~~ shell - $ curl -O {{site.url}}/docs/{{page.version.version}}/training/resources/pg_dump_cleaned.sql - ~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ wget {{site.url}}/docs/{{page.version.version}}/training/resources/pg_dump_cleaned.sql - ~~~ - -4. Create a database you can use for the import: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="CREATE DATABASE IF NOT EXISTS pg_import;" - ~~~ - -5. Import the dump: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --database=pg_import \ - --execute="IMPORT PGDUMP '{{site.url}}/docs/{{page.version.version}}/training/resources/pg_dump_cleaned.sql';" - ~~~ - - ~~~ - job_id | status | fraction_completed | rows | index_entries | system_records | bytes - --------------------+-----------+--------------------+------+---------------+----------------+------- - 409923615993004033 | succeeded | 1 | 10 | 5 | 0 | 258 - ~~~ - -6. Read from the imported data: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --database=pg_import \ - --execute="SELECT customers.name, accounts.balance FROM accounts JOIN customers ON accounts.customer_id = customers.id;" - ~~~ - - ~~~ - name | balance - +------------------+---------+ - Bjorn Fairclough | 100 - Arturo Nevin | 200 - Juno Studwick | 400 - Naseem Joossens | 200 - Eutychia Roberts | 200 - (5 rows) - ~~~ - - {{site.data.alerts.callout_info}} - You can view the schema by navigating to the **Admin UI > [Databases](../admin-ui-databases-page.html)** page and clicking on the table name. - {{site.data.alerts.end}} - -## Step 4. Import a MySQL dump file - -If you're importing data from a MySQL database, you can import the `.sql` file generated by the [`mysqldump`][mysqldump] command. - -1. Download our sample [`mysql_dump.sql`](resources/mysql_dump.sql) file using [`curl`][curl] or [`wget`][wget]: - - {% include copy-clipboard.html %} - ~~~ shell - $ curl -O {{site.url}}/docs/{{page.version.version}}/training/resources/mysql_dump.sql - ~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ wget {{site.url}}/docs/{{page.version.version}}/training/resources/mysql_dump.sql - ~~~ - -2. Take a look at the `pg_dump.sql` file, which contains 2 tables, `customers` and `accounts`, as well as some constraints on both tables. - -3. Create a database you can use for the import: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="CREATE DATABASE IF NOT EXISTS mysql_import;" - ~~~ - -4. Import the dump: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="IMPORT MYSQLDUMP '{{site.url}}/docs/{{page.version.version}}/training/resources/mysql_dump.sql';" - ~~~ - - ~~~ - job_id | status | fraction_completed | rows | index_entries | system_records | bytes - --------------------+-----------+--------------------+------+---------------+----------------+------- - 409923615993004033 | succeeded | 1 | 10 | 5 | 0 | 258 - ~~~ - -5. Read from the imported data: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SELECT customers.name, accounts.balance FROM accounts JOIN customers ON accounts.customer_id = customers.id;" - ~~~ - - ~~~ - name | balance - +------------------+---------+ - Bjorn Fairclough | 100 - Arturo Nevin | 200 - Juno Studwick | 400 - Naseem Joossens | 200 - Eutychia Roberts | 200 - (5 rows) - ~~~ - - {{site.data.alerts.callout_info}} - You can view the schema by navigating to the **Admin UI > [Databases](../admin-ui-databases-page.html)** page and clicking on the table name. - {{site.data.alerts.end}} - -## What's next? - -[SQL Basics](sql-basics.html) - - - -[curl]: https://curl.haxx.se/ -[wget]: https://www.gnu.org/software/wget/ -[pg_dump]: https://www.postgresql.org/docs/current/app-pgdump.html -[mysqldump]: https://dev.mysql.com/doc/refman/8.0/en/mysqldump-sql-format.html diff --git a/src/archived/training/data-unavailability-troubleshooting.md b/src/archived/training/data-unavailability-troubleshooting.md deleted file mode 100644 index 6ad7e7dd4ad..00000000000 --- a/src/archived/training/data-unavailability-troubleshooting.md +++ /dev/null @@ -1,304 +0,0 @@ ---- -title: Data Unavailability Troubleshooting -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false ---- - - - - - -## Before you begin - -In this lab, you'll start with a fresh cluster, so make sure you've stopped and cleaned up the cluster from the previous labs. - -## Step 1. Start a cluster spread across 3 separate localities - -Create a 9-node cluster, with 3 nodes in each of 3 different localities. - -1. In a new terminal, start node 1 in locality `us-east-1`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=datacenter=us-east-1 \ - --store=node1 \ - --listen-addr=localhost:26257 \ - --http-addr=localhost:8080 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -2. In the same terminal, perform a one-time initialization of the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach init --insecure --host=localhost:26257 - ~~~ - -3. In a new terminal, start node 2 in locality `us-east-1`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=datacenter=us-east-1 \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -4. In the same terminal, start node 3 in locality `us-east-1`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=datacenter=us-east-1 \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -5. In the same terminal, start node 4 in locality `us-east-2`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=datacenter=us-east-2 \ - --store=node4 \ - --listen-addr=localhost:26260 \ - --http-addr=localhost:8083 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -6. In the same terminal, start node 5 in locality `us-east-2`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=datacenter=us-east-2 \ - --store=node5 \ - --listen-addr=localhost:26261 \ - --http-addr=localhost:8084 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -7. In the same terminal, start node 6 in locality `us-east-2`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=datacenter=us-east-2 \ - --store=node6 \ - --listen-addr=localhost:26262 \ - --http-addr=localhost:8085 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -8. In the same terminal, start node 7 in locality `us-east-3`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=datacenter=us-east-3 \ - --store=node7 \ - --listen-addr=localhost:26263 \ - --http-addr=localhost:8086 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -9. In the same terminal, start node 8 in locality `us-east-3`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=datacenter=us-east-3 \ - --store=node8 \ - --listen-addr=localhost:26264 \ - --http-addr=localhost:8087 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -10. In the same terminal, start node 9 in locality `us-east-3`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=datacenter=us-east-3 \ - --store=node9 \ - --listen-addr=localhost:26265 \ - --http-addr=localhost:8088 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -## Step 2. Prepare to simulate the problem - -In preparation, add a table and use a replication zone to force the table's data onto the new nodes. - -1. In a new terminal, generate an `intro` database with a `mytable` table: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach gen example-data intro | cockroach sql \ - --insecure \ - --host=localhost:26257 - ~~~ - -2. Create a [replication zone](../configure-replication-zones.html) forcing the replicas of the `mytable` range to be located on nodes with the `datacenter=us-east-3` locality: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql --execute="ALTER TABLE intro.mytable CONFIGURE ZONE USING constraints='[+datacenter=us-east-3]';" --insecure --host=localhost:26257 - ~~~ - -3. Use the `SHOW RANGES` SQL command to determine the nodes on which the replicas for the `mytable` table are now located: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SHOW RANGES FROM TABLE intro.mytable;" - ~~~ - - ~~~ - start_key | end_key | range_id | range_size_mb | lease_holder | lease_holder_locality | replicas | replica_localities - +-----------+---------+----------+---------------+--------------+-----------------------+----------+------------------------------------------------------------------+ - NULL | NULL | 25 | 0.003054 | 9 | datacenter=us-east-3 | {7,8,9} | {datacenter=us-east-3,datacenter=us-east-3,datacenter=us-east-3} - (1 row) - ~~~ - -4. The node IDs above may not match the order in which we started the nodes because node IDs only get allocated after `cockroach init` is run. You can verify that the nodes listed by `SHOW RANGES` are all in the `datacenter=us-east-3` locality by opening the **Node Diagnostics** debug page at http://localhost:8080/#/reports/nodes and checking the locality for each of the 3 node IDs. - - CockroachDB Admin UI - -## Step 3. Simulate the problem - -Stop 2 of the nodes containing `mytable` replicas. This will cause the range to lose a majority of its replicas and become unavailable. However, all other ranges are spread evenly across all three localities because the replication zone only applies to `mytable`, so the cluster as a whole will remain available. - -1. Kill nodes 8 and 9: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach quit \ - --insecure \ - --host=localhost:26264 - ~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach quit \ - --insecure \ - --host=localhost:26265 - ~~~ - -## Step 4. Troubleshoot the problem - -1. In a new terminal, try to insert into the `mytable` table, pointing at a node that is still online: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="INSERT INTO intro.mytable VALUES (42, '')" \ - --logtostderr=WARNING - ~~~ - - Because the range for `mytable` no longer has a majority of its replicas, the query will hang indefinitely. - -2. Go back to the Admin UI at http://localhost:8080 and click **Metrics** on the left. - -3. Select the **Replication** dashboard. - -4. Hover over the **Ranges** graph: - - CockroachDB Admin UI - - You should see that 1 range is now unavailable. If the unavailable count is larger than 1, that would mean that some system ranges had a majority of replicas on the down nodes as well. - - The **Summary** panel on the right should tell you the same thing: - - CockroachDB Admin UI - -5. For more insight into the ranges that are unavailable, go to the **Problem Ranges Report** at http://localhost:8080/#/reports/problemranges. - - CockroachDB Admin UI - -## Step 5. Resolve the problem - -1. In a new terminal, restart the stopped nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=datacenter=us-east-3 \ - --store=node8 \ - --listen-addr=localhost:26264 \ - --http-addr=localhost:8087 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=datacenter=us-east-3 \ - --store=node9 \ - --listen-addr=localhost:26265 \ - --http-addr=localhost:8088 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -3. Go back to the Admin UI, click **Metrics** on the left, and verify that ranges are no longer unavailable. - -4. Check back on your `INSERT` statement that was stuck and verify that it completed successfully. - -## Step 6. Clean up - -In the next lab, you'll start a new cluster from scratch, so take a moment to clean things up. - -1. Stop all CockroachDB nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ pkill -9 cockroach - ~~~ - -2. Remove the nodes' data directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node1 node2 node3 node4 node5 node6 node7 node8 node9 - ~~~ - -## What's next? - -[Data Corruption Troubleshooting](data-corruption-troubleshooting.html) diff --git a/src/archived/training/fault-tolerance-and-automated-repair.md b/src/archived/training/fault-tolerance-and-automated-repair.md deleted file mode 100644 index d07358334b8..00000000000 --- a/src/archived/training/fault-tolerance-and-automated-repair.md +++ /dev/null @@ -1,281 +0,0 @@ ---- -title: Fault Tolerance and Automated Repair -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json ---- - - - - - -## Before You Begin - -Make sure you have already completed [Cluster Startup and Scaling](cluster-startup-and-scaling.html) and have 5 nodes running locally. - -## Step 1. Set up load balancing - -In this module, you'll run a sample workload to simulate multiple client connections. Each node is an equally suitable SQL gateway for the load, but it's always recommended to spread requests evenly across nodes. You'll use the open-source [HAProxy](http://www.haproxy.org/) load balancer to do that here. - -1. In a new terminal, install HAProxy. - -
    - - -
    -

    - -
    - If you're on a Mac and use Homebrew, run: - {% include copy-clipboard.html %} - ~~~ shell - $ brew install haproxy - ~~~ -
    - -
    - If you're using Linux and use apt-get, run: - {% include copy-clipboard.html %} - ~~~ shell - $ sudo apt-get install haproxy - ~~~ -
    - -2. Run the [`cockroach gen haproxy`](../cockroach-gen.html) command, specifying the port of any node: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach gen haproxy \ - --insecure \ - --host=localhost \ - --port=26257 - ~~~ - - This command generates an `haproxy.cfg` file automatically configured to work with the nodes of your running cluster. - -3. In `haproxy.cfg`, change `bind :26257` to `bind :26000`. This changes the port on which HAProxy accepts requests to a port that is not already in use by a node. - - {% include copy-clipboard.html %} - ~~~ shell - sed -i.saved 's/^ bind :26257/ bind :26000/' haproxy.cfg - ~~~ - -4. Start HAProxy, with the `-f` flag pointing to the `haproxy.cfg` file: - - {% include copy-clipboard.html %} - ~~~ shell - $ haproxy -f haproxy.cfg & - ~~~ - -## Step 2. Run a sample workload - -Now that you have a load balancer running in front of your cluster, use the YCSB workload built into CockroachDB to simulate multiple client connections, each performing mixed read/write workloads. - -1. In a new terminal, load the initial `ycsb` schema and data, pointing it at HAProxy's port: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach workload init ycsb \ - 'postgresql://root@localhost:26000?sslmode=disable' - ~~~ - -2. Run the `ycsb` workload, pointing it at HAProxy's port: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach workload run ycsb \ - --duration=20m \ - --concurrency=3 \ - --max-rate=1000 \ - --splits=50 \ - 'postgresql://root@localhost:26000?sslmode=disable' - ~~~ - - This command initiates 3 concurrent client workloads for 20 minutes, but limits the total load to 1000 operations per second (since you're running everything on a single machine). - - Also, the `--splits` flag tells the workload to manually split ranges a number of times. This is not something you'd normally do, but for the purpose of this training, it makes it easier to visualize the movement of data in the cluster. - -## Step 3. Check the workload - -Initially, the workload creates a new database called `ycsb`, creates a `usertable` table in that database, and inserts a bunch of rows into the table. Soon, the load generator starts executing approximately 95% reads and 5% writes. - -1. To check the SQL queries getting executed, go back to the Admin UI at http://localhost:8080, click **Metrics** on the left, and hover over the **SQL Queries** graph at the top: - - CockroachDB Admin UI - -2. To check the client connections from the load generator, select the **SQL** dashboard and hover over the **SQL Connections** graph: - - CockroachDB Admin UI - - You'll notice 3 client connections for the 3 concurrent workloads from the load generator. If you want to check that HAProxy balanced each connection to a different node, you can change the **Graph** dropdown from **Cluster** to each of the nodes. For three of the nodes, you'll see a single client connection. - -3. To see more details about the `ycsb` database and `usertable` table, click **Databases** in the upper left and then scroll down until you see **ycsb**: - - CockroachDB Admin UI - - You can also view the schema of the `usertable` by clicking the table name: - - CockroachDB Admin UI - -## Step 4. Simulate a single node failure - -When a node fails, the cluster waits for the node to remain offline for 5 minutes by default before considering it dead, at which point the cluster automatically repairs itself by re-replicating any of the replicas on the down nodes to other available nodes. - -1. In a new terminal, reduce the amount of time the cluster waits before considering a node dead to the minimum allowed of 1 minute and 15 seconds: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26000 \ - --execute="SET CLUSTER SETTING server.time_until_store_dead = '1m15s';" - ~~~ - -2. Then use the [`cockroach quit`](../cockroach-quit.html) command to stop node 5: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach quit \ - --insecure \ - --host=localhost:26261 - ~~~ - -## Step 5. Check load continuity and cluster health - -Go back to the Admin UI, click **Metrics** on the left, and verify that the cluster as a whole continues serving data, despite one of the nodes being unavailable and marked as **Suspect**: - -CockroachDB Admin UI - -This shows that when all ranges are replicated 3 times (the default), the cluster can tolerate a single node failure because the surviving nodes have a majority of each range's replicas (2/3). - -## Step 6. Watch the cluster repair itself - -Scroll down to the **Replicas per Node** graph: - -CockroachDB Admin UI - -Because you reduced the time it takes for the cluster to consider the down node dead, after 1 minute or so, you'll see the replica count on nodes 1 through 4 increase. This shows the cluster repairing itself by re-replicating missing replicas. - -## Step 7. Prepare for two simultaneous node failures - -At this point, the cluster has recovered and is ready to handle another failure. However, the cluster cannot handle two _near-simultaneous_ failures in this configuration. Failures are "near-simultaneous" if they are closer together than the `server.time_until_store_dead` setting plus the time taken for the number of replicas on the dead node to drop to zero. If two failures occurred in this configuration, some ranges would become unavailable until one of the nodes recovers. - -To be able to tolerate 2 of 5 nodes failing simultaneously without any service interruption, ranges must be replicated 5 times. - -1. Restart node 5, using the same command you used to start the node initially: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node5 \ - --listen-addr=localhost:26261 \ - --http-addr=localhost:8084 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -2. In a new terminal, use the [`ALTER RANGE ... CONFIGURE ZONE`](../configure-zone.html) command to change the cluster's `default` replication factor to 5: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql --execute="ALTER RANGE default CONFIGURE ZONE USING num_replicas=5;" --insecure --host=localhost:26000 - ~~~ - -3. Back in the Admin UI **Metrics** dashboard, watch the **Replicas per Node** graph to see how the replica count increases and evens out across all 5 nodes: - - CockroachDB Admin UI - - This shows the cluster up-replicating so that each range has 5 replicas, one on each node. - -## Step 8. Simulate two simultaneous node failures - -1. Use the [`cockroach quit`](../cockroach-quit.html) command to stop nodes 4 and 5: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach quit --insecure --host=localhost:26260 - ~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach quit --insecure --host=localhost:26261 - ~~~ - -## Step 9. Check load continuity and cluster health - -1. Like before, go to the Admin UI, click **Metrics** on the left, and verify that the cluster as a whole continues serving data, despite 2 nodes being offline: - - CockroachDB Admin UI - - This shows that when all ranges are replicated 5 times, the cluster can tolerate 2 simultaneous node outages because the surviving nodes have a majority of each range's replicas (3/5). - -2. To verify this further, use the `cockroach sql` command to count the number of rows in the `ycsb.usertable` table and verify that it is still serving reads: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SELECT count(*) FROM ycsb.usertable;" - ~~~ - - ~~~ - count - +-------+ - 10000 - (1 row) - ~~~ - - And writes: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="INSERT INTO ycsb.usertable VALUES ('asdf', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);" - ~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SELECT count(*) FROM ycsb.usertable;" - ~~~ - - ~~~ - count - +-------+ - 10001 - (1 row) - ~~~ - -## Step 10. Clean up - -In the next module, you'll start a new cluster from scratch, so take a moment to clean things up. - -1. Stop all CockroachDB nodes, HAProxy, and the YCSB load generator: - - {% include copy-clipboard.html %} - ~~~ shell - $ pkill -9 cockroach haproxy ycsb - ~~~ - - This simplified shutdown process is only appropriate for a lab/evaluation scenario. - -2. Remove the nodes' data directories and the HAProxy config: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node1 node2 node3 node4 node5 haproxy.cfg - ~~~ - -## What's Next? - -[Locality and Replication Zones](locality-and-replication-zones.html) diff --git a/src/archived/training/geo-partitioning.md b/src/archived/training/geo-partitioning.md deleted file mode 100644 index 732cf0dbce3..00000000000 --- a/src/archived/training/geo-partitioning.md +++ /dev/null @@ -1,580 +0,0 @@ ---- -title: Geo-Partitioning -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json ---- - - - - - -## Before you begin - -In this lab, you'll start with a fresh cluster, so make sure you've stopped and cleaned up the cluster from the previous labs. - -## Step 1. Start a cluster in one US region - -Start a cluster like you did previously, using the [`--locality`](../configure-replication-zones.html#descriptive-attributes-assigned-to-nodes) flag to indicate that the nodes are in the `us-east1` region, with each node in a distinct datacenter: - -1. Start node 1: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us-east1,datacenter=us-east1-a \ - --store=node1 \ - --listen-addr=localhost:26257 \ - --http-addr=localhost:8080 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -2. Start node 2: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us-east1,datacenter=us-east1-b \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -3. Start node 3: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us-east1,datacenter=us-east1-c \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -4. Use the [`cockroach init`](../cockroach-init.html) command to perform a one-time initialization of the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach init --insecure --host=localhost:26257 - ~~~ - -## Step 2. Expand into 2 more US regions - -Add 6 more nodes, 3 in the `us-west1` region and 3 in the `us-west2` region, with each node in a distinct datacenter: - -1. Start node 4: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us-west1,datacenter=us-west1-a \ - --store=node4 \ - --listen-addr=localhost:26260 \ - --http-addr=localhost:8083 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -2. Start node 5: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us-west1,datacenter=us-west1-b \ - --store=node5 \ - --listen-addr=localhost:26261 \ - --http-addr=localhost:8084 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -3. Start node 6: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us-west1,datacenter=us-west1-c \ - --store=node6 \ - --listen-addr=localhost:26262 \ - --http-addr=localhost:8085 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -4. Start node 7: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us-west2,datacenter=us-west2-a \ - --store=node7 \ - --listen-addr=localhost:26263 \ - --http-addr=localhost:8086 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -5. Start node 8: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us-west2,datacenter=us-west2-b \ - --store=node8 \ - --listen-addr=localhost:26264 \ - --http-addr=localhost:8087 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -6. Start node 9: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us-west2,datacenter=us-west2-c \ - --store=node9 \ - --listen-addr=localhost:26265 \ - --http-addr=localhost:8088 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -## Step 3. Enable a trial enterprise license - -The table partitioning feature requires an [enterprise license](https://www.cockroachlabs.com/get-started-cockroachdb/). - -1. [Request a trial enterprise license](https://www.cockroachlabs.com/get-cockroachdb/enterprise/). You should receive your trial license via email within a few minutes. - -2. Enable your trial license: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SET CLUSTER SETTING cluster.organization = '';" - ~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SET CLUSTER SETTING enterprise.license = '';" - ~~~ - - -## Step 4. Load the MovR dataset - -Now you'll import data representing users, vehicles, and rides for the fictional vehicle-sharing app, [MovR](../movr.html). - -1. Use the [`cockroach workload`](../cockroach-demo.html) command: - - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach workload init movr --num-users=5000 --num-rides=50000 --num-vehicles=500 - ~~~ - - This command creates the `movr` database with six tables: `users`, `vehicles`, `rides`, `promo_codes`, `vehicle_location_histories`, and `user_promo_codes`. The [`--num`](../cockroach-workload.html#movr-workload) flags specify a larger quantity of data to generate for the `users`, `rides`, and `vehicles` tables. - - -2. Start the [built-in SQL shell](../cockroach-sql.html): - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql --insecure --host=localhost - ~~~ - -3. Use [`SHOW TABLES`](../show-tables.html) to verify that `cockroach workload` created the `movr` tables: - - {% include copy-clipboard.html %} - ~~~ sql - > SHOW TABLES FROM movr; - ~~~ - ~~~ - table_name - +----------------------------+ - promo_codes - rides - user_promo_codes - users - vehicle_location_histories - vehicles - (6 rows) - ~~~ - -## Step 5. Check data distribution before partitioning - -At this point, the data for the three MovR tables (`users`, `rides`, and `vehicles`) is evenly distributed across all three localities. For example, let's check where the replicas of the `vehicles` and `users` tables are located: - -{% include copy-clipboard.html %} -~~~ sql -> SHOW RANGES FROM TABLE vehicles; -~~~ - -~~~ - start_key | end_key | range_id | range_size_mb | lease_holder | lease_holder_locality | replicas | replica_localities -+-----------+---------+----------+---------------+--------------+---------------------------------------+----------+---------------------------------------------------------------------------------------------------------------------------+ - NULL | NULL | 26 | 0.123054 | 2 | region=us-east1,datacenter=us-east1-b | {2,5,7} | {"region=us-east1,datacenter=us-east1-b","region=us-west1,datacenter=us-west1-b","region=us-west2,datacenter=us-west2-a"} -(1 row) -~~~ - -{% include copy-clipboard.html %} -~~~ sql -> SHOW RANGES FROM TABLE users; -~~~ - -~~~ - start_key | end_key | range_id | range_size_mb | lease_holder | lease_holder_locality | replicas | replica_localities -+-----------+---------+----------+---------------+--------------+---------------------------------------+----------+---------------------------------------------------------------------------------------------------------------------------+ - NULL | NULL | 25 | 0.554324 | 3 | region=us-east1,datacenter=us-east1-c | {3,6,9} | {"region=us-east1,datacenter=us-east1-c","region=us-west1,datacenter=us-west1-c","region=us-west2,datacenter=us-west2-c"} -(1 row) -~~~ - -Note: you may need to execute `use movr;` to be in the proper database context. For added clarity, here's a key showing how nodes map to localities: - -Node ID | Region | Datacenter ---------|--------|----------- -1 | `us-east1` | `us-east1-a` -2 | `us-east1` | `us-east1-b` -3 | `us-east1` | `us-east1-c` -4 | `us-west1` | `us-west1-a` -5 | `us-west1` | `us-west1-b` -6 | `us-west1` | `us-west1-c` -7 | `us-west2` | `us-west2-a` -8 | `us-west2` | `us-west2-b` -9 | `us-west2` | `us-west2-c` - -In this case, for the single range containing `vehicles` data, replicas are in all three regions, and the leaseholder is in the `us-east1` region. For the single range containing `users` data, replicas are in all three regions, and the leaseholder is in the `us-east1` region. - -## Step 6. Consider performance before partitioning - -In a real deployment, with nodes truly distributed across 3 regions of the US, having the MovR data evenly spread out would mean that reads and writes would often bounce back and forth across the country, causing high read and write latencies. - -### Reads - -For example, imagine you are a MovR administrator in San Francisco, and you want to get the IDs and descriptions of all San Francisco-based bikes that are currently in use. You issue the following query to one of the nodes in the `us-west2` region: - -{% include copy-clipboard.html %} -~~~ sql -> SELECT id, ext FROM vehicles -WHERE city = 'san francisco' AND type = 'bike' AND status = 'in_use'; -~~~ - -All requests initially go to the leaseholder for the relevant range. As you saw earlier, the leaseholder for the single range of the `vehicles` table is in the `us-east1` region, so in this case, the following would happen: - -1. The node receiving the request (the gateway node) in the `us-west2` region would route the request to the node in the `us-east1` region with the leaseholder. - -2. The leaseholder node would execute the query and return the data to the gateway node. - -3. The gateway node would return the data to the client. - -In summary, this simple read request have to travel back and forth across the entire country. - -### Writes - -The geographic distribution of the MovR data is even more likely to impact write performance. For example, imagine that a user in New York and a user in Seattle want to create new MovR accounts: - -{% include copy-clipboard.html %} -~~~ sql -> INSERT INTO users -VALUES (gen_random_uuid(), 'new york', 'New Yorker', '111 West Street', '9822222379937347'); -~~~ - -{% include copy-clipboard.html %} -~~~ sql -> INSERT INTO users -VALUES (gen_random_uuid(), 'seattle', 'Seattler', '111 East Street', '1736352379937347'); -~~~ - -For the single range containing `users` data, one replica is in each region, with the leaseholder in the `us-west1` region. This means that: - -- When creating the user in Seattle, the request doesn't have to leave the region to reach the leaseholder. However, since a write requires consensus from its replica group, the write has to wait for confirmation from either the replica in `us-east1` (New York, Boston, Washington DC) or `us-west2` (Los Angeles, San Francisco) before committing and then returning confirmation to the client. - -- When creating the user in New York, there are more network hops and, thus, increased latency. The request first needs to travel across the continent to the leaseholder in `us-west1`. It then has to wait for confirmation from either the replica in `us-east1` (New York, Boston, Washington DC) or `us-west2` (Los Angeles, San Francisco) before committing and then returning confirmation to the client back in the west. - -## Step 7. Partition data by city - -For this service, the most effective technique for improving read and write latency is to geo-partition the data by city. In essence, this means changing the way data is mapped to ranges. Instead of an entire table and its indexes mapping to a specific range or set of ranges, all rows in the table and its indexes with a given city will map to a range or set of ranges. - -1. Partition the `users` table by city: - - {% include copy-clipboard.html %} - ~~~ sql - > ALTER TABLE users - PARTITION BY LIST (city) ( - PARTITION new_york VALUES IN ('new york'), - PARTITION boston VALUES IN ('boston'), - PARTITION washington_dc VALUES IN ('washington dc'), - PARTITION seattle VALUES IN ('seattle'), - PARTITION san_francisco VALUES IN ('san francisco'), - PARTITION los_angeles VALUES IN ('los angeles') - ); - ~~~ - -2. Partition the `vehicles` table by city: - - {% include copy-clipboard.html %} - ~~~ sql - > ALTER TABLE vehicles - PARTITION BY LIST (city) ( - PARTITION new_york VALUES IN ('new york'), - PARTITION boston VALUES IN ('boston'), - PARTITION washington_dc VALUES IN ('washington dc'), - PARTITION seattle VALUES IN ('seattle'), - PARTITION san_francisco VALUES IN ('san francisco'), - PARTITION los_angeles VALUES IN ('los angeles') - ); - ~~~ - -3. Partition the `rides` table by city: - - {% include copy-clipboard.html %} - ~~~ sql - > ALTER TABLE rides - PARTITION BY LIST (city) ( - PARTITION new_york VALUES IN ('new york'), - PARTITION boston VALUES IN ('boston'), - PARTITION washington_dc VALUES IN ('washington dc'), - PARTITION seattle VALUES IN ('seattle'), - PARTITION san_francisco VALUES IN ('san francisco'), - PARTITION los_angeles VALUES IN ('los angeles') - ); - ~~~ - -{{site.data.alerts.callout_info}} -You didn't create any secondary indexes on your MovR tables. However, if you had, it would be important to partition the secondary indexes as well. -{{site.data.alerts.end}} - -## Step 8. Pin partitions close to users - -With the data partitioned by city, you can now use [replication zones](../configure-replication-zones.html#create-a-replication-zone-for-a-partition) to require that city data be stored on specific nodes based on locality: - -City | Locality ------|--------- -New York | `region=us-east1` -Boston | `region=us-east1` -Washington DC | `region=us-east1` -Seattle | `region=us-west1` -San Francisco | `region=us-west2` -Los Angeles | `region=us-west2` - -1. Start with the `users` table partitions: - - {% include copy-clipboard.html %} - ~~~ sql - > ALTER PARTITION new_york OF TABLE movr.users - CONFIGURE ZONE USING constraints='[+region=us-east1]'; - - > ALTER PARTITION boston OF TABLE movr.users - CONFIGURE ZONE USING constraints='[+region=us-east1]'; - - > ALTER PARTITION washington_dc OF TABLE movr.users - CONFIGURE ZONE USING constraints='[+region=us-east1]'; - - > ALTER PARTITION seattle OF TABLE movr.users - CONFIGURE ZONE USING constraints='[+region=us-west1]'; - - > ALTER PARTITION san_francisco OF TABLE movr.users - CONFIGURE ZONE USING constraints='[+region=us-west2]'; - - > ALTER PARTITION los_angeles OF TABLE movr.users - CONFIGURE ZONE USING constraints='[+region=us-west2]'; - ~~~ - -2. Move on to the `vehicles` table partitions: - - {% include copy-clipboard.html %} - ~~~ sql - > ALTER PARTITION new_york OF TABLE movr.vehicles - CONFIGURE ZONE USING constraints='[+region=us-east1]'; - - > ALTER PARTITION boston OF TABLE movr.vehicles - CONFIGURE ZONE USING constraints='[+region=us-east1]'; - - > ALTER PARTITION washington_dc OF TABLE movr.vehicles - CONFIGURE ZONE USING constraints='[+region=us-east1]'; - - > ALTER PARTITION seattle OF TABLE movr.vehicles - CONFIGURE ZONE USING constraints='[+region=us-west1]'; - - > ALTER PARTITION san_francisco OF TABLE movr.vehicles - CONFIGURE ZONE USING constraints='[+region=us-west2]'; - - > ALTER PARTITION los_angeles OF TABLE movr.vehicles - CONFIGURE ZONE USING constraints='[+region=us-west2]'; - ~~~ - -3. Finish with the `rides` table partitions: - - {% include copy-clipboard.html %} - ~~~ sql - > ALTER PARTITION new_york OF TABLE movr.rides - CONFIGURE ZONE USING constraints='[+region=us-east1]'; - - > ALTER PARTITION boston OF TABLE movr.rides - CONFIGURE ZONE USING constraints='[+region=us-east1]'; - - > ALTER PARTITION washington_dc OF TABLE movr.rides - CONFIGURE ZONE USING constraints='[+region=us-east1]'; - - > ALTER PARTITION seattle OF TABLE movr.rides - CONFIGURE ZONE USING constraints='[+region=us-west1]'; - - > ALTER PARTITION san_francisco OF TABLE movr.rides - CONFIGURE ZONE USING constraints='[+region=us-west2]'; - - > ALTER PARTITION los_angeles OF TABLE movr.rides - CONFIGURE ZONE USING constraints='[+region=us-west2]'; - ~~~ - -{{site.data.alerts.callout_info}} -If you had created any secondary index partitions, it would be important to create replication zones for each such partition as well. -{{site.data.alerts.end}} - -## Step 9. Check data distribution after partitioning - -Over the next few minutes, CockroachDB will rebalance all partitions based on the constraints you defined. - -To check this, run the `SHOW RANGES` statement on the `vehicles` and `users` tables: - -{% include copy-clipboard.html %} -~~~ sql -> SELECT * FROM [SHOW RANGES FROM TABLE vehicles] -WHERE "start_key" NOT LIKE '%Prefix%'; -~~~ - -~~~ - start_key | end_key | range_id | range_size_mb | lease_holder | lease_holder_locality | replicas | replica_localities -+------------------+----------------------------+----------+---------------+--------------+---------------------------------------+----------+---------------------------------------------------------------------------------------------------------------------------+ - /"boston" | /"boston"/PrefixEnd | 67 | 0.000144 | 1 | region=us-east1,datacenter=us-east1-a | {1,2,3} | {"region=us-east1,datacenter=us-east1-a","region=us-east1,datacenter=us-east1-b","region=us-east1,datacenter=us-east1-c"} - /"washington dc" | /"washington dc"/PrefixEnd | 69 | 0.000151 | 1 | region=us-east1,datacenter=us-east1-a | {1,2,3} | {"region=us-east1,datacenter=us-east1-a","region=us-east1,datacenter=us-east1-b","region=us-east1,datacenter=us-east1-c"} - /"new york" | /"new york"/PrefixEnd | 65 | 0.000304 | 2 | region=us-east1,datacenter=us-east1-b | {1,2,3} | {"region=us-east1,datacenter=us-east1-a","region=us-east1,datacenter=us-east1-b","region=us-east1,datacenter=us-east1-c"} - /"seattle" | /"seattle"/PrefixEnd | 71 | 0.000167 | 5 | region=us-west1,datacenter=us-west1-b | {4,5,6} | {"region=us-west1,datacenter=us-west1-a","region=us-west1,datacenter=us-west1-b","region=us-west1,datacenter=us-west1-c"} - /"los angeles" | /"los angeles"/PrefixEnd | 75 | 0.000158 | 8 | region=us-west2,datacenter=us-west2-b | {7,8,9} | {"region=us-west2,datacenter=us-west2-a","region=us-west2,datacenter=us-west2-b","region=us-west2,datacenter=us-west2-c"} - /"san francisco" | /"san francisco"/PrefixEnd | 73 | 0.000307 | 8 | region=us-west2,datacenter=us-west2-b | {7,8,9} | {"region=us-west2,datacenter=us-west2-a","region=us-west2,datacenter=us-west2-b","region=us-west2,datacenter=us-west2-c"} -(6 rows) -~~~ - -{{site.data.alerts.callout_info}} -The `WHERE` clause in this query excludes the empty ranges between the city ranges. These empty ranges use the default replication zone configuration, not the zone configuration you set for the cities. -{{site.data.alerts.end}} - -For added clarity, here's a key showing how nodes map to datacenters and cities: - -Node IDs | Region | Cities ----------|--------|------- -1 - 3 | `region=us-east1` | New York, Boston, Washington DC -4 - 6 | `region=us-west1` | Seattle -7 - 9 | `region=us-west2` | San Francisco, Los Angeles - -We can see that, after partitioning, the replicas for New York, Boston, and Washington DC are located on nodes 1-3 in `us-east1`, replicas for Seattle are located on nodes 4-6 in `us-west1`, and replicas for San Francisco and Los Angeles are located on nodes 7-9 in `us-west2`. - -The same data distribution is in place for the partitions of other tables as well. For example, here's the `users` table: - -{% include copy-clipboard.html %} -~~~ sql -> SELECT * FROM [SHOW RANGES FROM TABLE users] -WHERE "start_key" IS NOT NULL AND "start_key" NOT LIKE '%Prefix%'; -~~~ - -~~~ - start_key | end_key | range_id | range_size_mb | lease_holder | lease_holder_locality | replicas | replica_localities -+------------------+----------------------------+----------+---------------+--------------+---------------------------------------+----------+---------------------------------------------------------------------------------------------------------------------------+ - /"washington dc" | /"washington dc"/PrefixEnd | 49 | 0.000468 | 2 | region=us-east1,datacenter=us-east1-b | {1,2,3} | {"region=us-east1,datacenter=us-east1-a","region=us-east1,datacenter=us-east1-b","region=us-east1,datacenter=us-east1-c"} - /"boston" | /"boston"/PrefixEnd | 47 | 0.000438 | 3 | region=us-east1,datacenter=us-east1-c | {1,2,3} | {"region=us-east1,datacenter=us-east1-a","region=us-east1,datacenter=us-east1-b","region=us-east1,datacenter=us-east1-c"} - /"new york" | /"new york"/PrefixEnd | 45 | 0.000553 | 3 | region=us-east1,datacenter=us-east1-c | {1,2,3} | {"region=us-east1,datacenter=us-east1-a","region=us-east1,datacenter=us-east1-b","region=us-east1,datacenter=us-east1-c"} - /"seattle" | /"seattle"/PrefixEnd | 51 | 0.00044 | 4 | region=us-west1,datacenter=us-west1-a | {4,5,6} | {"region=us-west1,datacenter=us-west1-a","region=us-west1,datacenter=us-west1-b","region=us-west1,datacenter=us-west1-c"} - /"los angeles" | /"los angeles"/PrefixEnd | 55 | 0.000457 | 7 | region=us-west2,datacenter=us-west2-a | {7,8,9} | {"region=us-west2,datacenter=us-west2-a","region=us-west2,datacenter=us-west2-b","region=us-west2,datacenter=us-west2-c"} - /"san francisco" | /"san francisco"/PrefixEnd | 53 | 0.000437 | 7 | region=us-west2,datacenter=us-west2-a | {7,8,9} | {"region=us-west2,datacenter=us-west2-a","region=us-west2,datacenter=us-west2-b","region=us-west2,datacenter=us-west2-c"} -(6 rows) -~~~ - -## Step 10. Consider performance after partitioning - -After partitioning, reads and writes for a specific city will be much faster because all replicas for that city are now located on the nodes closest to the city. To think this through, let's reconsider the read and write examples from before partitioning. - -### Reads - -Once again, imagine you are a MovR administrator in San Francisco, and you want to get the IDs and descriptions of all San Francisco-based bikes that are currently in use. You issue the following query to one of the nodes in the `us-west2` region: - -{% include copy-clipboard.html %} -~~~ sql -> SELECT id, ext FROM vehicles -WHERE city = 'san francisco' AND type = 'bike' AND status = 'in_use'; -~~~ - -- Before partitioning, the leaseholder for the `vehicles` table was in the `us-east1` region, causing the request to travel back and forth across the entire country. - -- Now, as you saw above, the leaseholder for the San Francisco partition of the `vehicles` table is the `us-west2` datacenter. This means that the read request does not need to leave the region. - -### Writes - -Now once again imagine that a user in Seattle and a user in New York want to create new MovR accounts. - -{% include copy-clipboard.html %} -~~~ sql -> INSERT INTO users -VALUES (gen_random_uuid(), 'seattle', 'Seattler', '111 East Street', '1736352379937347'); -~~~ - -{% include copy-clipboard.html %} -~~~ sql -> INSERT INTO users -VALUES (gen_random_uuid(), 'new york', 'New Yorker', '111 West Street', '9822222379937347'); -~~~ - -- Before partitioning, the leaseholder wasn't necessarily in the same region as the node receiving the request, and replicas required to reach consensus were spread across all regions, causing increased latency. - -- Now, as you saw above, all 3 replicas for the Seattle partition of the `users` table are in the `us-west1` datacenter, and all 3 replicas for the New York partition of the `users` table are the `us-east1` datacenter. This means that the write requests to do not need to leave their respective regions to achieve consensus and commit. - -## Step 11. Clean up - -In the next module, you'll start with a fresh cluster, so take a moment to clean things up. - -1. Exit the SQL shell: - - {% include copy-clipboard.html %} - ~~~ sql - > \q - ~~~ - -2. Stop all CockroachDB nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ pkill -9 cockroach - ~~~ - - This simplified shutdown process is only appropriate for a lab/evaluation scenario. - -3. Remove the nodes' data directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node1 node2 node3 node4 node5 node6 node7 node8 node9 - ~~~ - -## What's next? - -[Orchestration with Kubernetes](orchestration-with-kubernetes.html) diff --git a/src/archived/training/how-cockroach-labs-debugs.md b/src/archived/training/how-cockroach-labs-debugs.md deleted file mode 100644 index bc6a46e043d..00000000000 --- a/src/archived/training/how-cockroach-labs-debugs.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: How Cockroach Labs Debugs -toc: false -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false ---- - - - -## What's next? - -[How to Get Support](how-to-get-support.html) diff --git a/src/archived/training/how-to-get-support.md b/src/archived/training/how-to-get-support.md deleted file mode 100644 index b29eb1c79cd..00000000000 --- a/src/archived/training/how-to-get-support.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: How to Get Support -toc: false -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false ---- - -When you encounter a problem that you cannot troubleshoot yourself (e.g., data corruption or software panic), [file an issue in the `cockroach` GitHub repository](https://github.com/cockroachdb/cockroach/issues/new) and include the following details. - -## Description of the problem - -- What happened? -- What did you expect to happen? - -## Steps to reproduce - -Make these as granular and precise as possible. - -## Screenshots - -If any Admin UI graphs or Debug pages show the problem, include screenshots. - -## Debug zip of active nodes - -Use the [`cockroach debug zip`](../cockroach-debug-zip.html) command to create a single file with the following details from all active nodes in your cluster: - -- Log files -- Schema change events -- Node liveness -- Gossip data -- Stack traces -- Range lists -- A list of databases and tables - -## Logs of offline nodes - -If any nodes are down, manually collect the logs of the down nodes, zip them up, and include them. diff --git a/src/archived/training/index.md b/src/archived/training/index.md deleted file mode 100644 index e0c76fbea92..00000000000 --- a/src/archived/training/index.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: CockroachDB Training -summary: Learn how to use CockroachDB for your applications -toc: false -feedback: false -sidebar_data: sidebar-data-training.json ---- - - - -CockroachDB training - -This training introduces you to the fundamentals of CockroachDB, with an emphasis on: - -- **Understanding the architecture** -- **Operational basics** - -The modules build on each other, so it's important to complete them in order. As you go, feel free to ask questions on our public [CockroachDB Community Slack](https://cockroachdb.slack.com) or [support forum](https://forum.cockroachlabs.com/). - - - -## What's first? - -[Why CockroachDB?](why-cockroachdb.html) diff --git a/src/archived/training/locality-and-replication-zones.md b/src/archived/training/locality-and-replication-zones.md deleted file mode 100644 index fd82446e6e1..00000000000 --- a/src/archived/training/locality-and-replication-zones.md +++ /dev/null @@ -1,406 +0,0 @@ ---- -title: Locality and Replication Zones -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json ---- - - - - - -## Before you begin - -In this lab, you'll start with a fresh cluster, so make sure you've stopped and cleaned up the cluster from the previous labs. - -## Step 1. Start a cluster in a single US region - -Start a cluster like you did previously, but this time use the [`--locality`](../configure-replication-zones.html#descriptive-attributes-assigned-to-nodes) flag to indicate that the nodes are all in a datacenter in the Eastern region of the US. - -{{site.data.alerts.callout_info}} -To simplify the process of running multiple nodes on your local computer, you'll start them in the [background](../cockroach-start.html#general) instead of in separate terminals. -{{site.data.alerts.end}} - -1. In a new terminal, start node 1: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us,datacenter=us-east \ - --store=node1 \ - --listen-addr=localhost:26257 \ - --http-addr=localhost:8080 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -2. Start node 2: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us,datacenter=us-east \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -3. Start node 3: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us,datacenter=us-east \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -4. Use the [`cockroach init`](../cockroach-init.html) command to perform a one-time initialization of the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach init --insecure --host=localhost:26257 - ~~~ - -## Step 2. Check data distribution - -By default, CockroachDB tries to balance data evenly across specified "localities". At this point, since all three of the initial nodes have the same locality, the data is distributed across the 3 nodes. This means that for each range, one replica is on each node. - -To check this, open the Web UI at http://localhost:8080, view **Node List**, and check the replica count is the same on all nodes. - -## Step 3. Expand into 2 more US regions - -Add 6 more nodes, this time using the [`--locality`](../configure-replication-zones.html#descriptive-attributes-assigned-to-nodes) flag to indicate that 3 nodes are in the Central region and 3 nodes are in the Western region of the US. - -1. In a new terminal, start node 4: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us,datacenter=us-central \ - --store=node4 \ - --listen-addr=localhost:26260 \ - --http-addr=localhost:8083 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -2. Start node 5: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us,datacenter=us-central \ - --store=node5 \ - --listen-addr=localhost:26261 \ - --http-addr=localhost:8084 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -3. Start node 6: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us,datacenter=us-central \ - --store=node6 \ - --listen-addr=localhost:26262 \ - --http-addr=localhost:8085 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - - You started nodes 4, 5, and 6 in the Central region. - -4. Start node 7: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us,datacenter=us-west \ - --store=node7 \ - --listen-addr=localhost:26263 \ - --http-addr=localhost:8086 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -5. Start node 8: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us,datacenter=us-west \ - --store=node8 \ - --listen-addr=localhost:26264 \ - --http-addr=localhost:8087 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -6. Start node 9: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=us,datacenter=us-west \ - --store=node9 \ - --listen-addr=localhost:26265 \ - --http-addr=localhost:8088 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - - You started nodes 7, 8, and 9 in the West region. - -## Step 4. Write data and verify data distribution - -Now that there are 3 distinct localities in the cluster, the cluster will automatically ensure that, for every range, one replica is on a node in `us-east`, one is on a node in `us-central`, and one is on a node in `us-west`. - -To check this, let's create a table, which initially maps to a single underlying range, and check where the replicas of the range end up. - -1. Use the `cockroach gen` command to generate an example `intro` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach gen example-data intro | cockroach sql \ - --insecure \ - --host=localhost:26257 - ~~~ - -2. Use the `cockroach sql` command to verify that the table was added: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SELECT * FROM intro.mytable WHERE (l % 2) = 0;" - ~~~ - - ~~~ - l | v - +----+------------------------------------------------------+ - 0 | !__aaawwmqmqmwwwaas,,_ .__aaawwwmqmqmwwaaa,, - 2 | !"VT?!"""^~~^"""??T$Wmqaa,_auqmWBT?!"""^~~^^""??YV^ - 4 | ! "?##mW##?"- - 6 | ! C O N G R A T S _am#Z??A#ma, Y - 8 | ! _ummY" "9#ma, A - 10 | ! vm#Z( )Xmms Y - 12 | ! .j####mmm#####mm#m##6. - 14 | ! W O W ! jmm###mm######m#mmm##6 - 16 | ! ]#me*Xm#m#mm##m#m##SX##c - 18 | ! dm#||+*$##m#mm#m#Svvn##m - 20 | ! :mmE=|+||S##m##m#1nvnnX##; A - 22 | ! :m#h+|+++=Xmm#m#1nvnnvdmm; M - 24 | ! Y $#m>+|+|||##m#1nvnnnnmm# A - 26 | ! O ]##z+|+|+|3#mEnnnnvnd##f Z - 28 | ! U D 4##c|+|+|]m#kvnvnno##P E - 30 | ! I 4#ma+|++]mmhvnnvq##P` ! - 32 | ! D I ?$#q%+|dmmmvnnm##! - 34 | ! T -4##wu#mm#pw##7' - 36 | ! -?$##m####Y' - 38 | ! !! "Y##Y"- - 40 | ! - (21 rows) - ~~~ - -3. Use the `SHOW RANGES` SQL command to find the IDs of the nodes where the new table's replicas ended up: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SHOW RANGES FROM TABLE intro.mytable;" - ~~~ - - ~~~ - start_key | end_key | range_id | range_size_mb | lease_holder | lease_holder_locality | replicas | replica_localities -+-----------+---------+----------+---------------+--------------+------------------------------+----------+---------------------------------------------------------------------------------------------------+ - NULL | NULL | 45 | 0.003054 | 9 | region=us,datacenter=us-west | {2,4,9} | {"region=us,datacenter=us-east","region=us,datacenter=us-central","region=us,datacenter=us-west"} -(1 row) - ~~~ - -## Step 5. Expand into Europe - -Let's say your user-base has expanded into Europe and you want to store data there. To do so, add 3 more nodes, this time using the [`--locality`](../configure-replication-zones.html#descriptive-attributes-assigned-to-nodes) flag to indicate that nodes are in the Western region of Europe. - -1. Start node 10: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=eu,datacenter=eu-west \ - --store=node10 \ - --listen-addr=localhost:26266 \ - --http-addr=localhost:8089 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -2. Start node 11: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=eu,datacenter=eu-west \ - --store=node11 \ - --listen-addr=localhost:26267 \ - --http-addr=localhost:8090 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -3. Start node 12: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --locality=region=eu,datacenter=eu-west \ - --store=node12 \ - --listen-addr=localhost:26268 \ - --http-addr=localhost:8091 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -## Step 6. Add EU-specific data - -Now imagine that `intro` database you created earlier is storing data for a US-based application, and you want a completely separate database to store data for an EU-based application. - -1. Use the `cockroach gen` command to generate an example `startrek` database with 2 tables, `episodes` and `quotes`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach gen example-data startrek | cockroach sql \ - --insecure \ - --host=localhost:26257 - ~~~ - -2. Use the `cockroach sql` command to verify that the tables were added: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SELECT * FROM startrek.episodes LIMIT 5;" \ - --execute="SELECT quote FROM startrek.quotes WHERE characters = 'Spock and Kirk';" - ~~~ - - ~~~ - id | season | num | title | stardate - +----+--------+-----+------------------------------+-------------+ - 1 | 1 | 1 | The Man Trap | 1531.100000 - 2 | 1 | 2 | Charlie X | 1533.600000 - 3 | 1 | 3 | Where No Man Has Gone Before | 1312.400000 - 4 | 1 | 4 | The Naked Time | 1704.200000 - 5 | 1 | 5 | The Enemy Within | 1672.100000 - (5 rows) - quote - +--------------------------------------------+ - "Beauty is transitory." "Beauty survives." - (1 row) - ~~~ - -## Step 7. Constrain data to specific regions - -Because you used the `--locality` flag to indicate the region for each of your nodes, constraining data to specific regions is simple. - -1. Use the [`ALTER DATABASE ... CONFIGURE ZONE`](../configure-zone.html) statement to create a replication zone for the `startrek` database, forcing all the data in the database to be located on EU-based nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql --execute="ALTER DATABASE startrek CONFIGURE ZONE USING constraints='[+region=eu]';" --insecure --host=localhost:26257 - ~~~ - -2. Use the [`ALTER DATABASE ... CONFIGURE ZONE`](../configure-zone.html) statement to create a distinct replication zone for the `intro` database, forcing all the data in the database to be located on US-based nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql --execute="ALTER DATABASE intro CONFIGURE ZONE USING constraints='[+region=us]';" --insecure --host=localhost:26257 - ~~~ - -## Step 8. Verify data distribution - -Now verify that the data for the table in the `intro` database is located on US-based nodes, and the data for the tables in the `startrek` database is located on EU-based nodes. - -1. Find the IDs of the nodes where replicas are stored for the `intro.mytable`, `startrek.episodes`, and `startrek.quotes` tables: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=127.0.0.1:54942 \ - --execute="SHOW RANGES FROM TABLE intro.mytable;" \ - --execute="SHOW RANGES FROM TABLE startrek.episodes;" \ - --execute="SHOW RANGES FROM TABLE startrek.quotes;" - ~~~ - - Note: your result set will differ slightly from ours. - - ~~~ - start_key | end_key | range_id | range_size_mb | lease_holder | lease_holder_locality | replicas | replica_localities - +-----------+---------+----------+---------------+--------------+---------------------------------+----------+---------------------------------------------------------------------------------------------------+ - NULL | NULL | 45 | 0.003054 | 5 | region=us,datacenter=us-central | {3,5,8} | {"region=us,datacenter=us-east","region=us,datacenter=us-central","region=us,datacenter=us-west"} - (1 row) - start_key | end_key | range_id | range_size_mb | lease_holder | lease_holder_locality | replicas | replica_localities - +-----------+---------+----------+---------------+--------------+------------------------------+----------+---------------------------------------------------------------------------------------------------+ - NULL | NULL | 46 | 0.004276 | 8 | region=us,datacenter=us-west | {3,5,8} | {"region=us,datacenter=us-east","region=us,datacenter=us-central","region=us,datacenter=us-west"} - (1 row) - start_key | end_key | range_id | range_size_mb | lease_holder | lease_holder_locality | replicas | replica_localities - +-----------+---------+----------+---------------+--------------+---------------------------------+----------+---------------------------------------------------------------------------------------------------+ - NULL | NULL | 47 | 0.03247 | 5 | region=us,datacenter=us-central | {3,5,8} | {"region=us,datacenter=us-east","region=us,datacenter=us-central","region=us,datacenter=us-west"} - (1 row) - ~~~ - -{{site.data.alerts.callout_info}} -You can also use the Web UI's Data Distribution matrix to view the distribution of data across nodes. -{{site.data.alerts.end}} - -## Step 9. Clean up - -Take a moment to clean things up. - -1. Stop all CockroachDB nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ pkill -9 cockroach - ~~~ - - This simplified shutdown process is only appropriate for a lab/evaluation scenario. - -2. Remove the nodes' data directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node{1,2,3,4,5,6,7,8,9,10,11,12} - ~~~ - -## What's next? - -[Geo-Partitioning](geo-partitioning.html) diff --git a/src/archived/training/logs.md b/src/archived/training/logs.md deleted file mode 100644 index 45fbdc34bbe..00000000000 --- a/src/archived/training/logs.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Debug Logs -toc: false -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false ---- - - - -## What's next? - -[Node Startup Troubleshooting](node-startup-troubleshooting.html) diff --git a/src/archived/training/monitoring-and-alerting.md b/src/archived/training/monitoring-and-alerting.md deleted file mode 100644 index 1da08be725e..00000000000 --- a/src/archived/training/monitoring-and-alerting.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Monitoring and Alerting -toc: false -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false ---- - - - -## What's next? - -[Debug Logs](logs.html) diff --git a/src/archived/training/network-partition-troubleshooting.md b/src/archived/training/network-partition-troubleshooting.md deleted file mode 100644 index 0eb6d94ca55..00000000000 --- a/src/archived/training/network-partition-troubleshooting.md +++ /dev/null @@ -1,185 +0,0 @@ ---- -title: Network Partition Troubleshooting -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false ---- - - - - - -## Before you begin - -Note that this lab involves running a cluster in Docker so that you can use it to fake a partition between datacenters. You will need to have [Docker Compose](https://docs.docker.com/compose/install/) on your local machine, so you may just want to observe this one. - -## Step 1. Create a cluster in Docker across 3 simulated datacenters - -1. Download the Docker Compose file that defines a 6-node CockroachDB cluster spread across 3 separate networks: - -
    - - -
    -

    - -
    - {% include copy-clipboard.html %} - ~~~ shell - $ curl -O {{site.url}}/docs/{{ page.version.version }}/training/resources/docker-compose.yaml - ~~~ -
    - -
    - {% include copy-clipboard.html %} - ~~~ shell - $ wget {{site.url}}/docs/{{ page.version.version }}/training/resources/docker-compose.yaml - ~~~ -
    - -2. Create the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ COCKROACH_VERSION={{ page.release_info.version }} docker-compose up - ~~~~ - -3. In a new terminal, initialize the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ docker exec -it roach-0 /cockroach/cockroach init --insecure - ~~~~ - -4. Verify that the cluster is working by opening the Admin UI at http://localhost:8080. - -## Step 2. Create a partition in the network - -1. Disconnect the nodes in `dc-2` from the shared network backbone: - - {% include copy-clipboard.html %} - ~~~ shell - $ docker network disconnect cockroachdb-training-shared roach-4 - ~~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ docker network disconnect cockroachdb-training-shared roach-5 - ~~~~ - -## Step 3. Troubleshoot the problem - -1. The Admin UI should now show that 2 of the nodes in the cluster have changed from "Healthy" to "Suspect": - - CockroachDB Admin UI - -2. Check whether the "Suspect" nodes are still running by hitting their `/health` endpoints: - - {% include copy-clipboard.html %} - ~~~ shell - $ curl localhost:8085/health - ~~~~ - - ~~~ - { - "nodeId": 3, - "address": { - "networkField": "tcp", - "addressField": "roach-5:26257" - }, - "buildInfo": { - "goVersion": "go1.10", - "tag": "v2.0.0", - "time": "2018/04/03 20:56:09", - "revision": "a6b498b7aff14234bcde23107b9e7fa14e6a34a8", - "cgoCompiler": "gcc 6.3.0", - "cgoTargetTriple": "x86_64-unknown-linux-gnu", - "platform": "linux amd64", - "distribution": "CCL", - "type": "release", - "channel": "official-binary", - "dependencies": null - } - } - ~~~ - -3. Check whether the "Suspect" nodes consider themselves live by hitting their `/_admin/v1/health` endpoints: - - {% include copy-clipboard.html %} - ~~~ shell - $ curl localhost:8085/_admin/v1/health - ~~~~ - - ~~~ - { - "error": "node is not live", - "code": 14 - } - ~~~ - -4. Check the logs of the downed nodes to see if they contain any clues, where you should find errors like "Error while dialing", "no such host", and "the connection is unavailable": - - {% include copy-clipboard.html %} - ~~~ shell - $ docker logs roach-5 - ~~~~ - - ~~~ - ... - I180213 20:38:14.728914 211 vendor/google.golang.org/grpc/grpclog/grpclog.go:75 grpc: addrConn.resetTransport failed to create client transport: connection error: desc = "transport: Error while dialing dial tcp: lookup roach-1 on 127.0.0.11:53: no such host"; Reconnecting to {roach-1:26257 } - ... - W180213 20:38:20.093309 286 storage/node_liveness.go:342 [n5,hb] failed node liveness heartbeat: failed to send RPC: sending to all 3 replicas failed; last error: { rpc error: code = Unavailable desc = grpc: the connection is unavailable} - ~~~ - -5. Check whether the majority nodes are able to talk to the minority nodes at all by looking at the network latency debug page at http://localhost:8080/#/reports/network: - - CockroachDB Admin UI - -6. If you really want to confirm that the network isn't working, try manually pinging a node in `dc-2` from a node in `dc-0`: - - {% include copy-clipboard.html %} - ~~~ shell - $ docker exec -t roach-0 ping roach-5 - ~~~~ - - ~~~ - ping: unknown host - ~~~ - -## Step 4. Fix the partition - -1. Reconnect the nodes in `dc-2` to the shared network backbone: - - {% include copy-clipboard.html %} - ~~~ shell - $ docker network connect cockroachdb-training-shared roach-4 - ~~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ docker network connect cockroachdb-training-shared roach-5 - ~~~~ - -2. After a few seconds, you should see the nodes go back to healthy again. - -## Step 5. Clean up - -You will not be using this Docker cluster in any other labs, so take a moment to clean things up. - -1. In the terminal where you ran `docker-compose up`, press **CTRL-C** to stop all the CockroachDB nodes. - -2. Delete all Docker resources created by the tutorial: - - {% include copy-clipboard.html %} - ~~~ shell - $ docker-compose down - ~~~ - -## What's next? - -[How Cockroach Labs Debugs](how-cockroach-labs-debugs.html) diff --git a/src/archived/training/node-decommissioning.md b/src/archived/training/node-decommissioning.md deleted file mode 100644 index fb9b87e8645..00000000000 --- a/src/archived/training/node-decommissioning.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -title: Node Decommissioning -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false - ---- - - - - - -## Before you begin - -Make sure you have already completed [Planned Maintenance](planned-maintenance.html) and have 3 nodes running locally. - -## Step 1. Try to decommission a node - -Run the `cockroach quit` command with the `--decommission` flag against node 3: - -{% include copy-clipboard.html %} -~~~ shell -$ cockroach quit \ ---insecure \ ---decommission \ ---host=localhost:26259 -~~~ - -{{site.data.alerts.callout_info}} -For the purposes of this training, you use the `cockroach quit` command with the `--decommission` flag. However, in production, you'd use `cockroach decommission` and then instruct your process manager to end the process. -{{site.data.alerts.end}} - -Because the cluster has 3 nodes, with every range on every node, it is not possible to rebalance node 3's data, so the decommission process hangs: - -~~~ - id | is_live | replicas | is_decommissioning | is_draining -+----+---------+----------+--------------------+-------------+ - 3 | true | 23 | true | false -(1 row) -............ -~~~ - -## Step 2. Add a fourth node - -In a new terminal, to make it possible for node 3 to decommission, add a fourth node: - -{% include copy-clipboard.html %} -~~~ shell -$ cockroach start \ ---insecure \ ---store=node4 \ ---listen-addr=localhost:26260 \ ---http-addr=localhost:8083 \ ---join=localhost:26257,localhost:26258,localhost:26259 -~~~ - -## Step 3. Verify that decommissioning completed - -1. Go back to the terminal where you triggered the decommission process. - - You'll see that, after the fourth node was added, the node's `gossiped_replicas` count decreased to 0 and the process completed with a confirmation: - - ~~~ - - id | is_live | replicas | is_decommissioning | is_draining - +----+---------+----------+--------------------+-------------+ - 3 | true | 4 | true | false - (1 row) - ...... - id | is_live | replicas | is_decommissioning | is_draining - +----+---------+----------+--------------------+-------------+ - 3 | true | 3 | true | false - (1 row) - ............ - id | is_live | replicas | is_decommissioning | is_draining - +----+---------+----------+--------------------+-------------+ - 3 | true | 0 | true | false - (1 row) - - No more data reported on target nodes. Please verify cluster health before removing the nodes. - ok - ~~~ - -2. Open the Admin UI at http://localhost:8080, click **Metrics** on the left, and hover over the **Replicas per Node** graph in the **Overview** dashboard. - - You'll see that node 3 now has 0 replicas while the other nodes have equal replica counts. - - CockroachDB Admin UI - -3. Click **Overview** on the left. About 5 minutes after the decommission process completes, you'll see node 3 listed under **Decommissioned Nodes**. - - CockroachDB Admin UI - -## Step 4. Clean up - -In the next module, you'll start a new cluster from scratch, so take a moment to clean things up. - -1. Stop all CockroachDB nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ pkill -9 cockroach - ~~~ - -2. Remove the nodes' data directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node1 node2 node3 node4 - ~~~ - -## What's next? - -[Backup and Restore](backup-and-restore.html) diff --git a/src/archived/training/node-startup-troubleshooting.md b/src/archived/training/node-startup-troubleshooting.md deleted file mode 100644 index e2bc5e8e62c..00000000000 --- a/src/archived/training/node-startup-troubleshooting.md +++ /dev/null @@ -1,322 +0,0 @@ ---- -title: Node Startup Troubleshooting -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false - ---- - - - - - -## Problem 1: SSL required - -In this scenario, you try to add a node to a secure cluster without providing the node's security certificate. You'll start with a fresh cluster, so make sure you've stopped and cleaned up the cluster from the previous labs. - -### Step 1. Generate security certificates - -1. Create two directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ mkdir certs my-safe-directory - ~~~ - -2. Create the CA certificate and key: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach cert create-ca \ - --certs-dir=certs \ - --ca-key=my-safe-directory/ca.key - ~~~ - -3. Create the certificate and key for the your nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach cert create-node \ - localhost \ - $(hostname) \ - --certs-dir=certs \ - --ca-key=my-safe-directory/ca.key - ~~~ - -4. Create client certificates and keys for the `root` and `spock` users: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach cert create-client \ - root \ - --certs-dir=certs \ - --ca-key=my-safe-directory/ca.key - ~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach cert create-client \ - spock \ - --certs-dir=certs \ - --ca-key=my-safe-directory/ca.key - ~~~ - -### Step 2. Start a secure 3-node cluster - -1. Start node 1: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --certs-dir=certs \ - --store=node1 \ - --listen-addr=localhost:26257 \ - --http-addr=localhost:8080 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -2. Start node 2: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --certs-dir=certs \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -3. Start node 3: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --certs-dir=certs \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -4. Perform a one-time initialization of the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach init --certs-dir=certs --host=localhost:26257 - ~~~ - -### Step 3. Simulate the problem - -In the same terminal, try to add another node, but leave out the `--certs-dir` flag: - -{{site.data.alerts.callout_info}} -The `--logtostderr=WARNING` flag will make warnings and errors print to `stderr` so you do not have to manually look in the logs. -{{site.data.alerts.end}} - -{% include copy-clipboard.html %} -~~~ shell -$ cockroach start \ ---store=node4 \ ---listen-addr=localhost:26260 \ ---http-addr=localhost:8083 \ ---join=localhost:26257,localhost:26258,localhost:26259 \ ---logtostderr=WARNING -~~~ - -The startup process will fail, and you'll see the following printed to `stderr`: - -~~~ -W191203 19:35:14.018995 1 cli/start.go:1046 Using the default setting for --cache (128 MiB). - A significantly larger value is usually needed for good performance. - If you have a dedicated server a reasonable setting is --cache=.25 (8.0 GiB). -W191203 19:35:14.019049 1 cli/start.go:1059 Using the default setting for --max-sql-memory (128 MiB). - A significantly larger value is usually needed in production. - If you have a dedicated server a reasonable setting is --max-sql-memory=.25 (8.0 GiB). -* -* ERROR: cannot load certificates. -* Check your certificate settings, set --certs-dir, or use --insecure for insecure clusters. -* -* failed to start server: problem with CA certificate: not found -* -E191203 19:35:14.137329 1 cli/error.go:233 cannot load certificates. -Check your certificate settings, set --certs-dir, or use --insecure for insecure clusters. - -failed to start server: problem with CA certificate: not found -Error: cannot load certificates. -Check your certificate settings, set --certs-dir, or use --insecure for insecure clusters. - -failed to start server: problem with CA certificate: not found -Failed running "start" -~~~ - -The error tells you that the failure has to do with security. Because the cluster is secure, it requires the new node to provide its security certificate in order to join. - -### Step 4. Resolve the problem - -To successfully join the node to the cluster, start the node again, but this time include the `--certs-dir` flag: - -{% include copy-clipboard.html %} -~~~ shell -$ cockroach start \ ---certs-dir=certs \ ---store=node4 \ ---listen-addr=localhost:26260 \ ---http-addr=localhost:8083 \ ---join=localhost:26257,localhost:26258,localhost:26259 -~~~ - -## Problem 2: Wrong join address - -In this scenario, you try to add another node to the cluster, but the `--join` address is not pointing at any of the existing nodes. - -### Step 1. Simulate the problem - -In a new terminal, try to add another node: - -{% include copy-clipboard.html %} -~~~ shell -$ cockroach start \ ---certs-dir=certs \ ---store=node5 \ ---listen-addr=localhost:26261 \ ---http-addr=localhost:8084 \ ---join=localhost:20000 \ ---logtostderr=WARNING -~~~ - -The process will never complete, and you'll see a continuous stream of warnings like this: - -~~~ -W180817 17:01:56.506968 886 vendor/google.golang.org/grpc/clientconn.go:942 Failed to dial localhost:20000: grpc: the connection is closing; please retry. -W180817 17:01:56.510430 914 vendor/google.golang.org/grpc/clientconn.go:1293 grpc: addrConn.createTransport failed to connect to {localhost:20000 0 }. Err :connection error: desc = "transport: Error while dialing dial tcp [::1]:20000: connect: connection refused". Reconnecting... -~~~ - -These warnings tell you that the node cannot establish a connection with the address specified in the `--join` flag. Without a connection to the cluster, the node cannot join. - -### Step 2. Resolve the problem - -1. Press **CTRL-C** twice to stop the previous startup attempt. - -2. To successfully join the node to the cluster, start the node again, but this time include a correct `--join` address: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --certs-dir=certs \ - --store=node5 \ - --listen-addr=localhost:26261 \ - --http-addr=localhost:8084 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~ - -## Problem 3: Missing join address - -In this scenario, you try to add another node to the cluster, but the `--join` address missing entirely, which causes the new node to start its own separate cluster. - -### Step 1. Simulate the problem - -1. In a new terminal, try to add another node: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --certs-dir=certs \ - --store=node6 \ - --listen-addr=localhost:26262 \ - --http-addr=localhost:8085 - ~~~ - - The startup process succeeds but, because a `--join` address wasn't specified, the node initializes itself as a new cluster instead of joining the existing cluster. You can see this in the `status` field printed to `stdout`: - - ~~~ - CockroachDB node starting at 2018-02-08 16:30:26.690638 +0000 UTC (took 0.2s) - build: CCL {{page.release_info.version}} @ 2018/01/08 17:30:06 (go1.8.3) - webui: https://localhost:8085 - sql: postgresql://root@localhost:26262?sslcert=certs%2Fclient.root.crt&sslkey=certs%2Fclient.root.key&sslmode=verify-full&sslrootcert=certs%2Fca.crt - RPC client flags: cockroach --host=localhost:26262 --certs-dir=certs - logs: /Users/crossman/node6/logs - temp dir: /Users/crossman/node6/cockroach-temp138121774 - external I/O path: /Users/crossman/node6/extern - store[0]: path=/Users/crossman/node6 - status: initialized new cluster - clusterID: e2514c0a-9dd5-4b2e-a20f-85183365c207 - nodeID: 1 - ~~~ - -2. Press **CTRL-C** to stop the new node. - -3. Start the node again, but this time include a correct `--join` address: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --certs-dir=certs \ - --store=node6 \ - --listen-addr=localhost:26262 \ - --http-addr=localhost:8085 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --logtostderr=WARNING - ~~~ - - The startup process fails because the cluster notices that the node's cluster ID does not match the cluster ID of the nodes it is trying to join to: - - ~~~ - W180815 17:21:00.316845 237 gossip/client.go:123 [n1] failed to start gossip client to localhost:26258: initial connection heartbeat failed: rpc error: code = Unknown desc = client cluster ID "9a6ed934-50e8-472a-9d55-c6ecf9130984" doesn't match server cluster ID "ab6960bb-bb61-4e6f-9190-992f219102c6" - ~~~ - -4. Press **CTRL-C** to stop the new node. - -### Step 2. Resolve the problem - -To successfully join the node to the cluster, you need to remove the node's data directory, which is where its incorrect cluster ID is stored, and start the node again: - -{% include copy-clipboard.html %} -~~~ shell -$ rm -rf node6 -~~~ - -{% include copy-clipboard.html %} -~~~ shell -$ cockroach start \ ---certs-dir=certs \ ---store=node6 \ ---listen-addr=localhost:26262 \ ---http-addr=localhost:8085 \ ---join=localhost:26257,localhost:26258,localhost:26259 \ ---background -~~~ - -This time, the startup process succeeds, and the `status` (added to the logs because you used `--background`) tells you that the node joined the intended cluster: - -{% include copy-clipboard.html %} -~~~ shell -$ grep -A 11 'CockroachDB node starting at' ./node6/logs/cockroach.log -~~~ - -~~~ -CockroachDB node starting at 2019-07-23 04:21:33.130572 +0000 UTC (took 0.2s) -build: CCL {{page.release_info.version}} @ 2019/05/22 22:44:42 (go1.12.5) -webui: https://localhost:8085 -sql: postgresql://root@localhost:26262?sslcert=certs%2Fclient.root.crt&sslkey=certs%2Fclient.root.key&sslmode=verify-full&sslrootcert=certs%2Fca.crt -client flags: cockroach --host=localhost:26262 --certs-dir=certs -logs: /Users/will/Downloads/temp-cockroach-cluster/node6/logs -temp dir: /Users/will/Downloads/temp-cockroach-cluster/node6/cockroach-temp509471222 -external I/O path: /Users/will/Downloads/temp-cockroach-cluster/node6/extern -store[0]: path=/Users/will/Downloads/temp-cockroach-cluster/node6 -status: initialized new node, joined pre-existing cluster -clusterID: e40f17e6-b4aa-4e69-bd7e-ecd6556194c3 -nodeID: 6 -~~~ - -## What's next? - -[Client Connection Troubleshooting](client-connection-troubleshooting.html) diff --git a/src/archived/training/orchestration-with-kubernetes.md b/src/archived/training/orchestration-with-kubernetes.md deleted file mode 100644 index c60b5fd3911..00000000000 --- a/src/archived/training/orchestration-with-kubernetes.md +++ /dev/null @@ -1,525 +0,0 @@ ---- -title: Orchestration with Kubernetes -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json ---- - - - -## Before you begin - -In this lab, you'll start with a fresh cluster, so make sure you've stopped and cleaned up the cluster from the previous labs. - -Also, before getting started, it's helpful to review some Kubernetes-specific terminology: - -Feature | Description ---------|------------ -[minikube](http://kubernetes.io/docs/getting-started-guides/minikube/) | This is the tool you'll use to run a Kubernetes cluster inside a VM on your local workstation. -[pod](http://kubernetes.io/docs/user-guide/pods/) | A pod is a group of one or more Docker containers. In this tutorial, all pods will run on your local workstation, each containing one Docker container running a single CockroachDB node. You'll start with 3 pods and grow to 4. -[StatefulSet](http://kubernetes.io/docs/concepts/abstractions/controllers/statefulsets/) | A StatefulSet is a group of pods treated as stateful units, where each pod has distinguishable network identity and always binds back to the same persistent storage on restart. StatefulSets require Kubernetes version 1.9 or newer. -[persistent volume](http://kubernetes.io/docs/user-guide/persistent-volumes/) | A persistent volume is a piece of storage mounted into a pod. The lifetime of a persistent volume is decoupled from the lifetime of the pod that's using it, ensuring that each CockroachDB node binds back to the same storage on restart.

    When using `minikube`, persistent volumes are external temporary directories that endure until they are manually deleted or until the entire Kubernetes cluster is deleted. -[persistent volume claim](http://kubernetes.io/docs/user-guide/persistent-volumes/#persistentvolumeclaims) | When pods are created (one per CockroachDB node), each pod will request a persistent volume claim to “claim” durable storage for its node. - -## Step 1. Start Kubernetes - -1. Follow Kubernetes' [documentation](https://kubernetes.io/docs/tasks/tools/install-minikube/) to install `minikube`, the tool used to run Kubernetes locally, for your OS. This includes installing a hypervisor and `kubectl`, the command-line tool used to manage Kubernetes from your local workstation. - - {{site.data.alerts.callout_info}} - Make sure you install `minikube` version 0.21.0 or later. Earlier versions do not include a Kubernetes server that supports the `maxUnavailability` field and `PodDisruptionBudget` resource type used in the CockroachDB StatefulSet configuration. - {{site.data.alerts.end}} - -2. Start a local Kubernetes cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ minikube start - ~~~ - -## Step 2. Start CockroachDB - -To start your CockroachDB cluster, you can use our StatefulSet configuration and related files directly. - -1. From your local workstation, use our [`cockroachdb-statefulset-secure.yaml`](https://github.com/cockroachdb/cockroach/blob/master/cloud/kubernetes/cockroachdb-statefulset-secure.yaml) file to create the StatefulSet that automatically creates 3 pods, each with a CockroachDB node running inside it: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl create -f https://raw.githubusercontent.com/cockroachdb/cockroach/master/cloud/kubernetes/cockroachdb-statefulset-secure.yaml - ~~~ - - ~~~ - serviceaccount/cockroachdb created - role.rbac.authorization.k8s.io/cockroachdb created - clusterrole.rbac.authorization.k8s.io/cockroachdb created - rolebinding.rbac.authorization.k8s.io/cockroachdb created - clusterrolebinding.rbac.authorization.k8s.io/cockroachdb created - service/cockroachdb-public created - service/cockroachdb created - poddisruptionbudget.policy/cockroachdb-budget created - statefulset.apps/cockroachdb created - ~~~ - -2. As each pod is created, it issues a Certificate Signing Request, or CSR, to have the node's certificate signed by the Kubernetes CA. You must manually check and approve each node's certificates, at which point the CockroachDB node is started in the pod. - - 1. Get the name of the `Pending` CSR for the first pod: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl get csr - ~~~ - - ~~~ - NAME AGE REQUESTOR CONDITION - default.node.cockroachdb-0 24s system:serviceaccount:default:cockroachdb Pending - default.node.cockroachdb-1 23s system:serviceaccount:default:cockroachdb Pending - default.node.cockroachdb-2 23s system:serviceaccount:default:cockroachdb Pending - ~~~ - - If you do not see a `Pending` CSR, wait a minute and try again. - - 2. Examine the CSR for the first pod: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl describe csr default.node.cockroachdb-0 - ~~~ - - ~~~ - Name: default.node.cockroachdb-0 - Labels: - Annotations: - CreationTimestamp: Wed, 15 May 2019 17:11:34 -0400 - Requesting User: system:serviceaccount:default:cockroachdb - Status: Pending - Subject: - Common Name: node - Serial Number: - Organization: Cockroach - Subject Alternative Names: - DNS Names: localhost - cockroachdb-0.cockroachdb.default.svc.cluster.local - cockroachdb-0.cockroachdb - cockroachdb-public - cockroachdb-public.default.svc.cluster.local - IP Addresses: 127.0.0.1 - Events: - ~~~ - - 3. If everything looks correct, approve the CSR for the first pod: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl certificate approve default.node.cockroachdb-0 - ~~~ - - ~~~ - certificatesigningrequest.certificates.k8s.io/default.node.cockroachdb-0 approved - ~~~ - - 4. Repeat steps 1-3 for the other 2 pods. - -3. Initialize the cluster: - - 1. Confirm that three pods are `Running` successfully. Note that they will not - be considered `Ready` until after the cluster has been initialized: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl get pods - ~~~ - - ~~~ - NAME READY STATUS RESTARTS AGE - cockroachdb-0 0/1 Running 0 2m - cockroachdb-1 0/1 Running 0 2m - cockroachdb-2 0/1 Running 0 2m - ~~~ - - 2. Confirm that the persistent volumes and corresponding claims were created successfully for all three pods: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl get persistentvolumes - ~~~ - - ~~~ - NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE - pvc-01ba3ca6-7756-11e9-b9fb-080027246063 100Gi RWO Delete Bound default/datadir-cockroachdb-0 standard 13m - pvc-01ccc75a-7756-11e9-b9fb-080027246063 100Gi RWO Delete Bound default/datadir-cockroachdb-1 standard 13m - pvc-01d111aa-7756-11e9-b9fb-080027246063 100Gi RWO Delete Bound default/datadir-cockroachdb-2 standard 13m - ~~~ - - 3. Use our [`cluster-init-secure.yaml`](https://raw.githubusercontent.com/cockroachdb/cockroach/master/cloud/kubernetes/cluster-init-secure.yaml) file to perform a one-time initialization that joins the nodes into a single cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl create \ - -f https://raw.githubusercontent.com/cockroachdb/cockroach/master/cloud/kubernetes/cluster-init-secure.yaml - ~~~ - - ~~~ - job.batch/cluster-init-secure created - ~~~ - - 4. Approve the CSR for the one-off pod from which cluster initialization happens: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl certificate approve default.client.root - ~~~ - - ~~~ - certificatesigningrequest.certificates.k8s.io/default.client.root approved - ~~~ - - 5. Confirm that cluster initialization has completed successfully. The job - should be considered successful and the CockroachDB pods should soon be - considered `Ready`: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl get job cluster-init-secure - ~~~ - - ~~~ - NAME COMPLETIONS DURATION AGE - cluster-init-secure 1/1 10s 16s - ~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl get pods - ~~~ - - ~~~ - NAME READY STATUS RESTARTS AGE - cluster-init-secure-fxdjl 0/1 Completed 0 53s - cockroachdb-0 1/1 Running 0 15m - cockroachdb-1 1/1 Running 0 15m - cockroachdb-2 1/1 Running 0 15m - ~~~ - -{{site.data.alerts.callout_success}} -The StatefulSet configuration sets all CockroachDB nodes to log to `stderr`, so if you ever need access to a pod/node's logs to troubleshoot, use `kubectl logs ` rather than checking the log on the persistent volume. -{{site.data.alerts.end}} - -## Step 3. Use the built-in SQL client - -To use the built-in SQL client, you need to launch a pod that runs indefinitely with the `cockroach` binary inside it, get a shell into the pod, and then start the built-in SQL client. - -1. From your local workstation, use our [`client-secure.yaml`](https://github.com/cockroachdb/cockroach/blob/master/cloud/kubernetes/client-secure.yaml) file to launch a pod and keep it running indefinitely: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl create \ - -f https://raw.githubusercontent.com/cockroachdb/cockroach/master/cloud/kubernetes/client-secure.yaml - ~~~ - - ~~~ - pod/cockroachdb-client-secure created - ~~~ - - The pod uses the `root` client certificate created earlier to initialize the cluster, so there's no CSR approval required. - -2. Get a shell into the pod and start the CockroachDB [built-in SQL client](../cockroach-sql.html): - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl exec -it cockroachdb-client-secure \ - -- ./cockroach sql \ - --certs-dir=/cockroach-certs \ - --host=cockroachdb-public - ~~~ - - ~~~ - # Welcome to the cockroach SQL interface. - # All statements must be terminated by a semicolon. - # To exit: CTRL + D. - # - # Server version: CockroachDB CCL v19.1.0 (x86_64-unknown-linux-gnu, built 2019/04/29 18:36:40, go1.11.6) (same version as client) - # Cluster ID: 7e1db24d-0f11-45d4-b472-bbd5f1fff858 - # - # Enter \? for a brief introduction. - # - root@cockroachdb-public:26257/defaultdb> - ~~~ - -3. Run some basic [CockroachDB SQL statements](../learn-cockroachdb-sql.html): - - {% include copy-clipboard.html %} - ~~~ sql - > CREATE DATABASE bank; - ~~~ - - {% include copy-clipboard.html %} - ~~~ sql - > CREATE TABLE bank.accounts (id INT PRIMARY KEY, balance DECIMAL); - ~~~ - - {% include copy-clipboard.html %} - ~~~ sql - > INSERT INTO bank.accounts VALUES (1, 1000.50); - ~~~ - - {% include copy-clipboard.html %} - ~~~ sql - > SELECT * FROM bank.accounts; - ~~~ - - ~~~ - +----+---------+ - | id | balance | - +----+---------+ - | 1 | 1000.5 | - +----+---------+ - (1 row) - ~~~ - -4. [Create a user with a password](../create-user.html#create-a-user-with-a-password): - - {% include copy-clipboard.html %} - ~~~ sql - > CREATE USER roach WITH PASSWORD 'Q7gc8rEdS'; - ~~~ - - You will need this username and password to access the Admin UI later. - -5. Exit the SQL shell and pod: - - {% include copy-clipboard.html %} - ~~~ sql - > \q - ~~~ - -{{site.data.alerts.callout_success}} -This pod will continue running indefinitely, so any time you need to reopen the built-in SQL client or run any other [`cockroach` client commands](../cockroach-commands.html) (e.g., `cockroach node`), repeat step 2 using the appropriate `cockroach` command. - -If you'd prefer to delete the pod and recreate it when needed, run `kubectl delete pod cockroachdb-client-secure`. -{{site.data.alerts.end}} - -## Step 4. Access the Admin UI - -To access the cluster's [Admin UI](../admin-ui-overview.html): - -1. Port-forward from your local machine to one of the pods: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl port-forward cockroachdb-0 8080 - ~~~ - - ~~~ - Forwarding from 127.0.0.1:8080 -> 8080 - ~~~ - - {{site.data.alerts.callout_info}}The port-forward command must be run on the same machine as the web browser in which you want to view the Admin UI. If you have been running these commands from a cloud instance or other non-local shell, you will not be able to view the UI without configuring kubectl locally and running the above port-forward command on your local machine.{{site.data.alerts.end}} - -2. Go to https://localhost:8080 and log in with the username and password you created earlier. - -3. In the UI, verify that the cluster is running as expected: - - Click **View nodes list** on the right to ensure that all nodes successfully joined the cluster. - - Click the **Databases** tab on the left to verify that `bank` is listed. - -## Step 5. Simulate node failure - -Based on the `replicas: 3` line in the StatefulSet configuration, Kubernetes ensures that three pods/nodes are running at all times. When a pod/node fails, Kubernetes automatically creates another pod/node with the same network identity and persistent storage. - -To see this in action: - -1. Stop one of CockroachDB nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl delete pod cockroachdb-2 - ~~~ - - ~~~ - pod "cockroachdb-2" deleted - ~~~ - -2. In the Admin UI, the **Cluster Overview** will soon show one node as **Suspect**. As Kubernetes auto-restarts the node, watch how the node once again becomes healthy. - -3. Back in the terminal, verify that the pod was automatically restarted: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl get pod cockroachdb-2 - ~~~ - - ~~~ - NAME READY STATUS RESTARTS AGE - cockroachdb-2 1/1 Running 0 12s - ~~~ - -## Step 6. Add nodes - -1. Use the `kubectl scale` command to add a pod for another CockroachDB node: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl scale statefulset cockroachdb --replicas=4 - ~~~ - - ~~~ - statefulset.apps/cockroachdb scaled - ~~~ - -2. Get the name of the `Pending` CSR for the new pod: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl get csr - ~~~ - - ~~~ - NAME AGE REQUESTOR CONDITION - default.client.root 8m system:serviceaccount:default:cockroachdb Approved,Issued - default.node.cockroachdb-0 22m system:serviceaccount:default:cockroachdb Approved,Issued - default.node.cockroachdb-1 22m system:serviceaccount:default:cockroachdb Approved,Issued - default.node.cockroachdb-2 22m system:serviceaccount:default:cockroachdb Approved,Issued - default.node.cockroachdb-3 2m system:serviceaccount:default:cockroachdb Pending - ~~~ - -3. Approve the CSR for the new pod: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl certificate approve default.node.cockroachdb-3 - ~~~ - - ~~~ - certificatesigningrequest.certificates.k8s.io/default.node.cockroachdb-3 approved - ~~~ - -4. Confirm that pod for the fourth node, `cockroachdb-3`, is `Running` successfully: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl get pods - ~~~ - - ~~~ - NAME READY STATUS RESTARTS AGE - cluster-init-secure-fxdjl 0/1 Completed 0 13m - cockroachdb-0 1/1 Running 1 28m - cockroachdb-1 1/1 Running 1 28m - cockroachdb-2 1/1 Running 0 8m - cockroachdb-3 1/1 Running 0 7m - cockroachdb-client-secure 1/1 Running 0 12m - ~~~ - -## Step 7. Remove nodes - -To safely remove a node from your cluster, you must first decommission the node and only then adjust the `--replicas` value of your StatefulSet configuration to permanently remove it. This sequence is important because the decommissioning process lets a node finish in-flight requests, rejects any new requests, and transfers all range replicas and range leases off the node. - -{{site.data.alerts.callout_danger}} -If you remove nodes without first telling CockroachDB to decommission them, you may cause data or even cluster unavailability. For more details about how this works and what to consider before removing nodes, see [Decommission Nodes](../remove-nodes.html). -{{site.data.alerts.end}} - -1. Get a shell into the `cockroachdb-client-secure` pod you created earlier and use the `cockroach node status` command to get the internal IDs of nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl exec -it cockroachdb-client-secure \ - -- ./cockroach node status \ - --certs-dir=/cockroach-certs \ - --host=cockroachdb-public - ~~~ - - ~~~ - id | address | build | started_at | updated_at | is_available | is_live - +----+-----------------------------------------------------------+---------+----------------------------------+----------------------------------+--------------+---------+ - 1 | cockroachdb-0.cockroachdb.default.svc.cluster.local:26257 | v19.1.0 | 2019-05-15 21:37:09.875482+00:00 | 2019-05-15 21:40:41.467829+00:00 | true | true - 2 | cockroachdb-2.cockroachdb.default.svc.cluster.local:26257 | v19.1.0 | 2019-05-15 21:31:50.21661+00:00 | 2019-05-15 21:40:41.308529+00:00 | true | true - 3 | cockroachdb-1.cockroachdb.default.svc.cluster.local:26257 | v19.1.0 | 2019-05-15 21:37:09.746432+00:00 | 2019-05-15 21:40:41.336179+00:00 | true | true - 4 | cockroachdb-3.cockroachdb.default.svc.cluster.local:26257 | v19.1.0 | 2019-05-15 21:37:34.962546+00:00 | 2019-05-15 21:40:44.08081+00:00 | true | true - (4 rows) - ~~~ - - The pod uses the `root` client certificate created earlier to initialize the cluster, so there's no CSR approval required. - -2. Note the ID of the node with the highest number in its address (in this case, the address including `cockroachdb-3`) and use the [`cockroach node decommission`](../cockroach-node.html) command to decommission it: - - {{site.data.alerts.callout_info}} - It's important to decommission the node with the highest number in its address because, when you reduce the `--replica` count, Kubernetes will remove the pod for that node. - {{site.data.alerts.end}} - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl exec -it cockroachdb-client-secure \ - -- ./cockroach node decommission \ - --certs-dir=/cockroach-certs \ - --host=cockroachdb-public - ~~~ - - You'll then see the decommissioning status print to `stderr` as it changes: - - ~~~ - id | is_live | replicas | is_decommissioning | is_draining - +---+---------+----------+--------------------+-------------+ - 4 | true | 73 | true | false - (1 row) - ~~~ - - Once the node has been fully decommissioned and stopped, you'll see a confirmation: - - ~~~ - id | is_live | replicas | is_decommissioning | is_draining - +---+---------+----------+--------------------+-------------+ - 4 | true | 0 | true | false - (1 row) - - No more data reported on target nodes. Please verify cluster health before removing the nodes. - ~~~ - -3. Once the node has been decommissioned, use the `kubectl scale` command to remove a pod from your StatefulSet: - - {% include copy-clipboard.html %} - ~~~ shell - $ kubectl scale statefulset cockroachdb --replicas=3 - ~~~ - - ~~~ - statefulset.apps/cockroachdb scaled - ~~~ - -## Step 8. Clean up - -In the next module, you'll start with a fresh, non-orchestrated cluster. Delete the StatefulSet configuration file and use the `minikube delete` command to shut down and delete the minikube virtual machine and all the resources you created, including persistent volumes: - -{% include copy-clipboard.html %} -~~~ shell -$ kubectl delete \ --f https://raw.githubusercontent.com/cockroachdb/cockroach/master/cloud/kubernetes/cockroachdb-statefulset.yaml -~~~ - -{% include copy-clipboard.html %} -~~~ shell -$ kubectl delete job.batch/cluster-init-secure -~~~ - -{% include copy-clipboard.html %} -~~~ shell -$ kubectl delete pod cockroachdb-client-secure - -{% include copy-clipboard.html %} -~~~ shell -$ minikube delete -~~~ - -~~~ -Deleting local Kubernetes cluster... -Machine deleted. -~~~ - -{{site.data.alerts.callout_success}} -To retain logs, copy them from each pod's `stderr` before deleting the cluster and all its resources. To access a pod's standard error stream, run `kubectl logs <podname>`. -{{site.data.alerts.end}} - -{{site.data.alerts.callout_info}} -For information on how to optimize your deployment of CockroachDB on Kubernetes, see [CockroachDB Performance on Kubernetes](../kubernetes-performance.html). -{{site.data.alerts.end}} - -## What's next? - -[Performance Benchmarking](performance-benchmarking.html) diff --git a/src/archived/training/performance-benchmarking.md b/src/archived/training/performance-benchmarking.md deleted file mode 100644 index e2e185524bc..00000000000 --- a/src/archived/training/performance-benchmarking.md +++ /dev/null @@ -1,166 +0,0 @@ ---- -title: Performance Benchmarking with TPC-C -summary: Learn how to benchmark CockroachDB against TPC-C. -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json ---- - -This lab walks you through [TPC-C](http://www.tpc.org/tpcc/) performance benchmarking on CockroachDB. It measures tpmC (new order transactions/minute) on a TPC-C dataset of 10 warehouses (for a total dataset size of 2GB) on 3 nodes. - -{{site.data.alerts.callout_info}} -For training purposes, the dataset used in this lab is small. For instructions on how to benchmark with a larger dataset, see [Performance Benchmarking with TPC-C](../performance-benchmarking-with-tpc-c-1k-warehouses.html). -{{site.data.alerts.end}} - -## Before you begin - -In this lab, you'll start with a fresh cluster, so make sure you've stopped and cleaned up the cluster from the previous labs. - -## Step 1. Start a 3-node cluster - -Start and initialize a cluster like you did in previous modules. - -{{site.data.alerts.callout_info}} -To simplify the process of running multiple nodes on your local computer, you'll start them in the [background](../cockroach-start.html#general) instead of in separate terminals. -{{site.data.alerts.end}} - -1. In a new terminal, start node 1: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node1 \ - --listen-addr=localhost:26257 \ - --http-addr=localhost:8080 \ - --join=localhost:26257,localhost:26258,localhost:26259,localhost:26260 \ - --background - ~~~~ - -2. Perform a one-time initialization of the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach init --insecure --host=localhost:26257 - ~~~ - -3. Start node 2: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259,localhost:26260 \ - --background - ~~~ - -4. Start node 3: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259,localhost:26260 \ - --background - ~~~ - -5. Start node 4, which will be used to run the TPC-C benchmark: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node4 \ - --listen-addr=localhost:26260 \ - --http-addr=localhost:8083 \ - --join=localhost:26257,localhost:26258,localhost:26259,localhost:26260 \ - --background - ~~~ - -{{site.data.alerts.callout_danger}} -This configuration is intended for training and performance benchmarking only. For production deployments, there are other important considerations, such as ensuring that data is balanced across at least three availability zones for resiliency. See the [Production Checklist](../recommended-production-settings.html) for more details. -{{site.data.alerts.end}} - -## Step 3. Load data for the benchmark - -CockroachDB comes with built-in load generators for simulating different types of client workloads, printing out per-operation statistics every second and totals after a specific duration or max number of operations. This step features CockroachDB's version of the TPC-C workload. - -On the fourth node, use `cockroach workload` to load the initial schema and data: - -{% include copy-clipboard.html %} -~~~ shell -$ cockroach workload init tpcc \ ---warehouses=10 \ -'postgresql://root@localhost:26260?sslmode=disable' -~~~ - -This will take about ten minutes to load. - -{{site.data.alerts.callout_success}} -For more `tpcc` options, use `workload run tpcc --help`. For details about other load generators included in `workload`, use `workload run --help`. -{{site.data.alerts.end}} - -## Step 4. Run the benchmark - -Run the workload for ten "warehouses" of data for five minutes (300 seconds): - -{% include copy-clipboard.html %} -~~~ shell -$ cockroach workload run tpcc \ ---warehouses=10 \ ---ramp=30s \ ---duration=300s \ ---split \ ---scatter \ -'postgresql://root@localhost:26260?sslmode=disable' -~~~ - -## Step 5. Interpret the results - -Once the `workload` has finished running, you should see a final output line: - -~~~ shell -_elapsed_______tpmC____efc__avg(ms)__p50(ms)__p90(ms)__p95(ms)__p99(ms)_pMax(ms) - 300.0s 120.8 93.9% 52.9 48.2 75.5 96.5 134.2 243.3 -~~~ - -You will also see some audit checks and latency statistics for each individual query. For this run, some of those checks might indicate that they were `SKIPPED` due to insufficient data. For a more comprehensive test, run `workload` for a longer duration (e.g., two hours). The `tpmC` (new order transactions/minute) number is the headline number and `efc` ("efficiency") tells you how close CockroachDB gets to theoretical maximum `tpmC`. - -The [TPC-C specification](http://www.tpc.org/tpc_documents_current_versions/pdf/tpc-c_v5.11.0.pdf) has p90 latency requirements in the order of seconds, but as you see here, CockroachDB far surpasses that requirement with p90 latencies in the hundreds of milliseconds. - -## Step 6. Clean up - -In the next module, you'll start with a fresh cluster, so take a moment to clean things up. - -1. Exit the SQL shell: - - {% include copy-clipboard.html %} - ~~~ sql - > \q - ~~~ - -2. Stop all CockroachDB nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ pkill -9 cockroach - ~~~ - - This simplified shutdown process is only appropriate for a lab/evaluation scenario. - -3. Remove the nodes' data directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node1 node2 node3 node4 - ~~~ - -## What's next? - -[Data Import](data-import.html) diff --git a/src/archived/training/planned-maintenance.md b/src/archived/training/planned-maintenance.md deleted file mode 100644 index a383e5574ff..00000000000 --- a/src/archived/training/planned-maintenance.md +++ /dev/null @@ -1,195 +0,0 @@ ---- -title: Planned Maintenance -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false - ---- - - - - - -## Before you begin - -In this lab, you'll start with a fresh cluster, so make sure you've stopped and cleaned up the cluster from the previous labs. - -## Step 1. Start a 3-node cluster - -Start and initialize an insecure cluster like you did in previous modules. - -1. In a new terminal, start node 1: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node1 \ - --listen-addr=localhost:26257 \ - --http-addr=localhost:8080 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~~ - -2. In a new terminal, start node 2: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~ - -3. In a new terminal, start node 3: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~ - -4. In a new terminal, perform a one-time initialization of the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach init --insecure --host=localhost:26257 - ~~~ - -## Step 2. Increase the time until a node is considered dead - -Let's say you need to perform some maintenance on each of your nodes, e.g., upgrade system software. For each node, you expect the maintenance and restart process to take no more than 15 minutes, and you do not want the cluster to consider a node dead and rebalance its data during this process. - -1. In the same terminal, increase the `server.time_until_store_dead` cluster setting: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SET CLUSTER SETTING server.time_until_store_dead = '15m0s';" - ~~~ - - {{site.data.alerts.callout_info}} - Use caution when changing the `server.time_until_store_dead` setting. Setting it too high creates some risk of unavailability since CockroachDB does not respond to down nodes as quickly. However, setting it too low causes increased network and disk I/O costs, as CockroachDB rebalances data around temporary outages. - {{site.data.alerts.end}} - -2. Then verify the new setting: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SHOW CLUSTER SETTING server.time_until_store_dead;" - ~~~ - - ~~~ - server.time_until_store_dead - +------------------------------+ - 15m - (1 row) - ~~~ - -## Step 3. Stop, maintain, and restart nodes - -Stop, maintain, and restart one node at a time. This ensures that, at any point, the cluster has a majority of replicas and remains available. - -1. In the first node's terminal, press **CTRL-C** to stop the node. - -2. Imagine that you are doing some maintenance on the node. - - While the node is offline, you can verify the cluster's health by pointing the Admin UI to one of the nodes that is still up: http://localhost:8081 or http://localhost:8082. - -3. In the same terminal, rejoin the node to the cluster, using the same command that you used to start it initially: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node1 \ - --listen-addr=localhost:26257 \ - --http-addr=localhost:8080 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~~ - -4. In the second node's terminal, press **CTRL-C** to stop the node. - -5. Imagine that you are doing some maintenance on the node. - - While the node is offline, you can verify the cluster's health by pointing the Admin UI to one of the nodes that is still up: http://localhost:8080 or http://localhost:8082. - -6. In the same terminal, rejoin the node to the cluster, using the same command that you used to start it initially: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~~ - -7. In the third node's terminal, press **CTRL-C** to stop the node. - -8. Imagine that you are doing some maintenance on the node. - - While the node is offline, you can verify the cluster's health by pointing the Admin UI to one of the nodes that is still up: http://localhost:8080 or http://localhost:8081. - -9. In the same terminal, rejoin the node to the cluster, using the same command that you used to start it initially: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~~ - -## Step 4. Reset the time until a node is considered dead - - Now that all nodes have been maintained and restarted, you can reset the time until the cluster considers a node dead and rebalances its data. - -1. In a new terminal, change the `server.time_until_store_dead` cluster setting back to the default of `5m0s`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="RESET CLUSTER SETTING server.time_until_store_dead;" - ~~~ - -2. Then verify the new setting: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SHOW CLUSTER SETTING server.time_until_store_dead;" - ~~~ - - ~~~ - server.time_until_store_dead - +------------------------------+ - 5m - (1 row) - ~~~ - -## What's next? - -[Node Decommissioning](node-decommissioning.html) diff --git a/src/archived/training/production-deployment.md b/src/archived/training/production-deployment.md deleted file mode 100644 index 5bd18f42332..00000000000 --- a/src/archived/training/production-deployment.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Production Deployment -toc: false -sidebar_data: sidebar-data-training.json -block_search: false - ---- - - - -## What's next? - -[Monitoring and Alerting](monitoring-and-alerting.html) diff --git a/src/archived/training/resources/docker-compose.yaml b/src/archived/training/resources/docker-compose.yaml deleted file mode 100644 index 09ce3d4b9b7..00000000000 --- a/src/archived/training/resources/docker-compose.yaml +++ /dev/null @@ -1,95 +0,0 @@ -version: '3.5' - -networks: - cockroachdb-training-shared: - name: cockroachdb-training-shared - driver: bridge - cockroachdb-training-dc0: - name: cockroachdb-training-dc0 - driver: bridge - cockroachdb-training-dc1: - name: cockroachdb-training-dc1 - driver: bridge - cockroachdb-training-dc2: - name: cockroachdb-training-dc2 - driver: bridge - -services: - - # DC 0 nodes - - roach-0: - container_name: roach-0 - hostname: roach-0 - image: cockroachdb/cockroach:${COCKROACH_VERSION:-v2.0.0} - networks: - - cockroachdb-training-shared - - cockroachdb-training-dc0 - command: start --logtostderr --insecure --locality=datacenter=dc-0 --join=roach-0,roach-1,roach-2 - ports: - - 8080:8080 - - 26257:26257 - - roach-1: - container_name: roach-1 - hostname: roach-1 - image: cockroachdb/cockroach:${COCKROACH_VERSION:-v2.0.0} - networks: - - cockroachdb-training-shared - - cockroachdb-training-dc0 - command: start --logtostderr --insecure --locality=datacenter=dc-0 --join=roach-0,roach-1,roach-2 - ports: - - 8081:8080 - - 26258:26257 - - # DC 1 nodes - - roach-2: - container_name: roach-2 - hostname: roach-2 - image: cockroachdb/cockroach:${COCKROACH_VERSION:-v2.0.0} - networks: - - cockroachdb-training-shared - - cockroachdb-training-dc1 - command: start --logtostderr --insecure --locality=datacenter=dc-1 --join=roach-0,roach-1,roach-2 - ports: - - 8082:8080 - - 26259:26257 - - roach-3: - container_name: roach-3 - hostname: roach-3 - image: cockroachdb/cockroach:${COCKROACH_VERSION:-v2.0.0} - networks: - - cockroachdb-training-shared - - cockroachdb-training-dc1 - command: start --logtostderr --insecure --locality=datacenter=dc-1 --join=roach-0,roach-1,roach-2 - ports: - - 8083:8080 - - 26260:26257 - - # DC 2 nodes - - roach-4: - container_name: roach-4 - hostname: roach-4 - image: cockroachdb/cockroach:${COCKROACH_VERSION:-v2.0.0} - networks: - - cockroachdb-training-shared - - cockroachdb-training-dc2 - command: start --logtostderr --insecure --locality=datacenter=dc-2 --join=roach-0,roach-1,roach-2 - ports: - - 8084:8080 - - 26261:26257 - - roach-5: - container_name: roach-5 - hostname: roach-5 - image: cockroachdb/cockroach:${COCKROACH_VERSION:-v2.0.0} - networks: - - cockroachdb-training-shared - - cockroachdb-training-dc2 - command: start --logtostderr --insecure --locality=datacenter=dc-2 --join=roach-0,roach-1,roach-2 - ports: - - 8085:8080 - - 26262:26257 diff --git a/src/archived/training/resources/mysql_dump.sql b/src/archived/training/resources/mysql_dump.sql deleted file mode 100644 index 4cd953f840b..00000000000 --- a/src/archived/training/resources/mysql_dump.sql +++ /dev/null @@ -1,77 +0,0 @@ --- MySQL dump 10.13 Distrib 5.7.22, for osx10.12 (x86_64) --- --- Host: localhost Database: mysql_import --- ------------------------------------------------------ --- Server version 5.7.22 - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - --- --- Table structure for table `accounts` --- - -DROP TABLE IF EXISTS `accounts`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `accounts` ( - `customer_id` int(11) NOT NULL, - `id` int(11) NOT NULL, - `balance` decimal(10,0) DEFAULT NULL, - PRIMARY KEY (`customer_id`), - CONSTRAINT `accounts_customer_id_fkey` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `accounts` --- - -LOCK TABLES `accounts` WRITE; -/*!40000 ALTER TABLE `accounts` DISABLE KEYS */; -INSERT INTO `accounts` VALUES (1,1,100),(2,2,200),(3,3,200),(4,4,400),(5,5,200); -/*!40000 ALTER TABLE `accounts` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `customers` --- - -DROP TABLE IF EXISTS `customers`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `customers` ( - `id` int(11) NOT NULL, - `name` text, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `customers` --- - -LOCK TABLES `customers` WRITE; -/*!40000 ALTER TABLE `customers` DISABLE KEYS */; -INSERT INTO `customers` VALUES (1,'Bjorn Fairclough'),(2,'Arturo Nevin'),(3,'Naseem Joossens'),(4,'Juno Studwick'),(5,'Eutychia Roberts'); -/*!40000 ALTER TABLE `customers` ENABLE KEYS */; -UNLOCK TABLES; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - --- Dump completed on 2018-12-20 11:34:30 diff --git a/src/archived/training/resources/pg_dump.sql b/src/archived/training/resources/pg_dump.sql deleted file mode 100644 index 6fd9ec472bb..00000000000 --- a/src/archived/training/resources/pg_dump.sql +++ /dev/null @@ -1,125 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 10.1 --- Dumped by pg_dump version 10.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; -SET row_security = off; - --- --- Name: test; Type: SCHEMA; Schema: -; Owner: seanloiselle --- - -CREATE SCHEMA test; - - -ALTER SCHEMA test OWNER TO seanloiselle; - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: accounts; Type: TABLE; Schema: public; Owner: seanloiselle --- - -CREATE TABLE accounts ( - customer_id integer, - id integer NOT NULL, - balance numeric, - CONSTRAINT accounts_balance_check CHECK ((balance > (0)::numeric)) -); - - -ALTER TABLE accounts OWNER TO seanloiselle; - --- --- Name: customers; Type: TABLE; Schema: public; Owner: seanloiselle --- - -CREATE TABLE customers ( - id integer NOT NULL, - name text -); - - -ALTER TABLE customers OWNER TO seanloiselle; - --- --- Data for Name: accounts; Type: TABLE DATA; Schema: public; Owner: seanloiselle --- - -COPY accounts (customer_id, id, balance) FROM stdin; -1 1 100 -2 2 200 -3 3 200 -4 4 400 -5 5 200 -\. - - --- --- Data for Name: customers; Type: TABLE DATA; Schema: public; Owner: seanloiselle --- - -COPY customers (id, name) FROM stdin; -1 Bjorn Fairclough -2 Arturo Nevin -3 Naseem Joossens -4 Juno Studwick -5 Eutychia Roberts -\. - - --- --- Name: accounts accounts_pkey; Type: CONSTRAINT; Schema: public; Owner: seanloiselle --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_pkey PRIMARY KEY (id); - - --- --- Name: customers customers_pkey; Type: CONSTRAINT; Schema: public; Owner: seanloiselle --- - -ALTER TABLE ONLY customers - ADD CONSTRAINT customers_pkey PRIMARY KEY (id); - - --- --- Name: accounts accounts_customer_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: seanloiselle --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_customer_id_fkey FOREIGN KEY (customer_id) REFERENCES customers(id); - - --- --- PostgreSQL database dump complete --- - diff --git a/src/archived/training/resources/pg_dump_cleaned.sql b/src/archived/training/resources/pg_dump_cleaned.sql deleted file mode 100644 index 52f4147a257..00000000000 --- a/src/archived/training/resources/pg_dump_cleaned.sql +++ /dev/null @@ -1,119 +0,0 @@ --- --- PostgreSQL database dump --- - --- Dumped from database version 10.1 --- Dumped by pg_dump version 10.1 - -SET statement_timeout = 0; -SET lock_timeout = 0; -SET idle_in_transaction_session_timeout = 0; -SET client_encoding = 'UTF8'; -SET standard_conforming_strings = on; -SET check_function_bodies = false; -SET client_min_messages = warning; -SET row_security = off; - --- --- Name: test; Type: SCHEMA; Schema: -; Owner: seanloiselle --- - --- --- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: --- - -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; - - --- --- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: --- - -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; - - -SET search_path = public, pg_catalog; - -SET default_tablespace = ''; - -SET default_with_oids = false; - --- --- Name: accounts; Type: TABLE; Schema: public; Owner: seanloiselle --- - -CREATE TABLE accounts ( - customer_id integer, - id integer NOT NULL, - balance numeric, - CONSTRAINT accounts_balance_check CHECK ((balance > (0)::numeric)) -); - - -ALTER TABLE accounts OWNER TO seanloiselle; - --- --- Name: customers; Type: TABLE; Schema: public; Owner: seanloiselle --- - -CREATE TABLE customers ( - id integer NOT NULL, - name text -); - - -ALTER TABLE customers OWNER TO seanloiselle; - --- --- Data for Name: accounts; Type: TABLE DATA; Schema: public; Owner: seanloiselle --- - -COPY accounts (customer_id, id, balance) FROM stdin; -1 1 100 -2 2 200 -3 3 200 -4 4 400 -5 5 200 -\. - - --- --- Data for Name: customers; Type: TABLE DATA; Schema: public; Owner: seanloiselle --- - -COPY customers (id, name) FROM stdin; -1 Bjorn Fairclough -2 Arturo Nevin -3 Naseem Joossens -4 Juno Studwick -5 Eutychia Roberts -\. - - --- --- Name: accounts accounts_pkey; Type: CONSTRAINT; Schema: public; Owner: seanloiselle --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_pkey PRIMARY KEY (id); - - --- --- Name: customers customers_pkey; Type: CONSTRAINT; Schema: public; Owner: seanloiselle --- - -ALTER TABLE ONLY customers - ADD CONSTRAINT customers_pkey PRIMARY KEY (id); - - --- --- Name: accounts accounts_customer_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: seanloiselle --- - -ALTER TABLE ONLY accounts - ADD CONSTRAINT accounts_customer_id_fkey FOREIGN KEY (customer_id) REFERENCES customers(id); - - --- --- PostgreSQL database dump complete --- diff --git a/src/archived/training/security.md b/src/archived/training/security.md deleted file mode 100644 index 76f6396daef..00000000000 --- a/src/archived/training/security.md +++ /dev/null @@ -1,263 +0,0 @@ ---- -title: Secure Your Cluster -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false - ---- - - - - - - -## Before you begin - -In this lab, you'll start with a fresh cluster, so make sure you've stopped and cleaned up the cluster from the previous lab. - -## Step 1. Generate security certificates - -1. Create two directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ mkdir certs my-safe-directory - ~~~ - - Directory | Description - ----------|------------ - `certs` | You'll generate your CA certificate and all node and client certificates and keys in this directory. - `my-safe-directory` | You'll generate your CA key in this directory and then reference the key when generating node and client certificates. - -2. Create the CA certificate and key: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach cert create-ca \ - --certs-dir=certs \ - --ca-key=my-safe-directory/ca.key - ~~~ - -3. Create the certificate and key for the your nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach cert create-node \ - localhost \ - $(hostname) \ - --certs-dir=certs \ - --ca-key=my-safe-directory/ca.key - ~~~ - - Because you're running a local cluster and all nodes use the same hostname (`localhost`), you only need a single node certificate. Note that this is different than running a production cluster, where you would need to generate a certificate and key for each node, issued to all common names and IP addresses you might use to refer to the node as well as to any load balancer instances. - -4. Create client certificates and keys for the `root` and `spock` users: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach cert create-client \ - root \ - --certs-dir=certs \ - --ca-key=my-safe-directory/ca.key - ~~~ - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach cert create-client \ - spock \ - --certs-dir=certs \ - --ca-key=my-safe-directory/ca.key - ~~~ - -## Step 2. Start a secure cluster - -Restart the nodes using the same commands you used to start them initially, but this time use the `--certs-dir` flag to point to the node certificate, and leave out the `--insecure` flag. - -1. Start node 1: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --certs-dir=certs \ - --store=node1 \ - --listen-addr=localhost:26257 \ - --http-addr=localhost:8080 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~~ - -2. Start node 2: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --certs-dir=certs \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -3. Start node 3: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --certs-dir=certs \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 \ - --background - ~~~ - -4. Perform a one-time initialization of the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach init --certs-dir=certs --host=localhost:26257 - ~~~ - -## Step 3. Add data to your cluster - -1. Use the `cockroach gen` command to generate an example `startrek` database with 2 tables, `episodes` and `quotes`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach gen example-data startrek | cockroach sql \ - --certs-dir=certs \ - --host=localhost:26257 - ~~~ - -2. Create a new user called `spock` and grant `spock` the `SELECT` privilege on the `startrek.quotes` table: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --certs-dir=certs \ - --host=localhost:26257 \ - --execute="CREATE USER spock; GRANT SELECT ON TABLE startrek.quotes TO spock;" - ~~~ - -## Step 4. Authenticate a user (via client cert) - -1. As the `spock` user, read from the `startrek.quotes` table, using the `--certs-dir` to point to the user's client cert: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --certs-dir=certs \ - --host=localhost:26257 \ - --user=spock \ - --database=startrek \ - --execute="SELECT * FROM quotes WHERE quote ~* 'creature';" - ~~~ - - ~~~ - quote | characters | stardate | episode - +-------------------------------------------------------------+------------+----------+---------+ - There is a multi-legged creature crawling on your shoulder. | Spock | 3193.9 | 23 - (1 row) - ~~~ - -## Step 5. Authenticate a user (via password) - -Although we recommend always using TLS certificates to authenticate users, it's possible to authenticate a user with just a password. - -{{site.data.alerts.callout_info}} -For multiple users to access the Admin UI, the `root` user must [create users with passwords](../create-user.html#create-a-user-with-a-password). -{{site.data.alerts.end}} - -1. As the `root` user, open the built-in SQL shell: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --certs-dir=certs \ - --host=localhost:26257 - ~~~ - -2. Create a new `kirk` user with the password `enterprise`. You'll have to type in the password twice at the prompt: - - {% include copy-clipboard.html %} - ~~~ sql - > CREATE USER kirk WITH PASSWORD 'enterprise'; - ~~~ - -3. Exit the SQL shell: - - {% include copy-clipboard.html %} - ~~~ sql - > \q - ~~~ - -4. As the `root` user, grant `kirk` the `SELECT` privilege on the tables in the `startrek` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --certs-dir=certs \ - --host=localhost:26257 \ - --user=root \ - --execute="GRANT SELECT ON startrek.* TO kirk;" - ~~~ - -5. As the `kirk` user, read from the `startrek.quotes` table: - - {{site.data.alerts.callout_info}} - It's necessary to include the `--certs-dir` flag even though you haven't created a cert for this user. When the cluster does not find a suitable client cert, it falls back on password authentication. - {{site.data.alerts.end}} - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --certs-dir=certs \ - --host=localhost:26257 \ - --user=kirk \ - --database=startrek \ - --execute="SELECT * FROM quotes WHERE quote ~* 'danger';" - ~~~ - - Enter `enterprise` as the password: - - ~~~ - Enter password: - ~~~ - - You'll then see the response: - - ~~~ - quote | characters | stardate | episode - +------------------------------------------+---------------+----------+---------+ - Insufficient facts always invite danger. | Spock | 3141.9 | 22 - Power is danger. | The Centurion | 1709.2 | 14 - (2 rows) - ~~~ - -## Clean up - -In the next module, you'll start a new cluster from scratch, so take a moment to clean things up. - -1. Stop all CockroachDB nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ pkill -9 cockroach - ~~~ - -2. Remove the nodes' data directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node1 node2 node3 my-safe-directory certs - ~~~ - -## What's next? - -[Production Deployment](production-deployment.html) diff --git a/src/archived/training/software-panic-troubleshooting.md b/src/archived/training/software-panic-troubleshooting.md deleted file mode 100644 index f6300a301b6..00000000000 --- a/src/archived/training/software-panic-troubleshooting.md +++ /dev/null @@ -1,101 +0,0 @@ ---- -title: Software Panic Troubleshooting -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false - ---- - - - - - -## Before you begin - -Make sure you have already completed [Data Corruption Troubleshooting](data-corruption-troubleshooting.html) and have a cluster of 3 nodes running. - -## Step 1. Simulate the problem - -1. In a new terminal, issue a "query of death" against node 3. The query will crash the node, the connection will then fail, and you'll see an error message printed to `stderr`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26259 \ - --execute="SELECT crdb_internal.force_panic('foo');" - ~~~ - - ~~~ - Error: driver: bad connection - Failed running "sql" - ~~~ - -## Step 2. Troubleshoot the problem - -In the terminal where node 3 was running, check the `stdout` for details: - -{{site.data.alerts.callout_info}} -You can also look in the node's full logs at `node3/logs`. -{{site.data.alerts.end}} - -~~~ -E180209 14:47:54.819282 2149 sql/session.go:1370 [client=127.0.0.1:53558,user=root,n1] a SQL panic has occurred! -* -* ERROR: [client=127.0.0.1:53558,user=root,n1] a SQL panic has occurred! -* -E180209 14:47:54.819378 2149 util/log/crash_reporting.go:113 [n1] a panic has occurred! -* -* ERROR: [n1] a panic has occurred! -* -panic while executing "select crdb_internal.force_panic('foo');": foo - -goroutine 2149 [running]: -runtime/debug.Stack(0x8246800, 0xc42038e540, 0x3) - /usr/local/go/src/runtime/debug/stack.go:24 +0x79 -github.com/cockroachdb/cockroach/pkg/util/log.ReportPanic(0x8246800, 0xc42038e540, 0xc4201d2000, 0x56f2fe0, 0xc4203632a0, 0x1) -... -~~~ - -The cause of the panic is clearly identified before the stack trace: - -~~~ -panic while executing "select crdb_internal.force_panic('foo');": foo -~~~ - -## Step 3. Resolve the problem - -With the cause identified, you should: - -1. Update your application to stop issuing the "query of death". - -2. Restart the down node. - -3. File an issue with Cockroach Labs. We'll cover the ideal way to do this in an upcoming module. - -## Step 4. Clean up - -In the next lab, you'll start a new cluster from scratch, so take a moment to clean things up. - -1. Stop the other CockroachDB nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ pkill -9 cockroach - ~~~ - -2. Remove the nodes' data directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node1 node2 node3 - ~~~ - -## What's next? - -[Network Partition Troubleshooting](network-partition-troubleshooting.html) diff --git a/src/archived/training/sql-basics.md b/src/archived/training/sql-basics.md deleted file mode 100644 index d938ad842b2..00000000000 --- a/src/archived/training/sql-basics.md +++ /dev/null @@ -1,439 +0,0 @@ ---- -title: SQL Basics -toc: true -sidebar_data: sidebar-data-training.json ---- - - -
    - -## Before you begin - -Make sure you have already completed [Data Import](data-import.html). - -## Step 1. Start a SQL shell - -Use the [`cockroach sql`](../cockroach-start.html) command to open the built-in SQL client: - -{% include copy-clipboard.html %} -~~~ shell -$ cockroach sql --insecure --host=localhost:26257 -~~~ - -## Step 2. Create a database and table - -In this training, you'll create a bank with customers and accounts. First, you'll need to [create a database](../create-database.html) on your Cockroach cluster to store this information. - -1. In the built-in SQL client, create a database: - - {% include copy-clipboard.html %} - ~~~ sql - > CREATE DATABASE bank; - ~~~ - - Databases do not directly store any data; you need to describe the - shape of the data you intend to store by [creating tables](../create-table.html) within your database. - -2. Create a table: - - {% include copy-clipboard.html %} - ~~~ sql - > CREATE TABLE bank.customers ( - customer_id INTEGER PRIMARY KEY, - name STRING, - address STRING - ); - ~~~ - - You created a table called `customers` in the `bank` database with three columns: `customer_id`, `name`, and `address`. Each column has a [data type](../data-types.html). This means that the column will only accept the specified data type (i.e., `customer_id` can only be an [`INTEGER`](../int.html), `name` can only be a [`STRING`](../string.html), and `address` can only be a `STRING`). - - The `customer_id` column is also the table's [primary key](../primary-key.html). In CockroachDB, and most SQL databases, it is always more efficient to search a table by primary key than by any other field because there can only be one primary key column, and the primary key column must be unique for every row. Therefore, the `name` column would be an unsuitable primary key because it's likely that your bank will eventually have two customers with the same name. - -## Step 3. Insert data into your table - -Now that you have a table, [insert](../insert.html) some data into it. - -1. Insert a row into the table: - - {% include copy-clipboard.html %} - ~~~ sql - > INSERT INTO bank.customers - VALUES (1, 'Petee', '101 5th Ave, New York, NY 10003'); - ~~~ - - `INSERT` statements add new rows to a table. Values must be specified in the same order that the columns were declared in the `CREATE TABLE` statement. Note that a string needs to be surrounded with single quotes (`'`), but integers do not. - -2. Verify that the data was inserted successfully by using a [`SELECT` statement](../select.html) to retrieve data from the table: - - {% include copy-clipboard.html %} - ~~~ sql - > SELECT customer_id, name, address FROM bank.customers; - ~~~ - - ~~~~ - customer_id | name | address - +-------------+-------+------------------------------------------------+ - 1 | Petee | 101 5th Ave, New York, NY 10003 - (1 row) - ~~~~ - -3. Insert another row: - - {% include copy-clipboard.html %} - ~~~ sql - > INSERT INTO bank.customers VALUES (2, 'Carl', NULL); - ~~~ - - We do not know Carl's address, so we use the special `NULL` value to indicate "unknown." - -4. Insert two rows in the same statement: - - {% include copy-clipboard.html %} - ~~~ sql - > INSERT INTO bank.customers VALUES - (3, 'Lola', NULL), - (4, 'Ernie', '1600 Pennsylvania Ave NW, Washington, DC 20500'); - ~~~ - -5. Verify that the data was inserted successfully: - - {% include copy-clipboard.html %} - ~~~ sql - > SELECT * FROM bank.customers; - ~~~ - - ~~~ - customer_id | name | address - +-------------+-------+------------------------------------------------+ - 1 | Petee | 101 5th Ave, New York, NY 10003 - 2 | Carl | NULL - 3 | Lola | NULL - 4 | Ernie | 1600 Pennsylvania Ave NW, Washington, DC 20500 - (4 rows) - ~~~ - - The `SELECT *` shorthand is used to indicate that you want all the columns in the table without explicitly enumerating them. - - {{site.data.alerts.callout_info}} - Tables are also called **relations**, in the mathematical sense of the word, which is why SQL databases are sometimes referred to as relational databases. - {{site.data.alerts.end}} - -## Step 4. Create an `accounts` table - -Now that you have a place to store personal information about customers, create a table to store data about the customers' account(s) and balance. - -1. Create an `accounts` table: - - {% include copy-clipboard.html %} - ~~~ sql - > CREATE TABLE bank.accounts ( - type STRING, - balance DECIMAL(8, 2), - customer_id INTEGER REFERENCES bank.customers (customer_id) - ); - ~~~ - - This table demonstrates two new SQL features. - - The first new feature is the balance column's [`DECIMAL` type](../decimal.html), which is capable of storing fractional numbers (the previously used `INTEGER` columns can only store whole numbers). The numbers in parenthesis indicate the maximum size of the decimal number. `DECIMAL(8, 2)` means that a number with up to eight digits can be stored with up to two digits past the decimal point. This means we can store account balances as large as `999999.99`, but no larger. - - The second new feature is the [foreign key](../foreign-key.html) created by the `REFERENCES` clause. Foreign keys are how SQL maintains referential integrity across different tables. Here, the foreign key guarantees that every account belongs to a real customer. Let's verify this works as intended. - -2. Try to open an account for a customer that doesn't exist: - - {% include copy-clipboard.html %} - ~~~ sql - > INSERT INTO bank.accounts VALUES ('checking', 0.00, 5); - ~~~ - - ~~~ - pq: foreign key violation: value [5] not found in customers@primary [customer_id] (txn="sql txn" id=fd9f171c key=/Min rw=false pri=0.00960426 iso=SERIALIZABLE stat=PENDING epo=0 ts=1534557981.019071738,0 orig=1534557981.019071738,0 max=1534557981.519071738,0 wto=false rop=false seq=1) - ~~~ - - As expected, the statement fails with a "foreign key violation" error, indicating that no customer with ID `5` exists. - -3. Now open an account for a valid customer: - - {% include copy-clipboard.html %} - ~~~ sql - > INSERT INTO bank.accounts VALUES ('checking', 0.00, 1); - ~~~ - -4. Try to [delete](../delete.html) a customer record: - - {% include copy-clipboard.html %} - ~~~ sql - > DELETE FROM bank.customers WHERE customer_id = 1; - ~~~ - - The `WHERE` clause here is a constraint. It indicates that we do not want to delete all the data in the `customers` table, but just the row where `customer_id=1`. - - ~~~ - pq: foreign key violation: values [1] in columns [customer_id] referenced in table "accounts" - ~~~ - - You weren't able to delete Petee's information because the customer still has accounts open (i.e., there are records in the `accounts` table). - -5. Delete a customer's account: - - {% include copy-clipboard.html %} - ~~~ sql - > DELETE FROM bank.accounts WHERE customer_id = 1; - ~~~ - -6. Now that the customer's account is deleted, you can delete the customer record: - - {% include copy-clipboard.html %} - ~~~ sql - > DELETE FROM bank.customers WHERE customer_id = 1; - ~~~ - -7. Create accounts for Carl (`customer_id=2`) and Ernie (`customer_id=4`): - - {% include copy-clipboard.html %} - ~~~ sql - > INSERT INTO bank.accounts VALUES - ('checking', 250.00, 2), - ('savings', 314.15, 2), - ('savings', 42000.00, 4); - ~~~ - -## Step 5. List account balances - -1. View account balances using a `SELECT` statement: - - {% include copy-clipboard.html %} - ~~~ sql - > SELECT * FROM bank.accounts; - ~~~ - - ~~~ - type | balance | customer_id - +----------+----------+-------------+ - checking | 250.00 | 2 - savings | 314.15 | 2 - savings | 42000.00 | 4 - (3 rows) - ~~~ - -2. Use a [join](../joins.html) to match customer IDs with the name and address in the `customers` table: - - {% include copy-clipboard.html %} - ~~~ sql - > SELECT * FROM bank.customers NATURAL JOIN bank.accounts; - ~~~ - - ~~~ - customer_id | name | address | type | balance - +-------------+-------+------------------------------------------------+----------+----------+ - 2 | Carl | NULL | checking | 250.00 - 2 | Carl | NULL | savings | 314.15 - 4 | Ernie | 1600 Pennsylvania Ave NW, Washington, DC 20500 | savings | 42000.00 - (3 rows) - ~~~ - - Now you have one view where you can see accounts alongside their customer information. - - While you could create one big table with all the above information, it's recommended that you create separate tables and join them. With this setup, you would only need to update data in one place. - -3. [Update](../update.html) Carl's address: - - {% include copy-clipboard.html %} - ~~~ sql - > UPDATE bank.customers - SET address = '4 Privet Drive, Little Whinging, England' - WHERE customer_id = 2; - ~~~ - -4. With the join, the address is updated on both accounts: - - {% include copy-clipboard.html %} - ~~~ sql - > SELECT * FROM bank.customers NATURAL JOIN bank.accounts; - ~~~ - - ~~~ - customer_id | name | address | type | balance - +-------------+-------+------------------------------------------------+----------+----------+ - 2 | Carl | 4 Privet Drive, Little Whinging, England | checking | 250.00 - 2 | Carl | 4 Privet Drive, Little Whinging, England | savings | 314.15 - 4 | Ernie | 1600 Pennsylvania Ave NW, Washington, DC 20500 | savings | 42000.00 - (3 rows) - ~~~ - - If you only had one big table, you'd have to remember to update Carl's address on every account, and the multiple copies would likely get out of sync. - - {{site.data.alerts.callout_info}} - Designing a schema so that there is exactly one copy of each piece of data is called **normalization**, and is a key concept in relational databases. - {{site.data.alerts.end}} - -## Step 6. Transactions - -Suppose Carl wants to withdraw $250 from his checking account. First, check that he has $250 in his account with one query, then perform the withdrawal in another. - -Here's how that would look (do not run this example yet): - -~~~ sql -> SELECT balance >= 250 FROM bank.accounts WHERE type = 'checking' AND customer_id = 2; - - balance >= 250 -+----------------+ - true -(1 row) - --- If false, quit. Otherwise, continue. - -> UPDATE bank.accounts SET balance = balance - 250 WHERE type = 'checking' AND customer_id = 2; -~~~ - -This would work most of the time, but there's a security flaw. Suppose Carl issues two transfer requests for $250 at the exact same time; let's call them transfer A and transfer B. - -First, transfer A checks to see if there's at least $250 in Carl's checking account. There is, so it proceeds with the transfer. But before transfer A can deduct the $250 from his account, transfer B checks to see if there's $250 in the account. Transfer A hasn't deducted the money yet, so transfer B sees enough money and decides to proceed, too. When the two transfers complete, Carl will have withdrawn $250 that wasn't in his account, and the bank will have to cover the loss. - -This issue can be solved by using a [transaction](../transactions.html). If two transactions attempt to modify the same data at the same time, one of the transactions will get canceled. - -Using transactions is as simple as issuing a [`BEGIN` statement](../begin-transaction.html) to start a transaction and a [`COMMIT` statement](../commit-transaction.html) to finish it. You can also [`ROLLBACK` a transaction](../rollback-transaction.html) midway if, for example, you discover that the transfer has insufficient funds. - -Here's the above example in a transaction. Again, do not run this example yet. - -~~~ sql -> BEGIN; --- Now adding input for a multi-line SQL transaction client-side. --- Press Enter two times to send the SQL text collected so far to the server, or Ctrl+C to cancel. --- You can also use \show to display the statements entered so far. - -> SELECT balance >= 250 FROM bank.accounts WHERE type = 'checking' AND customer_id = 2; - -> -- press Enter again - - balance >= 250 -+----------------+ - true -(1 row) - --- If false, issue a ROLLBACK statement. Otherwise, continue. - -OPEN> UPDATE bank.accounts SET balance = balance - 250 WHERE type = 'checking' AND customer_id = 2; -UPDATE 1; -OPEN> COMMIT; -COMMIT -~~~ - -Now try running two copies of the above transaction in parallel: - -1. In the SQL shell, run: - - {% include copy-clipboard.html %} - ~~~ sql - > BEGIN; - ~~~ - - {% include copy-clipboard.html %} - ~~~ sql - > SELECT balance >= 250 FROM bank.accounts WHERE type = 'checking' AND customer_id = 2; - ~~~ - -2. Press enter. - -3. Open a new terminal, start a second SQL shell, and run the same: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql --insecure - ~~~ - - {% include copy-clipboard.html %} - ~~~ sql - > BEGIN; - ~~~ - - {% include copy-clipboard.html %} - ~~~ sql - > SELECT balance >= 250 FROM bank.accounts WHERE type = 'checking' AND customer_id = 2; - ~~~ - -4. Press enter a second time to send the SQL statement to the server. - -5. Run: - - {% include copy-clipboard.html %} - ~~~ sql - > UPDATE bank.accounts SET balance = balance - 250 WHERE type = 'checking' AND customer_id = 2; - ~~~ -6. Press enter a second time to send the SQL statement to the server. - -7. Commit the transaction: - - {% include copy-clipboard.html %} - ~~~ sql - > COMMIT; - ~~~ - -8. Back in the first SQL shell, run: - - {% include copy-clipboard.html %} - ~~~ sql - > UPDATE bank.accounts SET balance = balance - 250 WHERE type = 'checking' AND customer_id = 2; - ~~~ - -9. Press enter a second time to send the SQL statement to the server. - -10. Commit the transaction: - - {% include copy-clipboard.html %} - ~~~ sql - > COMMIT; - ~~~ - -When you reach the `COMMIT` statement, you'll see one transaction fail with an error like this: - -~~~ -pq: restart transaction: HandledRetryableTxnError: TransactionRetryError: retry txn (RETRY_WRITE_TOO_OLD) -~~~ - -CockroachDB detected that the two transactions are attempting conflicting withdrawals and canceled one of them. - -{{site.data.alerts.callout_info}} -Any number of `SELECT`, `INSERT`, `UPDATE`, and `DELETE` queries can be placed in a transaction. This is what makes traditional SQL databases so powerful. -{{site.data.alerts.end}} - -## Step 7. Aggregations - -`SELECT` statements aren't limited to combining data from different tables. They can also combine data in the same table using **aggregations**. - -1. Add all of the balances in the `accounts` table: - - {% include copy-clipboard.html %} - ~~~ sql - > SELECT SUM(balance) FROM bank.accounts; - ~~~ - - ~~~ - sum - +----------+ - 42314.15 - (1 row) - ~~~ - -2. View the balance grouped by account type: - - {% include copy-clipboard.html %} - ~~~ sql - > SELECT type, SUM(balance) FROM bank.accounts GROUP BY type; - ~~~ - - ~~~ - type | sum - +----------+----------+ - checking | 250.00 - savings | 42064.15 - (2 rows) - ~~~ - -Joins and aggregations can be combined and nested to express nearly any query. - -## What's Next? - -- [Users and Privileges](users-and-privileges.html) diff --git a/src/archived/training/under-replication-troubleshooting.md b/src/archived/training/under-replication-troubleshooting.md deleted file mode 100644 index 192f664d84f..00000000000 --- a/src/archived/training/under-replication-troubleshooting.md +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: Under-Replication Troubleshooting -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false - ---- - - - - - -## Before you begin - -In this lab, you'll start with a fresh cluster, so make sure you've stopped and cleaned up the cluster from the previous labs. - -## Step 1. Start a 3-node cluster - -1. In a new terminal, start node 1: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node1 \ - --listen-addr=localhost:26257 \ - --http-addr=localhost:8080 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~~ - -2. In another terminal, start node 2: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node2 \ - --listen-addr=localhost:26258 \ - --http-addr=localhost:8081 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~ - -3. In another terminal, start node 3: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~ - -4. In another terminal, perform a one-time initialization of the cluster: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach init --insecure --host=localhost:26257 - ~~~ - -## Step 2. Simulate the problem - -1. In the same terminal, reduce the amount of time the cluster waits before considering a node dead to just 1 minute and 15 seconds: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SET CLUSTER SETTING server.time_until_store_dead = '1m15s';" - ~~~ - -2. In the terminal where node 3 is running, press **CTRL-C** to stop the node. - -## Step 3. Troubleshoot the problem - -1. Open the Admin UI at http://localhost:8080 and click **Metrics** on the left. - -2. In the upper right you'll see the **Replication Status** widget: - - CockroachDB Admin UI - - You'll see that there are 24 ranges total, and 24 ranges are under-replicated, which means that every range in the cluster is missing 1 of 3 replicas. This is a vulnerable state because, if another node were to go offline, all ranges would lose consensus, and the entire cluster would become unavailable. - -## Step 4. Resolve the problem - -To bring the cluster back to a safe state, you need to either restart the down node or add a new node. - -1. In the terminal where node 3 was running, restart the node: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach start \ - --insecure \ - --store=node3 \ - --listen-addr=localhost:26259 \ - --http-addr=localhost:8082 \ - --join=localhost:26257,localhost:26258,localhost:26259 - ~~~ - -3. Soon, you'll see that there are no longer any under-replicated ranges. - -## What's next? - -[Cluster Unavailability Troubleshooting](cluster-unavailability-troubleshooting.html) diff --git a/src/archived/training/users-and-privileges.md b/src/archived/training/users-and-privileges.md deleted file mode 100644 index 5cd0730ec84..00000000000 --- a/src/archived/training/users-and-privileges.md +++ /dev/null @@ -1,320 +0,0 @@ ---- -title: Users and Privileges -toc: true -toc_not_nested: true -sidebar_data: sidebar-data-training.json -block_search: false - ---- - - - - - -## Before you begin - -1. Make sure you have already completed [SQL Basics](sql-basics.html). - -2. Use the `cockroach gen` command to generate an example `startrek` database with 2 tables, `episodes` and `quotes`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach gen example-data startrek | cockroach sql \ - --insecure \ - --host=localhost:26257 - ~~~ - -## Step 1. Check initial privileges - -Initially, no users other than `root` have privileges, and root has `ALL` privileges on everything in the cluster. - -1. Check the privileges on the `startrek` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SHOW GRANTS ON DATABASE startrek;" - ~~~ - - You'll see that only the `root` user (and `admin` role to which `root` belongs) has access to the database: - - ~~~ - database_name | schema_name | grantee | privilege_type - +---------------+--------------------+---------+----------------+ - startrek | crdb_internal | admin | ALL - startrek | crdb_internal | root | ALL - startrek | information_schema | admin | ALL - startrek | information_schema | root | ALL - startrek | pg_catalog | admin | ALL - startrek | pg_catalog | root | ALL - startrek | public | admin | ALL - startrek | public | root | ALL - (8 rows) - ~~~ - -2. Check the privileges on the tables inside in the `startrek` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SHOW GRANTS ON startrek.episodes, startrek.quotes;" - ~~~ - - Again, you'll see that only the `root` user (and `admin` role to which `root` belongs) has access to the database: - - ~~~ - database_name | schema_name | table_name | grantee | privilege_type - +---------------+-------------+------------+---------+----------------+ - startrek | public | episodes | admin | ALL - startrek | public | episodes | root | ALL - startrek | public | quotes | admin | ALL - startrek | public | quotes | root | ALL - (4 rows) - ~~~ - -## Step 2. Create a user - -1. Create a new user, `spock`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --certs-dir=certs \ - --host=localhost:26257 \ - --execute="CREATE USER spock;" - ~~~ - -2. Try to read from a table in the `startrek` database as `spock`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --user=spock \ - --database=startrek \ - --execute="SELECT count(*) FROM episodes;" - ~~~ - - Initially, `spock` has no privileges, so the query fails: - - ~~~ - Error: pq: user spock does not have SELECT privilege on relation episodes - Failed running "sql" - ~~~ - -## Step 3. Grant privileges to the user - -1. As the `root` user, grant `spock` the `SELECT` privilege on all tables in the `startrek` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="GRANT SELECT ON TABLE startrek.* TO spock;" - ~~~ - -2. As the `root` user, grant `spock` the `INSERT` privilege on just the `startrek.quotes` table: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="GRANT INSERT ON TABLE startrek.quotes TO spock;" - ~~~ - -3. As the `root` user, show the privileges granted on tables in the `startrek` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SHOW GRANTS ON TABLE startrek.quotes, startrek.episodes;" - ~~~ - - ~~~ - database_name | schema_name | table_name | grantee | privilege_type - +---------------+-------------+------------+---------+----------------+ - startrek | public | episodes | admin | ALL - startrek | public | episodes | root | ALL - startrek | public | episodes | spock | SELECT - startrek | public | quotes | admin | ALL - startrek | public | quotes | root | ALL - startrek | public | quotes | spock | INSERT - startrek | public | quotes | spock | SELECT - (7 rows) - ~~~ - -## Step 4. Connect as the user - -1. As the `spock` user, read from the tables in the `startrek` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --user=spock \ - --execute="SELECT count(*) FROM startrek.quotes;" \ - --execute="SELECT count(*) FROM startrek.episodes;" - ~~~ - - Because `spock` has the `SELECT` privilege on the tables, the query succeeds: - - ~~~ - count - +-------+ - 200 - (1 row) - count - +-------+ - 79 - (1 row) - ~~~ - -2. As the `spock` user, insert a row into the `startrek.quotes` table: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --user=spock \ - --execute="INSERT INTO startrek.quotes VALUES ('Blah blah', 'Spock', NULL, 52);" - ~~~ - - Because `spock` has the `INSERT` privilege on the table, the query succeeds: - - ~~~ - INSERT 1 - ~~~ - -3. As the `spock` user, try to insert a row into the `startrek.episodes` table: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --user=spock \ - --execute="INSERT INTO startrek.episodes VALUES (80, 3, 25, 'The Episode That Never Was', 5951.5);" - ~~~ - - Because `spock` does not have the `INSERT` privilege on the table, the query fails: - - ~~~ - Error: pq: user spock does not have INSERT privilege on relation episodes - Failed running "sql" - ~~~ - -## Step 5. Revoke privileges from the user - -1. As the `root` user, show the privileges granted on tables in the `startrek` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SHOW GRANTS ON TABLE startrek.quotes, startrek.episodes;" - ~~~ - - ~~~ - database_name | schema_name | table_name | grantee | privilege_type - +---------------+-------------+------------+---------+----------------+ - startrek | public | episodes | admin | ALL - startrek | public | episodes | root | ALL - startrek | public | episodes | spock | SELECT - startrek | public | quotes | admin | ALL - startrek | public | quotes | root | ALL - startrek | public | quotes | spock | INSERT - startrek | public | quotes | spock | SELECT - (7 rows) - ~~~ - -2. As the `root` user, revoke the `SELECT` privilege on the `startrek.episodes` table from `spock`: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="REVOKE SELECT ON TABLE startrek.episodes FROM spock;" - ~~~ - -3. As the `root` user, again show the privileges granted on tables in the `startrek` database: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --execute="SHOW GRANTS ON TABLE startrek.quotes, startrek.episodes;" - ~~~ - - Note that `spock` no longer has the `SELECT` privilege on the `episodes` table. - - ~~~ - database_name | schema_name | table_name | grantee | privilege_type - +---------------+-------------+------------+---------+----------------+ - startrek | public | episodes | admin | ALL - startrek | public | episodes | root | ALL - startrek | public | quotes | admin | ALL - startrek | public | quotes | root | ALL - startrek | public | quotes | spock | INSERT - startrek | public | quotes | spock | SELECT - (6 rows) - ~~~ - -4. Now as the `spock` user, try to read from the `startrek.episodes` table: - - {% include copy-clipboard.html %} - ~~~ shell - $ cockroach sql \ - --insecure \ - --host=localhost:26257 \ - --user=spock \ - --execute="SELECT count(*) FROM startrek.episodes;" - ~~~ - - Because `spock` no longer has the `SELECT` privilege on the table, the query fails: - - ~~~ - Error: pq: user spock does not have SELECT privilege on relation episodes - Failed running "sql" - ~~~ - -## Step 6. Clean up - -In the next module, you'll start with a fresh cluster, so take a moment to clean things up. - -1. Stop all CockroachDB nodes: - - {% include copy-clipboard.html %} - ~~~ shell - $ pkill -9 cockroach - ~~~ - - This simplified shutdown process is only appropriate for a lab/evaluation scenario. - -2. Remove the nodes' data directories: - - {% include copy-clipboard.html %} - ~~~ shell - $ rm -rf node1 node2 node3 - ~~~ - -## What's next? - -[Security](security.html) diff --git a/src/archived/training/why-cockroachdb.md b/src/archived/training/why-cockroachdb.md deleted file mode 100644 index 58dad1059af..00000000000 --- a/src/archived/training/why-cockroachdb.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Why CockroachDB? -toc: false -sidebar_data: sidebar-data-training.json - ---- - -Kick off your training by watching Alex Robinson, a CockroachDB Engineer, explain the history of databases and why CockroachDB was built. You can also read through a related set of slides. - -
    - - -
    -

    - -
    - - - -
    - -
    - - - -
    - -## What's next? - -[Architecture Overview](architecture-overview.html) From d4655fb67bfb5589659885042d0a1ccec9513332 Mon Sep 17 00:00:00 2001 From: "Matt Linville (he/him)" Date: Fri, 3 May 2024 10:30:00 -0700 Subject: [PATCH 14/25] Use the new download table include for 23.1.20 (#18520) --- src/current/_includes/releases/v23.1/v23.1.20.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/current/_includes/releases/v23.1/v23.1.20.md b/src/current/_includes/releases/v23.1/v23.1.20.md index 48a4ab3ceb3..770b9a3bd46 100644 --- a/src/current/_includes/releases/v23.1/v23.1.20.md +++ b/src/current/_includes/releases/v23.1/v23.1.20.md @@ -2,7 +2,7 @@ Release Date: May 1, 2024 -{% include releases/release-downloads-docker-image.md release=include.release %} +{% include releases/new-release-downloads-docker-image.md release=include.release %}

    SQL language changes

    From d35a7a156f8f8ee3fc6879afd3a0f09be202a71f Mon Sep 17 00:00:00 2001 From: "Matt Linville (he/him)" Date: Fri, 3 May 2024 17:19:36 -0700 Subject: [PATCH 15/25] [DOC-10213] Updates to Dedicated on Azure limitations page (#18515) * [DOC-10213] Updates to Dedicated on Azure limitations page --- .../cockroachdb-dedicated-on-azure.md | 56 +++++-------------- 1 file changed, 14 insertions(+), 42 deletions(-) diff --git a/src/current/cockroachcloud/cockroachdb-dedicated-on-azure.md b/src/current/cockroachcloud/cockroachdb-dedicated-on-azure.md index 0bf8f3a16c3..916e6ef5eb1 100644 --- a/src/current/cockroachcloud/cockroachdb-dedicated-on-azure.md +++ b/src/current/cockroachcloud/cockroachdb-dedicated-on-azure.md @@ -12,14 +12,9 @@ This page provides information about CockroachDB {{ site.data.products.dedicated CockroachDB {{ site.data.products.dedicated }} clusters on Azure have the following temporary limitations. To express interest or request more information about a given limitation, contact your Cockroach Labs account team. For more details, refer to the [FAQs](#faqs). -### Regions - -For the list of supported Azure regions, refer to [Azure Regions]({% link cockroachcloud/regions.md %}?filters=dedicated#azure-regions). - ### Editing and scaling - A cluster must have at minimum three nodes. A multi-region cluster must have at minimum three nodes per region. Single-node clusters are not supported. -- To add or remove regions from a cluster on Azure, you must use the CockroachDB {{ site.data.products.cloud }} API. Refer to [Scale, edit or upgrade a cluster](https://www.cockroachlabs.com/docs/api/cloud/v1#patch-/api/v1/clusters/-cluster_id-). - After it is created, a cluster's storage can be increased in place, but cannot subsequently be decreased or removed. ### Networking @@ -28,7 +23,6 @@ For the list of supported Azure regions, refer to [Azure Regions]({% link cockro ### Observability -- Exporting metrics to [Datadog](https://www.datadoghq.com/) is available. Enable the Datadog integration in the [CockroachDB {{ site.data.products.cloud }} Console]({% link cockroachcloud/tools-page.md %}#monitor-cockroachdb-dedicated-with-datadog) or with the [Cloud API]({% link cockroachcloud/export-metrics.md %}?filters=datadog-metrics-export). - Exporting metrics to Azure Monitor is not yet available. To express interest, contact your Cockroach Labs account team. - [Log Export]({% link cockroachcloud/export-logs.md %}) is not yet available. @@ -44,21 +38,17 @@ For the list of supported Azure regions, refer to [Azure Regions]({% link cockro The following sections provide more details about CockroachDB {{ site.data.products.dedicated }} on Azure. -### Are multi-region clusters supported? - -Yes. - ### Can CockroachDB {{ site.data.products.serverless }} clusters be deployed on Azure? CockroachDB {{ site.data.products.serverless }} is not currently available on Azure. -### Are horizontal and vertical scaling supported? +### Can we use {{ site.data.products.db }} credits to pay for clusters on Azure? -Yes. Refer to [Cluster Management]({% link cockroachcloud/cluster-management.md %}). +Yes, a CockroachDB {{ site.data.products.cloud }} organization can pay for the usage of CockroachDB {{ site.data.products.dedicated }} clusters on Azure with {{ site.data.products.db }} credits. To add additional credits to your CockroachDB {{ site.data.products.cloud }} organization, contact your Cockroach Labs account team. -### What Azure regions can we choose? +### Can we migrate from PostgreSQL to CockroachDB {{ site.data.products.dedicated }} on Azure? -Refer to [Azure Regions]({% link cockroachcloud/regions.md %}?filters=dedicated#azure-regions). +CockroachDB supports the [PostgreSQL wire protocol](https://www.postgresql.org/docs/current/protocol.html) and the majority of PostgreSQL syntax. Refer to [Supported SQL Feature Support](https://www.cockroachlabs.com/docs/{{ site.current_cloud_version }}/sql-feature-support). The same CockroachDB binaries are used across CockroachDB {{ site.data.products.cloud }} deployment environments, and all SQL features behave the same on Azure as on GCP or AWS. ### What kind of compute and storage resources are used? @@ -66,54 +56,36 @@ Refer to [Azure Regions]({% link cockroachcloud/regions.md %}?filters=dedicated# CockroachDB {{ site.data.products.dedicated }} clusters can be created with a minimum of 4 vcPUs per node on Azure. -### Can we use {{ site.data.products.db }} credits to pay for clusters on Azure? - -Yes, existing CockroachDB {{ site.data.products.cloud }} customers can pay for the usage of CockroachDB {{ site.data.products.dedicated }} clusters on Azure with their available credits. To add additional credits to your CockroachDB {{ site.data.products.cloud }} organization, contact your Cockroach Labs account team. - ### What backup and restore options are available for clusters on Azure? [Managed-service backups]({% link cockroachcloud/use-managed-service-backups.md %}?filters=dedicated) automatically back up clusters on Azure, and customers can [take and restore from manual backups to Azure storage]({% link cockroachcloud/take-and-restore-customer-owned-backups.md %}) ([Blob Storage](https://azure.microsoft.com/products/storage/blobs) or [ADLS Gen 2](https://learn.microsoft.com/azure/storage/blobs/data-lake-storage-introduction)). Refer to the blog post [CockroachDB locality-aware Backups for Azure Blob](https://www.cockroachlabs.com/blog/locality-aware-backups-azure-blob/) for an example. -### Is it possible to take encrypted backups? - -Yes, customers can [take and restore from encrypted backups]({% link cockroachcloud/take-and-restore-customer-owned-backups.md %}) on Azure storage by using an RSA key stored in [Azure Key Vault](https://learn.microsoft.com/azure/key-vault/keys/about-keys). +You can [take and restore from encrypted backups]({% link cockroachcloud/take-and-restore-customer-owned-backups.md %}) on Azure storage by using an RSA key stored in [Azure Key Vault](https://learn.microsoft.com/azure/key-vault/keys/about-keys). ### Are changefeeds available? Yes, customers can create and configure [changefeeds](https://www.cockroachlabs.com/docs/{{ site.current_cloud_version }}/changefeed-messages) to send data events in real-time from a CockroachDB {{ site.data.products.dedicated }} cluster to a [downstream sink](https://www.cockroachlabs.com/docs/{{ site.current_cloud_version }}/changefeed-sinks.html) such as Kafka, Azure storage, or Webhook. [Azure Event Hubs](https://learn.microsoft.com/azure/event-hubs/azure-event-hubs-kafka-overview) provides an Azure-native service that can be used with a Kafka endpoint as a sink. -### Can we export logs and metrics from a cluster on Azure to Azure Monitor or a third-party observability service? - -Exporting metrics to Datadog is supported. Refer to [Export Metrics From a CockroachDB {{ site.data.products.dedicated }} Cluster]({% link cockroachcloud/export-metrics.md %}). It’s not yet possible to export cluster logs or metrics to Azure Monitor or to another third-party observability service. To express interest in this feature, contact your Cockroach Labs account team. +### What secure and centralized authentication methods are available for {{ site.data.products.dedicated }} clusters on Azure? -### Are CockroachDB user-defined functions available for clusters on Azure? +Human users can connect using [Cluster SSO]({% link cockroachcloud/cloud-sso-sql.md %}), [client certificates](https://www.cockroachlabs.com/docs/{{ site.current_cloud_version }}/authentication.html#using-digital-certificates-with-cockroachdb), or the [`ccloud` command]({% link cockroachcloud/ccloud-get-started.md %}) or SQL clients. -Yes, [user-defined functions](https://www.cockroachlabs.com/docs/{{ site.current_cloud_version }}/user-defined-functions) are supported for CockroachDB {{ site.data.products.dedicated }} clusters on Azure. The same CockroachDB binaries are used across CockroachDB {{ site.data.products.cloud }} deployment environments, and all SQL features behave the same on Azure as on GCP or AWS. +Application users can connect using [JWT tokens](https://www.cockroachlabs.com/docs/{{ site.current_cloud_version }}/sso-sql) or [client certificates](https://www.cockroachlabs.com/docs/{{ site.current_cloud_version }}/authentication.html#using-digital-certificates-with-cockroachdb). -### Can we migrate from PostgreSQL to CockroachDB {{ site.data.products.dedicated }} on Azure? +### Can we use private connectivity methods, such as Private Link, to securely connect to a cluster on Azure? -CockroachDB supports the [PostgreSQL wire protocol](https://www.postgresql.org/docs/current/protocol.html) and the majority of PostgreSQL syntax. Refer to [Supported SQL Feature Support](https://www.cockroachlabs.com/docs/{{ site.current_cloud_version }}/sql-feature-support). The same CockroachDB binaries are used across CockroachDB {{ site.data.products.cloud }} deployment environments, and all SQL features behave the same on Azure as on GCP or AWS. +You can configure IP allowlisting to limit the IP addresses or CIDR ranges that can access a CockroachDB {{ site.data.products.dedicated }} cluster on Azure. [Azure Private Link](https://learn.microsoft.com/azure/private-link/private-link-overview) is not yet available. To express interest, contact your Cockroach Labs account team. ### How are clusters on Azure isolated from each other? Do they follow a similar approach as on AWS and GCP? CockroachDB {{ site.data.products.cloud }} follows a similar tenant isolation approach on Azure as on GCP and AWS. Each {{ site.data.products.dedicated }} cluster is created on an [AKS cluster](https://azure.microsoft.com/products/kubernetes-service) in a unique [VNet](https://learn.microsoft.com/azure/virtual-network/virtual-networks-overview). Implementation details are subject to change. -### Can we use Single-Sign On to sign-in to {{ site.data.products.db }} and manage clusters on Azure? - -Yes, [Cloud Organization SSO]({% link cockroachcloud/cloud-org-sso.md %}) is supported. This feature is unrelated to the cluster's deployment environment. - -### What secure and centralized authentication methods are available for {{ site.data.products.dedicated }} clusters on Azure? - -Human users can connect using [Cluster SSO]({% link cockroachcloud/cloud-sso-sql.md %}), [client certificates](https://www.cockroachlabs.com/docs/{{ site.current_cloud_version }}/authentication.html#using-digital-certificates-with-cockroachdb), or the [`ccloud` command]({% link cockroachcloud/ccloud-get-started.md %}) or SQL clients. - -Application users can connect using [JWT tokens](https://www.cockroachlabs.com/docs/{{ site.current_cloud_version }}/sso-sql) or [client certificates](https://www.cockroachlabs.com/docs/{{ site.current_cloud_version }}/authentication.html#using-digital-certificates-with-cockroachdb). - ### How is data encrypted at rest in a cluster on Azure? -Customer data at rest on cluster disks is encrypted using [server-side encryption of Azure disk storage](https://learn.microsoft.com/azure/virtual-machines/disk-encryption). CockroachDB’s [file-based encryption at rest](https://www.cockroachlabs.com/docs/{{ site.current_cloud_version }}/security-reference/encryption#cockroachdb-self-hosted-clusters) and [Customer-Managed Encryption Keys (CMEK)]({% link cockroachcloud/cmek.md %}) are not yet available. To express interest, contact your Cockroach Labs account team. +Customer data at rest on cluster disks is encrypted using [server-side encryption of Azure disk storage](https://learn.microsoft.com/azure/virtual-machines/disk-encryption). [Customer-Managed Encryption Keys (CMEK)]({% link cockroachcloud/cmek.md %}) are not yet available. To express interest, contact your Cockroach Labs account team. -All client connections to a CockroachDB {{ site.data.products.dedicated }} cluster on Azure, as well as connections between nodes, are encrypted using TLS. +All client connections to a CockroachDB {{ site.data.products.dedicated }} cluster, as well as connections between nodes, are encrypted using TLS. -### Can we use private connectivity methods, such as Private Link, to securely connect to a cluster on Azure? +### Do CockroachDB {{ site.data.products.dedicated }} clusters on Azure comply with SOC 2? -You can configure IP allowlisting to limit the IP addresses or CIDR ranges that can access a CockroachDB {{ site.data.products.dedicated }} cluster on Azure. [Azure Private Link](https://learn.microsoft.com/azure/private-link/private-link-overview) is not yet available. To express interest, contact your Cockroach Labs account team. +CockroachDB Dedicated on Azure meets or exceeds the requirements of SOC 2 Type 2. Refer to [Regulatory Compliance in CockroachDB {{ site.data.products.dedicated }}]({% link cockroachcloud/compliance.md %}). From c717ba8f44c47c2b603228b19302446321be2dfa Mon Sep 17 00:00:00 2001 From: Kathryn Hancox <44557882+kathancox@users.noreply.github.com> Date: Mon, 6 May 2024 12:18:16 -0400 Subject: [PATCH 16/25] Add docs for fast cutback in v24.1 physical cluster replication (#18506) --- .../releases/v24.1/v24.1.0-alpha.1.md | 1 - .../alter-virtual-cluster-diagram.html | 576 +++++++++++------- .../fast-cutback-syntax.md | 8 + src/current/v24.1/alter-virtual-cluster.md | 12 +- src/current/v24.1/cutover-replication.md | 116 +++- ...-cluster-replication-technical-overview.md | 3 +- 6 files changed, 493 insertions(+), 223 deletions(-) create mode 100644 src/current/_includes/v24.1/physical-replication/fast-cutback-syntax.md diff --git a/src/current/_includes/releases/v24.1/v24.1.0-alpha.1.md b/src/current/_includes/releases/v24.1/v24.1.0-alpha.1.md index ee2f25d8dab..eeed1ab4764 100644 --- a/src/current/_includes/releases/v24.1/v24.1.0-alpha.1.md +++ b/src/current/_includes/releases/v24.1/v24.1.0-alpha.1.md @@ -13,7 +13,6 @@ Release Date: March 7, 2024 - [`ALTER CHANGEFEED`]({% link v23.2/alter-changefeed.md %}) no longer removes a [CDC query]({% link v23.2/cdc-queries.md %}) when modifying changefeed properties. [#116498][#116498] - `changefeed.balance_range_distribution.enable` is now deprecated. Instead, use the new [cluster setting]({% link v23.2/cluster-settings.md %}) `changefeed.default_range_distribution_strategy`. `changefeed.default_range_distribution_strategy='balanced_simple'` has the same effect as setting `changefeed.balance_range_distribution.enable=true`. It does not require `initial_scan='only'`, which was required by the old setting. [#115166][#115166] - CDC queries now correctly handle the [`changefeed_creation_timestamp`]({% link v23.2/cdc-queries.md %}#cdc-query-function-support) function. [#117520][#117520] -- The new `WITH PRIOR REPLICATION DETAILS` option can now be passed when inspecting a virtual cluster with [`SHOW VIRTUAL CLUSTER`]({% link v23.2/show-virtual-cluster.md %}). This will request additional details about where the virtual cluster was replicated **from** and when it was activated, if that virtual cluster was created via replication. [#117636][#117636] - The new syntax `ALTER VIRTUAL CLUSTER virtual-cluster START REPLICATION OF virtual-cluster ON physical-cluster` can now be used to reconfigure virtual clusters previously serving as sources for [physical cluster replication]({% link v23.2/physical-cluster-replication-overview.md %}) to become standbys to a promoted standby. This reverses the direction of replication while maximizing data reuse. [#117656][#117656] - [`BACKUP`]({% link v23.2/backup.md %})s now load range information that is used to avoid a spike in metadata lookups when backups begin. [#116520][#116520] - Clusters created to run [physical cluster replication]({% link v23.2/physical-cluster-replication-overview.md %}) no longer automatically disable the [`spanconfig.range_coalescing.system.enabled`]({% link v23.2/cluster-settings.md %}#setting-spanconfig-storage-coalesce-adjacent-enabled) and [`spanconfig.range_coalescing.application.enabled`]({% link v23.2/cluster-settings.md %}#setting-spanconfig-tenant-coalesce-adjacent-enabled) cluster settings. Users who started using physical cluster replication on v23.1 or v23.2 may wish to manually reset these settings. [#119221][#119221] diff --git a/src/current/_includes/v24.1/physical-replication/alter-virtual-cluster-diagram.html b/src/current/_includes/v24.1/physical-replication/alter-virtual-cluster-diagram.html index d0444ee3525..c5400f6e9ed 100644 --- a/src/current/_includes/v24.1/physical-replication/alter-virtual-cluster-diagram.html +++ b/src/current/_includes/v24.1/physical-replication/alter-virtual-cluster-diagram.html @@ -1,273 +1,431 @@
    - + + y="1" + width="62" + height="32" + class="terminal" + rx="10"/> ALTER + y="1" + width="80" + height="32" + class="terminal" + rx="10"/> VIRTUAL + y="1" + width="82" + height="32" + class="terminal" + rx="10"/> CLUSTER - virtual_cluster_spec + y="67" + width="64" + height="32" + class="terminal" + rx="10"/> PAUSE + y="111" + width="76" + height="32" + class="terminal" + rx="10"/> RESUME + y="67" + width="114" + height="32" + class="terminal" + rx="10"/> REPLICATION + y="155" + width="92" + height="32" + class="terminal" + rx="10"/> COMPLETE + y="155" + width="114" + height="32" + class="terminal" + rx="10"/> REPLICATION + y="155" + width="38" + height="32" + class="terminal" + rx="10"/> TO + y="155" + width="74" + height="32" + class="terminal" + rx="10"/> SYSTEM + y="155" + width="54" + height="32" + class="terminal" + rx="10"/> TIME - timestamp + y="199" + width="70" + height="32" + class="terminal" + rx="10"/> LATEST + y="287" + width="44" + height="32" + class="terminal" + rx="10"/> SET + y="287" + width="114" + height="32" + class="terminal" + rx="10"/> REPLICATION - - - RETENTION - - - = - - - - duration + + + RETENTION + + + EXPIRATION + + + WINDOW + + + = + + + duration - - - , - - - GRANT - - - REVOKE - - - CAPABILITY - - - - virtual_cluster_capability_list - - - - ALL - + - CAPABILITIES - + y="243" + width="24" + height="32" + class="terminal" + rx="10"/> + , + - RENAME - - - TO - - - - virtual_cluster_spec + y="419" + width="64" + height="32" + class="terminal" + rx="10"/> + START + + + REPLICATION + + + OF + + + virtual_cluster_spec + + + + ON + + + physical_cluster + + + + WITH + + + RETENTION + + + EXPIRATION + + + WINDOW + + + = + + + duration + + + + , + + + OPTIONS + + + ( + + + RETENTION + + + EXPIRATION + + + WINDOW + + + = + + + duration - + + + , + + + ) + + + SERVICE + + + SHARED + - START - - - SERVICE - - - SHARED - + y="705" + width="76" + height="32" + class="terminal" + rx="10"/> + RENAME + + + TO + + + virtual_cluster_spec + + - STOP - + y="749" + width="56" + height="32" + class="terminal" + rx="10"/> + STOP + - SERVICE + y="749" + width="78" + height="32" + class="terminal" + rx="10"/> + SERVICE + + + GRANT + + + REVOKE + + + ALL + + + CAPABILITIES + + + CAPABILITY + + + virtual_cluster_capability_list + - - + d="m19 17 h2 m0 0 h10 m62 0 h10 m0 0 h10 m80 0 h10 m0 0 h10 m82 0 h10 m0 0 h10 m148 0 h10 m2 0 l2 0 m2 0 l2 0 m2 0 l2 0 m-484 66 l2 0 m2 0 l2 0 m2 0 l2 0 m42 0 h10 m64 0 h10 m0 0 h12 m-116 0 h20 m96 0 h20 m-136 0 q10 0 10 10 m116 0 q0 -10 10 -10 m-126 10 v24 m116 0 v-24 m-116 24 q0 10 10 10 m96 0 q10 0 10 -10 m-106 10 h10 m76 0 h10 m20 -44 h10 m114 0 h10 m0 0 h1224 m-1514 0 h20 m1494 0 h20 m-1534 0 q10 0 10 10 m1514 0 q0 -10 10 -10 m-1524 10 v68 m1514 0 v-68 m-1514 68 q0 10 10 10 m1494 0 q10 0 10 -10 m-1504 10 h10 m92 0 h10 m0 0 h10 m114 0 h10 m0 0 h10 m38 0 h10 m20 0 h10 m74 0 h10 m0 0 h10 m54 0 h10 m0 0 h10 m88 0 h10 m-296 0 h20 m276 0 h20 m-316 0 q10 0 10 10 m296 0 q0 -10 10 -10 m-306 10 v24 m296 0 v-24 m-296 24 q0 10 10 10 m276 0 q10 0 10 -10 m-286 10 h10 m70 0 h10 m0 0 h186 m20 -44 h874 m-1504 -10 v20 m1514 0 v-20 m-1514 20 v112 m1514 0 v-112 m-1514 112 q0 10 10 10 m1494 0 q10 0 10 -10 m-1504 10 h10 m44 0 h10 m0 0 h10 m114 0 h10 m40 0 h10 m100 0 h10 m0 0 h112 m-252 0 h20 m232 0 h20 m-272 0 q10 0 10 10 m252 0 q0 -10 10 -10 m-262 10 v24 m252 0 v-24 m-252 24 q0 10 10 10 m232 0 q10 0 10 -10 m-242 10 h10 m106 0 h10 m0 0 h10 m86 0 h10 m20 -44 h10 m30 0 h10 m0 0 h10 m72 0 h10 m-434 0 l20 0 m-1 0 q-9 0 -9 -10 l0 -24 q0 -10 10 -10 m414 44 l20 0 m-20 0 q10 0 10 -10 l0 -24 q0 -10 -10 -10 m-414 0 h10 m24 0 h10 m0 0 h370 m20 44 h842 m-1504 -10 v20 m1514 0 v-20 m-1514 20 v112 m1514 0 v-112 m-1514 112 q0 10 10 10 m1494 0 q10 0 10 -10 m-1504 10 h10 m64 0 h10 m20 0 h10 m114 0 h10 m0 0 h10 m38 0 h10 m0 0 h10 m148 0 h10 m0 0 h10 m40 0 h10 m0 0 h10 m122 0 h10 m20 0 h10 m58 0 h10 m60 0 h10 m100 0 h10 m0 0 h112 m-252 0 h20 m232 0 h20 m-272 0 q10 0 10 10 m252 0 q0 -10 10 -10 m-262 10 v24 m252 0 v-24 m-252 24 q0 10 10 10 m232 0 q10 0 10 -10 m-242 10 h10 m106 0 h10 m0 0 h10 m86 0 h10 m20 -44 h10 m30 0 h10 m0 0 h10 m72 0 h10 m-434 0 l20 0 m-1 0 q-9 0 -9 -10 l0 -24 q0 -10 10 -10 m414 44 l20 0 m-20 0 q10 0 10 -10 l0 -24 q0 -10 -10 -10 m-414 0 h10 m24 0 h10 m0 0 h370 m20 44 h196 m-670 0 h20 m650 0 h20 m-690 0 q10 0 10 10 m670 0 q0 -10 10 -10 m-680 10 v112 m670 0 v-112 m-670 112 q0 10 10 10 m650 0 q10 0 10 -10 m-660 10 h10 m84 0 h10 m0 0 h10 m26 0 h10 m40 0 h10 m100 0 h10 m0 0 h112 m-252 0 h20 m232 0 h20 m-272 0 q10 0 10 10 m252 0 q0 -10 10 -10 m-262 10 v24 m252 0 v-24 m-252 24 q0 10 10 10 m232 0 q10 0 10 -10 m-242 10 h10 m106 0 h10 m0 0 h10 m86 0 h10 m20 -44 h10 m30 0 h10 m0 0 h10 m72 0 h10 m-434 0 l20 0 m-1 0 q-9 0 -9 -10 l0 -24 q0 -10 10 -10 m414 44 l20 0 m-20 0 q10 0 10 -10 l0 -24 q0 -10 -10 -10 m-414 0 h10 m24 0 h10 m0 0 h370 m20 44 h10 m26 0 h10 m-768 -132 h20 m768 0 h20 m-808 0 q10 0 10 10 m788 0 q0 -10 10 -10 m-798 10 v190 m788 0 v-190 m-788 190 q0 10 10 10 m768 0 q10 0 10 -10 m-778 10 h10 m0 0 h758 m-1370 -210 h20 m1370 0 h20 m-1410 0 q10 0 10 10 m1390 0 q0 -10 10 -10 m-1400 10 v222 m1390 0 v-222 m-1390 222 q0 10 10 10 m1370 0 q10 0 10 -10 m-1380 10 h10 m78 0 h10 m0 0 h10 m76 0 h10 m0 0 h1176 m-1484 -252 v20 m1514 0 v-20 m-1514 20 v266 m1514 0 v-266 m-1514 266 q0 10 10 10 m1494 0 q10 0 10 -10 m-1504 10 h10 m76 0 h10 m0 0 h10 m38 0 h10 m0 0 h10 m148 0 h10 m0 0 h1172 m-1504 -10 v20 m1514 0 v-20 m-1514 20 v24 m1514 0 v-24 m-1514 24 q0 10 10 10 m1494 0 q10 0 10 -10 m-1504 10 h10 m56 0 h10 m0 0 h10 m78 0 h10 m0 0 h1320 m-1504 -10 v20 m1514 0 v-20 m-1514 20 v24 m1514 0 v-24 m-1514 24 q0 10 10 10 m1494 0 q10 0 10 -10 m-1484 10 h10 m66 0 h10 m0 0 h8 m-114 0 h20 m94 0 h20 m-134 0 q10 0 10 10 m114 0 q0 -10 10 -10 m-124 10 v24 m114 0 v-24 m-114 24 q0 10 10 10 m94 0 q10 0 10 -10 m-104 10 h10 m74 0 h10 m40 -44 h10 m44 0 h10 m0 0 h10 m118 0 h10 m0 0 h146 m-368 0 h20 m348 0 h20 m-388 0 q10 0 10 10 m368 0 q0 -10 10 -10 m-378 10 v24 m368 0 v-24 m-368 24 q0 10 10 10 m348 0 q10 0 10 -10 m-358 10 h10 m104 0 h10 m0 0 h10 m204 0 h10 m20 -44 h972 m23 -726 h-3"/> + +
    \ No newline at end of file diff --git a/src/current/_includes/v24.1/physical-replication/fast-cutback-syntax.md b/src/current/_includes/v24.1/physical-replication/fast-cutback-syntax.md new file mode 100644 index 00000000000..18f5f46b5f9 --- /dev/null +++ b/src/current/_includes/v24.1/physical-replication/fast-cutback-syntax.md @@ -0,0 +1,8 @@ +{% include_cached new-in.html version="v24.1" %} To cut back to a cluster that was previously the primary cluster, use the [`ALTER VIRTUAL CLUSTER`]({% link {{ page.version.version }}/alter-virtual-cluster.md %}) syntax: + +{% include_cached copy-clipboard.html %} +~~~ sql +ALTER VIRTUAL CLUSTER {original_primary_vc} START REPLICATION FROM {promoted_standby_vc} ON connection_string_standby; +~~~ + +The original primary virtual cluster may be almost up to date with the promoted standby's virtual cluster. The difference in data between the two virtual clusters will include only the writes that have been applied to the promoted standby after cutover from the primary cluster. \ No newline at end of file diff --git a/src/current/v24.1/alter-virtual-cluster.md b/src/current/v24.1/alter-virtual-cluster.md index 8c63dbf8632..6855d076760 100644 --- a/src/current/v24.1/alter-virtual-cluster.md +++ b/src/current/v24.1/alter-virtual-cluster.md @@ -44,13 +44,15 @@ Parameter | Description `RESUME REPLICATION` | Resume the replication stream. `COMPLETE REPLICATION TO` | Set the time to complete the replication. Use:
    • `SYSTEM TIME` to specify a [timestamp]({% link {{ page.version.version }}/as-of-system-time.md %}). Refer to [Cut over to a point in time]({% link {{ page.version.version }}/cutover-replication.md %}#cut-over-to-a-point-in-time) for an example.
    • `LATEST` to specify the most recent replicated timestamp. Refer to [Cut over to a point in time]({% link {{ page.version.version }}/cutover-replication.md %}#cut-over-to-the-most-recent-replicated-time) for an example.
    `SET REPLICATION RETENTION = duration` | Change the [duration]({% link {{ page.version.version }}/interval.md %}) of the retention window that will control how far in the past you can [cut over]({% link {{ page.version.version }}/cutover-replication.md %}) to.

    {% include {{ page.version.version }}/physical-replication/retention.md %} +`SET REPLICATION EXPIRATION WINDOW = duration` | Override the default producer job's expiration window of 24 hours. The producer job expiration window determines how long the producer job will continue to run without a heartbeat from the consumer job. Refer to the [Technical Overview]({% link {{ page.version.version }}/physical-cluster-replication-technical-overview.md %}) for more details. +`START REPLICATION OF virtual_cluster_spec ON physical_cluster` | Reset a virtual cluster to the time when the virtual cluster on the promoted standby diverged from it. To reuse as much of the existing data on the original primary cluster as possible, you can run this statement as part of the [cutback]({% link {{ page.version.version }}/cutover-replication.md %}#cut-back-to-the-primary-cluster) process. This command fails if the virtual cluster was not originally replicated from the original primary cluster. +`START SERVICE SHARED` | Start a virtual cluster so it is ready to accept SQL connections after cutover. +`RENAME TO virtual_cluster_spec` | Rename a virtual cluster. +`STOP SERVICE` | Stop the `shared` service for a virtual cluster. The virtual cluster's `data_state` will still be `ready` so that the service can be restarted. `GRANT ALL CAPABILITIES` | Grant a virtual cluster all [capabilities]({% link {{ page.version.version }}/create-virtual-cluster.md %}#capabilities). `REVOKE ALL CAPABILITIES` | Revoke all [capabilities]({% link {{ page.version.version }}/create-virtual-cluster.md %}#capabilities) from a virtual cluster. `GRANT CAPABILITY virtual_cluster_capability_list` | Specify a [capability]({% link {{ page.version.version }}/create-virtual-cluster.md %}#capabilities) to grant to a virtual cluster. `REVOKE CAPABILITY virtual_cluster_capability_list` | Revoke a [capability]({% link {{ page.version.version }}/create-virtual-cluster.md %}#capabilities) from a virtual cluster. -`RENAME TO virtual_cluster_spec` | Rename a virtual cluster. -`START SERVICE SHARED` | Start a virtual cluster. That is, start the standby's virtual cluster so it is ready to accept SQL connections after cutover. -`STOP SERVICE` | Stop the `shared` service for a virtual cluster. Note that the virtual cluster's `data_state` will remain as `ready` for the service to be started once again. ## Examples @@ -68,6 +70,10 @@ You can use either: - `SYSTEM TIME` to specify a [timestamp]({% link {{ page.version.version }}/as-of-system-time.md %}). - `LATEST` to specify the most recent replicated timestamp. +### Start the cutback process + +{% include {{ page.version.version }}/physical-replication/fast-cutback-syntax.md %} + ### Set a retention window You can change the retention window to protect data from [garbage collection]({% link {{ page.version.version }}/architecture/storage-layer.md %}#garbage-collection). The retention window controls how far in the past you can [cut over]({% link {{ page.version.version }}/cutover-replication.md %}) to: diff --git a/src/current/v24.1/cutover-replication.md b/src/current/v24.1/cutover-replication.md index c29b1b1c8b5..9c9f49c482f 100644 --- a/src/current/v24.1/cutover-replication.md +++ b/src/current/v24.1/cutover-replication.md @@ -20,7 +20,7 @@ The cutover is a two-step process on the standby cluster: Initiating a cutover is a manual process that makes the standby cluster ready to accept SQL connections. However, the cutover process does **not** automatically redirect traffic to the standby cluster. Once the cutover is complete, you must redirect application traffic to the standby (new) cluster. If you do not manually redirect traffic, writes to the primary (original) cluster may be lost. {{site.data.alerts.end}} -After a cutover, you may want to _cut back_ to the original primary cluster. That is, set up the original primary cluster to once again accept application traffic. This requires you to configure another full replication stream in the opposite direction from the original standby (now primary) to the original primary. For more detail, refer to [Cut back to the primary cluster](#cut-back-to-the-primary-cluster). +After a cutover, you may want to _cut back_ to the original primary cluster (or a different cluster) to set up the original primary cluster to once again accept application traffic. For more details, refer to [Cut back to the primary cluster](#cut-back-to-the-primary-cluster). ## Step 1. Initiate the cutover @@ -154,16 +154,116 @@ At this point, the primary and standby clusters are entirely independent. You wi ## Cut back to the primary cluster -After cutting over to the standby cluster, you may need to move back to the original primary cluster, or a completely different cluster. This process is manual and requires starting a new replication stream. +After cutting over to the standby cluster, you may need to cut back to the original primary cluster to serve your application. -For example, if you had [set up physical cluster replication]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}) between a primary and standby cluster and then cut over to the standby, the workflow to cut back to the original primary cluster would be as follows: +{% include {{ page.version.version }}/physical-replication/fast-cutback-syntax.md %} -- Original primary cluster = Cluster A -- Original standby cluster = Cluster B +{{site.data.alerts.callout_info}} +To move back to a different cluster, follow the physical cluster replication [setup]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}). +{{site.data.alerts.end}} + +### Example + +This section illustrates the steps to cut back to the original primary cluster from the promoted standby cluster that is currently serving traffic. + +- **Cluster A** = original primary cluster +- **Cluster B** = original standby cluster + +**Cluster B** is serving application traffic after the [cutover](#step-2-complete-the-cutover). + +1. To begin the cutback to **Cluster A**, the virtual cluster must first stop accepting connections. Connect to the system virtual on **Cluster A**: + + {% include_cached copy-clipboard.html %} + ~~~ shell + cockroach sql --url \ + "postgresql://{user}@{node IP or hostname cluster A}:26257?options=-ccluster=system&sslmode=verify-full" \ + --certs-dir "certs" + ~~~ + +1. From the system virtual cluster on **Cluster A**, ensure that service to the virtual cluster has stopped: + + {% include_cached copy-clipboard.html %} + ~~~ sql + ALTER VIRTUAL CLUSTER {cluster_a} STOP SERVICE; + ~~~ + +1. Open another terminal window and connect to the system virtual cluster for **Cluster B**: + + {% include_cached copy-clipboard.html %} + ~~~ shell + cockroach sql --url \ + "postgresql://{user}@{node IP or hostname cluster B}:26257?options=-ccluster=system&sslmode=verify-full" \ + --certs-dir "certs" + ~~~ + +1. From the system virtual cluster on **Cluster B**, enable rangefeeds: + + {% include_cached copy-clipboard.html %} + ~~~ sql + SET CLUSTER SETTING kv.rangefeed.enabled = 'true'; + ~~~ + +1. From the system virtual cluster on **Cluster A**, start the replication from cluster B to cluster A: + + {% include_cached copy-clipboard.html %} + ~~~ sql + ALTER VIRTUAL CLUSTER {cluster_a} START REPLICATION OF {cluster_b} ON 'postgresql://{user}@{ node IP or hostname cluster B}:26257?options=-ccluster=system&sslmode=verify-full&sslrootcert=certs/{standby cert}.crt'; + ~~~ + + This will reset the virtual cluster on **Cluster A** back to the time at which the same virtual cluster on **Cluster B** diverged from it. **Cluster A** will check with **Cluster B** to confirm that its virtual cluster was replicated from **Cluster A** as part of the original [physical cluster replication stream]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}). + + {{site.data.alerts.callout_success}} + For details on connection strings, refer to the [Connection reference]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}#connection-reference). + {{site.data.alerts.end}} + +1. Check the status of the virtual cluster on **A**: + + {% include_cached copy-clipboard.html %} + ~~~ sql + SHOW VIRTUAL CLUSTER {cluster_a}; + ~~~ + + {% include_cached copy-clipboard.html %} + ~~~ + id | name | data_state | service_mode + ----+--------+--------------------+--------------- + 1 | system | ready | shared + 3 | {vc_a} | replicating | none + 4 | test | replicating | none + (2 rows) + ~~~ + +1. From **Cluster A**, start the cutover: + + {% include_cached copy-clipboard.html %} + ~~~ sql + ALTER VIRTUAL CLUSTER {cluster_a} COMPLETE REPLICATION TO LATEST; + ~~~ + + The `cutover_time` is the timestamp at which the replicated data is consistent. The cluster will revert any data above this timestamp: + + ~~~ + cutover_time + ---------------------------------- + 1714497890000000000.0000000000 + (1 row) + ~~~ + +1. From **Cluster A**, bring the virtual cluster online: + + {% include_cached copy-clipboard.html %} + ~~~ sql + ALTER VIRTUAL CLUSTER {cluster_a} START SERVICE SHARED; + ~~~ + +1. To make **Cluster A's** virtual cluster the default for [connection strings]({% link {{ page.version.version }}/work-with-virtual-clusters.md %}#sql-clients), set the following [cluster setting]({% link {{ page.version.version }}/cluster-settings.md %}): + + {% include_cached copy-clipboard.html %} + ~~~ sql + SET CLUSTER SETTING server.controller.default_target_cluster='{cluster_a}'; + ~~~ -1. Cluster B is now serving application traffic after the cutover. -1. Drop the application virtual cluster from the cluster A with `DROP VIRTUAL CLUSTER`. {% comment %}link here{% endcomment %} -1. Start a replication stream that sends updates from cluster B to cluster A. Refer to [Start replication]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}#step-4-start-replication). +At this point, **Cluster A** is once again the primary and **Cluster B** is once again the standby. The clusters are entirely independent. To direct application traffic to the primary (**Cluster A**), you will need to use your own network load balancers, DNS servers, or other network configuration to direct application traffic to **Cluster A**. To enable physical cluster replication again, from the primary to the standby (or a completely different cluster), refer to [Set Up Physical Cluster Replication]({% link {{ page.version.version }}/set-up-physical-cluster-replication.md %}). ## See also diff --git a/src/current/v24.1/physical-cluster-replication-technical-overview.md b/src/current/v24.1/physical-cluster-replication-technical-overview.md index 60585a150e7..8b0c1e9888c 100644 --- a/src/current/v24.1/physical-cluster-replication-technical-overview.md +++ b/src/current/v24.1/physical-cluster-replication-technical-overview.md @@ -31,7 +31,6 @@ The stream initialization proceeds as follows: 1. The initial scan runs on the primary and backfills all data from the primary virtual cluster as of the starting timestamp of the replication stream. 1. Once the initial scan is complete, the primary then begins streaming all changes from the point of the starting timestamp. -{% comment %}TODO Kathryn to update this graphic {% endcomment%} Two virtualized clusters with system virtual cluster and application virtual cluster showing the directional stream. ### During the replication stream @@ -41,7 +40,7 @@ The replication happens at the byte level, which means that the job is unaware o During the job, [rangefeeds]({% link {{ page.version.version }}/create-and-configure-changefeeds.md %}#enable-rangefeeds) are periodically emitting resolved timestamps, which is the time where the ingested data is known to be consistent. Resolved timestamps provide a guarantee that there are no new writes from before that timestamp. This allows the standby cluster to move the [protected timestamp]({% link {{ page.version.version }}/architecture/storage-layer.md %}#protected-timestamps) forward as the replicated timestamp advances. This information is sent to the primary cluster, which allows for [garbage collection]({% link {{ page.version.version }}/architecture/storage-layer.md %}#garbage-collection) to continue as the replication stream on the standby cluster advances. {{site.data.alerts.callout_info}} -If the primary cluster does not receive replicated time information from the standby after 3 days, it cancels the replication job. This ensures that an inactive replication job will not prevent garbage collection. The time at which the job is removed is configurable via the `stream_replication.job_liveness_timeout` [cluster setting]({% link {{ page.version.version }}/cluster-settings.md %}). +If the primary cluster does not receive replicated time information from the standby after 24 hours, it cancels the replication job. This ensures that an inactive replication job will not prevent garbage collection. The time at which the job is removed is configurable with [`ALTER VIRTUAL CLUSTER virtual_cluster EXPIRATION WINDOW = duration`]({% link {{ page.version.version }}/alter-virtual-cluster.md %}) syntax. {{site.data.alerts.end}} ### Cutover and promotion process From 321bb1ea56e3243d729f122e380dd362c6d4b311 Mon Sep 17 00:00:00 2001 From: "Matt Linville (he/him)" Date: Mon, 6 May 2024 11:50:43 -0700 Subject: [PATCH 17/25] Add include file for v24.1.0 release notes (#18516) * Add include file for v24.1.0 release notes Co-authored-by: Mike Lewis <76072290+mikeCRL@users.noreply.github.com> --- .../_includes/releases/v24.1/v24.1.0.md | 269 ++++++++++++++++++ 1 file changed, 269 insertions(+) create mode 100644 src/current/_includes/releases/v24.1/v24.1.0.md diff --git a/src/current/_includes/releases/v24.1/v24.1.0.md b/src/current/_includes/releases/v24.1/v24.1.0.md new file mode 100644 index 00000000000..5c9e947b332 --- /dev/null +++ b/src/current/_includes/releases/v24.1/v24.1.0.md @@ -0,0 +1,269 @@ +## v24.1.0 + +Release Date: TBD TBD, 2024 + +With the release of CockroachDB v24.1, we've added new capabilities to help you migrate, build, and operate more efficiently. Refer to our summary of the most significant user-facing changes under [Feature Highlights](#v24-1-0-feature-highlights). + +{% include releases/new-release-downloads-docker-image.md release=include.release advisory_key="a103220"%} + +

    Feature highlights

    + +This section summarizes the most significant user-facing changes in v24.1.0 and other features recently made available to CockroachDB users across versions. For a complete list of features and changes in v24.1, including bug fixes and performance improvements, refer to the [release notes]({% link releases/index.md %}#testing-releases) for previous v24.1 testing releases. You can also search the docs for sections labeled [New in v24.1](https://www.cockroachlabs.com/docs/search?query=new+in+v24.1). + +- **Feature categories** + - [Observability](#v24-1-0-observability) + - [Migrations](#v24-1-0-migrations) + - [Security and compliance](#v24-1-0-security-and-compliance) + - [Disaster recovery](#v24-1-0-disaster-recovery) + - [Deployment and operations](#v24-1-0-deployment-and-operations) + - [SQL](#v24-1-0-sql) +- **Additional information** + - [Backward-incompatible changes](#v24-1-0-backward-incompatible-changes) + - [Deprecations](#v24-1-0-deprecations) + - [Known limitations](#v24-1-0-known-limitations) + - [Additional resources](#v24-1-0-additional-resources) + +{{ site.data.alerts.callout_info }} +In CockroachDB Self-Hosted, all available features are free to use unless their description specifies that an Enterprise license is required. For more information, refer to the [Licensing FAQ](https://www.cockroachlabs.com/docs/stable/licensing-faqs). +{{ site.data.alerts.end }} + +
    + +

    Observability

    + + + + + + + + + + + + + + + + + + + + + + + +
    FeatureAvailability
    Ver.Self-HostedDedicatedServerless
    +

    TBD

    +

    TBD

    +
    TBD{% include icon-yes.html %}{% include icon-yes.html %}{% include icon-no.html %}
    + +

    Migrations

    + + + + + + + + + + + + + + + + + + + + + + + + +
    FeatureAvailability
    Ver.Self-HostedDedicatedServerless
    +

    TBD

    +

    TBD

    +
    TBD{% include icon-yes.html %}{% include icon-yes.html %}{% include icon-yes.html %}
    + +

    Disaster recovery

    + + + + + + + + + + + + + + + + + + + + + + + + +
    FeatureAvailability
    Ver.Self-HostedDedicatedServerless
    +

    TBD

    +

    TBD.

    +
    TBD{% include icon-yes.html %}{% include icon-no.html %}{% include icon-no.html %}
    + +

    Security and compliance

    + + + + + + + + + + + + + + + + + + + + + + + + +
    FeatureAvailability
    Ver.Self-HostedDedicatedServerless
    +

    TBD

    +

    TBD

    +
    TBD{% include icon-no.html %}{% include icon-yes.html %}{% include icon-no.html %}
    + +

    Deployment and operations

    + + + + + + + + + + + + + + + + + + + + + + + + +
    FeatureAvailability
    Ver.Self-HostedDedicatedServerless
    +

    TBD

    +

    TBD

    +
    TBD{% include icon-no.html %}{% include icon-yes.html %}{% include icon-no.html %}
    + +

    SQL

    + + + + + + + + + + + + + + + + + + + + + + + + +
    FeatureAvailability
    Ver.Self-HostedDedicatedServerless
    +

    TBD

    +

    TBD

    +
    TBD{% include icon-no.html %}{% include icon-yes.html %}{% include icon-no.html %}
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Feature detail key
    *Features marked “All*” were recently made available in the CockroachDB Cloud platform. They are available for all supported versions of CockroachDB, under the deployment methods specified in their row under Availability.
    **Features marked “All**” were recently made available via migration tools maintained outside of the CockroachDB binary. They are available to use with all supported versions of CockroachDB, under the deployment methods specified in their row under Availability.
    {% include icon-yes.html %}Feature is available for this deployment method of CockroachDB as specified in the icon’s column: CockroachDB Self-Hosted, CockroachDB Dedicated, or CockroachDB Serverless.
    {% include icon-no.html %}Feature is not available for this deployment method of CockroachDB as specified in the icon’s column: CockroachDB Self-Hosted, CockroachDB Dedicated, or CockroachDB Serverless.
    + + +
    + +

    Backward-incompatible changes

    + +Before [upgrading to CockroachDB v24.1]({% link v24.1/upgrade-cockroach-version.md %}), be sure to review the following backward-incompatible changes, as well as [key cluster setting changes](#v24-1-0-cluster-settings), and adjust your deployment as necessary. + +- TBD + +

    Key Cluster Setting Changes

    + +The following changes should be reviewed prior to upgrading. Default cluster settings will be used unless you have manually set a value for a setting. This can be confirmed by checking the `system.settings` table (`select * from system.settings`) to view the non-default settings. + +- TBD + +

    Deprecations

    + +{% comment %}TODO: Intro para? Each sibling section has one.{% endcomment %} + +- TBD + +

    Known limitations

    + +For information about new and unresolved limitations in CockroachDB v24.1, with suggested workarounds where applicable, refer to [Known Limitations](https://www.cockroachlabs.com/docs/v24.1/known-limitations). + +

    Additional resources

    + +Resource | Topic | Description +---------------------+--------------------------------------------+------------- +Cockroach University | [Example link](https://example.com/course1)| Summary here +Cockroach University | [Example link](https://example.com/course2)| Summary here +Docs | [Example link](https://example.com/doc1) | Summary here +Docs | [Example link](https://example.com/doc2) | Summary here From 445ca638cb785bd19cc7babea493ba05a5a052d5 Mon Sep 17 00:00:00 2001 From: Florence Morris Date: Mon, 6 May 2024 15:28:35 -0400 Subject: [PATCH 18/25] In ui-statements-page and serverless-unsupported-features, removed text regarding diagnostic statement bundles not being available on Serverless clusters. (#18510) --- src/current/_includes/v24.1/ui/statement-details.md | 5 +---- src/current/_includes/v24.1/ui/statements-table.md | 2 +- .../cockroachcloud/serverless-unsupported-features.md | 1 - 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/current/_includes/v24.1/ui/statement-details.md b/src/current/_includes/v24.1/ui/statement-details.md index 2155d1c685b..c2e91b92609 100644 --- a/src/current/_includes/v24.1/ui/statement-details.md +++ b/src/current/_includes/v24.1/ui/statement-details.md @@ -124,10 +124,7 @@ If you click **Apply** to create the index and then execute the statement again, The **Diagnostics** tab allows you to activate and download diagnostics for a SQL statement fingerprint. {{site.data.alerts.callout_info}} -The **Diagnostics** tab is not visible: - -- On CockroachDB {{ site.data.products.serverless }} clusters. -- For roles with the `VIEWACTIVITYREDACTED` [system privilege]({{ link_prefix }}security-reference/authorization.html#supported-privileges) (or the legacy `VIEWACTIVITYREDACTED` [role option]({{ link_prefix }}security-reference/authorization.html#role-options)) defined. +The **Diagnostics** tab is not visible for roles with the `VIEWACTIVITYREDACTED` [system privilege]({{ link_prefix }}security-reference/authorization.html#supported-privileges) (or the legacy `VIEWACTIVITYREDACTED` [role option]({{ link_prefix }}security-reference/authorization.html#role-options)) defined. {{site.data.alerts.end}} When you activate diagnostics for a fingerprint, CockroachDB waits for the next SQL query that matches this fingerprint to be run on any node. On the next match, information about the SQL statement is written to a diagnostics bundle that you can download. This bundle consists of [statement traces]({{ link_prefix }}show-trace.html) in various formats (including a JSON file that can be [imported to Jaeger]({{ link_prefix }}query-behavior-troubleshooting.html#visualize-statement-traces-in-jaeger)), a physical query plan, execution statistics, and other information about the query. The bundle contents are identical to those produced by [`EXPLAIN ANALYZE (DEBUG)`]({{ link_prefix }}explain-analyze.html#debug-option). You can use the information collected in the bundle to diagnose problematic SQL statements, such as [slow queries]({{ link_prefix }}query-behavior-troubleshooting.html#query-is-always-slow). We recommend that you share the diagnostics bundle with our [support team]({{ link_prefix }}support-resources.html), which can help you interpret the results. diff --git a/src/current/_includes/v24.1/ui/statements-table.md b/src/current/_includes/v24.1/ui/statements-table.md index 321d3f06f80..07b200d542b 100644 --- a/src/current/_includes/v24.1/ui/statements-table.md +++ b/src/current/_includes/v24.1/ui/statements-table.md @@ -27,7 +27,7 @@ Retries | Cumulative number of automatic (internal) [retries]({{ link_prefix }}t Regions/Nodes | The regions and nodes on which statements with this fingerprint executed.

    Nodes are not visible for CockroachDB {{ site.data.products.serverless }} clusters or for clusters that are not multi-region. Last Execution Time (UTC)| The timestamp when the statement was last executed. Statement Fingerprint ID | The ID of the statement fingerprint. -Diagnostics | Activate and download [diagnostics](#diagnostics) for this fingerprint. To activate, click the **Activate** button. The [Activate statement diagnostics](#activate-diagnostics-collection-and-download-bundles) dialog displays. After you complete the dialog, the column displays the status of diagnostics collection (**WAITING**, **READY**, or **ERROR**). Click Vertical ellipsis and select a bundle to download or select **Cancel request** to cancel diagnostics bundle collection.

    Statements are periodically cleared from the Statements page based on the start time. To access the full history of diagnostics for the fingerprint, see the [Diagnostics](#diagnostics) tab of the Statement Details page.

    Diagnostics is not visible for CockroachDB {{ site.data.products.serverless }} clusters. +Diagnostics | Activate and download [diagnostics](#diagnostics) for this fingerprint. To activate, click the **Activate** button. The [Activate statement diagnostics](#activate-diagnostics-collection-and-download-bundles) dialog displays. After you complete the dialog, the column displays the status of diagnostics collection (**WAITING**, **READY**, or **ERROR**). Click Vertical ellipsis and select a bundle to download or select **Cancel request** to cancel diagnostics bundle collection.

    Statements are periodically cleared from the Statements page based on the start time. To access the full history of diagnostics for the fingerprint, see the [Diagnostics](#diagnostics) tab of the Statement Details page. {{site.data.alerts.callout_info}} To obtain the execution statistics, CockroachDB samples a percentage of the executions. If you see `no samples` displayed in the **Contention**, **Max Memory**, or **Network** columns, there are two possibilities: diff --git a/src/current/cockroachcloud/serverless-unsupported-features.md b/src/current/cockroachcloud/serverless-unsupported-features.md index 6dd94904d0d..a6705f694a0 100644 --- a/src/current/cockroachcloud/serverless-unsupported-features.md +++ b/src/current/cockroachcloud/serverless-unsupported-features.md @@ -50,7 +50,6 @@ The Cloud Console provides a subset of observability information from the DB Con The Cloud Console also does not currently provide the following features available in the DB Console: -- [Statement diagnostic bundles](https://www.cockroachlabs.com/docs/{{site.current_cloud_version}}/ui-statements-page#diagnostics) on the **Statements** Page - [Direct actions to drop unused indexes](https://www.cockroachlabs.com/docs/{{site.current_cloud_version}}/ui-databases-page#index-recommendations) on the **Insights** and **Databases** pages - [Direct actions to create missing indexes](https://www.cockroachlabs.com/docs/{{site.current_cloud_version}}/ui-insights-page#schema-insights-tab) and [replace existing indexes](https://www.cockroachlabs.com/docs/{{site.current_cloud_version}}/ui-insights-page#schema-insights-tab) on the **Insights** page From c4e825a6655766daa388d27b4fa77d3c4b405239 Mon Sep 17 00:00:00 2001 From: Florence Morris Date: Mon, 6 May 2024 15:45:54 -0400 Subject: [PATCH 19/25] DOC-9671 PR #119205 - cli: --include-range-info flag for `cockroach debug zip` also toggles problem ranges (#18512) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * In cockroach-debug.zip, (a) removed problem ranges from “cannot be filtered list”, (b) updated to description of --include-range-info flag to include problemranges.json. * Incorporated Ryan’s feedback. --- src/current/v23.1/cockroach-debug-zip.md | 3 +-- src/current/v23.2/cockroach-debug-zip.md | 3 +-- src/current/v24.1/cockroach-debug-zip.md | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/current/v23.1/cockroach-debug-zip.md b/src/current/v23.1/cockroach-debug-zip.md index be7f866e364..30e01d01685 100644 --- a/src/current/v23.1/cockroach-debug-zip.md +++ b/src/current/v23.1/cockroach-debug-zip.md @@ -80,7 +80,6 @@ The following information is also contained in the `.zip` file, and cannot be fi - [Cluster Settings]({% link {{ page.version.version }}/cluster-settings.md %}) - [Metrics]({% link {{ page.version.version }}/metrics.md %}) - [Replication Reports]({% link {{ page.version.version }}/query-replication-reports.md %}) -- Problem ranges - CPU profiles - A script (`hot-ranges.sh`) that summarizes the hottest ranges (ranges receiving a high number of reads or writes) @@ -114,7 +113,7 @@ Flag | Description `--files-until` | End timestamp for log file, goroutine dump, and heap profile collection. This can be used to limit the size of the generated `.zip`, which is increased by these files. The timestamp uses the format `YYYY-MM-DD`, followed optionally by `HH:MM:SS` or `HH:MM`. For example:

    `--files-until='2021-07-01 16:00'`

    When specifying a narrow time window, we recommend adding extra seconds/minutes to account for uncertainties such as clock drift.

    **Default:** 24 hours beyond now (to include files created during `.zip` creation) `--include-files` | [Files](#files) to include in the generated `.zip`. This can be used to limit the size of the generated `.zip`, and affects logs, heap profiles, goroutine dumps, and/or CPU profiles. The files are specified as a comma-separated list of [glob patterns](https://wikipedia.org/wiki/Glob_(programming)). For example:

    `--include-files=*.pprof`

    Note that this flag is applied _before_ `--exclude-files`. Use [`cockroach debug list-files`]({% link {{ page.version.version }}/cockroach-debug-list-files.md %}) with this flag to see a list of files that will be contained in the `.zip`. `--include-goroutine-stacks` | Fetch stack traces for all goroutines running on each targeted node in `nodes/*/stacks.txt` and `nodes/*/stacks_with_labels.txt` files. Note that fetching stack traces for all goroutines is a "stop-the-world" operation, which can momentarily have negative impacts on SQL service latency. Exclude these goroutine stacks by using the `--include-goroutine-stacks=false` flag. Note that any periodic goroutine dumps previously taken on the node will still be included in `nodes/*/goroutines/*.txt.gz`, as these would have already been generated and don't require any additional stop-the-world operations to be collected.

    **Default:** true -`--include-range-info` | Include one file per node with information about the KV ranges stored on that node, in `nodes/{node ID}/ranges.json`.

    This information can be vital when debugging issues that involve the [KV layer]({% link {{ page.version.version }}/architecture/overview.md %}#layers) (which includes everything below the SQL layer), such as data placement, load balancing, performance or other behaviors. In certain situations, on large clusters with large numbers of ranges, these files can be omitted if and only if the issue being investigated is already known to be in another layer of the system (for example, an error message about an unsupported feature or incompatible value in a SQL schema change or statement). Note however many higher-level issues are ultimately related to the underlying KV layer described by these files so only set this to `false` if directed to do so by Cockroach Labs support.

    **Default:** true +`--include-range-info` | Include one file per node with information about the KV ranges stored on that node, in `nodes/{node ID}/ranges.json`.

    This information can be vital when debugging issues that involve the [KV layer]({% link {{ page.version.version }}/architecture/overview.md %}#layers) (which includes everything below the SQL layer), such as data placement, load balancing, performance or other behaviors. In certain situations, on large clusters with large numbers of ranges, these files can be omitted if and only if the issue being investigated is already known to be in another layer of the system (for example, an error message about an unsupported feature or incompatible value in a SQL schema change or statement). However, many higher-level issues are ultimately related to the underlying KV layer described by these files. Only set this to `false` if directed to do so by Cockroach Labs support.

    In addition, include problem ranges information in `reports/problemranges.json`.

    **Default:** true `--nodes` | Specify nodes to inspect as a comma-separated list or range of node IDs. For example:

    `--nodes=1,10,13-15` `--redact` | Redact sensitive data from the generated `.zip`, with the exception of range keys, which must remain unredacted because they are essential to support CockroachDB. This flag replaces the deprecated `--redact-logs` flag, which only applied to log messages contained within `.zip`. See [Redact sensitive information](#redact-sensitive-information) for an example. `--redact-logs` | **Deprecated** Redact sensitive data from collected log files only. Use the `--redact` flag instead, which redacts sensitive data across the entire generated `.zip` as well as the collected log files. Passing the `--redact-logs` flag will be interpreted as the `--redact` flag. diff --git a/src/current/v23.2/cockroach-debug-zip.md b/src/current/v23.2/cockroach-debug-zip.md index 93f2cc90a9e..261d5c22e08 100644 --- a/src/current/v23.2/cockroach-debug-zip.md +++ b/src/current/v23.2/cockroach-debug-zip.md @@ -80,7 +80,6 @@ The following information is also contained in the `.zip` file, and cannot be fi - [Cluster Settings]({% link {{ page.version.version }}/cluster-settings.md %}) - [Metrics]({% link {{ page.version.version }}/metrics.md %}) - [Replication Reports]({% link {{ page.version.version }}/query-replication-reports.md %}) -- Problem ranges - CPU profiles - A script (`hot-ranges.sh`) that summarizes the hottest ranges (ranges receiving a high number of reads or writes) @@ -114,7 +113,7 @@ Flag | Description `--files-until` | End timestamp for log file, goroutine dump, and heap profile collection. This can be used to limit the size of the generated `.zip`, which is increased by these files. The timestamp uses the format `YYYY-MM-DD`, followed optionally by `HH:MM:SS` or `HH:MM`. For example:

    `--files-until='2021-07-01 16:00'`

    When specifying a narrow time window, we recommend adding extra seconds/minutes to account for uncertainties such as clock drift.

    **Default:** 24 hours beyond now (to include files created during `.zip` creation) `--include-files` | [Files](#files) to include in the generated `.zip`. This can be used to limit the size of the generated `.zip`, and affects logs, heap profiles, goroutine dumps, and/or CPU profiles. The files are specified as a comma-separated list of [glob patterns](https://wikipedia.org/wiki/Glob_(programming)). For example:

    `--include-files=*.pprof`

    Note that this flag is applied _before_ `--exclude-files`. Use [`cockroach debug list-files`]({% link {{ page.version.version }}/cockroach-debug-list-files.md %}) with this flag to see a list of files that will be contained in the `.zip`. `--include-goroutine-stacks` | Fetch stack traces for all goroutines running on each targeted node in `nodes/*/stacks.txt` and `nodes/*/stacks_with_labels.txt` files. Note that fetching stack traces for all goroutines is a "stop-the-world" operation, which can momentarily have negative impacts on SQL service latency. Exclude these goroutine stacks by using the `--include-goroutine-stacks=false` flag. Note that any periodic goroutine dumps previously taken on the node will still be included in `nodes/*/goroutines/*.txt.gz`, as these would have already been generated and don't require any additional stop-the-world operations to be collected.

    **Default:** true -`--include-range-info` | Include one file per node with information about the KV ranges stored on that node, in `nodes/{node ID}/ranges.json`.

    This information can be vital when debugging issues that involve the [KV layer]({% link {{ page.version.version }}/architecture/overview.md %}#layers) (which includes everything below the SQL layer), such as data placement, load balancing, performance or other behaviors. In certain situations, on large clusters with large numbers of ranges, these files can be omitted if and only if the issue being investigated is already known to be in another layer of the system (for example, an error message about an unsupported feature or incompatible value in a SQL schema change or statement). Note however many higher-level issues are ultimately related to the underlying KV layer described by these files so only set this to `false` if directed to do so by Cockroach Labs support.

    **Default:** true +`--include-range-info` | Include one file per node with information about the KV ranges stored on that node, in `nodes/{node ID}/ranges.json`.

    This information can be vital when debugging issues that involve the [KV layer]({% link {{ page.version.version }}/architecture/overview.md %}#layers) (which includes everything below the SQL layer), such as data placement, load balancing, performance or other behaviors. In certain situations, on large clusters with large numbers of ranges, these files can be omitted if and only if the issue being investigated is already known to be in another layer of the system (for example, an error message about an unsupported feature or incompatible value in a SQL schema change or statement). However, many higher-level issues are ultimately related to the underlying KV layer described by these files. Only set this to `false` if directed to do so by Cockroach Labs support.

    In addition, include problem ranges information in `reports/problemranges.json`.

    **Default:** true `--include-running-job-traces` | Include information about each running, traceable job (such as [backup]({% link {{ page.version.version }}/backup.md %}), [restore]({% link {{ page.version.version }}/restore.md %}), [import]({% link {{ page.version.version }}/import-into.md %}), [physical cluster replication]({% link {{ page.version.version }}/physical-cluster-replication-technical-overview.md %})) in `jobs/*/*/trace.zip` files. This involves collecting cluster-wide traces for each running job in the cluster.

    **Default:** true `--nodes` | Specify nodes to inspect as a comma-separated list or range of node IDs. For example:

    `--nodes=1,10,13-15` `--redact` | Redact sensitive data from the generated `.zip`, with the exception of range keys, which must remain unredacted because they are essential to support CockroachDB. This flag replaces the deprecated `--redact-logs` flag, which only applied to log messages contained within `.zip`. See [Redact sensitive information](#redact-sensitive-information) for an example. diff --git a/src/current/v24.1/cockroach-debug-zip.md b/src/current/v24.1/cockroach-debug-zip.md index 93f2cc90a9e..261d5c22e08 100644 --- a/src/current/v24.1/cockroach-debug-zip.md +++ b/src/current/v24.1/cockroach-debug-zip.md @@ -80,7 +80,6 @@ The following information is also contained in the `.zip` file, and cannot be fi - [Cluster Settings]({% link {{ page.version.version }}/cluster-settings.md %}) - [Metrics]({% link {{ page.version.version }}/metrics.md %}) - [Replication Reports]({% link {{ page.version.version }}/query-replication-reports.md %}) -- Problem ranges - CPU profiles - A script (`hot-ranges.sh`) that summarizes the hottest ranges (ranges receiving a high number of reads or writes) @@ -114,7 +113,7 @@ Flag | Description `--files-until` | End timestamp for log file, goroutine dump, and heap profile collection. This can be used to limit the size of the generated `.zip`, which is increased by these files. The timestamp uses the format `YYYY-MM-DD`, followed optionally by `HH:MM:SS` or `HH:MM`. For example:

    `--files-until='2021-07-01 16:00'`

    When specifying a narrow time window, we recommend adding extra seconds/minutes to account for uncertainties such as clock drift.

    **Default:** 24 hours beyond now (to include files created during `.zip` creation) `--include-files` | [Files](#files) to include in the generated `.zip`. This can be used to limit the size of the generated `.zip`, and affects logs, heap profiles, goroutine dumps, and/or CPU profiles. The files are specified as a comma-separated list of [glob patterns](https://wikipedia.org/wiki/Glob_(programming)). For example:

    `--include-files=*.pprof`

    Note that this flag is applied _before_ `--exclude-files`. Use [`cockroach debug list-files`]({% link {{ page.version.version }}/cockroach-debug-list-files.md %}) with this flag to see a list of files that will be contained in the `.zip`. `--include-goroutine-stacks` | Fetch stack traces for all goroutines running on each targeted node in `nodes/*/stacks.txt` and `nodes/*/stacks_with_labels.txt` files. Note that fetching stack traces for all goroutines is a "stop-the-world" operation, which can momentarily have negative impacts on SQL service latency. Exclude these goroutine stacks by using the `--include-goroutine-stacks=false` flag. Note that any periodic goroutine dumps previously taken on the node will still be included in `nodes/*/goroutines/*.txt.gz`, as these would have already been generated and don't require any additional stop-the-world operations to be collected.

    **Default:** true -`--include-range-info` | Include one file per node with information about the KV ranges stored on that node, in `nodes/{node ID}/ranges.json`.

    This information can be vital when debugging issues that involve the [KV layer]({% link {{ page.version.version }}/architecture/overview.md %}#layers) (which includes everything below the SQL layer), such as data placement, load balancing, performance or other behaviors. In certain situations, on large clusters with large numbers of ranges, these files can be omitted if and only if the issue being investigated is already known to be in another layer of the system (for example, an error message about an unsupported feature or incompatible value in a SQL schema change or statement). Note however many higher-level issues are ultimately related to the underlying KV layer described by these files so only set this to `false` if directed to do so by Cockroach Labs support.

    **Default:** true +`--include-range-info` | Include one file per node with information about the KV ranges stored on that node, in `nodes/{node ID}/ranges.json`.

    This information can be vital when debugging issues that involve the [KV layer]({% link {{ page.version.version }}/architecture/overview.md %}#layers) (which includes everything below the SQL layer), such as data placement, load balancing, performance or other behaviors. In certain situations, on large clusters with large numbers of ranges, these files can be omitted if and only if the issue being investigated is already known to be in another layer of the system (for example, an error message about an unsupported feature or incompatible value in a SQL schema change or statement). However, many higher-level issues are ultimately related to the underlying KV layer described by these files. Only set this to `false` if directed to do so by Cockroach Labs support.

    In addition, include problem ranges information in `reports/problemranges.json`.

    **Default:** true `--include-running-job-traces` | Include information about each running, traceable job (such as [backup]({% link {{ page.version.version }}/backup.md %}), [restore]({% link {{ page.version.version }}/restore.md %}), [import]({% link {{ page.version.version }}/import-into.md %}), [physical cluster replication]({% link {{ page.version.version }}/physical-cluster-replication-technical-overview.md %})) in `jobs/*/*/trace.zip` files. This involves collecting cluster-wide traces for each running job in the cluster.

    **Default:** true `--nodes` | Specify nodes to inspect as a comma-separated list or range of node IDs. For example:

    `--nodes=1,10,13-15` `--redact` | Redact sensitive data from the generated `.zip`, with the exception of range keys, which must remain unredacted because they are essential to support CockroachDB. This flag replaces the deprecated `--redact-logs` flag, which only applied to log messages contained within `.zip`. See [Redact sensitive information](#redact-sensitive-information) for an example. From 4e582d571bc86c6c3d2e51664839f791179effd5 Mon Sep 17 00:00:00 2001 From: Kathryn Hancox <44557882+kathancox@users.noreply.github.com> Date: Tue, 7 May 2024 12:21:02 -0400 Subject: [PATCH 20/25] Update PCR retry time (#18519) --- .../physical-replication/show-virtual-cluster-data-state.md | 2 +- .../physical-replication/show-virtual-cluster-data-state.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/current/_includes/v23.2/physical-replication/show-virtual-cluster-data-state.md b/src/current/_includes/v23.2/physical-replication/show-virtual-cluster-data-state.md index a39bef0fe3e..ec7230a434b 100644 --- a/src/current/_includes/v23.2/physical-replication/show-virtual-cluster-data-state.md +++ b/src/current/_includes/v23.2/physical-replication/show-virtual-cluster-data-state.md @@ -6,4 +6,4 @@ State | Description `replication paused` | The replication job is paused due to an error or a manual request with [`ALTER VIRTUAL CLUSTER ... PAUSE REPLICATION`]({% link {{ page.version.version }}/alter-virtual-cluster.md %}). `replication pending cutover` | The replication job is running and the cutover time has been set. Once the the replication reaches the cutover time, the cutover will begin automatically. `replication cutting over` | The job has started cutting over. The cutover time can no longer be changed. Once cutover is complete, A virtual cluster will be available for use with [`ALTER VIRTUAL CLUSTER ... START SHARED SERVICE`]({% link {{ page.version.version }}/alter-virtual-cluster.md %}). -`replication error` | An error has occurred. You can find more detail in the error message and the logs. +`replication error` | An error has occurred. You can find more detail in the error message and the [logs]({% link {{ page.version.version }}/configure-logs.md %}). **Note:** A physical cluster replication job will retry for 3 minutes before failing. diff --git a/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-data-state.md b/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-data-state.md index c0a3163e8f3..e12fd972ba2 100644 --- a/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-data-state.md +++ b/src/current/_includes/v24.1/physical-replication/show-virtual-cluster-data-state.md @@ -6,4 +6,4 @@ State | Description `replication paused` | The replication job is paused due to an error or a manual request with [`ALTER VIRTUAL CLUSTER ... PAUSE REPLICATION`]({% link {{ page.version.version }}/alter-virtual-cluster.md %}). `replication pending cutover` | The replication job is running and the cutover time has been set. Once the the replication reaches the cutover time, the cutover will begin automatically. `replication cutting over` | The job has started cutting over. The cutover time can no longer be changed. Once cutover is complete, a virtual cluster will be available for use with [`ALTER VIRTUAL CLUSTER ... START SHARED SERVICE`]({% link {{ page.version.version }}/alter-virtual-cluster.md %}). -`replication error` | An error has occurred. You can find more detail in the error message and the logs. +`replication error` | An error has occurred. You can find more detail in the error message and the [logs]({% link {{ page.version.version }}/configure-logs.md %}). **Note:** A physical cluster replication job will retry for 3 minutes before failing. From 1161b97117fd075c712f6591a033f18ec2d649a6 Mon Sep 17 00:00:00 2001 From: "Matt Linville (he/him)" Date: Tue, 7 May 2024 15:11:17 -0700 Subject: [PATCH 21/25] [DOC-10221] Release notes for v23.2.5 (#18523) * [DOC-10221] Release notes for v23.2.4 --- src/current/_data/releases.yml | 34 ++++++++++ .../_includes/releases/v23.2/v23.2.5.md | 65 +++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 src/current/_includes/releases/v23.2/v23.2.5.md diff --git a/src/current/_data/releases.yml b/src/current/_data/releases.yml index ce05dca4433..00c6ea010f2 100644 --- a/src/current/_data/releases.yml +++ b/src/current/_data/releases.yml @@ -5960,3 +5960,37 @@ docker_arm_limited_access: false source: true previous_release: v23.1.19 + +- release_name: v23.2.5 + major_version: v23.2 + release_date: '2024-05-07' + release_type: Production + cloud_only: True + cloud_only_message_short: 'Available only for select CockroachDB Cloud clusters' + cloud_only_message: > + This version is currently available only for select + CockroachDB Cloud clusters. To request to upgrade + a CockroachDB self-hosted cluster to this version, + [contact support](https://support.cockroachlabs.com/hc/en-us/requests/new). + go_version: go1.22.0 + sha: 57ab10786d6ed277959c8990e2823772893ac873 + has_sql_only: true + has_sha256sum: true + mac: + mac_arm: true + mac_arm_experimental: true + mac_arm_limited_access: false + windows: true + linux: + linux_arm: true + linux_arm_experimental: false + linux_arm_limited_access: false + linux_intel_fips: true + linux_arm_fips: false + docker: + docker_image: cockroachdb/cockroach + docker_arm: true + docker_arm_experimental: false + docker_arm_limited_access: false + source: true + previous_release: v23.2.4 diff --git a/src/current/_includes/releases/v23.2/v23.2.5.md b/src/current/_includes/releases/v23.2/v23.2.5.md new file mode 100644 index 00000000000..a5fc11c5696 --- /dev/null +++ b/src/current/_includes/releases/v23.2/v23.2.5.md @@ -0,0 +1,65 @@ +## v23.2.5 + +Release Date: May 7, 2024 + +{% include releases/new-release-downloads-docker-image.md release=include.release %} + +

    SQL language changes

    + +- The new [cluster setting](../v23.2/cluster-settings.html) [`sql.stats.virtual_computed_columns.enabled`](../v23.2/cluster-settings.html#setting-sql-stats-virtual-computed-columns-enabled) enables collection of [table statistics](../v23.2/cost-based-optimizer.html#table-statistics) on virtual [computed columns](../v23.2/computed-columns.html). [#120923][#120923] +- The new [session variable](../v23.2/session-variables.html) `optimizer_use_virtual_computed_column_stats` configures the [optimizer](../v23.2/cost-based-optimizer.html) to consider table statistics on virtual computed columns. [#121179][#121179] +- The new `FORCE_INVERTED_INDEX` [hint](../v23.2/indexes.html#selection) configures the [optimizer](../v23.2/cost-based-optimizer.html) to prefer a query plan scan over any inverted index of the hinted table. If no such query plan can be generated, an error is logged. [#122300][#122300] +- The [optimizer](../v23.2/cost-based-optimizer.html) can now plan constrained scans over [partial indexes](../v23.2/partial-indexes.html) in more cases, particularly on partial indexes with predicates referencing virtual [computed columns](../v23.2/cluster-settings.html#setting-sql-stats-virtual-computed-columns-enabled). [#123408][#123408] + +

    Operational changes

    + +- A minimum [Raft](../v23.2/architecture/replication-layer.html#raft) scheduler concurrency is now enforced per [store](../v23.2/cockroach-start.html#storage) so that a node with many stores does not spread workers too thinly. This avoids high scheduler latency across [replicas](../v23.2/architecture/glossary.html#replica) on a store when load is imbalanced. [#120798][#120798] +- A [changefeed](../v23.2/change-data-capture-overview.html) optimization to reduce duplicates during aggregator restarts has been disabled due to poor performance. [#123596][#123596] + +

    DB Console changes

    + +- The **Commit Latency** chart in the [Changefeed Dashboard](../v23.2/ui-cdc-dashboard.html) now aggregates by max instead of by sum for multi-node changefeeds. This more accurately reflects the amount of time for events to be acknowledged by the downstream sink. [#121235][#121235] + +

    Bug fixes

    + +- Fixed a slow memory leak when opening many new [connections](../v23.2/connect-to-the-database.html). This bug was introduced in v22.2.9 and v23.1.0. [#121055][#121055] +- Fixed a bug that occurred when using [`ALTER TABLE`](../v23.2/alter-table.html) to drop and re-add a [`CHECK` constraint](../v23.2/check.html) with the same name. [#121055][#121055] +- [Sequence](../v23.2/create-sequence.html) options `MINVALUE` and `MAXVALUE` automatically adjust to new types bounds. This mirrors the behavior of PostgreSQL. [#121309][#121309] +- Fixed a bug that could prevent timeseries graphs shown on the DB Console SQL Activity [Statement Details](../v23.2/ui-statements-page.html) page from rendering correctly when specifying a custom time range. [#121383][#121383] +- Fixed a bug present since at least v21.1 that could lead to incorrect evaluation of an `IN` expression with: + - [`INT2` or `INT4`](../v23.2/int.html) type on the left side, and + - Values on the right side that are outside of the range of the left side. + + [#121953][#121953] +- Fixed a leak in reported memory usage (not the actual memory usage) by the internal memory accounting system, the limit for which is configured via the [`--max-sql-memory`](../v23.2/cockroach-start.html#flags) flag when a long-running sessions issues hundreds of thousands or more [transactions](../v23.2/transactions.html). This reporting bug could cause `root: memory budget exceeded` errors for other queries. The bug was introduced in v23.1.17 and v23.2.3. [#121950][#121950] +- Fixed a bug introduced in v23.2.4 that could prevent collection of [table statistics](../v23.2/cost-based-optimizer.html#table-statistics) on tables that have on virtual [computed columns](../v23.2/computed-columns.html) of [user-defined type](../v23.2/create-type.html) when the newly-introduced [cluster setting](../v23.2/cluster-settings.html) [`sql.stats.virtual_computed_columns.enabled`](../v23.2/cluster-settings.html#setting-sql-stats-virtual-computed-columns-enabled) is set to `true` (defaults to `false`). The setting was introduced in v23.2.4 and is disabled by default. [#122319][#122319] +- Fixed a bug where a [`GRANT ... ON ALL TABLES`](../v23.2/grant.html) statement could fail if a sequence existed that did not support the [privilege](../v23.2/security-reference/authorization.html#privileges) being granted. [#122034][#122034] +- Fixed an existing bug where an unused value cannot be dropped from an [`ENUM`](../v23.2/enum.html) if the`ENUM` itself is referenced by a [user-defined function](../v23.2/user-defined-functions.html). A value can now be dropped from an`ENUM` as long as the value itself is not being referenced by any other data element, including a user-defined function. [#121237][#121237] + +
    + +

    Contributors

    + +This release includes 79 merged PRs by 33 authors. + +
    + +[#120798]: https://github.com/cockroachdb/cockroach/pull/120798 +[#120923]: https://github.com/cockroachdb/cockroach/pull/120923 +[#121055]: https://github.com/cockroachdb/cockroach/pull/121055 +[#121179]: https://github.com/cockroachdb/cockroach/pull/121179 +[#121235]: https://github.com/cockroachdb/cockroach/pull/121235 +[#121237]: https://github.com/cockroachdb/cockroach/pull/121237 +[#121309]: https://github.com/cockroachdb/cockroach/pull/121309 +[#121383]: https://github.com/cockroachdb/cockroach/pull/121383 +[#121950]: https://github.com/cockroachdb/cockroach/pull/121950 +[#121953]: https://github.com/cockroachdb/cockroach/pull/121953 +[#122034]: https://github.com/cockroachdb/cockroach/pull/122034 +[#122162]: https://github.com/cockroachdb/cockroach/pull/122162 +[#122229]: https://github.com/cockroachdb/cockroach/pull/122229 +[#122300]: https://github.com/cockroachdb/cockroach/pull/122300 +[#122319]: https://github.com/cockroachdb/cockroach/pull/122319 +[#123408]: https://github.com/cockroachdb/cockroach/pull/123408 +[#123596]: https://github.com/cockroachdb/cockroach/pull/123596 +[622cd1c76]: https://github.com/cockroachdb/cockroach/commit/622cd1c76 +[894f152fa]: https://github.com/cockroachdb/cockroach/commit/894f152fa From 779617f2c1f9ef21e2926a7ff9864e653d11b55f Mon Sep 17 00:00:00 2001 From: Florence Morris Date: Wed, 8 May 2024 11:52:51 -0400 Subject: [PATCH 22/25] DOC-10138 v23.1.21 release notes (#18518) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * edited release notes * fixed include of new-release-downloads-docker-image.md * Incorporated Ryan’s feedback. --- src/current/_data/releases.yml | 34 +++++++++++ .../_includes/releases/v23.1/v23.1.21.md | 58 +++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 src/current/_includes/releases/v23.1/v23.1.21.md diff --git a/src/current/_data/releases.yml b/src/current/_data/releases.yml index 00c6ea010f2..506359870ff 100644 --- a/src/current/_data/releases.yml +++ b/src/current/_data/releases.yml @@ -5994,3 +5994,37 @@ docker_arm_limited_access: false source: true previous_release: v23.2.4 + +- release_name: v23.1.21 + major_version: v23.1 + release_date: '2024-05-07' + release_type: Production + go_version: go1.22.0 + sha: fceb4cf5c378bfb53b3cf12c672716168192f1fe + has_sql_only: true + has_sha256sum: true + mac: + mac_arm: true + mac_arm_experimental: true + mac_arm_limited_access: false + windows: true + linux: + linux_arm: true + linux_arm_experimental: false + linux_arm_limited_access: false + linux_intel_fips: true + linux_arm_fips: false + docker: + docker_image: cockroachdb/cockroach + docker_arm: true + docker_arm_experimental: false + docker_arm_limited_access: false + source: true + previous_release: v23.1.20 + cloud_only: True + cloud_only_message_short: 'Available only for select CockroachDB Cloud clusters' + cloud_only_message: > + This version is currently available only for select + CockroachDB Cloud clusters. To request to upgrade + a CockroachDB self-hosted cluster to this version, + [contact support](https://support.cockroachlabs.com/hc/en-us/requests/new). diff --git a/src/current/_includes/releases/v23.1/v23.1.21.md b/src/current/_includes/releases/v23.1/v23.1.21.md new file mode 100644 index 00000000000..fc4d6200ddf --- /dev/null +++ b/src/current/_includes/releases/v23.1/v23.1.21.md @@ -0,0 +1,58 @@ +## v23.1.21 + +Release Date: May 7, 2024 + +{% include releases/new-release-downloads-docker-image.md release=include.release %} + +

    SQL language changes

    + +- The `FORCE_INVERTED_INDEX` hint causes the [optimizer]({% link v23.1/cost-based-optimizer.md %}) to prefer a query plan scan over any [inverted index]({% link v23.1/inverted-indexes.md %}) of the hinted table. An error is emitted if no such query plan can be generated. [#122301][#122301] +- Introduced three new [cluster settings]({% link v23.1/cluster-settings.md %}) for controlling [table statistics]({% link v23.1/cost-based-optimizer.md %}#table-statistics) forecasting: + - [`sql.stats.forecasts.min_observations`]({% link v23.1/cluster-settings.md %}#setting-sql-stats-forecasts-min-observations) is the minimum number of observed statistics required to produce a forecast. + - [`sql.stats.forecasts.min_goodness_of_fit`]({% link v23.1/cluster-settings.md %}#setting-sql-stats-forecasts-min-goodness-of-fit) is the minimum R² (goodness of fit) measurement required from all predictive models to use a forecast. + - [`sql.stats.forecasts.max_decrease`]({% link v23.1/cluster-settings.md %}#setting-sql-stats-forecasts-max-decrease) is the most a prediction can decrease, expressed as the minimum ratio of the prediction to the lowest prior observation. [#122990][#122990] +- Added a [session variable]({% link v23.1/set-vars.md %}) `optimizer_use_improved_multi_column_selectivity_estimate`, which if enabled, causes the [optimizer]({% link v23.1/cost-based-optimizer.md %}) to use an improved selectivity estimate for multi-column predicates. This setting will default to `true` on v24.2 and later, and `false` on prior versions. [#123068][#123068] + +

    Operational changes

    + +- A minimum [Raft scheduler]({% link v23.1/architecture/replication-layer.md %}#raft) concurrency is now enforced per [store]({% link v23.1/architecture/storage-layer.md %}#overview) so that nodes with many stores do not spread workers too thinly. This helps to avoid high scheduler latency across replicas on a store when load is imbalanced. [#120797][#120797] + +

    Bug fixes

    + +- Fixed a bug introduced in v22.2.9 that could cause a slow memory leak that can accumulate when opening many new connections. [#121056][#121056] +- [Sequence]({% link v23.1/create-sequence.md %}) options for `NO MINVALUE` and `NO MAXVALUE` now match [PostgreSQL behavior](https://www.postgresql.org/docs/current/sql-createsequence.html). Sequence `MINVALUE` and `MAXVALUE` now automatically adjust to the bounds of a new integer type in [`ALTER SEQUENCE ... AS`]({% link v23.1/alter-sequence.md %}), matching PostgreSQL behavior. [#121307][#121307] +- Fixed a bug where the [timeseries graphs shown on the **SQL Activity Statement Fingerprint** page]({% link v23.1/ui-statements-page.md %}#charts) in the [DB Console]({% link v23.1/ui-overview.md %}) were not rendering properly. This involved fixing a bug related to setting the time range of the charts. [#121382][#121382] [#122235][#122235] +- Fixed a bug where CockroachDB could incorrectly evaluate `IN` expressions that had `INT2` or `INT4` type on the left side, and values on the right side that were outside the range of the left side. The bug had been present since at least v21.1. [#121955][#121955] +- Previously, on long-running [sessions]({% link v23.1/show-sessions.md %}) that issue many (hundreds of thousands or more) [transactions]({% link v23.1/transactions.md %}), CockroachDB's internal memory accounting system, the limit for which is configured via the [`--max-sql-memory` flag]({% link v23.1/cockroach-start.md %}#general) could leak. This bug, in turn, could result in the error message `"root: memory budget exceeded"` for other queries. The bug was present in v23.1.17 and is now fixed. [#121949][#121949] [#122235][#122235] +- Reintroduced [cluster setting]({% link v23.1/cluster-settings.md %}) `sql.auth.modify_cluster_setting_applies_to_all.enabled` so that mixed-version clusters can migrate off of this setting, which is deprecated in favor of the privilege [`MODIFYSQLCLUSTERSETTING`]({% link v23.1/set-cluster-setting.md %}#required-privileges). [#122055][#122055] [#122635][#122635] +- Fixed a bug where a [`GRANT ... ON ALL TABLES`]({% link v23.1/grant.md %}) statement could fail if sequences existed and they did not support a privilege (e.g., `BACKUP`). [#122057][#122057] +- Fixed a bug where [client certificate authentication]({% link v23.1/authentication.md %}#client-authentication) combined with [identity maps]({% link v23.1/sso-sql.md %}#identity-map-configuration) (`server.identity_map.configuration`) did not work. For the feature to work correctly, the client must specify a valid database user in the [connection string]({% link v23.1/connection-parameters.md %}). This bug had been present since v23.1. [#122746][#122746] +- Statistics forecasts of zero rows can cause suboptimal [query plans]({% link v23.1/cost-based-optimizer.md %}). Forecasting will now avoid predicting zero rows for most downward-trending statistics. [#122990][#122990] + +

    Performance improvements

    + +- More efficient [query plans]({% link v23.1/cost-based-optimizer.md %}) are now generated for queries with text similarity filters, for example, `text_col % 'foobar'`. These plans are generated if the `optimizer_use_trigram_similarity_optimization` [session setting]({% link v23.1/set-vars.md %}) is enabled. It is disabled by default. [#122683][#122683] +- Added a new [session variable]({% link v23.1/set-vars.md %}) `optimizer_use_improved_zigzag_join_costing`. When enabled, the cost of [zigzag joins]({% link v23.1/cost-based-optimizer.md %}#zigzag-joins) is updated so zigzag joins will only be chosen over scans if the zigzag joins produce fewer rows. This change only applies if the session variable `enable_zigzag_join` is also `on`. [#123068][#123068] +- Improved the selectivity estimation of multi-column filters by the [optimizer]({% link v23.1/cost-based-optimizer.md %}) when the multi-column distinct count is high. This avoids cases where CockroachDB significantly over-estimates the selectivity of a multi-column predicate and as a result can prevent the optimizer from choosing a bad query plan. [#123068][#123068] + +

    Contributors

    + +This release includes 59 merged PRs by 26 authors. + +
    + +[#120797]: https://github.com/cockroachdb/cockroach/pull/120797 +[#121056]: https://github.com/cockroachdb/cockroach/pull/121056 +[#121307]: https://github.com/cockroachdb/cockroach/pull/121307 +[#121382]: https://github.com/cockroachdb/cockroach/pull/121382 +[#121949]: https://github.com/cockroachdb/cockroach/pull/121949 +[#121955]: https://github.com/cockroachdb/cockroach/pull/121955 +[#122055]: https://github.com/cockroachdb/cockroach/pull/122055 +[#122057]: https://github.com/cockroachdb/cockroach/pull/122057 +[#122235]: https://github.com/cockroachdb/cockroach/pull/122235 +[#122301]: https://github.com/cockroachdb/cockroach/pull/122301 +[#122635]: https://github.com/cockroachdb/cockroach/pull/122635 +[#122683]: https://github.com/cockroachdb/cockroach/pull/122683 +[#122746]: https://github.com/cockroachdb/cockroach/pull/122746 +[#122990]: https://github.com/cockroachdb/cockroach/pull/122990 +[#123068]: https://github.com/cockroachdb/cockroach/pull/123068 From 79e6e452628404650f42bff51aebded5d76d99fa Mon Sep 17 00:00:00 2001 From: Ryan Kuo <8740013+taroface@users.noreply.github.com> Date: Wed, 8 May 2024 14:44:03 -0400 Subject: [PATCH 23/25] v24.1.0-rc.1 release notes (#18524) * v24.1.0-rc.1 release notes --------- Co-authored-by: Matt Linville --- src/current/_data/releases.yml | 27 +++++++++ .../_includes/releases/v24.1/v24.1.0-rc.1.md | 55 +++++++++++++++++++ .../cockroachcloud/upgrade-to-v24.1.md | 2 +- 3 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 src/current/_includes/releases/v24.1/v24.1.0-rc.1.md diff --git a/src/current/_data/releases.yml b/src/current/_data/releases.yml index 506359870ff..2374ee8d9fa 100644 --- a/src/current/_data/releases.yml +++ b/src/current/_data/releases.yml @@ -6028,3 +6028,30 @@ CockroachDB Cloud clusters. To request to upgrade a CockroachDB self-hosted cluster to this version, [contact support](https://support.cockroachlabs.com/hc/en-us/requests/new). + +- release_name: v24.1.0-rc.1 + major_version: v24.1 + release_date: '2024-05-08' + release_type: Testing + go_version: go1.22.0 + sha: 6205244e922606f85761dad2137b842f43a53716 + has_sql_only: true + has_sha256sum: true + mac: + mac_arm: true + mac_arm_experimental: true + mac_arm_limited_access: true + windows: true + linux: + linux_arm: true + linux_arm_experimental: false + linux_arm_limited_access: false + linux_intel_fips: true + linux_arm_fips: false + docker: + docker_image: cockroachdb/cockroach-unstable + docker_arm: true + docker_arm_experimental: false + docker_arm_limited_access: false + source: true + previous_release: v24.1.0-beta.3 diff --git a/src/current/_includes/releases/v24.1/v24.1.0-rc.1.md b/src/current/_includes/releases/v24.1/v24.1.0-rc.1.md new file mode 100644 index 00000000000..60a8d9c6d64 --- /dev/null +++ b/src/current/_includes/releases/v24.1/v24.1.0-rc.1.md @@ -0,0 +1,55 @@ +## v24.1.0-rc.1 + +Release Date: May 8, 2024 + +{% include releases/new-release-downloads-docker-image.md release=include.release %} + +

    SQL language changes

    + +- Added a new [session setting]({% link v24.1/session-variables.md %}) `optimizer_use_improved_multi_column_selectivity_estimate`, which if enabled, causes the [optimizer]({% link v24.1/cost-based-optimizer.md %}) to use an improved selectivity estimate for multi-column predicates. This setting will default to `true` on v24.2 and later, and `false` on earlier versions. [#123106][#123106] + +

    Operational changes

    + +- Added two new [metrics]({% link v24.1/metrics.md %}): `range.snapshots.upreplication.rcvd-bytes` counts the number of [Raft]({% link v24.1/architecture/replication-layer.md %}#raft) recovery snapshot bytes received, and `range.snapshots.upreplication.sent-bytes` counts the number of Raft recovery snapshot bytes sent. Also updated `range.snapshots.recovery.rcvd-bytes` and `range.snapshots.recovery.sent-bytes` to only include Raft snapshots. A new line was added to the [**Snapshot Data Received**]({% link v24.1/ui-replication-dashboard.md %}#snapshot-data-received) graph. [#123055][#123055] + +

    DB Console changes

    + +- Added a **Replication Lag** graph to the [**Physical Cluster Replication**]({% link v24.1/physical-cluster-replication-monitoring.md %}) dashboard to measure replication lag between primary and standby clusters using [physical cluster replication]({% link v24.1/physical-cluster-replication-overview.md %}). [#123285][#123285] + +

    Bug fixes

    + +- Fixed a bug that caused the [**Tables**]({% link v24.1/ui-databases-page.md %}#tables-view) and [**Table Details**]({% link v24.1/ui-databases-page.md %}#table-details) pages in the DB Console to display an incorrect value for **Table Stats Last Updated**. [#122816][#122816] +- Fixed a bug in the DB Console's [**Custom Chart**]({% link v24.1/ui-custom-chart-debug-page.md %}) tool where store-level metrics were displayed only for the first store ID associated with the node. Now data is displayed for all stores present on a node, and a single time series is shown for each store, rather than an aggregated value for all of the node's stores. This allows finer-grained monitoring of store-level metrics. [#122705][#122705] +- Fixed a bug introduced in v22.2 that could cause the internal error `attempting to append refresh spans after the tracked timestamp has moved forward` in some edge cases. [#123136][#123136] +- Fixed a bug where a `TYPEDESC SCHEMA CHANGE` job could retry forever if the descriptor it targeted was already dropped. [#123273][#123273] +- Fixed a bug where, if the legacy schema changer was enabled, the [`CREATE SEQUENCE`]({% link v24.1/create-sequence.md %}) command would incorrectly require the user to have the `CREATE` [privilege]({% link v24.1/security-reference/authorization.md %}#privileges) on the parent database rather than only on the parent schema.[#123289][#123289] +- Fixed a bug where a [job]({% link v24.1/show-jobs.md %}) would fail if it reported an out-of-bound progress fraction. The error is now logged and no longer causes the job to fail. [#122965][#122965] + +

    Performance improvements

    + +- Added a new [session setting]({% link v24.1/session-variables.md %}) `optimizer_use_improved_zigzag_join_costing`. When enabled and when the [cluster setting]({% link v24.1/cluster-settings.md %}) `enable_zigzag_join` is also enabled, the cost of zigzag joins is updated such that a zigzag join will be chosen over a scan only if it produces fewer rows than a scan.[#123106][#123106] +- Improved the selectivity estimation of multi-column filters when the multi-column distinct count is high. This prevents the [optimizer]({% link v24.1/cost-based-optimizer.md %}) from choosing a bad query plan due to over-estimating the selectivity of a multi-column predicate. [#123106][#123106] +- Improved the efficiency of error handling in the [vectorized execution engine]({% link v24.1/vectorized-execution.md %}), to reduce the CPU overhead of statement timeout handling and reduce the potential for more statement timeouts. [#123501][#123501] +- Disabled a poorly-performing [changefeed]({% link v24.1/change-data-capture-overview.md %}) optimization that was intended to reduce duplicates during aggregator restarts. [#123597][#123597] + +
    + +

    Contributors

    + +This release includes 57 merged PRs by 24 authors. + +
    + +[#122705]: https://github.com/cockroachdb/cockroach/pull/122705 +[#122816]: https://github.com/cockroachdb/cockroach/pull/122816 +[#122965]: https://github.com/cockroachdb/cockroach/pull/122965 +[#123055]: https://github.com/cockroachdb/cockroach/pull/123055 +[#123106]: https://github.com/cockroachdb/cockroach/pull/123106 +[#123136]: https://github.com/cockroachdb/cockroach/pull/123136 +[#123144]: https://github.com/cockroachdb/cockroach/pull/123144 +[#123273]: https://github.com/cockroachdb/cockroach/pull/123273 +[#123285]: https://github.com/cockroachdb/cockroach/pull/123285 +[#123289]: https://github.com/cockroachdb/cockroach/pull/123289 +[#123373]: https://github.com/cockroachdb/cockroach/pull/123373 +[#123501]: https://github.com/cockroachdb/cockroach/pull/123501 +[#123597]: https://github.com/cockroachdb/cockroach/pull/123597 diff --git a/src/current/cockroachcloud/upgrade-to-v24.1.md b/src/current/cockroachcloud/upgrade-to-v24.1.md index 39d4f3516f7..ff894212a60 100644 --- a/src/current/cockroachcloud/upgrade-to-v24.1.md +++ b/src/current/cockroachcloud/upgrade-to-v24.1.md @@ -6,7 +6,7 @@ docs_area: manage page_version: v24.1 prev_version: v23.2 pre_production_preview: true -pre_production_preview_version: v24.1.0-beta.1 +pre_production_preview_version: v24.1.0-rc.1 --- {% if page.pre_production_preview == true %} From 4cd09045eee95fbed4eb4ee3c39e6ea83503e682 Mon Sep 17 00:00:00 2001 From: Ryan Kuo <8740013+taroface@users.noreply.github.com> Date: Wed, 8 May 2024 17:27:48 -0400 Subject: [PATCH 24/25] updates to UDF, stored procs, and PL/pgSQL functionality (#18495) * UDfs support DEFAULT values * EXIT labels; WHEN conditions; minor rephrasing * PL/pgSQL nested blocks * OUT/INOUT params; routines calling routines * add STRICT clause for SELECT INTO and RETURNING INTO * explicit transactions within PL/pgSQL stored procs * update feature limitations --- .../plpgsql-feature-limitations.md | 10 +- .../udf-stored-proc-limitations.md | 2 +- .../_includes/v24.1/misc/session-vars.md | 1 + src/current/v23.2/set-transaction.md | 2 +- src/current/v24.1/create-function.md | 76 +++++++ src/current/v24.1/create-procedure.md | 61 ++++++ src/current/v24.1/default-value.md | 4 +- src/current/v24.1/plpgsql.md | 190 ++++++++++++++++-- src/current/v24.1/set-transaction.md | 2 +- src/current/v24.1/stored-procedures.md | 1 + src/current/v24.1/user-defined-functions.md | 6 +- 11 files changed, 326 insertions(+), 29 deletions(-) diff --git a/src/current/_includes/v24.1/known-limitations/plpgsql-feature-limitations.md b/src/current/_includes/v24.1/known-limitations/plpgsql-feature-limitations.md index 076b86d0aa5..953bb475587 100644 --- a/src/current/_includes/v24.1/known-limitations/plpgsql-feature-limitations.md +++ b/src/current/_includes/v24.1/known-limitations/plpgsql-feature-limitations.md @@ -1,10 +1,8 @@ -- PL/pgSQL blocks cannot be nested. [#114775](https://github.com/cockroachdb/cockroach/issues/114775) - PL/pgSQL arguments cannot be referenced with ordinals (e.g., `$1`, `$2`). [#114701](https://github.com/cockroachdb/cockroach/issues/114701) -- `FOR` loops, including `FOR` cursor loops, `FOR` query loops, and `FOREACH` loops, are not supported. [#105246](https://github.com/cockroachdb/cockroach/issues/105246) -- `RETURN NEXT` and `RETURN QUERY` statements are not supported. [#117744](https://github.com/cockroachdb/cockroach/issues/117744) -- `EXIT` and `CONTINUE` labels and conditions are not supported. [#115271](https://github.com/cockroachdb/cockroach/issues/115271) -- `CASE` statements are not supported. [#117744](https://github.com/cockroachdb/cockroach/issues/117744) -- `PERFORM`, `EXECUTE`, `GET DIAGNOSTICS`, and `NULL` statements are not supported for PL/pgSQL. [#117744](https://github.com/cockroachdb/cockroach/issues/117744) +- The following statements are not supported: + - `FOR` loops, including `FOR` cursor loops, `FOR` query loops, and `FOREACH` loops. [#105246](https://github.com/cockroachdb/cockroach/issues/105246) + - `RETURN NEXT` and `RETURN QUERY`. [#117744](https://github.com/cockroachdb/cockroach/issues/117744) + - `PERFORM`, `EXECUTE`, `GET DIAGNOSTICS`, and `CASE`. [#117744](https://github.com/cockroachdb/cockroach/issues/117744) - PL/pgSQL exception blocks cannot catch [transaction retry errors]({% link {{ page.version.version }}/transaction-retry-error-reference.md %}). [#111446](https://github.com/cockroachdb/cockroach/issues/111446) - `RAISE` statements cannot be annotated with names of schema objects related to the error (i.e., using `COLUMN`, `CONSTRAINT`, `DATATYPE`, `TABLE`, or `SCHEMA`). [#106237](https://github.com/cockroachdb/cockroach/issues/106237) - `RAISE` statements message the client directly, and do not produce log output. [#117750](https://github.com/cockroachdb/cockroach/issues/117750) diff --git a/src/current/_includes/v24.1/known-limitations/udf-stored-proc-limitations.md b/src/current/_includes/v24.1/known-limitations/udf-stored-proc-limitations.md index 120ddc3b95f..0ff2a43cd90 100644 --- a/src/current/_includes/v24.1/known-limitations/udf-stored-proc-limitations.md +++ b/src/current/_includes/v24.1/known-limitations/udf-stored-proc-limitations.md @@ -2,7 +2,7 @@ - User-defined functions are not currently supported in: - Expressions (column, index, constraint) in tables. [#87699](https://github.com/cockroachdb/cockroach/issues/87699) - Views. [#87699](https://github.com/cockroachdb/cockroach/issues/87699) - - Other user-defined functions. [#93049](https://github.com/cockroachdb/cockroach/issues/93049) +- User-defined functions cannot call themselves recursively. [#93049](https://github.com/cockroachdb/cockroach/issues/93049) - [Common table expressions]({% link {{ page.version.version }}/common-table-expressions.md %}) (CTE), recursive or non-recursive, are not supported in [user-defined functions]({% link {{ page.version.version }}/user-defined-functions.md %}) (UDF). That is, you cannot use a `WITH` clause in the body of a UDF. [#92961](https://github.com/cockroachdb/cockroach/issues/92961) - The `setval` function cannot be resolved when used inside UDF bodies. [#110860](https://github.com/cockroachdb/cockroach/issues/110860) {% endif %} diff --git a/src/current/_includes/v24.1/misc/session-vars.md b/src/current/_includes/v24.1/misc/session-vars.md index 4ba32c59e3e..a8be2430bcd 100644 --- a/src/current/_includes/v24.1/misc/session-vars.md +++ b/src/current/_includes/v24.1/misc/session-vars.md @@ -51,6 +51,7 @@ | `optimizer_use_lock_op_for_serializable` | If `on`, the optimizer uses a `Lock` operator to construct query plans for `SELECT` statements using the [`FOR UPDATE` and `FOR SHARE`]({% link {{ page.version.version }}/select-for-update.md %}) clauses. This setting only affects `SERIALIZABLE` transactions. `READ COMMITTED` transactions are evaluated with the `Lock` operator regardless of the setting. | `off` | Yes | Yes | | `optimizer_use_multicol_stats` | If `on`, the optimizer uses collected multi-column statistics for cardinality estimation. | `on` | No | Yes | | `optimizer_use_not_visible_indexes` | If `on`, the optimizer uses not visible indexes for planning. | `off` | No | Yes | +| `plpgsql_use_strict_into` | If `on`, PL/pgSQL [`SELECT ... INTO` and `RETURNING ... INTO` statements]({% link {{ page.version.version }}/plpgsql.md %}#assign-a-result-to-a-variable) behave as though the `STRICT` option is specified. This causes the SQL statement to error if it does not return exactly one row. | `off` | Yes | Yes | | `pg_trgm.similarity_threshold` | The threshold above which a [`%`]({% link {{ page.version.version }}/functions-and-operators.md %}#operators) string comparison returns `true`. The value must be between `0` and `1`. For more information, see [Trigram Indexes]({% link {{ page.version.version }}/trigram-indexes.md %}). | `0.3` | Yes | Yes | | `prefer_lookup_joins_for_fks` | If `on`, the optimizer prefers [`lookup joins`]({% link {{ page.version.version }}/joins.md %}#lookup-joins) to [`merge joins`]({% link {{ page.version.version }}/joins.md %}#merge-joins) when performing [`foreign key`]({% link {{ page.version.version }}/foreign-key.md %}) checks. | `off` | Yes | Yes | | `reorder_joins_limit` | Maximum number of joins that the optimizer will attempt to reorder when searching for an optimal query execution plan.

    For more information, see [Join reordering]({% link {{ page.version.version }}/cost-based-optimizer.md %}#join-reordering). | `8` | Yes | Yes | diff --git a/src/current/v23.2/set-transaction.md b/src/current/v23.2/set-transaction.md index b957aefaa04..c7794ae9451 100644 --- a/src/current/v23.2/set-transaction.md +++ b/src/current/v23.2/set-transaction.md @@ -5,7 +5,7 @@ toc: true docs_area: reference.sql --- -The `SET TRANSACTION` [statement]({% link {{ page.version.version }}/sql-statements.md %}) sets the transaction priority, access mode, and "as of" timestamp after you [`BEGIN`]({% link {{ page.version.version }}/begin-transaction.md %}) it but before executing the first statement that manipulates a database. +The `SET TRANSACTION` [statement]({% link {{ page.version.version }}/sql-statements.md %}) sets the transaction priority, access mode, "as of" timestamp, and isolation level. These are applied after you [`BEGIN`]({% link {{ page.version.version }}/begin-transaction.md %}) the transaction and before executing the first statement that manipulates a database. {{site.data.alerts.callout_info}} {% include {{ page.version.version }}/sql/use-the-default-transaction-priority.md %} diff --git a/src/current/v24.1/create-function.md b/src/current/v24.1/create-function.md index f88e368119d..11a00b5d8fc 100644 --- a/src/current/v24.1/create-function.md +++ b/src/current/v24.1/create-function.md @@ -194,6 +194,82 @@ SELECT last_rider(); (1 row) ~~~ +### Create a function that uses `OUT` and `INOUT` parameters + +The following statement uses a combination of `OUT` and `INOUT` parameters to modify a provided value and output the result. An `OUT` parameter returns a value, while an `INOUT` parameter passes an input value and returns a value. + +{% include_cached copy-clipboard.html %} +~~~ sql +CREATE OR REPLACE FUNCTION double_triple(INOUT double INT, OUT triple INT) AS + $$ + BEGIN + double := double * 2; + triple := double * 3; + END; + $$ LANGUAGE PLpgSQL; +~~~ + +{% include_cached copy-clipboard.html %} +~~~ sql +SELECT double_triple(1); +~~~ + +~~~ + double_triple +----------------- + (2,6) +~~~ + +The `CREATE FUNCTION` statement does not need a `RETURN` statement because this is added implicitly for a function with `OUT` parameters: + +{% include_cached copy-clipboard.html %} +~~~ sql +SHOW CREATE FUNCTION double_triple; +~~~ + +~~~ + function_name | create_statement +----------------+--------------------------------------------------------------------------- + double_triple | CREATE FUNCTION public.double_triple(INOUT double INT8, OUT triple INT8) + | RETURNS RECORD + | VOLATILE + | NOT LEAKPROOF + | CALLED ON NULL INPUT + | LANGUAGE plpgsql + | AS $$ + | BEGIN + | double := double * 2; + | triple := double * 3; + | END; + | $$ +~~~ + +### Create a function that invokes a function + +The following statement defines a function that invokes the [`double_triple` example function](#create-a-function-that-uses-out-and-inout-parameters). + +{% include_cached copy-clipboard.html %} +~~~ sql +CREATE OR REPLACE FUNCTION f(input_value INT) + RETURNS RECORD + AS $$ + BEGIN + RETURN double_triple(input_value); + END; + $$ LANGUAGE PLpgSQL; +~~~ + +{% include_cached copy-clipboard.html %} +~~~ sql +SELECT f(1); +~~~ + +~~~ + f +--------- + (2,6) +~~~ + ### Create a function that uses a loop {% include {{ page.version.version }}/sql/udf-plpgsql-example.md %} diff --git a/src/current/v24.1/create-procedure.md b/src/current/v24.1/create-procedure.md index 767ca831ed7..7bdf233dd02 100644 --- a/src/current/v24.1/create-procedure.md +++ b/src/current/v24.1/create-procedure.md @@ -68,6 +68,67 @@ NOTICE: (1,foo) CALL ~~~ +### Create a stored procedure that uses `OUT` and `INOUT` parameters + +The following example uses a combination of `OUT` and `INOUT` parameters to modify a provided value and output the result. An `OUT` parameter returns a value, while an `INOUT` parameter passes an input value and returns a value. + +{% include_cached copy-clipboard.html %} +~~~ sql +CREATE OR REPLACE PROCEDURE double_triple(INOUT double INT, OUT triple INT) AS + $$ + BEGIN + double := double * 2; + triple := double * 3; + END; + $$ LANGUAGE PLpgSQL; +~~~ + +When calling a procedure, you need to supply placeholder values for any `OUT` parameters. A `NULL` value is commonly used. When [calling a procedure from another routine](#create-a-stored-procedure-that-calls-a-procedure), you should declare variables that will store the results of the `OUT` parameters. + +{% include_cached copy-clipboard.html %} +~~~ sql +CALL double_triple(1, NULL); +~~~ + +~~~ + double | triple +---------+--------- + 2 | 6 +~~~ + +### Create a stored procedure that calls a procedure + +The following example defines a procedure that calls the [`double_triple` example procedure](#create-a-stored-procedure-that-uses-out-and-inout-parameters). The `triple_result` variable is assigned the result of the `OUT` parameter, while the `double_input` variable both provides the input and stores the result of the `INOUT` parameter. + +{{site.data.alerts.callout_info}} +A procedure with `OUT` parameters can only be [called from a PL/pgSQL routine]({% link {{ page.version.version }}/plpgsql.md %}#call-a-procedure). +{{site.data.alerts.end}} + +{% include_cached copy-clipboard.html %} +~~~ sql +CREATE OR REPLACE PROCEDURE p(double_input INT) AS + $$ + DECLARE + triple_result INT; + BEGIN + CALL double_triple(double_input, triple_result); + RAISE NOTICE 'Doubled value: %', double_input; + RAISE NOTICE 'Tripled value: %', triple_result; + END + $$ LANGUAGE PLpgSQL; +~~~ + +{% include_cached copy-clipboard.html %} +~~~ sql +CALL p(1); +~~~ + +~~~ +NOTICE: Doubled value: 2 +NOTICE: Tripled value: 6 +CALL +~~~ + ### Create a stored procedure that uses conditional logic The following example uses [PL/pgSQL conditional statements]({% link {{ page.version.version }}/plpgsql.md %}#write-conditional-statements): diff --git a/src/current/v24.1/default-value.md b/src/current/v24.1/default-value.md index fbb7fb2db08..61cdbed5a66 100644 --- a/src/current/v24.1/default-value.md +++ b/src/current/v24.1/default-value.md @@ -1,6 +1,6 @@ --- title: Default Value Constraint -summary: The Default Value constraint specifies a value to populate a column with if none is provided. +summary: The DEFAULT constraint specifies a value to populate a column with if none is provided. toc: true docs_area: reference.sql --- @@ -9,7 +9,7 @@ The `DEFAULT` value [constraint]({% link {{ page.version.version }}/constraints. ## Details -- The [data type]({% link {{ page.version.version }}/data-types.md %}) of the Default Value must be the same as the data type of the column. +- The [data type]({% link {{ page.version.version }}/data-types.md %}) of the `DEFAULT` value must be the same as the data type of the column. - The `DEFAULT` value constraint only applies if the column does not have a value specified in the [`INSERT`]({% link {{ page.version.version }}/insert.md %}) statement. You can still insert a `NULL` into an optional (nullable) column by explicitly inserting `NULL`. For example, `INSERT INTO foo VALUES (1, NULL);`. ## Syntax diff --git a/src/current/v24.1/plpgsql.md b/src/current/v24.1/plpgsql.md index 82b1b176f0d..3985eed1480 100644 --- a/src/current/v24.1/plpgsql.md +++ b/src/current/v24.1/plpgsql.md @@ -40,6 +40,23 @@ At the highest level, a PL/pgSQL block looks like the following: END ~~~ +PL/pgSQL blocks can be nested. An optional label can be placed above each block. Block labels can be targeted by [`EXIT` statements](#exit-and-continue-statements). + +~~~ sql +[ <> ] + [ DECLARE + declarations ] + BEGIN + statements + [ <> ] + [ DECLARE + declarations ] + BEGIN + statements + END; + END +~~~ + When you create a function or procedure, you can enclose the entire PL/pgSQL block in dollar quotes (`$$`). Dollar quotes are not required, but are easier to use than single quotes, which require that you escape other single quotes that are within the function or procedure body. {% include_cached copy-clipboard.html %} @@ -61,8 +78,7 @@ For complete examples, see [Create a user-defined function using PL/pgSQL](#crea ### Declare a variable -`DECLARE` specifies all variable definitions that are used in the function or procedure body. - +`DECLARE` specifies all variable definitions that are used in a block. ~~~ sql DECLARE variable_name [ CONSTANT ] data_type [ := expression ]; @@ -71,7 +87,7 @@ DECLARE - `variable_name` is an arbitrary variable name. - `data_type` can be a supported [SQL data type]({% link {{ page.version.version }}/data-types.md %}), [user-defined type]({% link {{ page.version.version }}/create-type.md %}), or the PL/pgSQL `REFCURSOR` type, when declaring [cursor](#declare-cursor-variables) variables. - `CONSTANT` specifies that the variable cannot be [reassigned](#assign-a-result-to-a-variable), ensuring that its value remains constant within the block. -- `expression` is an [expression](https://www.postgresql.org/docs/16/plpgsql-expressions.html) that provides an optional default value for the variable. +- `expression` is an [expression](https://www.postgresql.org/docs/16/plpgsql-expressions.html) that provides an optional default value for the variable. Default values are evaluated every time a block is entered in a function or procedure. For example: @@ -105,14 +121,14 @@ For information about opening and using cursors, see [Open and use cursors](#ope ### Assign a result to a variable -Use the PL/pgSQL `INTO` clause to assign a result of a [`SELECT`]({% link {{ page.version.version }}/select-clause.md %}) or mutation ([`INSERT`]({% link {{ page.version.version }}/insert.md %}), [`UPDATE`]({% link {{ page.version.version }}/update.md %}), [`DELETE`]({% link {{ page.version.version }}/delete.md %})) statement to a specified variable: +Use the PL/pgSQL `INTO` clause to assign a result of a [`SELECT`]({% link {{ page.version.version }}/select-clause.md %}) or mutation ([`INSERT`]({% link {{ page.version.version }}/insert.md %}), [`UPDATE`]({% link {{ page.version.version }}/update.md %}), [`DELETE`]({% link {{ page.version.version }}/delete.md %})) statement to a specified variable. The optional `STRICT` clause specifies that the statement must return exactly one row; otherwise, the function or procedure will error. This behavior can be enabled by default using the [`plpgsql_use_strict_into`]({% link {{ page.version.version }}/session-variables.md %}#plpgsql-use-strict-into) session setting. ~~~ sql -SELECT expression INTO target FROM ...; +SELECT expression INTO [ STRICT ] target FROM ...; ~~~ ~~~ sql -[ INSERT | UPDATE | DELETE ] ... RETURNING expression INTO target; +[ INSERT | UPDATE | DELETE ] ... RETURNING expression INTO [ STRICT ] target; ~~~ - `expression` is an [expression](https://www.postgresql.org/docs/16/plpgsql-expressions.html) that defines the result to be assigned to the variable. @@ -146,7 +162,7 @@ NOTICE: New Row: 2 CALL ~~~ -The following [user-defined function]({% link {{ page.version.version }}/user-defined-functions.md %}) uses the `max()` [built-in function]({% link {{ page.version.version }}/functions-and-operators.md %}#aggregate-functions) to find the maximum `col` value in table `t`, and assigns the result to `i`. +The following [user-defined function]({% link {{ page.version.version }}/user-defined-functions.md %}) uses the `max` [built-in function]({% link {{ page.version.version }}/functions-and-operators.md %}#aggregate-functions) to find the maximum `col` value in table `t`, and assigns the result to `i`. {% include_cached copy-clipboard.html %} ~~~ sql @@ -218,7 +234,7 @@ For usage examples of conditional statements, see [Examples](#examples). ### Write loops -Use looping syntax to repeatedly execute statements. +Write a loop to repeatedly execute statements. On its own, `LOOP` executes statements infinitely. @@ -238,25 +254,59 @@ WHILE condition LOOP For an example, see [Create a stored procedure that uses a `WHILE` loop]({% link {{ page.version.version }}/create-procedure.md %}#create-a-stored-procedure-that-uses-a-while-loop). -Add an `EXIT` statement to end a `LOOP` or `WHILE` statement block. This should be combined with a [conditional statement](#write-conditional-statements). +### `EXIT` and `CONTINUE` statements + +Add an `EXIT` statement to end a [loop](#write-loops). An `EXIT` statement can be combined with an optional `WHEN` boolean condition. ~~~ sql LOOP statements; - IF condition THEN - EXIT; - END IF; + EXIT [ WHEN condition ]; END LOOP; ~~~ -Add a `CONTINUE` statement to end a `LOOP` or `WHILE` statement block, skipping any statements below `CONTINUE`, and begin the next iteration of the loop. This should be combined with a [conditional statement](#write-conditional-statements). In the following example, if the `IF` condition is met, then `CONTINUE` causes the loop to skip the second block of statements and begin again. +Add a label to an `EXIT` statement to target a block that has a matching label. An `EXIT` statement with a label can target either a loop or a [block](#structure). An `EXIT` statement inside a block must have a label. + +The following `EXIT` statement will end the `label` block before the statements are executed. + +~~~ sql +BEGIN + <

    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 #(ILLfeu@1$Y~ODxD$O^=Z=x% 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 Ll_!OdO#S~K`Uq|@ literal 255261 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®_6d7yy#<9Y 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 Date: Tue, 30 Apr 2024 13:24:15 -0400 Subject: [PATCH 06/25] DOC-9654 PR #118850 - server: enable continuous CPU profiler (#18492) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * (1) In automatic-cpu-profiler.md, (a) remove note and warnings, (b) update default values for server.cpu_profile.cpu_usage_combined_threshold and server.cpu_profile.interval, (c) removed recommended values column and section, (d) changed values in high-water mark threshold section to match default values, (e) removed mention to consult support. * Incorporated Aaditya’s feedback. * Incorporated Ryan’s feedback. --- src/current/v24.1/automatic-cpu-profiler.md | 52 ++++++--------------- 1 file changed, 13 insertions(+), 39 deletions(-) diff --git a/src/current/v24.1/automatic-cpu-profiler.md b/src/current/v24.1/automatic-cpu-profiler.md index abb173e88d5..1bdcde8af51 100644 --- a/src/current/v24.1/automatic-cpu-profiler.md +++ b/src/current/v24.1/automatic-cpu-profiler.md @@ -8,42 +8,28 @@ docs_area: manage This feature automatically captures CPU profiles, which can make it easier to investigate and troubleshoot spikes in CPU usage or erratic CPU load on certain nodes. A CPU profile shows the functions that use the most CPU time, sampled over a window of time. You can collect a CPU Profile manually on the [Advanced Debug page]({% link {{ page.version.version }}/ui-debug-pages.md %}). However, it may be difficult to manually capture a profile of a short CPU spike at the right point in time. Automatic CPU profile capture enables the investigation of CPU load in this and other cases, such as periodic high CPU. -{{site.data.alerts.callout_danger}} -We strongly recommend only using the Automatic CPU Profiler when working directly with the [Cockroach Labs support team]({% link {{ page.version.version }}/support-resources.md %}). -{{site.data.alerts.end}} - ## Configuration You can configure automatic CPU profile capture with the following [cluster settings]({% link {{ page.version.version }}/cluster-settings.md %}): -Cluster Setting | Description | Default Value | Recommended Value -----------------|-------------|---------------|------------------ -`server.cpu_profile.cpu_usage_combined_threshold` | The baseline value for when CPU profiles should be taken. Collect profiles from each node that meets threshold. This setting enables and disables automatic cpu profiling.

&PMheHvJDoce<}^RJ037Q?Zcp4{ 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