如何为 mysql 连续生成假实时数据?
How to generate fake real time data continously for mysql?
其实我需要在MySQL的grafana中可视化实时数据。我最初使用 seed_python 文件生成随机数,但现在我想在 MySQL
中有连续值
这是我最初使用的 python 代码
POSSIBLE_STATES = ['ACTIVE', 'INACTIVE']
class MySqlSeeder:
def __init__(self):
config = {
'user': 'root',
'password': 'something',
'host': '192.168.99.100' if script_runs_within_container() else 'localhost',
'port': '3306',
'database': 'team'
}
while not hasattr(self, 'connection'):
try:
self.connection = mysql.connector.connect(**config)
self.cursor = self.connection.cursor()
except InterfaceError:
print("MySQL Container has not started yet. Sleep and retry...")
time.sleep(1)
def seed(self):
print("Clearing old data...")
self.drop_user_table()
print("Start seeding...")
self.create_user_table()
self.insert_users()
self.connection.commit()
self.cursor.close()
self.connection.close()
print("Done")
def create_user_table(self):
sql = '''
CREATE TABLE users(
id INT PRIMARY KEY AUTO_INCREMENT,
number INT
);
'''
self.cursor.execute(sql)
def insert_users(self):
for _ in range(300):
sql = '''
INSERT INTO users (number)
VALUES (%(number)s);
'''
user_data = {
'number': random.randint(1,100)
}
self.cursor.execute(sql, user_data)
def drop_user_table(self):
self.cursor.execute('DROP TABLE IF EXISTS users;')
def script_runs_within_container():
with open('/proc/1/cgroup', 'r') as cgroup_file:
return 'docker' in cgroup_file.read()
MySqlSeeder().seed()
下面是 docker-compose 文件
version: '3.3'
services:
mysql:
image: mysql:latest
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: something
grafana:
image: grafana/grafana
restart: always
ports:
- "3000:3000"
depends_on:
- mysql
mysql_seeding:
build: ./DockerFiles
depends_on:
- mysql
volumes:
grafana-storage:
db_data:
执行连续实时数据生成的最佳方法是什么?
我想您想要一个 table 包含每隔一段时间生成的随机数据。这里有这样一个table。每一行都有一个id,一个叫做ts的时间戳,和两个浮点值va1,val2。
CREATE OR REPLACE TABLE realtime (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
val1 FLOAT NOT NULL DEFAULT '0.0',
val2 FLOAT NOT NULL DEFAULT '0.0',
PRIMARY KEY (id),
INDEX time_vals (ts, val1, val2)
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB;
然后,您需要一种方法来每隔一段时间向 table 中插入一个新行。这是用 MySQL EVENT object 完成的。这是一个将数据放入 realtime
table 的示例,我刚刚定义了每分钟十次(每六秒)。
它还会删除超过一天的行,因此如果您忘记禁用或删除计时器,您的数据库将不会被随机无用的垃圾完全淹没。
ts
上的索引加速了 DELETE 操作。
DELIMITER //
CREATE OR REPLACE EVENT `random_realtime`
ON SCHEDULE
EVERY 6 SECOND
ON COMPLETION PRESERVE
ENABLE
COMMENT 'Generating random timeseries test data. Please delete me in production.'
DO BEGIN
INSERT INTO realtime (val1, val2) VALUES (RAND(), RAND());
DELETE FROM realtime WHERE ts <= NOW() - INTERVAL 1 DAY;
END//
DELIMITER ;
最后,您需要告诉 MySQL 安排您的活动。这个命令就是这样做的。
SET GLOBAL event_scheduler=ON;
您可以将这三个查询放入 Python 程序的初始化中,您目前在其中定义 table.
其实我需要在MySQL的grafana中可视化实时数据。我最初使用 seed_python 文件生成随机数,但现在我想在 MySQL
中有连续值这是我最初使用的 python 代码
POSSIBLE_STATES = ['ACTIVE', 'INACTIVE']
class MySqlSeeder:
def __init__(self):
config = {
'user': 'root',
'password': 'something',
'host': '192.168.99.100' if script_runs_within_container() else 'localhost',
'port': '3306',
'database': 'team'
}
while not hasattr(self, 'connection'):
try:
self.connection = mysql.connector.connect(**config)
self.cursor = self.connection.cursor()
except InterfaceError:
print("MySQL Container has not started yet. Sleep and retry...")
time.sleep(1)
def seed(self):
print("Clearing old data...")
self.drop_user_table()
print("Start seeding...")
self.create_user_table()
self.insert_users()
self.connection.commit()
self.cursor.close()
self.connection.close()
print("Done")
def create_user_table(self):
sql = '''
CREATE TABLE users(
id INT PRIMARY KEY AUTO_INCREMENT,
number INT
);
'''
self.cursor.execute(sql)
def insert_users(self):
for _ in range(300):
sql = '''
INSERT INTO users (number)
VALUES (%(number)s);
'''
user_data = {
'number': random.randint(1,100)
}
self.cursor.execute(sql, user_data)
def drop_user_table(self):
self.cursor.execute('DROP TABLE IF EXISTS users;')
def script_runs_within_container():
with open('/proc/1/cgroup', 'r') as cgroup_file:
return 'docker' in cgroup_file.read()
MySqlSeeder().seed()
下面是 docker-compose 文件
version: '3.3'
services:
mysql:
image: mysql:latest
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: something
grafana:
image: grafana/grafana
restart: always
ports:
- "3000:3000"
depends_on:
- mysql
mysql_seeding:
build: ./DockerFiles
depends_on:
- mysql
volumes:
grafana-storage:
db_data:
执行连续实时数据生成的最佳方法是什么?
我想您想要一个 table 包含每隔一段时间生成的随机数据。这里有这样一个table。每一行都有一个id,一个叫做ts的时间戳,和两个浮点值va1,val2。
CREATE OR REPLACE TABLE realtime (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
val1 FLOAT NOT NULL DEFAULT '0.0',
val2 FLOAT NOT NULL DEFAULT '0.0',
PRIMARY KEY (id),
INDEX time_vals (ts, val1, val2)
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB;
然后,您需要一种方法来每隔一段时间向 table 中插入一个新行。这是用 MySQL EVENT object 完成的。这是一个将数据放入 realtime
table 的示例,我刚刚定义了每分钟十次(每六秒)。
它还会删除超过一天的行,因此如果您忘记禁用或删除计时器,您的数据库将不会被随机无用的垃圾完全淹没。
ts
上的索引加速了 DELETE 操作。
DELIMITER //
CREATE OR REPLACE EVENT `random_realtime`
ON SCHEDULE
EVERY 6 SECOND
ON COMPLETION PRESERVE
ENABLE
COMMENT 'Generating random timeseries test data. Please delete me in production.'
DO BEGIN
INSERT INTO realtime (val1, val2) VALUES (RAND(), RAND());
DELETE FROM realtime WHERE ts <= NOW() - INTERVAL 1 DAY;
END//
DELIMITER ;
最后,您需要告诉 MySQL 安排您的活动。这个命令就是这样做的。
SET GLOBAL event_scheduler=ON;
您可以将这三个查询放入 Python 程序的初始化中,您目前在其中定义 table.