MySQL Router的安装部署


Posted in MySQL onApril 24, 2021

MySQL Router介绍

    前面的文章中,我们说了ReplicaSet的基本概念MySQL Shell工具以及如何使用MySQL Shell搭建Innodb Replicaset。今天我们来看InnoDB ReplicaSet部署过程中的另一个重要组件MySQL Router。

MySQL Router是什么?

    为了更好的理解Innodb Replicaset,我们把之前的那张图搬迁过来,如下: 

MySQL Router的安装部署

通过上面的图,不难看出,MySQL Router是应用程序连接的入口,它的存在,让底层的架构对应用程序透明,应用程序只需要连接MySQL Router就可以和底层的数据库打交道,而数据库的主从架构,都是记录在MySQL Router的原信息里面的。

版本

    MySQL Router是MySQL官方的一款轻量级的高性能中间件,它介于应用程序和MySQL Server之间,应用程序通过连接MySQL Router和底层的MySQL Server之间通信,它对应用程序是透明的。官方文档建议搭配MySQL8.0或者MySQL5.7的Server使用。目前最新的版本是MySQL Router 8,如果您使用过MySQL Router的2.0或者2.1版本,强烈建议升级到MySQL Router 8。

MySQL Router特点?

1、对应用透明。MySQL Router要做到对应用透明,它必须连接底层的MySQL,并知道当前哪个节点是Primary,这样,才能够在发生故障的时候进行故障转移。

2、使用场景。基于这个特性,它可以用在Innodb Cluster、Innodb Replicaset或者MGR的环境中。

3、MySQL Router会保留在线的MySQL实例的缓存列表,或者已经配置好的Innodb Cluster集群的拓扑关系,除此启动的时候,这些信息将从MySQL Router的配置表中获取。

4、为保证缓存中的元信息能够得到即时更新,MySQL Router需要保证至少能够和集群中的一个正常节点保持通信,它会从当前实例的Performance_schema表中获取数据库的原信息和实时状态。

5、当集群中和MySQL Router通信的节点关闭时,MySQL Router会尝试访问集群中的其他节点。并重新获取相关元数据信息。

02 MySQL Router的安装部署

      为了获取更好的性能,通常情况下,MySQL  Router会和应用程序部署在一起,这通常是基于下面的考虑:

1、可以通过socket套接字连接到MySQL Router,而不是tcp/ip方法

2、减少了网络上的延时

3、可以配置指定的账户来访问数据库,例如myapp@'host'而不是类似myapp@'%'这种全网段的账号,有利于提升安全性

4、通常,相比数据库服务器,应用服务器更容易扩展。

官方给的部署架构图如下:

MySQL Router的安装部署

下载安装过程:

1、直接登录官网下载MySQL Router的对应版本。

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

2、下载完成之后,解压,以8.0.20为例,由于是tar.xz格式的文件,解压命令如下:

xz -d xxx.tar.xz  (解压成tar格式)

tar xvf xxx.tar     (即可)

接下来就是初始化过程了,初始化的时候,需要我们的MySQL Server部署完毕,在之前的文章中,我们已经部署好了一个Innodb Replicaset架构,它有一主一从,IP地址分别是:

192.168.1.10  5607 Primary

192.168.1.20  5607 Secondary

初始化过程:

1、利用初始化命令初始化MySQL Router:

mysqlrouter
   --bootstrap superdba@'10.13.3.129':5607 
   --directory /data1/yazhou5/mysql/mysql-router
   --conf-use-sockets 
   --account routerfriend 
   --account-create always

这里,需要解释一下其中的几个参数:

--bootstrap          代表引导的实例,后面接一个连接信息的URL;
--directory          代表生成的配置目录
--conf-use-sockets   代表是否启用套接字连接(是否生成套接字文件)
--account            代表初始化后MySQL Router使用什么账号连接MySQL Server
--account-create     代表账号创建策略,always代表只有在account不存在的时候才进行bootstrap操作

这个命令敲下去之后,返回报错信息如下:

