数据库
首页 > 数据库> > mysql中间件proxysql

mysql中间件proxysql

作者:互联网

mysql实现读写分离的方式

mysql 实现读写分离的方式有以下几种:

读写分离原理

读写分离就是用户在发送请求时,请求经过中间件,中间件将请求中的读和写操作分辨出来将读请求发送给后端的从服务器,将写请求发送给后端的主服务器,再又主服务器通过主从复制将数据复制给其他从服务器.

ProxySQL简介

ProxySQL为MySQL的中间件,其有两个版本官方版和percona版,percona版是基于官方版基础上修改而来。ProxySQL是由C++语言开发,轻量级但性能优异(支持处理千亿级数据),其具有中间件所需要的绝大多数功能,如:

官方站点:https://proxysql.com/ 官方手册:https://github.com/sysown/proxysql/wiki

ProxySQL安装

[root@localhost ~]# yum -y install http://repo.proxysql.com/ProxySQL/proxysql-2.1.x/centos/8/proxysql-2.1.1-1-centos8.x86_64.rpm

#安装后生成的文件
[root@localhost ~]# rpm -ql proxysql
/etc/logrotate.d/proxysql
/etc/proxysql.cnf
/etc/systemd/system/proxysql-initial.service
/etc/systemd/system/proxysql.service
/usr/bin/proxysql
/usr/lib/.build-id
/usr/lib/.build-id/35
/usr/lib/.build-id/35/7b92aa992a41d607f1fcb3718656bf90e48bed
/usr/share/proxysql/tools/proxysql_galera_checker.sh
/usr/share/proxysql/tools/proxysql_galera_writer.pl

 ProxySQL的Admin管理接口

当 ProxySQL 启动后,将监听两个端口:


ProxySQL 的 admin 管理接口是一个使用 MySQL 协议的接口,所以,可以直接使用 mysql 客户端、navicat 等工具去连接这个管理接口,其默认的用户名和密码均为 admin

 

ProxySQL内置数据库

[root@localhost ~]# mysql -uadmin -padmin -P6032 -h127.0.0.1

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 |
+-----+---------------+-------------------------------------+

由于 ProxySQL 的配置全部保存在几个自带的库中,所以通过管理接口,可以非常方便地通过发送一些SQL命令去修改 ProxySQL 的配置。 ProxySQL 会解析通过该接口发送的某些对ProxySQL 有效的特定命令,并将其合理转换后发送给内嵌的 SQLite3 数据库引擎去运行

ProxySQL 的配置几乎都是通过管理接口来操作的,通过 Admin 管理接口,可以在线修改几乎所有的配置并使其生效。只有两个变量的配置是必须重启 ProxySQL 才能生效的,它们是:mysql-threads 和 mysql-stacksize

其中:

ProxySQL 内部使用的是 SQLite3 数据库,无论是内存数据库还是磁盘数据库,都是通过SQLite3引 擎进行解析、操作的。它和 MySQL 的语法可能稍有不同,但ProxySQL会对不兼容的语法自动进行调整,最大程度上保证MySQL语句的有效率。
上面描述main库的时候,只是说了内存数据库需要持久化到disk库才能永久保存配置。但实际上,修改了main库中的配置后,并不会立即生效,它还需要load到runtime的数据结构中才生效,只有在runtime数据结构中的配置才是对ProxySQL当前有效的配置。

 

ProxySQL main库内的表

MySQL [(none)]> show tables;
+----------------------------------------------------+
| tables                                             |
+----------------------------------------------------+
| global_variables                                   |
| mysql_aws_aurora_hostgroups                        |
| mysql_collations                                   |
| mysql_firewall_whitelist_rules                     |
| mysql_firewall_whitelist_sqli_fingerprints         |
| mysql_firewall_whitelist_users                     |
| mysql_galera_hostgroups                            |
| mysql_group_replication_hostgroups                 |
| mysql_query_rules                                  |
| mysql_query_rules_fast_routing                     |
| mysql_replication_hostgroups                       |
| mysql_servers                                      |
| mysql_users                                        |
| proxysql_servers                                   |
| restapi_routes                                     |
| runtime_checksums_values                           |
| runtime_global_variables                           |
| runtime_mysql_aws_aurora_hostgroups                |
| runtime_mysql_firewall_whitelist_rules             |
| runtime_mysql_firewall_whitelist_sqli_fingerprints |
| runtime_mysql_firewall_whitelist_users             |
| runtime_mysql_galera_hostgroups                    |
| runtime_mysql_group_replication_hostgroups         |
| runtime_mysql_query_rules                          |
| runtime_mysql_query_rules_fast_routing             |
| runtime_mysql_replication_hostgroups               |
| runtime_mysql_servers                              |
| runtime_mysql_users                                |
| runtime_proxysql_servers                           |
| runtime_restapi_routes                             |
| runtime_scheduler                                  |
| scheduler                                          |
+----------------------------------------------------+
32 rows in set (0.000 sec)

 main库中的表分为runtime开头和非runtime开头, runtime开头为运行时的设置 ,非runtime开头为需要设置的配置 ,所有的配置修改后需要执行命令才能加载到runtime生效。

LOAD ...  TO RUNTIME;  #使修改立即生效
SAVE  ...  TO DISK;    #使修改永久保存到磁盘

 

和admin管理接口相关的变量

admin-admin_credentials:控制的是admin管理接口的管理员账户。默认的管理员账户和密码为admin:admin,但是这个默认的用户只能在本地使用。如果想要远程连接到ProxySQL,例如用windows上的navicat连接Linux上的ProxySQL管理接口,必须自定义一个管理员账户。

