暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL中间件ProxySQL介绍

运维特工 2018-07-15
504

一、ProxySQL介绍

ProxySQL 是一个高性能的SQL 代理。ProxySQL有一个高级多核体系结构。支持数十万并发连接,可以多路复用到后端服务器上。

作为守护进程运行。而且有一个进程监视这个守护进程,并在守护进程崩溃时重启守护进程,以减少停机时间。这个守护进程接受来自MySQL客户端的请求,并将其转发到后端的MySQL服务器上。

ProxySQL被设计为可以连续运行而且不需要重启。大多数配置可以在运行时使用类似SQL语句的查询完成。

二、ProxySQL三层配置介绍

ProxySQL有一个复杂但易于使用的配置系统,该系统主要分三个层次,三层配置有以下好处:

  • 允许使用管理接口对配置进行简单的自动更新;

  • 允许在运行时修改尽可能多的配置项,而不重新启动守护进程;

  • 允许简单地回滚错误的配置;

ProxySQL配置通过一个多层配置系统实现的,其中的设置从一个层移动到另一个层。配置系统的三层如下图所示:

  1. +-------------------------+

  2. |         RUNTIME         |

  3. +-------------------------+

  4.       /|\          |

  5.        |           |

  6.    [1] |       [2] |

  7.        |          \|/

  8. +-------------------------+

  9. |         MEMORY          |

  10. +-------------------------+ _

  11.       /|\          |      |\

  12.        |           |        \

  13.    [3] |       [4] |         \ [5]

  14.        |          \|/         \

  15. +-------------------------+  +-------------------------+

  16. |          DISK           |  |       CONFIG FILE       |

  17. +-------------------------+  +-------------------------+

RUNTIME: 代表的是ProxySQL当前生效的正在使用的配置。我们无法直接修改这里的配置,必须要从下一层LOAD进来。RUNTIME这个层级,就是ProxySQL运行中正在使用的配置,所以我们把修改的配置Load到RUNTIME层时,一定要慎重操作。

MEMORY: 可以认为是SQLite数据库在内存中的镜像。该数据库通过与mysql兼容的接口,用户可以使用MySQL客户端通过admin接口连接到这里来修改的 main 里头配置。MEMORY这个中间层,上面接着生产配置项RUNTIME,下面接着持久化层DISK,CONFIG FILE。MEMORY也是我们修改ProxySQL的唯一正常入口。我们平时修改一个配置,先改MEMORY,确认无误后再LOAD到生产(RUNTIME),并且持久化到磁盘(DISK)。MEMORY里面的配置随便改,不影响生产,也不影响磁盘中保存的数据。

DISK / CONFIG FILE:DISK和CONFIG FILE这一层是持久层。配置SAVE到这里表示进行了持久存储,保存到SQLITE数据库中,默认保存路径$(DATADIR)/proxysql.db,在重启的时候会从硬盘里加载。 /etc/proxysql.cnf文件只在第一次初始化的时候用到,完了后,如果要修改监听端口,还是需要在管理命令行里修改,再 save 到硬盘。在重启ProxySQL时,如果内存中的配置未进行持久存储到硬盘,那么内存中配置将会丢失,因此将配置持久化到磁盘是很重要的事情。

说明:ProxySQL配置系统,三层都是互相独立的,proxysql的每一个配置项在三层中都存在。可能三份配置都一样,也可能三份配置都不一样。 当ProxySQL启动时,首先读取配置文件 CONFIG FILE(/etc/proxysql.cnf)
,然后从该配置文件中获取 datadir
, datadir
中存储的是SQLITE的数据目录。如果该目录存在,且SQLITE数据文件存在,就正常启动,并将SQLITE数据库中的配置项读进内存,并且加载进RUNTIME,用于初始化ProxySQL的运行。如果 datadir
目录下没有SQLITE的数据文件,ProxySQL就会使用 /etc/proxysql.cnf
中的配置来初始化ProxySQL,并且将这些配置保存至SQLITE数据库。

我们一定要清楚,修改配置时我们是直接操作的 MEMORAYmain

下面我们使用操作mysql_users来解释一下三层的操作。(序号对应上图)

  1. [1] LOAD MYSQL USERS FROM MEMORY / LOAD MYSQL USERS TO RUNTIME

  2. loads MySQL users from the in-memory database to the runtime data structures

  3. [2] SAVE MYSQL USERS TO MEMORY / SAVE MYSQL USERS FROM RUNTIME

  4. persists the MySQL users from the runtime data structures to the in-memory database

  5. [3] LOAD MYSQL USERS TO MEMORY / LOAD MYSQL USERS FROM DISK

  6. loads MySQL users from the on-disk database to the in-memory database

  7. [4] SAVE MYSQL USERS FROM MEMORY / SAVE MYSQL USERS TO DISK

  8. persists the MySQL users from the in-memory database to the on-disk database

  9. [5] LOAD MYSQL USERS FROM CONFIG

  10. loads from the configuration file the users into the in-memory database

具体可以看官方文档,解释特别详细 https://github.com/sysown/proxysql/blob/master/doc/configuration_system.md 其实总的规则就是两条: 想要配置生效(active)必须load进RUNTIME中:

  1. LOAD MYSQL USERS TO RUNTIME

要持久化,必需SAVE进DISK:

  1. LOAD MYSQL USERS TO RUNTIME

