Mysql-proxy的读写分离
Mysql-proxy简介:
- mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等
- MySQL Proxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用lua脚本,可以实现复杂的连接控制和过滤,
从而实现读写分离和负载平衡。对于应用来说,MySQL Proxy是完全透明的,应用则只需要连接到MySQL Proxy的监听端口即可。
当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器做为冗余,在应用服务器的连接池配置中配置到多 个proxy的连接参数即可。
~
从图中可以看到,SQL语句并不直接进入到master数据库或者slave数据库,而是进入到 proxy,然后proxy判断这条语句是有关写的语句(包括insert、update、delete)还 是读语句(select),当是写语句的时候,那么proxy将向master所在的服务器发出请 求,同理,如果是读语句的时候,proxy将向slave所在的服务器发出请求。
实验环境:
server1 172.25.75.1 master
server2 172.25.75.2 slave
server3 172.25.75.3 mysql-proxy
前提:必须实现主从复制。
检测:
在server1上创建表及数据,查看server2是否同步成功
server1:
mysql> CREATE DATABASE redhat;
Query OK, 1 row affected (0.01 sec)
mysql> USE redhat;
Database changed
mysql> CREATE table usertb (
-> username varchar(10) not null,
-> password varchar(15) not null);
Query OK, 0 rows affected (0.14 sec)
mysql> DESC usertb;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(10) | NO | | NULL | |
| password | varchar(15) | NO | | NULL | |
+----------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
mysql> insert into usertb values ('user1','123');
Query OK, 1 row affected (0.04 sec)
mysql> select * from usertb;
+----------+----------+
| username | password |
+----------+----------+
| user1 | 123 |
+----------+----------+
1 row in set (0.00 sec)
server2查看:
mysql> select * from usertb;
ERROR 1046 (3D000): No database selected
mysql> select * from redhat.usertb;
+----------+----------+
| username | password |
+----------+----------+
| user1 | 123 |
+----------+----------+
1 row in set (0.00 sec)
主从复制配置成功
一、server3部署mysql-proxy服务
[root@server3 ~]# ls
mysql-5.7.24-1.el