您现在的位置是:网站首页> 编程资料编程资料

MySQL Shell的介绍以及安装_Mysql_

2023-05-27 534人已围观

简介 MySQL Shell的介绍以及安装_Mysql_

01 ReplicaSet的架构

    前面的文章中,我们说了ReplicaSet的基本概念和限制以及部署前的基本知识。今天我们来看InnoDB ReplicaSet部署过程中的两个重要组件之一的MySQL Shell,为了更好的理解MySQL Shell,画了一张图,如下:  

通过上面的图,不难看出,MySQL Shell是运维人员管理底层MySQL节点的入口,也就是DBA执行管理命令的地方,而MySQL Router是应用程序连接的入口,它的存在,让底层的架构对应用程序透明,应用程序只需要连接MySQL Router就可以和底层的数据库打交道,而数据库的主从架构,都是记录在MySQL Router的原信息里面的。

今天,我们主要来看MySQL Shell的搭建过程。

02 MySQL Shell的介绍以及安装

   MySQL Shel是一个客户端工具,用于管理Innodb Cluster或者Innodb ReplicaSet,可以简单理解成ReplicaSet的一个入口。

    它的安装过程比较简单:在MySQL官网下载对应版本的MySQL Shell即可。地址如下:

https://downloads.mysql.com/archives/shell/

这里使用8.0.20版本

下载完毕之后,在Linux服务器进行解压,然后就可以通过这个MySQL Shell来连接线上的MySQL服务了。

我的线上MySQL地址分别是:

192.168.1.10  5607

192.168.1.20  5607

可以直接通过下面的命令来连接MySQL服务:

 /usr/local/mysql-shell-8.0.20/bin/mysqlsh '$user'@'$host':$port --password=$pass

成功连接之后的日志如下:

 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. WARNING: Using a password on the command line interface can be insecure. Creating a session to 'superdba@10.185.13.195:5607' Fetching schema names for autocompletion... Press ^C to stop. Your MySQL connection id is 831 Server version: 8.0.19 MySQL Community Server - GPL No default schema selected; type \use  to set one.  MySQL  192.168.1.10:5607 ssl  JS >   MySQL  192.168.1.10:5607 ssl  JS >   MySQL  192.168.1.10:5607 ssl  JS >   MySQL  192.168.1.10:5607 ssl  JS > 

03 MySQL Shell连接数据库并创建ReplicaSet

   上面已经介绍了使用MySQL Shell连接数据库的方法了,现在我们来看利用MySQL Shell来创建ReplicaSet的方法:

1、首先使用dba.configureReplicaSetInstance命令来配置副本集,并创建副本集的管理员。

 MySQL  192.168.1.10:5607 ssl  JS > dba.configureReplicaSetInstance('root@192.168.1.10:5607',{clusterAdmin:"'rsadmin'@'%'"}) Configuring MySQL instance at 192.168.1.10:5607 for use in an InnoDB ReplicaSet... This instance reports its own address as 192.168.1.10:5607 WARNING: User 'rsadmin'@'%' already exists and will not be created. However, it is missing privileges. The account 'rsadmin'@'%' is missing privileges required to manage an InnoDB cluster: GRANT REPLICATION_APPLIER ON *.* TO 'rsadmin'@'%' WITH GRANT OPTION; Dba.configureReplicaSetInstance: The account 'root'@'192.168.1.10' is missing privileges required to manage an InnoDB cluster. (RuntimeError)

可以看到,上面的命令中,我们配置了副本集的一个实例:192.168.1.10:5607,并创建了一个管理员账号rsadmin,同时这个管理员拥有clusterAdmin的权限。

返回的结果中,有一个报错信息,它提示我们登陆的root账号少了replication_applier的权限,因此无法使用root账号对rsadmin账号授权。我们给root账号补充replication_applier权限之后,重新执行上面的命令,结果如下:

 MySQL  192.168.1.10:5607 ssl  JS > dba.configureReplicaSetInstance('root@192.168.1.10:5607',{clusterAdmin:"'rsadmin'@'%'"}) Configuring MySQL instance at 192.168.1.10:5607 for use in an InnoDB ReplicaSet... This instance reports its own address as 192.168.1.10:5607 User 'rsadmin'@'%' already exists and will not be created. The instance '192.168.1.10:5607' is valid to be used in an InnoDB ReplicaSet. The instance '192.168.1.10:5607' is already ready to be used in an InnoDB ReplicaSet.

这次执行成功了。