Error: You are bootstraping as a superuser.
This will make all the result files (config etc.) privately owned by the superuser.
Please use --user=username option to specify the user that will be running the router.
Use --user=root if this really should be the superuser.

系统检测到我们使用root账号来进行的MySQL Router初始化,提示我们如果使用root操作,需要在最后面补充--user=root

2、补充--user=root之后,重新执行命令,结果如下:

[root mysql-router]# /usr/local/mysql-router-8.0.20/bin/mysqlrouter --bootstrap superdba@10.185.13.195:5607  --directory /data1/yazhou5/mysql/mysql-router --conf-use-sockets  --account routerfriend  --account-create always --user=root --force
Please enter MySQL password for superdba:   # 这里输入我们已知的superdba账号密码
# Bootstrapping MySQL Router instance at '/data1/yazhou5/mysql/mysql-router'...

Please enter MySQL password for routerfriend: # 这里创建新的account账号的密码
- Creating account(s) 
- 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 /data1/yazhou5/mysql/mysql-router/mysqlrouter.conf

# MySQL Router configured for the InnoDB ReplicaSet 'yeyz_test'

After this MySQL Router has been started with the generated configuration

    $ /usr/local/mysql-router-8.0.20/bin/mysqlrouter -c /data1/yazhou5/mysql/mysql-router/mysqlrouter.conf

the cluster 'yeyz_test' can be reached by connecting to:

## MySQL Classic protocol

- Read/Write Connections: localhost:6446, /data1/yazhou5/mysql/mysql-router/mysql.sock
- Read/Only Connections:  localhost:6447, /data1/yazhou5/mysql/mysql-router/mysqlro.sock

## MySQL X protocol

- Read/Write Connections: localhost:64460, /data1/yazhou5/mysql/mysql-router/mysqlx.sock
- Read/Only Connections:  localhost:64470, /data1/yazhou5/mysql/mysql-router/mysqlxro.sock

可以看到,提示我们输入两次密码之后,bootstrap的操作就算成功了。

3、此时我们进入参数中指定的--directory目录中,查看生成的初始化文件,可以看到:

drwx------ 2 root root 4096 Apr 12 23:15 data
drwx------ 2 root root 4096 Apr 12 23:15 log
-rw------- 1 root root 1532 Apr 12 23:15 mysqlrouter.conf
-rw------- 1 root root  104 Apr 12 23:15 mysqlrouter.key
drwx------ 2 root root 4096 Apr 12 23:15 run
-rwx------ 1 root root  353 Apr 12 23:15 start.sh
-rwx------ 1 root root  209 Apr 12 23:15 stop.sh

生成了一些配置文件和启停脚本,我们打开这个配置文件mysqlrouter.conf看看内容:

# File automatically generated during MySQL Router bootstrap
[DEFAULT]
user=root
logging_folder=/data1/yazhou5/mysql/mysql-router/log
runtime_folder=/data1/yazhou5/mysql/mysql-router/run
data_folder=/data1/yazhou5/mysql/mysql-router/data
keyring_path=/data1/yazhou5/mysql/mysql-router/data/keyring
master_key_path=/data1/yazhou5/mysql/mysql-router/mysqlrouter.key
connect_timeout=15
read_timeout=30
dynamic_state=/data1/yazhou5/mysql/mysql-router/data/state.json

[logger]
level = INFO

[metadata_cache:yeyz_test]
cluster_type=rs
router_id=1
user=routerfriend
metadata_cluster=yeyz_test
ttl=0.5
auth_cache_ttl=-1
auth_cache_refresh_interval=2

[routing:yeyz_test_rw]
bind_address=0.0.0.0
bind_port=6446
socket=/data1/yazhou5/mysql/mysql-router/mysql.sock
destinations=metadata-cache://yeyz_test/?role=PRIMARY
routing_strategy=first-available
protocol=classic

