proxysql配置

 初试读写分离

 

向ProxySQL中添加MySQL节点

查看这2个节点是否插入成功,以及它们的状态。请认真读一读每个字段的名称,混个眼熟。

admin> select * from mysql_servers\G;
*************************** 1. row ***************************
       hostgroup_id: 10
           hostname: 192.168.0.21
               port: 3306
          gtid_port: 0
             status: ONLINE
             weight: 1
        compression: 0
    max_connections: 1000
max_replication_lag: 0
            use_ssl: 0
     max_latency_ms: 0
            comment: 
*************************** 2. row ***************************
       hostgroup_id: 20
           hostname: 192.168.0.22
               port: 3306
          gtid_port: 0
             status: ONLINE
             weight: 1
        compression: 0
    max_connections: 1000
max_replication_lag: 0
            use_ssl: 0
     max_latency_ms: 0
            comment: 
2 rows in set (0.001 sec)

ERROR: No query specified

 监控后端MySQL节点

添加节点之后,还需要监控后端节点。对于后端是主从复制的环境来说,这是必须的,因为ProxySQL需要通过每个节点的read_only值来自动调整它们是属于读组还是写组。

首先在后端master节点上创建一个用于监控的用户名(只需在master上创建即可,因为会复制到slave上),这个用户名只需具有USAGE权限即可。如果还需要监控复制结构中slave是否严重延迟于master(先混个眼熟:这个俗语叫做”拖后腿”,术语叫做”replication lag”),则还需具备replication client权限。这里直接赋予这个权限。

# 在master上执行:
mysql> create user monitor@'192.168.0.%' identified by 'P@ssword1!';
mysql> grant replication client on *.* to monitor@'192.168.100.%';

然后回到ProxySQL上配置监控。

set mysql-monitor_username='monitor';
set mysql-monitor_password='P@ssword1!'; 

 以上设置实际上是在修改global_variables表,它和下面两个语句是等价的:

PDATE global_variables SET variable_value='monitor'
 WHERE variable_name='mysql-monitor_username';

UPDATE global_variables SET variable_value='P@ssword1!'
 WHERE variable_name='mysql-monitor_password';

修改后,加载到RUNTIME,并保存到disk。

load mysql variables to runtime;
save mysql variables to disk;

 

验证监控结果:ProxySQL监控模块的指标都保存在monitor库的log表中。

以下是连接是否正常的监控(对connect指标的监控):(在前面可能会有很多connect_error,这是因为没有配置监控信息时的错误,配置后如果connect_error的结果为NULL则表示正常)

admin> select * from mysql_server_connect_log;
+--------------+------+------------------+-------------------------+---------------+
| hostname     | port | time_start_us    | connect_success_time_us | connect_error |
+--------------+------+------------------+-------------------------+---------------+
| 192.168.0.22 | 3306 | 1607137646702293 | 2245                    | NULL          |
| 192.168.0.21 | 3306 | 1607137647853840 | 1188                    | NULL          |
| 192.168.0.21 | 3306 | 1607137706703023 | 1178                    | NULL          |
| 192.168.0.22 | 3306 | 1607137707450275 | 2241                    | NULL          |
| 192.168.0.22 | 3306 | 1607137766703698 | 1497                    | NULL          |
| 192.168.0.21 | 3306 | 1607137767862820 | 1236                    | NULL          |
| 192.168.0.21 | 3306 | 1607137826704554 | 1458                    | NULL          |
+--------------+------+------------------+-------------------------+---------------+
20 rows in set (0.001 sec)

以下是对心跳信息的监控(对ping指标的监控):