#查看当前用户
MySQL [(none)]> show variables like 'admin_admin_%';
+-------------------------+-------------+
| Variable_name           | Value       |
+-------------------------+-------------+
| admin-admin_credentials | admin:admin |
+-------------------------+-------------+

#添加管理员账号密码
MySQL [(none)]> set admin-admin_credentials='admin:admin;TestUser:123';
Query OK, 1 row affected (0.000 sec)

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

MySQL [(none)]> save  admin variables to disk;
Query OK, 43 rows affected (0.004 sec)

 修改后,就可以使用该用户名和密码连接管理接口

[root@localhost ~]# mysql -uTestUser -p123 -P6032 -h192.168.248.21
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)]>

 

必须要区分admin管理接口的用户名和mysql_users中的用户名

admin管理接口的用户必须不能存在于mysql_users中,这是出于安全的考虑,防止通过admin管理接口用户猜出mysql_users中的用户

 

admin-stats_credentials:控制admin管理接口的普通用户,这个变量中的用户没有超级管理员权限,只能查看monitor库和main库中关于统计的数据,其它库都是不可见的,且没有任何写权限。

默认的普通用户名和密码均为 stats ,与admin一样,它默认也只能用于本地登录,若想让人远程查看则要添加查看的专有用户。

MySQL [(none)]> select @@admin-stats_credentials;
+---------------------------+
| @@admin-stats_credentials |
+---------------------------+
| stats:stats               |
+---------------------------+

#添加专有用户
MySQL [(none)]> set admin-stats_credentials='admin:admin;mystats:123';
Query OK, 1 row affected (0.00 sec)

MySQL [(none)]> select @@admin-stats_credentials;
+---------------------------+
| @@admin-stats_credentials |
+---------------------------+
| stats:stats;mystats:123   |
+---------------------------+
1 row in set (0.001 sec)

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

MySQL [(none)]> save admin variables to disk;
Query OK, 43 rows affected (0.001 sec)

 同样,这个变量中的用户必须不能存在于mysql_users表中
使用mystats用户远程连接查看

[root@localhost ~]# mysql -umystats -p123 -P6032 -h192.168.248.21
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
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   | monitor       |                                     |
| 3   | stats_history | /var/lib/proxysql/proxysql_stats.db |
+-----+---------------+-------------------------------------+
3 rows in set (0.000 sec)

 

admin-mysql_ifaces:指定admin接口的监听地址,格式为冒号分隔的hostname:port列表。默认监听在 0.0.0.0:6032

 

MySQL [(none)]> show variables like 'admin-mysql%';
+--------------------+--------------+
| Variable_name      | Value        |
+--------------------+--------------+
| admin-mysql_ifaces | 0.0.0.0:6032 |
+--------------------+--------------+

#修改监听在6000
MySQL [(none)]> set admin-mysql_ifaces='0.0.0.0:6000';
Query OK, 1 row affected (0.000 sec)

MySQL [(none)]> show variables like 'admin-mysql%';
+--------------------+--------------+
| Variable_name      | Value        |
+--------------------+--------------+
| admin-mysql_ifaces | 0.0.0.0:6000 |
+--------------------+--------------+
1 row in set (0.000 sec)

MySQL [(none)]> load variables admin to runtime; 
ERROR 1045 (28000): ProxySQL Admin Error: near "load": syntax error
MySQL [(none)]> load  admin variables  to runtime; 
Query OK, 0 rows affected (0.001 sec)

MySQL [(none)]> save  admin variables  to disk; 
Query OK, 43 rows affected (0.001 sec)

[root@localhost ~]# ss -antl
State          Recv-Q          Send-Q                      Local Address:Port                     Peer Address:Port          
LISTEN         0               128                               0.0.0.0:22                            0.0.0.0:*             
LISTEN         0               128                               0.0.0.0:6000                          0.0.0.0:*             
LISTEN         0               128                               0.0.0.0:6033                          0.0.0.0:*             
LISTEN         0               128                               0.0.0.0:6033                          0.0.0.0:*             
LISTEN         0               128                               0.0.0.0:6033                          0.0.0.0:*             
LISTEN         0               128                               0.0.0.0:6033                          0.0.0.0:* 

 

 mysql-interfaces:指定远程接口的监听地址,格式为冒号分隔的hostname:port列表。默认监听在 0.0.0.0:6033

MySQL [(none)]> show variables like '%interfaces%';
+------------------+--------------+
| Variable_name    | Value        |
+------------------+--------------+
| mysql-interfaces | 0.0.0.0:6033 |
+------------------+--------------+
1 row in set (0.000 sec)

MySQL [(none)]> set mysql-interfaces='0.0.0.0:3306';
Query OK, 1 row affected (0.000 sec)

MySQL [(none)]> show variables like '%interfaces%';
+------------------+--------------+
| Variable_name    | Value        |
+------------------+--------------+
| mysql-interfaces | 0.0.0.0:3306 |
+------------------+--------------+
1 row in set (0.000 sec)

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

[root@localhost ~]# systemctl restart proxysql

[root@localhost ~]# ss -antl
State          Recv-Q          Send-Q                      Local Address:Port                     Peer Address:Port          
LISTEN         0               128                               0.0.0.0:22                            0.0.0.0:*             
LISTEN         0               128                               0.0.0.0:3306                          0.0.0.0:*             
LISTEN         0               128                               0.0.0.0:3306                          0.0.0.0:*             
LISTEN         0               128                               0.0.0.0:3306                          0.0.0.0:*             
LISTEN         0               128                               0.0.0.0:3306                          0.0.0.0:*             
LISTEN         0               128                               0.0.0.0:6000                          0.0.0.0:*   

 

标签:中间件,admin,0.0,mysql,proxysql,ProxySQL,MySQL
来源: https://www.cnblogs.com/diqiyao/p/14842573.html