[routing:yeyz_test_ro]
bind_address=0.0.0.0
bind_port=6447
socket=/data1/yazhou5/mysql/mysql-router/mysqlro.sock
destinations=metadata-cache://yeyz_test/?role=SECONDARY
routing_strategy=round-robin-with-fallback
protocol=classic

[routing:yeyz_test_x_rw]
bind_address=0.0.0.0
bind_port=64460
socket=/data1/yazhou5/mysql/mysql-router/mysqlx.sock
destinations=metadata-cache://yeyz_test/?role=PRIMARY
routing_strategy=first-available
protocol=x

[routing:yeyz_test_x_ro]
bind_address=0.0.0.0
bind_port=64470
socket=/data1/yazhou5/mysql/mysql-router/mysqlxro.sock
destinations=metadata-cache://yeyz_test/?role=SECONDARY
routing_strategy=round-robin-with-fallback
protocol=x

4、分析生成的配置文件,不难发现,MySQL Router配置了4个端口,分别是6446、6447、64460、64470和对应的套接字文件。

当然,我们可以通过一些参数的配置改变默认的端口和套接字,例如:

--conf-use-sockets:(可选)为所有四种连接类型启用UNIX域套接字,。
--conf-skip-tcp:   (可选)禁用TCP端口,如果只希望使用套接字,则可以通过--conf-use-sockets传递该选项。
--conf-base-port:  (可选)更改端口范围,而不使用默认端口。 默认为6446。
--conf-bind-address:(可选)更改每个路由的bind_address值。 

5、使用命令在本地启动MySQL Router,指定本地生成的配置文件,命令如下:

[root@ mysql-router]# /usr/local/mysql-router-8.0.20/bin/mysqlrouter -c /data1/yazhou5/mysql/mysql-router/mysqlrouter.conf &

启动之后,我们使用刚才创建的routerfriend账号以及6446这个读写端口来连接MySQL Router:

[root@ mysql-router]# mysql -u routerfriend -h 127.0.0.1 -P 6446  -p 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 95696
Server version: 8.0.19 MySQL Community Server - GPL

Copyright (c) 2000, 2013, 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 '\h' for help. Type '\c' to clear the current input statement.

routerfriend@127.0.0.1 [(none)] 23:42:00>
routerfriend@127.0.0.1 [(none)] 23:42:01>select @@port;
+--------+
| @@port |
+--------+
|   5607 |
+--------+
1 row in set (0.00 sec)

我们通过6446端口连接MySQL Router之后,然后在MySQL Router中执行select @@port命令查看当前的端口号信息,可以看到,返回值是5607,说明MySQL Router已经帮我们路由到了底层的MySQL Server上面。

   这个routerfriend账号的权限可能不够,我们也可以换成superdba的高权限账号去连接mysqlrouter,这样就可以对MySQL Server中的库表进行读写操作。

03 查看MySQL Router的元信息

    MySQL Router搭建完毕后,可以通过查看元信息库mysql_innodb_cluster_metadata里面的表信息,包含cluster表、router表、以及instances表,对应的如下:

superdba@127.0.0.1 [mysql_innodb_cluster_metadata] 23:51:20>select * from instances;
+-------------+--------------------------------------+--------------------+--------------------------------------+--------------------+----------------------------------------+------------+-------------+
| instance_id | cluster_id                           | address            | mysql_server_uuid                    | instance_name      | addresses                              | attributes | description |
+-------------+--------------------------------------+--------------------+--------------------------------------+--------------------+----------------------------------------+------------+-------------+
|           1 | 94d5f935-990e-11eb-8832-fa163ebd2444 | 192.168.1.10:5607 | 0609f966-690f-11eb-bd89-fa163ebd2444 | 192.168.1.10:5607 | {"mysqlClassic": "192.168.1.10:5607"} | {}         | NULL        |
|           2 | 94d5f935-990e-11eb-8832-fa163ebd2444 | 192.168.1.20:5607  | c6ba0bf0-6d4d-11eb-aa4b-b00875209c1c | 192.168.1.20:5607  | {"mysqlClassic": "192.168.1.20:5607"}  | {}         | NULL        |
+-------------+--------------------------------------+--------------------+--------------------------------------+--------------------+----------------------------------------+------------+-------------+
2 rows in set (0.00 sec)