admin> select * from mysql_server_ping_log;
+--------------+------+------------------+----------------------+------------+
| hostname     | port | time_start_us    | ping_success_time_us | ping_error |
+--------------+------+------------------+----------------------+------------+
| 192.168.0.21 | 3306 | 1607137687030736 | 406                  | NULL       |
| 192.168.0.22 | 3306 | 1607137687164044 | 827                  | NULL       |
| 192.168.0.21 | 3306 | 1607137697031017 | 137                  | NULL       |
| 192.168.0.22 | 3306 | 1607137697225592 | 761                  | NULL       |
| 192.168.0.21 | 3306 | 1607137707031923 | 414                  | NULL       |
| 192.168.0.22 | 3306 | 1607137707146555 | 752                  | NULL       |
| 192.168.0.22 | 3306 | 1607137717032382 | 685                  | NULL       |
| 192.168.0.21 | 3306 | 1607137717223605 | 379                  | NULL       |
| 192.168.0.21 | 3306 | 1607137727033259 | 439                  | NULL       |
| 192.168.0.22 | 3306 | 1607137727207258 | 295                  | NULL       |
+--------------+------+------------------+----------------------+------------+
120 rows in set (0.002 sec)

 指定写组的id为10,读组的id为20。

insert into mysql_replication_hostgroups values(10,20);

一加载,Monitor模块就会开始监控后端的read_only值,当监控到read_only值后,就会按照read_only的值将某些节点自动移动到读/写组。 

admin> select hostgroup_id,hostname,port,status,weight from mysql_servers; 
+--------------+--------------+------+--------+--------+
| hostgroup_id | hostname     | port | status | weight |
+--------------+--------------+------+--------+--------+
| 10           | 192.168.0.21 | 3306 | ONLINE | 1      |
| 20           | 192.168.0.22 | 3306 | ONLINE | 1      |
+--------------+--------------+------+--------+--------+
2 rows in set (0.001 sec)

配置mysql_users 

上面的所有配置都是关于后端MySQL节点的,现在可以配置关于SQL语句的,包括:发送SQL语句的用户、SQL语句的路由规则、SQL查询的缓存、SQL语句的重写等等。

本小节是SQL请求所使用的用户配置,例如root用户。这要求我们需要先在后端MySQL节点添加好相关用户。这里以root和sqlsender两个用户名为例。

 

ProxySQL的Admin管理接口

  • (1).admin管理接口,默认端口为6032。该端口用于查看、配置ProxySQL。
  • (2).接收SQL语句的接口,默认端口为6033,这个接口类似于MySQL的3306端口。

例如,使用mysql客户端去连接ProxySQL的管理接口。下面使用的是管理接口的默认用户名和密码admin:admin

[root@localhost ~]# mysql -uadmin -padmin -h 127.0.0.1 -P 6032 --prompt 'admin> '
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 1155
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.

admin> 

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

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 |
+-----+---------------+-------------------------------------+
5 rows in set (0.001 sec)

admin> show tables from disk;
+------------------------------------+
| tables                             |
+------------------------------------+
| global_variables                   |
| mysql_aws_aurora_hostgroups        |
| mysql_collations                   |
| mysql_galera_hostgroups            |
| mysql_group_replication_hostgroups |
| mysql_query_rules                  |
| mysql_query_rules_fast_routing     |
| mysql_replication_hostgroups       |
| mysql_servers                      |
| mysql_users                        |
| proxysql_servers                   |
| scheduler                          |
+------------------------------------+
12 rows in set (0.001 sec)

 请注意,SQLite3和MySQL使用的SQL语法有所不同,因此能在MySQL上正常运行的命令不一定能在SQLite3上运行。例如,尽管admin管理接口接收USE命令,但不会切换默认的schema,因为SQLite3不支持USE功能。
ProxySQL会尽量将MySQL语法自动调整为对应的SQLite3的语法,例如show databases;会转换为SQLite3上等价的语句。

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

和admin管理接口相关的变量

一般来说,admin接口基本不需要额外的配置,最有可能配置的是admin接口的管理员用户名、密码。

admin-admin_credentials

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

例如,添加一个myuser:myuser的用户密码对。

admin> select @@admin-admin_credentials;    # 当前用户名和密码
+---------------------------+
| @@admin-admin_credentials |
+---------------------------+
| admin:admin               |
+---------------------------+

admin> set admin-admin_credentials='admin:admin;myuser:myuser';

admin> select @@admin-admin_credentials;
+---------------------------+
| @@admin-admin_credentials |
+---------------------------+
| admin:admin;myuser:myuser |
+---------------------------+

