python实现mysql ping 获取c到s端网络延时探讨

pythonAionsky 发表了文章 • 0 个评论 • 64 次浏览 • 2018-02-05 02:14 • 来自相关话题

#!/usr/bin/env python # -*- coding:utf-8 -*-
import mysql.connector 
import time 
''' 
目的:监控app层穿透proxy层访问数据层的延时。
该脚本主要实现,mysql client 到 mysql server 的网络延时监控。
select 1 有查询消耗时间,在压力大的情况下并不精确; 
ping 本身为用于诊断 server是否存活;
两种方法都是利用 发起命令前后 时间差 得出网络延时; 
两种检测方法,可混合使用,通过两个指标差值计算 或单一指标的步差值 再算一定时段均值,可较为合理的反映出MySQL通讯网络是否正常。 
该脚本只实现功能,未做进一步优化。 
单向延时*500,双向延时*1000,不知道这个理解对不对。 
不知道整个MySQL ping 的思路是不是对的。
'''
config = { 
 'host': '127.0.0.1', 
 'user': 'root',
 'password': 'root', 
 'port': 3306, 
 'database': 'test', 
 'charset': 'utf8' } 
try: 
 cnn = mysql.connector.connect(**config) 
except mysql.connector.Error as e: 
 print('connect fails!{}'.format(e)) cursor = cnn.cursor() 
try: 
 #方法一,使用select 语句进行查询,包含查询消耗时间,当数据库压力大时,查询时间可能会变长,可能因为本身数据库压力大导致,但可以变相反应出数据库当前压力。 
 sql_query = 'select 1;' 
 #命令发起前获取时间戳 
 time1 = time.time() 
 cursor.execute(sql_query) 
 result_1 = cursor.fetchall() 
 print result_1 
 #方法2,使用 ping,mysql client发起一次对server ping 请求。本身用于探测server是否正常。
 cnn.ping(cnn) 
 #命令执行完毕后获取时间戳 
 time2 = time.time() 
 #通过发起命令前后来的时间差值来,来确定网络延时。单向延时*500,双向延时*1000 
 time_result = str(float((time2 - time1))*500) + "ms" 
 print time_result 
 
except mysql.connector.Error as e: 
 print('query error!{}'.format(e)) 
finally: 
 cursor.close() 
 cnn.close() 查看全部
#!/usr/bin/env python # -*- coding:utf-8 -*-
import mysql.connector 
import time 
''' 
目的:监控app层穿透proxy层访问数据层的延时。
该脚本主要实现,mysql client 到 mysql server 的网络延时监控。
select 1 有查询消耗时间,在压力大的情况下并不精确; 
ping 本身为用于诊断 server是否存活;
两种方法都是利用 发起命令前后 时间差 得出网络延时; 
两种检测方法,可混合使用,通过两个指标差值计算 或单一指标的步差值 再算一定时段均值,可较为合理的反映出MySQL通讯网络是否正常。 
该脚本只实现功能,未做进一步优化。 
单向延时*500,双向延时*1000,不知道这个理解对不对。 
不知道整个MySQL ping 的思路是不是对的。
'''
config = { 
 'host': '127.0.0.1', 
 'user': 'root',
 'password': 'root', 
 'port': 3306, 
 'database': 'test', 
 'charset': 'utf8' } 
try: 
 cnn = mysql.connector.connect(**config) 
except mysql.connector.Error as e: 
 print('connect fails!{}'.format(e)) cursor = cnn.cursor() 
try: 
 #方法一,使用select 语句进行查询,包含查询消耗时间,当数据库压力大时,查询时间可能会变长,可能因为本身数据库压力大导致,但可以变相反应出数据库当前压力。 
 sql_query = 'select 1;' 
 #命令发起前获取时间戳 
 time1 = time.time() 
 cursor.execute(sql_query) 
 result_1 = cursor.fetchall() 
 print result_1 
 #方法2,使用 ping,mysql client发起一次对server ping 请求。本身用于探测server是否正常。
 cnn.ping(cnn) 
 #命令执行完毕后获取时间戳 
 time2 = time.time() 
 #通过发起命令前后来的时间差值来,来确定网络延时。单向延时*500,双向延时*1000 
 time_result = str(float((time2 - time1))*500) + "ms" 
 print time_result 
 