superdba@127.0.0.1 [mysql_innodb_cluster_metadata] 23:51:30>
superdba@127.0.0.1 [mysql_innodb_cluster_metadata] 23:51:30>select * from clusters;
+--------------------------------------+--------------+--------------------+---------+------------------------------------------------+--------------+--------------+----------------+
| cluster_id                           | cluster_name | description        | options | attributes                                     | cluster_type | primary_mode | router_options |
+--------------------------------------+--------------+--------------------+---------+------------------------------------------------+--------------+--------------+----------------+
| 94d5f935-990e-11eb-8832-fa163ebd2444 | yeyz_test    | Default ReplicaSet | NULL    | {"adopted": 0, "opt_gtidSetIsComplete": false} | ar           | pm           | NULL           |
+--------------------------------------+--------------+--------------------+---------+------------------------------------------------+--------------+--------------+----------------+
1 row in set (0.00 sec)

superdba@127.0.0.1 [mysql_innodb_cluster_metadata] 23:51:57>
superdba@127.0.0.1 [mysql_innodb_cluster_metadata] 23:51:58>select * from routers;
+-----------+-------------+--------------+-------------+---------+---------------------+------------------------------------------------------------------------------------------------------------------------------+--------------------------------------+---------+
| router_id | router_name | product_name | address     | version | last_check_in       | attributes                                                                                                                   | cluster_id                           | options |
+-----------+-------------+--------------+-------------+---------+---------------------+------------------------------------------------------------------------------------------------------------------------------+--------------------------------------+---------+
|         1 |             | MySQL Router | 10.13.3.129 | 8.0.20  | 2021-04-12 23:52:29 | {"ROEndpoint": "6447", "RWEndpoint": "6446", "ROXEndpoint": "64470", "RWXEndpoint": "64460", "MetadataUser": "routerfriend"} | 94d5f935-990e-11eb-8832-fa163ebd2444 | NULL    |
+-----------+-------------+--------------+-------------+---------+---------------------+------------------------------------------------------------------------------------------------------------------------------+--------------------------------------+---------+
1 row in set (0.00 sec)

还可以从表中查看当前的primary节点信息,primary_master字段为1的,即为primary节点。

superdba@127.0.0.1 [mysql_innodb_cluster_metadata] 23:52:29>select * from async_cluster_members;
+--------------------------------------+---------+-------------+--------------------+----------------+------------------------------------------------------------------------------------------------------------------+
| cluster_id                           | view_id | instance_id | master_instance_id | primary_master | attributes                                                                                                       |
+--------------------------------------+---------+-------------+--------------------+----------------+------------------------------------------------------------------------------------------------------------------+
| 94d5f935-990e-11eb-8832-fa163ebd2444 |       2 |           1 |               NULL |              1 | {"instance.address": "192.168.1.10:5607", "instance.mysql_server_uuid": "0609f966-690f-11eb-bd89-fa163ebd2444"} |
| 94d5f935-990e-11eb-8832-fa163ebd2444 |       3 |           1 |               NULL |              1 | {"instance.address": "192.168.1.10:5607", "instance.mysql_server_uuid": "0609f966-690f-11eb-bd89-fa163ebd2444"} |
| 94d5f935-990e-11eb-8832-fa163ebd2444 |       3 |           2 |                  1 |              0 | {"instance.address": "192.168.1.20:5607", "instance.mysql_server_uuid": "c6ba0bf0-6d4d-11eb-aa4b-b00875209c1c"}  |
+--------------------------------------+---------+-------------+--------------------+----------------+------------------------------------------------------------------------------------------------------------------+
3 rows in set (0.01 sec)

以上就是MySQL Router的安装部署的详细内容,更多关于MySQL Router的资料请关注三水点靠木其它相关文章!

