MySQL Shell的介绍以及安装

吾爱主题 阅读:157 2024-04-02 08:01:46 评论:0

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服务:

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

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

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 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 < schema 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命令来配置副本集,并创建副本集的管理员。

?
1 2 3 4 5 6 7 8 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权限之后,重新执行上面的命令,结果如下:

?
1 2 3 4 5 6 7 8 9 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账号,可以发现,账号已经生成了,信息如下:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 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  | + -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ rows  in  set  (0.00 sec)

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

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

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

?
1 2 3 4 5 6 7 8 9 10 11 12 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()查看当前的副本集成员

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 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或者增量同步的方法来实现数据同步。

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

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 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  to  be able  to  execute  some  operations  at  the same  time . The operation will  continue  without concurrent execution support.   Adding instance  to  the replicaset...   * Performing validation checks   This instance reports its own address  as  192.168.1.20:5607 192.168.1.20:5607: Instance configuration  is  suitable.   * Checking async replication topology...   * Checking  transaction  state  of  the instance... The safest  and  most convenient way  to  provision a new instance  is  through automatic clone provisioning, which will completely overwrite the state  of  '192.168.1.20:5607'  with  a physical snapshot  from  an existing replicaset member.  To  use this method  by  default set  the  'recoveryMethod'  option  to  'clone' .   WARNING: It should be safe  to  rely  on  replication  to  incrementally recover the state  of  the new instance if you are sure  all  updates ever executed  in  the replicaset were done  with  GTIDs enabled, there are  no  purged transactions  and  the new instance  contains  the same GTID  set  as  the replicaset  or  a subset  of  it.  To  use this method  by  default set  the  'recoveryMethod'  option  to  'incremental' .   Incremental state recovery was selected because it seems  to  be safely usable.   * Updating topology ** Configuring 192.168.1.20:5607  to  replicate  from  192.168.1.10:5607 ** Waiting  for  new instance  to  synchronize  with  PRIMARY ...   The instance  '192.168.1.20:5607'  was added  to  the replicaset  and  is  replicating  from  192.168.1.20:5607.   MySQL  192.168.1.10:5607 ssl  JS > 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"              },              "192.168.1.20:5607" : {                  "address" "192.168.1.20:5607" ,                  "instanceRole" "SECONDARY" ,                  "mode" "R/O" ,                  "replication" : {                      "applierStatus" "APPLIED_ALL" ,                      "applierThreadState" "Slave has read all relay log; waiting for more updates" ,                      "receiverStatus" "ON" ,                      "receiverThreadState" "Waiting for master to send event" ,                      "replicationLag" null                  },                  "status" "ONLINE"              }          },          "type" "ASYNC"      } }

加入第二个节点之后,可以看到,再次使用rs.status来查看副本集的结构,可以看到Secondary节点已经出现了,就是我们新加入的192.168.1.20:5607

当然我们可以分别使用下面的命令查看更详细的输出:

rs.status({extended:0})

rs.status({extended:1})

rs.status({extended:2})

不同的级别,显示的信息有所不同,等级越高,信息约详细。

这里不得不说一个小的bug,官方文档建议写法是:

ReplicaSet.status(extended=1)

原文如下:

The output of ReplicaSet.status(extended=1) is very similar to Cluster.status(extended=1), but the main difference is that the replication field is always available because InnoDB ReplicaSet relies on MySQL Replication all of the time, unlike InnoDB Cluster which uses it during incremental recovery. For more information on the fields, see Checking a cluster's Status with Cluster.status().

但是实际操作过程中,这种写法会报错,如下:

?
1 2 3 MySQL  192.168.1.10:5607 ssl  JS > sh.status(extended=1) You are connected  to  a member  of  replicaset  'yeyz_test' . ReplicaSet.status: Argument #1  is  expected  to  be a map (ArgumentError)

不知道算不算一个bug。

5.搭建好副本集之后,查看primary节点的元信息库表,并在primary写入数据,查看数据是否可以同步。

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 [(none)] 17:41:10>show databases; + -------------------------------+ Database                       | + -------------------------------+ | information_schema            | | mysql                         | | mysql_innodb_cluster_metadata | | performance_schema            | | sys                           | | zjmdmm                        | + -------------------------------+ rows  in  set  (0.01 sec)   [(none)] 17:41:29>use mysql_innodb_cluster_metadata Database  changed [mysql_innodb_cluster_metadata] 17:45:12>show tables; + -----------------------------------------+ | Tables_in_mysql_innodb_cluster_metadata | + -----------------------------------------+ | async_cluster_members                   | | async_cluster_views                     | | clusters                                | | instances                               | | router_rest_accounts                    | | routers                                 | | schema_version                          | | v2_ar_clusters                          | | v2_ar_members                           | | v2_clusters                             | | v2_gr_clusters                          | | v2_instances                            | | v2_router_rest_accounts                 | | v2_routers                              | | v2_this_instance                        | + -----------------------------------------+ 15  rows  in  set  (0.00 sec)   [mysql_innodb_cluster_metadata] 17:45:45> select  from  routers; Empty  set  (0.00 sec)   [(none)] 17:45:52> create  database  yeyazhou; Query OK, 1 row affected (0.00 sec)

可以看到,Primary节点上有一个元信息数据库mysql_innodb_cluster_metadata,里面保存了一些原信息,我们查看了router表,发现里面没有数据,原因是我们没有配置MySQL Router。后面的文章中会写到MySQL Router的配置过程。

    在Primary上创建一个数据库yeyazhou,可以发现,在从库上也已经出现了对应的DB,

?
1 2 3 4 5 6 7 8 9 10 11 12 13 192.168.1.20 [(none)] 17:41:41>show databases; + -------------------------------+ Database                       | + -------------------------------+ | information_schema            | | mysql                         | | mysql_innodb_cluster_metadata | | performance_schema            | | sys                           | | yeyazhou                      | | zjmdmm                        | + -------------------------------+ rows  in  set  (0.00 sec)

说明副本集的复制关系无误。

至此,整个MySQL Shell连接MySQL实例并创建ReplicatSet的过程搭建完毕。

下一篇文章讲述MySQL Router的搭建过程,以及如何使用MySQL Router来访问底层的数据库。

以上就是MySQL Shell的介绍以及安装的详细内容,更多关于MySQL Shell的资料请关注服务器之家其它相关文章!

原文链接:https://mp.weixin.qq.com/s/jZIH9kIFzLceqGQ9nd4FGQ

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容