except mysql.connector.Error as e: 
 print('query error!{}'.format(e)) 
finally: 
 cursor.close() 
 cnn.close()

关于redo log的内容

MySQLyejr 回复了问题 • 2 人关注 • 1 个回复 • 121 次浏览 • 2018-01-30 14:00 • 来自相关话题

关于insert buffer的效果

MySQLyejr 回复了问题 • 2 人关注 • 1 个回复 • 156 次浏览 • 2018-01-30 13:56 • 来自相关话题

关于大事务的max_binlog_cache_size调大

MySQLoracletomysql 回复了问题 • 2 人关注 • 1 个回复 • 116 次浏览 • 2018-01-29 17:36 • 来自相关话题

关于只读事务的一些疑惑

MySQLarron 回复了问题 • 2 人关注 • 1 个回复 • 136 次浏览 • 2018-01-24 17:49 • 来自相关话题

MYSQL占用高

回复

MySQLlamber 发起了问题 • 1 人关注 • 0 个回复 • 189 次浏览 • 2018-01-21 10:18 • 来自相关话题

MySQL双班学习遇到的问题

MySQLliyh 回复了问题 • 5 人关注 • 5 个回复 • 344 次浏览 • 2018-01-19 09:45 • 来自相关话题

Mysql CPU异常飙升

MySQLcard_2005 回复了问题 • 2 人关注 • 4 个回复 • 195 次浏览 • 2018-01-15 18:23 • 来自相关话题

对上课讲到 ProxySQL 中间件产生两个问题的反馈

MySQLwubx 回复了问题 • 2 人关注 • 1 个回复 • 146 次浏览 • 2018-01-10 11:48 • 来自相关话题

proxysql 配置疑问

MySQLhuganggang 发表了文章 • 5 个评论 • 164 次浏览 • 2018-01-10 11:25 • 来自相关话题

1.环境
192.168.1.100  主库
192.168.1.101  从库
192.168.1.102  proxysql

2.软件
mysql5.7.19
proxysql1.4.4

3.安装
下载:wget   https://github.com/sysown/prox ... 4.rpm
安装依赖:yum  install   perl-DBD-MySQL
安装proxysql:rpm  -ivh  proxysql-1.4.4-1-centos67.x86_64.rpm 
启动:service proxysql start
mysql安装、主从配置略

4.创建数据库账号
在主库创建数据库账号

业务账号
CREATE USER 'proxytest'@'%' IDENTIFIED BY 'proxytest';
GRANT USAGE ON  *.* TO 'proxytest'@'%';
监控账号
CREATE USER 'monitor'@'%' IDENTIFIED BY 'monitor';
GRANT ALL ON * . * TO 'monitor'@'%';
FLUSH PRIVILEGES;

5.配置
连接管理端口
mysql -u admin -padmin -h 127.0.0.1 -P6032

查看有没有规则,有规则delete规则,重新配置
SELECT * FROM mysql_servers;
SELECT * from mysql_replication_hostgroups;
SELECT * from mysql_query_rules;
SELECT * FROM mysql_users;

添加server和user
insert into  mysql_servers(hostgroup_id,hostname,port,max_connections)  values(0,'192.168.1.100',3307,10),(1,'192.168.1.101',3307,10);
insert into  mysql_users(username,password,active,default_hostgroup,default_schema)  values('proxytest','proxytest',1,0,'test');
注意:  mysql_users表中active要为1,否则连接不上。还有default_hostgroup 要设置为正确的值,这里设置为0,即主库,与mysql_servers中的hostgroup_id对应。
load  mysql  servers  to  runtime;
save  mysql servers  to  disk ;
load  mysql  users  to  runtime;
save  mysql users  to  disk ;

配置监控
UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';
UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_password';
load  mysql  variables   to   runtime   ;
save  mysql   variables  to  disk   ;

读写分离配置
这里我们将所有除了SELECT.*FOR UPDATE的select全部发送到slave,其他的的语句发送到master。

