MySQL Router的安装部署

 

01 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会尝试访问集群中的其他节点。并重新获取相关元数据信息。

 

02 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:

mysqlrouter
--bootstrapsuperdba@'10.13.3.129':5607
--directory/data1/yazhou5/mysql/mysql-router
--conf-use-sockets
--accountrouterfriend
--account-createalways

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

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

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

Error:Youarebootstrapingasasuperuser.
Thiswillmakealltheresultfiles(configetc.)privatelyownedbythesuperuser.
Pleaseuse--user=usernameoptiontospecifytheuserthatwillberunningtherouter.
Use--user=rootifthisreallyshouldbethesuperuser.

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

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

[rootmysql-router]#/usr/local/mysql-router-8.0.20/bin/mysqlrouter--bootstrapsuperdba@10.185.13.195:5607--directory/data1/yazhou5/mysql/mysql-router--conf-use-sockets--accountrouterfriend--account-createalways--user=root--force
PleaseenterMySQLpasswordforsuperdba:#这里输入我们已知的superdba账号密码
#BootstrappingMySQLRouterinstanceat'/data1/yazhou5/mysql/mysql-router'...

PleaseenterMySQLpasswordforrouterfriend:#这里创建新的account账号的密码
-Creatingaccount(s)
-Verifyingaccount(usingittorunSQLqueriesthatwouldberunbyRouter)
-Storingaccountinkeyring
-Adjustingpermissionsofgeneratedfiles
-Creatingconfiguration/data1/yazhou5/mysql/mysql-router/mysqlrouter.conf

#MySQLRouterconfiguredfortheInnoDBReplicaSet'yeyz_test'

AfterthisMySQLRouterhasbeenstartedwiththegeneratedconfiguration

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

thecluster'yeyz_test'canbereachedbyconnectingto:

##MySQLClassicprotocol

-Read/WriteConnections:localhost:6446,/data1/yazhou5/mysql/mysql-router/mysql.sock
-Read/OnlyConnections:localhost:6447,/data1/yazhou5/mysql/mysql-router/mysqlro.sock

##MySQLXprotocol

-Read/WriteConnections:localhost:64460,/data1/yazhou5/mysql/mysql-router/mysqlx.sock
-Read/OnlyConnections:localhost:64470,/data1/yazhou5/mysql/mysql-router/mysqlxro.sock

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

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

drwx------2rootroot4096Apr1223:15data
drwx------2rootroot4096Apr1223:15log
-rw-------1rootroot1532Apr1223:15mysqlrouter.conf
-rw-------1rootroot104Apr1223:15mysqlrouter.key
drwx------2rootroot4096Apr1223:15run
-rwx------1rootroot353Apr1223:15start.sh
-rwx------1rootroot209Apr1223:15stop.sh

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

#FileautomaticallygeneratedduringMySQLRouterbootstrap
[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-urouterfriend-h127.0.0.1-P6446-p
Enterpassword:
WelcometotheMySQLmonitor.Commandsendwith;or\g.
YourMySQLconnectionidis95696
Serverversion:8.0.19MySQLCommunityServer-GPL

Copyright(c)2000,2013,Oracleand/oritsaffiliates.Allrightsreserved.

OracleisaregisteredtrademarkofOracleCorporationand/orits
affiliates.Othernamesmaybetrademarksoftheirrespective
owners.

Type'help;'or'\h'forhelp.Type'\c'toclearthecurrentinputstatement.

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

我们通过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*frominstances;
+-------------+--------------------------------------+--------------------+--------------------------------------+--------------------+----------------------------------------+------------+-------------+
|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|
+-------------+--------------------------------------+--------------------+--------------------------------------+--------------------+----------------------------------------+------------+-------------+
2rowsinset(0.00sec)

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*fromclusters;
+--------------------------------------+--------------+--------------------+---------+------------------------------------------------+--------------+--------------+----------------+
|cluster_id|cluster_name|description|options|attributes|cluster_type|primary_mode|router_options|
+--------------------------------------+--------------+--------------------+---------+------------------------------------------------+--------------+--------------+----------------+
|94d5f935-990e-11eb-8832-fa163ebd2444|yeyz_test|DefaultReplicaSet|NULL|{"adopted":0,"opt_gtidSetIsComplete":false}|ar|pm|NULL|
+--------------------------------------+--------------+--------------------+---------+------------------------------------------------+--------------+--------------+----------------+
1rowinset(0.00sec)

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*fromrouters;
+-----------+-------------+--------------+-------------+---------+---------------------+------------------------------------------------------------------------------------------------------------------------------+--------------------------------------+---------+
|router_id|router_name|product_name|address|version|last_check_in|attributes|cluster_id|options|
+-----------+-------------+--------------+-------------+---------+---------------------+------------------------------------------------------------------------------------------------------------------------------+--------------------------------------+---------+
|1||MySQLRouter|10.13.3.129|8.0.20|2021-04-1223:52:29|{"ROEndpoint":"6447","RWEndpoint":"6446","ROXEndpoint":"64470","RWXEndpoint":"64460","MetadataUser":"routerfriend"}|94d5f935-990e-11eb-8832-fa163ebd2444|NULL|
+-----------+-------------+--------------+-------------+---------+---------------------+------------------------------------------------------------------------------------------------------------------------------+--------------------------------------+---------+
1rowinset(0.00sec)

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

superdba@127.0.0.1[mysql_innodb_cluster_metadata]23:52:29>select*fromasync_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"}|
+--------------------------------------+---------+-------------+--------------------+----------------+------------------------------------------------------------------------------------------------------------------+
3rowsinset(0.01sec)

以上就是MySQL Router的安装部署的详细内容,更多关于MySQL Router的资料请关注编程宝库其它相关文章!

MySQL安装后默认自带数据库的作用详解:  大家在学习MySQL时,安装后都会发现里边已经自带了几个默认的数据库,我装的MySQL5.5里边自带六个数据库    网上查了一些资料对这几个数据库的功能做一下学习。   1.info ...