如何为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:

执行连续实时数据生成的最佳方法是什么?

解决方法

我假设您想要一个包含经常生成的随机数据的表。这是一张桌子。每行都有一个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程序的初始化中。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...