Professional Documents
Culture Documents
MySQL __ MySQL InnoDB Cluster 8.0 - A Hands-on Tutorial
MySQL __ MySQL InnoDB Cluster 8.0 - A Hands-on Tutorial
0 - A Hands-on Tutorial
News
Announcements
(200)
https://dev.mysql.com/blog-archive/mysql-innodb-cluster-8-0-a-hands-on-tutorial/ 1/9
04/07/2024, 14:34 MySQL :: MySQL InnoDB Cluster 8.0 - A Hands-on Tutorial
Release
Announcements
(529)
Download and install the packages, through the usual platform-specific methods:
MySQL Server
MySQL Shell
MySQL Router
We’ll start by assuming that you have three instances running in different hosts, so the next step
is to prepare your instances for InnoDB cluster. Before moving to the auto-configuration of the
instances you may want to check whether your instances are already ready for InnoDB cluster
usage or not.
https://dev.mysql.com/blog-archive/mysql-innodb-cluster-8-0-a-hands-on-tutorial/ 2/9
04/07/2024, 14:34 MySQL :: MySQL InnoDB Cluster 8.0 - A Hands-on Tutorial
Example: dba.deploySandboxInstance(3306);
$ mysqlsh
MySQL Shell 8.0.11
Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
mysql-js>
mysql-js> dba.checkInstanceConfiguration()
A URI string
A dictionary with the connection options
mysql-js> dba.checkInstanceConfiguration("root@ic-1:3306")
Please provide the password for 'root@ic-1:3306': ***
Validating MySQL instance at ic-1:3306 for use in an InnoDB cluster...
{
"config_errors": [
{
"action": "server_update",
"current": "CRC32",
"option": "binlog_checksum",
"required": "NONE"
},
{
"action": "restart",
"current": "OFF",
"option": "enforce_gtid_consistency",
"required": "ON"
},
{
"action": "restart",
"current": "OFF",
"option": "gtid_mode",
"required": "ON"
},
{
"action": "restart",
"current": "1",
"option": "server_id",
https://dev.mysql.com/blog-archive/mysql-innodb-cluster-8-0-a-hands-on-tutorial/ 3/9
04/07/2024, 14:34 MySQL :: MySQL InnoDB Cluster 8.0 - A Hands-on Tutorial
"required": ""
}
],
"errors": [],
"status": "error"
}
The command reports that the instance is not ready for InnoDB cluster usage since some settings
are not valid.
The AdminAPI provides a command to automatically and remotely configure an instance for
InnoDB cluster usage: dba.configureInstance(). So the next step is to use
dba.configureInstance() on each target instance.
mysql-js> dba.configureInstance("root@ic-1:3306")
Please provide the password for 'root@ic-1:3306': ***
Configuring MySQL instance at ic-1:3306 for use in an InnoDB cluster...
Repeat the steps above on all the instances before initializing your cluster.
Note: The user account used to administer an instance does not have to be
the root account, however it needs to be an account with a specific set of
priveliges for InnoDB cluster management. The preferred method to create
users to administer the cluster is using the clusterAdmin option with
the dba.configureInstance().
clusterAdminPassword: "myAdminPwd"};
shell.connect("root@ic-1:3306")
Please provide the password for 'root@ic-1:3306': ***
Creating a session to 'root@ic-1:3306'
Fetching schema names for autocompletion... Press ^C to stop.
Closing old connection...
Your MySQL connection id is 20
Server version: 8.0.11 MySQL Community Server - GPL
No default schema selected; type \use <schema> to set one.
<ClassicSession:root@ic-1:3306>
https://dev.mysql.com/blog-archive/mysql-innodb-cluster-8-0-a-hands-on-tutorial/ 4/9
04/07/2024, 14:34 MySQL :: MySQL InnoDB Cluster 8.0 - A Hands-on Tutorial
The createCluster() command takes one parameter, which is a symbolic name you give to this
InnoDB cluster. This will, among other things:
mysql-js> cluster.addInstance("root@ic-2:3306");
A new instance will be added to the InnoDB cluster. Depending on the amount of
data on the cluster this might take from a few seconds to several hours.
mysql-js> cluster.addInstance("root@ic-3:3306");
A new instance will be added to the InnoDB cluster. Depending on the amount of
data on the cluster this might take from a few seconds to several hours.
https://dev.mysql.com/blog-archive/mysql-innodb-cluster-8-0-a-hands-on-tutorial/ 5/9
04/07/2024, 14:34 MySQL :: MySQL InnoDB Cluster 8.0 - A Hands-on Tutorial
mysql-js> cluster.status();
{
"clusterName": "myCluster",
"defaultReplicaSet": {
"name": "default",
"primary": "ic-1:3306",
"ssl": "REQUIRED",
"status": "OK",
"statusText": "Cluster is ONLINE and can tolerate up to ONE failure.",
"topology": {
"ic-1:3306": {
"address": "ic-1:3306",
"mode": "R/W",
"readReplicas": {},
"role": "HA",
"status": "ONLINE"
},
"ic-2:3306": {
"address": "ic-2:3306",
"mode": "R/O",
"readReplicas": {},
"role": "HA",
"status": "ONLINE"
},
"ic-3:3306": {
"address": "ic-3:3306",
"mode": "R/O",
"readReplicas": {},
"role": "HA",
"status": "ONLINE"
}
}
},
"groupInformationSourceMember": "mysql://root@ic-1:3306"
}
This command queries the current status of the InnoDB cluster and produces a report. The status
field for each instance should show either ONLINE or RECOVERING. RECOVERING means that the
instance is receiving updates from the seed instance and should eventually switch to ONLINE.
Another point to note is that one of the instances (the PRIMARY) is marked R/W (read/writable),
while the other two are marked R/O (read only). Only the instance marked R/W can execute
transactions that update the database. If that instance becomes unreachable for any reason (like
a system crash), one of the remaining two instances automatically takes over its place and
becomes the new PRIMARY.
The recommended deployment of MySQL Router is on the same host as the application. During
bootstrap, MySQL Router needs to connect to the cluster and have privileges to query the
performance_schema, mysql_innodb_cluster_metadata and create a restricted, read-only account
to be used by itself during normal operation.
Assuming MySQL Router is already installed, all we need to do is to bootstrap it with the
metadata server, calling mysqlrouter with the following command line option from the system’s
shell:
miguel@tecra:[~/work/testbase/mysql-router-8.0.11-linux-glibc2.12-x86-64bit]$ ./bin/mysqlr
Please enter MySQL password for root:
https://dev.mysql.com/blog-archive/mysql-innodb-cluster-8-0-a-hands-on-tutorial/ 6/9
04/07/2024, 14:34 MySQL :: MySQL InnoDB Cluster 8.0 - A Hands-on Tutorial
MySQL Router connects to the InnoDB cluster, fetches its metadata and configures itself for use.
It will configure itself to run from a self-contained directory, which allows you to deploy multiple
instances of the router in the same host without root privileges. The generated configuration
creates 4 TCP ports: one for read-write sessions (which redirect connections to the PRIMARY) and
one for read-only sessions (which redirect connections to one of the SECONDARY instances, in a
round-robin fashion, by default); one set for classic MySQL connections and another for the X
protocol.
Once bootstrapped and configured, start MySQL Router (or setup a service for it to start
automatically when the system boots):
$ myrouter/start.sh
You can now connect a MySQL client to one of the incoming MySQL Router ports and see how the
client gets transparently connected to one of the InnoDB cluster instances. To see which instance
we are actually connected to, we simply query the ‘port’ and ‘hostname’ status variable.
Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
mysql-js> \sql
Switching to SQL mode... Commands end with ;
Here we connected to the read-write port (6446), so the Router connected us to the PRIMARY
server, which is listening on port 3310. Now, try connecting to the read-only port (6447) and see
what you get.
https://dev.mysql.com/blog-archive/mysql-innodb-cluster-8-0-a-hands-on-tutorial/ 7/9
04/07/2024, 14:34 MySQL :: MySQL InnoDB Cluster 8.0 - A Hands-on Tutorial
To check the status of the InnoDB cluster at a later time, you can get a reference to the InnoDB
cluster object by connecting to the cluster through the Router or directly to one of the instances.
If you want to make changes to the cluster, you would need to connect to the read-write port of
the Router.
mysql-js> cluster.status()
{
"clusterName": "myCluster",
...
After that, we again check (from our test session to the MySQL Router) which instance we are now
connected to. The first SELECT fails since the connection to the original PRIMARY was lost. MySQL
Shell automatically reconnects for us and we simply execute the command again.
mysql-sql> \js
Switching to JavaScript mode...
mysql-js> var cluster = dba.getCluster()
mysql-js> cluster.status()
{
"clusterName": "myCluster",
"defaultReplicaSet": {
"name": "default",
"primary": "ic-2:3306",
"ssl": "REQUIRED",
"status": "OK_NO_TOLERANCE",
"statusText": "Cluster is NOT tolerant to any failures. 1 member is not active",
"topology": {
"ic-1:3306": {
"address": "ic-1:3306",
"mode": "R/O",
"readReplicas": {},
"role": "HA",
"status": "(MISSING)"
},
"ic-2:3306": {
"address": "ic-2:3306",
"mode": "R/W",
"readReplicas": {},
"role": "HA",
"status": "ONLINE"
},
"ic-3:3306": {
"address": "ic-3:3306",
"mode": "R/O",
"readReplicas": {},
"role": "HA",
"status": "ONLINE"
}
}
},
https://dev.mysql.com/blog-archive/mysql-innodb-cluster-8-0-a-hands-on-tutorial/ 8/9
04/07/2024, 14:34 MySQL :: MySQL InnoDB Cluster 8.0 - A Hands-on Tutorial
"groupInformationSourceMember": "mysql://root@localhost:6446"
}
This shows that the InnoDB cluster provided us with automatic failover, that MySQL Router has
automatically reconnected us to the new PRIMARY instance (‘ic-2’), and that we have high
availability.
Now let’s get ‘ic-1:3306’ back online and watch it rejoin the cluster automatically!
mysql-js> cluster.status()
{
"clusterName": "myCluster",
"defaultReplicaSet": {
"name": "default",
"primary": "ic-2:3306",
"ssl": "REQUIRED",
"status": "OK",
"statusText": "Cluster is ONLINE and can tolerate up to ONE failure.",
"topology": {
"ic-1:3306": {
"address": "ic-1:3306",
"mode": "R/O",
"readReplicas": {},
"role": "HA",
"status": "ONLINE"
},
"ic-2:3306": {
"address": "ic-2:3306",
"mode": "R/W",
"readReplicas": {},
"role": "HA",
"status": "ONLINE"
},
"ic-3:3306": {
"address": "ic-3:3306",
"mode": "R/O",
Contact MySQL Sales "readReplicas": {},
p "role": "HA",
USA/Canada: +1-866-221-0634 (More Countries »)
"status": "ONLINE"
}
}
},
"groupInformationSourceMember": "mysql://root@localhost:6446"
}
© 2024 Oracle
If you find issue with the or have feature requests, please file a bug report at bugs.mysql.com If
you’re not sure about what category to file under, use MySQL Server: Shell ( AdminAPI InnoDB
Cluster ).
https://dev.mysql.com/blog-archive/mysql-innodb-cluster-8-0-a-hands-on-tutorial/ 9/9