- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章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官方的一款轻量级的高性能中间件,它介于应用程序和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会尝试访问集群中的其他节点。并重新获取相关元数据信息.
。
。
为了获取更好的性能,通常情况下,MySQL Router会和应用程序部署在一起,这通常是基于下面的考虑:
1、可以通过socket套接字连接到MySQL Router,而不是tcp/ip方法 。
2、减少了网络上的延时 。
3、可以配置指定的账户来访问数据库,例如myapp@'host'而不是类似myapp@'%'这种全网段的账号,有利于提升安全性 。
4、通常,相比数据库服务器,应用服务器更容易扩展.
官方给的部署架构图如下:
下载安装过程:
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:
1
2
3
4
5
6
|
mysqlrouter
--bootstrap superdba@'10.13.3.129':5607
--directory /data1/yazhou5/mysql/mysql-router
--conf-use-sockets
--account routerfriend
--account-create always
|
这里,需要解释一下其中的几个参数:
1
2
3
4
5
|
--bootstrap 代表引导的实例,后面接一个连接信息的URL;
--directory 代表生成的配置目录
--conf-use-sockets 代表是否启用套接字连接(是否生成套接字文件)
--account 代表初始化后MySQL Router使用什么账号连接MySQL Server
--account-create 代表账号创建策略,always代表只有在account不存在的时候才进行bootstrap操作
|
这个命令敲下去之后,返回报错信息如下:
1
2
3
4
|
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之后,重新执行命令,结果如下:
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
|
[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目录中,查看生成的初始化文件,可以看到:
1
2
3
4
5
6
7
|
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看看内容:
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
|
# 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和对应的套接字文件.
当然,我们可以通过一些参数的配置改变默认的端口和套接字,例如:
1
2
3
4
|
--conf-use-sockets:(可选)为所有四种连接类型启用UNIX域套接字,。
--conf-skip-tcp: (可选)禁用TCP端口,如果只希望使用套接字,则可以通过--conf-use-sockets传递该选项。
--conf-base-port: (可选)更改端口范围,而不使用默认端口。 默认为6446。
--conf-bind-address:(可选)更改每个路由的bind_address值。
|
5、使用命令在本地启动MySQL Router,指定本地生成的配置文件,命令如下:
1
|
[root@ mysql-router]# /usr/
local
/mysql-router-8.0.20/bin/mysqlrouter -c /data1/yazhou5/mysql/mysql-router/mysqlrouter.conf &
|
启动之后,我们使用刚才创建的routerfriend账号以及6446这个读写端口来连接MySQL Router:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
[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中的库表进行读写操作.
。
。
MySQL Router搭建完毕后,可以通过查看元信息库mysql_innodb_cluster_metadata里面的表信息,包含cluster表、router表、以及instances表,对应的如下:
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
|
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节点.
1
2
3
4
5
6
7
8
9
|
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的资料请关注我其它相关文章! 。
原文链接:https://mp.weixin.qq.com/s/Ssg4woJsR5nKDiaXmb9CFg 。
最后此篇关于MySQL Router的安装部署的文章就讲到这里了,如果你想了解更多关于MySQL Router的安装部署的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个已发布的库,其中包含一个在其模板中使用 [routerLink] 的组件。在我的应用程序中安装库后,我收到错误 NullInjectorError:R3InjectorError(AppMod
/~/@ReMix-Run/Router/dist/router.cjs.js模块分析失败:/HOME/sharib/Desktop/Full Stack Developer Tutorial/MER
在 vuejs 2 中,我能够通过返回渲染 html 标签直接在路由器中渲染。我正在尝试使用 vue-router 4 在 vue3 中做同样的事情,但它似乎不起作用: { path:
在我的应用程序中,我使用 vue-router。当我使用 router.map({}) 将路由传递给路由器时,路由可以工作,但当我在构造函数中传递它们时,路由就不起作用。知道这是为什么吗? // wo
我正在 react 应用程序中实现路由。我对react-router 4.0相对于react-router-redux的优势感到困惑。我也对react-router-dom感到困惑。 react-ro
我有以下两条路线:/items和/items/buy。 每个路线在一个 View 中对应一个选项卡。两条路线均使用精确的 Prop 进行渲染,但导航至/items/buy时,仍将两个选项卡标记为事件选
我有一个带有 url/product/0 的新产品页面。当使用按钮保存产品时,我想显示“已成功保存”消息并将 url 更改为/product/1024 而无需实际导航到该页面,因为这会导致对页面上的产
我对此有些困惑。我定义了一条名为classes/:id的路线。在应用程序中导航到该路线时,将调用componentDidMount()。但是,当重新加载页面或复制并粘贴URL时,页面将完全加载,但根本
假设我有以下2条路线: ... ... 现在,当我尝试按路线/news时,会触发带有Home参数的param1的根路线... 我认为解决方案是在像/?param1这
我正在将 Vue Router 与 Vue 3 一起使用,并尝试添加一个包罗万象的路由以在用户尝试访问无效 URL 时重定向用户。当我尝试使用通配符 (*) 时,我将以下错误记录到控制台: Uncau
我在我的项目中使用react-router-dom 4.0.0-beta.6。我有如下代码: 我想在 HomePage 组件中获取查询参数。我找到了 location.search 参数,它看起来像
我正在使用 Vue 路由器。在我的代码中,我曾经有: 这有效,并且页面数据被传递到组件。但是如何使用路由器 View 执行相同的操作呢?这似乎不起作用: js: var vm = new Vue(
我目前正在一个项目中使用react-router-redux,除了我不知道如何访问react-router路由器之外,一切都工作正常。 @connect((state, props) => {
当使用链接时,路由器按预期工作,尽管我收到警告 [history] pushState is deprecated;使用推送代替。 使用react-router-redux中的routeActio
我想创建一个多页 Meteor 网络和移动应用程序。因此,我正在寻找路由服务。 来自 research ,我收集了Iron Router就是我要找的。但是很多教程也提到了Meteor.Router I
我正在使用 React Router(版本 4.0.0)和 Router组件有一个名为“history”的必需 Prop 。 我知道在以前版本的react-router中你可以导入browserHis
我正在使用 氟罗包用于导航。 Fluro 和 Flutter 正在使用“路由器”。所以他们的类(class)合并了。我怎么能解决这个问题? lib/routers/routers.dart:2:1:
自从我更新了 Vue.js 应用程序的节点包后,我在浏览器控制台中收到以下警告: [vue-router] 's tag prop is deprecated and has beenremoved
我正在尝试在我的应用程序中将 react-router 更新到 v2.6 并将 react-router-relay 更新到 v0.7,但我正在努力按照变更日志来解决所有重大变更。我想我解决了所有的变
router-view 和 router-link 组件无法在我的应用中解析不知道是什么问题 附上应用代码它是一个主页应用程序,带有类似 navbar 的东西,用于路由到 vue 组件,如 state
我是一名优秀的程序员,十分优秀!