admin> load admin variables to runtime;  # 使修改立即生效
admin> save admin variables to disk;     # 使修改永久保存到磁盘

 

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

[root@localhost ~]# mysql -umyuser -pmyuser -h 127.0.0.1 -P 6032 --prompt 'admin> '

所有的配置操作都是在修改main库中对应的表。

admin> select * from global_variables
    -> where variable_name='admin-admin_credentials';
+-------------------------+---------------------------+
| variable_name           | variable_value            |
+-------------------------+---------------------------+
| admin-admin_credentials | admin:admin;myuser:myuser |
+-------------------------+---------------------------+
1 row in set (0.005 sec)

 所以,前面的set语句和下面的update语句是等价的:

admin> update global_variables set variable_value=
    -> 'admin:admin;myuser:myuser' where variable_name='admin-admin_credentials';

 

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

  • admin管理接口的用户是连接到管理接口(默认端口6032)上用来管理、配置ProxySQL的。
  • mysql_users表中的用户名是应用程序连接ProxySQL(默认端口6033),以及ProxySQL连接后端MySQL Servers使用的用户。它的作用是发送、路由SQL语句,类似于MySQL Server的3306端口。所以,这个表中的用户必须已经在后端MySQL Server上存在且授权了。

目前ProxySQL的mysql_users中的用户既负责ProxySQL前端,又负责ProxySQL后端的连接,(作者说)未来版本中可能会将这两段连接的用户系统分开,让ProxySQL更加安全。

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

admin-stats_credentials

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

默认的普通用户名和密码为stats:stats

admin> select @@admin-stats_credentials;
+---------------------------+
| @@admin-stats_credentials |
+---------------------------+
| stats:stats               |
+---------------------------+
1 row in set (0.001 sec)

admin> set admin-stats_credentials='stats:stats;mystqts:mystats';
Query OK, 1 row affected (0.001 sec)

admin> Ctrl-C -- exit!
Aborted
[root@localhost ~]# mysql -ustats -pstats -P6032 -h127.0.0.1
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 2295
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.001 sec)

MySQL [(none)]> show tables from main;
+--------------------------------------+
| tables                               |
+--------------------------------------+
| global_variables                     |
| stats_memory_metrics                 |
| stats_mysql_commands_counters        |
| stats_mysql_connection_pool          |
| stats_mysql_connection_pool_reset    |
| stats_mysql_errors                   |
| stats_mysql_errors_reset             |
| stats_mysql_free_connections         |
| stats_mysql_global                   |
| stats_mysql_gtid_executed            |
| stats_mysql_prepared_statements_info |
| stats_mysql_processlist              |
| stats_mysql_query_digest             |
| stats_mysql_query_digest_reset       |
| stats_mysql_query_rules              |
| stats_mysql_users                    |
| stats_proxysql_servers_checksums     |
| stats_proxysql_servers_metrics       |
| stats_proxysql_servers_status        |
+--------------------------------------+
19 rows in set (0.001 sec))

 同样,这个变量中的用户必须不能存在于mysql_users表中。

admin-mysql_ifaces

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

注意,允许使用UNIX的domain socket进行监听,这样本主机内的应用程序就可以直接被处理。

例如:

SET admin-mysql_ifaces='127.0.0.1:6032;/tmp/proxysql_admin.sock'

proxysql多层配置系统

1.ProxySQL中的库

使用ProxySQL的Admin管理接口连上ProxySQL,可查看ProxySQL拥有的库。

[root@localhost ~]# mysql -uadmin -padmin -h 127.0.0.1 -P 6032 --prompt 'admin> '
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 2465
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.

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 |
+-----+---------------+-------------------------------------+
5 rows in set (0.001 sec)

其中:

  • 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的语法可能稍有不同,但ProxySQL会对不兼容的语法自动进行调整,最大程度上保证MySQL语句的有效率。

上面描述main库的时候,只是说了内存数据库需要持久化到disk库才能永久保存配置。但实际上,修改了main库中的配置后,并不会立即生效,它还需要load到runtime的数据结构中才生效,只有在runtime数据结构中的配置才是对ProxySQL当前有效的配置。请看下面的”多层配置系统”。

