iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >ProxySQL怎么实现读写自动分离
  • 939
分享到

ProxySQL怎么实现读写自动分离

2024-04-02 19:04:59 939人浏览 薄情痞子
摘要

简介Proxysql 是基于 Mysql 的一款开源的中间件的产品,是一个灵活的 mysql 代理层,可以实现读写分离,支持 Query 路由功能,支持动态指定某个 SQL 进行缓存,支持动态加载(无需重启

简介

Proxysql 是基于 Mysql 的一款开源中间件的产品,是一个灵活的 mysql 代理层,可以实现读写分离,支持 Query 路由功能,支持动态指定某个 SQL 进行缓存,支持动态加载(无需重启 ProxySQL 服务),故障切换和一些 SQL 的过滤功能。 

腾讯云cdb可以提供主库VIP+只读从库VIP的形式,这样开发使用时需要维护2个VIP而且不能自动读写分离,基于现状计划使用proxysql结合clb及cdb来实现读写自动分离。
架构如下:
app--clb四层--proxysql--主vip+自读vip

一.ProxySQL部署
1.下载安装启动

[root@VM_8_24_Centos ~]# wget https://GitHub.com/sysown/proxysql/releases/download/v2.0.8/proxysql-2.0.8-1-centos7.x86_64.rpm
[root@VM_8_24_centos ~]# rpm -ivh proxysql-2.0.8-1-centos7.x86_64.rpm
[root@VM_8_24_centos ~]# systemctl start proxysql
[root@VM_8_24_centos ~]# systemctl enable proxysql
[root@VM_8_24_centos ~]# netstat -tulpn |grep 603
tcp        0      0 0.0.0.0:6032            0.0.0.0:*               LISTEN      26063/proxysql      
tcp        0      0 0.0.0.0:6033            0.0.0.0:*               LISTEN      26063/proxysql 

2.登陆测试

[root@VM_8_24_centos ~]# mysql -uadmin -padmin -h 127.0.0.1 -P6032
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.30 (ProxySQL Admin Module)

Copyright (c) 2000, 2018, oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> show databases;
+-----+---------------+-------------------------------------+
| seq | name          | file                                |
+-----+---------------+-------------------------------------+
| 0   | main          |                                     |
| 2   | disk          | /var/lib/proxysql/proxysql.db       |
| 3   | stats         |                                     |
| 4   | monitor       |                                     |
| 5   | stats_history | /var/lib/proxysql/proxysql_stats.db |
+-----+---------------+-------------------------------------+
5 rows in set (0.01 sec)

MySQL [(none)]> 

二.ProxySQL配置

1.架构
node1 (vip 192.168.0.9:3306) , mysql master
node2 (vip 192.168.0.42:3306) , mysql slave
prxoy (192.168.8.24:6033) , proxysql
clb   (vip 192.168.9.27:6033), clb proxysql
app (192.168.0.26), mysql client

2.proxysql上添加mysql主从数据库信息
proxysql上执行,将主库master也就是做写入的节点放到group 0中,salve节点做读放到group 1中
语法如下:

insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment) values(0,'192.168.0.9',3306,1,2000,10,'TESTuser');
insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment) values(1,'192.168.0.42',3306,1,2000,10,'TESTuser');
select * from mysql_servers;

例子:

MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,ax_replication_lag,comment) values(0,'192.168.0.9',3306,1,2000,10,'TESTuser');
Query OK, 1 row affected (0.00 sec)

MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,ax_replication_lag,comment) values(1,'192.168.0.42',3306,1,2000,10,'TESTuser');
Query OK, 1 row affected (0.00 sec)

MySQL [(none)]> select * from mysql_servers;
+--------------+-----------+------+--------+--------+-------------+-----------------+--------------------+---------+----------------+---------+
| hostgroup_id | hostname  | port | status | weight | compression | max_connections | max_relication_lag | use_ssl | max_latency_ms | comment |
+--------------+-----------+------+--------+--------+-------------+-----------------+--------------------+---------+----------------+---------+
| 0            | 192.168.0.9  | 3306 | ONLINE | 1      | 0           | 2000            | 10                 | 0       | 0              | TESTuser    |
| 1            | 192.168.0.42 | 3306 | ONLINE | 1      | 0           | 2000            | 10                 | 0       | 0              | TESTuser    |
+--------------+-----------+------+--------+--------+-------------+-----------------+--------------------+---------+----------------+---------+
2 rows in set (0.01 sec)

