1,461 total views, 4 views today
1、MySQL Router介绍
MySQL Router 是InnoDB Cluster(MySQL shell + Router + master-slave replication)的一部分,轻量级中间件,在应用和后端数据库之间起到透明的路由分发的作用。
MySQL Router 8.0推荐搭配MySQL Server 8.0 和 5.7 使用。
部署建议:建议router与应用部署在一起,这样的好处
应用通过socket连接router
减少网络延迟
MySQL无需创建额外的账号给router
与应用同时扩展
2、部署Router 8.0 + master-slave replication
环境说明:
角色
IP
hostname
version
MySQL Router
10.0.2.233
pd-03
8.0.20
MySQL master
10.0.2.230
pd-01
5.7.24
MySQL slave
10.0.2.231
tikv-02
5.7.24
MySQL slave
10.0.2.232
tikv-03
5.7.24
2.1 下载二级制 Router 包
2.2 解压安装
解包
xz -d mysql-router-8.0.20-linux-glibc2.12-x86_64.tar.xz
tar xvf mysql-router-8.0.20-linux-glibc2.12-x86_64.tar -C /usr/local/
1
2
xz-dmysql-router-8.0.20-linux-glibc2.12-x86_64.tar.xz
tarxvfmysql-router-8.0.20-linux-glibc2.12-x86_64.tar-C/usr/local/
查看目录结构
# cd /usr/local/mysql-router-8.0.20-linux-glibc2.12-x86_64/
# ls -tr
README.router LICENSE.router man bin share lib
1
2
3
4
# cd /usr/local/mysql-router-8.0.20-linux-glibc2.12-x86_64/
# ls -tr
README.routerLICENSE.routermanbinsharelib
将命令目录加入到环境变量中
echo "PATH=$PATH:/usr/local/mysql-router-8.0.20/bin" >/etc/profile.d/mysqlrouter.sh
chmod +x /etc/profile.d/mysqlrouter.sh
source /etc/profile.d/mysqlrouter.sh
1
2
3
echo"PATH=$PATH:/usr/local/mysql-router-8.0.20/bin">/etc/profile.d/mysqlrouter.sh
chmod+x/etc/profile.d/mysqlrouter.sh
source/etc/profile.d/mysqlrouter.sh
2.3 配置
2.3.1 创建相关目录
mkdir -p /usr/local/mysql-router-8.0.20/{log,run,data,conf}
1
mkdir-p /usr/local/mysql-router-8.0.20/{log,run,data,conf}
2.3.2 修改配置文件
# cat /usr/local/mysql-router-8.0.20/conf/myrouter.conf
[DEFAULT]
logging_folder =/usr/local/mysql-router-8.0.20/log
data_folder=/usr/local/mysql-router-8.0.20/data
runtime_folder=/usr/local/mysql-router-8.0.20/run
connect_timeout=3
read_timeout=30
[logger]
level=INFO
[routing:primary]
bind_address=0.0.0.0
bind_port=7001
mode=read-write
destinations=10.0.2.230:3307
routing_strategy=first-available
[routing:secondary]
bind_address=0.0.0.0
bind_port=7002
mode=read-only
destinations=10.0.2.231:3307,10.0.2.232:3306
routing_strategy=round-robin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# cat /usr/local/mysql-router-8.0.20/conf/myrouter.conf
[DEFAULT]
logging_folder=/usr/local/mysql-router-8.0.20/log
data_folder=/usr/local/mysql-router-8.0.20/data
runtime_folder=/usr/local/mysql-router-8.0.20/run
connect_timeout=3
read_timeout=30
[logger]
level=INFO
[routing:primary]
bind_address=0.0.0.0
bind_port=7001
mode=read-write
destinations=10.0.2.230:3307
routing_strategy=first-available
[routing:secondary]
bind_address=0.0.0.0
bind_port=7002
mode=read-only
destinations=10.0.2.231:3307,10.0.2.232:3306
routing_strategy=round-robin
参数说明:
参数
说明
logging_folder
日志文件路径
connect_timeout
router连接MySQL server的超时时间,默认1秒,范围1-65536。read-write模式,超时时间设置的稍大写,防止误认为主库不可用,而去连接备用主库。 read-only模式,尽量设置的小些。
read_timeout
用于控制router从MySQL实例读取数据的最大时间,默认是50秒。
level
日志记录级别。DEBUG,NOTE,INFO,WARNING,ERROR,SYSTEM,FATAL。INFO,记录普通消息、警告和错误。DEBUG则用于排查错误,展现额外的诊断信息。
bind_address
router服务所在的主机IP,默认写作0.0.0.0,表示只有本机可以访问。
bind_port
router的服务端口,router分为两个端口,只读和读写。应用通过这两个端口连接router。
mode
router的模式,两种: read-write、read-only。
destinations
router连接的目录MySQL实例的信息,格式为 IP:port,可以是一个,也可以是多个。
routing_strategy
路由策略。first-available,next-available,round-robin,round-robin-with-fallback 。
2.3.3 启动mysql router
mysqlrouter -c /usr/local/mysql-router-8.0.20/conf/myrouter.conf &
1
mysqlrouter-c/usr/local/mysql-router-8.0.20/conf/myrouter.conf&
查看是否启动成功
# ps -ef|grep mysql
root 23714 23577 0 15:33 pts/0 00:00:00 mysqlrouter -c /usr/local/mysql-router-8.0.20/conf/myrouter.conf
# netstat -napl |grep -E '7001|7002'
tcp 0 0 0.0.0.0:7001 0.0.0.0:* LISTEN 23714/mysqlrouter
tcp 0 0 0.0.0.0:7002 0.0.0.0:* LISTEN 23714/mysqlrouter
1
2
3
4
5
6
# ps -ef|grep mysql
root2371423577015:33pts/000:00:00mysqlrouter-c/usr/local/mysql-router-8.0.20/conf/myrouter.conf
# netstat -napl |grep -E '7001|7002'
tcp000.0.0.0:70010.0.0.0:*LISTEN23714/mysqlrouter
tcp000.0.0.0:70020.0.0.0:*LISTEN23714/mysqlrouter
3、Router读测试
MySQL Router设计的非常蛋疼,也很弱智,远远不如mycat、atlas等中间件,无法自身实现读写分离功能。
router启动时会启动读写端口(7001和7002,),应用程序需手动填写读端口、写端口实现读写分离。
router有两个端口,一个负责读、一个负责写。比如上面的配置文件中,端口7001负责写,端口7002负责读。
我们则需要配置应用的写模块指向端口7001,读模块指向端口7002。是不是非常不方便,router用的少是有原因的。
在上面的配置文件中,从库的路由策略为 routing_strategy=round-robin ,也就是轮询。下面我们测试通过router轮询从库。
可以看到,很规律的轮流访问 tikv-02(10.0.2.231)和 tikv-03(10.0.2.232)。
# mysql -urepl -prepl4slave -h127.0.0.1 -P7002 -e"select @@hostname"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| tikv-02 |
+------------+
[root@pd-03 conf]# mysql -urepl -prepl4slave -h127.0.0.1 -P7002 -e"select @@hostname"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| tikv-03 |
+------------+
[root@pd-03 conf]# mysql -urepl -prepl4slave -h127.0.0.1 -P7002 -e"select @@hostname"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| tikv-02 |
+------------+
[root@pd-03 conf]# mysql -urepl -prepl4slave -h127.0.0.1 -P7002 -e"select @@hostname"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| tikv-03 |
+------------+
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
# mysql -urepl -prepl4slave -h127.0.0.1 -P7002 -e"select @@hostname"
mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.
+------------+
|@@hostname|
+------------+
|tikv-02|
+------------+
[root@pd-03conf]# mysql -urepl -prepl4slave -h127.0.0.1 -P7002 -e"select @@hostname"
mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.
+------------+
|@@hostname|
+------------+
|tikv-03|
+------------+
[root@pd-03conf]# mysql -urepl -prepl4slave -h127.0.0.1 -P7002 -e"select @@hostname"
mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.
+------------+
|@@hostname|
+------------+
|tikv-02|
+------------+
[root@pd-03conf]# mysql -urepl -prepl4slave -h127.0.0.1 -P7002 -e"select @@hostname"
mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.
+------------+
|@@hostname|
+------------+
|tikv-03|
+------------+
4、router写测试
写操作只能对应一个MySQL实例。
# mysql -urepl -prepl4slave -h127.0.0.1 -P7001 -e"select @@hostname"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| pd-01 |
+------------+
1
2
3
4
5
6
7
# mysql -urepl -prepl4slave -h127.0.0.1 -P7001 -e"select @@hostname"
mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.
+------------+
|@@hostname|
+------------+
|pd-01|
+------------+
但是配置文件中,destinations也可以写多个MySQL 实例,并通过routing_strategy 参数确定何时访问第二个、第三个MySQL实例。
[routing:primary]
bind_address=0.0.0.0
bind_port=7001
destinations=10.0.2.230:3307,10.0.2.231:3307,10.0.2.232:3306
routing_strategy=first-available
1
2
3
4
5
[routing:primary]
bind_address=0.0.0.0
bind_port=7001
destinations=10.0.2.230:3307,10.0.2.231:3307,10.0.2.232:3306
routing_strategy=first-available
routing_strategy的各种策略:
first-available 新连接路由到destinations列表中的第一个可用MySQL 实例。当第一个MySQL实例不可用,那么路由到第二个MySQL实例,如果第二个MySQL实例也不可用,那么路由到第三个MySQL实例。当列表中所有实例都不可用,那么停止工作。
next-available与first-available类似,都是连接列表中的第一个可用的MySQL实例。不同的是,如果列表中的MySQL实例被标注为不可连接,那么它就从列表中排除,直到重启router。
当MySQL replication 集群中主库宕机后,无论是哪种策略,都无法主动判断出新主库的IP地址,从而让业务继续可用。
因此,router中,主库[routing:primary]中,destinations只写一个主库的IP。
5、总结
Router 是MySQL官方提供的一款“轻量级”中间件,其提供read-write、read-only两个端口,用于应用根据不同功能模块连接读写或者只读。
Router,并不是我之前想象的,应用连接Router的IP,剩余的连接主库还是从库都由Router自身完成,这让我很失望。
Router 并没有提供完善的读写分离功能,这点远远不如上古时代具有读写分离功能的Atlas;更别提具有分库分表的Mycat。
因此,Router是一个半拉子中间件,功能太弱。如果你的团队具有二次开发能力,那么可以自行实现读写分离功能;如果不具备开发能力,那么Router不具备使用价值。
参考: