proxysql 部署
环境:
172.17.0.5 proxysql
172.17.0.4 master
172.17.0.2 slave1
172.17.0.3 slave2
master 新建监控账号,以及管理账号:
创建连接数据库的账号 create user 'fengjian'@'172.17.0.%' identified by '123456'; grant all on *.* to 'fengjian'@'172.17.0.%' ; 创建监控账号 create user 'monitor'@'172.17.0.%' identified by 'monitor'; grant select,replication slave on *.* to 'monitor'@'172.17.0.%';
2. 设置从 配置文件 read-only super-read-only 为可读状态。
配置文件 read-only = 1 super-read-only=1
下载:
wget https://github.com/sysown/proxysql/releases/download/v2.0.10/proxysql-2.0.10-1-centos7.x86_64.rpm
安装:
yum localinstall proxysql-2.0.10-1-centos7.x86_64.rpm yum install openssl*
proxysql.con配置文件
monitor 监控账户使用 replication client 权限。
启动
systemctl start proxysql
登陆
mysql -u admin -padmin -h 127.0.0.1 -P6032
里面有4个库
main 是默认的数据库名,表里存放后端db实例、用户验证、路由规则等信息。表名以 runtime_开头的表示proxysql当前运行的配置内容,不能通过dml语句修改,只能修改对应的不以 runtime_ 开头的(在内存)里的表,然后 LOAD 使其生效, SAVE 使其存到硬盘以供下次重启加载。 disk 是持久化到硬盘的配置,sqlite数据文件。 stats 是proxysql运行抓取的统计信息,包括到后端各命令的执行次数、流量、processlist、查询种类汇总/执行时间,等等。 monitor 存储 monitor 模块收集的信息,主要是对后端db的健康/延迟检查。 Proxysql登录管理和监控界面后,不需要使用use database_name;的命令,直接查询下列表即可。
主要的表信息:
其中最重要的是 mysql_replication_hostgroups , mysql_servers,mysql_users,mysql_query_rules这4个表,其他表很少修改。这3个最重要的表的内容也可以在/etc/proxysql.conf中修改,但只是第一次初始化时有用,以后的修改和初始化信息都是存储在sqllite文件中的,建议不要对/etc/proxysql.conf做任何修改。
1. mysql_replication_hostgroups
设置 读和写库编号 1. w_database 10 2. R_database 11 use main; insert into mysql_replication_hostgroups(writer_hostgroup, reader_hostgroup) values(10,11);
mysql_servers
定义所有可用的mysql数据库IP,hostgroup_id可以自定义,只需将读和写的组设为不一样的hostgroup_id即可。
insert into mysql_servers(hostgroup_id,hostname,port,max_connections,max_replication_lag) values(10,'172.17.0.4',3306,1000,300), (11,'172.17.0.2',3306,1000), (11,'172.17.0.3',3306,1000,300);
如果 master 为read_only 和 super_read_only 那么 hostgroup_id 为 11, 需要把master 配置修改成 OFF 状态。
mysql_users
定义连接proxysql的数据库账户和密码,首先需要此账号在mysql库中存在,这里使用已经存在账号,可以看到这个账号既能连接mysql也能连接proxysql的6033端口。
insert into mysql_users(username,password,default_hostgroup,default_schema,max_connections) values('fengjian',123456,10,'T100',10000)
global_variables
查看监控的账号
select * from global_variables where variable_name like '%monitor%';
其中set mysql_monitor_write_is_also_reader = true 为主库是不是参与从库服务。
save mysql variables to disk;
load mysql variables to runtime;
最后再load并在sqlite中保存上述各种修改:
load mysql servers to runtime; load mysql users to runtime; save mysql servers to disk; save mysql users to disk;
# 如果更改了 varliables, 需要加载和保存
load mysql variables to runtime;
save mysql variables to disk;
mysql_query_rules:
定义读写分离规则,可以看到是通过正则实现的,下列定义表示除了select for update,其他的select一律转发到hostgroup_id为11的虚拟节点上,也就说读操作负载均衡的分配到17.17.0.2 172.17.0.3 三个库上。其他操作使用默认的hostgroup_id为10的库
INSERT INTO mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply) VALUES(1,1,'^SELECT.*FOR UPDATE$',10,1); INSERT INTO mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply) VALUES(2,1,'^SELECT',11,1); --load并在sqlite中保存上述修改。 load mysql query rules to runtime; save mysql query rules to disk;
测试状态:
在一台 有msql的机器上连接: mysql -h 172.17.0.5 -u fengjian -p123456 -P 6033 测试读: select @@hostname
测试for update select @@hostname for update
proxysql stats 库
show tables from stats;
1 global_variables 全局变量 2 stats_mysql_global 当前status 状态值 3 stats_mysql_commands_counters 当前操作命令的统计 4 stats_mysql_processlit 当前的连接的输出 5 stats_mysql_query_digest 6 stats_mysql_query_digest_reset 重新清空 query_digest 7 stats_mysql_query_rules 启作用的规则。
select * from stats_mysql_query_digest\G;
digest_text: CREATE INDEX k_8 ON sbtest8(k) *************************** 55. row *************************** digest_text: CREATE TABLE sbtest9( id INTEGER NOT NULL AUTO_INCREMENT, k INTEGER DEFAULT ? NOT NULL, c CHAR(?) DEFAULT ? NOT NULL, pad CHAR(?) DEFAULT ? NOT NULL, PRIMARY KEY (id) ) ENGINE = Innodb *************************** 56. row *************************** digest_text: CREATE INDEX k_7 ON sbtest7(k) *************************** 57. row *************************** digest_text: CREATE INDEX k_9 ON sbtest9(k) *************************** 58. row *************************** digest_text: CREATE INDEX k_10 ON sbtest10(k) *************************** 59. row *************************** digest_text: CREATE TABLE sbtest7( id INTEGER NOT NULL AUTO_INCREMENT, k INTEGER DEFAULT ? NOT NULL, c CHAR(?) DEFAULT ? NOT NULL, pad CHAR(?) DEFAULT ? NOT NULL, PRIMARY KEY (id) ) ENGINE = Innodb *************************** 60. row *************************** digest_text: CREATE TABLE sbtest10( id INTEGER NOT NULL AUTO_INCREMENT, k INTEGER DEFAULT ? NOT NULL, c CHAR(?) DEFAULT ? NOT NULL, pad CHAR(?) DEFAULT ? NOT NULL, PRIMARY KEY (id) ) ENGINE = Innodb
查看 stats.stats_mysql_query_digest 表结构
show create table stats.stats_mysql_query_digest stats_mysql_query_digest | CREATE TABLE stats_mysql_query_digest ( hostgroup INT, schemaname VARCHAR NOT NULL, username VARCHAR NOT NULL, client_address VARCHAR NOT NULL, digest VARCHAR NOT NULL, digest_text VARCHAR NOT NULL, count_star INTEGER NOT NULL, #访问多少次 first_seen INTEGER NOT NULL, last_seen INTEGER NOT NULL, sum_time INTEGER NOT NULL, min_time INTEGER NOT NULL, max_time INTEGER NOT NULL, sum_rows_affected INTEGER NOT NULL, sum_rows_sent INTEGER NOT NULL, PRIMARY KEY(hostgroup, schemaname, username, client_address, digest)) |
可以找到访问次数最多的sql, 清空后,看多少次请求
select sum(count_star) from stats_mysql_query_digest
做监控可以没隔一段时间获取一下 count_start 数量, 使用stats_mysql_query_digest_rest 会把stats_mysql_query_digest 清空
select * from stats_mysql_commands_counters;
命令统计测试
获取QPS,
1. t1时间 select sum(count_start) from stats_mysql_commands_counters
2. sleep(5)
3. t2 时间 select sum(count_start) from stats_mysql_commands_counters
4. qps= (t2-t1)/5
统计有多少连接
select * from stats_mysql_connection_pool;
显示主库、从库所有的 processlit
select * from stats_mysql_processlist;
proxysql monitor 库:
+--------------------------------------+ | tables | +--------------------------------------+ | mysql_server_aws_aurora_check_status | | mysql_server_aws_aurora_failovers | | mysql_server_aws_aurora_log | | mysql_server_connect_log | | mysql_server_galera_log | | mysql_server_group_replication_log | | mysql_server_ping_log | | mysql_server_read_only_log | | mysql_server_replication_lag_log | +--------------------------------------+
检查ping的,加入到proxysql 看看