html连接mysql数据库-数据库致命系列(二十九):MySQL Router实现数据库读写分离配置实践

前面我们了解到:今天给大家详细介绍一下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数据库_mysql5.5连接数据库_html连接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

html连接mysql数据库_链接mysql数据库_mysql5.5连接数据库

然后在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] 部分只有一个选项,用于设置日志的记录级别。

链接mysql数据库_mysql5.5连接数据库_html连接mysql数据库

[logger]
level=debug   # 有debug、info(默认)、warningerror、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