3.mysql主库上添加proxysql监控账号及应用程序操作账号
mysql master上执行,注意应用程序操作账号根据实际情况授予权限,最好只授权给proxysql主机
语法如下:

grant usage on *.* to 'proxysql'@'192.168.8.24' identified by 'ProxySQL@20191226';
grant select, insert, update, delete ON *.* TO 'testuser'@'192.168.8.24' identified by 'TESTuser@20191226';
flush privileges;
select host,user from mysql.user;

例子:

MySQL [(none)]> grant usage on *.* to 'proxysql'@'192.168.8.24' identified by 'ProxySQL@20191226';
Query OK, 0 rows affected, 1 warning (0.00 sec)

MySQL [(none)]> grant select, insert, update, delete ON *.* TO 'testuser'@'192.168.8.24' identified by 'TESTuser@20191226';
Query OK, 0 rows affected, 1 warning (0.00 sec)

MySQL [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> select host,user from mysql.user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| %         | TESTuser_data_servic |
| %         | TESTuser_rule_rw     |
| 192.168.8.24 | proxysql         |
| 192.168.8.24 | testuser         |
| 127.0.0.1 | root             |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+
7 rows in set (0.01 sec)

4.proxysql上添加应用操作账号
proxysql上执行,注意应用账号授权给主hostgroup,这里是0
语法如下:

insert into mysql_users(username,passWord,active,default_hostgroup) values ('testuser','TESTuser@20191226',1,0);
select * from mysql_users;

例子:

MySQL [(none)]> insert into mysql_users(username,password,active,default_hostgroup) values ('testuser','TESTuser@20191226',1,0);
Query OK, 1 row affected (0.00 sec)

MySQL [(none)]> select * from mysql_users;
+----------+---------------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+
| username | password      | active | use_ssl | default_hostgroup | default_schema | schema_locked | transaction_persistent | fast_forward | backend | frontend | max_connections |
+----------+---------------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+
| testuser | TESTuser@20191226 | 1      | 0       | 0                 | NULL           | 0             | 1                      | 0            | 1       | 1        | 10000           |
+----------+---------------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+
1 row in set (0.00 sec)

注意:要是是用明文密码设置mysql_users,在这里可以用save命令来转换成了hash值的密码

语法如下:

save mysql users to mem;

例子:

MySQL [(none)]> save mysql users to mem;
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> select username,password from mysql_users;
+----------+-------------------------------------------+
| username | password                                  |
+----------+-------------------------------------------+
| testuser | *59D7241B6C5F951F331FF88505C582CBCD42482F |
+----------+-------------------------------------------+
1 row in set (0.00 sec)

5.设置监控账号
proxysql上操作,账号密码与mysql主库上账号密码保持一致
语法如下:

update global_variables set variable_value='proxysql' where variable_name='mysql-monitor_username';
update global_variables set variable_value='ProxySQL@20191226' where variable_name='mysql-monitor_password';

例子:

MySQL [(none)]> update global_variables set variable_value='proxysql' where variable_name='mysql-monitor_username';
Query OK, 1 row affected (0.00 sec)

MySQL [(none)]> update global_variables set variable_value='ProxySQL@20191226' where variable_name='mysql-monitor_password';
Query OK, 1 row affected (0.00 sec)

6.应用到线上
proxysql上操作
语法如下:

load mySQL Servers to runtime;
load mysql users to runtime;
load mysql variables to runtime;

例子:

MySQL [(none)]> load mysql servers to runtime;
Query OK, 0 rows affected (0.01 sec)

MySQL [(none)]> load mysql users to runtime;
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> load mysql variables to runtime;
Query OK, 0 rows affected (0.00 sec)

7.持久化
proxysql上操作
语法如下:

save mysql servers to disk;
save mysql users to disk;
save mysql variables to disk;

例子:

MySQL [(none)]> save mysql servers to disk;
Query OK, 0 rows affected (0.07 sec)

MySQL [(none)]> save mysql users to disk;
Query OK, 0 rows affected (0.04 sec)

MySQL [(none)]> save mysql variables to disk;
Query OK, 97 rows affected (0.02 sec)

8.自动读写分离配置
proxysql上操作,定义路由规则,如:除select * from tb for update的select全部发送到slave,其他的的语句发送到master。

语法如下:

insert into mysql_query_rules(active,match_pattern,destination_hostgroup,apply) values(1,'^SELECT.*FOR UPDATE$',0,1);
insert into mysql_query_rules(active,match_pattern,destination_hostgroup,apply) values(1,'^SELECT',1,1);
load mysql query rules to runtime;
save mysql  query rules to disk;

例子:

MySQL [(none)]> insert into mysql_query_rules(active,match_pattern,destination_hostgroup,apply) values(1,'^SELECT.*FOR UPDATE$',0,1);
Query OK, 1 row affected (0.00 sec)

MySQL [(none)]> insert into mysql_query_rules(active,match_pattern,destination_hostgroup,apply) values(1,'^SELECT',1,1);
Query OK, 1 row affected (0.00 sec)

MySQL [(none)]> load mysql query rules to runtime;
Query OK, 0 rows affected (0.01 sec)

MySQL [(none)]> save mysql  query rules to disk;
Query OK, 0 rows affected (0.10 sec)

说明:active表示是否启用这个sql路由项,match_pattern就是我们正则匹配项,destination_hostgroup表示我们要将该类sql转发到哪些mysql上面去,apply为1表示该正则匹配后,将不再接受其他匹配,直接转发。

9.客户端测试效果
连接数据库,通过proxysql的客户端接口访问(6033)

[root@VM_8_24_centos ~]# mysql -utestuser -pTESTuser@20191226 -h 127.0.0.1 -P6033
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.5.30 (ProxySQL)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> show databases;
+-------------------------+
| Database                |
+-------------------------+
| infORMation_schema      |
| mysql                   |
| performance_schema      |
| TESTuser_data_services_dev  |
| TESTuser_data_services_test |
| TESTuser_rule               |
+-------------------------+
7 rows in set (0.01 sec)

MySQL [(none)]> use TESTuser_rule;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MySQL [TESTuser_rule]> show tables;
+-------------------------------+
| Tables_in_TESTuser_rule           |
+-------------------------------+
| organ_1_b_12                  |
| organ_1_b_13                  |
| organ_1_b_14                  |
| organ_1_b_15                  |
| organ_1_b_16                  |
| organ_1_b_19                  |
+-------------------------------+
6 rows in set (0.00 sec)

MySQL [TESTuser_rule]> select * from organ_1_b_12;
+----+--------------------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+---------+-----------+---------------------+
| id | t0                 | t1   | t2   | t3   | t4   | t5   | t6   | t7   | t8   | t9   | t10  | t11  | t12  | t13  | t14  | t15  | t16  | t17  | t18  | t19  | user_id | nick_name | created             |
+----+--------------------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+---------+-----------+---------------------+
|  1 | 513427199402063414 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |       1 | admin     | 2018-10-31 11:50:38 |
|  2 | 140502198811102244 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |       1 | admin     | 2018-10-31 14:35:36 |
+----+--------------------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+---------+-----------+---------------------+
2 rows in set (0.00 sec)

10.proxysql统计效果
通过proxysql接口正常操作数据,从管理接口看看ProxySQL的统计信息:
语法如下:

select Command,Total_Time_us,Total_cnt from stats_mysql_commands_counters where Total_cnt >0;

例子:

MySQL [(none)]> select Command,Total_Time_us,Total_cnt from stats_mysql_commands_counters where Total_cnt >0;
+---------+---------------+-----------+
| Command | Total_Time_us | Total_cnt |
+---------+---------------+-----------+
| SELECT  | 5650          | 3         |
| SHOW    | 7044          | 4         |
+---------+---------------+-----------+
2 rows in set (0.00 sec)

查看各类SQL的执行情况
语法如下:

select * from stats_mysql_query_digest;

例子:

MySQL [(none)]> select * from stats_mysql_query_digest;
+-----------+--------------------+----------+--------------------+----------------------------------+------------+------------+------------+----------+----------+----------+
| hostgroup | schemaname         | username | digest             | digest_text                      | count_star | first_seen | last_seen  | sum_time | min_time | max_time |
+-----------+--------------------+----------+--------------------+----------------------------------+------------+------------+------------+----------+----------+----------+
| 1         | TESTuser_rule          | testuser | 0x504CF0771C9E548B | select * from organ_1_b_12       | 1          | 1577341448 | 1577341448 | 3746     | 3746     | 3746     |
| 0         | TESTuser_rule          | testuser | 0x99531AEFF718C501 | show tables                      | 2          | 1577341415 | 1577341425 | 2252     | 669      | 1583     |
| 1         | information_schema | testuser | 0x620B328FE9D6D71A | SELECT DATABASE()                | 1          | 1577341415 | 1577341415 | 1904     | 1904     | 1904     |
| 0         | information_schema | testuser | 0x02033E45904D3DF0 | show databases                   | 1          | 1577341374 | 1577341374 | 2326     | 2326     | 2326     |
| 0         | TESTuser_rule          | testuser | 0x02033E45904D3DF0 | show databases                   | 1          | 1577341415 | 1577341415 | 2466     | 2466     | 2466     |
| 0         | information_schema | testuser | 0x226CD90D52A2BA0B | select @@version_comment limit ? | 1          | 1577341364 | 1577341364 | 0        | 0        | 0        |
+-----------+--------------------+----------+--------------------+----------------------------------+------------+------------+------------+----------+----------+----------+
6 rows in set (0.00 sec)

11.通过clb解决proxysql单点故障并负债均衡
内网clb 192.168.9.27 tcp 6033端口到192.168.8.24 6033端口,其他proxysql绑定即可。

[root@VM_0_26_centos ~]# mysql -utestuser -p -h 192.168.9.27 -P6033
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 2699
Server version: 5.5.30 (ProxySQL)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> show databases;
+-------------------------+
| Database                |
+-------------------------+
| information_schema      |
| mysql                   |
| performance_schema      |
| TESTuser_data_services_dev  |
| TESTuser_data_services_test |
| TESTuser_rule               |
+-------------------------+
7 rows in set (0.01 sec)

MySQL [(none)]> select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| TESTuser_data_servic | %         |
| TESTuser_rule_rw     | %         |
| proxysql         | 192.168.8.24 |
| testuser         | 192.168.8.24 |
| root             | 127.0.0.1 |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
7 rows in set (0.01 sec)
您可能感兴趣的文档:

--结束END--

本文标题: ProxySQL怎么实现读写自动分离

本文链接: https://www.lsjlt.com/news/37682.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ProxySQL怎么实现读写自动分离
    简介ProxySQL 是基于 MySQL 的一款开源的中间件的产品,是一个灵活的 MySQL 代理层,可以实现读写分离,支持 Query 路由功能,支持动态指定某个 SQL 进行缓存,支持动态加载(无需重启...
    99+
    2022-10-18
  • ProxySQL实现读写分离
    环境: 192.168.205.37: as ProxySQL server 192.168.205.47: as Master server 192.168.205.57: as Slave ser...
    99+
    2022-10-18
  • MySQL使用ProxySQL实现读写分离
    1 ProxySQL简介: ProxySQL是一个高性能的MySQL中间件,拥有强大的规则引擎。官方文档:https://github.com/sysown/proxysql/wiki/下载地址:https...
    99+
    2022-10-18
  • 数据库中间件ProxySQL读写自动分离实践
    参考文档 https://github.com/sysown/proxysql http://www.fordba.com/mysql_proxysql_rw_split.html https://www....
    99+
    2022-10-18
  • MySQL中间件proxysql实现MySQL读写分离
    1. Mysql实现读写分离的方式 mysql 实现读写分离的方式有以下几种: 程序修改mysql操作,直接和数据库通信,简单快捷的读写分离和随机的方式实现的负载均衡,权限独立分配,需要开发人员协助。 amoeba,直接实现读写分离和负载...
    99+
    2021-12-16
    MySQL中间件proxysql实现MySQL读写分离 数据库入门 数据库基础教程 数据库 mysql
  • ProxySQL中怎么利用MySQL实现数据库读写分离
    ProxySQL中怎么利用MySQL实现数据库读写分离,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。ProxySQL介绍1、连接池,而且是mu...
    99+
    2022-10-18
  • MySQL中通过ProxySQL的使用来实现读写分离
    本文主要给大家介绍MySQL中通过ProxySQL的使用来实现读写分离,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下MySQL中通过ProxySQL...
    99+
    2022-10-18
  • 怎么实现mysql读写分离
    这篇文章主要介绍“怎么实现mysql读写分离”,在日常操作中,相信很多人在怎么实现mysql读写分离问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么实现mysql读写分离”...
    99+
    2022-10-19
  • SpringBoot怎么实现读写分离
    这篇文章主要讲解了“SpringBoot怎么实现读写分离”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot怎么实现读写分离”吧!前言根据公司业务需求,项目需要读写分离,所以记...
    99+
    2023-06-30
  • redis读写分离怎么实现
    Redis读写分离可以通过以下几种方式实现:1. 主从复制(Master-Slave):将一个Redis实例作为主节点(Master...
    99+
    2023-09-06
    redis
  • MySQL高可用实现:主从结构下ProxySQL中的读写分离
    原文: http://www.enmotech.com/web/detail/1/714/1.html ( 复制链接,打开浏览器即可查看原文 )  墨墨导读:Pro...
    99+
    2022-10-18
  • Sharding-JDBC自动实现MySQL读写分离的示例代码怎么编写
    Sharding-JDBC自动实现MySQL读写分离的示例代码怎么编写,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、ShardingSphere和Shard...
    99+
    2023-06-25
  • MyCat中怎么实现读写分离
    这期内容当中小编将会给大家带来有关MyCat中怎么实现读写分离,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、mycat实现读写分离这里没有用到mysql03主机,读写...
    99+
    2022-10-18
  • mybatis中怎么实现读写分离
    本篇文章为大家展示了mybatis中怎么实现读写分离,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、spring aop实现首先application-test.yml增加如下数据源的配置spri...
    99+
    2023-06-20
  • 如何使用proxysql 1.4.14中间件实现mysql 5.7.26主从的读写分离
    这篇文章将为大家详细讲解有关如何使用proxysql 1.4.14中间件实现mysql 5.7.26主从的读写分离,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。准备条件操...
    99+
    2022-10-18
  • Atlas实现读写分离
    该Atlas方案的实现需要基于MHA架构(而MHA架构需要 实现mysql主从复制且开启GTID特性) 常见方案介绍: Mysql-proxy(oracle)Mysql-router(oracle)Atla...
    99+
    2022-10-18
  • Sharding-JDBC自动实现MySQL读写分离的示例代码
    目录一、ShardingSphere和Sharding-JDBC概述1.1、ShardingSphere简介 1.2、Sharding-JDBC简介1.3、Sharding...
    99+
    2022-11-12
  • Java基于JNDI怎么实现读写分离
    这篇文章主要介绍“Java基于JNDI怎么实现读写分离”,在日常操作中,相信很多人在Java基于JNDI怎么实现读写分离问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java基于JNDI怎么实现读写分离”的疑...
    99+
    2023-06-22
  • 使用Mycat怎么实现MySQL读写分离
    今天就跟大家聊聊有关使用Mycat怎么实现MySQL读写分离,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。搭建环境操作系统:CentOS-6.5-x...
    99+
    2022-10-18
  • 使用Django怎么实现MySQL读写分离
    本篇文章为大家展示了使用Django怎么实现MySQL读写分离,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。主从同步介绍和优点在多台数据服务器中,分为主服务器和从服...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作