ProxySQL的多层配置系统

      +-------------------------+
       |         RUNTIME         |
       +-------------------------+
              /|\          |
               |           |
           [1] |       [2] |
               |          \|/
       +-------------------------+
       |         MEMORY          |
       +-------------------------+ _
              /|\          |      |\
               |           |        \
           [3] |       [4] |         \ [5]
               |          \|/         \
       +-------------------------+  +---------------+
       |          DISK           |  |  CONFIG FILE  |
       +-------------------------+  +---------------+

解释下这个3层的配置系统。

最底层的是disk库和config file。这里需要注意,这里的config file就是传统的配置文件,默认为/etc/proxysql.cnf,ProxySQL启动时,主要是从disk库中读取配置加载到内存并最终加载到runtime生效,只有极少的几个特定配置内容是从config file中加载的,除非是第一次初始化ProxySQL运行环境(或者disk库为空)。

中间层的是memory,表示的是内存数据库,其实就是main库。通过管理接口修改的所有配置,都保存在内存数据库(main)中。当ProxySQL重启或者崩溃时,这个内存数据库中的数据会丢失,所以需要save到disk库中。

最上层的是runtime,它是ProxySQL有关线程运行时读取的数据结构。换句话说,该数据结构中的配置都是已生效的配置。所以,修改了main库中的配置后,必须load到runtime数据结构中才能使其生效。

admin> show tables from disk;
+------------------------------------+
| tables                             |
+------------------------------------+
| global_variables                   |
| mysql_aws_aurora_hostgroups        |
| mysql_collations                   |
| mysql_galera_hostgroups            |
| mysql_group_replication_hostgroups |
| mysql_query_rules                  |
| mysql_query_rules_fast_routing     |
| mysql_replication_hostgroups       |
| mysql_servers                      |
| mysql_users                        |
| proxysql_servers                   |
| scheduler                          |
+------------------------------------+
12 rows in set (0.001 sec)

以下是几个示例:注意,几乎所有配置都是在admin管理接口上修改的,这也是建议的配置方式。

(1).向ProxySQL的mysql_servers表中添加了一个后端节点。

load mysql servers to runtime;    # 加载到runtime使该节点的配置生效
save mysql servers to disk;     # 将该节点的配置持久化到磁盘数据库中

上面两句和下面两句是等价的,只是操作方向不同(还使用了缩写):

load mysql servers from mem;
save mysql servers from mem;

(2).向ProxySQL的mysql_users表中添加了用于发送、处理SQL语句的用户。

load mysql users to runtime;
save mysql users to disk;

(3).修改了以admin-开头的变量。

load admin variables to runtime;
save admin variables to disk;

 启动ProxySQL时如何加载配置

如果ProxySQL是刚安装的,或者磁盘数据库文件为空(甚至不存在),或者启动ProxySQL时使用了选项--initial,这几种情况启动ProxySQL时,都会从传统配置文件config file中读取配置加载到内存数据库,并自动load到runtime数据结构、save到磁盘数据库,这是初始化ProxySQL运行环境的过程。

如果不是第一次启动ProxySQL,由于已经存在磁盘数据库文件,这时ProxySQL会从磁盘数据库中读取几乎所有的配置(即使传统配置文件中配置了某项,也不会去解析),但有3项是必须从传统配置文件中读取的。这3项是:

  • datadir:ProxySQL启动时,必须从配置文件中确定它的数据目录,因为磁盘数据库文件、日志以及其它一些文件是存放在数据目录下的。如果使用/etc/init.d/proxysql管理ProxySQL,则除了修改/etc/proxysql.cnf的datadir,还需要修改该脚本中的datadir。
  • restart_on_missing_heartbeats:MySQL线程丢失多少次心跳,就会杀掉这个线程并重启它。默认值为10。
  • execute_on_exit_failure:如果设置了该变量,ProxySQL父进程将在每次ProxySQL崩溃的时候执行已经定义好的脚本。建议使用它来生成一些崩溃时的警告和日志。注意,ProxySQL的重启速度可能只有几毫秒,因此很多其它的监控工具可能无法探测到ProxySQL的一次普通故障,此时可使用该变量。