MySQL 相关文章推荐
mysql多表查询-笔记七
Apr 05 MySQL
详解MySQL事务的隔离级别与MVCC
Apr 22 MySQL
mysql 如何获取两个集合的交集/差集/并集
Jun 08 MySQL
mysql定时自动备份数据库的方法步骤
Jul 07 MySQL
SQL实现LeetCode(180.连续的数字)
Aug 04 MySQL
MySQL 开窗函数
Feb 15 MySQL
教你如何让spark sql写mysql的时候支持update操作
Feb 15 MySQL
MySQL慢查询优化解决问题
Mar 17 MySQL
排查MySQL生产环境索引没有效果
Apr 11 MySQL
mysql数据库实现设置字段长度
Jun 10 MySQL
MySQL一劳永逸永久支持输入中文的方法实例
Aug 05 MySQL
MySQL 原理与优化之原数据锁的应用
Aug 14 MySQL
MySQL Shell的介绍以及安装
MySQL InnoDB ReplicaSet(副本集)简单介绍
Apr 24 #MySQL
MySQL 角色(role)功能介绍
Apr 24 #MySQL
浅谈Mysql多表连接查询的执行细节
Mysql基础之常见函数
Apr 22 #MySQL
MySQL分库分表与分区的入门指南
MySQL8.0.24版本Release Note的一些改进点
Apr 22 #MySQL
You might like
PHP和MySql中32位和64位的整形范围是多少
2016/02/18 PHP
Nigma vs Liquid BO3 第一场2.14
2021/03/10 DOTA
Mootools 1.2教程 函数
2009/09/15 Javascript
javascript 用记忆函数快速计算递归函数
2010/03/15 Javascript
JavaScript的单例模式 (singleton in Javascript)
2010/06/11 Javascript
分享27款非常棒的jQuery 表单插件
2011/03/28 Javascript
自己封装的javascript事件队列函数版
2014/06/12 Javascript
jQuery检测返回值的数据类型
2015/07/13 Javascript
基于JavaScript代码实现随机漂浮图片广告
2016/01/05 Javascript
JS实现兼容各种浏览器的获取选择文本的方法【测试可用】
2016/06/21 Javascript
AngularJS+Bootstrap实现多文件上传与管理
2016/11/08 Javascript
关于Vue.nextTick()的正确使用方法浅析
2017/08/25 Javascript
详解使用webpack构建多页面应用
2017/12/21 Javascript
Layui 动态禁止select下拉的例子
2019/09/03 Javascript
解决vue更新路由router-view复用组件内容不刷新的问题
2019/11/04 Javascript
vue props default Array或是Object的正确写法说明
2020/07/30 Javascript
详解ES6 扩展运算符的使用与注意事项
2020/11/12 Javascript
Python ljust rjust center输出
2008/09/06 Python
Windows系统配置python脚本开机启动的3种方法分享
2015/03/10 Python
Python中的面向对象编程详解(上)
2015/04/13 Python
Python缩进和冒号详解
2016/06/01 Python
Python常用的内置序列结构(列表、元组、字典)学习笔记
2016/07/08 Python
python 3调用百度OCR API实现剪贴板文字识别
2018/09/04 Python
python numpy数组的索引和切片的操作方法
2018/10/20 Python
opencv3/python 鼠标响应操作详解
2019/12/11 Python
使用已经得到的keras模型识别自己手写的数字方式
2020/06/29 Python
html5简介_动力节点Java学院整理
2017/07/07 HTML / CSS
深入理解HTML5定时器requestAnimationFrame的使用
2018/12/12 HTML / CSS
人力资源经理的岗位职责
2014/03/02 职场文书
教研活动总结
2014/04/28 职场文书
超市促销活动总结
2014/07/01 职场文书
如何写贫困证明申请书
2014/10/29 职场文书
公司2014年度工作总结
2014/12/10 职场文书
校长师德表现自我评价
2015/03/04 职场文书
修改并编译golang源码的操作步骤
2021/07/25 Golang
MySQL中的隐藏列的具体查看
2021/09/04 MySQL