欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

proxysql配置

程序员文章站 2022-06-23 08:59:30
安装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;对外访问账户c......

 初试读写分离

 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