关于传统配置文件

传统配置文件默认路径为/etc/proxysql.cnf,也可以在二进制程序proxysql上使用-c--config来手动指定配置文件。

ProxySQL的传统配置文件示例如下:浏览下即可,几乎不需要手动去配置proxysql.cnf。

 

 

 

安装proxysql

启动proxysql服务

 

配置proxysql所需要的账户

在 主库(192.168.0.21) 的MySQL 上创建 ProxySQL 的监控账户和对外访问账户

监控用户

create user 'monitor'@'192.168.0.%' identified by '123456';
grant all privileges on *.* to 'monitor'@'192.168.0.%' with grant option;

 对外访问账户

create user 'proxysql'@'192.168.0.%' identified by '123456';
grant all privileges on *.* to 'proxysql'@'192.168.0.%' with grant option;

刷新权限

flush privileges;

配置 ProxySQL 主从分组信息

     writer_hostgroup 和reader_hostgroup 写组和读组都要大于0且不能相同,我的环境下,写组定义与10,读组定义为20

MySQL [disk]> show create table mysql_replication_hostgroups\G;
*************************** 1. row ***************************
       table: mysql_replication_hostgroups
Create Table: CREATE TABLE mysql_replication_hostgroups (
    writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY,
    reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>=0),
    check_type VARCHAR CHECK (LOWER(check_type) IN ('read_only','innodb_read_only','super_read_only','read_only|innodb_read_only','read_only&innodb_read_only')) NOT NULL DEFAULT 'read_only',
    comment VARCHAR NOT NULL DEFAULT '', UNIQUE (reader_hostgroup))
1 row in set (0.001 sec)

创建组

insert into mysql_replication_hostgroups ( writer_hostgroup, reader_hostgroup, comment) values (10,20,'proxy');
load mysql servers to runtime;
save mysql servers to disk;

 查看组

MySQL [disk]> select * from main.runtime_mysql_replication_hostgroups;
+------------------+------------------+------------+---------+
| writer_hostgroup | reader_hostgroup | check_type | comment |
+------------------+------------------+------------+---------+
| 10               | 20               | read_only  | proxy   |
+------------------+------------------+------------+---------+
1 row in set (0.007 sec)

 ProxySQL 会根据server 的read _only 的取值将服务器进行分组。 read_only=0 的server,master被分到编号为10的写组,read_only=1 的server,slave则被分到编号20的读组

添加主从服务器节点

用到mysql_servers 这个表

MySQL [main]> show create table mysql_servers\G;
*************************** 1. row ***************************
       table: mysql_servers
Create Table: CREATE TABLE mysql_servers (
    hostgroup_id INT CHECK (hostgroup_id>=0) NOT NULL DEFAULT 0,
    hostname VARCHAR NOT NULL,
    port INT CHECK (port >= 0 AND port <= 65535) NOT NULL DEFAULT 3306,
    gtid_port INT CHECK (gtid_port <> port AND gtid_port >= 0 AND gtid_port <= 65535) NOT NULL DEFAULT 0,
    status VARCHAR CHECK (UPPER(status) IN ('ONLINE','SHUNNED','OFFLINE_SOFT', 'OFFLINE_HARD')) NOT NULL DEFAULT 'ONLINE',
    weight INT CHECK (weight >= 0 AND weight <=10000000) NOT NULL DEFAULT 1,
    compression INT CHECK (compression IN(0,1)) NOT NULL DEFAULT 0,
    max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000,
    max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0,
    use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0,
    max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0,
    comment VARCHAR NOT NULL DEFAULT '',
    PRIMARY KEY (hostgroup_id, hostname, port) )
1 row in set (0.001 sec)

 添加后端服务节点

 insert into mysql_servers(hostgroup_id,hostname,port) values (10,'192.168.0.21',3306);
 insert into mysql_servers(hostgroup_id,hostname,port) values (10,'192.168.0.22',3306);
 load mysql servers to runtime;
 save mysql servers to disk;

 查询后端服务节目状态