我们登陆到底层的192.168.1.10上,查看rsadmin账号,可以发现,账号已经生成了,信息如下:

 select user,host,concat(user,"@'",host,"'"),authentication_string from mysql.user where user like "%%rsadmin"; +---------+------+----------------------------+-------------------------------------------+ | user    | host | concat(user,"@'",host,"'") | authentication_string                     | +---------+------+----------------------------+-------------------------------------------+ | rsadmin | %    | rsadmin@'%'                | *2090992BE9B9B27D89906C6CB13A8512DF49E439 | +---------+------+----------------------------+-------------------------------------------+ 1 row in set (0.00 sec) show grants for  rsadmin@'%'; +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Grants for rsadmin@%                                                                                                                                                                                                                                                        | +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | GRANT SELECT, RELOAD, SHUTDOWN, PROCESS, FILE, SUPER, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE USER ON *.* TO `rsadmin`@`%` WITH GRANT OPTION                                                                                                                 | | GRANT BACKUP_ADMIN,CLONE_ADMIN,PERSIST_RO_VARIABLES_ADMIN,SYSTEM_VARIABLES_ADMIN ON *.* TO `rsadmin`@`%` WITH GRANT OPTION                                                                                                                                                  | | GRANT INSERT, UPDATE, DELETE ON `mysql`.* TO `rsadmin`@`%` WITH GRANT OPTION                                                                                                                                                                                                | | GRANT INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `mysql_innodb_cluster_metadata`.* TO `rsadmin`@`%` WITH GRANT OPTION          | | GRANT INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `mysql_innodb_cluster_metadata_bkp`.* TO `rsadmin`@`%` WITH GRANT OPTION      | | GRANT INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `mysql_innodb_cluster_metadata_previous`.* TO `rsadmin`@`%` WITH GRANT OPTION | +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 6 rows in set (0.00 sec)

注意,如果我们加入的副本集实例是当前连接的实例,那么也可以使用简单的写法:

dba.configureReplicaSetInstance('',{clusterAdmin:"'rsadmin'@'%'"})

2、使用dba.createReplicaSet命令创建副本集,并将结果保存在一个变量里面,如下:

 MySQL  192.168.1.10:5607 ssl  JS > var rs = dba.createReplicaSet("yeyz_test") A new replicaset with instance '192.168.1.10:5607' will be created. * Checking MySQL instance at 192.168.1.10:5607 This instance reports its own address as 192.168.1.10:5607 192.168.1.10:5607: Instance configuration is suitable. * Updating metadata... ReplicaSet object successfully created for 192.168.1.10:5607. Use rs.addInstance() to add more asynchronously replicated instances to this replicaset and rs.status() to check its status.

可以看到,我们创建了一个yeyz_test的副本集,并将结果保存在变量rs当中。

3、使用rs.status()查看当前的副本集成员

 MySQL  192.168.1.10:5607 ssl  JS > rs.status() {     "replicaSet": {         "name": "yeyz_test",         "primary": "192.168.1.10:5607",         "status": "AVAILABLE",         "statusText": "All instances available.",         "topology": {             "192.168.1.10:5607": {                 "address": "192.168.1.10:5607",                 "instanceRole": "PRIMARY",                 "mode": "R/W",                 "status": "ONLINE"             }         },         "type": "ASYNC"     } }

这里面,可以看到,当前ReplicaSet里面已经有192.168.1.10:5607这个实例的,他的状态是available,他的角色是Primary。

4、此时我们使用rs.addInstance命令加入第2个节点,并使用rs.status查看状态。

这里需要注意,加入第二个节点的时候,有一个数据同步的过程,这个数据同步有2中策略:

策略一:全量恢复

使用MySQL Clone组件,然后使用克隆快照来覆盖新实例上面的所有数据。这种方法非常适合空白实例加入到Innodb 副本集中。

策略二:增量恢复

它依赖MySQL的复制功能,将所有的丢失的事务复制到新实例上,如果新实例上的事务很少,则这个过程会很快。这个方法需要保证集群中至少存在一个实例,它保存了这些缺失事务的binlog,如果缺失的事务的binlog已经清理,则这个方法不能使用。

当一个实例加入一个集群的时候,MySQL Shell会自动尝试挑选一个合适的策略来同步数据,不需要人为干预,如果它无法安全的选择同步方法,则会提供给DBA一个选项,让你选择是通过Clone或者增量同步的方法来实现数据同步。

下面的例子中,就是通过自动选择增量同步的方法来同步数据的:

 MySQL  192.168.1.10:5607 ssl  JS > rs.addInstance("192.168.1.20:5607") WARNING: Concurrent execution of ReplicaSet operations is not supported because the required MySQL lock service UDFs could not be installed on instance '10.41.28.127:5607'. Make sure the MySQL lock service plugin is available on all instances if you want t
                
                

-六神源码网