From 4d6da773877c58a972242ceadf35f4ac51abee21 Mon Sep 17 00:00:00 2001 From: hallaroo Date: Fri, 31 Mar 2023 11:49:02 -0600 Subject: [PATCH 01/10] adding in freshdesk faqs Signed-off-by: hallaroo Signed-off-by: deepthi --- content/en/docs/faq/_index.md | 20 ++-- .../docs/faq/advanced-configuration/_index.md | 6 ++ .../advanced-configuration/authentication.md | 30 ++++++ .../faq/advanced-configuration/components.md | 25 +++++ .../faq/advanced-configuration/metrics.md | 21 ++++ .../docs/faq/advanced-configuration/vindex.md | 43 ++++++++ .../advanced-configuration/vreplication.md | 24 +++++ .../faq/advanced-configuration/vschema.md | 39 +++++++ .../docs/faq/advanced-configuration/vtgate.md | 59 +++++++++++ .../faq/advanced-configuration/vttablet.md | 52 ++++++++++ content/en/docs/faq/getting-started/_index.md | 6 ++ .../docs/faq/getting-started/compatibility.md | 51 +++++++++ .../en/docs/faq/getting-started/components.md | 70 +++++++++++++ .../en/docs/faq/getting-started/metrics.md | 35 +++++++ .../en/docs/faq/getting-started/overview.md | 97 ++++++++++++++++++ .../en/docs/faq/getting-started/topology.md | 61 +++++++++++ .../docs/faq/getting-started/vreplication.md | 29 ++++++ .../en/docs/faq/getting-started/vschema.md | 59 +++++++++++ content/en/docs/faq/migrating/_index.md | 6 ++ .../docs/faq/migrating/advanced-migrations.md | 37 +++++++ content/en/docs/faq/migrating/overview.md | 54 ++++++++++ .../en/docs/faq/migrating/query-rewriting.md | 27 +++++ .../en/docs/faq/operating-vitess/_index.md | 6 ++ .../faq/operating-vitess/backup-restore.md | 34 ++++++ .../faq/operating-vitess/configuration.md | 47 +++++++++ .../docs/faq/operating-vitess/kubernetes.md | 36 +++++++ .../en/docs/faq/operating-vitess/overview.md | 39 +++++++ .../en/docs/faq/operating-vitess/queries.md | 57 ++++++++++ content/en/docs/faq/sharding/_index.md | 6 ++ content/en/docs/faq/sharding/advanced.md | 17 +++ content/en/docs/faq/sharding/overview.md | 48 +++++++++ content/en/docs/faq/sharding/vreplication.md | 17 +++ content/en/docs/faq/troubleshooting/_index.md | 6 ++ .../docs/faq/troubleshooting/common-errors.md | 65 ++++++++++++ .../docs/faq/troubleshooting/information.md | 58 +++++++++++ static/img/vitess-components.png | Bin 0 -> 247428 bytes 36 files changed, 1277 insertions(+), 10 deletions(-) create mode 100644 content/en/docs/faq/advanced-configuration/_index.md create mode 100644 content/en/docs/faq/advanced-configuration/authentication.md create mode 100644 content/en/docs/faq/advanced-configuration/components.md create mode 100644 content/en/docs/faq/advanced-configuration/metrics.md create mode 100644 content/en/docs/faq/advanced-configuration/vindex.md create mode 100644 content/en/docs/faq/advanced-configuration/vreplication.md create mode 100644 content/en/docs/faq/advanced-configuration/vschema.md create mode 100644 content/en/docs/faq/advanced-configuration/vtgate.md create mode 100644 content/en/docs/faq/advanced-configuration/vttablet.md create mode 100644 content/en/docs/faq/getting-started/_index.md create mode 100644 content/en/docs/faq/getting-started/compatibility.md create mode 100644 content/en/docs/faq/getting-started/components.md create mode 100644 content/en/docs/faq/getting-started/metrics.md create mode 100644 content/en/docs/faq/getting-started/overview.md create mode 100644 content/en/docs/faq/getting-started/topology.md create mode 100644 content/en/docs/faq/getting-started/vreplication.md create mode 100644 content/en/docs/faq/getting-started/vschema.md create mode 100644 content/en/docs/faq/migrating/_index.md create mode 100644 content/en/docs/faq/migrating/advanced-migrations.md create mode 100644 content/en/docs/faq/migrating/overview.md create mode 100644 content/en/docs/faq/migrating/query-rewriting.md create mode 100644 content/en/docs/faq/operating-vitess/_index.md create mode 100644 content/en/docs/faq/operating-vitess/backup-restore.md create mode 100644 content/en/docs/faq/operating-vitess/configuration.md create mode 100644 content/en/docs/faq/operating-vitess/kubernetes.md create mode 100644 content/en/docs/faq/operating-vitess/overview.md create mode 100644 content/en/docs/faq/operating-vitess/queries.md create mode 100644 content/en/docs/faq/sharding/_index.md create mode 100644 content/en/docs/faq/sharding/advanced.md create mode 100644 content/en/docs/faq/sharding/overview.md create mode 100644 content/en/docs/faq/sharding/vreplication.md create mode 100644 content/en/docs/faq/troubleshooting/_index.md create mode 100644 content/en/docs/faq/troubleshooting/common-errors.md create mode 100644 content/en/docs/faq/troubleshooting/information.md create mode 100644 static/img/vitess-components.png diff --git a/content/en/docs/faq/_index.md b/content/en/docs/faq/_index.md index 4baf0af9a..c591439cf 100644 --- a/content/en/docs/faq/_index.md +++ b/content/en/docs/faq/_index.md @@ -8,17 +8,18 @@ aliases: ['/docs/user-guides/faq/'] ## Where can I ask questions about Vitess? -Our most popular channel and the one we recommend for asking questions you may have is our Slack located [here](https://vitess.io/slack). +We recommend asking questions in our [Slack workspace](https://vitess.io/slack). -We have a number of other options that can be used as well listed [here](https://vitess.io/community/). +We have a number of [other options](https://vitess.io/community/) that can be used as well. -Please do note that we request that you do not ask individual project members for support. Instead please use these channels where the whole community can help you and benefit from the solutions provided. Thanks! +We request that you not ask individual project members for support. Instead, please use these public communication channels where the community can help and also benefit from the solutions provided. Thanks! ## What are the key slack channels to join? There are many channels available and we encourage you to join as many or as few as interest you. Some of the most popular channels are listed below: * #general +* #beginners * #developers * #kubernetes * #monitoring @@ -26,22 +27,21 @@ There are many channels available and we encourage you to join as many or as few * #orchestrator-integration * #releases * #vreplication +* #website ## How can I contribute a Pull Request to Vitess? -We always enjoy having new contributors to Vitess. Just be sure to read the information [here](https://vitess.io/docs/contributing/) to start. +We welcome new contributors to Vitess. Just be sure to read the guide [here](https://vitess.io/docs/contributing/) to start. -If you are already familiar with Vitess and you'd like information on how to file a Pull Request or submit an Issue request check out the following links: +If you are already familiar with Vitess and you would like information on how to submit a Pull Request or file an Issue check out the following links: -* [Pull Requests](https://vitess.io/docs/contributing/github-workflow/#sending-pull-requests) +* [GitHub Workflow](https://vitess.io/docs/contributing/github-workflow/) * [Issue](https://vitess.io/docs/contributing/github-workflow/#submitting-issues) ## What are good videos to watch to get started learning about Vitess? We have a number of [recorded presentations and videos](https://vitess.io/docs/resources/presentations/) that can be watched to start learning about Vitess. -* For a curated list please check out a PlanetScale blog post [here](https://www.planetscale.com/blog/videos-intro-to-vitess-its-powerful-capabilities-and-how-to-get-started). +* For a curated list please check out this PlanetScale [blog post](https://www.planetscale.com/blog/videos-intro-to-vitess-its-powerful-capabilities-and-how-to-get-started). -## Where can I read additional FAQs? - -PlanetScale hosts a knowledge base for Vitess. This additional resource is available [here](https://planetscale.freshdesk.com/support/solutions). +## Additional FAQs? diff --git a/content/en/docs/faq/advanced-configuration/_index.md b/content/en/docs/faq/advanced-configuration/_index.md new file mode 100644 index 000000000..83ddc3c83 --- /dev/null +++ b/content/en/docs/faq/advanced-configuration/_index.md @@ -0,0 +1,6 @@ +--- +title: Advanced Configuration +description: Frequently Asked Questions about Vitess +docs_nav_disable_expand: false +--- + diff --git a/content/en/docs/faq/advanced-configuration/authentication.md b/content/en/docs/faq/advanced-configuration/authentication.md new file mode 100644 index 000000000..eca813eee --- /dev/null +++ b/content/en/docs/faq/advanced-configuration/authentication.md @@ -0,0 +1,30 @@ +--- +title: Authentication +description: Frequently Asked Questions about Vitess +weight: 1 +--- + +## How do I set up MySQL authentication in Vitess? + +Vitess uses its own mechanism for managing users and their permissions through VTGate. As a result, the CREATE USER.... and GRANT... statements will not work if sent through VTGate. Instead VTGate takes care of authentication for requests, so you will need to add any users that should have access to the Keyspaces via command-line options to VTGate. + +The simplest way to configure users is via a static authentication method. You can define the users in a JSON formatted file or string. Then you can load this file into VTGate with the additional command line parameters. + +You will be able to configure the UserData string and add multiple passwords. For password format, Vitess supports the mysql_native_password hash format and you should always specify your passwords using this in a non-test or external environment. + +To see an example of how to configure the static authentication file and more information on the various options please read this [guide](https://vitess.io/docs/user-guides/configuration-advanced/user-management/#authentication). + +There are other authentication mechanisms that can be utilized including LDAP-based authentication and TLS client certificate-based authentication. + +## How do I configure user-level permissions in Vitess? + +If you need to enforce fine-grained access control in Vitess, you cannot use the normal MySQL GRANT system to give certain application-level MySQL users more or fewer permissions than others. This is because Vitess uses connection pooling with fixed MySQL users at the VTTablet level, and implements its own authentication at the VTGate level. + +Not all of the MySQL GRANT system has been implemented in Vitess. Authorization can be done via table-level ACLs. Individual users at the VTGate level can be assigned 3 levels of permissions. +- Read (corresponding to read DML, e.g. SELECT) +- Write (corresponding to write DML, e.g. INSERT, UPDATE, DELETE) +- Admin (corresponding to DDL, e.g. ALTER TABLE) + +The tables to which the permissions apply can be enumerated or specified using a regular expression. + +Vitess authorization via ACLs is applied at the VTTablet level, as opposed to on VTGate, where authentication is enforced. There are a number of VTTablet command line parameters that control the behavior of ACLs. You can see examples and read more about the command line parameters and further configuration options [here](https://vitess.io/docs/user-guides/configuration-advanced/authorization/#vttablet-parameters-for-table-acls). diff --git a/content/en/docs/faq/advanced-configuration/components.md b/content/en/docs/faq/advanced-configuration/components.md new file mode 100644 index 000000000..3cf487185 --- /dev/null +++ b/content/en/docs/faq/advanced-configuration/components.md @@ -0,0 +1,25 @@ +--- +title: Components +description: Frequently Asked Questions about Vitess +weight: 2 +--- + +## How can I change MySQL server variables in Vitess? + +In general, if you want to apply global variables at the MySQL level, you have to do it through VTTablet. There are a few ways to do that in the operator, but we recommend that you use vtctldclient ExecuteFetchAsDba. + +For example if you want to temporarily switch `sync_binlog` off on the MySQL that is being managed by a tablet with alias `zone1-0000000100` you would perform the following: + +```sh +$ vtctldclient -server localhost:15999 ExecuteFetchAsDba zone1-0000000100 "set global sync_binlog=0" +``` + +This would show the following result after checking the variable: + +```sh +$ vtctldclient -server localhost:15999 ExecuteFetchAsDba zone1-0000000100 "show variables like 'sync_binlog'"+---------------+-------+| Variable_name | Value |+---------------+-------+| sync_binlog | 0 |+---------------+-------+ +``` + +## Examples of how to use Vitess components + +We have a couple of step through examples in Github [here](https://github.com/aquarapid/vitess_examples). Currently, these cover Operator Backup and Restore, Create Lookup Vindex, and VStream. diff --git a/content/en/docs/faq/advanced-configuration/metrics.md b/content/en/docs/faq/advanced-configuration/metrics.md new file mode 100644 index 000000000..ba60a96aa --- /dev/null +++ b/content/en/docs/faq/advanced-configuration/metrics.md @@ -0,0 +1,21 @@ +--- +title: Metrics +description: Frequently Asked Questions about Vitess +weight: 8 +--- + +## What Grafana dashboards are available? + +There are a set of Grafana dashboards and Prometheus alerts available on the Vitess tree in GitHub [here](https://github.com/vitessio/vitess/tree/master/vitess-mixin). You can get some additional context on these dashboards [here](https://github.com/vitessio/vitess/pull/5609). + +## How can I implement user-level query logging? + +If you would like to differentiate metrics for a 'bad_user@their_machine' from a 'good_user@their_machine', rather than having both users appear to be the same user from the same server to MySQL you will need to use table ACLs. + +Vitess exports per-user stats on table ACLs. There are example usages of table ACLs demonstrated in the end-to-end tests. +- The configuration of table ACLs can be found [here](https://github.com/vitessio/vitess/blob/master/go/vt/vttablet/endtoend/main_test.go#L174). +- The tests that demonstrate how table ACLs work can be found [here](https://github.com/vitessio/vitess/blob/master/go/vt/vttablet/endtoend/acl_test.go). + +To locate the variables that enable the export of per-users stats you will need to look in `/debug/vars` for variables that start with `User`, like `UserTableQueryCount`. The export itself is a multi-dimensional export categorized by Table, User and Query Type. You can also find similar names exported as prometheus metrics. + +Analyzing these variables can enable you to quickly narrow down the root cause of an incident, as these stats are fine-grained. Once you've identified the table and query type, you can then drill into `/queryz` or `/debug/query_stats` to determine if the issue is a particular query. diff --git a/content/en/docs/faq/advanced-configuration/vindex.md b/content/en/docs/faq/advanced-configuration/vindex.md new file mode 100644 index 000000000..7c1765658 --- /dev/null +++ b/content/en/docs/faq/advanced-configuration/vindex.md @@ -0,0 +1,43 @@ +--- +title: Vindex +description: Frequently Asked Questions about Vitess +weight: 6 +--- + +## What is a secondary Vindex? How does it work? + +Secondary Vindexes are additional Vindexes against other columns of a table offering optimizations for WHERE clauses that do not use the Primary Vindex. Secondary Vindexes return a single or a limited set of keyspace IDs which will allow VTGate to only target shards where the relevant data is present. In the absence of a Secondary Vindex, VTGate would have to send the query to all shards (called a scatter query). + +It is important to note that Secondary Vindexes are only used for making routing decisions. The underlying database shards will need traditional indexes on those same columns, to allow efficient retrieval from the table on the underlying MySQL instances. + +MARKED NOT HELPFUL + +## How do I create a unique index for a column in Vitess? + +Unique index is a distinct MySQL option. For Vitess just normal MySQL DDL will do. You have a couple other options as well either to use `ApplySchema` or directly apply the index to MySQL. + +Please note this is different from a unique Vindex, as that enables sending queries to one specific shard rather than ensuring the uniqueness of a column. + +## How do I make a CreateLookupVindex? + +In addition to the [user guide](https://vitess.io/docs/user-guides/configuration-advanced/createlookupvindex/) on CreateLookupVindex we also have an example walkthrough [here](https://github.com/aquarapid/vitess_examples/tree/master/vindexes/createlookupvindex). + +This walkthrough demonstrates the syntax of a CreateLookupVindex how to make one, how to add it to a column, and how to verify that it was successfully added. + +## What is a LookupVindex and how does it work? + +CreateLookupVindex is a new VReplication workflow that was introduced in Vitess 6. It is used to create and backfill a lookup Vindex automatically for a table that already exists and that could already have a significant amount of data in it. + +The CreateLookupVindex process uses VReplication for the backfill process, until the lookup Vindex is “in sync”. Then the normal process for adding/deleting/updating rows in the lookup Vindex via the standard transactional flow when updating the “owner” table for the Vindex takes over. + +You can read more about how to make a CreateLookupVindex [here](https://vitess.io/docs/user-guides/configuration-advanced/createlookupvindex/). If you are unfamiliar with Vindexes we recommend that you first read the information [here](https://vitess.io/docs/reference/features/vindexes). + +MARKED NOT HELPFUL + +## Does the Primary Vindex need to match its Primary Key? + +It is not necessary that a Primary Vindex be the same as the Primary Key. In fact, there are many use cases where you would not want this. For example, if there are tables with one-to-many relationships, the Primary Vindex of the main table is likely to be the same as the Primary Key. + +However, if you want the rows of the secondary table to reside in the same shard as the parent row, the Primary Vindex for that table must be the foreign key that points to the main table. A typical example is a user and order table. + +In this case, the order table has the `user_id` as a foreign key to the `id` of the user table. The `order_id` may be the primary key for `order`, but you may still want to choose `user_id` as Primary Vindex, which will make a user's orders live in the same shard as the user. diff --git a/content/en/docs/faq/advanced-configuration/vreplication.md b/content/en/docs/faq/advanced-configuration/vreplication.md new file mode 100644 index 000000000..1e1bf310e --- /dev/null +++ b/content/en/docs/faq/advanced-configuration/vreplication.md @@ -0,0 +1,24 @@ +--- +title: VReplication +description: Frequently Asked Questions about Vitess +weight: 7 +--- + +## What is semi-sync replication? + +Semi-sync replication enables you to prevent your primary from finishing replication until a replica confirms that it has received all the changes. Thus adding an extra guarantee that at least one other machine has copies of the data. + +This addresses the problem of a combination of lagging replication and network issues resulting in data loss. With semi-sync replication, even if you have network issues you shouldn’t lose your data. + +Please do note that when using semi-sync replication you will have to wait for your data to flow from the primary to the replica and then get a confirmation back to the primary. Thus each transaction may take longer. The length of time depends on how close network wise the replica is to the primary. + +## What is the typical replication lag in VReplication? + + +VReplication is very fast, typically replication lag is below a second as long as your network is good. + +However, if there is a network partition, things can be delayed depending on your configuration. For anything transactional, we recommend always reading from the source table. This principle follows the same rule as recommending reading from primary instead of a replica. + +## Why would I use semi-sync replication? + +Semi-sync replication ensures higher levels of durability between the primary and at least one replica. You can read more about semi-sync replication here. diff --git a/content/en/docs/faq/advanced-configuration/vschema.md b/content/en/docs/faq/advanced-configuration/vschema.md new file mode 100644 index 000000000..bdced85ff --- /dev/null +++ b/content/en/docs/faq/advanced-configuration/vschema.md @@ -0,0 +1,39 @@ +--- +title: Vschema +description: Frequently Asked Questions about Vitess +weight: 5 +--- + +## How do you select your primary key for Vitess? + +It is important to choose a strong primary Vindex when creating your VSchema, so the qualities should you look at are the following: +- Frequency in WHERE clause of queries +- Uniqueness (of the mapping function) + - This means that a vindex will map a column value to only one keyspace ID (or none at all) +- Co-locating rows for joins and for single-shard transactions + - This means using the same primary vindex for multiple tables, as all rows tied to the same primary index will automatically be located in the same shard due to the uniqueness property of the vindex map +- High cardinality + - This means producing a sufficiently large number of keyspace IDs, which will give you finer control for rebalancing load through resharding + +You can read more detail about how to select your primary key [here](https://vitess.io/blog/2019-02-07-choosing-a-vindex/). + +## How can you update or change your vschema? + +We recommend using ApplySchema and ApplyVSchema in order to make updates to schemas within Vitess. It is also important to note that you will need to update both your MySQL database schema as well as your VSchema. + +The [ApplySchema](https://vitess.io/docs/reference/programs/vtctl/#applyvschema) command applies a schema change to the specified keyspace on every primary tablet, running in parallel on all shards. Changes are then propagated to replicas. The ApplyVSchema command applies the specified VSchema to the keyspace. The VSchema can be specified as a string or in a file. You can read more about the process to use these commands [here](https://vitess.io/docs/reference/features/schema-management/#changing-your-schema). + +There are a few ways that changes can be made to your schemas within Vitess. If you don’t want to use ApplySchema you can read more about the different methods to make updates [here](https://vitess.io/docs/user-guides/schema-changes/). + +## Without a Vschema how can table and schema routing work? + +There are a couple of special cases for when you don’t have a VSchema in place. + +For example, if you add a table called foo to an unsharded keyspace called ks1 the following routing will enable you to access the table: +1. USE ks1; select * from foo; +2. From the unqualified schema using select * from ks1.foo; +3. As long as you have only one keyspace, you can use select * from foo in anonymous mode + +However, if you have more than one keyspace you will not be able to access the table from the unqualified schema using select * from foo until you add the table to VSchema. + +For a sharded keyspace will not be able to access the table until you have a VSchema for it. However, you will be able to see it in show tables. diff --git a/content/en/docs/faq/advanced-configuration/vtgate.md b/content/en/docs/faq/advanced-configuration/vtgate.md new file mode 100644 index 000000000..45deb891f --- /dev/null +++ b/content/en/docs/faq/advanced-configuration/vtgate.md @@ -0,0 +1,59 @@ +--- +title: Vtgate +description: Frequently Asked Questions about Vitess +weight: 4 +--- + +## How do you use gRPC with vtgate? + +To do this you will need to use the Vitess MySQL Go client. You can find a Golang Database compatible gRPC driver [here](https://pkg.go.dev/vitess.io/vitess/go/vt/vitessdriver). For Java go [here](https://github.com/vitessio/vitess/tree/master/java). + +Once you have the appropriate driver you will need to add the `-service_map grpc-vtgateservice` VTGate flag and set the port `-grpc_port`. + +This runs on a standard gRPC interface, so if you want to directly use it you can follow the example below: + +```sh +#!/usr/bin/env node +import Debug from "debug"; +import * as grpc from "grpc"; +import {CallerID} from './proto/vitess/vtrpc_pb'; +import {BoundQuery} from './proto/vitess/query_pb'; +import {Session,ExecuteRequest,ExecuteResponse} from './proto/vitess/vtgate_pb'; +import {VitessClient} from './proto/vitess/vtgateservice_grpc_pb'; +const log = Debug("VtgateClient"); +const client = new VitessClient("139.178.90.99:15306",grpc.credentials.createInsecure()); +const SingleQuery = async () => { + return new Promise((resolve,reject) => { + const caller = new CallerID(); + caller.setPrincipal("nodejs"); + const session = new Session(); + session.setTargetString("main"); + const query = new BoundQuery(); + query.setSql("SELECT * from main.sbtest1 where id=10"); + const request = new ExecuteRequest() + request.setSession(session); + request.setQuery(query); + request.setCallerId(caller); + client.execute(request, (err: grpc.ServiceError | null, response: ExecuteResponse ) => { + if( err != null ){ + console.log(`[SingleQuery] Error: ${err.message}`) + reject(err); return; + } + console.log(`[SingleQuery] Response: ${JSON.stringify(response.toObject())}`) + resolve(response); + }); + }); +} +async function main() { + client. + console.log(`[main] Starting`); + await SingleQuery(); +} +main().then((_) => _); +``` + +## How does vtgate know which shard to route a query to? + +VTGate knows two things about your Vitess components: the Vschema and the schema of MySQL. + +This enables VTGate to look at the WHERE clause of the query and then route the queries to correct shards. VTGate is also aware of the sharding metadata, cluster state, required latency, and availability of tables, so it will only scatter the query across the shards it needs to use. \ No newline at end of file diff --git a/content/en/docs/faq/advanced-configuration/vttablet.md b/content/en/docs/faq/advanced-configuration/vttablet.md new file mode 100644 index 000000000..b26af449b --- /dev/null +++ b/content/en/docs/faq/advanced-configuration/vttablet.md @@ -0,0 +1,52 @@ +--- +title: VTTablet +description: Frequently Asked Questions about Vitess +weight: 3 +--- + +## Can vttablets start without sql_mode set to STRICT_TRANS_TABLES? + +Yes. This check can be disabled by setting `-enforce_strict_trans_tables=false` on the vttablet. + +## What does it mean if a vttablet is unhappy? + +An unhappy vttablet is one that is at whatever limit to which the -degraded_threshold is set. An unhappy vttablet will still be serving queries. + +vtgate will always prefer happy vttablets over unhappy vttablets, however if all your vttablets are unhappy then it will serve all of them. + +To make sure that your vttablets are reporting their replica lag you need to set the flag `-enable_replication_reporter`. With that flag set vttablets will transmit their replica lag to vtgates allowing them to balance load better. Enabling this flag will also cause vttablets to restart replication if it's stopped, as long as the flag `-disable_active_reparents` isn't set. + +## Are there recommended thresholds for health statuses? + +We don’t have recommended thresholds as Vitess doesn’t make any functional decisions based on the statuses, beyond representing the current status in the UI. You do need to be sure to set your alerting to something lower than the threshold you choose. + +Another option is if you have the replication heartbeat enabled, you can monitor that statistic. + +Or if you’re exporting the mysqld stats using something like [this](https://github.com/prometheus/mysqld_exporter) you can monitor the replication lag via those statistics directly. + +If you are using this option you will need to set the alert at something like: "Fire when lag is > X seconds for Y minutes". Otherwise you'll get false alerts, since the seconds_behind_master reporting inside MySQL often jumps around when either the replication is stopped/started or when traffic is low. + +After either of those occur the seconds_behind_master reporting can take some time to settle. + +## How can I change the DBA login to vttablet? + +If you are concerned about access security and want to change the admin user account for a given vttablet you will need to perform the following steps: +1. Create the new user in the database. +2. Give that user the required permissions.The list of what vitess requires can be found [here](https://github.com/vitessio/vitess/blob/master/config/init_db.sql). +3. Then when you start up Vitess you need to pass in the username and passwords to Vitess. That is done by setting `-db_user` and `-db-credentials-file`. The credentials file will have the format: + +```sh + { + "": [ + "" + ] + } + ``` + +After you have followed the above steps the credentials file will tell vttablet the account to use to connect to the database. + +You can read additional details on the credentials file format [here](https://github.com/vitessio/vitess/blob/master/examples/local/mysql_auth_server_static_creds.json). + +## If mysqld slave thread isn't running what restarts it? + +The replication reporter will automatically restart mysqld slave thread if it is not running. The replication reporter can be enabled within vttablet with the flag `-enable_replication_reporter`. diff --git a/content/en/docs/faq/getting-started/_index.md b/content/en/docs/faq/getting-started/_index.md new file mode 100644 index 000000000..595374cae --- /dev/null +++ b/content/en/docs/faq/getting-started/_index.md @@ -0,0 +1,6 @@ +--- +title: Getting Started +description: Frequently Asked Questions about Vitess +docs_nav_disable_expand: false +--- + diff --git a/content/en/docs/faq/getting-started/compatibility.md b/content/en/docs/faq/getting-started/compatibility.md new file mode 100644 index 000000000..8d3ed8b53 --- /dev/null +++ b/content/en/docs/faq/getting-started/compatibility.md @@ -0,0 +1,51 @@ +--- +title: Compatibility +description: Frequently Asked Questions about Vitess +weight: 2 +--- + +## How is Vitess different from AWS Aurora for MySQL? + +Vitess can run on-premise or in the cloud. It can be run on bare metal, VMs, Kubernetes, or as managed service provided by PlanetScale. + +AWS Aurora has a heavily modified version of MySQL that is very tightly tied to AWS and is only available as a managed service. + +MARKED UNHELPFUL + +## What versions of MySQL or MariaDB work with Vitess? + +Vitess deploys, scales and manages clusters of open-source SQL database instances. Currently, Vitess supports the MySQL, Percona and MariaDB databases. + +* MySQL and Percona + * Vitess supports the core features of MySQL versions 5.6 to 8.0, with some limitations. + * Vitess also supports Percona Server for MySQL versions 5.6 to 8.0. + +{{< info >}} +Please do note that with MySQL 5.6 reaching end of life in February 2021, it is recommended to deploy MySQL 5.7 and later. +{{< /info >}} + +* MariaDB + * Vitess supports the core features of MariaDB versions 10.0 to 10.3. + * Vitess does not yet support version 10.4 of MariaDB. + +## What does Vitess "is MySQL compatible" mean? Will my application "just work"? + +Vitess supports much of MySQL, with some limitations. **Depending on your MySQL setup you will need to adjust queries that utilize any of the current unsupported cases.** + +For SQL syntax there is a list of example unsupported queries [here](https://github.com/vitessio/vitess/blob/main/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json). + +There are some further compatibility issues beyond pure SQL syntax that are listed out [here](https://vitess.io/docs/reference/mysql-compatibility/). + +## How is Vitess different from RDS for MySQL? + +Vitess can run on-premise or in the cloud. It can be run on bare metal, VMs, kubernetes, or as managed service provided by PlanetScale. + +RDS is only available as a managed service from AWS. + +## How is Vitess different from MySQL? + +MySQL can be described as a popular open source database solution. MySQL delivers a fast, multi-threaded, multi-user, and robust SQL (Structured Query Language) database server. + +On the other hand, Vitess is a database clustering system to be used for scaling MySQL. It is a database solution for deploying, scaling and managing large clusters of MySQL instances. + +In other words, Vitess runs on top of MySQL. \ No newline at end of file diff --git a/content/en/docs/faq/getting-started/components.md b/content/en/docs/faq/getting-started/components.md new file mode 100644 index 000000000..f66594848 --- /dev/null +++ b/content/en/docs/faq/getting-started/components.md @@ -0,0 +1,70 @@ +--- +title: Components +description: Frequently Asked Questions about Vitess +weight: 3 +--- + +## What is vtgate and how does it work? + +VTGate is a lightweight proxy server that sits between your application and your shards, which contain your data. VTGates are essentially stateless, extremely scalable, and not very resource intensive on memory. + +Some of VTGate’s main functions are as follows: +* Keeps track of the Vitess cluster state, and routes traffic accordingly. +* Parse SQL queries fully, and combines that understanding with Vitess VSchema direct queries correct VTTablet (or set of VTTablets) and returns consolidated results back to the client. +* It speaks both the MySQL Protocol and the Vitess gRPC protocol. Thus, your applications can connect to VTGate as if it is a MySQL Server. +* Aware of failovers in underlying shards, allowing buffering of queries to allow for reduced application impact. + +## What is vttablet? How does it work with MySQL? + +A VTTablet is the Vitess component that both front-ends and, optionally, controls a running MySQL server. It accepts queries over gRPC and translates the queries back to MySQL, as well as speaking to MySQL to issue commands to control replication, take backups, etc. + +Things to note about VTTablet are: +* There needs to be a one to one mapping of MySQLd and each VTTablet. +* VTTablet will track long running queries and for how long they have run. It also will kill the long running queries itself. +* VTTablet will create a sidecar database when running to store the local state of the cluster. +* The combination of a VTTablet process and a MySQL process is called a Tablet. + + +Please do note that in some cases VTTablets may be deployed as unmanaged/remote or partially managed. You can read about that [here](https://vitess.io/docs/reference/programs/vttablet/#managed-mysql). + +## What is vtctld? + +vtctld is a Vitess server component that can perform various Vitess cluster- and component-level operations on behalf of an administrative user. You can interact with vtctld via a web UI, or via an gRPC interface using the vtctlclient CLI tool. The web UI allows you to browse the information stored in the Topology Service, and can be useful for troubleshooting or for getting a high-level overview of the cluster components and their current states. + +Some of the administrative actions vtctld can perform include: reparents (failovers), backups, sharding, shard splits, resharding, and shard combines. + +## What is a keyspace? + +A keyspace is a logical database. If you’re using sharding, a keyspace maps to multiple MySQL instances; if you’re not using sharding, a keyspace maps directly to a single MySQL database in a single MySQL instance. In either case, a keyspace appears as a single database from the application's viewpoint. + +Reading data from a keyspace is just like reading from a MySQL database. However, depending on the consistency requirements of the read operation, Vitess might fetch the data from a primary database or from a replica. By routing each query to the appropriate database, Vitess allows your code to be structured as if it were reading from a single MySQL database. + +## What is vtctlclient? + +This is a Vitess CLI used to execute gRPC commands against vtctld. It is the most common way to perform administrative commands against a running Vitess cluster. + +## What is a cell? How does it work? + +A cell is a group of servers and associated network infrastructure collocated in an area, and isolated from failures in other cells. It is typically either a full data center or a subset of a data center, sometimes called a zone or availability zone. Vitess gracefully handles cell-level failures, such as when a cell is isolated from other cells by a network failure. A useful way to think of a cell is as a failure domain. + +Each cell in a Vitess implementation has a local Topology Service, which is hosted in that cell. The Topology Service contains most of the information about the Vitess tablets in its cell. This enables a cell to be taken down and rebuilt as a unit. + +Vitess limits cross-cell traffic for both data and metadata. Vitess currently serves reads only from the local cell. Writes will go cross-cell as necessary, to wherever the primary for that shard resides. + +## What is a tablet? What are the types? + +A tablet is a combination of a MySQLd process and a corresponding vttablet process, usually running on the same machine. Each tablet is assigned a tablet type, which specifies what role it currently performs. The main tablet types are listed below: + +* primary - A tablet that contains a MySQL instance that is currently the MySQL primary for its shard. +* replica - A tablet that contains a MySQL replica that is eligible to be promoted to primary. Conventionally, these are reserved for serving live, user-facing read-only requests (like from the website’s frontend). +* rdonly - A tablet that contains a MySQL replica that cannot be promoted to primary. Conventionally, these are used for background processing jobs, such as taking backups, dumping data to other systems, heavy analytical queries, MapReduce, and resharding. + +There are a few more tablet types that you can read about here. For information on how to use tablets please review the user guide here for more information. + +## What is a shard? + +A shard is a physical division within a keyspace; i.e. how data is split across multiple MySQL instances. A shard typically consists of one MySQL primary and one or more MySQL replicas. + +Each MySQL instance within a shard has the same data, if the effects of MySQL replication lag is ignored. The replicas can serve read-only traffic, execute long-running queries from data analysis tools, or perform administrative tasks. + +An unsharded keyspace always has only a single shard. \ No newline at end of file diff --git a/content/en/docs/faq/getting-started/metrics.md b/content/en/docs/faq/getting-started/metrics.md new file mode 100644 index 000000000..c21c79bce --- /dev/null +++ b/content/en/docs/faq/getting-started/metrics.md @@ -0,0 +1,35 @@ +--- +title: Metrics +description: Frequently Asked Questions about Vitess +weight: 7 +--- + +## How can I monitor or get metrics from Vitess? + +All Vitess components have a web UI that you can access to see the state of each component. + +The first place to look is the /debug/status page. + +* This is the main landing page for a VTGate, which displays the status of a particular server. A list of tablets this VTGate process is connected to is also displayed, as this is the list of tablets that can potentially serve queries. + +A second place to look is the /debug/vars page. For example, for VTGate, this page contains the following items: + +* VTGateApi - This is the main histogram variable to track for VTGates. It gives you a break down of all queries by command, keyspace, and type. +* HealthcheckConnections - It shows the number of tablet connections for query/healthcheck per keyspace, shard, and tablet type. + +There are two other pages you can use to get monitoring information from Vitess in the VTGate web UI: + +* /debug/query_plans - This URL gives you all the query plans for queries going through VTGate. +* /debug/vschema - This URL shows the vschema as loaded by VTGate. + +VTTablet has a similar web UI. + +Vitess component metrics can also be scraped via /metrics. This will provide a Prometheus-format metric dump that is updated continuously. This is the recommended way to collect metrics from Vitess. + +## How do you integrate Prometheus and Vitess? + +There is an Prometheus exporter that is on by default that enables you to configure a Prometheus compatible scraper to grab data from the various Vitess components. All Vitess components with web UI’s export their metrics on their web UI port on /metrics. + +If your Vitess configuration includes running the Vitess or PlanetScaleDB Operator on Kubernetes, then you can have Prometheus or a Prometheus compatible agent running in your Kubernetes cluster. This would then scrape the metrics from Vitess automatically, as it would be run on the ports advertised and on our standard /metrics page. With the PlanetScaleDB Operator for Kubernetes, this is done for you automatically. + +You can read more about getting the metrics into Prometheus [here](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config). \ No newline at end of file diff --git a/content/en/docs/faq/getting-started/overview.md b/content/en/docs/faq/getting-started/overview.md new file mode 100644 index 000000000..d9e589db5 --- /dev/null +++ b/content/en/docs/faq/getting-started/overview.md @@ -0,0 +1,97 @@ +--- +title: Overview +description: Frequently Asked Questions about Vitess +weight: 1 +--- + +## How much resources (memory, CPU, disk) does Vitess use? + +**CPU** + +Vitess components (excluding the underlying MySQL server) tend to be CPU-bound processes. It is recommended to: + +* Allocate 2-4 CPU cores for each VTGate server. +* And allocate the same number of cores for VTTablet as with MySQLd. + * If you are provisioning for a new workload, we recommend projecting that MySQLd will require 1 core per 1500 QPS. + +Assuming tablets are kept to the recommended size of 250GB: +* Start with a baseline CPU requirement of 2-4 cores for MySQLd +* And allocate 2-4 cores for the VTTablet process. + +{{< info >}} +Note that this is very workload-dependent. We recommend testing the configuration for yourself as performance can vary depending on your query pattern, query size, concurrency, etc. +{{< /info >}} + +**Memory** + +The memory requirements for VTGate and VTTablet servers will depend on QPS and query result set sizes. We recommend: + +* Provisioning a baseline of 1GB per core. +* Allocating additional memory if you are increasing the Vitess default row limits and/or expect many concurrent queries returning large result sets. Note that this may not be necessary if your large result set queries use streaming. + +**Latency** + +The impact of network latency can be a factor when migrating from MySQL to Vitess. A simple rule of thumb is to estimate 2ms of round trip latency added to each query. This may be higher in a cloud environment, depending on your choice of load balancer, availability zone placement, etc. + +**Topology Service** + +For estimating CPU/memory/disk requirements of your chosen Topology Service, you can use the minimum requirements recommended by the topology server implementation. + +## What is Vitess? + +**Vitess is a database solution for deploying, scaling and managing large clusters of database instances.** + +It is architected to run as effectively in a public or private cloud architecture as it does on dedicated hardware. It combines and extends many SQL features with the scalability of a NoSQL database. Vitess can help you with the following problems: + +* Scaling a SQL database by allowing you to shard it, while keeping your application changes to a minimum. +* Migrating from bare metal to a private or public cloud. +* Deploying and managing a large number of SQL database instances. + +## What is Vitess and MySQL's relationship? + +**Vitess is not a database system itself, instead it is an overlay on top of MySQL.** + +Vitess provides a sharding system for MySQL, as well as some operational management for its instances. Vitess will assist with actions like sharding, managing backup and restore, and splitting, combining, and adding replicas. + +However, it is important to note that implementers of Vitess will need to provide their own MySQL and perform their own MySQL management. The amount of MySQL management required depends on if Vitess is configured to run with "integrated" MySQL (i.e. MySQL managed by Vitess) or "external" MySQL. + +Vitess can run against various flavors/implementations of MySQL, e.g. MySQL Community Edition, MySQL Enterprise Edition, Percona Server, MariaDB Server. Vitess can also be used with many Cloud deployments of MySQL, e.g. AWS RDS, AWS Aurora, GCP Cloud SQL, etc. + +## How can I migrate out of Vitess? + +In order to migrate out of Vitess you will need to take a backup of your data using one of the three possible methods: backup and restore, mysqldump, and go-mydumper. + +We recommend following the [Backup and Restore](https://vitess.io/docs/user-guides/operating-vitess/backup-and-restore/) guide for regular backups in order to migrate out of Vitess. This method is performed directly on the tablet servers and is more efficient and safer for databases of any significant size. The downside is that this is a physical MySQL instance backup, and needs to be restored accordingly. + +Both mysqldump and go-mydumper are not typically suitable for production backups. This is because Vitess does not implement all the locking constructs across a sharded database that are necessary to do a consistent logical backup while writing to the database. However, it may be appropriate if you are able to stop all writes to Vitess for the period that the dump process is running; or you are just backing up tables that are not receiving any writes. You can read more about exporting data from Vitess [here](https://vitess.io/docs/user-guides/configuration-basic/exporting-data/). + +## How do Vitess replicas stay in sync? Do replicas use VReplication? + +Every shard in Vitess uses normal MySQL replication to replicate changes from the primary for that shard to the replica(s). Vitess can use asynchronous MySQL replication (the default), but can also be configured to use semi-synchronous MySQL replication for environments with higher durability requirements. + +VReplication is used internally in Vitess for items like resharding, moving tables, and materialized views. It is not used directly to keep replicas in sync with a primary. + +## What are the main components of Vitess? + +Vitess consists of a number of server processes and command-line utilities and is backed by a consistent metadata store. The main server components consist of: + +* vtgate +* Topology server +* vtctld +* Tablets which are made up of vttablets and mysqld + +The diagram below illustrates Vitess’ components and their location within Vitess’ architecture: + +Vitess Components + +## Are microservices recommended for scaling? + +It’s better to think of microservices as a design principle rather than as a scaling trick. This architecture is more tailored to improving resilience and flexibility for deployment, by breaking up monolithic deployments into more loosely coupled, isolated elements. The complexity of managing resources for horizontal sharding aligns closely with the challenges of managing resources in a microservices architecture. + +Because of this added management complexity, Vitess is a good fit for a container orchestration environment to offset some of this additional complexity. Vitess is commonly deployed/managed in containers using the Vitess Operator for Kubernetes. + +In short, horizontally scaling MySQL is made possible by Vitess, both in microservices architectures, as well as more traditional environments. + +It is not unusual for a well-configured single-server MySQL installation to serve hundreds of thousands of queries per second, so keep in mind that any scaling challenges you might face could also be resolved by optimizing your code, queries, schema and/or MySQL configuration. + +One common challenge faced by users implementing a large-scale microservices architecture, while still keeping a unified database architecture, is that the number of MySQL protocol client connections to the central database can become overwhelming, even with client-side connection pooling. Vitess handles this by effectively introducing additional layers of connection pooling, ensuring that the backend MySQL instances are not overwhelmed. \ No newline at end of file diff --git a/content/en/docs/faq/getting-started/topology.md b/content/en/docs/faq/getting-started/topology.md new file mode 100644 index 000000000..107ccb608 --- /dev/null +++ b/content/en/docs/faq/getting-started/topology.md @@ -0,0 +1,61 @@ +--- +title: Topology +description: Frequently Asked Questions about Vitess +weight: 4 +--- + +## What is the topology service? How does it work? + +The Topology Service is a set of backend processes. This service is exposed to all Vitess components. It delivers a key/value service that is highly available and consistent, while being offset by having higher latency cost and very low throughput. The Topology Service is used for several things by Vitess: + +* It enables tablets to coordinate among themselves as a cluster. +* It enables Vitess to discover tablets, so it knows where to route queries. +* It stores Vitess configuration provided by the database administrator which is required by the different components in the Vitess cluster and that must persist between server restarts. + +The main functions the Topology Service provides are: + +* It is both a repository for topology metadata and a distributed lock manager. +* It is used to store configuration data about the Vitess cluster. It stores small data structures (a few hundred bytes) per object. + * E.g. information about the Keyspaces, the Shards, the Tablets, the Replication Graph, and the Serving Graph. +* It supports a watch interface that signals a client when changes occur on an object. This is used, for instance, to know when the keyspace topology changes (e.g. for resharding). +* It supports primary election. +* It supports quorum reads and writes. + +## What Topology servers can I use with Vitess? + +Vitess uses a plugin implementation to support multiple backend technologies for the Topology Service. The servers currently supported are as follows: +* etcd +* ZooKeeper +* Consul + +The Topology Service interfaces are defined in our code in go/vt/topo/, specific implementations are in go/vt/topo/, and we also have a set of unit tests for it in go/vt/topo/test. + +{{< info >}} +If starting from scratch, please use the zk2 (ZooKeeper) or etcd2 (etcd) implementations. The Consul implementation is deprecated, although still supported. +{{< /info >}} + +## How do I choose which topology server to use? + +The first question to consider is: Do you use one already or are you required to use a specific one? If the answer to that question is yes, then you should likely implement that rather than adding a new server to run Vitess. + +If the answer to that question is no, then we’d recommend that you use etcd if you can, otherwise we’d recommend that you use ZooKeeper. + +We recommend that you try not to use Consul, if possible. + +## How do I implement etcd (etcd2)? + +If you want to implement etcd we recommend following the steps on Vitess’ documentation [here](https://vitess.io/docs/reference/features/topology-service/#etcd-etcd2-implementation-new-version-of-etcd). + +## How do I implement Zookeeper zk2? + +If you want to implement zk2 we recommend following the steps on Vitess’ documentation [here](https://vitess.io/docs/reference/features/topology-service/#zookeeper-zk2-implementation). + +## How do I migrate between implementations? + +We provide the topo2topo utility to migrate between one implementation and another of the topology service. + +This process is explained in Vitess’ documentation [here](https://vitess.io/docs/reference/features/topology-service/#migration-between-implementations). + +If your migration is more complex, or has special requirements, we also support a ‘tee’ implementation of the topo service interface. It is defined in go/vt/topo/helpers/tee.go. It allows communicating to two topo services, and the migration uses multiple phases. + +This process is explained in Vitess’ documentation [here](https://vitess.io/docs/reference/features/topology-service/#migration-using-the-tee-implementation). \ No newline at end of file diff --git a/content/en/docs/faq/getting-started/vreplication.md b/content/en/docs/faq/getting-started/vreplication.md new file mode 100644 index 000000000..f6b81e034 --- /dev/null +++ b/content/en/docs/faq/getting-started/vreplication.md @@ -0,0 +1,29 @@ +--- +title: VReplication +description: Frequently Asked Questions about Vitess +weight: 6 +--- + +## What is VReplication? How does it work? + +VReplication is used as a building block for a number of use cases throughout Vitess. It works as a stream or combination of streams that establish replication from a source keyspace/shard into a target keyspace/shard. A given stream can replicate multiple tables. It allows Vitess to keep the data being copied in-sync by using a combination of copying rows and filtered replication. + +Vreplication works via the following process: + +1. Analyzing the source table and identifying what rows it needs to copy. +2. It then very briefly locks the table and makes a note of the current GTID replication position on the source database. After it’s noted the current GTID Vreplication then unlocks the table again. +3. It selects all the rows and all the columns from GTID value 0 onward and copies from that select. +4. It then streams the copy over to Vitess to start inserting rows. Vreplication will keep copying for a period of time, around an hour, to attempt to finish the copy. +5. If Vreplication hasn’t finished in an hour, it will stop and go back to the table in order to pick up any changes that have been made since it started copying. +6. It knows what the GTID was when it started copying and what the GTID is now. This enables it to determine what events have occurred after it performed the first select and copy. +7. It will then filter out all the events except the ones that pertain to the relevant table and will apply the changes to the destination table. + +This process then repeats until Vreplication finishes copying the whole table. After the copying process finishes Vreplication will change to filtered replication to keep the table in sync. + +## How can I use VReplication? + +There are a number of higher level commands like MoveTables and Materialized Views that create Vreplication streams behind the scenes of the command. By using these higher level commands, Vitess creates VReplication rules for the user. Further use cases are listed out [here](https://vitess.io/docs/reference/features/vreplication/). + +For more information on [MoveTables](https://vitess.io/docs/user-guides/migration/move-tables/) and [Materialized Views](https://vitess.io/docs/user-guides/migration/materialize/ please follow the links provided. + +There is a way to create VReplication rules by hand but we don’t recommend using that method as it can be challenging to configure the rules correctly. \ No newline at end of file diff --git a/content/en/docs/faq/getting-started/vschema.md b/content/en/docs/faq/getting-started/vschema.md new file mode 100644 index 000000000..749b02914 --- /dev/null +++ b/content/en/docs/faq/getting-started/vschema.md @@ -0,0 +1,59 @@ +--- +title: VSchema +description: Frequently Asked Questions about Vitess +weight: 5 +--- + +## What is a VSchema? + +VSchema is short for Vitess Schema and it describes how to shard data within Vitess. + +In contrast to a traditional database schema that contains metadata about tables, a VSchema contains metadata about how tables are organized across shards. This information is used for routing queries and also during resharding operations. + +Simply put, it contains the information needed to make Vitess look and act like a single database server. + +For example, the VSchema will contain the information about the sharding key for each sharded table. When the application issues a query with a WHERE clause that references the key, the VSchema information will be used to route the query to the appropriate shard. + +## What is a primary Vindex and how does it work? + +The Primary Vindex for a table is analogous to a database primary key. + +Every sharded table must have one defined. A Primary Vindex must be unique: given an input value, it must produce a single keyspace ID. At the time of an insert to the table, the unique mapping produced by the Primary Vindex determines the target shard for the inserted row. + +In Vitess, the choice of Vindex allows control of how a column value maps to a keyspace ID. In other words, a Primary Vindex in Vitess not only defines the Sharding Key, but also decides the Sharding Strategy. + +Uniqueness for a Primary Vindex does not mean that the column has to be a primary key or unique key in the MySQL schema for the underlying shard. You can have multiple rows that map to the same keyspace ID. The Vindex uniqueness constraint only ensures that all rows for a keyspace ID end up in the same shard. + +## What is a Vindex and how does it work? + +A Vindex provides a way to map a column value to a keyspace ID. Since each shard in Vitess covers a range of keyspace ID values, this mapping can be used to identify which shard contains a row. + +The advantages of Vindexes stem from their flexibility: + +* A table can have multiple Vindexes. +* Vindexes can be NonUnique, which allows a column value to yield multiple keyspace IDs. +* Vindexes can be a simple function or be based on a lookup table. +* Vindexes can be shared across multiple tables. +* Custom Vindexes can be created and used, and Vitess will still know how to reshard using such Vindexes. + +The Vschema contains the Vindex for any sharded tables. Every Vschema must have at least one Vindex, called the Primary Vindex, defined. A variety of other Vindexes are also available to choose from, with different trade-offs, and you can choose one that best suits your needs. You can read more about other Vindexes [here](https://vitess.io/docs/reference/features/vindexes/). + +## How do I create a VSchema? + +The ease of creation of a VSchema depends heavily on now your data model is constructed. + +For some data models, especially smaller and less complex ones, it can be less challenging to determine how to split the data between shards. A clear sharding key would be a column that is on most of the tables in your data model. If there is a clear sharding key then creating VSchema is as straightforward as specifying that column as the primary Vindex for each table. Common primary Vindexes tend to be user ID or customer ID. + +For more complex data models most will have to investigate the patterns of common queries in order to determine what sharding keys to use. When investigating the most common queries you must identify what you want to optimize, as this influences heavily the determination of the sharding keys. + +For example if you have a query accessing a table with two or more distinct query keys then it may be necessary to create a lookupvindex for the table to accommodate that query pattern. + +Please do keep in mind that you don’t have to have Vindex to cover every query pattern; just the most common. If you adhere to an 80:20 rule, where you scatter 20% of your queries across shards you shouldn’t see any major impacts depending on how you optimized your sharding keys. + +## When do I need to use a VSchema? + +For a very trivial setup where there is only one unsharded keyspace, there is no need to specify a VSchema because Vitess will know that there is nowhere to route a query except to the single shard. + +However, once you have sharding, having a VSchema becomes a necessity. This is because a VSchema is needed to locate and place rows row each table in a sharded keyspace. + +The Vitess distribution has a demo of VSchema operation [here](https://github.com/vitessio/vitess/tree/master/examples/demo). \ No newline at end of file diff --git a/content/en/docs/faq/migrating/_index.md b/content/en/docs/faq/migrating/_index.md new file mode 100644 index 000000000..9e1714b25 --- /dev/null +++ b/content/en/docs/faq/migrating/_index.md @@ -0,0 +1,6 @@ +--- +title: Migrating +description: Frequently Asked Questions about Vitess +docs_nav_disable_expand: false +--- + diff --git a/content/en/docs/faq/migrating/advanced-migrations.md b/content/en/docs/faq/migrating/advanced-migrations.md new file mode 100644 index 000000000..aae6b53a3 --- /dev/null +++ b/content/en/docs/faq/migrating/advanced-migrations.md @@ -0,0 +1,37 @@ +--- +title: Advanced Migrations +description: Frequently Asked Questions about Vitess +weight: 2 +--- + +## How do I migrate to Vitess from a hosted MySQL? + +If you are running a hosted MySQL like RDS on AWS, CloudSQL on GCP, or Azure managed MySQL, because you are not coming from MySQL you have to use either the ‘Stop-the-world’ method or the method using VReplication setup in front of the existing external database. You can read more about those two methods [here](https://vitess.io/docs/user-guides/migration/migrate-data/). + +There is no option to do an application level migration. + +The biggest challenge with this sort of migration is you must be able to access the source database from the location where you want to put the target database. You will need to ensure this configuration constraint is resolved and set up prior to any sort of migration. + +## What is Gh-ost and how does it work? + +Gh-ost is a trigger-less online schema migration solution for MySQL. It functions similarly to other existing online-schema-change tools that create a ghost table to perform migration, but opts to not use triggers. + +Instead Gh-ost uses the binary log stream to capture table changes and asynchronously applies them onto the ghost table. + +You can read a detailed description of Gh-ost here, as well as check out the documentation [here](https://github.com/github/gh-ost/tree/master/doc). + +## What is Vstream and how does it work? + +VStream is a change notification service accessible via VTGate. The purpose of VStream is to provide equivalent information to the MySQL binary logs from the underlying MySQL shards. + +gRPC clients, including Vitess components like VTTablets, can subscribe to a VStream to receive change events from other shards. The VStream pulls events from one or more VStreamer instances on VTTablet instances, which in turn pulls events from the binary log of the underlying MySQL instance. + +This allows for efficient execution of functions such as VReplication where a subscriber can indirectly receive events from the binary logs of one or more MySQL instance shards, and then apply it to a target instance. + +## How can Gh-ost be used with both sharded & unsharded keyspaces? + +You can view the Vschema or the topology server to determine the location of each keyspace. However, we recommend that instead you use the steps outlined here. + +## Can online migrations be done while using LegacySplit? + +Yes, as the migration steps are still the same. LegacySplit is just a different way of copying data that works when text columns are the primary key. \ No newline at end of file diff --git a/content/en/docs/faq/migrating/overview.md b/content/en/docs/faq/migrating/overview.md new file mode 100644 index 000000000..6b2cec288 --- /dev/null +++ b/content/en/docs/faq/migrating/overview.md @@ -0,0 +1,54 @@ +--- +title: Overview +description: Frequently Asked Questions about Vitess +weight: 1 +--- + +## How do I migrate my data to Vitess? + +There are two main parts to migrating your data to Vitess: migrating the actual data and repointing the application. The answer here will focus primarily on the methods that can be used to migrate your data into Vitess. + +There are three different methods to migrate your data into Vitess. Choosing the appropriate option depends on several factors like: + +- The nature of the application accessing the MySQL database +- The size of the MySQL database to be migrated +- The load, especially the write load, on the MySQL database +- Your tolerance for downtime during the migration of data +- Whether you require the ability to reverse the migration if need be +- The network level configuration of your components + +The three different methods are: + +- ‘Stop-the-world’ +- VReplication from Vitess setup in front of the existing external MySQL database +- Application-level migration + +Choosing the Right Method + +The first and most important point to consider when choosing the right method is whether you can or cannot interconnect between components on your network. If you cannot, or do not wish to, perform extra steps to ensure interconnectivity then you will need to use the ‘Stop-the-world’ method. + +If you can ensure interconnectivity and that the VTTablets are in the same Vitess cluster, then for cases when larger amounts of downtime are not an option you will want to use VReplication with either Movetables or Materialize. + +You can read more about each method [here](https://vitess.io/docs/user-guides/migration/migrate-data/). + +## What is VTExplain? + +VTExplain is a command line tool which provides information on how Vitess plans to execute a particular query. It can be used to validate queries for compatibility with Vitess. + +For a more detailed walkthrough of VTExplain please go [here](https://vitess.io/docs/user-guides/sql/vtexplain/). + +## Analyze queries for issues given a Vschema + +To check your queries for issues you will need to follow these general steps. For a more detailed process that includes examples please refer to the documentation [here](https://vitess.io/docs/user-guides/sql/vtexplain/). + +First you will need to gather most, if not all, of the queries that are sent to your current production database tracked over an extended period of time. You may need to track your sent queries for days or weeks depending on your set up. You will also need to normalize the queries you will be analyzing. To do this you can use any MySQL monitoring tool like VividCortex, Monyog or PMM. + +Once you have the full list of normalized queries you will need to filter out any that are not supported or are coming from other sources. Example unsupported queries are listed in the documentation [here](https://vitess.io/docs/reference/compatibility/mysql-compatibility/). + +After filtering the list of queries you will need to generate and populate some fake values. To do this we have an example pipeline in the documentation [here](https://vitess.io/docs/user-guides/sql/vtexplain-in-bulk/#3-populate-fake-values-for-your-queries). + +Once you have the fake values in place you can then run the [vtexplain](https://vitess.io/docs/faq/migrating/overview/#what-is-vtexplain) command against every query and then inspect the output for errors. You will likely want to use a script to do this. We have an example script as well as some setup steps in the documentation [here](https://vitess.io/docs/reference/programs/vtexplain/#example-usage). + +Further case by case examples are available in the documentation starting [here](https://vitess.io/docs/user-guides/sql/vtexplain-in-bulk/). + +vtexplain can also be used to try different sharding scenarios before deciding on one. \ No newline at end of file diff --git a/content/en/docs/faq/migrating/query-rewriting.md b/content/en/docs/faq/migrating/query-rewriting.md new file mode 100644 index 000000000..c05b2c1d8 --- /dev/null +++ b/content/en/docs/faq/migrating/query-rewriting.md @@ -0,0 +1,27 @@ +--- +title: Query Rewriting +description: Frequently Asked Questions about Vitess +weight: 3 +--- + +## How can tables be migrated from using auto-increment to sequences? + +Auto-increment columns do not work very well for sharded tables. Instead you will need to use Vitess sequences to solve this problem. + +Sequences are based on a MySQL table and use a single value in that table to describe which values the sequence should have next. Thus, the sequence table is an unsharded single row table that Vitess can use to generate monotonically increasing ids. + +Sequence tables must be specified in the VSchema, and then tied to table columns. Once they are associated, an insert on that table will transparently fetch an id from the sequence table, fill in the value, and route the row to the appropriate shard. At the time of insert, if no value is specified for such a column, VTGate will generate a number for it using the sequence table. + +To create a sequence you will need to follow the steps [here](https://vitess.io/docs/reference/features/vitess-sequences/#creating-a-sequence). + +## Is there a list of supported and unsupported queries? + +Please see "SQL Syntax" under [MySQL Compatibility](https://vitess.io/docs/reference/compatibility/mysql-compatibility/). + +## What special functions can Vitess handle? + +We list out the special functions that Vitess handles without delegating to MySQL [here](https://vitess.io/docs/concepts/query-rewriting/#special-functions). + +Please note that the Vitess community determined a workaround if you want to use a JPA like Hibernate/Eclipselink to talk to Vitess. + +Rather than using `GenerationType.IDENTITY` you can use Eclipselink QuerySequence to define a query directly to Vitess Sequences tables. This not only prevents `SELECT LAST_INSERT_ID()` call but also can reduce the number of database trips since the application could request a bunch of IDs from Vitess. Potentially around 1000, so this setup will make only one call per 1000 inserts. \ No newline at end of file diff --git a/content/en/docs/faq/operating-vitess/_index.md b/content/en/docs/faq/operating-vitess/_index.md new file mode 100644 index 000000000..82d3a0bc6 --- /dev/null +++ b/content/en/docs/faq/operating-vitess/_index.md @@ -0,0 +1,6 @@ +--- +title: Operating Vitess +description: Frequently Asked Questions about Vitess +docs_nav_disable_expand: false +--- + diff --git a/content/en/docs/faq/operating-vitess/backup-restore.md b/content/en/docs/faq/operating-vitess/backup-restore.md new file mode 100644 index 000000000..9859795aa --- /dev/null +++ b/content/en/docs/faq/operating-vitess/backup-restore.md @@ -0,0 +1,34 @@ +--- +title: Backup and Restore +description: Frequently Asked Questions about Vitess +weight: 4 +--- + +## How do backups work in vitess? + +Backup and Restore are integrated features provided by tablets managed by Vitess. As well as using backups for data integrity, Vitess will also create and restore backups for provisioning new tablets in an existing shard. + +Vitess supports plugins for a number of Backup Storage Services and Backup Engines. The supported plugins are listed [here](https://vitess.io/docs/user-guides/operating-vitess/backup-and-restore/overview/#backup-storage-services). + +## What is XtraBackup and how does Vitess use it? + +Percona XtraBackup is an open source backup utility for MySQL. You can delve into Percona’s documentation on XtraBackup [here](https://www.percona.com/doc/percona-xtrabackup/2.4/intro.html). + +XtraBackup works with Vitess as a plugin that you can make tablets aware of using command-line flags following the instructions [here](https://vitess.io/docs/user-guides/operating-vitess/backup-and-restore/creating-a-backup/). + +## What are my options to restore in vitess? + +When a tablet starts, Vitess checks the value of the `-restore_from_backup command-line` flag to determine whether to restore a backup to that tablet. + +- If the flag is present, Vitess tries to restore the most recent backup from the Backup Storage system when starting the tablet. +- If the flag is absent, Vitess does not try to restore a backup to the tablet. This is the equivalent of starting a new tablet in a new shard. + +For more information on restoring and managing backups please follow the link [here](https://vitess.io/docs/user-guides/operating-vitess/backup-and-restore/bootstrap-and-restore/#restoring-a-backup). + +## What is the default behavior of connection pooling after a failover? + +The expected behavior is that the connection to the old primary will close and that Vitess will try to reconnect to the new primary. + +AWS/Aurora + +To ensure that the expected behavior occurs when using AWS/Aurora you will need to set the vttablet flag `-pool_hostname_resolve_interval` to something other than the default. This is because the default is 0. When this flag is set to the default, Vitess will never re-resolve the AWS/Aurora DNS name. \ No newline at end of file diff --git a/content/en/docs/faq/operating-vitess/configuration.md b/content/en/docs/faq/operating-vitess/configuration.md new file mode 100644 index 000000000..bdc9f6451 --- /dev/null +++ b/content/en/docs/faq/operating-vitess/configuration.md @@ -0,0 +1,47 @@ +--- +title: Configuration +description: Frequently Asked Questions about Vitess +weight: 2 +--- + +## What foreign key support exists in Vitess? + +If you are getting errors with foreign keys, please note that we generally discourage the use of foreign keys, and more specifically foreign key constraints. There may be unexpected consequences when using them in sharded keyspaces. + +However, you can use foreign key constraints when their scope is contained within a shard or unsharded keyspace. You may find that some foreign key syntax will not be accepted through `vtctlclient ApplySchema...`. You may be able to submit the foreign key syntax through vtgate or directly through the mysqld instance. + +Please note that if you do shard or re-shard an existing keyspqce with foreign keys, you will need to take extra steps to confirm they are working as intended. + +## How do I connect to vtgate using MySQL protocol? + +In the example [vtgate-up.sh](https://github.com/vitessio/vitess/blob/main/examples/common/scripts/vtgate-up.sh) script you'll see the following lines: + +```sql +-mysql_server_port $mysql_server_port \ +-mysql_server_socket_path $mysql_server_socket_path \ +-mysql_auth_server_static_file "./mysql_auth_server_static_creds.json" \ +``` + +In this example, vtgate accepts MySQL connections on port 15306 and the authentication information is stored in the json file. You can then connect to it using the following command: + +```sql +mysql -h 127.0.0.1 -P 15306 -u mysql_user --password=mysql_password +``` + +## Must the application know about the sharding scheme in Vitess? + +The application does not need to know about how the data is sharded. This information is stored in a VSchema which the VTGate servers use to automatically route your queries. This allows the application to connect to Vitess and use it as if it’s a single giant database server. + +## Can the primary/replica be pinned to one region? + +Yes, you can keep a primary/replica in the primary region and can keep a read only replica in another region. + +## Can data replication from a primary region cell be controlled? + +If you want to replicate data from a primary region cell to secondary region cell you would need to use [VReplication](https://vitess.io/docs/reference/vreplication/vreplication/). + +Please note that Vitess has some regulatory requirements that certain data can't leave the primary region. + +## Can I change the default database name? + +Yes. You can start vttablet with the `-init_db_name_override` command line option to specify a different db name. There is no downside to performing this override. \ No newline at end of file diff --git a/content/en/docs/faq/operating-vitess/kubernetes.md b/content/en/docs/faq/operating-vitess/kubernetes.md new file mode 100644 index 000000000..8a12327aa --- /dev/null +++ b/content/en/docs/faq/operating-vitess/kubernetes.md @@ -0,0 +1,36 @@ +--- +title: Kubernetes +description: Frequently Asked Questions about Vitess +weight: 5 +--- + +## How can I resize my Kubernetes storage when using Vitess? + +If you use Vitess with Kubernetes and need to grow your disk space, Kubernetes has certain capabilities to resize persistent storage. + +However most techniques involve deleting and/or restarting the associated pods. This would mean stopping vttablets, which we recommend avoiding if possible. + +As an alternative, you can migrate to new storage by performing a series of planned vertical shard migrations and shard reparents to new pods. + +In future the PlanetScale Kubernetes operator may enable more dynamic persistent volume resizing, taking advantage of emerging Kubernetes flexibility in this area. + +## How does Vitess work with Kubernetes? + +Vitess can run as a Kubernetes-aware cloud native distributed database. This can be one of the easiest ways to run Vitess. + +Kubernetes handles scheduling onto nodes in a compute cluster, actively manages workloads on those nodes, and groups containers comprising an application for easy management and discovery. Vitess does not do this auto-provisioning and thus integrates nicely with Kubernetes. + +## How do I switch database technologies in Kubernetes? + +In your tablet definitions of your cluster .yaml file(s), you can specify a different container for the database. You will need to do this for each replica in a shard. + +You will add a `datastore` field and populate it with a `type` and a `container`. + +The only requirement for this is that the container needs to have a standard MySQL deployment. For example, the following block should work to set up Percona for your datastore: + +```sh + - type: "replica" + datastore: + type: mysql + container: "percona/percona-server:5.7" +``` \ No newline at end of file diff --git a/content/en/docs/faq/operating-vitess/overview.md b/content/en/docs/faq/operating-vitess/overview.md new file mode 100644 index 000000000..561954847 --- /dev/null +++ b/content/en/docs/faq/operating-vitess/overview.md @@ -0,0 +1,39 @@ +--- +title: Overview +description: Frequently Asked Questions about Vitess +weight: 1 +--- + +## Am I really limited to 250 GB as my tablet size? Why? + +Vitess recommends provisioning shard sizes to approximately 250GB. This is not a hard-limit, and is driven primarily by the recovery time should an instance fail. With 250GB a full-recovery from backup is expected within less than 15 minutes. + +For most workloads this results in shards instances with relatively few CPU cores and lighter memory requirements, which tend to be more economical than running large instance sizes. + +For more information there is an in depth blog article [here](https://vitess.io/blog/2019-09-03-why-250gb-shards/). + +## How does Vitess work with AWS, Azure, GCP? + +Vitess can run in virtual machines on AWS, Azure, and GCP or in Kubernetes on those platforms. Vitess can run in two different manners on those platforms using either Kubernetes on virtual machines or using cloud Kubernetes managed service in AWS EKS, Azure AKS, or GCP GKE. + +## What are my options to run Vitess? + +Vitess can run on bare metal, virtual machines, and kubernetes. It also doesn’t matter if your preference is for on-premises or in the cloud as Vitess can accommodate either option. + +## Does Vitess only work on Kubernetes? + +Vitess runs on a lot of different options. Kubernetes is only one of the available options. Vitess can also be run on AWS, GCP and bare metal configurations. + +## What is the Vitess Operator? + +The Vitess Operator is open source and is on [GitHub](https://github.com/planetscale/vitess-operator). You can see the repository for information on licensing and contribution. + +The Vitess Operator automates the management and maintenance work of Vitess on Kubernetes by automating the tasks below: + +- Deploy any number of Vitess clusters, cells, keyspaces, shards, and tablets to scale both reads and writes either horizontally or vertically. +- Deploy overlapping shards for Vitess resharding, allowing zero-downtime resizing of shards. +- Trigger manual planned failover via Kubernetes annotation. +- Replicate data across multiple Availability Zones in a single Kubernetes cluster to support immediate failover of read/write traffic to recover from loss of an Availability Zone. +- Automatically roll out updates to Vitess-level user credentials. + +For information on using the Vitess Operator with AWS please follow the link [here](https://docs.planetscale.com/vitess-operator/aws-quickstart). For Google Cloud Platform please follow the link [here](https://docs.planetscale.com/vitess-operator/gcp-quickstart). \ No newline at end of file diff --git a/content/en/docs/faq/operating-vitess/queries.md b/content/en/docs/faq/operating-vitess/queries.md new file mode 100644 index 000000000..a6855c138 --- /dev/null +++ b/content/en/docs/faq/operating-vitess/queries.md @@ -0,0 +1,57 @@ +--- +title: Queries +description: Frequently Asked Questions about Vitess +weight: 3 +--- + +## How can I perform a full table scan without the row limit per query? + +Vitess supports different modes. In OLTP mode, the result size is typically limited to a preset number (10,000 rows by default). This limit can be adjusted based on your needs. + +However, OLAP mode has no limit to the number of rows returned. In order to change to this mode, you may issue the following command before executing your query: + +```sql +set workload='olap' +``` + +You can also set the workload to `dba mode`, which allows you to override the implicit timeouts that exist in vttablet. However, this mode should be used judiciously as it supersedes shutdown and reparent commands. + +The general convention is to send OLTP queries to `REPLICA` tablet types, and OLAP queries to `RDONLY`. + +## Can I choose between primary and replica for query routing? + +You can qualify the keyspace name with the desired tablet type using the @ suffix. This can be specified as part of the connection as the database name, or can be changed on the fly through the USE command. + +For example, `ks@primary` will select `ks` as the default keyspace with all queries being sent to the primary. Consequently `ks@replica` will load balance requests across all `REPLICA` tablet types, and `ks@rdonly` will choose `RDONLY`. + +You can also specify the database name as `@primary`, etc, which instructs Vitess that no default keyspace was specified, but that the requests are for the specified tablet type. + +If no tablet type was specified, then VTGate chooses its default, which can be overridden with the `-default_tablet_type` command line argument. + +## Can I address a specific shard if I want to? + +If necessary, you can access a specific shard by connecting to it using the shard-specific database name, or issuing a USE statement to switch to it if already connected to vtgate. + +For a keyspace ks and shard -80, you would use the database name ks:-80. This is called manual shard targeting. + +## Can I set a session variable query timeout? + +If you would like something similar to `[max_execution_time]`(https://dev.mysql.com/blog-archive/server-side-select-statement-timeouts/) you can set the vttablet command line flag as follows: `-queryserver-config-query-timeout=15`. This is set in seconds. + +You can also specify a query comment like `select /*vt+ QUERY_TIMEOUT_MS=1000 */ `... + +If you choose to set the vttablet command line flag the time you choose will set the absolute max time. The query comment can only override the timeout to a lower value. + +This timeout via SQL query comments has the following limitations/caveats: + +- You need to prevent your SQL client from stripping the comments before sending to the server (the MySQL CLI strips comments by default) +- You need to disable query normalization in vtgate (-normalize_queries false); to allow the comment to reach vttablet. +- It only works for SELECT statements today, this might change in the future. + +{{< info >}} +Note that streaming queries are not affected by either of these timeouts. +{{< /info >}} + +## Can I increase the resource pool timeout for streaming requests? + +Yes. You can adjust the flag `-queryserver-config-stream-pool-size=100`. \ No newline at end of file diff --git a/content/en/docs/faq/sharding/_index.md b/content/en/docs/faq/sharding/_index.md new file mode 100644 index 000000000..f00fd518f --- /dev/null +++ b/content/en/docs/faq/sharding/_index.md @@ -0,0 +1,6 @@ +--- +title: Sharding +description: Frequently Asked Questions about Vitess +docs_nav_disable_expand: false +--- + diff --git a/content/en/docs/faq/sharding/advanced.md b/content/en/docs/faq/sharding/advanced.md new file mode 100644 index 000000000..77f9b06e3 --- /dev/null +++ b/content/en/docs/faq/sharding/advanced.md @@ -0,0 +1,17 @@ +--- +title: Advanced +description: Frequently Asked Questions about Vitess +weight: 3 +--- + +## How can I know which shard contains a row for a table? + +You can use the primary Vindex column to query the Vindex and discover the shard ID. Once you have determined the shard ID you can use [manual shard targeting](http://vitess.io/docs/faq/operating-vitess/queries/?#can-i-address-a-specific-shard-if-i-want-to) to send that specific shard a query. Note that if the query contains the primary Vindex column, or an appropriate secondary Vindex column, you do not need to do this, and vtgate can route the query automatically. + +## Can I use Vitess to do cross-shard JOINs or Transactions? + +A horizontal sharding solution for MySQL like Vitess does allow you to do both cross-shard joins and transactions, but just because you can doesn’t mean you should. + +A sharded architecture will perform best if you design it well and play to its strength, e.g. favoring single-shard targeted writes within any individual transaction. Enabling two-phase commit in Vitess to support cross-shard writes is possible, but will come at a significant performance cost. + +Whether that tradeoff is worth it differs from application to application and, generally speaking, adjusting the schema/workload is considered the better approach. \ No newline at end of file diff --git a/content/en/docs/faq/sharding/overview.md b/content/en/docs/faq/sharding/overview.md new file mode 100644 index 000000000..63b051473 --- /dev/null +++ b/content/en/docs/faq/sharding/overview.md @@ -0,0 +1,48 @@ +--- +title: Overview +description: Frequently Asked Questions about Vitess +weight: 1 +--- + +## Why do auto-increment columns not work in sharded Vitess? + +Auto-increment columns do not work very well for sharded tables. Vitess sequences solve this problem. Sequence tables must be specified in the VSchema and then tied to table columns. At the time of insert, if no value is specified for such a column, VTGate will generate a number for it using the sequence table. + +Vitess also supports sequence generators that can be used to generate new ids that work like MySQL auto increment columns. The VSchema allows you to associate table columns to sequence tables. + +## What is resharding? How does it work? + +Vitess supports resharding, in which the number of shards is changed on a live cluster. This can be either splitting one or more shards into smaller pieces, or merging neighboring shards into bigger pieces. + +During resharding, the data in the source shards is copied into the destination shards, allowed to catch up on replication, and then compared against the original to ensure data integrity. Then the live serving infrastructure is shifted to the destination shards, and the source shards are deleted. + +## How do reparents work in Vitess? + +Reparenting is the process of changing a shard’s primary tablet from one host to another or changing a replica tablet to have a different primary. Reparenting can be initiated manually or it can occur automatically in response to particular database conditions. Vitess supports two types of reparenting: [Active reparenting](https://vitess.io/docs/user-guides/configuration-advanced/reparenting/#active-reparenting) and [External reparenting](https://vitess.io/docs/user-guides/configuration-advanced/reparenting/#external-reparenting). +- Active reparenting occurs when Vitess manages the entire reparenting process. There are two types of active reparenting that can be done: [Planned reparenting](https://vitess.io/docs/user-guides/configuration-advanced/reparenting/#plannedreparentshard-planned-reparenting) and [Emergency reparenting](https://vitess.io/docs/user-guides/configuration-advanced/reparenting/#emergencyreparentshard-emergency-reparenting). +- External reparenting occurs when another tool handles the reparenting process, and Vitess just updates its components to accurately reflect the new primary-replica relationships. + +You can read more about reparenting in Vitess [here](https://vitess.io/docs/user-guides/configuration-advanced/reparenting/). + +## How are shards named? + +Shard names have the following characteristics: + +- They represent a range, where the left number is included, but the right is not. +- Their notation is hexadecimal. +- They are left justified. +- A - prefix means: anything less than the right value. +- A - postfix means: anything greater than or equal to the LHS value. +- A plain - denotes the full keyrange. + +An example of a shard name is -80 and following the rules above this means: -80 == 00-80 == 0000-8000 == 000000-800000 + +Similarly 80- is not the same as 80-FF because 80-FF == 8000-FF00. Therefore FFFF will be out of the 80-FF range as 80- means: ‘anything greater than or equal to 0x80 + +A hash vindex produces an 8-byte number. This means that all numbers less than 0x8000000000000000 will fall in shard -80. Any number with the highest bit set will be >= 0x8000000000000000, and will therefore belong to shard 80-. + +## What does “/0” or “-”mean? + +“0” or “-” indicates that the keyspace in question is unsharded. Or phrased in a slightly different manner this indicates that a single shard covers the entire keyrange. Note, the reason both “0” and “-” are used is because you can’t merge into shard “0” only “-”. + +On the other hand a sharded cluster will have multiple keyranges, for example “-80” and “80-” if you have two shards. Note, that you can still manually target a single shard from your sharded cluster. You can read more about that [here](https://vitess.io/docs/faq/operating-vitess/queries/#can-i-address-a-specific-shard-if-i-want-to). \ No newline at end of file diff --git a/content/en/docs/faq/sharding/vreplication.md b/content/en/docs/faq/sharding/vreplication.md new file mode 100644 index 000000000..2eda66893 --- /dev/null +++ b/content/en/docs/faq/sharding/vreplication.md @@ -0,0 +1,17 @@ +--- +title: VReplication +description: Frequently Asked Questions about Vitess +weight: 2 +--- + +## How can Movetables be used with duplicate table names? + +If you have duplicate table names and want to use MoveTables you will need to take some action to prevent duplicate table routing issues. If you use move tables prior to following the steps below you will get an error similar to: `ERROR 1105 (HY000): vtgate: http://localhost:15001/: ambiguous table reference`. + +To avoid this error you need to: + +- Use vtctlclient GetRoutingRules and export that to a file. +- Then edit that file to add specific routing to the source schema for the tables you are using. +- Then use `vtctlclient ApplyRoutingRules -rules="$(cat /tmp/whatever)" ` to apply those rules. + +After applying those rules, queries to the tables will be explicitly routed to the source/original schema and you can use MoveTables. \ No newline at end of file diff --git a/content/en/docs/faq/troubleshooting/_index.md b/content/en/docs/faq/troubleshooting/_index.md new file mode 100644 index 000000000..f32870e8c --- /dev/null +++ b/content/en/docs/faq/troubleshooting/_index.md @@ -0,0 +1,6 @@ +--- +title: Troubleshooting +description: Frequently Asked Questions about Vitess +docs_nav_disable_expand: false +--- + diff --git a/content/en/docs/faq/troubleshooting/common-errors.md b/content/en/docs/faq/troubleshooting/common-errors.md new file mode 100644 index 000000000..512494854 --- /dev/null +++ b/content/en/docs/faq/troubleshooting/common-errors.md @@ -0,0 +1,65 @@ +--- +title: Common Errors +description: Frequently Asked Questions about Vitess +weight: 1 +--- + +## Why is an SQL update with a primary key slow? + +Using tuples in a WHERE clause can cause a MySQL slowdown. Consider: + +```sql +UPDATE tbl SET col=1 WHERE (pk1, pk2, pk3) IN (1,2,3), (4,5,6) +``` + +After a few tuples, MySQL may switch to a full table scan and lock the entire table for the duration. It should perform as expected once `FORCE INDEX (PRIMARY)` is added. + +You can read further information on 'FORCE INDEX' in the MySQL documentation [here](https://dev.mysql.com/doc/refman/8.0/en/index-hints.html). + +## What can I do if I see a CPU increase after upgrading Vitess? + +If you are running Vitess 7.0 or above, we introduced the schema tracker, which could be running on the VTTablets now. You can disable it in order to prevent that reporting. + +You will need to add `track_schema_versions` as false in the VTTablet. + +## What are the steps to take after an unplanned failover? + +In order to avoid creating orphaned VTTablets you will need to follow the steps below: + +1. Stop the VTTablets +2. Delete the old VTTablet records +3. Create the new keyspace +4. Restart the VTTablets that are pointed at the new keyspace +5. Use TabletExternallyReparented to inform Vitess of the current primary +6. Recursively delete the old keyspace + +## Error: Could not open required defaults file: /path/to/my.cnf + +If you cannot start a cluster and see that error in the logs it most likely means that AppArmor is running on your server and is preventing Vitess processes from accessing the my.cnf file. + +The workaround is to uninstall AppArmor: + +```sh +sudo service apparmor stop +sudo service apparmor teardown +sudo update-rc.d -f apparmor remove +``` + +You may also need to reboot the machine after this. Many programs automatically install AppArmor, so you may need to uninstall again. + +## Error: mysqld not found in any of /usr/bin/{sbin,bin,libexec} + +If you're all set up with Vitess but mysqld won't start, with an error like this: + +```sh +E0430 17:02:43.663441 5297 mysqlctl.go:254] failed start mysql: mysqld not found in any of /usr/bin/{sbin,bin,libexec} +``` + +You will need to perform the following steps: + +- Verify that mysqld is located in /usr/bin on all its hosts +- Verify that PATH has been set and sourced in .bashrc + +If you have confirmed the above and are still getting the error referenced, it is likely that `VT_MYSQL_ROOT` has not been set correctly. + +On most systems `VT_MYSQL_ROOT` should be set to `/usr` because Vitess expects to find a bin directory below that. \ No newline at end of file diff --git a/content/en/docs/faq/troubleshooting/information.md b/content/en/docs/faq/troubleshooting/information.md new file mode 100644 index 000000000..fd802f93f --- /dev/null +++ b/content/en/docs/faq/troubleshooting/information.md @@ -0,0 +1,58 @@ +--- +title: Information Gathering +description: Frequently Asked Questions about Vitess +weight: 2 +--- + +## Capturing a tcpdump network trace for vtgate + +Occasionally, when a problem is application or application MySQL driver specific, you may want to collect a tcpdump network trace of the data flowing from the application to the vtgate MySQL listener. + +In a production environment, this may be complicated by the fact that you may have a network loadbalancer in front of multiple vtgate instances. In this case, you may have to run network captures across multiple hosts hosting the vtgate instances simultaneously to get all the information we need to debug the problem. However, the method for collecting the network trace on each host would remain the same. + +To collect a network trace, let's review what you need: + +- You will typically need sudo or root access on the host in question to capture network traffic. +- You need to determine which TCP port your vtgate instance is listening on. If you look at your vtgate start script or at a process listing via: + +```sh +ps -ef | grep vtgate +``` + +- You should see the vtgate port as the value of the -mysql_server_port parameter. Make a note of this port number. +- Next, you need to determine which physical network interface the application traffic is coming into the vtgate server. Typically it could be something like eth0 or eno0, but you would verify by checking the output of: + +```sh +ip addr +``` + +- and matching up the ip address the application is using to access the vtgate instance. + +To actually capture the traffic (we assume you are using sudo) run: + +```sh +sudo tcpdump -i -s0 -n -nn -B 32768 -w /path/to/tempfile.dump port +``` + +Where: + +- is the physical network interface you determined earlier, e.g. eth0 + - /path/to/tempfile.dump is the filesystem path to a location where you have sufficient space for the dump file. Note that in a production environment, a tcpdump of live traffic can generate a dumpfile of many gigabytes pretty quickly, so be careful. +- is the port number you determined earlier that vtgate is listening on for MySQL traffic. + +When you are done, you can use this dump file to review these logs for any errors or issues. + +## Collecting information for troubleshooting + +In order to troubleshoot issues occurring in your implementation of Vitess you will need to provide the community as much context as possible. + +When you reach out you should include, if possible, a summary/overview deployment document of what components are involved and how they interconnect, etc. Customers often maintain something like this for internal support purposes. + +Beyond the overview deployment document, we recommend that for the best experience, you collect as many of the items listed below as possible from production Vitess systems: + +- Logs (vtgate, vttablet, underlying MySQL) +- Metrics (vtgate, vttablet, underlying MySQL) +- Other statistics (MySQL processlist, MySQL InnoDB engine status, etc.) +- Application DB pool configurations +- Load balancer configurations (if in the MySQL connection path) +- Historical load patterns \ No newline at end of file diff --git a/static/img/vitess-components.png b/static/img/vitess-components.png new file mode 100644 index 0000000000000000000000000000000000000000..1bd9cd36495a94d39bd791f2d918000c7d9886ee GIT binary patch literal 247428 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 =#=zb`%9v< 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