MySQL [main]> select * from mysql_servers;
+--------------+--------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| hostgroup_id | hostname     | port | gtid_port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
+--------------+--------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| 10           | 192.168.0.21 | 3306 | 0         | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
| 20           | 192.168.0.22 | 3306 | 0         | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
+--------------+--------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
2 rows in set (0.001 sec)

 ProxySQL监控 MySQL 后端节点

MySQL [monitor]> set mysql-monitor_username='monitor';
Query OK, 1 row affected (0.001 sec)

MySQL [monitor]> set mysql-monitor_password='123456';
Query OK, 1 row affected (0.000 sec)

MySQL [monitor]> load mysql variables to runtime;

MySQL [monitor]> save mysql variables to disk;

验证监控信息,ProxySQL 监控模块的指标都保存在monitor库的log表中 
以下是连接是否正常的监控,对connect指标的监控 ,在前面可能会有很多connect_error,这是因为没有配置监控信息时的错误,配置后如果connect_error的结果为NULL则表示正常

MySQL [(none)]> select * from monitor.mysql_server_connect_log;
+--------------+------+------------------+-------------------------+---------------+
| hostname     | port | time_start_us    | connect_success_time_us | connect_error |
+--------------+------+------------------+-------------------------+---------------+
| 192.168.0.21 | 3306 | 1607033681991324 | 1380                    | NULL          |
| 192.168.0.22 | 3306 | 1607033682667369 | 2617                    | NULL          |
| 192.168.0.22 | 3306 | 1607033741992060 | 2545                    | NULL          |
| 192.168.0.21 | 3306 | 1607033742611537 | 1407                    | NULL          |
| 192.168.0.21 | 3306 | 1607033801993790 | 1182                    | NULL          |
| 192.168.0.22 | 3306 | 1607033803169030 | 2597                    | NULL          |
| 192.168.0.22 | 3306 | 1607033861997550 | 2734                    | NULL          |
| 192.168.0.21 | 3306 | 1607033862757922 | 1334                    | NULL          |
| 192.168.0.22 | 3306 | 1607033921997862 | 1573                    | NULL          |
| 192.168.0.21 | 3306 | 1607033923098728 | 1315                    | NULL          |
| 192.168.0.22 | 3306 | 1607033981998827 | 3992                    | NULL          |
| 192.168.0.21 | 3306 | 1607033982703823 | 1396                    | NULL          |
| 192.168.0.22 | 3306 | 1607034041999376 | 2652                    | NULL          |
| 192.168.0.21 | 3306 | 1607034043000317 | 1222                    | NULL          |
| 192.168.0.21 | 3306 | 1607034102000061 | 1407                    | NULL          |
| 192.168.0.22 | 3306 | 1607034102991168 | 2688                    | NULL          |
| 192.168.0.22 | 3306 | 1607034107992016 | 1130                    | NULL          |
| 192.168.0.21 | 3306 | 1607034109188560 | 1493                    | NULL          |
| 192.168.0.22 | 3306 | 1607034130967707 | 2572                    | NULL          |
| 192.168.0.21 | 3306 | 1607034131697356 | 1379                    | NULL          |
| 192.168.0.22 | 3306 | 1607034169565204 | 2705                    | NULL          |
| 192.168.0.21 | 3306 | 1607034170465170 | 1436                    | NULL          |
| 192.168.0.22 | 3306 | 1607034229566634 | 2658                    | NULL          |
| 192.168.0.21 | 3306 | 1607034230439729 | 1423                    | NULL          |
+--------------+------+------------------+-------------------------+---------------+
24 rows in set (0.001 sec)

 对心跳信息的监控(对ping 指标的监控)

