中间件
  • MySQL中间件之ProxySQL(9):ProxySQL的查询缓存功能

    ProxySQL支持查询缓存的功能,可以将后端返回的结果集缓存在自己的内存中,在某查询的缓存条目被清理(例如过期)之前,前端再发起同样的查询语句,将直接从缓存中取数据并返回给前端。如此一来,ProxySQL处理的性能会大幅提升,也会大幅减轻后端MySQL Server的压力。 1.开启query cache功能 ProxySQL的查询缓存功能由mysql_query_rules表中的cache_ttl字段控制,该字段设置每个规则对应的缓存时长,时间单位为毫秒。 当前端发送的SQL语句命中了某规则后(严格地说,是最后应用的那条规则,因为链式规则下会操作多个规则),如果这个规则同时还设置了"cache_ttl"字段的值,则这个SQL语句返回的结果将会被缓存一定时间,过期后将等待专门的线程(purge线程)来清理。 例如: delete from mysql_query_rules; select * from stats_mysql_query_digest_reset where 1=0; insert into mysql_query_rules(rule_id,active,apply,destination_hostgroup,match_pattern,cache_ttl) values(1,1,1,10,"^select .* test1.t1",20000); load mysql query rules to runtime; save mysql query rules to disk; select rule_id,destination_hostgroup,match_pattern,cache_ttl from mysql_query_rules; 这表示匹配上述规则(查询test1.t1表)的查询结果集将在ProxySQL上缓存20秒。 可以执行下面的语句进行测试,每个语句循环执行10次: # 在bash下执行 proc="mysql -uroot -pP@ssword1! -h127.0.0.1 -P6033 -e" for ((i=0;i<10;i++));do $proc "select * from test1.t1;" $proc "select * from test1.t2;" $proc "select * from test2.t1;" $proc "select * from test2.t2;" done 再去查看规则统计表: Admin> select * from stats_mysql_query_rules; +---------+------+ | rule_id | ……

    SE_You 2024-03-25
    20 0 0
  • MySQL中间件之ProxySQL(8):SQL语句的重写规则

    1.为什么要重写SQL语句 ProxySQL在收到前端发送来的SQL语句后,可以根据已定制的规则去匹配它,匹配到了还可以去重写这个语句,然后再路由到后端去。 什么时候需要重写SQL语句? 对于下面这种简单的读、写分离,当然用不上重写SQL语句。 这样的读写分离,实现起来非常简单。如下: mysql_replication_hostgroups: +------------------+------------------+----------+ | writer_hostgroup | reader_hostgroup | comment | +------------------+------------------+----------+ | 10 | 20 | cluster1 | +------------------+------------------+----------+ mysql_servers: +--------------+----------+------+--------+--------+ | hostgroup_id | hostname | port | status | weight | +--------------+----------+------+--------+--------+ | 10 | master | 3306 | ONLINE | 1 | | 20 | slave1 | 3306 | ONLINE | 1 | | 20 | slave2 | 3306 | ONLINE | 1 | +--------------+----------+------+--------+--------+ mysql_query_rules: +---------+-----------------------+----------------------+ | rule_id | destination_hostgroup | match_digest | +---------+-----------------------+----------------------+ | 1 | 10 | ^SELECT.*FOR UPDATE$ | | 2 | 20 | ^SELECT | +---------+-----------------------+----------------------+ 但是,复杂一点的,例如ProxySQL实现sharding功能。对db1库的select_1语句路由给hg=10的组,将db2库的select_2语句路由给hg=20的组,将db3库的select_3语句路由给hg=30的组。 ……

    SE_You 2024-03-22
    24 0 0
  • MySQL中间件之ProxySQL(7):详述ProxySQL的路由规则

    1.关于ProxySQL路由的简述 当ProxySQL收到前端app发送的SQL语句后,它需要将这个SQL语句(或者重写后的SQL语句)发送给后端的MySQL Server,然后收到SQL语句的MySQL Server执行查询,并将查询结果返回给ProxySQL,再由ProxySQL将结果返回给客户端(如果设置了查询缓存,则先缓存查询结果)。 ProxySQL可以实现多种方式的路由:基于ip/port、username、schema、SQL语句。其中基于SQL语句的路由是按照规则进行匹配的,匹配方式有hash高效匹配、正则匹配,还支持更复杂的链式规则匹配。 本文将简单演示基于端口、用户和schema的路由,然后再详细介绍基于SQL语句的路由规则。不过需要说明的是,本文只是入门,为后面ProxySQL的高级路由方法做铺垫。 在阅读本文之前,请确保: 已经理解ProxySQL的多层配置系统,可参考:ProxySQL的多层配置系统 会操作ProxySQL的Admin管理接口,可参考:ProxySQL的Admin管理接口 已经配置好了后端节点、mysql_users等。可参考:ProxySQL管理后端节点 如果想速成,可参考;ProxySQL初试读写分离 本文涉及到的实验环境如下: 角色 主机IP server_id 数据状态 Proxysql 192.168.100.21 null 无 Master 192.168.100.22 110 刚安装的全新MySQL实例 Slave1 192.168.100.23 120 刚安装的全新MySQL实例 Slave2 192.168.100.24 130 刚安装的全新MySQL实例 该实验环境已经在前面的文章中搭建好,本文不再赘述一大堆的内容。环境的搭建请参考前面给出的1、2、3。 2.ProxySQL基于端口的路由 我前面写了一篇通过MySQL Router实现MySQL读写分离的文章,MySQL Router实现读写分离的方式就是通过监听不同端口实现的:一个端口负责读操作,一个端口负责写操作。这样的路由逻辑非常简单,配置起来也很方便。 虽然基于端口实现读写分离配置起来非常简单,但是缺点也很明显:必须在前端ap……

    SE_You 2024-03-21
    73 0 0
  • MySQL中间件之ProxySQL(6):管理后端节点

    1.配置后端节点前的说明 为了让ProxySQL能够找到后端的MySQL节点,需要将后端的MySQL Server加入到ProxySQL中。ProxySQL的一切配置行为都是在修改main库中的对应的表,所以添加节点到ProxySQL中实际上也是通过修改相关表来实现的。 管理后端节点有几个过程: 将后端MySQL Server的主从复制结构配置好。 将后端MySQL Server节点加入到ProxySQL中。相关的表为mysql_servers。 监控后端节点。相关的表是全局变量表global_vairbles,相关的变量为mysql-monitor_开头的变量。 配置读、写组。相关的表为mysql_replication_hostgroups。 配置MySQL用户,用于发送SQL语句。相关的表为mysql_users。 几个注意点: (1).ProxySQL是通过监控后端节点的read_only值来自动调整节点所属组的,例如read_only=1的节点会移动到读组,read_only=0的节点会移动到写组。所以,在配置读、写组之前,需要先监控后端节点。ProxySQL也支持手动管理后端节点,这种模式不会根据read_only的值自动调整,在后面的文章中会介绍这种模式。 (2).对于传统的主从复制,默认的read_only=0,所以在第一步中,各slave节点的配置文件中需要加上read_only=1。对于组复制、Galera,因为会自动强制设置非写节点的read_only=1,所以无需额外配置该属性。 (3).ProxySQL支持传统主从复制结构(即异步、半同步、gtid复制)的后端,读、写组相关的表是mysql_replication_hostgroups。还支持MySQL组复制结构的后端,相关的表是mysql_group_replication_hostgroups,还支持Galera(如percona XtraDB cluster)结构的后端,不过ProxySQL是通过scheduler调度proxysql_galera_checker.sh脚本来支持Galera的,而且目前还没有mysql_galera_hostgroups(ProxySQL 2.0才新增该表)。 本文暂时只解释mysql_servers和mysql_replication_hostgroups,组复制相关的表在在后面介……

    SE_You 2024-03-20
    66 0 0
  • MySQL中间件之ProxySQL(5):线程、线程池、连接池

    1.ProxySQL的线程 ProxySQL由多个模块组成,是一个多线程的daemon类程序。每个模块都有一个或多个线程去执行任务。 例如,以下是刚启动ProxySQL时的进程情况,一个main进程,一个主线程,21个线程。 [root@s1 ~]# pstree | grep proxy |-proxysql---proxysql---21*[{proxysql}] 下面是正常运行时使用的线程列表: 1.1 Main thread 这其实是一个进程,该进程只负责引导、启动核心模块以及启动其它核心线程。 1.2 Admin thread 该线程负责以下几件事: 初始化并引导启动Admin接口。 从磁盘数据库或配置文件中加载配置,为ProxySQL的运行提供环境。 启动一个监听者,让其负责监听并接受到Admin接口的新连接,并为每个这样的连接创建一个新线程。 所以,每连接一次admin接口,就会新生成一个线程。每次退出admin接口时,减去一个线程。 1.3 MySQL workers mysql-threads线程负责处理MySQL流量,包括所有来自客户端的连接以及所有到后端服务器节点的连接。也就是:用少量线程处理任意多数量的连接。 MySQL workers线程在相同的端口上进行监听。当新客户端发起连接请求,其中一个MySQL worker线程将成功接受该连接,并创建一个MySQL会话(session):客户端和会话绑定在该worker线程上,直到连接断开。换句话说,在断开连接之前,某客户端的所有连接总是被同一个worker线程处理。 默认情况下,MySQL worker的线程数量为4。 mysql> select @@mysql-threads; +-----------------+ | @@mysql-threads | +-----------------+ | 4 | +-----------------+ mysql-threads变量修改后,必须重启ProxySQL才能生效,这是少有的需要重启的变量之一(另一个是mysql-stacksize)。例如,修改为8个mysql worker线程。 set mysql-threads=8; save mysql variables to disk; select * from ru……

    SE_You 2024-03-19
    32 0 0
  • MySQL中间件之ProxySQL(4):多层配置系统

    1.ProxySQL中的库 使用ProxySQL的Admin管理接口连上ProxySQL,可查看ProxySQL拥有的库。 mysql -uadmin -padmin -h127.0.0.1 -P6032 --prompt 'admin> ' admin> 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 | +-----+---------------+-------------------------------------+ 其中: main库是ProxySQL最主要的库,是需要修改配置时使用的库,它其实是一个内存数据库系统。所以,修改main库中的配置后,必须将其持久化到disk上才能永久保存。 disk库是磁盘数据库,该数据库结构和内存数据库完全一致。当持久化内存数据库中的配置时,其实就是写入到disk库中。磁盘数据库的默认路径为$DATADIR/proxysql.db。 stats库是统计信息库。这个库中的数据一般是在检索其内数据时临时填充的,它保存在内存中。因为没有相关的配置项,所以无需持久化。 monitor库是监控后端MySQL节点相关的库,该库中只有几个log类的表,监控模块收集到的监控信息全都存放到对应的log表中。 stats_history库是1.4.4版新增的库,用于存放历史统计数据。默认路径为$DATADIR/proxysql_stats.db。 ProxySQL内部使用的是SQLite3数据库,无论是内存数据库还是磁盘数据库,都是通过SQLite3引擎进行解析、操作的。它和MySQL……

    SE_You 2024-03-18
    17 0 0
  • Vue2解决跨域的3种方式

    1. 跨域的三种方式 1.1 jsonp 以前的技术,通过<script>标签跨域请求,服务器端返回的是符合js语法的函数调用,函数的形参即数据 1.2 CORS 跨域资源共享,需要服务器端进行配置 //express中配置cors const cors = require("cors") app.use(cors()) 1.3 服务器代理 (1) 通过在vue.config.js中配置proxy实现跨域 (开发阶段) (2) 通过Nginx服务器代理实现跨域 (生产阶段) ## 2. Nginx服务器代理 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器 可以实现vue项目中的跨域请求 我们真实的服务器不应该直接暴露到公网上去,否则更加容易泄露服务器的信息,也更加容易受到攻击。一个比较“平民化”的方案是使用Nginx反向代理它。 一台具有公网的Nginx服务器可以代理和它能进行内网通信的真实的服务器。让我们的服务器不直接对外暴露,增加其抗风险能力。 2.1 下载 http://nginx.org/en/download.html| nginx/Windows-1.10.3 | 2.2 nginx在windows系统中如何启动、重启、停止 在nginx文件夹中打开cmd (如果是powershell不能直接使用cmd命令: 输入cmd回车即可) //基本命令操作: nginx -v //查看nginx的版本号 start nginx //启动nginx nginx -s stop //快速停止或关闭nginx nginx -s quit //正常停止或关闭nginx nginx -s reload //配置文件nginx.conf修改重装载命令 2.3 启动nginx start nginx 在地址栏输入: localhost:80即可打开默认首页 2.4 修改前端vue项目中的url 在config.js中修改baseURL //原设置 baseURL: 'http://localhost:3000' //修改为 baseURL: '/api' 2.5 打包vue项目 npm run build 把dist文件夹放在nginx根目录 2.6 修改nginx的 conf/nginx.conf server { listen 80; #nginx服务器端口 server_name localhost; #nginx域名 location / { root dist; #首页所在文件夹 index i……

    SE_Ning 2024-03-18
    136 0 0
  • MySQL中间件之ProxySQL(3):Admin管理接口

    1.ProxySQL的Admin管理接口 当ProxySQL启动后,将监听两个端口: (1).admin管理接口,默认端口为6032。该端口用于查看、配置ProxySQL。 (2).接收SQL语句的接口,默认端口为6033,这个接口类似于MySQL的3306端口。 ProxySQL的admin管理接口是一个使用MySQL协议的接口,所以,可以直接使用mysql客户端、navicat等工具去连接这个管理接口。 例如,使用mysql客户端去连接ProxySQL的管理接口。下面使用的是管理接口的默认用户名和密码admin:admin。 mysql -uadmin -padmin -h127.0.0.1 -P6032 --prompt 'admin> ' mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 30 Server version: 5.5.30 (ProxySQL Admin Module) Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. admin> 由于ProxySQL的配置全部保存在几个自带的库中,所以通过管理接口,可以非常方便地通过发送一些SQL命令去修改ProxySQL的配置。ProxySQL会解析通过该接口发送的某些对ProxySQL有效的特定命令,并将其合理转换后发送给内嵌的SQLite3数据库引擎去运行。 例如,查看库、库中的表。 admin> show databases; +-----+---------------+-------------------------------------+ | seq | name | file | +-----+---------------+-------------------------------------+ | 0 | ma……

    SE_You 2024-03-15
    20 0 0
  • MySQL中间件之ProxySQL(2):初试读写分离

    1.实现一个简单的读写分离 这里通过一个简单的示例实现ProxySQL的读写分离功能,算是ProxySQL的快速入门。即使是快速入门,需要配置的内容也很多,包括:后端MySQL配置、监控配置、发送SQL语句的用户、SQL语句的路由规则。所以,想要实现一个ProxySQL+MySQL,即使只实现最基本的功能,步骤也是挺多的,不过配置的逻辑都很简单。 实验环境: 角色 主机IP server_id 数据状态 Proxysql 192.168.100.21 null 无 Master 192.168.100.22 110 刚安装的全新MySQL实例 Slave1 192.168.100.23 120 刚安装的全新MySQL实例 Slave2 192.168.100.24 130 刚安装的全新MySQL实例 为了演示完整的过程,这里把后端MySQL主从复制的基本配置步骤也列出来了。如了解配置过程,可跳过主从配置的部分。 注意点:slave节点需要设置read_only=1。如果后端是PXC/MGR/MariaDB Galera,则无需手动设置,因为会自动设置。   1.1 配置后端的主从复制 提供3个MySQL节点的配置文件。 # 以下是Master的配置文件 [mysqld] datadir=/data socket=/data/mysql.sock server-id=110 log-bin=/data/master-bin sync-binlog=1 log-error=/data/error.log pid-file=/data/mysqld.pid # 以下是slave1的配置文件 [mysqld] datadir=/data socket=/data/mysql.sock server-id=120 relay_log=/data/relay-log log-error=/data/error.log pid-file=/data/mysqld.pid read_only=1 # 以下是slave2的配置文件 [mysqld] datadir=/data socket=/data/mysql.sock server-id=130 relay_log=/data/relay-log log-error=/data/error.log pid-file=/data/mysqld.pid read_only=1 为3个MySQL节点提供数据目录/data mkdir /data chown -R mysql.mysql /dat……

    SE_You 2024-03-14
    48 0 0
  • MySQL中间件之ProxySQL(1):简介和安装

    1.ProxySQL简介 之前的文章里,介绍了一个MySQL的中间件:MySQL Router。详细内容参见:MySQL Router实现MySQL的读写分离。 这里准备用一个系列来详细介绍一个能实实在在用在生产环境的MySQL中间件:ProxySQL。它有两个版本:官方版和percona版,percona版是在官方版的基础上修改的,添加了几个比较实用的工具。在我这个系列文章中,我使用的是官方版。 官方站点:官方站点 官方github:官方github 官方手册:官方手册 percona ProxySQL手册:percona ProxySQL手册 我已经将ProxySQL的官方手册进行了翻译,请参见我的github wiki:ProxySQL中文手册 。我也将翻译版的markdown文件导出为了pdf,各位可下载:ProxySQL中文手册.pdf 。 ProxySQL是用C++语言开发的,虽然也是一个轻量级产品,但性能很好(据测试,能处理千亿级的数据),功能也足够,能满足中间件所需的绝大多数功能,包括: 最基本的读/写分离,且方式有多种。 可定制基于用户、基于schema、基于语句的规则对SQL语句进行路由。换句话说,规则很灵活。基于schema和与语句级的规则,可以实现简单的sharding。 可缓存查询结果。虽然ProxySQL的缓存策略比较简陋,但实现了基本的缓存功能,绝大多数时候也够用了。此外,作者已经打算实现更丰富的缓存策略。 监控后端节点。ProxySQL可以监控后端节点的多个指标,包括:ProxySQL和后端的心跳信息,后端节点的read-only/read-write,slave和master的数据同步延迟性(replication lag)。 2.安装ProxySQL 以 CentOS 的 rpm 包为例。 cat <<EOF | tee /etc/yum.repos.d/proxysql.repo [proxysql_repo] name= ProxySQL baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever gpgcheck=1 gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key EOF 然后直接安装即可。 y……

    SE_You 2024-03-13
    20 0 0