如何为mysql连续生成假实时数据?
Posted
技术标签:
【中文标题】如何为mysql连续生成假实时数据?【英文标题】:How to generate fake real time data continously for mysql? 【发布时间】:2021-01-04 06:13:28 【问题描述】:我实际上需要在 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:
执行连续实时数据生成的最佳方式是什么?
【问题讨论】:
提供您想要生成的数据示例。并指定精确 mysql版本。 我迷路了。您说您需要“实时数据”,但您粘贴了一个操纵用户的类。你提到的数据在哪里?问题是什么?目的是什么? @Maciek 实际上每次我运行 docker-compose 时,它都会生成一个数字数据(300 个数字)。我想要的是有一个数据生成器,这样它就可以实时不断地将数据添加到我的数据库中,以便我可以在 grafana 中对其进行可视化。 @Akina 使用的mysql版本是8.0.21,我需要的数据只是随机数 我需要的数据只是随机数 1)这个数据必须在什么范围内? 2)你需要多少个数字? 3)这些数字在数据集中是否必须是唯一的? 4) 你需要多久生成一次这样的数字集?它可能是动态的还是必须将数字放入某个表中? 【参考方案1】:我假设您想要一个包含每隔一段时间生成的随机数据的表。这是这样一张桌子。每行都有一个 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;
然后,您需要一种经常在该表中插入新行的方法。这是通过MySQL EVENT object 完成的。这是一个示例,它将数据放入我刚刚定义的 realtime
表中,每分钟十次(每六秒一次)。
它还会删除一天前的行,因此如果您忘记禁用或删除计时器,您的数据库不会完全被随机无用的垃圾淹没。
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 程序的初始化中。
【讨论】:
以上是关于如何为mysql连续生成假实时数据?的主要内容,如果未能解决你的问题,请参考以下文章
我们如何为 Firebase 存储编写依赖于 Firebase 实时数据库中的值的安全规则? [复制]
如何为 Firebase 实时数据库上的单个查询启用离线功能?