MySQL [(none)]> select * from mysql_server_ping_log limit 10;
+--------------+------+------------------+----------------------+------------+
| hostname     | port | time_start_us    | ping_success_time_us | ping_error |
+--------------+------+------------------+----------------------+------------+
| 192.168.0.21 | 3306 | 1607033728141486 | 427                  | NULL       |
| 192.168.0.22 | 3306 | 1607033728254914 | 12588                | NULL       |
| 192.168.0.22 | 3306 | 1607033738142454 | 881                  | NULL       |
| 192.168.0.21 | 3306 | 1607033738298155 | 407                  | NULL       |
| 192.168.0.21 | 3306 | 1607033748143508 | 404                  | NULL       |
| 192.168.0.22 | 3306 | 1607033748334895 | 867                  | NULL       |
| 192.168.0.22 | 3306 | 1607033758147693 | 962                  | NULL       |
| 192.168.0.21 | 3306 | 1607033758335872 | 401                  | NULL       |
| 192.168.0.22 | 3306 | 1607033768153043 | 919                  | NULL       |
| 192.168.0.21 | 3306 | 1607033768308729 | 391                  | NULL       |
+--------------+------+------------------+----------------------+------------+
10 rows in set (0.001 sec)

 看看read_only的日志监控

MySQL [(none)]> select * from mysql_server_read_only_log limit 10;
+--------------+------+------------------+-----------------+-----------+-------+
| hostname     | port | time_start_us    | success_time_us | read_only | error |
+--------------+------+------------------+-----------------+-----------+-------+
| 192.168.0.22 | 3306 | 1607033767443920 | 1069            | 1         | NULL  |
| 192.168.0.21 | 3306 | 1607033767460705 | 583             | 0         | NULL  |
| 192.168.0.22 | 3306 | 1607033768945522 | 1065            | 1         | NULL  |
| 192.168.0.21 | 3306 | 1607033768964507 | 565             | 0         | NULL  |
| 192.168.0.21 | 3306 | 1607033770445973 | 585             | 0         | NULL  |
| 192.168.0.22 | 3306 | 1607033770471489 | 1138            | 1         | NULL  |
| 192.168.0.22 | 3306 | 1607033771947566 | 1068            | 1         | NULL  |
| 192.168.0.21 | 3306 | 1607033771967662 | 578             | 0         | NULL  |
| 192.168.0.21 | 3306 | 1607033773447642 | 301             | 0         | NULL  |
| 192.168.0.22 | 3306 | 1607033773471472 | 1382            | 1         | NULL  |
+--------------+------+------------------+-----------------+-----------+-------+
10 rows in set (0.001 sec)

 Monitor 模块就会开始监控后端的read_only值,当监控到read_only值,就会按照read_only的值将某些节点自动移到读写组 

 

配置mysql_users 表,将proxysql用户添加到该表中。

insert into mysql_users (username,password,default_hostgroup) values ('proxysql','123456',10);
MySQL [main]> load mysql users to runtime;
MySQL [main]> save mysql users to disk;

default_hostgroup:该用户名默认的路由目标。例如,指定root用户的该字段值为10时,则使用 proxysql 用户发送的SQL语句默认情况下将路由到hostgroup_id=10 组中的某个节点。 

 

在22(从库)端,用 proxysql 用户 测试是否sql路由能默认到 hostgroup_id=10,它是一个写组(读写数据)。

[root@localhost ~]# mysql -uproxysql -p123456 -h 192.168.0.21 -P 6033
MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| tp5                |
+--------------------+
7 rows in set (0.002 sec)

MySQL [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|          21 |
+-------------+
1 row in set (0.002 sec)

在从库上用proxysql用户创建数据库查看主库上有没有创建的数据库

MySQL [(none)]> create database keme;
Query OK, 1 row affected (0.002 sec)

 

[root@localhost ~]# mysql -uroot -proot
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 24719
Server version: 10.3.27-MariaDB-log MariaDB Server

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

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

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| keme               |
| mysql              |
| performance_schema |
| test               |
| tp5                |
+--------------------+
8 rows in set (0.001 sec)

MariaDB [(none)]> 

如果想在 ProxySQL 中查看SQL请求路由信息stats_mysql_query_digest

MySQL [main]> select hostgroup,schemaname,username,digest_text,count_star from  stats_mysql_query_digest;

 

本文地址:https://blog.csdn.net/tjjingpan/article/details/110635985

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