ag(ViLmplyPjH(sJIn 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 Oew5^(vL(`wpZ_1X)s3P6 literal 0 HcmV?d00001 From 4cc895ef06e88f25fc6db10cfcca96db7c72347f Mon Sep 17 00:00:00 2001 From: deepthi Date: Mon, 18 Nov 2024 12:52:18 -0800 Subject: [PATCH 02/10] fixup vindexes faq, replace absolute URLs with relative paths Signed-off-by: deepthi --- content/en/docs/faq/_index.md | 18 ++++----- .../docs/faq/advanced-configuration/vindex.md | 38 ++++--------------- 2 files changed, 17 insertions(+), 39 deletions(-) diff --git a/content/en/docs/faq/_index.md b/content/en/docs/faq/_index.md index c591439cf..ef6c3cfa5 100644 --- a/content/en/docs/faq/_index.md +++ b/content/en/docs/faq/_index.md @@ -10,7 +10,7 @@ aliases: ['/docs/user-guides/faq/'] We recommend asking questions in our [Slack workspace](https://vitess.io/slack). -We have a number of [other options](https://vitess.io/community/) that can be used as well. +We have a number of [other options](../../community.md) that can be used as well. We request that you not ask individual project members for support. Instead, please use these public communication channels where the community can help and also benefit from the solutions provided. Thanks! @@ -24,24 +24,24 @@ There are many channels available and we encourage you to join as many or as few * #kubernetes * #monitoring * #operator -* #orchestrator-integration +* #feat-vtorc * #releases * #vreplication * #website ## How can I contribute a Pull Request to Vitess? -We welcome new contributors to Vitess. Just be sure to read the guide [here](https://vitess.io/docs/contributing/) to start. +We welcome new contributors to Vitess. Just be sure to read the [ contributing guide](../contributing/) before you start. -If you are already familiar with Vitess and you would like information on how to submit a Pull Request or file an Issue check out the following links: +If you are already familiar with Vitess and you would like to know how to submit a Pull Request or file an Issue check out the following links: -* [GitHub Workflow](https://vitess.io/docs/contributing/github-workflow/) -* [Issue](https://vitess.io/docs/contributing/github-workflow/#submitting-issues) +* [GitHub Workflow](../contributing/github-workflow/) +* [Submitting Issues](../contributing/github-workflow/#submitting-issues) ## What are good videos to watch to get started learning about Vitess? -We have a number of [recorded presentations and videos](https://vitess.io/docs/resources/presentations/) that can be watched to start learning about Vitess. +We have a number of [recorded presentations and videos](../learning-resources/) that can be watched to start learning about Vitess. -* For a curated list please check out this PlanetScale [blog post](https://www.planetscale.com/blog/videos-intro-to-vitess-its-powerful-capabilities-and-how-to-get-started). +PlanetScale has also published a [Learn Vitess playlist](https://www.youtube.com/playlist?list=PLQiYtJSQdSEAJqEa5rh7Xa-RVCZWGzADN) on YouTube. -## Additional FAQs? +## Additional FAQs diff --git a/content/en/docs/faq/advanced-configuration/vindex.md b/content/en/docs/faq/advanced-configuration/vindex.md index 7c1765658..4fcc661f6 100644 --- a/content/en/docs/faq/advanced-configuration/vindex.md +++ b/content/en/docs/faq/advanced-configuration/vindex.md @@ -4,40 +4,18 @@ description: Frequently Asked Questions about Vitess weight: 6 --- -## What is a secondary Vindex? How does it work? +## What is a Vindex? +If you are unfamiliar with Vindexes, we recommend that you first read the [documentation](../../../docs/reference/features/vindexes). -Secondary Vindexes are additional Vindexes against other columns of a table offering optimizations for WHERE clauses that do not use the Primary Vindex. Secondary Vindexes return a single or a limited set of keyspace IDs which will allow VTGate to only target shards where the relevant data is present. In the absence of a Secondary Vindex, VTGate would have to send the query to all shards (called a scatter query). +## Does the Primary Vindex for a table need to match its Primary Key? -It is important to note that Secondary Vindexes are only used for making routing decisions. The underlying database shards will need traditional indexes on those same columns, to allow efficient retrieval from the table on the underlying MySQL instances. +It is not necessary that a Primary Vindex be the same as the Primary Key. In fact, there are many use cases where you would not want this. For example, if there are tables with one-to-many relationships, the Primary Vindex of the main table is likely to be the same as the Primary Key. -MARKED NOT HELPFUL +However, if you want the rows of the secondary table to reside in the same shard as the parent row, the Primary Vindex for that table must be the foreign key that points to the main table. A typical example is a user and order table. -## How do I create a unique index for a column in Vitess? - -Unique index is a distinct MySQL option. For Vitess just normal MySQL DDL will do. You have a couple other options as well either to use `ApplySchema` or directly apply the index to MySQL. - -Please note this is different from a unique Vindex, as that enables sending queries to one specific shard rather than ensuring the uniqueness of a column. - -## How do I make a CreateLookupVindex? - -In addition to the [user guide](https://vitess.io/docs/user-guides/configuration-advanced/createlookupvindex/) on CreateLookupVindex we also have an example walkthrough [here](https://github.com/aquarapid/vitess_examples/tree/master/vindexes/createlookupvindex). - -This walkthrough demonstrates the syntax of a CreateLookupVindex how to make one, how to add it to a column, and how to verify that it was successfully added. - -## What is a LookupVindex and how does it work? - -CreateLookupVindex is a new VReplication workflow that was introduced in Vitess 6. It is used to create and backfill a lookup Vindex automatically for a table that already exists and that could already have a significant amount of data in it. - -The CreateLookupVindex process uses VReplication for the backfill process, until the lookup Vindex is “in sync”. Then the normal process for adding/deleting/updating rows in the lookup Vindex via the standard transactional flow when updating the “owner” table for the Vindex takes over. - -You can read more about how to make a CreateLookupVindex [here](https://vitess.io/docs/user-guides/configuration-advanced/createlookupvindex/). If you are unfamiliar with Vindexes we recommend that you first read the information [here](https://vitess.io/docs/reference/features/vindexes). - -MARKED NOT HELPFUL - -## Does the Primary Vindex need to match its Primary Key? +In this case, the order table has the `user_id` as a foreign key to the `id` of the user table. The `order_id` may be the primary key for `order`, but you may still want to choose `user_id` as Primary Vindex, which will make a user's orders live in the same shard as the user. -It is not necessary that a Primary Vindex be the same as the Primary Key. In fact, there are many use cases where you would not want this. For example, if there are tables with one-to-many relationships, the Primary Vindex of the main table is likely to be the same as the Primary Key. +## How do I create a new LookupVindex? -However, if you want the rows of the secondary table to reside in the same shard as the parent row, the Primary Vindex for that table must be the foreign key that points to the main table. A typical example is a user and order table. +Please refer to the [user guide on CreateLookupVindex](../../docs/user-guides/configuration-advanced/createlookupvindex/) to learn how to create a new Lookup Vindex, how to add it to a column, and how to verify that it was successfully added. -In this case, the order table has the `user_id` as a foreign key to the `id` of the user table. The `order_id` may be the primary key for `order`, but you may still want to choose `user_id` as Primary Vindex, which will make a user's orders live in the same shard as the user. From 1a45064c61515dbd0f369068cee9b1f01fbdd302 Mon Sep 17 00:00:00 2001 From: deepthi Date: Mon, 18 Nov 2024 13:02:02 -0800 Subject: [PATCH 03/10] fix relative paths for links Signed-off-by: deepthi --- content/en/docs/faq/_index.md | 3 ++- content/en/docs/faq/advanced-configuration/vindex.md | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/content/en/docs/faq/_index.md b/content/en/docs/faq/_index.md index ef6c3cfa5..28304e57d 100644 --- a/content/en/docs/faq/_index.md +++ b/content/en/docs/faq/_index.md @@ -10,7 +10,7 @@ aliases: ['/docs/user-guides/faq/'] We recommend asking questions in our [Slack workspace](https://vitess.io/slack). -We have a number of [other options](../../community.md) that can be used as well. +We have a number of [other options](../../community/) that can be used as well. We request that you not ask individual project members for support. Instead, please use these public communication channels where the community can help and also benefit from the solutions provided. Thanks! @@ -45,3 +45,4 @@ We have a number of [recorded presentations and videos](../learning-resources/) PlanetScale has also published a [Learn Vitess playlist](https://www.youtube.com/playlist?list=PLQiYtJSQdSEAJqEa5rh7Xa-RVCZWGzADN) on YouTube. ## Additional FAQs + diff --git a/content/en/docs/faq/advanced-configuration/vindex.md b/content/en/docs/faq/advanced-configuration/vindex.md index 4fcc661f6..def6f5eae 100644 --- a/content/en/docs/faq/advanced-configuration/vindex.md +++ b/content/en/docs/faq/advanced-configuration/vindex.md @@ -5,7 +5,7 @@ weight: 6 --- ## What is a Vindex? -If you are unfamiliar with Vindexes, we recommend that you first read the [documentation](../../../docs/reference/features/vindexes). +If you are unfamiliar with Vindexes, we recommend that you first read the [documentation](../../docs/reference/features/vindexes). ## Does the Primary Vindex for a table need to match its Primary Key? From 8123db2fa8b28d0aa5ca6a235fac80e8fc776669 Mon Sep 17 00:00:00 2001 From: deepthi Date: Mon, 18 Nov 2024 13:15:26 -0800 Subject: [PATCH 04/10] fix relative paths for links Signed-off-by: deepthi --- content/en/docs/faq/_index.md | 2 +- content/en/docs/faq/advanced-configuration/vindex.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/content/en/docs/faq/_index.md b/content/en/docs/faq/_index.md index 28304e57d..80a3ca92b 100644 --- a/content/en/docs/faq/_index.md +++ b/content/en/docs/faq/_index.md @@ -10,7 +10,7 @@ aliases: ['/docs/user-guides/faq/'] We recommend asking questions in our [Slack workspace](https://vitess.io/slack). -We have a number of [other options](../../community/) that can be used as well. +We have a number of [other options](https://vitess.io/community/) that can be used as well. We request that you not ask individual project members for support. Instead, please use these public communication channels where the community can help and also benefit from the solutions provided. Thanks! diff --git a/content/en/docs/faq/advanced-configuration/vindex.md b/content/en/docs/faq/advanced-configuration/vindex.md index def6f5eae..5afc81aa5 100644 --- a/content/en/docs/faq/advanced-configuration/vindex.md +++ b/content/en/docs/faq/advanced-configuration/vindex.md @@ -5,7 +5,7 @@ weight: 6 --- ## What is a Vindex? -If you are unfamiliar with Vindexes, we recommend that you first read the [documentation](../../docs/reference/features/vindexes). +If you are unfamiliar with Vindexes, we recommend that you first read the [documentation](../../reference/features/vindexes/). ## Does the Primary Vindex for a table need to match its Primary Key? @@ -17,5 +17,5 @@ In this case, the order table has the `user_id` as a foreign key to the `id` of ## How do I create a new LookupVindex? -Please refer to the [user guide on CreateLookupVindex](../../docs/user-guides/configuration-advanced/createlookupvindex/) to learn how to create a new Lookup Vindex, how to add it to a column, and how to verify that it was successfully added. +Please refer to the [user guide on CreateLookupVindex](../../user-guides/configuration-advanced/createlookupvindex/) to learn how to create a new Lookup Vindex, how to add it to a column, and how to verify that it was successfully added. From 11c73f9592fc3f7b48ff398a1df4427c632cd2be Mon Sep 17 00:00:00 2001 From: deepthi Date: Mon, 18 Nov 2024 14:10:58 -0800 Subject: [PATCH 05/10] use absolute paths for docs so that version redirection works Signed-off-by: deepthi --- content/en/docs/faq/advanced-configuration/vindex.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/en/docs/faq/advanced-configuration/vindex.md b/content/en/docs/faq/advanced-configuration/vindex.md index 5afc81aa5..7ba86952c 100644 --- a/content/en/docs/faq/advanced-configuration/vindex.md +++ b/content/en/docs/faq/advanced-configuration/vindex.md @@ -5,7 +5,7 @@ weight: 6 --- ## What is a Vindex? -If you are unfamiliar with Vindexes, we recommend that you first read the [documentation](../../reference/features/vindexes/). +If you are unfamiliar with Vindexes, we recommend that you first read the [documentation](https://vitess.io/docs/reference/features/vindexes/). ## Does the Primary Vindex for a table need to match its Primary Key? @@ -17,5 +17,5 @@ In this case, the order table has the `user_id` as a foreign key to the `id` of ## How do I create a new LookupVindex? -Please refer to the [user guide on CreateLookupVindex](../../user-guides/configuration-advanced/createlookupvindex/) to learn how to create a new Lookup Vindex, how to add it to a column, and how to verify that it was successfully added. +Please refer to the [user guide on CreateLookupVindex](https://vitess.io/docs/user-guides/configuration-advanced/createlookupvindex/) to learn how to create a new Lookup Vindex, how to add it to a column, and how to verify that it was successfully added. From 3903450bac46e6bff81cceb29266d881c635cd91 Mon Sep 17 00:00:00 2001 From: deepthi Date: Mon, 18 Nov 2024 14:34:09 -0800 Subject: [PATCH 06/10] address review comments on compatibility and metrics Signed-off-by: deepthi --- .../faq/advanced-configuration/metrics.md | 6 +-- .../{components.md => mysql-server-vars.md} | 8 +--- .../docs/faq/getting-started/compatibility.md | 43 ++++++------------- 3 files changed, 17 insertions(+), 40 deletions(-) rename content/en/docs/faq/advanced-configuration/{components.md => mysql-server-vars.md} (77%) diff --git a/content/en/docs/faq/advanced-configuration/metrics.md b/content/en/docs/faq/advanced-configuration/metrics.md index ba60a96aa..e703b9022 100644 --- a/content/en/docs/faq/advanced-configuration/metrics.md +++ b/content/en/docs/faq/advanced-configuration/metrics.md @@ -6,15 +6,15 @@ weight: 8 ## What Grafana dashboards are available? -There are a set of Grafana dashboards and Prometheus alerts available on the Vitess tree in GitHub [here](https://github.com/vitessio/vitess/tree/master/vitess-mixin). You can get some additional context on these dashboards [here](https://github.com/vitessio/vitess/pull/5609). +There are a set of [Grafana dashboards and Prometheus alerts](https://github.com/vitessio/vitess/tree/main/vitess-mixin) available on the Vitess tree in GitHub. For more context on these dashboards please refer to the [original pull request](https://github.com/vitessio/vitess/pull/5609). ## How can I implement user-level query logging? If you would like to differentiate metrics for a 'bad_user@their_machine' from a 'good_user@their_machine', rather than having both users appear to be the same user from the same server to MySQL you will need to use table ACLs. Vitess exports per-user stats on table ACLs. There are example usages of table ACLs demonstrated in the end-to-end tests. -- The configuration of table ACLs can be found [here](https://github.com/vitessio/vitess/blob/master/go/vt/vttablet/endtoend/main_test.go#L174). -- The tests that demonstrate how table ACLs work can be found [here](https://github.com/vitessio/vitess/blob/master/go/vt/vttablet/endtoend/acl_test.go). +- How to [configure table ACLs](https://github.com/vitessio/vitess/blob/master/go/vt/vttablet/endtoend/main_test.go#L174) +- [Tests](https://github.com/vitessio/vitess/blob/master/go/vt/vttablet/endtoend/acl_test.go) that demonstrate how table ACLs work To locate the variables that enable the export of per-users stats you will need to look in `/debug/vars` for variables that start with `User`, like `UserTableQueryCount`. The export itself is a multi-dimensional export categorized by Table, User and Query Type. You can also find similar names exported as prometheus metrics. diff --git a/content/en/docs/faq/advanced-configuration/components.md b/content/en/docs/faq/advanced-configuration/mysql-server-vars.md similarity index 77% rename from content/en/docs/faq/advanced-configuration/components.md rename to content/en/docs/faq/advanced-configuration/mysql-server-vars.md index 3cf487185..00921615b 100644 --- a/content/en/docs/faq/advanced-configuration/components.md +++ b/content/en/docs/faq/advanced-configuration/mysql-server-vars.md @@ -1,7 +1,7 @@ --- -title: Components +title: MySQL server variables description: Frequently Asked Questions about Vitess -weight: 2 +weight: 10 --- ## How can I change MySQL server variables in Vitess? @@ -19,7 +19,3 @@ This would show the following result after checking the variable: ```sh $ vtctldclient -server localhost:15999 ExecuteFetchAsDba zone1-0000000100 "show variables like 'sync_binlog'"+---------------+-------+| Variable_name | Value |+---------------+-------+| sync_binlog | 0 |+---------------+-------+ ``` - -## Examples of how to use Vitess components - -We have a couple of step through examples in Github [here](https://github.com/aquarapid/vitess_examples). Currently, these cover Operator Backup and Restore, Create Lookup Vindex, and VStream. diff --git a/content/en/docs/faq/getting-started/compatibility.md b/content/en/docs/faq/getting-started/compatibility.md index 8d3ed8b53..15888a921 100644 --- a/content/en/docs/faq/getting-started/compatibility.md +++ b/content/en/docs/faq/getting-started/compatibility.md @@ -4,48 +4,29 @@ description: Frequently Asked Questions about Vitess weight: 2 --- -## How is Vitess different from AWS Aurora for MySQL? - -Vitess can run on-premise or in the cloud. It can be run on bare metal, VMs, Kubernetes, or as managed service provided by PlanetScale. - -AWS Aurora has a heavily modified version of MySQL that is very tightly tied to AWS and is only available as a managed service. - -MARKED UNHELPFUL - ## What versions of MySQL or MariaDB work with Vitess? -Vitess deploys, scales and manages clusters of open-source SQL database instances. Currently, Vitess supports the MySQL, Percona and MariaDB databases. - -* MySQL and Percona - * Vitess supports the core features of MySQL versions 5.6 to 8.0, with some limitations. - * Vitess also supports Percona Server for MySQL versions 5.6 to 8.0. - -{{< info >}} -Please do note that with MySQL 5.6 reaching end of life in February 2021, it is recommended to deploy MySQL 5.7 and later. -{{< /info >}} +Please refer to our [Supported Databases](https://vitess.io/docs/overview/supported-databases/) for the most up-to-date information. -* MariaDB - * Vitess supports the core features of MariaDB versions 10.0 to 10.3. - * Vitess does not yet support version 10.4 of MariaDB. - -## What does Vitess "is MySQL compatible" mean? Will my application "just work"? +## What does it mean to say that Vitess "is MySQL compatible"? Will my application "just work"? Vitess supports much of MySQL, with some limitations. **Depending on your MySQL setup you will need to adjust queries that utilize any of the current unsupported cases.** -For SQL syntax there is a list of example unsupported queries [here](https://github.com/vitessio/vitess/blob/main/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json). +For SQL syntax there is a list of example [unsupported queries](https://github.com/vitessio/vitess/blob/main/go/vt/vtgate/planbuilder/testdata/unsupported_cases.json). -There are some further compatibility issues beyond pure SQL syntax that are listed out [here](https://vitess.io/docs/reference/mysql-compatibility/). +There are some further [compatibility issues](https://vitess.io/docs/reference/mysql-compatibility/) beyond pure SQL syntax. -## How is Vitess different from RDS for MySQL? +## How is Vitess different from MySQL? -Vitess can run on-premise or in the cloud. It can be run on bare metal, VMs, kubernetes, or as managed service provided by PlanetScale. +MySQL is a popular open source database solution. MySQL delivers a fast, multi-threaded, multi-user, and robust SQL (Structured Query Language) database server. +However, MySQL starts running into limitations with large data sizes or large numbers of concurrent users. -RDS is only available as a managed service from AWS. +Vitess is a database scaling system designed to be used with MySQL. It enables deploying, scaling and managing large clusters of MySQL instances with built-in sharding, high availability and connection pooling. -## How is Vitess different from MySQL? +## How is Vitess different from RDS for MySQL? -MySQL can be described as a popular open source database solution. MySQL delivers a fast, multi-threaded, multi-user, and robust SQL (Structured Query Language) database server. +RDS for MySQL is a managed service from AWS which has many of the same limitations as open source or enterprise MySQL. -On the other hand, Vitess is a database clustering system to be used for scaling MySQL. It is a database solution for deploying, scaling and managing large clusters of MySQL instances. +## How is Vitess different from AWS Aurora for MySQL? -In other words, Vitess runs on top of MySQL. \ No newline at end of file +AWS Aurora for MySQL is a managed service from AWS which can scale beyond the limitations of RDS for MySQL. However, it cannot scale to the same extent as Vitess. From bac29af0353c70d88952b312e3cad5398582c08b Mon Sep 17 00:00:00 2001 From: deepthi Date: Mon, 18 Nov 2024 15:45:08 -0800 Subject: [PATCH 07/10] address review comments on vttablet, vtgate etc. Signed-off-by: deepthi --- .../docs/faq/advanced-configuration/_index.md | 1 + .../advanced-configuration/vreplication.md | 11 ----- .../faq/advanced-configuration/vschema.md | 8 ++-- .../docs/faq/advanced-configuration/vtgate.md | 19 ++++---- .../faq/advanced-configuration/vttablet.md | 44 ++++++++++++------- 5 files changed, 42 insertions(+), 41 deletions(-) diff --git a/content/en/docs/faq/advanced-configuration/_index.md b/content/en/docs/faq/advanced-configuration/_index.md index 83ddc3c83..e417ba0af 100644 --- a/content/en/docs/faq/advanced-configuration/_index.md +++ b/content/en/docs/faq/advanced-configuration/_index.md @@ -2,5 +2,6 @@ title: Advanced Configuration description: Frequently Asked Questions about Vitess docs_nav_disable_expand: false +weight: 10 --- diff --git a/content/en/docs/faq/advanced-configuration/vreplication.md b/content/en/docs/faq/advanced-configuration/vreplication.md index 1e1bf310e..23e44e038 100644 --- a/content/en/docs/faq/advanced-configuration/vreplication.md +++ b/content/en/docs/faq/advanced-configuration/vreplication.md @@ -4,21 +4,10 @@ description: Frequently Asked Questions about Vitess weight: 7 --- -## What is semi-sync replication? - -Semi-sync replication enables you to prevent your primary from finishing replication until a replica confirms that it has received all the changes. Thus adding an extra guarantee that at least one other machine has copies of the data. - -This addresses the problem of a combination of lagging replication and network issues resulting in data loss. With semi-sync replication, even if you have network issues you shouldn’t lose your data. - -Please do note that when using semi-sync replication you will have to wait for your data to flow from the primary to the replica and then get a confirmation back to the primary. Thus each transaction may take longer. The length of time depends on how close network wise the replica is to the primary. ## What is the typical replication lag in VReplication? - VReplication is very fast, typically replication lag is below a second as long as your network is good. However, if there is a network partition, things can be delayed depending on your configuration. For anything transactional, we recommend always reading from the source table. This principle follows the same rule as recommending reading from primary instead of a replica. -## Why would I use semi-sync replication? - -Semi-sync replication ensures higher levels of durability between the primary and at least one replica. You can read more about semi-sync replication here. diff --git a/content/en/docs/faq/advanced-configuration/vschema.md b/content/en/docs/faq/advanced-configuration/vschema.md index bdced85ff..e6a2c6c0d 100644 --- a/content/en/docs/faq/advanced-configuration/vschema.md +++ b/content/en/docs/faq/advanced-configuration/vschema.md @@ -4,18 +4,18 @@ description: Frequently Asked Questions about Vitess weight: 5 --- -## How do you select your primary key for Vitess? +## How do you select your sharding key for Vitess? -It is important to choose a strong primary Vindex when creating your VSchema, so the qualities should you look at are the following: +It is important to choose a strong sharding key aka primary Vindex when creating your VSchema, so the qualities you should look at are the following: - Frequency in WHERE clause of queries - Uniqueness (of the mapping function) - This means that a vindex will map a column value to only one keyspace ID (or none at all) - Co-locating rows for joins and for single-shard transactions - This means using the same primary vindex for multiple tables, as all rows tied to the same primary index will automatically be located in the same shard due to the uniqueness property of the vindex map - High cardinality - - This means producing a sufficiently large number of keyspace IDs, which will give you finer control for rebalancing load through resharding + - This means producing a sufficiently large number of keyspace IDs, which will give you finer control for rebalancing load through re-sharding -You can read more detail about how to select your primary key [here](https://vitess.io/blog/2019-02-07-choosing-a-vindex/). +You can read more detail about how to select your primary vindex [here](https://vitess.io/blog/2019-02-07-choosing-a-vindex/). ## How can you update or change your vschema? diff --git a/content/en/docs/faq/advanced-configuration/vtgate.md b/content/en/docs/faq/advanced-configuration/vtgate.md index 45deb891f..c3ac0014d 100644 --- a/content/en/docs/faq/advanced-configuration/vtgate.md +++ b/content/en/docs/faq/advanced-configuration/vtgate.md @@ -1,14 +1,20 @@ --- -title: Vtgate +title: VTGate description: Frequently Asked Questions about Vitess weight: 4 --- -## How do you use gRPC with vtgate? +## How does VTGate know which shard to route a query to? -To do this you will need to use the Vitess MySQL Go client. You can find a Golang Database compatible gRPC driver [here](https://pkg.go.dev/vitess.io/vitess/go/vt/vitessdriver). For Java go [here](https://github.com/vitessio/vitess/tree/master/java). +VTGate knows both the Vschema and the schema of your tables in the backing MySQL databases. -Once you have the appropriate driver you will need to add the `-service_map grpc-vtgateservice` VTGate flag and set the port `-grpc_port`. +This enables VTGate to look at the WHERE clause of the query and then route the queries to the correct shards. VTGate is also aware of the sharding metadata, cluster state, and availability of tables, so it will only scatter the query across the shards it needs to use. + +## How do you use gRPC with VTGate? + +To do this you will need to use the Vitess MySQL Go client. We have a [Golang compatible gRPC driver](https://pkg.go.dev/vitess.io/vitess/go/vt/vitessdriver) and a [Java driver](https://github.com/vitessio/vitess/tree/master/java). + +Once you have the appropriate driver you will need to add the `--service_map grpc-vtgateservice` VTGate flag and set the port `--grpc_port`. This runs on a standard gRPC interface, so if you want to directly use it you can follow the example below: @@ -52,8 +58,3 @@ async function main() { main().then((_) => _); ``` -## How does vtgate know which shard to route a query to? - -VTGate knows two things about your Vitess components: the Vschema and the schema of MySQL. - -This enables VTGate to look at the WHERE clause of the query and then route the queries to correct shards. VTGate is also aware of the sharding metadata, cluster state, required latency, and availability of tables, so it will only scatter the query across the shards it needs to use. \ No newline at end of file diff --git a/content/en/docs/faq/advanced-configuration/vttablet.md b/content/en/docs/faq/advanced-configuration/vttablet.md index b26af449b..2805d41b1 100644 --- a/content/en/docs/faq/advanced-configuration/vttablet.md +++ b/content/en/docs/faq/advanced-configuration/vttablet.md @@ -4,17 +4,15 @@ description: Frequently Asked Questions about Vitess weight: 3 --- -## Can vttablets start without sql_mode set to STRICT_TRANS_TABLES? +## Can VTTablets start without sql_mode set to STRICT_TRANS_TABLES? -Yes. This check can be disabled by setting `-enforce_strict_trans_tables=false` on the vttablet. +Yes. This check can be disabled by setting `--enforce_strict_trans_tables=false` on the VTTablet. -## What does it mean if a vttablet is unhappy? +## What does it mean if a VTTablet is unhappy? -An unhappy vttablet is one that is at whatever limit to which the -degraded_threshold is set. An unhappy vttablet will still be serving queries. +An unhappy VTTablet is one whose replication is lagging beyond the limit to which the `--degraded_threshold` is set. An unhappy VTTablet could still be serving queries. -vtgate will always prefer happy vttablets over unhappy vttablets, however if all your vttablets are unhappy then it will serve all of them. - -To make sure that your vttablets are reporting their replica lag you need to set the flag `-enable_replication_reporter`. With that flag set vttablets will transmit their replica lag to vtgates allowing them to balance load better. Enabling this flag will also cause vttablets to restart replication if it's stopped, as long as the flag `-disable_active_reparents` isn't set. +VTGate will always prefer happy VTTablets over unhappy VTTablets, however if all your VTTablets are unhappy then it will serve all of them. ## Are there recommended thresholds for health statuses? @@ -22,18 +20,18 @@ We don’t have recommended thresholds as Vitess doesn’t make any functional d Another option is if you have the replication heartbeat enabled, you can monitor that statistic. -Or if you’re exporting the mysqld stats using something like [this](https://github.com/prometheus/mysqld_exporter) you can monitor the replication lag via those statistics directly. +Or if you’re exporting the mysqld stats using something like [mysqld-exporter](https://github.com/prometheus/mysqld_exporter) you can monitor the replication lag via those statistics directly. -If you are using this option you will need to set the alert at something like: "Fire when lag is > X seconds for Y minutes". Otherwise you'll get false alerts, since the seconds_behind_master reporting inside MySQL often jumps around when either the replication is stopped/started or when traffic is low. +If you are using this option you will need to set the alert at something like: "Fire when lag is > X seconds for Y minutes". Otherwise you'll get false alerts, since the `Seconds_Behind_Source` reporting from MySQL often jumps around when either the replication is stopped/started or when traffic is low. -After either of those occur the seconds_behind_master reporting can take some time to settle. +After either of those occur the `Seconds_Behind_Source` reporting can take some time to settle. -## How can I change the DBA login to vttablet? +## How can I change the DBA login to VTTablet? -If you are concerned about access security and want to change the admin user account for a given vttablet you will need to perform the following steps: +If you are concerned about access security and want to change the admin user account for a given VTTablet you will need to perform the following steps: 1. Create the new user in the database. -2. Give that user the required permissions.The list of what vitess requires can be found [here](https://github.com/vitessio/vitess/blob/master/config/init_db.sql). -3. Then when you start up Vitess you need to pass in the username and passwords to Vitess. That is done by setting `-db_user` and `-db-credentials-file`. The credentials file will have the format: +2. Give that user the required permissions. The list of what Vitess requires can be found [here](https://github.com/vitessio/vitess/blob/master/config/init_db.sql). +3. Then when you start up Vitess you need to pass in the username and passwords to Vitess. That is done by setting `--db_user` and `--db-credentials-file`. The credentials file will have the format: ```sh { @@ -43,10 +41,22 @@ If you are concerned about access security and want to change the admin user acc } ``` -After you have followed the above steps the credentials file will tell vttablet the account to use to connect to the database. +After you have followed the above steps the credentials file will tell VTTablet the account to use to connect to the database. You can read additional details on the credentials file format [here](https://github.com/vitessio/vitess/blob/master/examples/local/mysql_auth_server_static_creds.json). -## If mysqld slave thread isn't running what restarts it? +## If mysqld replication thread isn't running what restarts it? + +VTOrc will automatically restart replication if it is not running. + +## What is semi-sync replication? + +Semi-sync replication enables you to prevent your primary from acknowledging a transaction to the client until a replica confirms that it has received all the changes. This adds an extra guarantee that at least one other machine has a copy of the changes. + +This addresses the problem of a combination of lagging replication and network issues resulting in data loss. With semi-sync replication, even if you have network issues you shouldn’t lose your data. + +Please do note that when using semi-sync replication you will have to wait for your data to flow from the primary to the replica and then get a confirmation back to the primary. Thus each transaction may take longer. The length of time depends on the round trip time from the primary to the replica. + +## Why would I use semi-sync replication? -The replication reporter will automatically restart mysqld slave thread if it is not running. The replication reporter can be enabled within vttablet with the flag `-enable_replication_reporter`. +Semi-sync replication ensures data durability between the primary and at least one replica. Hardware failures are unavoidable but don't need to result in data loss if you run with semi-sync replication. From e6eab6596dbd904dc3a37cf98e1c71b831d06d32 Mon Sep 17 00:00:00 2001 From: deepthi Date: Mon, 18 Nov 2024 15:54:27 -0800 Subject: [PATCH 08/10] adjust weights and remove duplicate descriptions Signed-off-by: deepthi --- content/en/docs/faq/advanced-configuration/_index.md | 1 - content/en/docs/faq/advanced-configuration/authentication.md | 1 - content/en/docs/faq/advanced-configuration/metrics.md | 1 - .../en/docs/faq/advanced-configuration/mysql-server-vars.md | 1 - content/en/docs/faq/advanced-configuration/vindex.md | 1 - content/en/docs/faq/advanced-configuration/vreplication.md | 1 - content/en/docs/faq/advanced-configuration/vschema.md | 1 - content/en/docs/faq/advanced-configuration/vtgate.md | 1 - content/en/docs/faq/advanced-configuration/vttablet.md | 1 - content/en/docs/faq/getting-started/_index.md | 2 +- content/en/docs/faq/getting-started/compatibility.md | 1 - content/en/docs/faq/getting-started/components.md | 3 +-- content/en/docs/faq/getting-started/metrics.md | 3 +-- content/en/docs/faq/getting-started/overview.md | 3 +-- content/en/docs/faq/getting-started/topology.md | 3 +-- content/en/docs/faq/getting-started/vreplication.md | 3 +-- content/en/docs/faq/getting-started/vschema.md | 3 +-- content/en/docs/faq/migrating/_index.md | 2 +- content/en/docs/faq/migrating/advanced-migrations.md | 3 +-- content/en/docs/faq/migrating/overview.md | 3 +-- content/en/docs/faq/migrating/query-rewriting.md | 3 +-- content/en/docs/faq/operating-vitess/_index.md | 2 +- content/en/docs/faq/operating-vitess/backup-restore.md | 3 +-- content/en/docs/faq/operating-vitess/configuration.md | 3 +-- content/en/docs/faq/operating-vitess/kubernetes.md | 3 +-- content/en/docs/faq/operating-vitess/overview.md | 3 +-- content/en/docs/faq/operating-vitess/queries.md | 3 +-- content/en/docs/faq/sharding/_index.md | 2 +- content/en/docs/faq/sharding/advanced.md | 3 +-- content/en/docs/faq/sharding/overview.md | 3 +-- content/en/docs/faq/sharding/vreplication.md | 3 +-- content/en/docs/faq/troubleshooting/_index.md | 2 +- content/en/docs/faq/troubleshooting/common-errors.md | 3 +-- content/en/docs/faq/troubleshooting/information.md | 3 +-- 34 files changed, 24 insertions(+), 53 deletions(-) diff --git a/content/en/docs/faq/advanced-configuration/_index.md b/content/en/docs/faq/advanced-configuration/_index.md index e417ba0af..9a9cf1edc 100644 --- a/content/en/docs/faq/advanced-configuration/_index.md +++ b/content/en/docs/faq/advanced-configuration/_index.md @@ -1,6 +1,5 @@ --- title: Advanced Configuration -description: Frequently Asked Questions about Vitess docs_nav_disable_expand: false weight: 10 --- diff --git a/content/en/docs/faq/advanced-configuration/authentication.md b/content/en/docs/faq/advanced-configuration/authentication.md index eca813eee..ec97d7876 100644 --- a/content/en/docs/faq/advanced-configuration/authentication.md +++ b/content/en/docs/faq/advanced-configuration/authentication.md @@ -1,6 +1,5 @@ --- title: Authentication -description: Frequently Asked Questions about Vitess weight: 1 --- diff --git a/content/en/docs/faq/advanced-configuration/metrics.md b/content/en/docs/faq/advanced-configuration/metrics.md index e703b9022..e3ea9dbb8 100644 --- a/content/en/docs/faq/advanced-configuration/metrics.md +++ b/content/en/docs/faq/advanced-configuration/metrics.md @@ -1,6 +1,5 @@ --- title: Metrics -description: Frequently Asked Questions about Vitess weight: 8 --- diff --git a/content/en/docs/faq/advanced-configuration/mysql-server-vars.md b/content/en/docs/faq/advanced-configuration/mysql-server-vars.md index 00921615b..22c77f044 100644 --- a/content/en/docs/faq/advanced-configuration/mysql-server-vars.md +++ b/content/en/docs/faq/advanced-configuration/mysql-server-vars.md @@ -1,6 +1,5 @@ --- title: MySQL server variables -description: Frequently Asked Questions about Vitess weight: 10 --- diff --git a/content/en/docs/faq/advanced-configuration/vindex.md b/content/en/docs/faq/advanced-configuration/vindex.md index 7ba86952c..4a4ad22eb 100644 --- a/content/en/docs/faq/advanced-configuration/vindex.md +++ b/content/en/docs/faq/advanced-configuration/vindex.md @@ -1,6 +1,5 @@ --- title: Vindex -description: Frequently Asked Questions about Vitess weight: 6 --- diff --git a/content/en/docs/faq/advanced-configuration/vreplication.md b/content/en/docs/faq/advanced-configuration/vreplication.md index 23e44e038..a0bd47e9e 100644 --- a/content/en/docs/faq/advanced-configuration/vreplication.md +++ b/content/en/docs/faq/advanced-configuration/vreplication.md @@ -1,6 +1,5 @@ --- title: VReplication -description: Frequently Asked Questions about Vitess weight: 7 --- diff --git a/content/en/docs/faq/advanced-configuration/vschema.md b/content/en/docs/faq/advanced-configuration/vschema.md index e6a2c6c0d..22ea14517 100644 --- a/content/en/docs/faq/advanced-configuration/vschema.md +++ b/content/en/docs/faq/advanced-configuration/vschema.md @@ -1,6 +1,5 @@ --- title: Vschema -description: Frequently Asked Questions about Vitess weight: 5 --- diff --git a/content/en/docs/faq/advanced-configuration/vtgate.md b/content/en/docs/faq/advanced-configuration/vtgate.md index c3ac0014d..64c8ffc08 100644 --- a/content/en/docs/faq/advanced-configuration/vtgate.md +++ b/content/en/docs/faq/advanced-configuration/vtgate.md @@ -1,6 +1,5 @@ --- title: VTGate -description: Frequently Asked Questions about Vitess weight: 4 --- diff --git a/content/en/docs/faq/advanced-configuration/vttablet.md b/content/en/docs/faq/advanced-configuration/vttablet.md index 2805d41b1..f8a60116b 100644 --- a/content/en/docs/faq/advanced-configuration/vttablet.md +++ b/content/en/docs/faq/advanced-configuration/vttablet.md @@ -1,6 +1,5 @@ --- title: VTTablet -description: Frequently Asked Questions about Vitess weight: 3 --- diff --git a/content/en/docs/faq/getting-started/_index.md b/content/en/docs/faq/getting-started/_index.md index 595374cae..82ffadbec 100644 --- a/content/en/docs/faq/getting-started/_index.md +++ b/content/en/docs/faq/getting-started/_index.md @@ -1,6 +1,6 @@ --- title: Getting Started -description: Frequently Asked Questions about Vitess docs_nav_disable_expand: false +weight: 1 --- diff --git a/content/en/docs/faq/getting-started/compatibility.md b/content/en/docs/faq/getting-started/compatibility.md index 15888a921..ca58b311b 100644 --- a/content/en/docs/faq/getting-started/compatibility.md +++ b/content/en/docs/faq/getting-started/compatibility.md @@ -1,6 +1,5 @@ --- title: Compatibility -description: Frequently Asked Questions about Vitess weight: 2 --- diff --git a/content/en/docs/faq/getting-started/components.md b/content/en/docs/faq/getting-started/components.md index f66594848..35f01c222 100644 --- a/content/en/docs/faq/getting-started/components.md +++ b/content/en/docs/faq/getting-started/components.md @@ -1,6 +1,5 @@ --- title: Components -description: Frequently Asked Questions about Vitess weight: 3 --- @@ -67,4 +66,4 @@ A shard is a physical division within a keyspace; i.e. how data is split across Each MySQL instance within a shard has the same data, if the effects of MySQL replication lag is ignored. The replicas can serve read-only traffic, execute long-running queries from data analysis tools, or perform administrative tasks. -An unsharded keyspace always has only a single shard. \ No newline at end of file +An unsharded keyspace always has only a single shard. diff --git a/content/en/docs/faq/getting-started/metrics.md b/content/en/docs/faq/getting-started/metrics.md index c21c79bce..069700681 100644 --- a/content/en/docs/faq/getting-started/metrics.md +++ b/content/en/docs/faq/getting-started/metrics.md @@ -1,6 +1,5 @@ --- title: Metrics -description: Frequently Asked Questions about Vitess weight: 7 --- @@ -32,4 +31,4 @@ There is an Prometheus exporter that is on by default that enables you to config If your Vitess configuration includes running the Vitess or PlanetScaleDB Operator on Kubernetes, then you can have Prometheus or a Prometheus compatible agent running in your Kubernetes cluster. This would then scrape the metrics from Vitess automatically, as it would be run on the ports advertised and on our standard /metrics page. With the PlanetScaleDB Operator for Kubernetes, this is done for you automatically. -You can read more about getting the metrics into Prometheus [here](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config). \ No newline at end of file +You can read more about getting the metrics into Prometheus [here](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config). diff --git a/content/en/docs/faq/getting-started/overview.md b/content/en/docs/faq/getting-started/overview.md index d9e589db5..4ea46c0b7 100644 --- a/content/en/docs/faq/getting-started/overview.md +++ b/content/en/docs/faq/getting-started/overview.md @@ -1,6 +1,5 @@ --- title: Overview -description: Frequently Asked Questions about Vitess weight: 1 --- @@ -94,4 +93,4 @@ In short, horizontally scaling MySQL is made possible by Vitess, both in microse It is not unusual for a well-configured single-server MySQL installation to serve hundreds of thousands of queries per second, so keep in mind that any scaling challenges you might face could also be resolved by optimizing your code, queries, schema and/or MySQL configuration. -One common challenge faced by users implementing a large-scale microservices architecture, while still keeping a unified database architecture, is that the number of MySQL protocol client connections to the central database can become overwhelming, even with client-side connection pooling. Vitess handles this by effectively introducing additional layers of connection pooling, ensuring that the backend MySQL instances are not overwhelmed. \ No newline at end of file +One common challenge faced by users implementing a large-scale microservices architecture, while still keeping a unified database architecture, is that the number of MySQL protocol client connections to the central database can become overwhelming, even with client-side connection pooling. Vitess handles this by effectively introducing additional layers of connection pooling, ensuring that the backend MySQL instances are not overwhelmed. diff --git a/content/en/docs/faq/getting-started/topology.md b/content/en/docs/faq/getting-started/topology.md index 107ccb608..093e9443f 100644 --- a/content/en/docs/faq/getting-started/topology.md +++ b/content/en/docs/faq/getting-started/topology.md @@ -1,6 +1,5 @@ --- title: Topology -description: Frequently Asked Questions about Vitess weight: 4 --- @@ -58,4 +57,4 @@ This process is explained in Vitess’ documentation [here](https://vitess.io/do If your migration is more complex, or has special requirements, we also support a ‘tee’ implementation of the topo service interface. It is defined in go/vt/topo/helpers/tee.go. It allows communicating to two topo services, and the migration uses multiple phases. -This process is explained in Vitess’ documentation [here](https://vitess.io/docs/reference/features/topology-service/#migration-using-the-tee-implementation). \ No newline at end of file +This process is explained in Vitess’ documentation [here](https://vitess.io/docs/reference/features/topology-service/#migration-using-the-tee-implementation). diff --git a/content/en/docs/faq/getting-started/vreplication.md b/content/en/docs/faq/getting-started/vreplication.md index f6b81e034..e9d38686f 100644 --- a/content/en/docs/faq/getting-started/vreplication.md +++ b/content/en/docs/faq/getting-started/vreplication.md @@ -1,6 +1,5 @@ --- title: VReplication -description: Frequently Asked Questions about Vitess weight: 6 --- @@ -26,4 +25,4 @@ There are a number of higher level commands like MoveTables and Materialized Vie For more information on [MoveTables](https://vitess.io/docs/user-guides/migration/move-tables/) and [Materialized Views](https://vitess.io/docs/user-guides/migration/materialize/ please follow the links provided. -There is a way to create VReplication rules by hand but we don’t recommend using that method as it can be challenging to configure the rules correctly. \ No newline at end of file +There is a way to create VReplication rules by hand but we don’t recommend using that method as it can be challenging to configure the rules correctly. diff --git a/content/en/docs/faq/getting-started/vschema.md b/content/en/docs/faq/getting-started/vschema.md index 749b02914..28118e1a7 100644 --- a/content/en/docs/faq/getting-started/vschema.md +++ b/content/en/docs/faq/getting-started/vschema.md @@ -1,6 +1,5 @@ --- title: VSchema -description: Frequently Asked Questions about Vitess weight: 5 --- @@ -56,4 +55,4 @@ For a very trivial setup where there is only one unsharded keyspace, there is no However, once you have sharding, having a VSchema becomes a necessity. This is because a VSchema is needed to locate and place rows row each table in a sharded keyspace. -The Vitess distribution has a demo of VSchema operation [here](https://github.com/vitessio/vitess/tree/master/examples/demo). \ No newline at end of file +The Vitess distribution has a demo of VSchema operation [here](https://github.com/vitessio/vitess/tree/master/examples/demo). diff --git a/content/en/docs/faq/migrating/_index.md b/content/en/docs/faq/migrating/_index.md index 9e1714b25..af8fbc1f1 100644 --- a/content/en/docs/faq/migrating/_index.md +++ b/content/en/docs/faq/migrating/_index.md @@ -1,6 +1,6 @@ --- title: Migrating -description: Frequently Asked Questions about Vitess docs_nav_disable_expand: false +weight: 2 --- diff --git a/content/en/docs/faq/migrating/advanced-migrations.md b/content/en/docs/faq/migrating/advanced-migrations.md index aae6b53a3..7c70b080b 100644 --- a/content/en/docs/faq/migrating/advanced-migrations.md +++ b/content/en/docs/faq/migrating/advanced-migrations.md @@ -1,6 +1,5 @@ --- title: Advanced Migrations -description: Frequently Asked Questions about Vitess weight: 2 --- @@ -34,4 +33,4 @@ You can view the Vschema or the topology server to determine the location of eac ## Can online migrations be done while using LegacySplit? -Yes, as the migration steps are still the same. LegacySplit is just a different way of copying data that works when text columns are the primary key. \ No newline at end of file +Yes, as the migration steps are still the same. LegacySplit is just a different way of copying data that works when text columns are the primary key. diff --git a/content/en/docs/faq/migrating/overview.md b/content/en/docs/faq/migrating/overview.md index 6b2cec288..fab57f4d3 100644 --- a/content/en/docs/faq/migrating/overview.md +++ b/content/en/docs/faq/migrating/overview.md @@ -1,6 +1,5 @@ --- title: Overview -description: Frequently Asked Questions about Vitess weight: 1 --- @@ -51,4 +50,4 @@ Once you have the fake values in place you can then run the [vtexplain](https:// Further case by case examples are available in the documentation starting [here](https://vitess.io/docs/user-guides/sql/vtexplain-in-bulk/). -vtexplain can also be used to try different sharding scenarios before deciding on one. \ No newline at end of file +vtexplain can also be used to try different sharding scenarios before deciding on one. diff --git a/content/en/docs/faq/migrating/query-rewriting.md b/content/en/docs/faq/migrating/query-rewriting.md index c05b2c1d8..34ef6e549 100644 --- a/content/en/docs/faq/migrating/query-rewriting.md +++ b/content/en/docs/faq/migrating/query-rewriting.md @@ -1,6 +1,5 @@ --- title: Query Rewriting -description: Frequently Asked Questions about Vitess weight: 3 --- @@ -24,4 +23,4 @@ We list out the special functions that Vitess handles without delegating to MySQ Please note that the Vitess community determined a workaround if you want to use a JPA like Hibernate/Eclipselink to talk to Vitess. -Rather than using `GenerationType.IDENTITY` you can use Eclipselink QuerySequence to define a query directly to Vitess Sequences tables. This not only prevents `SELECT LAST_INSERT_ID()` call but also can reduce the number of database trips since the application could request a bunch of IDs from Vitess. Potentially around 1000, so this setup will make only one call per 1000 inserts. \ No newline at end of file +Rather than using `GenerationType.IDENTITY` you can use Eclipselink QuerySequence to define a query directly to Vitess Sequences tables. This not only prevents `SELECT LAST_INSERT_ID()` call but also can reduce the number of database trips since the application could request a bunch of IDs from Vitess. Potentially around 1000, so this setup will make only one call per 1000 inserts. diff --git a/content/en/docs/faq/operating-vitess/_index.md b/content/en/docs/faq/operating-vitess/_index.md index 82d3a0bc6..9ed0fb7e0 100644 --- a/content/en/docs/faq/operating-vitess/_index.md +++ b/content/en/docs/faq/operating-vitess/_index.md @@ -1,6 +1,6 @@ --- title: Operating Vitess -description: Frequently Asked Questions about Vitess docs_nav_disable_expand: false +weight: 3 --- diff --git a/content/en/docs/faq/operating-vitess/backup-restore.md b/content/en/docs/faq/operating-vitess/backup-restore.md index 9859795aa..e6732e0f3 100644 --- a/content/en/docs/faq/operating-vitess/backup-restore.md +++ b/content/en/docs/faq/operating-vitess/backup-restore.md @@ -1,6 +1,5 @@ --- title: Backup and Restore -description: Frequently Asked Questions about Vitess weight: 4 --- @@ -31,4 +30,4 @@ The expected behavior is that the connection to the old primary will close and t AWS/Aurora -To ensure that the expected behavior occurs when using AWS/Aurora you will need to set the vttablet flag `-pool_hostname_resolve_interval` to something other than the default. This is because the default is 0. When this flag is set to the default, Vitess will never re-resolve the AWS/Aurora DNS name. \ No newline at end of file +To ensure that the expected behavior occurs when using AWS/Aurora you will need to set the vttablet flag `-pool_hostname_resolve_interval` to something other than the default. This is because the default is 0. When this flag is set to the default, Vitess will never re-resolve the AWS/Aurora DNS name. diff --git a/content/en/docs/faq/operating-vitess/configuration.md b/content/en/docs/faq/operating-vitess/configuration.md index bdc9f6451..12de38bf2 100644 --- a/content/en/docs/faq/operating-vitess/configuration.md +++ b/content/en/docs/faq/operating-vitess/configuration.md @@ -1,6 +1,5 @@ --- title: Configuration -description: Frequently Asked Questions about Vitess weight: 2 --- @@ -44,4 +43,4 @@ Please note that Vitess has some regulatory requirements that certain data can't ## Can I change the default database name? -Yes. You can start vttablet with the `-init_db_name_override` command line option to specify a different db name. There is no downside to performing this override. \ No newline at end of file +Yes. You can start vttablet with the `-init_db_name_override` command line option to specify a different db name. There is no downside to performing this override. diff --git a/content/en/docs/faq/operating-vitess/kubernetes.md b/content/en/docs/faq/operating-vitess/kubernetes.md index 8a12327aa..2421a6e7c 100644 --- a/content/en/docs/faq/operating-vitess/kubernetes.md +++ b/content/en/docs/faq/operating-vitess/kubernetes.md @@ -1,6 +1,5 @@ --- title: Kubernetes -description: Frequently Asked Questions about Vitess weight: 5 --- @@ -33,4 +32,4 @@ The only requirement for this is that the container needs to have a standard MyS datastore: type: mysql container: "percona/percona-server:5.7" -``` \ No newline at end of file +``` diff --git a/content/en/docs/faq/operating-vitess/overview.md b/content/en/docs/faq/operating-vitess/overview.md index 561954847..b1177902b 100644 --- a/content/en/docs/faq/operating-vitess/overview.md +++ b/content/en/docs/faq/operating-vitess/overview.md @@ -1,6 +1,5 @@ --- title: Overview -description: Frequently Asked Questions about Vitess weight: 1 --- @@ -36,4 +35,4 @@ The Vitess Operator automates the management and maintenance work of Vitess on K - Replicate data across multiple Availability Zones in a single Kubernetes cluster to support immediate failover of read/write traffic to recover from loss of an Availability Zone. - Automatically roll out updates to Vitess-level user credentials. -For information on using the Vitess Operator with AWS please follow the link [here](https://docs.planetscale.com/vitess-operator/aws-quickstart). For Google Cloud Platform please follow the link [here](https://docs.planetscale.com/vitess-operator/gcp-quickstart). \ No newline at end of file +For information on using the Vitess Operator with AWS please follow the link [here](https://docs.planetscale.com/vitess-operator/aws-quickstart). For Google Cloud Platform please follow the link [here](https://docs.planetscale.com/vitess-operator/gcp-quickstart). diff --git a/content/en/docs/faq/operating-vitess/queries.md b/content/en/docs/faq/operating-vitess/queries.md index a6855c138..2b22c75a6 100644 --- a/content/en/docs/faq/operating-vitess/queries.md +++ b/content/en/docs/faq/operating-vitess/queries.md @@ -1,6 +1,5 @@ --- title: Queries -description: Frequently Asked Questions about Vitess weight: 3 --- @@ -54,4 +53,4 @@ Note that streaming queries are not affected by either of these timeouts. ## Can I increase the resource pool timeout for streaming requests? -Yes. You can adjust the flag `-queryserver-config-stream-pool-size=100`. \ No newline at end of file +Yes. You can adjust the flag `-queryserver-config-stream-pool-size=100`. diff --git a/content/en/docs/faq/sharding/_index.md b/content/en/docs/faq/sharding/_index.md index f00fd518f..570830034 100644 --- a/content/en/docs/faq/sharding/_index.md +++ b/content/en/docs/faq/sharding/_index.md @@ -1,6 +1,6 @@ --- title: Sharding -description: Frequently Asked Questions about Vitess docs_nav_disable_expand: false +weight: 5 --- diff --git a/content/en/docs/faq/sharding/advanced.md b/content/en/docs/faq/sharding/advanced.md index 77f9b06e3..a60f84ee4 100644 --- a/content/en/docs/faq/sharding/advanced.md +++ b/content/en/docs/faq/sharding/advanced.md @@ -1,6 +1,5 @@ --- title: Advanced -description: Frequently Asked Questions about Vitess weight: 3 --- @@ -14,4 +13,4 @@ A horizontal sharding solution for MySQL like Vitess does allow you to do both c A sharded architecture will perform best if you design it well and play to its strength, e.g. favoring single-shard targeted writes within any individual transaction. Enabling two-phase commit in Vitess to support cross-shard writes is possible, but will come at a significant performance cost. -Whether that tradeoff is worth it differs from application to application and, generally speaking, adjusting the schema/workload is considered the better approach. \ No newline at end of file +Whether that tradeoff is worth it differs from application to application and, generally speaking, adjusting the schema/workload is considered the better approach. diff --git a/content/en/docs/faq/sharding/overview.md b/content/en/docs/faq/sharding/overview.md index 63b051473..41fa2010d 100644 --- a/content/en/docs/faq/sharding/overview.md +++ b/content/en/docs/faq/sharding/overview.md @@ -1,6 +1,5 @@ --- title: Overview -description: Frequently Asked Questions about Vitess weight: 1 --- @@ -45,4 +44,4 @@ A hash vindex produces an 8-byte number. This means that all numbers less than 0 “0” or “-” indicates that the keyspace in question is unsharded. Or phrased in a slightly different manner this indicates that a single shard covers the entire keyrange. Note, the reason both “0” and “-” are used is because you can’t merge into shard “0” only “-”. -On the other hand a sharded cluster will have multiple keyranges, for example “-80” and “80-” if you have two shards. Note, that you can still manually target a single shard from your sharded cluster. You can read more about that [here](https://vitess.io/docs/faq/operating-vitess/queries/#can-i-address-a-specific-shard-if-i-want-to). \ No newline at end of file +On the other hand a sharded cluster will have multiple keyranges, for example “-80” and “80-” if you have two shards. Note, that you can still manually target a single shard from your sharded cluster. You can read more about that [here](https://vitess.io/docs/faq/operating-vitess/queries/#can-i-address-a-specific-shard-if-i-want-to). diff --git a/content/en/docs/faq/sharding/vreplication.md b/content/en/docs/faq/sharding/vreplication.md index 2eda66893..34a874bc7 100644 --- a/content/en/docs/faq/sharding/vreplication.md +++ b/content/en/docs/faq/sharding/vreplication.md @@ -1,6 +1,5 @@ --- title: VReplication -description: Frequently Asked Questions about Vitess weight: 2 --- @@ -14,4 +13,4 @@ To avoid this error you need to: - Then edit that file to add specific routing to the source schema for the tables you are using. - Then use `vtctlclient ApplyRoutingRules -rules="$(cat /tmp/whatever)" ` to apply those rules. -After applying those rules, queries to the tables will be explicitly routed to the source/original schema and you can use MoveTables. \ No newline at end of file +After applying those rules, queries to the tables will be explicitly routed to the source/original schema and you can use MoveTables. diff --git a/content/en/docs/faq/troubleshooting/_index.md b/content/en/docs/faq/troubleshooting/_index.md index f32870e8c..112b5ad15 100644 --- a/content/en/docs/faq/troubleshooting/_index.md +++ b/content/en/docs/faq/troubleshooting/_index.md @@ -1,6 +1,6 @@ --- title: Troubleshooting -description: Frequently Asked Questions about Vitess docs_nav_disable_expand: false +weight: 4 --- diff --git a/content/en/docs/faq/troubleshooting/common-errors.md b/content/en/docs/faq/troubleshooting/common-errors.md index 512494854..5d99e7df3 100644 --- a/content/en/docs/faq/troubleshooting/common-errors.md +++ b/content/en/docs/faq/troubleshooting/common-errors.md @@ -1,6 +1,5 @@ --- title: Common Errors -description: Frequently Asked Questions about Vitess weight: 1 --- @@ -62,4 +61,4 @@ You will need to perform the following steps: If you have confirmed the above and are still getting the error referenced, it is likely that `VT_MYSQL_ROOT` has not been set correctly. -On most systems `VT_MYSQL_ROOT` should be set to `/usr` because Vitess expects to find a bin directory below that. \ No newline at end of file +On most systems `VT_MYSQL_ROOT` should be set to `/usr` because Vitess expects to find a bin directory below that. diff --git a/content/en/docs/faq/troubleshooting/information.md b/content/en/docs/faq/troubleshooting/information.md index fd802f93f..bbf5e8cbd 100644 --- a/content/en/docs/faq/troubleshooting/information.md +++ b/content/en/docs/faq/troubleshooting/information.md @@ -1,6 +1,5 @@ --- title: Information Gathering -description: Frequently Asked Questions about Vitess weight: 2 --- @@ -55,4 +54,4 @@ Beyond the overview deployment document, we recommend that for the best experien - Other statistics (MySQL processlist, MySQL InnoDB engine status, etc.) - Application DB pool configurations - Load balancer configurations (if in the MySQL connection path) -- Historical load patterns \ No newline at end of file +- Historical load patterns From 977032761f2cd5bafe4f6ecd1230ab67e067e70a Mon Sep 17 00:00:00 2001 From: deepthi Date: Wed, 20 Nov 2024 22:34:55 -0800 Subject: [PATCH 09/10] update getting started and advanced faqs Signed-off-by: deepthi --- .../advanced-configuration/authentication.md | 6 +- .../faq/advanced-configuration/metrics.md | 2 +- .../faq/advanced-configuration/vschema.md | 18 +++--- .../en/docs/faq/getting-started/components.md | 55 +++++++++---------- .../en/docs/faq/getting-started/overview.md | 53 ++++-------------- .../en/docs/faq/getting-started/topology.md | 11 ++-- .../en/docs/faq/operating-vitess/overview.md | 34 ++++++++++++ 7 files changed, 86 insertions(+), 93 deletions(-) diff --git a/content/en/docs/faq/advanced-configuration/authentication.md b/content/en/docs/faq/advanced-configuration/authentication.md index ec97d7876..7a6ffff0a 100644 --- a/content/en/docs/faq/advanced-configuration/authentication.md +++ b/content/en/docs/faq/advanced-configuration/authentication.md @@ -20,10 +20,10 @@ There are other authentication mechanisms that can be utilized including LDAP-ba If you need to enforce fine-grained access control in Vitess, you cannot use the normal MySQL GRANT system to give certain application-level MySQL users more or fewer permissions than others. This is because Vitess uses connection pooling with fixed MySQL users at the VTTablet level, and implements its own authentication at the VTGate level. Not all of the MySQL GRANT system has been implemented in Vitess. Authorization can be done via table-level ACLs. Individual users at the VTGate level can be assigned 3 levels of permissions. -- Read (corresponding to read DML, e.g. SELECT) -- Write (corresponding to write DML, e.g. INSERT, UPDATE, DELETE) +- Read (corresponding to SELECT) +- Write (corresponding to DML, e.g. INSERT, UPDATE, DELETE) - Admin (corresponding to DDL, e.g. ALTER TABLE) The tables to which the permissions apply can be enumerated or specified using a regular expression. -Vitess authorization via ACLs is applied at the VTTablet level, as opposed to on VTGate, where authentication is enforced. There are a number of VTTablet command line parameters that control the behavior of ACLs. You can see examples and read more about the command line parameters and further configuration options [here](https://vitess.io/docs/user-guides/configuration-advanced/authorization/#vttablet-parameters-for-table-acls). +Vitess authorization via ACLs is applied at the VTTablet level, as opposed to on VTGate, where authentication is enforced. There are a number of [VTTablet command line parameters]((https://vitess.io/docs/user-guides/configuration-advanced/authorization/#vttablet-parameters-for-table-acls) that control the behavior of ACLs. diff --git a/content/en/docs/faq/advanced-configuration/metrics.md b/content/en/docs/faq/advanced-configuration/metrics.md index e3ea9dbb8..81d58f776 100644 --- a/content/en/docs/faq/advanced-configuration/metrics.md +++ b/content/en/docs/faq/advanced-configuration/metrics.md @@ -15,6 +15,6 @@ Vitess exports per-user stats on table ACLs. There are example usages of table A - How to [configure table ACLs](https://github.com/vitessio/vitess/blob/master/go/vt/vttablet/endtoend/main_test.go#L174) - [Tests](https://github.com/vitessio/vitess/blob/master/go/vt/vttablet/endtoend/acl_test.go) that demonstrate how table ACLs work -To locate the variables that enable the export of per-users stats you will need to look in `/debug/vars` for variables that start with `User`, like `UserTableQueryCount`. The export itself is a multi-dimensional export categorized by Table, User and Query Type. You can also find similar names exported as prometheus metrics. +To locate the variables that enable the export of per-user stats you will need to look in `/debug/vars` for variables that start with `User`, like `UserTableQueryCount`. The export itself is a multi-dimensional export categorized by Table, User and Query Type. You can also find similar names exported as prometheus metrics. Analyzing these variables can enable you to quickly narrow down the root cause of an incident, as these stats are fine-grained. Once you've identified the table and query type, you can then drill into `/queryz` or `/debug/query_stats` to determine if the issue is a particular query. diff --git a/content/en/docs/faq/advanced-configuration/vschema.md b/content/en/docs/faq/advanced-configuration/vschema.md index 22ea14517..1bf43adab 100644 --- a/content/en/docs/faq/advanced-configuration/vschema.md +++ b/content/en/docs/faq/advanced-configuration/vschema.md @@ -14,25 +14,21 @@ It is important to choose a strong sharding key aka primary Vindex when creating - High cardinality - This means producing a sufficiently large number of keyspace IDs, which will give you finer control for rebalancing load through re-sharding -You can read more detail about how to select your primary vindex [here](https://vitess.io/blog/2019-02-07-choosing-a-vindex/). +You can read more about how to select your primary vindex in this [blog post](https://vitess.io/blog/2019-02-07-choosing-a-vindex/). ## How can you update or change your vschema? -We recommend using ApplySchema and ApplyVSchema in order to make updates to schemas within Vitess. It is also important to note that you will need to update both your MySQL database schema as well as your VSchema. - -The [ApplySchema](https://vitess.io/docs/reference/programs/vtctl/#applyvschema) command applies a schema change to the specified keyspace on every primary tablet, running in parallel on all shards. Changes are then propagated to replicas. The ApplyVSchema command applies the specified VSchema to the keyspace. The VSchema can be specified as a string or in a file. You can read more about the process to use these commands [here](https://vitess.io/docs/reference/features/schema-management/#changing-your-schema). - -There are a few ways that changes can be made to your schemas within Vitess. If you don’t want to use ApplySchema you can read more about the different methods to make updates [here](https://vitess.io/docs/user-guides/schema-changes/). +Vitess provides a CLI command [ApplyVSchema](https://vitess.io/docs/reference/programs/vtctldclient/vtctldclient_applyvschema/) to make updates to the vschema within Vitess. ## Without a Vschema how can table and schema routing work? There are a couple of special cases for when you don’t have a VSchema in place. For example, if you add a table called foo to an unsharded keyspace called ks1 the following routing will enable you to access the table: -1. USE ks1; select * from foo; -2. From the unqualified schema using select * from ks1.foo; -3. As long as you have only one keyspace, you can use select * from foo in anonymous mode +1. `use ks1; select * from foo;` +2. From the unqualified schema using `select * from ks1.foo;` +3. As long as you have only one keyspace, you can use `select * from foo;` in anonymous mode. -However, if you have more than one keyspace you will not be able to access the table from the unqualified schema using select * from foo until you add the table to VSchema. +However, if you have more than one keyspace you will not be able to access the table from the unqualified schema using `select * from foo` until you add the table to the VSchema. -For a sharded keyspace will not be able to access the table until you have a VSchema for it. However, you will be able to see it in show tables. +For a sharded keyspace you will not be able to access the table until you have a VSchema for it. However, you will be able to see it in `show tables`. diff --git a/content/en/docs/faq/getting-started/components.md b/content/en/docs/faq/getting-started/components.md index 35f01c222..1ddf52c20 100644 --- a/content/en/docs/faq/getting-started/components.md +++ b/content/en/docs/faq/getting-started/components.md @@ -3,48 +3,47 @@ title: Components weight: 3 --- -## What is vtgate and how does it work? +## What is VTGate and how does it work? -VTGate is a lightweight proxy server that sits between your application and your shards, which contain your data. VTGates are essentially stateless, extremely scalable, and not very resource intensive on memory. +VTGate is a lightweight proxy server that sits between your application and your shards, which contain your data. VTGates are essentially stateless and in many cases, you can scale with query load by adding more VTGate instances. +Some of the main functions performed by VTGate are as follows: +* Keeps track of the Vitess cluster state, and route traffic accordingly. +* Parses SQL queries fully, and combines that understanding with Vitess VSchema to direct queries to the appropriate VTTablet (or set of VTTablets) and returns consolidated results back to the client. +* Supports both the MySQL Protocol and the gRPC protocol. Thus, your applications can connect to VTGate as if it is a MySQL Server. +* Is aware of failovers in underlying shards, and performs buffering of queries to reduce application impact. -Some of VTGate’s main functions are as follows: -* Keeps track of the Vitess cluster state, and routes traffic accordingly. -* Parse SQL queries fully, and combines that understanding with Vitess VSchema direct queries correct VTTablet (or set of VTTablets) and returns consolidated results back to the client. -* It speaks both the MySQL Protocol and the Vitess gRPC protocol. Thus, your applications can connect to VTGate as if it is a MySQL Server. -* Aware of failovers in underlying shards, allowing buffering of queries to allow for reduced application impact. - -## What is vttablet? How does it work with MySQL? +## What is VTTablet? How does it work with MySQL? A VTTablet is the Vitess component that both front-ends and, optionally, controls a running MySQL server. It accepts queries over gRPC and translates the queries back to MySQL, as well as speaking to MySQL to issue commands to control replication, take backups, etc. Things to note about VTTablet are: -* There needs to be a one to one mapping of MySQLd and each VTTablet. -* VTTablet will track long running queries and for how long they have run. It also will kill the long running queries itself. -* VTTablet will create a sidecar database when running to store the local state of the cluster. +* Each mysqld needs a VTTablet that manages it. +* VTTablet tracks long running queries and kills them when they exceed a defined threshold. * The combination of a VTTablet process and a MySQL process is called a Tablet. +Please note that in some cases VTTablets may be deployed as [unmanaged/remote or partially managed](https://vitess.io/docs/reference/programs/vttablet/#managed-mysql). +The recommendation is to start with unmanaged mode but eventually migrate to managed mode. Operations like resharding are possible only with vitess-managed MySQL servers. -Please do note that in some cases VTTablets may be deployed as unmanaged/remote or partially managed. You can read about that [here](https://vitess.io/docs/reference/programs/vttablet/#managed-mysql). - -## What is vtctld? +## What is VTCtld? -vtctld is a Vitess server component that can perform various Vitess cluster- and component-level operations on behalf of an administrative user. You can interact with vtctld via a web UI, or via an gRPC interface using the vtctlclient CLI tool. The web UI allows you to browse the information stored in the Topology Service, and can be useful for troubleshooting or for getting a high-level overview of the cluster components and their current states. +VTCtld is a Vitess server component that can perform various Vitess cluster- and component-level operations on behalf of an administrative user. You can interact with VTCtld via a web UI, or via an gRPC interface using the vtctldclient CLI tool. +It has an administrative UI called VTAdmin. -Some of the administrative actions vtctld can perform include: reparents (failovers), backups, sharding, shard splits, resharding, and shard combines. +Some of the administrative actions VTCtld can perform include: reparents (failovers), backups, shard splits, resharding, and shard merges. ## What is a keyspace? -A keyspace is a logical database. If you’re using sharding, a keyspace maps to multiple MySQL instances; if you’re not using sharding, a keyspace maps directly to a single MySQL database in a single MySQL instance. In either case, a keyspace appears as a single database from the application's viewpoint. +A keyspace is a logical database. Typically, a keyspace maps to multiple MySQL instances regardless of sharding. This is because it is recommended to run multiple replicas even for an unsharded keyspace. In other words, a keyspace appears as a single database from the application's viewpoint. -Reading data from a keyspace is just like reading from a MySQL database. However, depending on the consistency requirements of the read operation, Vitess might fetch the data from a primary database or from a replica. By routing each query to the appropriate database, Vitess allows your code to be structured as if it were reading from a single MySQL database. +Reading data from a keyspace is just like reading from a MySQL database. -## What is vtctlclient? +## What is vtctldclient? -This is a Vitess CLI used to execute gRPC commands against vtctld. It is the most common way to perform administrative commands against a running Vitess cluster. +This is a Vitess CLI used to execute gRPC commands against VTCtld. It is the most common way to perform administrative commands against a running Vitess cluster. ## What is a cell? How does it work? -A cell is a group of servers and associated network infrastructure collocated in an area, and isolated from failures in other cells. It is typically either a full data center or a subset of a data center, sometimes called a zone or availability zone. Vitess gracefully handles cell-level failures, such as when a cell is isolated from other cells by a network failure. A useful way to think of a cell is as a failure domain. +A cell is a group of servers and associated network infrastructure co-located in an area, and isolated from failures in other cells. It is typically either a full data center or a subset of a data center, sometimes called a zone or availability zone. Vitess gracefully handles cell-level failures, such as when a cell is isolated from other cells by a network failure. A useful way to think of a cell is as a failure domain. Each cell in a Vitess implementation has a local Topology Service, which is hosted in that cell. The Topology Service contains most of the information about the Vitess tablets in its cell. This enables a cell to be taken down and rebuilt as a unit. @@ -52,18 +51,18 @@ Vitess limits cross-cell traffic for both data and metadata. Vitess currently se ## What is a tablet? What are the types? -A tablet is a combination of a MySQLd process and a corresponding vttablet process, usually running on the same machine. Each tablet is assigned a tablet type, which specifies what role it currently performs. The main tablet types are listed below: +A tablet is a combination of a mysqld process and a corresponding VTTablet process, usually running on the same machine. Each tablet is assigned a tablet type, which specifies what role it currently performs. The main tablet types are listed below: -* primary - A tablet that contains a MySQL instance that is currently the MySQL primary for its shard. -* replica - A tablet that contains a MySQL replica that is eligible to be promoted to primary. Conventionally, these are reserved for serving live, user-facing read-only requests (like from the website’s frontend). -* rdonly - A tablet that contains a MySQL replica that cannot be promoted to primary. Conventionally, these are used for background processing jobs, such as taking backups, dumping data to other systems, heavy analytical queries, MapReduce, and resharding. +* PRIMARY - A tablet that contains a MySQL instance that is currently the MySQL primary for its shard. +* REPLICA - A tablet that contains a MySQL replica that is eligible to be promoted to primary. Conventionally, these are reserved for serving live, user-facing read-only requests (like from the website’s frontend). +* RDONLY - A tablet that contains a MySQL replica that cannot be promoted to primary. Conventionally, these are used for background processing jobs, such as taking backups, dumping data to other systems, heavy analytical queries, and resharding. -There are a few more tablet types that you can read about here. For information on how to use tablets please review the user guide here for more information. +There are some other tablet types like `BACKUP` and `RESTORE`. For information on how to use tablets please review this [user guide](https://vitess.io/docs/user-guides/configuration-basic/vttablet-mysql/). ## What is a shard? A shard is a physical division within a keyspace; i.e. how data is split across multiple MySQL instances. A shard typically consists of one MySQL primary and one or more MySQL replicas. -Each MySQL instance within a shard has the same data, if the effects of MySQL replication lag is ignored. The replicas can serve read-only traffic, execute long-running queries from data analysis tools, or perform administrative tasks. +Each MySQL instance within a shard has the same data, if the effect of MySQL replication lag is ignored. The replicas can serve read-only traffic, execute long-running queries from data analysis tools, or perform administrative tasks. An unsharded keyspace always has only a single shard. diff --git a/content/en/docs/faq/getting-started/overview.md b/content/en/docs/faq/getting-started/overview.md index 4ea46c0b7..98bbcc51b 100644 --- a/content/en/docs/faq/getting-started/overview.md +++ b/content/en/docs/faq/getting-started/overview.md @@ -3,39 +3,6 @@ title: Overview weight: 1 --- -## How much resources (memory, CPU, disk) does Vitess use? - -**CPU** - -Vitess components (excluding the underlying MySQL server) tend to be CPU-bound processes. It is recommended to: - -* Allocate 2-4 CPU cores for each VTGate server. -* And allocate the same number of cores for VTTablet as with MySQLd. - * If you are provisioning for a new workload, we recommend projecting that MySQLd will require 1 core per 1500 QPS. - -Assuming tablets are kept to the recommended size of 250GB: -* Start with a baseline CPU requirement of 2-4 cores for MySQLd -* And allocate 2-4 cores for the VTTablet process. - -{{< info >}} -Note that this is very workload-dependent. We recommend testing the configuration for yourself as performance can vary depending on your query pattern, query size, concurrency, etc. -{{< /info >}} - -**Memory** - -The memory requirements for VTGate and VTTablet servers will depend on QPS and query result set sizes. We recommend: - -* Provisioning a baseline of 1GB per core. -* Allocating additional memory if you are increasing the Vitess default row limits and/or expect many concurrent queries returning large result sets. Note that this may not be necessary if your large result set queries use streaming. - -**Latency** - -The impact of network latency can be a factor when migrating from MySQL to Vitess. A simple rule of thumb is to estimate 2ms of round trip latency added to each query. This may be higher in a cloud environment, depending on your choice of load balancer, availability zone placement, etc. - -**Topology Service** - -For estimating CPU/memory/disk requirements of your chosen Topology Service, you can use the minimum requirements recommended by the topology server implementation. - ## What is Vitess? **Vitess is a database solution for deploying, scaling and managing large clusters of database instances.** @@ -48,13 +15,13 @@ It is architected to run as effectively in a public or private cloud architectur ## What is Vitess and MySQL's relationship? -**Vitess is not a database system itself, instead it is an overlay on top of MySQL.** +**Vitess is not a database itself, instead it is a distributed database system built around MySQL.** -Vitess provides a sharding system for MySQL, as well as some operational management for its instances. Vitess will assist with actions like sharding, managing backup and restore, and splitting, combining, and adding replicas. +Vitess provides a sharding system for MySQL, as well as some operational management for its instances. Vitess will assist with actions like sharding, managing backup and restore, and adding replicas. -However, it is important to note that implementers of Vitess will need to provide their own MySQL and perform their own MySQL management. The amount of MySQL management required depends on if Vitess is configured to run with "integrated" MySQL (i.e. MySQL managed by Vitess) or "external" MySQL. +However, it is important to note that implementers of Vitess will need to provide their own MySQL and perform their own MySQL management. The amount of MySQL management required depends on if Vitess is configured to run with "managed" MySQL or "external" MySQL. -Vitess can run against various flavors/implementations of MySQL, e.g. MySQL Community Edition, MySQL Enterprise Edition, Percona Server, MariaDB Server. Vitess can also be used with many Cloud deployments of MySQL, e.g. AWS RDS, AWS Aurora, GCP Cloud SQL, etc. +Vitess can run against various flavors/implementations of MySQL, e.g. MySQL Community Edition, MySQL Enterprise Edition and Percona Server. Vitess can also be used with many Cloud deployments of MySQL, e.g. AWS RDS, AWS Aurora, GCP Cloud SQL, etc. ## How can I migrate out of Vitess? @@ -66,18 +33,18 @@ Both mysqldump and go-mydumper are not typically suitable for production backups ## How do Vitess replicas stay in sync? Do replicas use VReplication? -Every shard in Vitess uses normal MySQL replication to replicate changes from the primary for that shard to the replica(s). Vitess can use asynchronous MySQL replication (the default), but can also be configured to use semi-synchronous MySQL replication for environments with higher durability requirements. +Every shard in Vitess uses normal MySQL replication to replicate changes from the primary for that shard to the replica(s). Vitess can use asynchronous MySQL replication (the default), but can also be configured to use semi-synchronous MySQL replication in order to provide data durability in the presence of failures. -VReplication is used internally in Vitess for items like resharding, moving tables, and materialized views. It is not used directly to keep replicas in sync with a primary. +VReplication is used internally in Vitess for features like resharding, migrating tables across keyspaces, and materialized views. It is not used directly to keep replicas in sync with a primary. ## What are the main components of Vitess? Vitess consists of a number of server processes and command-line utilities and is backed by a consistent metadata store. The main server components consist of: -* vtgate -* Topology server -* vtctld -* Tablets which are made up of vttablets and mysqld +* VTGate +* Topology server (etcd) +* VTCtld +* Tablets which are made up of VTTablets and mysqld The diagram below illustrates Vitess’ components and their location within Vitess’ architecture: diff --git a/content/en/docs/faq/getting-started/topology.md b/content/en/docs/faq/getting-started/topology.md index 093e9443f..c4135c84f 100644 --- a/content/en/docs/faq/getting-started/topology.md +++ b/content/en/docs/faq/getting-started/topology.md @@ -8,15 +8,15 @@ weight: 4 The Topology Service is a set of backend processes. This service is exposed to all Vitess components. It delivers a key/value service that is highly available and consistent, while being offset by having higher latency cost and very low throughput. The Topology Service is used for several things by Vitess: * It enables tablets to coordinate among themselves as a cluster. -* It enables Vitess to discover tablets, so it knows where to route queries. -* It stores Vitess configuration provided by the database administrator which is required by the different components in the Vitess cluster and that must persist between server restarts. +* It enables VTGate to discover tablets, so it knows where to route queries. +* It stores Vitess configuration provided by the administrator which is required by the different components in the Vitess cluster and that must persist between server restarts. The main functions the Topology Service provides are: * It is both a repository for topology metadata and a distributed lock manager. * It is used to store configuration data about the Vitess cluster. It stores small data structures (a few hundred bytes) per object. * E.g. information about the Keyspaces, the Shards, the Tablets, the Replication Graph, and the Serving Graph. -* It supports a watch interface that signals a client when changes occur on an object. This is used, for instance, to know when the keyspace topology changes (e.g. for resharding). +* It supports a watch interface that signals a client when changes occur on an object. This is used, for instance, by VTGate to know when the VSchema changes. * It supports primary election. * It supports quorum reads and writes. @@ -25,12 +25,11 @@ The main functions the Topology Service provides are: Vitess uses a plugin implementation to support multiple backend technologies for the Topology Service. The servers currently supported are as follows: * etcd * ZooKeeper -* Consul The Topology Service interfaces are defined in our code in go/vt/topo/, specific implementations are in go/vt/topo/, and we also have a set of unit tests for it in go/vt/topo/test. {{< info >}} -If starting from scratch, please use the zk2 (ZooKeeper) or etcd2 (etcd) implementations. The Consul implementation is deprecated, although still supported. +If starting from scratch, please use the `etcd` implementation. The Consul implementation is deprecated, although still supported. {{< /info >}} ## How do I choose which topology server to use? @@ -39,8 +38,6 @@ The first question to consider is: Do you use one already or are you required to If the answer to that question is no, then we’d recommend that you use etcd if you can, otherwise we’d recommend that you use ZooKeeper. -We recommend that you try not to use Consul, if possible. - ## How do I implement etcd (etcd2)? If you want to implement etcd we recommend following the steps on Vitess’ documentation [here](https://vitess.io/docs/reference/features/topology-service/#etcd-etcd2-implementation-new-version-of-etcd). diff --git a/content/en/docs/faq/operating-vitess/overview.md b/content/en/docs/faq/operating-vitess/overview.md index b1177902b..e0d67dcfb 100644 --- a/content/en/docs/faq/operating-vitess/overview.md +++ b/content/en/docs/faq/operating-vitess/overview.md @@ -36,3 +36,37 @@ The Vitess Operator automates the management and maintenance work of Vitess on K - Automatically roll out updates to Vitess-level user credentials. For information on using the Vitess Operator with AWS please follow the link [here](https://docs.planetscale.com/vitess-operator/aws-quickstart). For Google Cloud Platform please follow the link [here](https://docs.planetscale.com/vitess-operator/gcp-quickstart). + +## How much resources (memory, CPU, disk) does Vitess use? + +**CPU** + +Vitess components (excluding the underlying MySQL server) tend to be CPU-bound processes. It is recommended to: + +* Allocate 2-4 CPU cores for each VTGate server. +* And allocate the same number of cores for VTTablet as with MySQLd. + * If you are provisioning for a new workload, we recommend projecting that MySQLd will require 1 core per 1500 QPS. + +Assuming tablets are kept to the recommended size of 250GB: +* Start with a baseline CPU requirement of 2-4 cores for MySQLd +* And allocate 2-4 cores for the VTTablet process. + +{{< info >}} +Note that this is very workload-dependent. We recommend testing the configuration for yourself as performance can vary depending on your query pattern, query size, concurrency, etc. +{{< /info >}} + +**Memory** + +The memory requirements for VTGate and VTTablet servers will depend on QPS and query result set sizes. We recommend: + +* Provisioning a baseline of 1GB per core. +* Allocating additional memory if you are increasing the Vitess default row limits and/or expect many concurrent queries returning large result sets. Note that this may not be necessary if your large result set queries use streaming. + +**Latency** + +The impact of network latency can be a factor when migrating from MySQL to Vitess. A simple rule of thumb is to estimate 2ms of round trip latency added to each query. This may be higher in a cloud environment, depending on your choice of load balancer, availability zone placement, etc. + +**Topology Service** + +For estimating CPU/memory/disk requirements of your chosen Topology Service, you can use the minimum requirements recommended by the topology server implementation. + From 4c3f19b38a3f48da5745214b0bf74669f2302065 Mon Sep 17 00:00:00 2001 From: deepthi Date: Wed, 20 Nov 2024 23:00:33 -0800 Subject: [PATCH 10/10] update getting started and advanced faqs Signed-off-by: deepthi --- .../docs/faq/advanced-configuration/vindex.md | 2 +- .../en/docs/faq/getting-started/metrics.md | 14 +++++----- .../en/docs/faq/getting-started/overview.md | 2 +- .../en/docs/faq/getting-started/topology.md | 7 +++-- .../docs/faq/getting-started/vreplication.md | 22 +++++++-------- .../en/docs/faq/getting-started/vschema.md | 28 +++++++++---------- 6 files changed, 38 insertions(+), 37 deletions(-) diff --git a/content/en/docs/faq/advanced-configuration/vindex.md b/content/en/docs/faq/advanced-configuration/vindex.md index 4a4ad22eb..b158e389f 100644 --- a/content/en/docs/faq/advanced-configuration/vindex.md +++ b/content/en/docs/faq/advanced-configuration/vindex.md @@ -1,5 +1,5 @@ --- -title: Vindex +title: Vindexes weight: 6 --- diff --git a/content/en/docs/faq/getting-started/metrics.md b/content/en/docs/faq/getting-started/metrics.md index 069700681..0b74ddb7e 100644 --- a/content/en/docs/faq/getting-started/metrics.md +++ b/content/en/docs/faq/getting-started/metrics.md @@ -7,19 +7,19 @@ weight: 7 All Vitess components have a web UI that you can access to see the state of each component. -The first place to look is the /debug/status page. +The first place to look is the `/debug/status` page. * This is the main landing page for a VTGate, which displays the status of a particular server. A list of tablets this VTGate process is connected to is also displayed, as this is the list of tablets that can potentially serve queries. -A second place to look is the /debug/vars page. For example, for VTGate, this page contains the following items: +A second place to look is the `/debug/vars` page. For example, for VTGate, this page contains the following items: -* VTGateApi - This is the main histogram variable to track for VTGates. It gives you a break down of all queries by command, keyspace, and type. +* VTGateApi - This is the main histogram variable to track for VTGates. It gives you a breakdown of all queries by command, keyspace, and type. * HealthcheckConnections - It shows the number of tablet connections for query/healthcheck per keyspace, shard, and tablet type. There are two other pages you can use to get monitoring information from Vitess in the VTGate web UI: -* /debug/query_plans - This URL gives you all the query plans for queries going through VTGate. -* /debug/vschema - This URL shows the vschema as loaded by VTGate. +* `/debug/query_plans` - This URL gives you all the query plans for queries going through VTGate. +* `/debug/vschema` - This URL shows the VSchema as loaded by VTGate. VTTablet has a similar web UI. @@ -27,8 +27,8 @@ Vitess component metrics can also be scraped via /metrics. This will provide a P ## How do you integrate Prometheus and Vitess? -There is an Prometheus exporter that is on by default that enables you to configure a Prometheus compatible scraper to grab data from the various Vitess components. All Vitess components with web UI’s export their metrics on their web UI port on /metrics. +There is an Prometheus exporter that is on by default that enables you to configure a Prometheus compatible scraper to grab data from the various Vitess components. All Vitess components export their metrics on their http port at `/metrics`. -If your Vitess configuration includes running the Vitess or PlanetScaleDB Operator on Kubernetes, then you can have Prometheus or a Prometheus compatible agent running in your Kubernetes cluster. This would then scrape the metrics from Vitess automatically, as it would be run on the ports advertised and on our standard /metrics page. With the PlanetScaleDB Operator for Kubernetes, this is done for you automatically. +If your Vitess configuration includes running the Vitess Operator on Kubernetes, then you can have Prometheus or a Prometheus compatible agent running in your Kubernetes cluster. This would then scrape the metrics from Vitess automatically, as it would be run on the ports advertised and on our standard `/metrics` page. You can read more about getting the metrics into Prometheus [here](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config). diff --git a/content/en/docs/faq/getting-started/overview.md b/content/en/docs/faq/getting-started/overview.md index 98bbcc51b..a3c7cb8e6 100644 --- a/content/en/docs/faq/getting-started/overview.md +++ b/content/en/docs/faq/getting-started/overview.md @@ -48,7 +48,7 @@ Vitess consists of a number of server processes and command-line utilities and i The diagram below illustrates Vitess’ components and their location within Vitess’ architecture: -Vitess Components +Vitess Components ## Are microservices recommended for scaling? diff --git a/content/en/docs/faq/getting-started/topology.md b/content/en/docs/faq/getting-started/topology.md index c4135c84f..8428170db 100644 --- a/content/en/docs/faq/getting-started/topology.md +++ b/content/en/docs/faq/getting-started/topology.md @@ -29,14 +29,15 @@ Vitess uses a plugin implementation to support multiple backend technologies for The Topology Service interfaces are defined in our code in go/vt/topo/, specific implementations are in go/vt/topo/, and we also have a set of unit tests for it in go/vt/topo/test. {{< info >}} -If starting from scratch, please use the `etcd` implementation. The Consul implementation is deprecated, although still supported. +If starting from scratch, please use the `etcd` implementation. {{< /info >}} ## How do I choose which topology server to use? -The first question to consider is: Do you use one already or are you required to use a specific one? If the answer to that question is yes, then you should likely implement that rather than adding a new server to run Vitess. +The first question to consider is: do you use one already or are you required to use a specific one? If the answer to that question is yes, then you should likely implement that rather than adding a new server to run Vitess. +However, in large implementations, it makes sense to run a separate topology server dedicated to Vitess. This avoids "noisy neighbor" problems. -If the answer to that question is no, then we’d recommend that you use etcd if you can, otherwise we’d recommend that you use ZooKeeper. +By default, we recommend that you use etcd if you can, otherwise you may use ZooKeeper. ## How do I implement etcd (etcd2)? diff --git a/content/en/docs/faq/getting-started/vreplication.md b/content/en/docs/faq/getting-started/vreplication.md index e9d38686f..5452ed53e 100644 --- a/content/en/docs/faq/getting-started/vreplication.md +++ b/content/en/docs/faq/getting-started/vreplication.md @@ -5,24 +5,24 @@ weight: 6 ## What is VReplication? How does it work? -VReplication is used as a building block for a number of use cases throughout Vitess. It works as a stream or combination of streams that establish replication from a source keyspace/shard into a target keyspace/shard. A given stream can replicate multiple tables. It allows Vitess to keep the data being copied in-sync by using a combination of copying rows and filtered replication. +VReplication is used as a building block for a number of features in Vitess. It works as a stream or combination of streams that establish replication from a source keyspace/shard into a target keyspace/shard. A given stream can replicate multiple tables. It allows Vitess to keep the data being copied in-sync by using a combination of copying rows and filtered replication. -Vreplication works via the following process: +VReplication works via the following process: -1. Analyzing the source table and identifying what rows it needs to copy. -2. It then very briefly locks the table and makes a note of the current GTID replication position on the source database. After it’s noted the current GTID Vreplication then unlocks the table again. -3. It selects all the rows and all the columns from GTID value 0 onward and copies from that select. -4. It then streams the copy over to Vitess to start inserting rows. Vreplication will keep copying for a period of time, around an hour, to attempt to finish the copy. -5. If Vreplication hasn’t finished in an hour, it will stop and go back to the table in order to pick up any changes that have been made since it started copying. +1. It first analyzes the source table on the source shard and identifies what rows it needs to copy. +2. It then very briefly locks the table and records the current GTID replication position on the source database. After recording the current GTID position, VReplication then unlocks the table again. +3. It selects all rows and columns that match a specified filter from GTID value 0 onward and makes a copy of the results. +4. It then streams the copy over to the target shard to start inserting rows. VReplication will keep copying for a specified period of time (default 1 hour), to attempt to finish the copy. +5. If the copying phase on the target hasn’t finished in an hour, it will stop and go back to the table in order to pick up any changes that have been made since it started copying. 6. It knows what the GTID was when it started copying and what the GTID is now. This enables it to determine what events have occurred after it performed the first select and copy. 7. It will then filter out all the events except the ones that pertain to the relevant table and will apply the changes to the destination table. -This process then repeats until Vreplication finishes copying the whole table. After the copying process finishes Vreplication will change to filtered replication to keep the table in sync. +This process then repeats until VReplication finishes copying the whole table. After the copying process finishes VReplication will transition to filtered replication to keep the table in sync between the source and the target. ## How can I use VReplication? -There are a number of higher level commands like MoveTables and Materialized Views that create Vreplication streams behind the scenes of the command. By using these higher level commands, Vitess creates VReplication rules for the user. Further use cases are listed out [here](https://vitess.io/docs/reference/features/vreplication/). +There are a number of higher level commands like MoveTables, Reshard, and Materialize that create VReplication streams behind the scenes of the command. By using these higher level commands, Vitess creates VReplication rules for the user. Further use cases are listed out [here](https://vitess.io/docs/reference/features/vreplication/). -For more information on [MoveTables](https://vitess.io/docs/user-guides/migration/move-tables/) and [Materialized Views](https://vitess.io/docs/user-guides/migration/materialize/ please follow the links provided. +For more information on [MoveTables](https://vitess.io/docs/user-guides/migration/move-tables/) and [Materialized Views](https://vitess.io/docs/user-guides/migration/materialize/) please follow the links provided. -There is a way to create VReplication rules by hand but we don’t recommend using that method as it can be challenging to configure the rules correctly. +It is possible to create VReplication rules by hand, but we don’t recommend doing that as it can be challenging to configure the rules correctly. diff --git a/content/en/docs/faq/getting-started/vschema.md b/content/en/docs/faq/getting-started/vschema.md index 28118e1a7..aba346ec3 100644 --- a/content/en/docs/faq/getting-started/vschema.md +++ b/content/en/docs/faq/getting-started/vschema.md @@ -1,5 +1,5 @@ --- -title: VSchema +title: VSchema and Vindexes weight: 5 --- @@ -11,21 +11,11 @@ In contrast to a traditional database schema that contains metadata about tables Simply put, it contains the information needed to make Vitess look and act like a single database server. -For example, the VSchema will contain the information about the sharding key for each sharded table. When the application issues a query with a WHERE clause that references the key, the VSchema information will be used to route the query to the appropriate shard. - -## What is a primary Vindex and how does it work? - -The Primary Vindex for a table is analogous to a database primary key. - -Every sharded table must have one defined. A Primary Vindex must be unique: given an input value, it must produce a single keyspace ID. At the time of an insert to the table, the unique mapping produced by the Primary Vindex determines the target shard for the inserted row. - -In Vitess, the choice of Vindex allows control of how a column value maps to a keyspace ID. In other words, a Primary Vindex in Vitess not only defines the Sharding Key, but also decides the Sharding Strategy. - -Uniqueness for a Primary Vindex does not mean that the column has to be a primary key or unique key in the MySQL schema for the underlying shard. You can have multiple rows that map to the same keyspace ID. The Vindex uniqueness constraint only ensures that all rows for a keyspace ID end up in the same shard. +For example, the VSchema will contain the sharding key for each sharded table. When the application issues a query with a WHERE clause that references the key, the VSchema will be used to route the query to the appropriate shard. ## What is a Vindex and how does it work? -A Vindex provides a way to map a column value to a keyspace ID. Since each shard in Vitess covers a range of keyspace ID values, this mapping can be used to identify which shard contains a row. +A Vindex provides a way to map a column value to a keyspace ID. Since each shard in Vitess covers a range of keyspace ID values, this mapping can be used to identify which shard contains a row. The advantages of Vindexes stem from their flexibility: @@ -37,6 +27,16 @@ The advantages of Vindexes stem from their flexibility: The Vschema contains the Vindex for any sharded tables. Every Vschema must have at least one Vindex, called the Primary Vindex, defined. A variety of other Vindexes are also available to choose from, with different trade-offs, and you can choose one that best suits your needs. You can read more about other Vindexes [here](https://vitess.io/docs/reference/features/vindexes/). +## What is a primary Vindex and how does it work? + +The Primary Vindex for a table is analogous to a database primary key. + +Every sharded table must have one defined. A Primary Vindex must be unique: given an input value, it must produce a single keyspace ID. At the time of an insert to the table, the unique mapping produced by the Primary Vindex determines the target shard for the inserted row. + +In Vitess, the choice of Vindex allows control of how a column value maps to a keyspace ID. In other words, a Primary Vindex in Vitess not only defines the Sharding Key, but also decides the Sharding Strategy. + +Uniqueness for a Primary Vindex does not mean that the column has to be a primary key or unique key in the MySQL schema for the underlying shard. You can have multiple rows that map to the same keyspace ID. The Vindex uniqueness constraint only ensures that all rows for a keyspace ID end up in the same shard. + ## How do I create a VSchema? The ease of creation of a VSchema depends heavily on now your data model is constructed. @@ -53,6 +53,6 @@ Please do keep in mind that you don’t have to have Vindex to cover every query For a very trivial setup where there is only one unsharded keyspace, there is no need to specify a VSchema because Vitess will know that there is nowhere to route a query except to the single shard. -However, once you have sharding, having a VSchema becomes a necessity. This is because a VSchema is needed to locate and place rows row each table in a sharded keyspace. +However, once you have sharding, having a VSchema becomes a necessity. This is because a VSchema is needed to locate and place rows in each table in a sharded keyspace. The Vitess distribution has a demo of VSchema operation [here](https://github.com/vitessio/vitess/tree/master/examples/demo).