MySQL Router 8.0 安装及说明
4,601 total views, 2 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 解压安装
解包
1 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 3 4 |
# 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 |
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 创建相关目录
1 |
mkdir -p /usr/local/mysql-router-8.0.20/{log,run,data,conf} |
2.3.2 修改配置文件
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
1 |
mysqlrouter -c /usr/local/mysql-router-8.0.20/conf/myrouter.conf & |
查看是否启动成功
1 2 3 4 5 6 |
# 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 |
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)。
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] 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 | +------------+ |
4、router写测试
写操作只能对应一个MySQL实例。
1 2 3 4 5 6 7 |
# 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 | +------------+ |
但是配置文件中,destinations也可以写多个MySQL 实例,并通过routing_strategy 参数确定何时访问第二个、第三个MySQL实例。
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不具备使用价值。
因此,Router是一个半拉子中间件,功能太弱。如果你的团队具有二次开发能力,那么可以自行实现读写分离功能;如果不具备开发能力,那么Router不具备使用价值。
参考: