如何为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 实时数据库上的单个查询启用离线功能?

如何为 Azure 实时分析调用可执行文件?

如何用颤振制作一个mysql实时数据库? [关闭]

使用 JQuery、PHP 和 MySQL 为实时统计页面优化多个连续的 ajax 调用

我们如何为客户获取实时 Instagram 位置通知?