INSERT INTO mysql_query_rules(active,match_pattern,destination_hostgroup,apply) VALUES(1,'^SELECT.*FOR UPDATE$',0,1);
INSERT INTO mysql_query_rules(active,match_pattern,destination_hostgroup,apply) VALUES(1,'^SELECT',1,1);
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;

6.测试
连上proxysql 6033进行测试
mysql -uproxytest -pproxytest -P6033
创建测试表:
CREATE TABLE `t1` (
  `id` int(11) DEFAULT NULL,
   `name` varchar(20) DEFAULT NULL
   );

进行DML 、DDL测试操作。

我测了没有问题,这里疑问:
 1.我看官方文档proxysql 配置读写分离没有用到mysql_replication_hostgroups 表, 
https://github.com/sysown/proxysql/wiki/ProxySQL-Read-Write-Split-(HOWTO). 
 什么情况下用到?
2.mysql_query_rules规则里面如何写不区分大小写的规则,比如大写SELECT和小写
 select 会匹配一条规则。
3. proxysql高可用就是多个proxysql前面配个keepalived ? 查看全部
1.环境
192.168.1.100  主库
192.168.1.101  从库
192.168.1.102  proxysql

2.软件
mysql5.7.19
proxysql1.4.4

3.安装
下载:wget   https://github.com/sysown/prox ... 4.rpm
安装依赖:yum  install   perl-DBD-MySQL
安装proxysql:rpm  -ivh  proxysql-1.4.4-1-centos67.x86_64.rpm 
启动:service proxysql start
mysql安装、主从配置略

4.创建数据库账号
在主库创建数据库账号

业务账号
CREATE USER 'proxytest'@'%' IDENTIFIED BY 'proxytest';
GRANT USAGE ON  *.* TO 'proxytest'@'%';
监控账号
CREATE USER 'monitor'@'%' IDENTIFIED BY 'monitor';
GRANT ALL ON * . * TO 'monitor'@'%';
FLUSH PRIVILEGES;

5.配置
连接管理端口
mysql -u admin -padmin -h 127.0.0.1 -P6032

查看有没有规则,有规则delete规则,重新配置
SELECT * FROM mysql_servers;
SELECT * from mysql_replication_hostgroups;
SELECT * from mysql_query_rules;
SELECT * FROM mysql_users;

添加server和user
insert into  mysql_servers(hostgroup_id,hostname,port,max_connections)  values(0,'192.168.1.100',3307,10),(1,'192.168.1.101',3307,10);
insert into  mysql_users(username,password,active,default_hostgroup,default_schema)  values('proxytest','proxytest',1,0,'test');
注意:  mysql_users表中active要为1,否则连接不上。还有default_hostgroup 要设置为正确的值,这里设置为0,即主库,与mysql_servers中的hostgroup_id对应。
load  mysql  servers  to  runtime;
save  mysql servers  to  disk ;
load  mysql  users  to  runtime;
save  mysql users  to  disk ;

配置监控
UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';
UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_password';
load  mysql  variables   to   runtime   ;
save  mysql   variables  to  disk   ;

读写分离配置
这里我们将所有除了SELECT.*FOR UPDATE的select全部发送到slave,其他的的语句发送到master。

INSERT INTO mysql_query_rules(active,match_pattern,destination_hostgroup,apply) VALUES(1,'^SELECT.*FOR UPDATE$',0,1);
INSERT INTO mysql_query_rules(active,match_pattern,destination_hostgroup,apply) VALUES(1,'^SELECT',1,1);
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;

6.测试
连上proxysql 6033进行测试
mysql -uproxytest -pproxytest -P6033
创建测试表:
CREATE TABLE `t1` (
  `id` int(11) DEFAULT NULL,
   `name` varchar(20) DEFAULT NULL
   );

进行DML 、DDL测试操作。

我测了没有问题,这里疑问:
 1.我看官方文档proxysql 配置读写分离没有用到mysql_replication_hostgroups 表, 
https://github.com/sysown/proxysql/wiki/ProxySQL-Read-Write-Split-(HOWTO). 
 什么情况下用到?
2.mysql_query_rules规则里面如何写不区分大小写的规则,比如大写SELECT和小写
 select 会匹配一条规则。
3. proxysql高可用就是多个proxysql前面配个keepalived ?