From 04a36f8ac8d96699fef633635ba8e498dbbb1d69 Mon Sep 17 00:00:00 2001 From: Aishwarya Chakravarthy Date: Fri, 13 Sep 2024 13:22:15 -0400 Subject: [PATCH] [DOC-444] [2.23] Lightweight DB clone (#23515) * diagram pending * landing page * some edits and yugabyted equivalent * Apply suggestions from code review Co-authored-by: Dwight Hodge <79169168+ddhodge@users.noreply.github.com> * updates from review * added limitations * Apply suggestions from code review Co-authored-by: Dwight Hodge <79169168+ddhodge@users.noreply.github.com> * changes from review * minor edits * added extra detail and yugabyted commands * expanded the example as per suggesstions * renamed file * review comments --------- Co-authored-by: Dwight Hodge <79169168+ddhodge@users.noreply.github.com> Co-authored-by: Dwight Hodge --- .../preview/manage/backup-restore/_index.md | 6 + .../backup-restore/instant-db-cloning.md | 290 ++++++++++++++++++ .../images/manage/backup-restore/db-clone.png | Bin 0 -> 36545 bytes 3 files changed, 296 insertions(+) create mode 100644 docs/content/preview/manage/backup-restore/instant-db-cloning.md create mode 100644 docs/static/images/manage/backup-restore/db-clone.png diff --git a/docs/content/preview/manage/backup-restore/_index.md b/docs/content/preview/manage/backup-restore/_index.md index ea98923f63e3..23fcf4b2be8d 100644 --- a/docs/content/preview/manage/backup-restore/_index.md +++ b/docs/content/preview/manage/backup-restore/_index.md @@ -55,4 +55,10 @@ In some circumstances, a backup can fail during high DDL activity. Avoid perform href="point-in-time-recovery/" icon="fa-light fa-timeline-arrow">}} + {{}} + {{}} diff --git a/docs/content/preview/manage/backup-restore/instant-db-cloning.md b/docs/content/preview/manage/backup-restore/instant-db-cloning.md new file mode 100644 index 000000000000..e7234ac2574d --- /dev/null +++ b/docs/content/preview/manage/backup-restore/instant-db-cloning.md @@ -0,0 +1,290 @@ +--- +title: Instant database cloning +headerTitle: Instant database cloning +linkTitle: Instant database cloning +description: Clone your database in YugabyteDB for data recovery, development, and testing. +badges: tp +menu: + preview: + identifier: instant-db-clone + parent: backup-restore + weight: 706 +type: docs +--- + +Instant database cloning in YugabyteDB allows you to quickly create a zero-copy, independent writable clone of your database that can be used for data recovery, development, and testing. Cloning is both fast and efficient because when initially created, it shares the same data files with the original database. Subsequently, as data is written to the clone, the clone stores its own changes as separate and independent delta files. Although they physically share some files, the two databases are logically isolated, which means you can freely play with the clone database, perform DDLs, read and write data, and delete it without affecting the original database. + +You can create clones as of now, or as of any time in the recent past, within a configurable history retention period. This is particularly useful for data recovery from user or application errors. + +![Database clone](/images/manage/backup-restore/db-clone.png) + +Cloning has two main use cases: + +- Data recovery. To recover from data loss due to user error (for example, accidentally dropping a table) or application error (for example, updating rows with corrupted data), you can create a clone of your production database from a point in time when the database was in a good state. This allows you to perform forensic analysis, export the lost or corrupted data from the clone, and import it back to the original database. For instance, if you dropped a table by mistake at 9:01, then detected this error at 10.45, you want to recover the lost data as it was at 9:00 (just before the table drop). At the same time, you don't want to lose any new data added to other tables between 9:01 and 10:45. With database cloning, you can create a clone of the database as of 9:00 (before the table drop) and copy the data in the table from the cloned database to the production database. + +- Development and testing. Because the two databases are completely isolated, you can experiment with the cloned database, perform DDL operations, read and write data, and delete the clone without impacting the original. Developers can test their changes on an identical copy of the production database without affecting its performance. + +## Enable database cloning + +To enable database cloning in a cluster, set the yb-master flag `enable_db_clone` to true. Because cloning is in {{}}, you must also add the `enable_db_clone` flag to the [allowed_preview_flags_csv](../../../reference/configuration/yb-master/#allowed-preview-flags-csv) list. + +For example, to set these flags when creating a cluster using yugabyted, use the `--master_flags` option of the [start](../../../reference/configuration/yugabyted/#start) command as follows: + +```sh +--master_flags "allowed_preview_flags_csv={enable_db_clone},enable_db_clone=true" +``` + +You can also set the runtime flags while the yb-master process is running using the yb-ts-cli [set_flag](../../../admin/yb-ts-cli/#set-flag) command as follows: + +```sh +./bin/yb-ts-cli --server-address=master_host:7100 set_flag allowed_preview_flags_csv enable_db_clone +./bin/yb-ts-cli --server-address=127.0.0.1:7100 set_flag enable_db_clone true +``` + +## Clone databases + +### Prerequisites + +- [Create a snapshot schedule](../../../manage/backup-restore/point-in-time-recovery/#create-a-schedule) for the database you want to clone. + + For example, creating a snapshot schedule with retention period of 7 days allows you to create a clone of the original database to any time in the past 7 days. + +- You have to trust local YSQL connections (that use UNIX domain sockets) in the [host-based authentication](../../../secure/authentication/host-based-authentication/). You have to do this for all YB-TServers in the cluster. You can do this when starting the YB-TServer process by adding the authentication line `local all all trust` to the [ysql_hba_conf_csv](../../../reference/configuration/yb-tserver/#ysql-hba-conf-csv) flag. + + For example, if you are using yugabyted you can use the `--tserver_flags` option of the `start` command as follows: + + ```sh + --tserver_flags "ysql_hba_conf_csv={host all all 0.0.0.0/0 trust,local all all trust}" + ``` + +{{}} +Do not override your default host-based authentication rules when trusting the local connection. You may need to add additional authentication lines to `ysql_hba_conf_csv` based on your specific configuration. For more information, see [host-based authentication](../../../secure/authentication/host-based-authentication/). +{{}} + +### Clone a YSQL database + +Because YugabyteDB is PostgreSQL compatible, you can create a database as a clone of another using the `TEMPLATE` SQL option of `CREATE DATABASE` command as follows: + +```sql +CREATE DATABASE clone_db TEMPLATE original_db; +``` + +In this example, `clone_db` is created as a clone of `original_db`, and contains the latest schema and data of `original_db` as of current time. + +To create a clone of the original database at a specific point in time (within the history retention period specified when creating the snapshot schedule), you can specify the [Unix timestamp](https://www.unixtimestamp.com/) in microseconds using the `AS OF` option as follows: + +```sql +CREATE DATABASE clone_db TEMPLATE original_db AS OF 1723146703674480; +``` + +### Clone a YCQL keyspace + +You can create a clone in YCQL using the yb-admin `clone_namespace` command as follows: + +```sh +./bin/yb-admin --master_addresses $MASTERS clone_namespace ycql.originaldb1 clonedb2 1715275616599020 +``` + +In this example, `clonedb2` is created as a clone of `originaldb1` as of 1715275616599020 Unix timestamp. + +### Check the clone status + +To check the status of clone operations performed on a database, use the yb-admin `list_clones` command and provide the `source_database_id` (YSQL) or `source_namespace_id` (YCQL), as follows: + +```sh +./bin/yb-admin --master_addresses $MASTERS list_clones 00004000000030008000000000000000 +``` + +```output +[ + { + "aggregate_state": "COMPLETE", + "source_namespace_id": "00004000000030008000000000000000", + "seq_no": "1", + "target_namespace_name": "testing_clone_db", + "restore_time": "2024-08-09 21:42:16.451974" + }, + { + "aggregate_state": "COMPLETE", + "source_namespace_id": "00004000000030008000000000000000", + "seq_no": "2", + "target_namespace_name": "dev_clone_db", + "restore_time": "2024-08-09 21:42:55.048663" + } +] +``` + +You can find the `source_database_id` or `source_namespace_id` from the [YB-Master leader UI](../../../reference/configuration/default-ports/#servers) under the `/namespaces` endpoint. + +In this example, two clones were made of the source database `00004000000030008000000000000000` that are COMPLETE. The two clones are `testing_clone_db` and `dev_clone_db` and they each have a unique `seq_no` used to identify each clone operation from the same source database. + +You can check the status of a specific clone operation if you have both the `source_database_id` (YSQL) or `source_namespace_id`(YCQL) and the `seq_no` as follows: + +```sh +./bin/yb-admin --master_addresses $MASTERS list_clones 00004000000030008000000000000000 2 +``` + +```output +[ + { + "aggregate_state": "COMPLETE", + "source_namespace_id": "00004000000030008000000000000000", + "seq_no": "2", + "target_namespace_name": "dev_clone_db", + "restore_time": "2024-08-09 21:42:55.048663" + } +] +``` + +Use the `list_clones` command to check whether a clone operation completed successfully or not. + +Note that the cluster doesn't allow you to perform two clone operations concurrently on the same source database. You have to wait for the first clone to finish until you can perform another clone. + +### Example + +The following example demonstrates how to use a database clone to recover from an accidental table deletion. + +1. Create a local cluster using [yugabyted](../../../reference/configuration/yugabyted/): + + ```sh + ./bin/yugabyted start --advertise_address=127.0.0.1 \ + --master_flags "allowed_preview_flags_csv={enable_db_clone},enable_db_clone=true" \ + --tserver_flags "ysql_hba_conf_csv={host all all 0.0.0.0/0 trust,local all all trust}" + ``` + +1. Start [ysqlsh](../../../admin/ysqlsh/) and create the database: + + ```sh + ./bin/ysqlsh + CREATE DATABASE production_db; + ``` + +1. Create a snapshot schedule that produces a snapshot once a day (every 1,440 minutes), and retains it for three days (4,320 minutes): + + ```sh + ./bin/yb-admin --master_addresses ip1:7100,ip2:7100,ip3:7100 create_snapshot_schedule 1440 4320 ysql.production_db + ``` + +1. Create two tables `t1` and `t2`, and add some data: + + ```sql + ./bin/ysqlsh + yugabyte=# \c production_db; + production_db=# CREATE TABLE t1 (k INT, v INT); + production_db=# INSERT INTO t1 (k,v) SELECT i,i%2 FROM generate_series(1,5) AS i; + production_db=# SELECT * FROM t1 ORDER BY k; + ``` + + ```output + k | v + ---+--- + 1 | 1 + 2 | 0 + 3 | 1 + 4 | 0 + 5 | 1 + (5 rows) + ``` + + ```sql + production_db=# CREATE TABLE t2 (key INT, c1 TEXT); + production_db=# INSERT INTO t2 (key,c1) SELECT i,md5(random()::text) FROM generate_series(1,5) AS i; + production_db=# SELECT * FROM t2 ORDER BY key; + ``` + + ```output + key | c1 + -----+---------------------------------- + 1 | 450e6c49f86c76d944375e29e48f2dee + 2 | b934a3bdf7438458a85b0858c41f731c + 3 | 08697ed89ec387e714c6587e522d7a7e + 4 | a879ff99872b3c3433803d3c3229f0cf + 5 | 4d46a53780a7a348179e1af9b692e95e + (5 rows) + ``` + +1. Determine the exact time when your database is in the correct state. This timestamp will be used to create a clone of the production database from the point when it was in the desired state. Execute the following SQL query to retrieve the current time in UNIX timestamp format: + + ```sql + production_db=# SELECT (EXTRACT (EPOCH FROM CURRENT_TIMESTAMP)*1000000)::decimal(38,0); + ``` + + ```output + numeric + ------------------ + 1723243720285350 + (1 row) + ``` + +1. To simulate a user error, drop the table `t1`. + + ```sql + production_db=# DROP TABLE t1; + ``` + + ```output + DROP TABLE + ``` + +1. Meanwhile, as table `t2` is still accepting reads/writes, insert 2 more rows as follows: + + ```sh + INSERT INTO t2 (key,c1) SELECT i,md5(random()::text) FROM generate_series(6,7) AS i; + ``` + +1. Now, if you try to query table `t1`, notice that the table is dropped and there is no way you can query it. + + ```sql + production_db=# SELECT * FROM t1 ORDER BY k; + ``` + + ```output + ERROR: relation "t1" does not exist + LINE 1: SELECT * FROM t1 ORDER BY k; + ``` + +1. Create a database `clone_db` using `production_db` as the template and using the timestamp generated in step 4. + + ```sql + production_db=# CREATE DATABASE clone_db TEMPLATE production_DB AS OF 1723243720285350; + ``` + + ```sql + \c clone_db + ``` + + ```output + You are now connected to database "clone_db" as user "yugabyte". + ``` + + ```sql + clone_db=# SELECT * FROM t1 ORDER BY k; + ``` + + ```output + k | v + ---+--- + 1 | 1 + 2 | 0 + 3 | 1 + 4 | 0 + 5 | 1 + (5 rows) + ``` + + You now have two isolated databases that can serve reads and writes independently. `clone_db` contains all the data from `production_db` at the specified timestamp, which means you can read table `t1` that was dropped. To recover the lost data, copy the data from table `t1` back to `production_db` by exporting the data from the clone and importing it into `production_db`. Alternatively, you can switch the workload to `clone_db`. + +When you are done, you can clean up by dropping the clone as you would any database, by using the DROP DATABASE or DROP KEYSPACE command. The clone is deleted, along with any post-compaction uncompacted files from the original database. + +## Best practices + +Although creating a clone database is quick and initially doesn't take up much added disk space as no data is copied, a clone does create an independent set of logical tablets. Increasing the number of tablets can cause: + +- Higher CPU usage due to the additional tablets +- Increased memory consumption from the extra tablets +- Increased disk use after compaction of either the clone or the original database. This is because both original and post-compaction data files must be kept on disk for access by whichever database did not do the compaction. For example, if compaction is performed on the original database, new compacted files are generated which serve reads for the original database. The old data files are retained on disk to serve reads for the clone database. Whenever the clone or original database is deleted, the cluster only cleans the unused data files. + +## Limitations + +- Cloning is not currently supported for databases that use sequences. See GitHub issue [21467](https://github.com/yugabyte/yugabyte-db/issues/21467) for tracking. +- Cloning to a time before dropping Materialized views is not currently supported. See GitHub issue [23740](https://github.com/yugabyte/yugabyte-db/issues/23740) for tracking. diff --git a/docs/static/images/manage/backup-restore/db-clone.png b/docs/static/images/manage/backup-restore/db-clone.png new file mode 100644 index 0000000000000000000000000000000000000000..6c82066d9d5cee921dd49c42b64206c5e45d676f GIT binary patch literal 36545 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 P{_BCF`roDU=0X1loZVfM literal 0 HcmV?d00001