From b2213945ff123607a7b0fc633ab998acaa3f37a4 Mon Sep 17 00:00:00 2001 From: Ana Hobden Date: Wed, 24 Jul 2019 10:17:16 -0700 Subject: [PATCH] Add some consistency and refactor warning Signed-off-by: Ana Hobden --- content/docs/3.0/concepts/features.md | 4 +- content/docs/3.0/reference/clients/_index.md | 7 - content/docs/3.0/reference/clients/c.md | 12 + .../clients/{go-client-api.md => go.md} | 9 +- .../3.0/reference/clients/introduction.md | 14 + content/docs/3.0/reference/clients/java.md | 12 + .../reference/clients/{apis.md => rust.md} | 5 +- .../3.0/reference/configuration/_index.md | 7 - .../configuration/coprocessor-config.md | 85 ---- .../reference/configuration/grpc-config.md | 51 --- .../configuration/pd-scheduler-config.md | 102 ----- .../configuration/raftstore-config.md | 70 ---- .../configuration/rocksdb-option-config.md | 383 ------------------ .../configuration/security-config.md | 23 -- .../reference/configuration/storage-config.md | 110 ----- content/docs/3.0/reference/introduction.md | 3 +- content/docs/3.0/reference/source.md | 8 - content/docs/3.0/reference/tools/_index.md | 7 - .../docs/3.0/reference/tools/introduction.md | 17 + .../tools/{pd-control.md => pd-ctl.md} | 7 +- .../docs/3.0/reference/tools/pd-recover.md | 7 +- content/docs/3.0/reference/tools/pd-server.md | 10 + .../tools/{tikv-control.md => tikv-ctl.md} | 7 +- .../docs/3.0/reference/tools/tikv-server.md | 10 + .../backup/{_index.md => introduction.md} | 1 + .../docs/3.0/tasks/configure/introduction.md | 23 ++ .../configure/{store-limit.md => limit.md} | 7 +- content/docs/3.0/tasks/configure/namespace.md | 7 +- .../docs/3.0/tasks/configure/region-merge.md | 19 +- .../tasks/configure/{_index.md => rocksdb.md} | 9 +- .../configure/{secure.md => security.md} | 6 +- content/docs/3.0/tasks/configure/titan.md | 18 +- .../topology.md} | 7 +- content/docs/3.0/tasks/deploy/_index.md | 48 --- ...ware-recommendation.md => introduction.md} | 11 +- .../docs/3.0/tasks/deploy/using-ansible.md | 5 +- content/docs/3.0/tasks/deploy/using-binary.md | 5 +- .../3.0/tasks/deploy/using-docker-compose.md | 5 +- content/docs/3.0/tasks/deploy/using-docker.md | 5 +- .../{quick-start.md => getting-started.md} | 2 - content/docs/3.0/tasks/monitor/_index.md | 7 - .../monitor/{overview.md => introduction.md} | 16 +- content/docs/3.0/tasks/monitor/key-metrics.md | 3 +- .../docs/3.0/tasks/monitor/tikv-cluster.md | 5 +- content/docs/3.0/tasks/scale/_index.md | 7 - ...ansible-deployment-scale.md => ansible.md} | 6 +- .../{horizontal-scale.md => introduction.md} | 11 +- layouts/docs/single.html | 9 +- layouts/partials/entry-tree.html | 2 +- static/img/docs/prometheus-in-tikv.png | Bin 0 -> 72390 bytes static/img/docs/titan-architecture.png | Bin 0 -> 31820 bytes 51 files changed, 193 insertions(+), 1021 deletions(-) delete mode 100644 content/docs/3.0/reference/clients/_index.md create mode 100644 content/docs/3.0/reference/clients/c.md rename content/docs/3.0/reference/clients/{go-client-api.md => go.md} (94%) create mode 100644 content/docs/3.0/reference/clients/introduction.md create mode 100644 content/docs/3.0/reference/clients/java.md rename content/docs/3.0/reference/clients/{apis.md => rust.md} (98%) delete mode 100644 content/docs/3.0/reference/configuration/_index.md delete mode 100644 content/docs/3.0/reference/configuration/coprocessor-config.md delete mode 100644 content/docs/3.0/reference/configuration/grpc-config.md delete mode 100644 content/docs/3.0/reference/configuration/pd-scheduler-config.md delete mode 100644 content/docs/3.0/reference/configuration/raftstore-config.md delete mode 100644 content/docs/3.0/reference/configuration/rocksdb-option-config.md delete mode 100644 content/docs/3.0/reference/configuration/security-config.md delete mode 100644 content/docs/3.0/reference/configuration/storage-config.md delete mode 100644 content/docs/3.0/reference/source.md delete mode 100644 content/docs/3.0/reference/tools/_index.md create mode 100644 content/docs/3.0/reference/tools/introduction.md rename content/docs/3.0/reference/tools/{pd-control.md => pd-ctl.md} (99%) create mode 100644 content/docs/3.0/reference/tools/pd-server.md rename content/docs/3.0/reference/tools/{tikv-control.md => tikv-ctl.md} (99%) create mode 100644 content/docs/3.0/reference/tools/tikv-server.md rename content/docs/3.0/tasks/backup/{_index.md => introduction.md} (84%) create mode 100644 content/docs/3.0/tasks/configure/introduction.md rename content/docs/3.0/tasks/configure/{store-limit.md => limit.md} (98%) rename content/docs/3.0/tasks/configure/{_index.md => rocksdb.md} (85%) rename content/docs/3.0/tasks/configure/{secure.md => security.md} (98%) rename content/docs/3.0/tasks/{deploy/location-awareness.md => configure/topology.md} (96%) delete mode 100644 content/docs/3.0/tasks/deploy/_index.md rename content/docs/3.0/tasks/deploy/{hardware-recommendation.md => introduction.md} (96%) rename content/docs/3.0/tasks/{quick-start.md => getting-started.md} (98%) delete mode 100644 content/docs/3.0/tasks/monitor/_index.md rename content/docs/3.0/tasks/monitor/{overview.md => introduction.md} (74%) delete mode 100644 content/docs/3.0/tasks/scale/_index.md rename content/docs/3.0/tasks/scale/{ansible-deployment-scale.md => ansible.md} (98%) rename content/docs/3.0/tasks/scale/{horizontal-scale.md => introduction.md} (95%) create mode 100644 static/img/docs/prometheus-in-tikv.png create mode 100644 static/img/docs/titan-architecture.png diff --git a/content/docs/3.0/concepts/features.md b/content/docs/3.0/concepts/features.md index 28d97cb..e5c0b4f 100644 --- a/content/docs/3.0/concepts/features.md +++ b/content/docs/3.0/concepts/features.md @@ -4,4 +4,6 @@ description: The features of TiKV menu: docs: parent: Concepts ---- \ No newline at end of file +--- + +{{< features >}} \ No newline at end of file diff --git a/content/docs/3.0/reference/clients/_index.md b/content/docs/3.0/reference/clients/_index.md deleted file mode 100644 index d72dee0..0000000 --- a/content/docs/3.0/reference/clients/_index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Clients -description: Interact with TiKV using the raw key-value API or the transactional key-value API -menu: - docs: - parent: Reference ---- \ No newline at end of file diff --git a/content/docs/3.0/reference/clients/c.md b/content/docs/3.0/reference/clients/c.md new file mode 100644 index 0000000..533c4ff --- /dev/null +++ b/content/docs/3.0/reference/clients/c.md @@ -0,0 +1,12 @@ +--- +title: C Client +description: Interact with TiKV using C. +menu: + docs: + parent: Clients + weight: 4 +--- + +This document, like our C API, is still a work in progress. In the meantime, you can track development at [tikv/client-c](https://github.com/tikv/client-c/) repository. Most development happens on the `dev` branch. + +**You should not use the C client for production use until it is released.** \ No newline at end of file diff --git a/content/docs/3.0/reference/clients/go-client-api.md b/content/docs/3.0/reference/clients/go.md similarity index 94% rename from content/docs/3.0/reference/clients/go-client-api.md rename to content/docs/3.0/reference/clients/go.md index 5e96fed..b111d69 100644 --- a/content/docs/3.0/reference/clients/go-client-api.md +++ b/content/docs/3.0/reference/clients/go.md @@ -1,14 +1,13 @@ --- -title: Go -description: Learn how to use the Raw Key-Value API and the Transactional Key-Value API in TiKV. +title: Go Client +description: Interact with TiKV using Go. menu: docs: parent: Clients + weight: 1 --- -# Try Two Types of APIs - -To apply to different scenarios, TiKV provides [two types of APIs](../../overview.md#two-types-of-apis) for developers: the Raw Key-Value API and the Transactional Key-Value API. This document uses two examples to guide you through how to use the two APIs in TiKV. The usage examples are based on multiple nodes for testing. You can also quickly try the two types of APIs on a single machine. +To apply to different scenarios, TiKV provides two types of APIs for developers: the Raw Key-Value API and the Transactional Key-Value API. This document uses two examples to guide you through how to use the two APIs in TiKV. The usage examples are based on multiple nodes for testing. You can also quickly try the two types of APIs on a single machine. > **Warning:** Do not use these two APIs together in the same cluster, otherwise they might corrupt each other's data. diff --git a/content/docs/3.0/reference/clients/introduction.md b/content/docs/3.0/reference/clients/introduction.md new file mode 100644 index 0000000..4102a56 --- /dev/null +++ b/content/docs/3.0/reference/clients/introduction.md @@ -0,0 +1,14 @@ +--- +title: Clients +description: Interact with TiKV using the raw key-value API or the transactional key-value API +menu: + docs: + parent: Reference +--- + +TiKV has clients for a number of languages: + +* [Go](../go) (Stable) +* [Java](../java) (Unstable) +* [Rust](../rust) (Unstable) +* [C](../c) (early development) \ No newline at end of file diff --git a/content/docs/3.0/reference/clients/java.md b/content/docs/3.0/reference/clients/java.md new file mode 100644 index 0000000..e11c3a1 --- /dev/null +++ b/content/docs/3.0/reference/clients/java.md @@ -0,0 +1,12 @@ +--- +title: Java Client +description: Interact with TiKV using Java. +menu: + docs: + parent: Clients + weight: 3 +--- + +This document, like our Java API, is still a work in progress. In the meantime, you can track development at [tikv/client-java](https://github.com/tikv/client-java/) repository. + +**You should not use the Java client for production use until it is released.** \ No newline at end of file diff --git a/content/docs/3.0/reference/clients/apis.md b/content/docs/3.0/reference/clients/rust.md similarity index 98% rename from content/docs/3.0/reference/clients/apis.md rename to content/docs/3.0/reference/clients/rust.md index ad8f327..db3a515 100644 --- a/content/docs/3.0/reference/clients/apis.md +++ b/content/docs/3.0/reference/clients/rust.md @@ -1,9 +1,10 @@ --- -title: Rust -description: Interact with TiKV using the raw key-value API or the transactional key-value API +title: Rust Client +description: Interact with TiKV using Rust. menu: docs: parent: Clients + weight: 2 --- TiKV offers two APIs that you can interact with: diff --git a/content/docs/3.0/reference/configuration/_index.md b/content/docs/3.0/reference/configuration/_index.md deleted file mode 100644 index 86baa30..0000000 --- a/content/docs/3.0/reference/configuration/_index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Configuration -description: How to configure TiKV -menu: - docs: - parent: Reference ---- \ No newline at end of file diff --git a/content/docs/3.0/reference/configuration/coprocessor-config.md b/content/docs/3.0/reference/configuration/coprocessor-config.md deleted file mode 100644 index 4de5459..0000000 --- a/content/docs/3.0/reference/configuration/coprocessor-config.md +++ /dev/null @@ -1,85 +0,0 @@ ---- -title: Coprocessor Options -description: Learn how to configure the coprocessor in TiKV. -menu: - docs: - parent: Configuration ---- - -# TiKV Coprocessor Configuration - -Coprocessor is the component that handles most of the read requests from TiDB. Unlike Storage, it is more high-leveled that it not only fetches KV data but also does computing like filter or aggregation. TiKV is used as a distribution computing engine and Coprocessor is also used to reduce data serialization and traffic. This document describes how to configure TiKV Coprocessor. - -## Configuration - -Most Coprocessor configurations are in the `[readpool.coprocessor]` section and some configurations are in the `[server]` section. - -### `[readpool.coprocessor]` - -There are three thread pools for handling high priority, normal priority and low priority requests respectively. TiDB point select is high priority, range scan is normal priority and background jobs like table analyzing is low priority. - -#### `high-concurrency` - -- Specifies the thread pool size for handling high priority Coprocessor requests -- Default value: number of cores * 0.8 (> 8 cores) or 8 (<= 8 cores) -- Minimum value: 1 -- It must be larger than zero but should not exceed the number of CPU cores of the host machine -- On a machine with more than 8 CPU cores, its default value is NUM_CPUS * 0.8. Otherwise it is 8 -- If you are running multiple TiKV instances on the same machine, make sure that the sum of this configuration item does not exceed the number of CPU cores. For example, assuming that you have a 48 core server running 3 TiKVs, then the `high-concurrency` value for each instance should be less than 16 -- Do not set it to a too small value, otherwise your read request QPS is limited. On the other hand, a larger value is not always the optimal choice because there might be larger resource contention - -#### `normal-concurrency` - -- Specifies the thread pool size for handling normal priority Coprocessor requests -- Default value: number of cores * 0.8 (> 8 cores) or 8 (<= 8 cores) -- Minimum value: 1 - -#### `low-concurrency` - -- Specifies the thread pool size for handling low priority Coprocessor requests -- Default value: number of cores * 0.8 (> 8 cores) or 8 (<= 8 cores) -- Minimum value: 1 -- Generally, you don’t need to ensure that the sum of high + normal + low < the number of CPU cores, because a single Coprocessor request is handled by only one of them - -#### `max-tasks-per-worker-high` - -- Specifies the max number of running operations for each thread in high priority thread pool -- Default value: number of cores * 0.8 (> 8 cores) or 8 (<= 8 cores) -- Minimum value: 1 -- Because actually a throttle of the thread-pool level instead of single thread level is performed, the max number of running operations for the thread pool is limited to `max-tasks-per-worker-high * high-concurrency`. If the number of running operations exceeds this configuration, new operations are simply rejected without being handled and it contains an error header telling that TiKV is busy -- Generally, you don’t need to adjust this configuration unless you are following trustworthy advice - -#### `max-tasks-per-worker-normal` - -- Specifies the max running operations for each thread in the normal priority thread pool -- Default value: 2000 -- Minimum value: 2000 - -#### `max-tasks-per-worker-low` - -- Specifies the max running operations for each thread in the low priority thread pool -- Default value: 2000 -- Minimum value: 2000 - -#### `stack-size` - -- Sets the stack size for each thread in the three thread pools -- Default value: 10MB -- Minimum value: 2MB -- For large requests, you need a large stack to handle. Some Coprocessor requests are extremely large, change with caution - -### `[server]` - -#### `end-point-recursion-limit` - -- Sets the max allowed recursions when decoding Coprocessor DAG expressions -- Default value: 1000 -- Minimum value: 100 -- Smaller value might cause large Coprocessor DAG requests to fail - -#### `end-point-request-max-handle-duration` - -- Sets the max allowed waiting time for each request -- Default value: 60s -- Minimum value: 60s -- When there are many backlog Coprocessor requests, new requests might wait in queue. If the waiting time of a request exceeds this configuration, it is rejected with the TiKV busy error and is not handled \ No newline at end of file diff --git a/content/docs/3.0/reference/configuration/grpc-config.md b/content/docs/3.0/reference/configuration/grpc-config.md deleted file mode 100644 index 06cb64b..0000000 --- a/content/docs/3.0/reference/configuration/grpc-config.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: gRPC (Remote procedure Calls) -description: Learn how to configure gRPC. -menu: - docs: - parent: Configuration ---- - -# gRPC Configuration - -TiKV uses gRPC, a remote procedure call (RPC) framework, to build a distributed transactional key-value database. gRPC is designed to be high-performance, but ill-configured gRPC leads to performance regression of TiKV. This document describes how to configure gRPC. - -## grpc-compression-type - -- Compression type for the gRPC channel -- Default: "none" -- Available values are “none”, “deflate” and “gzip” -- To exchange the CPU time for network I/O, you can set it to “deflate” or “gzip”. It is useful when the network bandwidth is limited - -## grpc-concurrency - -- The size of the thread pool that drives gRPC -- Default: 4. It is suitable for a commodity computer. You can double the size if TiKV is deployed in a high-end server (32 core+ CPU) -- Higher concurrency is for higher QPS, but it consumes more CPU - -## grpc-concurrent-stream - -- The number of max concurrent streams/requests on a connection -- Default: 1024. It is suitable for most workload -- Increase the number if you find that most of your requests are not time consuming, e.g., RawKV Get - -## grpc-keepalive-time - -- Time to wait before sending out a ping to check whether the server is still alive. This is only for the communication between TiKV instances -- Default: 10s - -## grpc-keepalive-timeout - -- Time to wait before closing the connection without receiving the `keepalive` ping ACK -- Default: 3s - -## grpc-raft-conn-num - -- The number of connections with each TiKV server to send Raft messages -- Default: 10 - -## grpc-stream-initial-window-size - -- Amount to Read Ahead on individual gRPC streams -- Default: 2MB -- Larger values can help throughput on high-latency connections \ No newline at end of file diff --git a/content/docs/3.0/reference/configuration/pd-scheduler-config.md b/content/docs/3.0/reference/configuration/pd-scheduler-config.md deleted file mode 100644 index dda4b54..0000000 --- a/content/docs/3.0/reference/configuration/pd-scheduler-config.md +++ /dev/null @@ -1,102 +0,0 @@ ---- -title: PD Scheduler Options -description: Learn how to configure PD Scheduler. -menu: - docs: - parent: Configuration ---- - -# PD Scheduler Configuration - -PD Scheduler is responsible for scheduling the storage and computing resources. PD has many kinds of schedulers to meet the requirements in different scenarios. PD Scheduler is one of the most important component in PD. - -The basic workflow of PD Scheduler is as follows. First, the scheduler is triggered according to `minAdjacentSchedulerInterval` defined in `ScheduleController`. Then it tries to select the source store and the target store, create the corresponding operators and send a message to TiKV to do some operations. - -## Usage description - -This section describes the usage of PD Scheduler parameters. - -### `max-merge-region-keys && max-merge-region-size` - -If the Region size is smaller than `max-merge-region-size` and the number of keys in the Region is smaller than `max-merge-region-keys` at the same time, the Region will try to merge with adjacent Regions. The default value of both the two parameters is 0. Currently, `merge` is not enabled by default. - -### `split-merge-interval` - -`split-merge-interval` is the minimum interval time to allow merging after split. The default value is "1h". - -### `max-snapshot-count` - -If the snapshot count of one store is larger than the value of `max-snapshot-count`, it will never be used as a source or target store. The default value is 3. - -### `max-pending-peer-count` - -If the pending peer count of one store is larger than the value of `max-pending-peer-count`, it will never be used as a source or target store. The default value is 16. - -### `max-store-down-time` - -`max-store-down-time` is the maximum duration after which a store is considered to be down if it has not reported heartbeats. The default value is “30m”. - -### `leader-schedule-limit` - -`leader-schedule-limit` is the maximum number of coexistent leaders that are under scheduling. The default value is 4. - -### `region-schedule-limit` - -`region-schedule-limit` is the maximum number of coexistent Regions that are under scheduling. The default value is 4. - -### `replica-schedule-limit` - -`replica-schedule-limit` is the maximum number of coexistent replicas that are under scheduling. The default value is 8. - -### `merge-schedule-limit` - -`merge-schedule-limit` is the maximum number of coexistent merges that are under scheduling. The default value is 8. - -### `tolerant-size-ratio` - -`tolerant-size-ratio` is the ratio of buffer size for the balance scheduler. The default value is 5.0. - -### `low-space-ratio` - -`low-space-ratio` is the lowest usage ratio of a storage which can be regarded as low space. When a storage is in low space, the score turns to be high and varies inversely with the available size. - -### `high-space-ratio` - -`high-space-ratio` is the highest usage ratio of storage which can be regarded as high space. High space means there is a lot of available space of the storage, and the score varies directly with the used size. - -### `disable-raft-learner` - -`disable-raft-learner` is the option to disable `AddNode` and use `AddLearnerNode` instead. - -### `disable-remove-down-replica` - -`disable-remove-down-replica` is the option to prevent replica checker from removing replicas whose status are down. - -### `disable-replace-offline-replica` - -`disable-replace-offline-replica` is the option to prevent the replica checker from replacing offline replicas. - -### `disable-make-up-replica` - -`disable-make-up-replica` is the option to prevent the replica checker from making up replicas when the count of replicas is less than expected. - -### `disable-remove-extra-replica` - -`disable-remove-extra-replica` is the option to prevent the replica checker from removing extra replicas. - -### `disable-location-replacement` - -`disable-location-replacement` is the option to prevent the replica checker from moving the replica to a better location. - -## Customization - -The default schedulers include `balance-leader`, `balance-region` and `hot-region`. In addition, you can also customize the schedulers. For each scheduler, the configuration has three variables: `type`, `args` and `disable`. - -Here is an example to enable the `evict-leader` scheduler in the `config.toml` file: - -``` -[[schedule.schedulers]] -type = "evict-leader" -args = ["1"] -disable = false -``` \ No newline at end of file diff --git a/content/docs/3.0/reference/configuration/raftstore-config.md b/content/docs/3.0/reference/configuration/raftstore-config.md deleted file mode 100644 index 4624021..0000000 --- a/content/docs/3.0/reference/configuration/raftstore-config.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -title: Raftstore Options -description: Learn about Raftstore configuration in TiKV. -menu: - docs: - parent: Configuration ---- - -# Raftstore Configurations - -Raftstore is TiKV's implementation of [Multi-raft](https://tikv.org/deep-dive/scalability/multi-raft/) to manage multiple Raft peers on one node. Raftstore is comprised of two major components: - -- **Raftstore** component writes Raft logs into RaftDB. -- **Apply** component resolves Raft logs and flush the data in the log into the underlying storage engine. - -This document introduces the following features of Raftstore and their configurations: - -- [Multi-thread Raftstore](#multi-thread-raftstore) -- [Hibernate Region](#hibernate-region) - -## Multi-thread Raftstore - - Multi-thread support for the Raftstore and the Apply components means higher throughput and lower latency per each single node. In the multi-thread mode, each thread obtains peers from the queue in batch, so that small writes of multiple peers can be consolidated into a big write for better throughput. - -![Multi-thread Raftstore Model](../../images/multi-thread-raftstore.png) - -> **Note:** -> -> In the multi-thread mode, peers are obtained in batch, so pressure from hot write Regions cannot be scattered evenly to each CPU. For better load balancing, it is recommended you use smaller batch sizes. - -### Configuration items - -You can specify the following items in the TiKV configuration file to configure multi-thread Raftstore: - -**`raftstore.store_max_batch_size`** - -Determines the maximum number of peers that a single thread can obtain in a batch. The value must be a positive integer. A smaller value provides better load balancing for CPU, but may cause more frequent writes. - -**`raftstore.store_pool_size`** - -Determines the number of threads to process peers in batch. The value must be a positive integer. For better performance, it is recommended that you set a value less than or equal to the number of CPU cores on your machine. - -**`raftstore.apply_max_batch_size`** - -Determines the maximum number of ApplyDelegates requests that a single thread can resolve in a batch. The value must be a positive integer. A smaller value provides better load balancing for CPU, but may cause more frequent writes. - -**`raftstore.apply_pool_size`** - -Determines the number of threads. The value must be a positive integer. For better performance, it is recommended that you set a value less than or equal to the number of CPU cores on your machine. - -## Hibernate Region - -Hibernate Region is a Raftstore feature to reduce the extra overhead caused by heartbeat messages between the Raft leader and the followers for idle Regions. With this feature enabled, a Region idle for a long time is automatically set as hibernated. The heartbeat interval for the leader to maintain its lease becomes much longer, and the followers do not initiate elections simply because they cannot receive heartbeats from the leader. - -> **Note:** -> -> - Hibernate Region is still an Experimental feature and is disabled by default. -> - Any requests from the client or disconnections will activate the Region from the hibernated state. - -### Configuration items - -You can specify the following items in the TiKV configuration file to configure Hibernate Region: - -**`raftstore.hibernate-regions`** - -Enables or disables Hibernate Region. Possible values are true and false. The default value is false. - -**`raftstore.peer_stale_state_check_interval`** - -Modifies the state check interval for hibernated Regions. The default value is 5 minutes. This value also determines the heartbeat interval between the leader and followers of the hibernated Regions. \ No newline at end of file diff --git a/content/docs/3.0/reference/configuration/rocksdb-option-config.md b/content/docs/3.0/reference/configuration/rocksdb-option-config.md deleted file mode 100644 index 67538ff..0000000 --- a/content/docs/3.0/reference/configuration/rocksdb-option-config.md +++ /dev/null @@ -1,383 +0,0 @@ ---- -title: RocksDB Options -description: Learn how to configure RocksDB options. -menu: - docs: - parent: Configuration ---- - -# RocksDB Option Configuration - -TiKV uses RocksDB as its underlying storage engine for storing both Raft logs and KV (key-value) pairs. [RocksDB](https://github.com/facebook/rocksdb/wiki) is a highly customizable persistent key-value store that can be tuned to run on a variety of production environments, including pure memory, Flash, hard disks or HDFS. It supports various compression algorithms and good tools for production support and debugging. - -## Configuration - -TiKV creates two RocksDB instances called `rocksdb` and `raftdb` separately. - -- `rocksdb` has three column families: - - - `rocksdb.defaultcf` is used to store actual KV pairs of TiKV - - `rocksdb.writecf` is used to store the commit information in the MVCC model - - `rocksdb.lockcf` is used to store the lock information in the MVCC model - -- `raftdb` has only one column family called `raftdb.defaultcf`, which is used to store the Raft logs. - -Each RocksDB instance and column family is configurable. Below explains the details of DBOptions for tuning the RocksDB instance and CFOptions for tuning the column family. - -### DBOptions - -#### max-background-jobs - -- The maximum number of concurrent background jobs (compactions and flushes) - -#### max-sub-compactions - -- The maximum number of threads that will concurrently perform a compaction job by breaking the job into multiple smaller ones that run simultaneously - -#### max-open-files - -- The number of open files that can be used by RocksDB. You may need to increase this if your database has a large working set -- Value -1 means files opened are always kept open. You can estimate the number of files based on `target_file_size_base` and `target_file_size_multiplier` for level-based compaction -- If max-open-files = -1, RocksDB will prefetch index blocks and filter blocks into block cache at startup, so if your database has a large working set, it will take several minutes to open RocksDB - -#### max-manifest-file-size - -- The maximum size of RocksDB's MANIFEST file. For details, see [MANIFEST](https://github.com/facebook/rocksdb/wiki/MANIFEST) - -#### create-if-missing - -- If it is true, the database will be created when it is missing - -#### wal-recovery-mode - -RocksDB WAL(write-ahead log) recovery mode: - -- `0`: TolerateCorruptedTailRecords, tolerates incomplete record in trailing data on all logs -- `1`: AbsoluteConsistency, tolerates no We don't expect to find any corruption (all the I/O errors are considered as corruptions) in the WAL -- `2`: PointInTimeRecovery, recovers to point-in-time consistency -- `3`: SkipAnyCorruptedRecords, recovery after a disaster - -#### wal-dir - -- RocksDB write-ahead logs directory path. This specifies the absolute directory path for write-ahead logs -- If it is empty, the log files will be in the same directory as data -- When you set the path to the RocksDB directory in memory like in `/dev/shm`, you may want to set `wal-dir` to a directory on a persistent storage. For details, see [RocksDB documentation](https://github.com/facebook/rocksdb/wiki/How-to-persist-in-memory-RocksDB-database) - -#### wal-ttl-seconds - -See [wal-size-limit](#wal-size-limit) - -#### wal-size-limit - -`wal-ttl-seconds` and `wal-size-limit` affect how archived write-ahead logs will be deleted - -- If both are set to 0, logs will be deleted immediately and will not get into the archive -- If `wal-ttl-seconds` is 0 and `wal-size-limit` is not 0, - WAL files will be checked every 10 minutes and if the total size is greater - than `wal-size-limit`, WAL files will be deleted from the earliest position with the - earliest until `size_limit` is met. All empty files will be deleted -- If `wal-ttl-seconds` is not 0 and `wal-size-limit` is 0, - WAL files will be checked every wal-ttl-seconds / 2 and those that - are older than `wal-ttl-seconds` will be deleted -- If both are not 0, WAL files will be checked every 10 minutes and both `ttl` and `size` checks will be performed with ttl being first -- When you set the path to the RocksDB directory in memory like in `/dev/shm`, you may want to set `wal-ttl-seconds` to a value greater than 0 (like 86400) and backup your RocksDB on a regular basis. For details, see [RocksDB documentation](https://github.com/facebook/rocksdb/wiki/How-to-persist-in-memory-RocksDB-database) - -#### wal-bytes-per-sync - -- Allows OS to incrementally synchronize WAL to the disk while the log is being written - -#### max-total-wal-size - -- Once the total size of write-ahead logs exceeds this size, RocksDB will start forcing the flush of column families whose memtables are backed up by the oldest live WAL file -- If it is set to 0, we will dynamically set the WAL size limit to be [sum of all write_buffer_size * max_write_buffer_number] * 4 - -#### enable-statistics - -- RocksDB statistics provide cumulative statistics over time. Turning statistics on will introduce about 5%-10% overhead for RocksDB, but it is worthwhile to know the internal status of RocksDB - -#### stats-dump-period - -- Dumps statistics periodically in information logs - -#### compaction-readahead-size - -- According to [RocksDB FAQ](https://github.com/facebook/rocksdb/wiki/RocksDB-FAQ): if you want to use RocksDB on multi disks or spinning disks, you should set this value to at least 2MB - -#### writable-file-max-buffer-size - -- The maximum buffer size that is used by `WritableFileWrite` - -#### use-direct-io-for-flush-and-compaction - -- Uses `O_DIRECT` for both reads and writes in background flush and compactions - -#### rate-bytes-per-sec - -- Limits the disk I/O of compaction and flush -- Compaction and flush can cause terrible spikes if they exceed a certain threshold. It is recommended to set this to 50% ~ 80% of the disk throughput for a more stable result. But for heavy write workload, limiting compaction and flush speed can cause write stalls too - -#### enable-pipelined-write - -- Enables/Disables the pipelined write. For details, see [Pipelined Write](https://github.com/facebook/rocksdb/wiki/Pipelined-Write) - -#### bytes-per-sync - -- Allows OS to incrementally synchronize files to the disk while the files are being written asynchronously in the background - -#### info-log-max-size - -- Specifies the maximum size of the RocksDB log file -- If the log file is larger than `max_log_file_size`, a new log file will be created -- If max_log_file_size == 0, all logs will be written to one log file - -#### info-log-roll-time - -- Time for the RocksDB log file to roll (in seconds) -- If it is specified with non-zero value, the log file will be rolled when its active time is longer than `log_file_time_to_roll` - -#### info-log-keep-log-file-num - -- The maximum number of RocksDB log files to be kept - -#### info-log-dir - -- Specifies the RocksDB info log directory -- If it is empty, the log files will be in the same directory as data -- If it is non-empty, the log files will be in the specified directory, and the absolute path of RocksDB data directory will be used as the prefix of the log file name - -### CFOptions - -#### compression-per-level - -- Per level compression. The compression method (if any) is used to compress a block - - - no: kNoCompression - - snappy: kSnappyCompression - - zlib: kZlibCompression - - bzip2: kBZip2Compression - - lz4: kLZ4Compression - - lz4hc: kLZ4HCCompression - - zstd: kZSTD - -- For details, see [Compression of RocksDB](https://github.com/facebook/rocksdb/wiki/Compression) - -#### block-size - -- Approximate size of user data packed per block. The block size specified here corresponds to the uncompressed data - -#### bloom-filter-bits-per-key - -- If you're doing point lookups, you definitely want to turn bloom filters on. Bloom filter is used to avoid unnecessary disk read -- Default: 10, which yields ~1% false positive rate -- Larger values will reduce false positive rate, but will increase memory usage and space amplification - -#### block-based-bloom-filter - -- False: one `sst` file has a corresponding bloom filter -- True: every block has a corresponding bloom filter - -#### level0-file-num-compaction-trigger - -- The number of files to trigger level-0 compaction -- A value less than 0 means that level-0 compaction will not be triggered by the number of files - -#### level0-slowdown-writes-trigger - -- Soft limit on the number of level-0 files. The write performance is slowed down at this point - -#### level0-stop-writes-trigger - -- The maximum number of level-0 files. The write operation is stopped at this point - -#### write-buffer-size - -- The amount of data to build up in memory (backed up by an unsorted log on the disk) before it is converted to a sorted on-disk file - -#### max-write-buffer-number - -- The maximum number of write buffers that are built up in memory - -#### min-write-buffer-number-to-merge - -- The minimum number of write buffers that will be merged together before writing to the storage - -#### max-bytes-for-level-base - -- Controls the maximum total data size for the base level (level 1). - -#### target-file-size-base - -- Target file size for compaction - -#### max-compaction-bytes - -- The maximum bytes for `compaction.max_compaction_bytes` - -#### compaction-pri - -There are four different algorithms to pick files to compact: - -- `0`: ByCompensatedSize -- `1`: OldestLargestSeqFirst -- `2`: OldestSmallestSeqFirst -- `3`: MinOverlappingRatio - -#### block-cache-size - -- Caches uncompressed blocks -- Big block-cache can speed up the read performance. Generally, this should be set to 30%-50% of the system's total memory - -#### cache-index-and-filter-blocks - -- Indicates if index/filter blocks will be put to the block cache -- If it is not specified, each "table reader" object will pre-load the index/filter blocks during table initialization - -#### pin-l0-filter-and-index-blocks - -- Pins level0 filter and index blocks in the cache - -#### read-amp-bytes-per-bit - -Enables read amplification statistics -- value => memory usage (percentage of loaded blocks memory) -- 0 => disable -- 1 => 12.50 % -- 2 => 06.25 % -- 4 => 03.12 % -- 8 => 01.56 % -- 16 => 00.78 % - -#### dynamic-level-bytes - -- Picks the target size of each level dynamically -- This feature can reduce space amplification. It is highly recommended to setit to true. For details, see [Dynamic Level Size for Level-Based Compaction]( https://rocksdb.org/blog/2015/07/23/dynamic-level.html) - -## Template - -This template shows the default RocksDB configuration for TiKV: - -``` -[rocksdb] -max-background-jobs = 8 -max-sub-compactions = 1 -max-open-files = 40960 -max-manifest-file-size = "20MB" -create-if-missing = true -wal-recovery-mode = 2 -wal-dir = "/tmp/tikv/store" -wal-ttl-seconds = 0 -wal-size-limit = 0 -max-total-wal-size = "4GB" -enable-statistics = true -stats-dump-period = "10m" -compaction-readahead-size = 0 -writable-file-max-buffer-size = "1MB" -use-direct-io-for-flush-and-compaction = false -rate-bytes-per-sec = 0 -enable-pipelined-write = true -bytes-per-sync = "0MB" -wal-bytes-per-sync = "0KB" -info-log-max-size = "1GB" -info-log-roll-time = "0" -info-log-keep-log-file-num = 10 -info-log-dir = "" - -# Column Family default used to store actual data of the database. -[rocksdb.defaultcf] -compression-per-level = ["no", "no", "lz4", "lz4", "lz4", "zstd", "zstd"] -block-size = "64KB" -bloom-filter-bits-per-key = 10 -block-based-bloom-filter = false -level0-file-num-compaction-trigger = 4 -level0-slowdown-writes-trigger = 20 -level0-stop-writes-trigger = 36 -write-buffer-size = "128MB" -max-write-buffer-number = 5 -min-write-buffer-number-to-merge = 1 -max-bytes-for-level-base = "512MB" -target-file-size-base = "8MB" -max-compaction-bytes = "2GB" -compaction-pri = 3 -block-cache-size = "1GB" -cache-index-and-filter-blocks = true -pin-l0-filter-and-index-blocks = true -read-amp-bytes-per-bit = 0 -dynamic-level-bytes = true - -# Options for Column Family write -# Column Family write used to store commit information in MVCC model -[rocksdb.writecf] -compression-per-level = ["no", "no", "lz4", "lz4", "lz4", "zstd", "zstd"] -block-size = "64KB" -write-buffer-size = "128MB" -max-write-buffer-number = 5 -min-write-buffer-number-to-merge = 1 -max-bytes-for-level-base = "512MB" -target-file-size-base = "8MB" -# In normal cases it should be tuned to 10%-30% of the system's total memory. -block-cache-size = "256MB" -level0-file-num-compaction-trigger = 4 -level0-slowdown-writes-trigger = 20 -level0-stop-writes-trigger = 36 -cache-index-and-filter-blocks = true -pin-l0-filter-and-index-blocks = true -compaction-pri = 3 -read-amp-bytes-per-bit = 0 -dynamic-level-bytes = true - -[rocksdb.lockcf] -compression-per-level = ["no", "no", "no", "no", "no", "no", "no"] -block-size = "16KB" -write-buffer-size = "128MB" -max-write-buffer-number = 5 -min-write-buffer-number-to-merge = 1 -max-bytes-for-level-base = "128MB" -target-file-size-base = "8MB" -block-cache-size = "256MB" -level0-file-num-compaction-trigger = 1 -level0-slowdown-writes-trigger = 20 -level0-stop-writes-trigger = 36 -cache-index-and-filter-blocks = true -pin-l0-filter-and-index-blocks = true -compaction-pri = 0 -read-amp-bytes-per-bit = 0 -dynamic-level-bytes = true - -[raftdb] -max-sub-compactions = 1 -max-open-files = 40960 -max-manifest-file-size = "20MB" -create-if-missing = true -enable-statistics = true -stats-dump-period = "10m" -compaction-readahead-size = 0 -writable-file-max-buffer-size = "1MB" -use-direct-io-for-flush-and-compaction = false -enable-pipelined-write = true -allow-concurrent-memtable-write = false -bytes-per-sync = "0MB" -wal-bytes-per-sync = "0KB" -info-log-max-size = "1GB" -info-log-roll-time = "0" -info-log-keep-log-file-num = 10 -info-log-dir = "" - -[raftdb.defaultcf] -compression-per-level = ["no", "no", "lz4", "lz4", "lz4", "zstd", "zstd"] -block-size = "64KB" -write-buffer-size = "128MB" -max-write-buffer-number = 5 -min-write-buffer-number-to-merge = 1 -max-bytes-for-level-base = "512MB" -target-file-size-base = "8MB" -# should tune to 256MB~2GB. -block-cache-size = "256MB" -level0-file-num-compaction-trigger = 4 -level0-slowdown-writes-trigger = 20 -level0-stop-writes-trigger = 36 -cache-index-and-filter-blocks = true -pin-l0-filter-and-index-blocks = true -compaction-pri = 0 -read-amp-bytes-per-bit = 0 -dynamic-level-bytes = true -``` \ No newline at end of file diff --git a/content/docs/3.0/reference/configuration/security-config.md b/content/docs/3.0/reference/configuration/security-config.md deleted file mode 100644 index e19c746..0000000 --- a/content/docs/3.0/reference/configuration/security-config.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: Security Options -description: Learn about the security configuration in TiKV. -menu: - docs: - parent: Configuration ---- - -# TiKV Security Configuration - -TiKV has SSL/TLS integration to encrypt the data exchanged between nodes. This document describes the security configuration in the TiKV cluster. - -## ca-path = "/path/to/ca.pem" - -The path to the file that contains the PEM encoding of the server’s CA certificates. - -## cert-path = "/path/to/cert.pem" - -The path to the file that contains the PEM encoding of the server’s certificate chain. - -## key-path = "/path/to/key.pem" - -The path to the file that contains the PEM encoding of the server’s private key. \ No newline at end of file diff --git a/content/docs/3.0/reference/configuration/storage-config.md b/content/docs/3.0/reference/configuration/storage-config.md deleted file mode 100644 index 4e90718..0000000 --- a/content/docs/3.0/reference/configuration/storage-config.md +++ /dev/null @@ -1,110 +0,0 @@ ---- -title: Storage Options -description: Learn how to configure TiKV Storage. -menu: - docs: - parent: Configuration ---- - -# TiKV Storage Configuration - -In TiKV, Storage is the component responsible for handling read and write requests. Note that if you are using TiKV with TiDB, most read requests are handled by the Coprocessor component instead of Storage. - -## Configuration - -There are two sections related to Storage: `[readpool.storage]` and `[storage]`. - -### `[readpool.storage]` - -This configuration section mainly affects storage read operations. Most read requests from TiDB are not controlled by this configuration section. For configuring the read requests from TiDB, see [Coprocessor configurations](coprocessor-config.md). - -There are 3 thread pools for handling read operations, namely read-high, read-normal and read-low, which process high-priority, normal-priority and low-priority read requests respectively. The priority can be specified by corresponding fields in the gRPC request. - -#### `high-concurrency` - -- Specifies the thread pool size for handling high priority requests -- Default value: 4. It means at most 4 CPU cores are used -- Minimum value: 1 -- It must be larger than zero but should not exceed the number of CPU cores of the host machine -- If you are running multiple TiKV instances on the same machine, make sure that the sum of this configuration item does not exceed number of CPU cores. For example, assuming that you have a 48 core server running 3 TiKVs, then the `high-concurrency` value for each instance should be less than 16 -- Do not set this configuration item to a too small value, otherwise your read request QPS is limited. On the other hand, larger value is not always the most optimal choice because there could be larger resource contention - - -#### `normal-concurrency` - -- Specifies the thread pool size for handling normal priority requests -- Default value: 4 -- Minimum value: 1 - -#### `low-concurrency` - -- Specifies the thread pool size for handling low priority requests -- Default value: 4 -- Minimum value: 1 -- Generally, you don’t need to ensure that the sum of high + normal + low < number of CPU cores, because a single request is handled by only one of them - -#### `max-tasks-per-worker-high` - -- Specifies the max number of running operations for each thread in the read-high thread pool, which handles high priority read requests. Because a throttle of the thread-pool level instead of single thread level is performed, the max number of running operations for the read-high thread pool is limited to `max-tasks-per-worker-high * high-concurrency` -- Default value: 2000 -- Minimum value: 2000 -- If the number of running operations exceeds this configuration, new operations are simply rejected without being handled and it will contain an error header telling that TiKV is busy -- Generally, you don’t need to adjust this configuration unless you are following trustworthy advice - -#### `max-tasks-per-worker-normal` - -- Specifies the max running operations for each thread in the read-normal thread pool, which handles normal priority read requests. -- Default value: 2000 -- Minimum value: 2000 - -#### `max-tasks-per-worker-low` - -- Specifies the max running operations for each thread in the read-low thread pool, which handles low priority read requests -- Default value: 2000 -- Minimum value: 2000 - -#### `stack-size` - -- Sets the stack size for each thread in the three thread pools. For large requests, you need a large stack to handle -- Default value: 10MB -- Minimum value: 2MB - -### `[storage]` - -This configuration section mainly affects storage write operations, including where data is stored and the TiKV component Scheduler. Scheduler is the core component in Storage that coordinates and processes write requests. It contains a channel to coordinate requests and a thread pool to process requests. - -#### `data-dir` - -- Specifies the path to the data directory -- Default value: /tmp/tikv/store -- Make sure that the data directory is moved before changing this configuration - -#### `scheduler-notify-capacity` - -- Specifies the Scheduler channel size -- Default value: 10240 -- Do not set it too small, otherwise TiKV might crash -- Do not set it too large, because it might consume more memory -- Generally, you don’t need to adjust this configuration unless you are following trustworthy advice - -#### `scheduler-concurrency` - -- Specifies the number of slots of Scheduler’s latch, which controls concurrent write requests -- Default value: 2048000 -- You can set it to a larger value to reduce latch contention if there are a lot of write requests. But it will consume more memory - -#### `scheduler-worker-pool-size` - -- Specifies the Scheduler’s thread pool size. Write requests are finally handled by each worker thread of this thread pool -- Default value: 8 (>= 16 cores) or 4 (< 16 cores) -- Minimum value: 1 -- This configuration must be set larger than zero but should not exceed the number of CPU cores of the host machine -- On machines with more than 16 CPU cores, the default value of this configuration is 8, otherwise 4 -- If you have heavy write requests, you can set this configuration to a larger value. If you are running multiple TiKV instances on the same machine, make sure that the sum of this configuration item does not exceed the number of CPU cores -- You should not set this configuration item to a too small value, otherwise your write request QPS is limited. On the other hand, a larger value is not always the most optimal choice because there could be larger resource contention - -#### `scheduler-pending-write-threshold` - -- Specifies the maximum allowed byte size of pending writes -- Default value: 100MB -- If the size of pending write bytes exceeds this threshold, new requests are simply rejected with the “scheduler too busy” error and not be handled \ No newline at end of file diff --git a/content/docs/3.0/reference/introduction.md b/content/docs/3.0/reference/introduction.md index f3fb1af..18a141c 100644 --- a/content/docs/3.0/reference/introduction.md +++ b/content/docs/3.0/reference/introduction.md @@ -4,11 +4,10 @@ description: Details about TiKV menu: docs: name: Reference - weight: 3 nav: parent: Docs weight: 3 --- -Blerp \ No newline at end of file +This section includes instructions on using TiKV clients and tools. \ No newline at end of file diff --git a/content/docs/3.0/reference/source.md b/content/docs/3.0/reference/source.md deleted file mode 100644 index f89c4dd..0000000 --- a/content/docs/3.0/reference/source.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Source Code -description: Source Code -draft: true -menu: - docs: - parent: Reference ---- \ No newline at end of file diff --git a/content/docs/3.0/reference/tools/_index.md b/content/docs/3.0/reference/tools/_index.md deleted file mode 100644 index 6feefc7..0000000 --- a/content/docs/3.0/reference/tools/_index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Tools -description: Tools which can be used to administrate TiKV -menu: - docs: - parent: Reference ---- \ No newline at end of file diff --git a/content/docs/3.0/reference/tools/introduction.md b/content/docs/3.0/reference/tools/introduction.md new file mode 100644 index 0000000..48c2564 --- /dev/null +++ b/content/docs/3.0/reference/tools/introduction.md @@ -0,0 +1,17 @@ +--- +title: Tools +description: Tools which can be used to administrate TiKV +menu: + docs: + parent: Reference +--- + +There are a number of components and tools involved in maintaining a TiKV deployment. + +You can browse documentation on: + +* [`tikv-server`](../tikv-server): The TiKV service which stores data and serves queries. +* [`tikv-ctl`](../tikv-ctl) +* [`pd-server`](../pd-server) +* [`pd-ctl`](../pd-ctl) +* [`pd-recover`](../pd-recover) \ No newline at end of file diff --git a/content/docs/3.0/reference/tools/pd-control.md b/content/docs/3.0/reference/tools/pd-ctl.md similarity index 99% rename from content/docs/3.0/reference/tools/pd-control.md rename to content/docs/3.0/reference/tools/pd-ctl.md index 79f0a1e..8d6e217 100644 --- a/content/docs/3.0/reference/tools/pd-control.md +++ b/content/docs/3.0/reference/tools/pd-ctl.md @@ -1,13 +1,12 @@ --- -title: PD Control User Guide -description: Use PD Control to obtain the state information of a cluster and tune a cluster. +title: pd-ctl User Guide +description: Learn about interacting with pd-ctl menu: docs: parent: Tools + weight: 4 --- -# PD Control User Guide - As a command line tool of PD, PD Control obtains the state information of the cluster and tunes the cluster. ## Source code compiling diff --git a/content/docs/3.0/reference/tools/pd-recover.md b/content/docs/3.0/reference/tools/pd-recover.md index 33baffe..6864d83 100644 --- a/content/docs/3.0/reference/tools/pd-recover.md +++ b/content/docs/3.0/reference/tools/pd-recover.md @@ -1,13 +1,12 @@ --- -title: PD Recover User Guide -description: Use PD Recover to recover a PD cluster which cannot start or provide services normally. +title: pd-recover User Guide +description: Learn about interacting with pd-recover menu: docs: parent: Tools + weight: 5 --- -# PD Recover User Guide - PD Recover is a disaster recovery tool of PD, used to recover the PD cluster which cannot start or provide services normally. ## Source code compiling diff --git a/content/docs/3.0/reference/tools/pd-server.md b/content/docs/3.0/reference/tools/pd-server.md new file mode 100644 index 0000000..2950995 --- /dev/null +++ b/content/docs/3.0/reference/tools/pd-server.md @@ -0,0 +1,10 @@ +--- +title: pd-server User Guide +description: Learn about interacting with pd-server +menu: + docs: + parent: Tools + weight: 3 +--- + +You can explore `pd-server --help` and try `pd-server your sub command --help` to dig into functionality. \ No newline at end of file diff --git a/content/docs/3.0/reference/tools/tikv-control.md b/content/docs/3.0/reference/tools/tikv-ctl.md similarity index 99% rename from content/docs/3.0/reference/tools/tikv-control.md rename to content/docs/3.0/reference/tools/tikv-ctl.md index f69de09..ae37241 100644 --- a/content/docs/3.0/reference/tools/tikv-control.md +++ b/content/docs/3.0/reference/tools/tikv-ctl.md @@ -1,13 +1,12 @@ --- -title: TiKV Control User Guide -description: Use TiKV Control to manage a TiKV cluster. +title: tikv-ctl User Guide +description: Learn about interacting with tikv-ctl menu: docs: parent: Tools + weight: 2 --- -# TiKV Control User Guide - TiKV Control (`tikv-ctl`) is a command line tool of TiKV, used to manage the cluster. When you compile TiKV, the `tikv-ctl` command is also compiled at the same time. If the cluster is deployed using Ansible, the `tikv-ctl` binary file exists in the corresponding `tidb-ansible/resources/bin` directory. If the cluster is deployed using the binary, the `tikv-ctl` file is in the `bin` directory together with other files such as `tidb-server`, `pd-server`, `tikv-server`, etc. diff --git a/content/docs/3.0/reference/tools/tikv-server.md b/content/docs/3.0/reference/tools/tikv-server.md new file mode 100644 index 0000000..575a11e --- /dev/null +++ b/content/docs/3.0/reference/tools/tikv-server.md @@ -0,0 +1,10 @@ +--- +title: tikv-server User Guide +description: Learn about interacting with tikv-server +menu: + docs: + parent: Tools + weight: 1 +--- + +You can explore `tikv-server --help` and try `tikv-server your sub command --help` to dig into functionality. \ No newline at end of file diff --git a/content/docs/3.0/tasks/backup/_index.md b/content/docs/3.0/tasks/backup/introduction.md similarity index 84% rename from content/docs/3.0/tasks/backup/_index.md rename to content/docs/3.0/tasks/backup/introduction.md index 66d4539..8c44a26 100644 --- a/content/docs/3.0/tasks/backup/_index.md +++ b/content/docs/3.0/tasks/backup/introduction.md @@ -1,6 +1,7 @@ --- title: Backup description: Backup TiKV +draft: true menu: docs: parent: Tasks diff --git a/content/docs/3.0/tasks/configure/introduction.md b/content/docs/3.0/tasks/configure/introduction.md new file mode 100644 index 0000000..85128b7 --- /dev/null +++ b/content/docs/3.0/tasks/configure/introduction.md @@ -0,0 +1,23 @@ +--- +title: Configure +description: Configure a wide range of TiKV facets, including RocksDB, gRPC, the Placement Driver, and more +menu: + docs: + parent: Tasks + weight: 2 +--- + +TiKV features a large number of configuration options you can use to tweak TiKV's behavior. When getting started with TiKV, it's usually safe to start with the defaults, configuring only the `--pd` (`pd.endpoints`) configuration. + +There are several guides that you can use to inform your configuration: + +* [**Security**](../security): Use TLS security and review security procedures. +* [**Topology**](../topology): Use location awareness to improve resilency and performance. +* [**Namespace**](../namespace): Use namespacing to configure resource isolation. +* [**Limit**](../limit): Tweak rate limiting. +* [**Region Merge**](../region-merge): Tweak region merging. +* [**RocksDB**](../rocksdb): Tweak RocksDB configuration options. +* [**Titan**](../titan): Enable titan to improve performance with large values. + +You can find an exhaustive list of all options, as well as what they do, in the documented [**full configuration template**](https://github.com/tikv/tikv/blob/release-3.0/etc/config-template.toml). + diff --git a/content/docs/3.0/tasks/configure/store-limit.md b/content/docs/3.0/tasks/configure/limit.md similarity index 98% rename from content/docs/3.0/tasks/configure/store-limit.md rename to content/docs/3.0/tasks/configure/limit.md index 934fcb3..b8e7234 100644 --- a/content/docs/3.0/tasks/configure/store-limit.md +++ b/content/docs/3.0/tasks/configure/limit.md @@ -1,13 +1,12 @@ --- -title: Store Limits +title: Limit Config description: Learn how to configure scheduling rate limit on stores menu: docs: - parent: Configure TiKV + parent: Configure + weight: 4 --- -# Store Limit - This section describes how to configure scheduling rate limit, specifically, at the store level. In TiKV, PD generates different scheduling operators based on the information gathered from TiKV and scheduling strategies. The operators are then sent to TiKV to perform scheduling on Regions. You can use `*-schedule-limit` to set speed limits on different operators, but this may cause performance bottlenecks in certain scenarios because these parameters function globally on the entire cluster. Rate limit at the store level allows you to control scheduling more flexibly with more refined granularities. diff --git a/content/docs/3.0/tasks/configure/namespace.md b/content/docs/3.0/tasks/configure/namespace.md index 08a9683..e2f8408 100644 --- a/content/docs/3.0/tasks/configure/namespace.md +++ b/content/docs/3.0/tasks/configure/namespace.md @@ -1,13 +1,12 @@ --- -title: Namespace Configuration +title: Namespace Config description: Learn how to configure namespace in TiKV. menu: docs: - parent: Configure TiKV + parent: Configure + weight: 3 --- -# Namespace Configuration - Namespace is a mechanism used to meet the requirements of resource isolation. In this mechanism, TiKV supports dividing all the TiKV nodes in the cluster among multiple separate namespaces and classifying Regions into the corresponding namespace by using a custom namespace classifier. In this case, there is actually a constraint for the scheduling policy: the namespace that a Region belongs to should match the namespace of TiKV where each replica of this Region resides. PD continuously performs the constraint check during runtime. When it finds unmatched namespaces, it will schedule the Regions to make the replica distribution conform to the namespace configuration. diff --git a/content/docs/3.0/tasks/configure/region-merge.md b/content/docs/3.0/tasks/configure/region-merge.md index f8540e7..eb52bc5 100644 --- a/content/docs/3.0/tasks/configure/region-merge.md +++ b/content/docs/3.0/tasks/configure/region-merge.md @@ -1,13 +1,12 @@ --- -title: Region Merge +title: Region Merge Config description: Learn how to configure Region Merge in TiKV. menu: docs: - parent: Configure TiKV + parent: Configure + weight: 5 --- -# Region Merge - TiKV replicates a segment of data in Regions via the Raft state machine. As data writes increase, a Region Split happens when the size of the region or the number of keys has reached a threshold. Conversely, if the size of the Region or the amount of keys shrinks because of data deletion, we can use Region Merge to merge adjacent regions that are smaller. This relieves some stress on Raftstore. @@ -19,12 +18,12 @@ Region Merge is initiated by the Placement Driver (PD). The steps are: 2. When the region size is less than `max-merge-region-size` or the number of keys the region includes is less than `max-merge-region-keys`, PD performs Region Merge on the smaller of the two adjacent Regions. -> **Note:** -> -> - All replicas of the merged Regions must belong to the same set of TiKVs. -> - Newly split Regions won't be merged within the period of time specified by `split-merge-interval`. -> - Region Merge won't happen within the period of time specified by `split-merge-interval` after PD starts or restarts. ->- Region Merge won't happen for two Regions that belong to different tables if `namespace-classifier = table` (default). +**Note:** + +- All replicas of the merged Regions must belong to the same set of TiKVs. +- Newly split Regions won't be merged within the period of time specified by `split-merge-interval`. +- Region Merge won't happen within the period of time specified by `split-merge-interval` after PD starts or restarts. +- Region Merge won't happen for two Regions that belong to different tables if `namespace-classifier = table` (default). ## Configure Region Merge diff --git a/content/docs/3.0/tasks/configure/_index.md b/content/docs/3.0/tasks/configure/rocksdb.md similarity index 85% rename from content/docs/3.0/tasks/configure/_index.md rename to content/docs/3.0/tasks/configure/rocksdb.md index 3750964..fd72b8e 100644 --- a/content/docs/3.0/tasks/configure/_index.md +++ b/content/docs/3.0/tasks/configure/rocksdb.md @@ -1,13 +1,12 @@ --- -title: Configure TiKV -description: Configure a wide range of TiKV facets, including RocksDB, gRPC, the Placement Driver, and more +title: RocksDB Config +description: Learn how to configure namespace in TiKV. menu: docs: - parent: Tasks + parent: Configure + weight: 6 --- -## RocksDB configuration {#rocksdb} - TiKV uses [RocksDB](https://rocksdb.org/) as its underlying storage engine for storing both [Raft logs](architecture#raft) and KV (key-value) pairs. {{< info >}} diff --git a/content/docs/3.0/tasks/configure/secure.md b/content/docs/3.0/tasks/configure/security.md similarity index 98% rename from content/docs/3.0/tasks/configure/secure.md rename to content/docs/3.0/tasks/configure/security.md index bf3a02c..1beb53e 100644 --- a/content/docs/3.0/tasks/configure/secure.md +++ b/content/docs/3.0/tasks/configure/security.md @@ -1,8 +1,10 @@ --- -title: Secure TiKV +title: Security Config +description: Keeping your TiKV deployment secure menu: docs: - parent: Configure TiKV + parent: Configure + weight: 1 --- This page discusses how to secure your TiKV deployment. Learn how to: diff --git a/content/docs/3.0/tasks/configure/titan.md b/content/docs/3.0/tasks/configure/titan.md index 622b8d5..0acdc1d 100644 --- a/content/docs/3.0/tasks/configure/titan.md +++ b/content/docs/3.0/tasks/configure/titan.md @@ -1,24 +1,26 @@ --- -title: Titan +title: Titan Config description: Learn how to enable Titan in TiKV. menu: docs: - parent: Configure TiKV + parent: Configure + weight: 7 --- -# Titan - Titan is a plugin of RocksDB developed by PingCAP to provide key-value separation. The goal of Titan is to reduce write amplification of RocksDB when using large values. ## How Titan works -![Titan Architecture](../../images/titan-architecture.png) +{{< figure + src="/img/docs/titan-architecture.png" + caption="Titan Architecture" + number="" >}} Titan separates values from the LSM-tree during flush and compaction. While the actual value is stored in a blob file, the value in the LSM tree functions as the position index of the actual value. When a GET operation is performed, Titan obtains the blob index for the corresponding key from the LSM tree. Using the index, Titan identifies the actual value from the blob file and returns it. For more details on design and implementation of Titan, please refer to [Titan: A RocksDB Plugin to Reduce Write Amplification](https://pingcap.com/blog/titan-storage-engine-design-and-implementation/). -> Caveat: -> -> Titan's improved write performance is at the cost of sacrificing storage space and range query performance. It's mostly recommended for scenarios of large values (>= 1KB). +{{< info >}} +**Caveat:** Titan's improved write performance is at the cost of sacrificing storage space and range query performance. It's mostly recommended for scenarios of large values (>= 1KB). +{{< /info >}} ## How to enable Titan diff --git a/content/docs/3.0/tasks/deploy/location-awareness.md b/content/docs/3.0/tasks/configure/topology.md similarity index 96% rename from content/docs/3.0/tasks/deploy/location-awareness.md rename to content/docs/3.0/tasks/configure/topology.md index 41deeaa..f4af919 100644 --- a/content/docs/3.0/tasks/deploy/location-awareness.md +++ b/content/docs/3.0/tasks/configure/topology.md @@ -1,13 +1,12 @@ --- -title: Label Configuration +title: Topology Config description: Learn how to configure labels. menu: docs: - parent: Deploy + parent: Configure + weight: 2 --- -# Label Configuration - TiKV uses labels to label its location information and PD schedulers according to the topology of the cluster, to maximize TiKV's capability of disaster recovery. This document describes how to configure labels. ## TiKV reports the topological information diff --git a/content/docs/3.0/tasks/deploy/_index.md b/content/docs/3.0/tasks/deploy/_index.md deleted file mode 100644 index 9054b4f..0000000 --- a/content/docs/3.0/tasks/deploy/_index.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: Deploy -description: Run TiKV using Ansible or Docker -menu: - docs: - parent: Tasks ---- - -This document tells you how to install TiKV using: - -* [Ansible](#ansible) -* [Docker](#docker) - -## Ansible - -Ansible is an IT automation tool that can configure systems, deploy software, and orchestrate more advanced IT tasks such as continuous deployments or zero downtime rolling updates. - -[TiDB-Ansible](https://github.com/pingcap/tidb-ansible) is a TiDB cluster deployment tool developed by PingCAP, based on Ansible playbook. TiDB-Ansible enables you to quickly deploy a new TiKV cluster which includes PD, TiKV, and the cluster monitoring modules. - -{{< warning >}} -For production environments, use TiDB-Ansible to deploy your TiKV cluster. If you only want to try TiKV out and explore the features, see Install and Deploy TiKV using Docker Compose on a single machine. -{{< /warning >}} - -### Prepare - -Before you start, make sure you have: - -1. Several target machines that meet the following requirements: - - * 4 or more machines. A standard TiKV cluster contains 6 machines. You can use 4 machines for testing. - * CentOS 7.3 (64 bit) or later with Python 2.7 installed, x86_64 architecture (AMD64) - * Network between machines - - **Note**: When you deploy TiKV using Ansible, use SSD disks for the data directory of TiKV and PD nodes. Otherwise, the system will not perform well. - -2. A Control Machine that meets the following requirements: - - * CentOS 7.3 (64 bit) or later with Python 2.7 installed - * Access to the Internet - * Git installed - - **Note**: The Control Machine can be one of the target machines. - -TODO... - -## Docker - -TODO diff --git a/content/docs/3.0/tasks/deploy/hardware-recommendation.md b/content/docs/3.0/tasks/deploy/introduction.md similarity index 96% rename from content/docs/3.0/tasks/deploy/hardware-recommendation.md rename to content/docs/3.0/tasks/deploy/introduction.md index fa89fb5..bd4879c 100644 --- a/content/docs/3.0/tasks/deploy/hardware-recommendation.md +++ b/content/docs/3.0/tasks/deploy/introduction.md @@ -1,11 +1,12 @@ --- -title: Software and Hardware Requirements -description: Learn the software and hardware requirements for deploying and running TiKV. - +title: Deploy +description: Run TiKV using Ansible or Docker +menu: + docs: + parent: Tasks + weight: 1 --- -# Software and Hardware Requirements - As an open source distributed Key-Value database with high performance, TiKV can be deployed in the Intel architecture server and major virtualization environments and runs well. TiKV supports most of the major hardware networks and Linux operating systems. TiKV must work together with [Placement Driver](https://github.com/pingcap/pd/) (PD). PD is the cluster manager of TiKV, which periodically checks replication constraints to balance load and data automatically. diff --git a/content/docs/3.0/tasks/deploy/using-ansible.md b/content/docs/3.0/tasks/deploy/using-ansible.md index afeb024..5be2d58 100644 --- a/content/docs/3.0/tasks/deploy/using-ansible.md +++ b/content/docs/3.0/tasks/deploy/using-ansible.md @@ -1,13 +1,12 @@ --- -title: Install and Deploy TiKV Using Ansible +title: Ansible Deployment description: Use TiDB-Ansible to deploy a TiKV cluster on multiple nodes. menu: docs: parent: Deploy + weight: 2 --- -# Install and Deploy TiKV Using Ansible - This guide describes how to install and deploy TiKV using Ansible. Ansible is an IT automation tool that can configure systems, deploy software, and orchestrate more advanced IT tasks such as continuous deployments or zero downtime rolling updates. [TiDB-Ansible](https://github.com/pingcap/tidb-ansible) is a TiDB cluster deployment tool developed by PingCAP, based on Ansible playbook. TiDB-Ansible enables you to quickly deploy a new TiKV cluster which includes PD, TiKV, and the cluster monitoring modules. diff --git a/content/docs/3.0/tasks/deploy/using-binary.md b/content/docs/3.0/tasks/deploy/using-binary.md index 4d5beee..73aaf0d 100644 --- a/content/docs/3.0/tasks/deploy/using-binary.md +++ b/content/docs/3.0/tasks/deploy/using-binary.md @@ -1,13 +1,12 @@ --- -title: Install and Deploy TiKV Using Binary Files +title: Binary Deployment description: Use binary files to deploy a TiKV cluster on a single machine or on multiple nodes for testing. menu: docs: parent: Deploy + weight: 4 --- -# Install and Deploy TiKV Using Binary Files - This guide describes how to deploy a TiKV cluster using binary files. > **Warning:** Do not use binary files to deploy the TiKV cluster in the production environment. For production, [use Ansible to deploy the TiKV cluster](using-ansible.md). diff --git a/content/docs/3.0/tasks/deploy/using-docker-compose.md b/content/docs/3.0/tasks/deploy/using-docker-compose.md index e1e0d9a..2940cac 100644 --- a/content/docs/3.0/tasks/deploy/using-docker-compose.md +++ b/content/docs/3.0/tasks/deploy/using-docker-compose.md @@ -1,13 +1,12 @@ --- -title: Install and Deploy TiKV Using Docker Compose +title: Docker Compose description: Use Docker Compose to quickly deploy a TiKV testing cluster on a single machine. menu: docs: parent: Deploy + weight: 5 --- -# Install and Deploy TiKV Using Docker Compose - This guide describes how to quickly deploy a TiKV testing cluster using [Docker Compose](https://github.com/pingcap/tidb-docker-compose/) on a single machine. Currently, this installation method only supports the Linux system. > **Warning:** Do not use Docker Compose to deploy the TiKV cluster in the production environment. For production, [use Ansible to deploy the TiKV cluster](deploy-tikv-using-ansible.md). diff --git a/content/docs/3.0/tasks/deploy/using-docker.md b/content/docs/3.0/tasks/deploy/using-docker.md index 341773e..812fe5d 100644 --- a/content/docs/3.0/tasks/deploy/using-docker.md +++ b/content/docs/3.0/tasks/deploy/using-docker.md @@ -1,13 +1,12 @@ --- -title: Install and Deploy TiKV Using Docker +title: Docker Deployment description: Use Docker to deploy a TiKV cluster on multiple nodes. menu: docs: parent: Deploy + weight: 3 --- -# Install and Deploy TiKV Using Docker - This guide describes how to deploy a multi-node TiKV cluster using Docker. > **Warning:** Do not use Docker to deploy the TiKV cluster in the production environment. For production, [use Ansible to deploy the TiKV cluster](using-ansible.md). diff --git a/content/docs/3.0/tasks/quick-start.md b/content/docs/3.0/tasks/getting-started.md similarity index 98% rename from content/docs/3.0/tasks/quick-start.md rename to content/docs/3.0/tasks/getting-started.md index 7e9b5ab..d0d0352 100644 --- a/content/docs/3.0/tasks/quick-start.md +++ b/content/docs/3.0/tasks/getting-started.md @@ -9,8 +9,6 @@ menu: weight: 2 --- -# Install and Deploy TiKV Using Docker Compose - This guide describes how to quickly deploy a TiKV testing cluster using [Docker Compose](https://github.com/pingcap/tidb-docker-compose/) on a single machine. Currently, this installation method only supports the Linux system. > **Warning:** Do not use Docker Compose to deploy the TiKV cluster in the production environment. For production, [use Ansible to deploy the TiKV cluster](../deploy/using-ansible.md). diff --git a/content/docs/3.0/tasks/monitor/_index.md b/content/docs/3.0/tasks/monitor/_index.md deleted file mode 100644 index 14cc853..0000000 --- a/content/docs/3.0/tasks/monitor/_index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Monitor -description: Monitor TiKV -menu: - docs: - parent: Tasks ---- \ No newline at end of file diff --git a/content/docs/3.0/tasks/monitor/overview.md b/content/docs/3.0/tasks/monitor/introduction.md similarity index 74% rename from content/docs/3.0/tasks/monitor/overview.md rename to content/docs/3.0/tasks/monitor/introduction.md index a072950..b1fa842 100644 --- a/content/docs/3.0/tasks/monitor/overview.md +++ b/content/docs/3.0/tasks/monitor/introduction.md @@ -1,13 +1,12 @@ --- -title: Overview of the TiKV Monitoring Framework -description: Use Prometheus and Grafana to build the TiKV monitoring framework. +title: Monitor +description: Monitor TiKV menu: docs: - parent: Monitor + parent: Tasks + weight: 3 --- -# Overview of the TiKV Monitoring Framework - The TiKV monitoring framework adopts two open-source projects: [Prometheus](https://github.com/prometheus/prometheus) and [Grafana](https://github.com/grafana/grafana). TiKV uses Prometheus to store the monitoring and performance metrics, and uses Grafana to visualize these metrics. ## About Prometheus in TiKV @@ -19,9 +18,10 @@ As a time series database, Prometheus has a multi-dimensional data model and fle - Pushgateway: to receive the data from Client Push for the Prometheus main server - AlertManager: for the alerting mechanism -The diagram is as follows: - -![Prometheus in TiKV](../../images/prometheus-in-tikv.png) +{{< figure + src="/img/docs/prometheus-in-tikv.png" + caption="Prometheus in TiKV" + number="" >}} ## About Grafana in TiKV diff --git a/content/docs/3.0/tasks/monitor/key-metrics.md b/content/docs/3.0/tasks/monitor/key-metrics.md index ea7c136..a18e058 100644 --- a/content/docs/3.0/tasks/monitor/key-metrics.md +++ b/content/docs/3.0/tasks/monitor/key-metrics.md @@ -4,10 +4,9 @@ description: Learn some key metrics displayed on the Grafana Overview dashboard. menu: docs: parent: Monitor + weight: 2 --- -# Key Metrics - If your TiKV cluster is deployed using Ansible or Docker Compose, the monitoring system is deployed at the same time. For more details, see [Overview of the TiKV Monitoring Framework](../../how-to/monitor/overview.md). The Grafana dashboard is divided into a series of sub-dashboards which include Overview, PD, TiKV, and so on. You can use various metrics to help you diagnose the cluster. diff --git a/content/docs/3.0/tasks/monitor/tikv-cluster.md b/content/docs/3.0/tasks/monitor/tikv-cluster.md index 3cd7e6e..05fde39 100644 --- a/content/docs/3.0/tasks/monitor/tikv-cluster.md +++ b/content/docs/3.0/tasks/monitor/tikv-cluster.md @@ -1,13 +1,12 @@ --- -title: Monitor a TiKV Cluster +title: Monitoring a Cluster description: Learn how to monitor the state of a TiKV cluster. menu: docs: parent: Monitor + weight: 1 --- -# Monitor a TiKV Cluster - Currently, you can use two types of interfaces to monitor the state of the TiKV cluster: - [The component state interface](#the-component-state-interface): use the HTTP interface to get the internal information of a component, which is called the component state interface. diff --git a/content/docs/3.0/tasks/scale/_index.md b/content/docs/3.0/tasks/scale/_index.md deleted file mode 100644 index 9071dac..0000000 --- a/content/docs/3.0/tasks/scale/_index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Scale -description: SCale TiKV -menu: - docs: - parent: Tasks ---- \ No newline at end of file diff --git a/content/docs/3.0/tasks/scale/ansible-deployment-scale.md b/content/docs/3.0/tasks/scale/ansible.md similarity index 98% rename from content/docs/3.0/tasks/scale/ansible-deployment-scale.md rename to content/docs/3.0/tasks/scale/ansible.md index c764dcc..3d83ebc 100644 --- a/content/docs/3.0/tasks/scale/ansible-deployment-scale.md +++ b/content/docs/3.0/tasks/scale/ansible.md @@ -1,16 +1,14 @@ --- -title: Scale a TiKV Cluster Using TiDB-Ansible +title: Ansible Scaling description: Use TiDB-Ansible to scale out or scale in a TiKV cluster. menu: docs: parent: Scale --- -# Scale a TiKV Cluster Using TiDB-Ansible - This document describes how to use TiDB-Ansible to scale out or scale in a TiKV cluster without affecting the online services. -> **Note:** This document applies to the TiKV deployment using Ansible. If your TiKV cluster is deployed in other ways, see [Scale a TiKV Cluster](horizontal-scale.md). +> **Note:** This document applies to the TiKV deployment using Ansible. If your TiKV cluster is deployed in other ways, see [Scale a TiKV Cluster](../introduction). Assume that the topology is as follows: diff --git a/content/docs/3.0/tasks/scale/horizontal-scale.md b/content/docs/3.0/tasks/scale/introduction.md similarity index 95% rename from content/docs/3.0/tasks/scale/horizontal-scale.md rename to content/docs/3.0/tasks/scale/introduction.md index 31d63d8..3558023 100644 --- a/content/docs/3.0/tasks/scale/horizontal-scale.md +++ b/content/docs/3.0/tasks/scale/introduction.md @@ -1,16 +1,15 @@ --- -title: Scale a TiKV Cluster -description: Learn how to scale out or scale in a TiKV cluster. +title: Scale +description: SCale TiKV menu: docs: - parent: Scale + parent: Tasks + weight: 4 --- -# Scale a TiKV Cluster - You can scale out a TiKV cluster by adding nodes to increase the capacity without affecting online services. You can also scale in a TiKV cluster by deleting nodes to decrease the capacity without affecting online services. -> **Note:** If your TiKV cluster is deployed using Ansible, see [Scale the TiKV Cluster Using TiDB-Ansible](ansible-deployment-scale.md). +> **Note:** If your TiKV cluster is deployed using Ansible, see [Scale the TiKV Cluster Using TiDB-Ansible](../ansible). ## Scale out or scale in PD diff --git a/layouts/docs/single.html b/layouts/docs/single.html index 4b913c7..36d67c9 100644 --- a/layouts/docs/single.html +++ b/layouts/docs/single.html @@ -13,16 +13,17 @@ TiKV | {{ .Title }}
{{ range .Site.Menus.docs }} - {{ $submenu := (index (where $docs "Name" .Name) 0) }} - {{ if (or ($currentPage.HasMenuCurrent "docs" $submenu) ($currentPage.IsMenuCurrent "docs" $submenu)) }} - {{ partial "entry-tree.html" (dict "entries" .Children "currentPage" $currentPage ) }} - {{ end }} + {{ $submenu := (index (where $docs "Name" .Name) 0) }} + {{ if (or ($currentPage.HasMenuCurrent "docs" $submenu) ($currentPage.IsMenuCurrent "docs" $submenu)) }} + {{ partial "entry-tree.html" (dict "entries" .Children "currentPage" $currentPage ) }} + {{ end }} {{ end }}
+ {{ partial "admonition.html" (dict "type" "info" "icon" "fa-info-circle" "text" ("We are currently refactoring our documentation. Please excuse any problems you may find and report them [here](https://github.com/tikv/website)." | markdownify)) }} {{ partial "docs/version-warning.html" . }} {{ partial "math.html" . }} diff --git a/layouts/partials/entry-tree.html b/layouts/partials/entry-tree.html index 7488cc4..f796ddd 100644 --- a/layouts/partials/entry-tree.html +++ b/layouts/partials/entry-tree.html @@ -35,7 +35,7 @@ {{ else }}
  • {{ .Name }} diff --git a/static/img/docs/prometheus-in-tikv.png b/static/img/docs/prometheus-in-tikv.png new file mode 100644 index 0000000000000000000000000000000000000000..8cae964994a27b616e14f0ac90c19e6e9df66e63 GIT binary patch literal 72390 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%0A-os}Q_S@d)$VkMxSDL)8-%2~@i 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

    2-R0x~^Fw$P)khEKWDirlV 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