前面我们了解到:今天给大家详细介绍一下MySQL Router实现数据库读写分离的原理和配置相关知识。 希望你能从中收获很多! 如果有帮助,请点击观看、转发、支持一波! ! !
MySQL路由器简介
MySQL Router是MySQL官方提供的一个轻量级MySQL中间件,用于替代老版本的SQL proxy。
由于MySQL Router是一个数据库中间件,MySQL Router必须能够分析来自上述客户端的SQL请求是写请求还是读请求,从而判断该SQL请求是发送给master还是slave,并将其发送给哪个主设备和哪个从设备。 这样,MySQL Router就实现了MySQL的读写分离,并对MySQL的请求进行了负载均衡。
因此,MySQL Router的前提是前端实现MySQL的主从复制。
MySQL Router非常轻量级,只能通过不同端口实现简单的读/写分离,并且读请求的调度算法只能使用默认的rr(round-robin),还有越来越复杂的能力。 没有。 因此,在实现MySQL Router时,需要自行配置前端MySQL的高可用。 建议通过Percona XtraDB Cluster或者MariaDB Galera或者MySQL官方的组复制来实现高可用。 如果没有选择,也可以实现。
因此,一个简单的MySQL Router部署图如下。
本文将使用MySQL Router来实现前端的无情境读写分离。 至于为什么不在前端用MySQL实现高可用的读写分离。 在我看来,MySQL Router只是一个玩具html连接mysql数据库,不仅功能很少,而且还需要在应用程序代码中指定不同的端口进行读/写(见后面配置文件的解释),任何人都不应该这样使用它这在实际环境中。 更多MySQL学习文章请参考:本系列持续更新。
配置 MySQL 路由器
以下是实验环境。
由于前端MySQL主从复制并没有实现高可用,只有一个主节点负责写操作。
所有前端MySQL节点都是全新安装的新MySQL实例,因此可以直接启用主从复制。
安装MySQL路由器
这里使用MySQL Router 2.1.6的二进制版本:。
tar xf mysqlrouter-2.1.6-linux-glibc2.12-x86-64bit.tar.gz
mv mysqlrouter-2.1.6-linux-glibc2.12-x86-64bit /usr/local/mysqlrouter
就是这样,就这么简单。
二进制包解压后,解压目录中有以下文件。
[root@s1 mr]# ls
bin data include lib run share
bin目录下只有一个二进制程序mysqlrouter,也是MySQL Router的主程序。
share目录下有示例配置文件和示例SysV风格的启动脚本,但遗憾的是该脚本是基于debian平台的,通过更改和安装一些东西就可以在redhat系列上使用。 所以后来我自己在centos下写了一个SysV脚本。
[root@s1 mr]# ls share/doc/mysqlrouter/
License.txt README.txt sample_mysqlrouter.conf sample_mysqlrouter.init
最后将主程序添加到PATH环境变量中。
echo "PATH=$PATH:/usr/local/mysqlrouter/bin" >/etc/profile.d/mysqlrouter.sh
chmod +x /etc/profile.d/mysqlrouter.sh
source /etc/profile.d/mysqlrouter.sh
启动并测试 MySQL 路由器
以下是上述实验环境的配置文件。 主节点只有1个192.168.100.22:3306。 如果有多个写节点(master),每个节点之间用冒号分隔。 关于配置文件,后面会解释。
[DEFAULT]
config_folder = /etc/mysqlrouter
logging_folder = /usr/local/mysqlrouter/log
runtime_folder = /var/run/mysqlrouter
[logger]
level = INFO
[routing:slaves]
bind_address = 192.168.100.21:7001
destinations = 192.168.100.23:3306,192.168.100.24:3306
mode = read-only
connect_timeout = 1
[routing:masters]
bind_address = 192.168.100.21:7002
destinations = 192.168.100.22:3306
mode = read-write
connect_timeout = 2
然后在MySQL Router所在的机器上创建其中用到的目录。
shell> mkdir /etc/mysqlrouter /usr/local/mysqlrouter/log /var/run/mysqlrouter
这样就可以启动MySQL Router来提供服务了(启动前请确保前端MySQL已经配置了主从复制)。
[root@s1 mr]# mysqlrouter &
[1] 16122
查看窃听状态。 这里点击的7001和7002这两个端口是后端用来连接MySQL Router的。 它们用于接收后端发送的SQL请求,并根据读写规则将SQL请求路由到前端节点。
[root@s1 mr]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:6032 0.0.0.0:* LISTEN 1231/proxysql
tcp 0 0 0.0.0.0:6033 0.0.0.0:* LISTEN 1231/proxysql
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1152/sshd
tcp 0 0 192.168.100.21:7001 0.0.0.0:* LISTEN 16122/mysqlrouter
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2151/master
tcp 0 0 192.168.100.21:7002 0.0.0.0:* LISTEN 16122/mysqlrouter
tcp6 0 0 :::22 :::* LISTEN 1152/sshd
tcp6 0 0 ::1:25 :::* LISTEN 2151/master
查看日志:
[root@s1 mr]# cat /usr/local/mysqlrouter/log/mysqlrouter.log
2018-07-07 10:14:29 INFO [7f8a8e253700] [routing:slaves] started: listening on 192.168.100.21:7001; read-only
2018-07-07 10:14:29 INFO [7f8a8ea54700] [routing:masters] started: listening on 192.168.100.21:7002; read-write
最后,测试一下。 测试前,授权前端Master上的Router节点允许连接,并且会复制到两个slave节点上。
mysql> grant all on *.* to root@'192.168.100.%' identified by 'P@ssword1!';
连接MySQL Router的7002端口,该端口是负责写入的端口。 由于没有配置主从高可用html连接mysql数据库,所以可以简单测试一下是否可以写入。
[root@s1 mr]# mysql -uroot -pP@ssword1! -h192.168.100.21 -P7002 -e 'select @@server_id;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------------+
| @@server_id |
+-------------+
| 110 |
+-------------+
[root@s1 mr]# mysql -uroot -pP@ssword1! -h192.168.100.21 -P7002 -e 'create database mytest;'
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@s1 mr]# mysql -uroot -pP@ssword1! -h192.168.100.21 -P7002 -e 'show databases;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| mytest |
| performance_schema |
| sys |
+--------------------+
然后测试各个从节点,看能否实现rr调度算法的读请求的负载均衡。
[root@s1 mr]# mysql -uroot -pP@ssword1! -h192.168.100.21 -P7001 -e 'select @@server_id;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------------+
| @@server_id |
+-------------+
| 120 |
+-------------+
[root@s1 mr]# mysql -uroot -pP@ssword1! -h192.168.100.21 -P7001 -e 'select @@server_id;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------------+
| @@server_id |
+-------------+
| 130 |
+-------------+
[root@s1 mr]# mysql -uroot -pP@ssword1! -h192.168.100.21 -P7001 -e 'show databases;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| mytest |
| performance_schema |
| sys |
+--------------------+
显然,测试结果一切正常。
看来MySQL Router就是这么简单,就是这么简单。 只需提供合理的配置文件即可。 那么,下面解释一下MySQL Router的配置文件。 更多MySQL学习文章请参考:本系列持续更新。
MySQL Router的配置文件解释
MySQL Router的配置文件也很简单,需要配置的项目并不多。
默认情况下,mysql router会在安装目录中搜索“mysqlrouter.conf”,在主目录中搜索“.mysqlrouter.conf”。 也可以在二进制程序mysqlrouter命令下使用“-c”或“--config”手动指定配置文件。
MySQL路由器的配置文件是碎片化的,常用的碎片只有三个:[DEFAULT]、[logger]、[routing:NAME]。 片段名称区分大小写,仅支持单行“#”或“;” 注释,不支持中行注释和行尾注释。
以前面示例中的配置文件为例。
[DEFAULT]
config_folder = /etc/mysqlrouter
logging_folder = /usr/local/mysqlrouter/log
runtime_folder = /var/run/mysqlrouter
[logger]
level = INFO
[routing:slaves]
bind_address = 192.168.100.21:7001
destinations = 192.168.100.23:3306,192.168.100.24:3306
mode = read-only
connect_timeout = 1
[routing:masters]
bind_address = 192.168.100.21:7002
destinations = 192.168.100.22:3306
mode = read-write
connect_timeout = 2
DEFAULT 片段的配置
[DEFAULT]片段一般配置MySQL路由器运行时的配置文件目录、日志目录、目录(如pid文件)。
例如:
[DEFAULT]
config_folder=/etc/mysqlrouter # 指定额外的配置文件目录,该目录下的conf文件都会被加载
logging_folder=/usr/local/mysqlrouter/log # 指定日志目录,日志文件名为mysqlrouter.log
runtime_folder=/var/run/mysqlrouter # 指定运行时目录,默认为/run/mysqlrouter
记录器片段的配置
[logger] 部分只有一个选项,用于设置日志的记录级别。
[logger]
level=debug # 有debug、info(默认)、warning、error、fatal,不区分大小写
路由段的配置
[routing:NAME]是MySQL路由器的主要部分,它设置不同的路由实例,NAME可以自由命名。 如[路由:从站]、[路由:主站]。
在路由配置片段中,可以设置的选项包括:bind_address和bind_port
另外,监听地址不能出现在destinations指令指定的列表中。
示例如下:
[routing:slaves]
bind_port = 7001
[routing:slaves]
bind_address = 192.168.100.21
bind_port = 7001
[routing:slaves]
bind_address = 192.168.100.21:7001
一般来说,通过不同端口来实现读/写分离并不是一个好方法。 最大的原因是这些连接端口需要在应用程序代码中指定。 但是MySQL Router只能通过这些方法实现读写分离,所以MySQL Router只能当玩具用。
目的地
定义路由规则的转发目标。 格式为主机:端口。 HOST 可以是 IP 或主机名。 多个转发目标用冒号分隔。 目标列表是定义的多个从站。
[routing:slaves]
bind_address = 192.168.100.21:7001
destinations = 192.168.100.23:3306,192.168.100.24:3306
[routing:masters]
bind_address = 192.168.100.21:7002
destinations = 192.168.100.22:3306,192.168.100.100:3306
模式
MySQL路由器提供两种模式:只读和读写。 这两种方法会形成不同的转发调度方法。
连接超时
MySQL Router联系目的地的超时时间,默认为1秒,取值范围为1-65536。 应尽量将该值设置得尽可能小,以免等待太久。
对于读写模式,可以将超时时间设置长一点,防止误认为主Master不可用而联系备Master。
对于只读模式,可以将超时设置短一些,因为这些模式都是通过目的地列表来寻址的,即使判断错误,影响也不会太大。
其他选择
你还可以设置一些其他的命令,比如使用的合约、最大请求数等,但是你可以使用默认值而不需要设置。 它们是MySQL Router结合MySQL优化的一些选项,而且已经很完美了。
配置文件就是关于这些内容的。 配置完成后,记得先创建默认fragment涉及的目录。 之后就可以启动mysql router提供读写分离服务了。
为 MySQL Router 提供 SysV 脚本
MySQL Router只提供了一个主程序(bin目录下的mysqlrouter),而这个程序只能启动,并没有停止选项,所以kill命令只能用来杀死进程。
MySQL Router还提供了一个示例启动脚本,位于$basedir/share/doc/mysqlrouter/sample_mysqlrouter.init,但是这个脚本是基于Debian平台的,在CentOS上需要设置和安装一些东西,所以不要不要使用它。 自己写一个粗略的脚本就可以了。
shell> vim /etc/init.d/mysqlrouter
#!/bin/bash
# chkconfig: - 78 30
# Description: Start / Stop MySQL Router
DAEMON=/usr/local/mysqlrouter
proc=$DAEMON/bin/mysqlrouter
DAEMON_OPTIONS="-c ${DAEMON}/mysqlrouter.conf"
. /etc/init.d/functions
start() {
if [ -e /var/lock/subsys/mysqlrouter ]; then
action "MySQL Router is working" /bin/false
else
$proc $DAEMON_OPTIONS & &>/dev/null
retval=$?
echo
if [ $retval -eq 0 ]; then
touch /var/lock/subsys/mysqlrouter
action "Starting MySQL Router" /bin/true
else
echo "Starting MySQL Router Failure"
fi
fi
}
stop() {
if [ -e /var/lock/subsys/mysqlrouter ]; then
killall $proc
retval=$?
echo
if [ $retval -eq 0 ]; then
rm -f /var/lock/subsys/mysqlrouter
action "Stoping MySQL Router" /bin/true
fi
else
action "MySQL Router is not working" /bin/false
fi
}
status() {
if [ -e /var/lock/subsys/mysqlrouter ]; then
echo "MySQL Router is running"
else
echo "MySQL Router is not running"
fi
}
case "$1" in
start)
start
sleep 1
;;
stop)
stop
sleep 1
;;
restart)
stop
start
sleep 1
;;
status)
status
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
retval=1
;;
esac
exit $retval
然后给予执行权限。
shell> chmod +x /etc/init.d/mysqlrouter
来源:cnblogs.com/f-ck-need-u/p/9276639.html
发表评论