**前置文章:[MySQL5.7 主从搭建](https://www.xiaoleizhang.com/index.php/archives/73/ "MySQL5.7 主从搭建")** **环境配置** |服务器|IP地址| | :------------: | :------------: | |客户端|10.60.60.10| |MySQL Proxy|10.60.60.13| |Master数据库|10.60.60.11| |Slave数据库|10.60.60.12| ------------ ------------ # 一、MySQL读写分离原理 原理就是让Master数据库处理增加、删除、修改、更新操作(create、insert、delete、update),Slave数据库处理Select操作。 读写分离的前提是基于**MySQL主从复制**(可以看下前置文章),这样可以保证在Master上修改数据,Slave同步之后,前端可以读取到Slave侧的数据。 # 二、MySQL Proxy介绍 MySQL Proxy是MySQL官方提供的中间件服务,支持无数客户端连接,同时后端可以连接若干台MySQL Server服务器,MySQL Proxy自身基于MySQL协议,连接MySQL Proxy客户端无需修改任何设置,跟正常连接MySQL Server没有区别。 MySQL Proxy是应用(客户端)与MySQL Server之间的一个连接代理,MySQL Proxy负责将应用(客户端)的SQL请求根据转发规则,转发至相应的后端数据库,基于lua脚本,可以实现复杂的连接控制和过滤,从而实现数据读写分离和负责均衡的需求。 ![MySQL Proxy读写分离架构图.png](https://www.xiaoleizhang.com/usr/uploads/2021/12/3319713232.png) # 三、MySQL Proxy配置 ## 1、MySQL Proxy下载 MySQL Proxy下载地址:https://downloads.mysql.com/archives/proxy/#downloads ![MySQL Proxy下载.png](https://www.xiaoleizhang.com/usr/uploads/2021/12/807321882.png) 或者直接使用wget下载 ```shell wget https://downloads.mysql.com/archives/get/p/21/file/mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz ``` ## 2、MySQL Proxy配置安装 解压,并移动到/usr/local下 ```shell tar zxvf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz mv mysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/mysql-proxy ``` 创建日志文件 ```shell mkdir /usr/local/mysql-proxy/log touch /usr/local/mysql-proxy/log/mysql-proxy.log ``` 修改读写分离配置文件 编辑文件rw-splitting.lua ```shell vim /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua ``` 找到如下内容,修改如下 ```shell --- config -- -- connection pool if not proxy.global.config.rwsplit then proxy.global.config.rwsplit = { min_idle_connections = 1, #默认超过4个连接数时,才开始读写分离,改为1 max_idle_connections = 1, #默认8,改为1 is_debug = false } end ``` 登录进入Master数据库和Slave数据库,创建授权主从MySQL服务用户给proxy,这个用户和密码要主从一致(用户名可以自己设置) ```shell mysql> grant all on *.* to 'proxy'@'10.60.60.%' identified by '1qaz@WSX'; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) ``` 创建主配置文件 ```shell vim /etc/mysql-proxy.cnf ``` 配置文件的内容如下,根据自身情况修改 ```shell [mysql-proxy] user=root #运行mysql-proxy系统用户 admin-username=proxy #主从mysql共有的用户 admin-password=1qaz@WSX #用户的密码 proxy-address=10.60.60.13:4040 #mysql-proxy运行ip和端口,不加端口,默认4040 proxy-read-only-backend-addresses=10.60.60.12 #指定后端从slave读取数据 proxy-backend-addresses=10.60.60.11 #指定后端主master写入数据 proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua #指定读写分离配置文件位置 admin-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/admin-sql.lua #指定管理脚本 log-file=/usr/local/mysql-proxy/log/mysql-proxy.log #日志位置 log-level=info #定义log日志级别,由高到低分别有(error|warning|info|message|debug) daemon=true #以守护进程方式运行 keepalive=true #mysql-proxy崩溃时,尝试重启 ``` 修改配置文件权限 ```shell chmod 660 /etc/mysql-proxy.cnf ``` 启动MySQL Proxy,发现有报错 ```shell [root@10-60-60-13 ~]# /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/etc/mysql-proxy.cnf 2021-12-11 23:27:43: (critical) Key file contains key 'daemon' which has value that cannot be interpreted. 2021-12-11 23:27:43: (message) Initiating shutdown, requested from mysql-proxy-cli.c:367 2021-12-11 23:27:43: (message) shutting down normally, exit code is: 1 ``` 排查发现,配置文件里面的注释要全部删掉以及去除多余的空白字符,不然可能会引起一些字符不能识别的错误。 再次启动 ```shell /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/etc/mysql-proxy.cnf ``` 启动成功后,可以查看下监听端口 ```shell [root@10-60-60-13 ~]# netstat -tuplan | grep 4040 tcp 0 0 10.60.60.13:4040 0.0.0.0:* LISTEN 2129/mysql-proxy [root@10-60-60-13 ~]# ``` 可以看到端口已经监听了 ## 3、测试 先停止主从同步 ```shell mysql> stop slave; Query OK, 0 rows affected (0.00 sec) ``` 再从客户端登录MySQL Proxy 注意:MySQL Proxy不再支持mysql5.7的client客户端登录 ```shell mysql -u proxy -h 10.60.60.13 -P 4040 -p ``` 往xiaolei库的test表插入数据,发现插入成功但是读取不到 ```shell MySQL [xiaolei]> select * from test; +-------+-------+ | test1 | test2 | +-------+-------+ | 1 | 1 | +-------+-------+ 1 row in set (0.00 sec) MySQL [xiaolei]> insert into test values(2,2); Query OK, 1 row affected (0.00 sec) MySQL [xiaolei]> select * from test; +-------+-------+ | test1 | test2 | +-------+-------+ | 1 | 1 | +-------+-------+ 1 row in set (0.00 sec) MySQL [xiaolei]> ``` 你可以登录主库看到数据 ```shell mysql> select * from test; +-------+-------+ | test1 | test2 | +-------+-------+ | 1 | 1 | | 2 | 2 | +-------+-------+ 2 rows in set (0.00 sec) mysql> ``` 读写分离成功! 最后修改:2022 年 01 月 08 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