三、安装ProxySQL

1.下载安装

  1. # wget  https://github.com/sysown/proxysql/releases/download/v1.4.9/proxysql-1.4.9-1-centos7.x86_64.rpm

  2. # rpm -ivh proxysql-1.4.9-1-centos7.x86_64.rpm

启动:

  1. # systemctl start proxysql.service

  2. # systemctl status proxysql.service

  3. proxysql.service - LSB: High Performance Advanced Proxy for MySQL

  4.   Loaded: loaded (/etc/rc.d/init.d/proxysql; bad; vendor preset: disabled)

  5.   Active: active (running) since Fri 2018-07-13 17:37:19 CST; 6s ago

  6.     Docs: man:systemd-sysv-generator(8)

  7.  Process: 3137 ExecStart=/etc/rc.d/init.d/proxysql start (code=exited, status=0/SUCCESS)

  8.   CGroup: /system.slice/proxysql.service

  9.           ├─3141 proxysql -c /etc/proxysql.cnf -D /var/lib/proxysql

  10.           └─3142 proxysql -c /etc/proxysql.cnf -D /var/lib/proxysql


  11. Jul 13 17:37:19 db-node4 systemd[1]: Starting LSB: High Performance Advanced Proxy for MySQL...

  12. Jul 13 17:37:19 db-node4 proxysql[3137]: Starting ProxySQL: DONE!

  13. Jul 13 17:37:19 db-node4 systemd[1]: Started LSB: High Performance Advanced Proxy for MySQL.

2.ProxySQL文件说明

通过查看状态信息,可以知道数据目录在/var/lib/proxysql/,配置文件为:/etc/proxysql.cnf

  1. #  ll /var/lib//proxysql/

  2. total 392

  3. -rw------- 1 root root 122880 Jul 13 17:37 proxysql.db

  4. -rw------- 1 root root   3514 Jul 13 17:37 proxysql.log

  5. -rw-r--r-- 1 root root      5 Jul 13 17:37 proxysql.pid

  6. -rw------- 1 root root 110592 Jul 13 17:39 proxysql_stats.db


  7. # ll /etc/proxysql.cnf

  8. -rw-r--r-- 1 root root 4517 May 30 18:31 /etc/proxysql.cnf

3.ProxySQL进程说明

  1. # ps -ef|grep proxysql  

  2. root      3141     1  0 Jul13 ?        00:00:00 proxysql -c /etc/proxysql.cnf -D /var/lib/proxysql

  3. root      3142  3141  0 Jul13 ?        00:01:06 proxysql -c /etc/proxysql.cnf -D /var/lib/proxysql

PID为3141的进程,是3142进程的父进程,父进程负责监控子进程,如果子进程挂了,那么父进程会把子进程启动。子进程负责处理正在的任务。

4.ProxySQL接口说明

ProxySQL是有管理接口和客户端接口,通过配置文件/etc/proxysql.cnf可以看到管理和客户端

ProxySQL管理接口

  1. admin_variables=

  2. {

  3.        admin_credentials="admin:admin"

  4. #       mysql_ifaces="127.0.0.1:6032;/tmp/proxysql_admin.sock"

  5.        mysql_ifaces="0.0.0.0:6032"

  6. #       refresh_interval=2000

  7. #       debug=true

  8. }

ProxySQL客户端操作MySQL接口

  1. mysql_variables=

  2. {

  3.        threads=4

  4.        max_connections=2048

  5.        default_query_delay=0

  6.        default_query_timeout=36000000

  7.        have_compress=true

  8.        poll_timeout=2000

  9. #       interfaces="0.0.0.0:6033;/tmp/proxysql.sock"

  10.        interfaces="0.0.0.0:6033"

  11.        default_schema="information_schema"

  12.        stacksize=1048576

  13.        server_version="5.5.30"

  14.        connect_timeout_server=3000

  15. # make sure to configure monitor username and password

  16. # https://github.com/sysown/proxysql/wiki/Global-variables#mysql-monitor_username-mysql-monitor_password

  17.        monitor_username="monitor"

  18.        monitor_password="monitor"

  19.        monitor_history=600000

  20.        monitor_connect_interval=60000

  21.        monitor_ping_interval=10000

  22.        monitor_read_only_interval=1500

  23.        monitor_read_only_timeout=500

  24.        ping_interval_server_msec=120000

  25.        ping_timeout_server=500

  26.        commands_stats=true

  27.        sessions_sort=true

  28.        connect_retries_on_failure=10

  29. }

通过上面的信息可以看到管理接口的端口是6032,账号密码是admin(可以动态修改)只能通过本地连接。客户端接口的端口是6033,账号密码通过管理接口去设置。

参考文档

https://github.com/sysown/proxysql/wiki

http://www.proxysql.com/

https://github.com/sysown/proxysql/tree/master/doc

http://www.proxysql.com/blog/proxysql-gtid-causal-reads

https://www.percona.com/doc/percona-xtradb-cluster/LATEST/howtos/proxysql.html

http://seanlook.com/2017/04/10/mysql-proxysql-install-config/

http://www.fordba.com/mysql_proxysql.html

http://www.fordba.com/mysql_proxysql_rw_split.html

本文出自 “运维特工” 博客,转载请务必保留原文链接 和 http://www.unixfbi.com


文章转载自运维特工,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论