本文記錄搭建mysql innodb cluster的過程和基本的測試。
1、環境描述
主機名 | 主機IP | 部署 |
tidb60 | 192.168.68.60 | MySQL8.0.20 |
tidb61 | 192.168.68.61 | MySQL8.0.20 |
tidb62 | 192.168.68.62 | MySQL8.0.20 |
tidb63 | 192.168.68.63 | MySQL-shell,MySQL-route,mysql-client |
2、下載安裝包
https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz
https://cdn.mysql.com//Downloads/MySQL-Router/mysql-router-8.0.20-linux-glibc2.12-x86_64.tar.xz
https://cdn.mysql.com//Downloads/MySQL-Shell/mysql-shell-8.0.20-linux-glibc2.12-x86-64bit.tar.gz
2、環境部署
2.1 MySQL8.0.20 實例部署,以tidb60主機上為例。
mkdir -p /home/mysql_cluster/my3366/{socket,data,logs,dump_dir}
cd /home/mysql_cluster
chown -R mysql:mysql my3366
/usr/local/mysql8020/bin/mysqld --defaults-file=/home/mysql_cluster/my3366/my3366.cnf --initialize
nohup /usr/local/mysql8020/bin/mysqld_safe --defaults-file=/home/mysql_cluster/my3366/my3366.cnf --user=mysql &
/usr/local/mysql8020/bin/mysql -S /home/mysql_cluster/my3366/socket/mysql3366.sock -uroot -p
create user dba@'%' identified WITH mysql_native_password by 'dba';
grant all on *.* to dba@'%' with grant option;
flush privileges;
參數文件/home/mysql_cluster/my3366/my3366.cnf
[client] port = socket = /home/mysql_cluster/my3366/socket/mysql3366.sock [mysql] prompt="\\u@\\h \R:\m:\s [\\d]>" no-auto-rehash port = 3366 socket = /home/mysql_cluster/my3366/socket/mysql3366.sock default_character_set = utf8mb4 [mysqladmin] port = 3366 socket = /home/mysql_cluster/my3366/socket/mysql3366.sock [mysqldump] port = 3366 socket = /home/mysql_cluster/my3366/socket/mysql3366.sock [xtrabackup] port = 3366 socket = /home/mysql_cluster/my3366/socket/mysql3366.sock [mysqlbackup] port = 3366 socket = /home/mysql_cluster/my3366/socket/mysql3366.sock safe_slave_backup_timeout = 0 [mysqld] # basic settings # user = mysql port = 3366 default_storage_engine = InnoDB server_id = 168603366 sql_mode = STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION socket = /home/mysql_cluster/my3366/socket/mysql3366.sock pid_file = /home/mysql_cluster/my3366/socket/mysql3366.pid basedir = /usr/local/mysql8020 datadir = /home/mysql_cluster/my3366/data character_set_server = utf8mb4 default_time_zone = +08:00 back_log = 1024 thread_stack = 512K external_locking = FALSE open_files_limit = 65535 max_allowed_packet = 128M lower_case_table_names = 1 explicit_defaults_for_timestamp = 1 read_only = 0 super_read_only = 0 # connection # lock_wait_timeout = 3600 skip_name_resolve = 1 max_connect_errors = 1000000 max_connections = 5000 # table cache performance settings# table_open_cache = 4096 table_open_cache_instances = 64 table_definition_cache = 4096 # CACHES AND LIMITS # tmp_table_size = 32M max_heap_table_size = 32M bulk_insert_buffer_size = 64M # session memory settings # sort_buffer_size = 4M join_buffer_size = 4M read_buffer_size = 8M read_rnd_buffer_size = 4M thread_cache_size = 3000 # log settings # log_error_verbosity = 3 min_examined_row_limit = 100 log_slow_admin_statements = 1 log_slow_slave_statements = 1 log_error = /home/mysql_cluster/my3366/logs/mysql-error.log log_timestamps = SYSTEM log_queries_not_using_indexes = 1 slow_query_log = 1 slow_query_log_file = /home/mysql_cluster/my3366/logs/mysql-slow.log long_query_time = 0.5 # innodb settings # innodb_buffer_pool_load_at_startup = 1 innodb_buffer_pool_dump_at_shutdown = 1 innodb_data_file_path = ibdata1:1G:autoextend innodb_log_buffer_size = 32M innodb_thread_concurrency = 0 innodb_sync_spin_loops = 100 innodb_spin_wait_delay = 30 ##機械盤設置為500,SSD盤設置為10000-20000## innodb_io_capacity = 500 ##機械盤設置為2000,SSD盤設置為10000-20000## innodb_io_capacity_max = 1000 ##機械盤設置為1,SSD盤設置為0## innodb_flush_neighbors = 1 innodb_write_io_threads = 16 innodb_read_io_threads = 16 innodb_purge_threads = 4 innodb_page_cleaners = 16 innodb_open_files = 65535 innodb_max_dirty_pages_pct = 50 innodb_lru_scan_depth = 4096 innodb_lock_wait_timeout = 10 innodb_checksum_algorithm = crc32 innodb_rollback_on_timeout = 1 innodb_print_all_deadlocks = 1 innodb_online_alter_log_max_size = 4G innodb_stats_on_metadata = 0 innodb_flush_method = O_DIRECT innodb_log_files_in_group = 3 innodb_log_file_size = 1G innodb_flush_log_at_trx_commit = 1 innodb_file_per_table = 1 innodb_buffer_pool_size = 4G innodb_buffer_pool_instances = 4 # undo settings # innodb_undo_directory = /home/mysql_cluster/my3366/data innodb_undo_tablespaces = 95 innodb_undo_log_truncate = 1 innodb_purge_rseg_truncate_frequency = 128 innodb_max_undo_log_size = 4G innodb_status_file = 1 innodb_status_output = 0 innodb_status_output_locks = 0 # performance_schema # performance_schema = 1 performance_schema_instrument = '%=on' # innodb monitor # innodb_monitor_enable="module_innodb,module_server,module_dml,module_ddl,module_trx,module_os,module_purge,module_log,module_lock,module_buffer,module_index,module_ibuf_system,module_buffer_page,module_adaptive_hash" # safe # secure_file_priv = /home/mysql_cluster/my3366/dump_dir default_password_lifetime = 0 # replication settings # skip_slave_start = 1 relay_log = /home/mysql_cluster/my3366/logs/relay-bin slave_pending_jobs_size_max = 128M log_slave_updates = 1 log_bin = /home/mysql_cluster/my3366/logs/mysql-bin expire_logs_days = 7 sync_binlog = 1 gtid_mode = ON enforce_gtid_consistency = 1 binlog_cache_size = 4M max_binlog_size = 512M max_binlog_cache_size = 2G slave_preserve_commit_order= 1 binlog_format = row relay_log_purge = 1 slave_parallel_type = LOGICAL_CLOCK slave_parallel_workers = 16 master_info_repository = TABLE relay_log_info_repository = TABLE relay_log_recovery = ON binlog_gtid_simple_recovery = 1 # group replication & innodb cluster # disabled_storage_engines = "MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY" master_info_repository = table binlog_checksum = NONE relay_log_info_repository = table gtid_mode = ON enforce_gtid_consistency = ON binlog_checksum = NONE log_slave_updates = ON binlog_format = ROW transaction_write_set_extraction = XXHASH64 slave_parallel_workers = 4 slave_preserve_commit_order = 1 slave_parallel_type = LOGICAL_CLOCK binlog_transaction_dependency_tracking = WRITESET_SESSION # clone #
2.2 配置檢查
在tidb63主機上部署mysqlshell,下載后解壓,配置環境變量即可使用,部署路徑跟進實際環境即可。
檢查節點1:tidb60:3366實例
[root@tidb63 bin]# pwd
/home/jm/data/mysql-shell-8.0.20/bin
[root@tidb63 bin]# ./mysqlsh dba@tidb60:3366
Please provide the password for 'dba@tidb60:3366': ***
MySQL Shell 8.0.20
Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.
Type '\help' or '\?' for help; '\quit' to exit.
Creating a session to 'dba@tidb60:3366'
Fetching schema names for autocompletion... Press ^C to stop.
Your MySQL connection id is 36698
Server version: 8.0.20 MySQL Community Server - GPL
No default schema selected; type \use <schema> to set one.
MySQL tidb60:3366 ssl JS > dba.checkInstanceConfiguration("dba@tidb60:3366");
Please provide the password for 'dba@tidb60:3366': ***
Validating MySQL instance at tidb60.com:3366 for use in an InnoDB cluster...
This instance reports its own address as tidb60.com:3366
Clients and other cluster members will communicate with it through this address by default. If this is not correct, the report_host MySQL system variable should be changed.
Checking whether existing tables comply with Group Replication requirements...
No incompatible tables detected
Checking instance configuration...
Instance configuration is compatible with InnoDB cluster
The instance 'tidb60.com:3366' is valid to be used in an InnoDB cluster.
{
"status": "ok"
}
MySQL tidb60:3366 ssl JS >
檢查節點2:tidb61:3366實例
Please provide the password for 'dba@tidb61:3366': ***
Validating MySQL instance at tidb61.com:3366 for use in an InnoDB cluster...
Clients and other cluster members will communicate with it through this address by default. If this is not correct, the report_host MySQL system variable should be changed.
No incompatible tables detected
Instance configuration is compatible with InnoDB cluster
"status": "ok"
}
MySQL tidb60:3366 ssl JS >
Please provide the password for 'dba@tidb62:3366': ***
Validating MySQL instance at tidb62.com:3366 for use in an InnoDB cluster...
Clients and other cluster members will communicate with it through this address by default. If this is not correct, the report_host MySQL system variable should be changed.
No incompatible tables detected
Instance configuration is compatible with InnoDB cluster
"status": "ok"
}
MySQL tidb60:3366 ssl JS >
2.3 創建集群
可以在任一 一個節點上執行,根據測試發現初次加入集群的這節點最終是是master節點,即可以R/W
/home/jm/data/mysql-shell-8.0.20/bin
[root@tidb63 bin]# ./mysqlsh dba@tidb60:3366
Please provide the password for 'dba@tidb60:3366': ***
MySQL Shell 8.0.20
Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.
Creating a session to 'dba@tidb60:3366'
Fetching schema names for autocompletion... Press ^C to stop.
Your MySQL connection id is 37770
Server version: 8.0.20 MySQL Community Server - GPL
No default schema selected; type \use <schema> to set one.
MySQL tidb60:3366 ssl JS > var cluster = dba.createCluster('lixd');
A new InnoDB cluster will be created on instance 'tidb60:3366'.
Validating instance configuration at tidb60:3366...
NOTE: Group Replication will communicate with other members using 'tidb60.com:33661'. Use the localAddress option to override.
NOTE: Metadata schema found in target instance
Cluster successfully created. Use Cluster.addInstance() to add MySQL instances.
At least 3 instances are needed for the cluster to be able to withstand up to
one server failure.
添加tidb61:3366實例到集群lixd中
Please provide the password for 'dba@tidb61:3366': ***
The safest and most convenient way to provision a new instance is through automatic clone provisioning, which will completely overwrite the state of 'tidb61.com:3366' with a physical snapshot from an existing cluster member. To use this method by default, set the 'recoveryMethod' option to 'clone'.
Please select a recovery method [C]lone/[I]ncremental recovery/[A]bort (default Clone): C
NOTE: Group Replication will communicate with other members using 'tidb61.com:33661'. Use the localAddress option to override.
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.
Monitoring recovery process of the new cluster member. Press ^C to stop monitoring and let it continue in background.
Clone based state recovery is now in progress.
server does not support the RESTART command or does not come back after a
while, you may need to manually start it back.
NOTE: tidb61.com:3366 is being cloned from tidb60.com:3366
** Stage DROP DATA: Completed
** Clone Transfer
FILE COPY ############################################################ 100% Completed
PAGE COPY ############################################################ 100% Completed
REDO COPY ############################################################ 100% Completed
** Stage RECOVERY: \
NOTE: tidb61.com:3366 is shutting down...
* tidb61.com:3366 has restarted, waiting for clone to finish...
* Clone process has finished: 1.12 GB transferred in 9 sec (125.00 MB/s)
添加tidb62:3366實例到集群lixd中
Please provide the password for 'dba@tidb62:3366': ***
The safest and most convenient way to provision a new instance is through automatic clone provisioning, which will completely overwrite the state of 'tidb62.com:3366' with a physical snapshot from an existing cluster member. To use this method by default, set the 'recoveryMethod' option to 'clone'.
Please select a recovery method [C]lone/[I]ncremental recovery/[A]bort (default Clone): C
NOTE: Group Replication will communicate with other members using 'tidb62.com:33661'. Use the localAddress option to override.
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.
Monitoring recovery process of the new cluster member. Press ^C to stop monitoring and let it continue in background.
Clone based state recovery is now in progress.
server does not support the RESTART command or does not come back after a
while, you may need to manually start it back.
NOTE: tidb62.com:3366 is being cloned from tidb61.com:3366
** Stage DROP DATA: Completed
** Clone Transfer
FILE COPY ############################################################ 100% Completed
PAGE COPY ############################################################ 100% Completed
REDO COPY ############################################################ 100% Completed
* tidb62.com:3366 has restarted, waiting for clone to finish...
** Stage RESTART: Completed
* Clone process has finished: 1.13 GB transferred in 9 sec (125.00 MB/s)
MySQL tidb60:3366 ssl JS > cluster.status()
{
"clusterName": "lixd",
"defaultReplicaSet": {
"name": "default",
"primary": "tidb60.com:3366",
"ssl": "REQUIRED",
"status": "OK",
"statusText": "Cluster is ONLINE and can tolerate up to ONE failure.",
"topology": {
"tidb60.com:3366": {
"address": "tidb60.com:3366",
"mode": "R/W",
"readReplicas": {},
"replicationLag": null,
"role": "HA",
"status": "ONLINE",
"version": "8.0.20"
},
"tidb61.com:3366": {
"address": "tidb61.com:3366",
"mode": "R/O",
"readReplicas": {},
"replicationLag": null,
"role": "HA",
"status": "ONLINE",
"version": "8.0.20"
},
"tidb62.com:3366": {
"address": "tidb62.com:3366",
"mode": "R/O",
"readReplicas": {},
"replicationLag": null,
"role": "HA",
"status": "ONLINE",
"version": "8.0.20"
}
},
"topologyMode": "Single-Primary"
},
"groupInformationSourceMember": "tidb60.com:3366"
}
MySQL tidb60:3366 ssl JS >
/opt/mysql-route-8.0.20/bin
[root@tidb63 bin]# ./mysqlrouter --bootstrap dba@tidb60:3366 -d /opt/mysql-route-lixd --conf-use-sockets --user=mysql
Please enter MySQL password for dba:
# Bootstrapping MySQL Router instance at '/opt/mysql-route-lixd'...
- Verifying account (using it to run SQL queries that would be run by Router)
- Storing account in keyring
- Adjusting permissions of generated files
- Creating configuration /opt/mysql-route-lixd/mysqlrouter.conf
- Read/Only Connections: localhost:6447, /opt/mysql-route-lixd/mysqlro.sock
- Read/Only Connections: localhost:64470, /opt/mysql-route-lixd/mysqlxro.sock
/opt/mysql-route-lixd
[root@tidb63 mysql-route-lixd]# ls -l
總用量 16
drwx------. 2 mysql mysql 39 5月 9 15:06 data
drwx------. 2 mysql mysql 29 5月 9 15:06 log
-rw-------. 1 mysql mysql 1400 5月 9 15:06 mysqlrouter.conf
-rw-------. 1 mysql mysql 92 5月 9 15:06 mysqlrouter.key
drwx------. 2 mysql mysql 6 5月 9 15:06 run
-rwx------. 1 mysql mysql 329 5月 9 15:06 start.sh
-rwx------. 1 mysql mysql 173 5月 9 15:06 stop.sh
[root@tidb63 mysql-route-lixd]# sh start.sh
[root@tidb63 mysql-route-lixd]# PID 124156 written to '/opt/mysql-route-lixd/mysqlrouter.pid'
logging facility initialized, switching logging to loggers specified in configuration
[root@tidb63 mysql-route-lixd]#
/opt/mysql-route-lixd/log
[root@tidb63 log]# more mysqlrouter.log
2020-05-09 15:08:25 routing INFO [7f929cc76700] [routing:lixd_ro] started: listening on 0.0.0.0:6447, routing strategy = round-robin-with-fallback
2020-05-09 15:08:25 routing INFO [7f92977fe700] [routing:lixd_x_ro] started: listening on 0.0.0.0:64470, routing strategy = round-robin-with-fallback
2020-05-09 15:08:25 routing INFO [7f9296ffd700] [routing:lixd_x_rw] started: listening on 0.0.0.0:64460, routing strategy = first-available
2020-05-09 15:08:25 routing INFO [7f9297fff700] [routing:lixd_rw] started: listening on 0.0.0.0:6446, routing strategy = first-available
2020-05-09 15:08:25 routing INFO [7f929cc76700] [routing:lixd_ro] started: listening using /opt/mysql-route-lixd/mysqlro.sock
2020-05-09 15:08:25 routing INFO [7f92977fe700] [routing:lixd_x_ro] started: listening using /opt/mysql-route-lixd/mysqlxro.sock
2020-05-09 15:08:25 routing INFO [7f9296ffd700] [routing:lixd_x_rw] started: listening using /opt/mysql-route-lixd/mysqlx.sock
2020-05-09 15:08:25 routing INFO [7f9297fff700] [routing:lixd_rw] started: listening using /opt/mysql-route-lixd/mysql.sock
2020-05-09 15:08:25 metadata_cache INFO [7f929d477700] Starting Metadata Cache
2020-05-09 15:08:25 metadata_cache INFO [7f929d477700] Connections using ssl_mode 'PREFERRED'
2020-05-09 15:08:25 metadata_cache INFO [7f92a05b2700] Starting metadata cache refresh thread
2020-05-09 15:08:25 metadata_cache INFO [7f92a05b2700] Potential changes detected in cluster 'lixd' after metadata refresh
2020-05-09 15:08:25 metadata_cache INFO [7f92a05b2700] Metadata for cluster 'lixd' has 1 replicasets:
2020-05-09 15:08:25 metadata_cache INFO [7f92a05b2700] 'default' (3 members, single-master)
2020-05-09 15:08:25 metadata_cache INFO [7f92a05b2700] tidb60.com:3366 / 33060 - role=HA mode=RW
2020-05-09 15:08:25 metadata_cache INFO [7f92a05b2700] tidb61.com:3366 / 33060 - role=HA mode=RO
2020-05-09 15:08:25 metadata_cache INFO [7f92a05b2700] tidb62.com:3366 / 33060 - role=HA mode=RO
2020-05-09 15:08:25 routing INFO [7f92a05b2700] Routing routing:lixd_x_ro listening on 64470 and named socket /opt/mysql-route-lixd/mysqlxro.sock got request to disconnect invalid connections
: metadata change
2020-05-09 15:08:25 routing INFO [7f92a05b2700] Routing routing:lixd_x_rw listening on 64460 and named socket /opt/mysql-route-lixd/mysqlx.sock got request to disconnect invalid connections:
metadata change
2020-05-09 15:08:25 routing INFO [7f92a05b2700] Routing routing:lixd_rw listening on 6446 and named socket /opt/mysql-route-lixd/mysql.sock got request to disconnect invalid connections: meta
data change
2020-05-09 15:08:25 routing INFO [7f92a05b2700] Routing routing:lixd_ro listening on 6447 and named socket /opt/mysql-route-lixd/mysqlro.sock got request to disconnect invalid connections: me
tadata change
[root@tidb63 log]#
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| tidb61.com |
+------------+
[root@tidb63 ~]# mysql -htidb63 -udba -pdba -P6447 -e "select @@hostname"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| tidb62.com |
+------------+
[root@tidb63 ~]# mysql -htidb63 -udba -pdba -P6447 -e "select @@hostname"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| tidb61.com |
+------------+
[root@tidb63 ~]# mysql -htidb63 -udba -pdba -P6447 -e "select @@hostname"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| tidb62.com |
+------------+
[root@tidb63 ~]#
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| tidb60.com |
+------------+
[root@tidb63 ~]#