MySQL数据库(十八)_ProxySQL

By | 2019年 11月 23日

MySQL读写分离

读写分离案例:

mysql-proxy:Oracle,https://downloads.mysql.com/archives/proxy/
Atlas:Qihoo,https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md
dbproxy:美团,https://github.com/Meituan-Dianping/DBProxy
Cetus:网易乐得,https://github.com/Lede-Inc/cetus
Amoeba:https://sourceforge.net/projects/amoeba/
Cobar:阿里巴巴,Amoeba的升级版
Mycat:基于Cobar, http://www.mycat.io/
ProxySQL:https://proxysql.com/

ProxySQL

ProxySQL: MySQL中间件
两个版本:官方版和percona版,percona版是基于官方版基础上修改
C++语言开发,轻量级但性能优异(支持处理千亿级数据)
官方站点:https://proxysql.com/
官方手册:https://github.com/sysown/proxysql/wiki

具有中间件所需的绝大多数功能,包括:

多种方式的读/写分离
定制基于用户、基于schema、基于语句的规则对SQL语句进行路由
缓存查询结果
后端节点监控

ProxySQL安装

  1. 准备:
    实现读写分离前,先实现主从复制
    注意:slave节点需要设置read_only=1
  2. 基于YUM仓库安装
cat <<EOF | tee /etc/yum.repos.d/proxysql.repo
    [proxysql_repo]
    name= ProxySQL YUM repository
    baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever
    gpgcheck=1
    gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
    EOF
  1. 基于RPM下载安装:https://github.com/sysown/proxysql/releases
  2. ProxySQL组成:
    服务脚本:/etc/init.d/proxysql
    配置文件:/etc/proxysql.cnf
    主程序:/usr/bin/proxysql
    基于SQLITE的数据库文件:/var/lib/proxysql/
  3. 启动ProxySQL:service proxysql start
    启动后会监听两个默认端口
    6032:ProxySQL的管理端口
    6033:ProxySQL对外提供服务的端口
  4. 使用mysql客户端连接到ProxySQL的管理接口6032,默认管理员用户和密码都是admin:
mysql -uadmin -padmin -P6032 -h127.0.0.1

ProxySQL实现读写分离

详细的实验:MySQL数据库_ProxySQL实验

  1. main 是默认的”数据库”名,表里存放后端db实例、用户验证、路由规则等信息。
  2. runtime_ 的表开头的表示proxysql当前运行的配置内容,不能通过dml语句修改,只能修改对应的不以 runtime_ 开头的(在内存)里的表,
  3. 然后 LOAD 使其生效,
  4. SAVE 使其存到硬盘以供下次重启加载
  5. disk 是持久化到硬盘的配置,sqlite数据文件
  6. stats 是proxysql运行抓取的统计信息,包括到后端各命令的执行次数、流量、processlist、查询种类汇总/执行时间,等等
  7. monitor库 存储 monitor 模块收集的信息,主要是对后端db的健康/延迟检查
  • 说明:
    在main和monitor数据库中的表,runtime_开头的是运行时的配置,不能修改,只能修改非runtime_表,修改后必须执行LOAD … TO RUNTIME才能加载到RUNTIME生效
    执行save … to disk 才将配置持久化保存到磁盘,即保存在proxysql.db文件中global_variables 有许多变量可以设置,其中就包括监听的端口、管理账号等参考: https://github.com/sysown/proxysql/wiki/Global-variables
  • 向ProxySQL中添加MySQL节点,以下操作不需要use main也可成功
  • 添加监控后端节点的用户。ProxySQL通过每个节点的read_only值来自动调整它们是属于读组还是写组
  • ProxySQL上配置监控
  • 监控模块的指标保存在monitor库的log表中
  • 查看监控连接是否正常的 (对connect指标的监控)
  • 设置分组信息
  • 配置发送SQL语句的用户

在master节点上创建访问用户

在ProxySQL配置,将用户sqluser添加到mysql_users表中, default_hostgroup默认组设置为写组10,当读写分离的路由规则不符合时,会访问默认组的数据库

  • 使用sqluser用户测试是否能路由到默认的10写组实现读、写数据
  • 在proxysql上配置路由规则,实现读写分离
    与规则有关的表:mysql_query_rules和mysql_query_rules_fast_routing,后者是前者的扩展表,1.4.7之后支持
  • 插入路由规则:将select语句分离到20的读组,select语句中有一个特殊语句SELECT...FOR UPDATE它会申请写锁,应路由到10的写组

注意:因ProxySQL根据rule_id顺序进行规则匹配,select ... for update规则的rule_id必须要小于普通的select规则的rule_id

  • 测试读操作是否路由给20的读组
    mysql -usqluser -pmagedu -P6033 -h127.0.0.1 -e 'select @@server_id'
  • 测试写操作,以事务方式进行测试
  • 路由的信息:查询stats库中的stats_mysql_query_digest表

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注