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-threads
和mysql-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