카테고리 없음

Maxscale Causal Reads 기능 테스트

자바바라 2024. 11. 12. 23:13

Causal Reads 기능을 테스트하기 위한 시나리오에 맞는 더미 데이터를 생성하는 SQL 스크립트를 제공해드리겠습니다. 이 스크립트는 MySQL/MariaDB에서 실행할 수 있습니다.

 

 

-- 테이블 생성
CREATE TABLE customers (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100),
    email VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE orders (
    id INT PRIMARY KEY AUTO_INCREMENT,
    customer_id INT,
    total_amount DECIMAL(10, 2),
    status VARCHAR(20),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (customer_id) REFERENCES customers(id)
);

CREATE TABLE order_items (
    id INT PRIMARY KEY AUTO_INCREMENT,
    order_id INT,
    product_name VARCHAR(100),
    quantity INT,
    price DECIMAL(10, 2),
    FOREIGN KEY (order_id) REFERENCES orders(id)
);

-- 더미 데이터 생성
-- 고객 데이터 생성 (1000명)
INSERT INTO customers (name, email)
SELECT 
    CONCAT('Customer ', FLOOR(RAND() * 1000)),
    CONCAT('customer', FLOOR(RAND() * 1000), '@example.com')
FROM 
    information_schema.columns
LIMIT 1000;

-- 주문 데이터 생성 (5000건)
INSERT INTO orders (customer_id, total_amount, status)
SELECT 
    FLOOR(1 + RAND() * 1000),
    ROUND(RAND() * 1000, 2),
    ELT(FLOOR(1 + RAND() * 4), 'Pending', 'Processing', 'Shipped', 'Delivered')
FROM 
    information_schema.columns
LIMIT 5000;

-- 주문 아이템 데이터 생성 (각 주문당 1-5개 아이템)
INSERT INTO order_items (order_id, product_name, quantity, price)
SELECT 
    o.id,
    CONCAT('Product ', CHAR(65 + FLOOR(RAND() * 26))),
    FLOOR(1 + RAND() * 5),
    ROUND(10 + RAND() * 90, 2)
FROM 
    orders o
    CROSS JOIN (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) numbers
WHERE 
    RAND() < 0.7;

-- 테스트를 위한 프로시저 생성

-- 1. 주문 생성 후 즉시 주문 상태 조회
DELIMITER //
CREATE PROCEDURE create_and_check_order(IN p_customer_id INT)
BEGIN
    DECLARE new_order_id INT;
    
    START TRANSACTION;
    
    -- 새 주문 생성
    INSERT INTO orders (customer_id, total_amount, status)
    VALUES (p_customer_id, ROUND(RAND() * 1000, 2), 'Pending');
    
    SET new_order_id = LAST_INSERT_ID();
    
    -- 주문 아이템 추가
    INSERT INTO order_items (order_id, product_name, quantity, price)
    VALUES (new_order_id, CONCAT('Product ', CHAR(65 + FLOOR(RAND() * 26))), FLOOR(1 + RAND() * 5), ROUND(10 + RAND() * 90, 2));
    
    COMMIT;
    
    -- 주문 상태 즉시 조회
    SELECT * FROM orders WHERE id = new_order_id;
END //
DELIMITER ;

-- 2. 고객 정보 업데이트 후 바로 조회
DELIMITER //
CREATE PROCEDURE update_and_check_customer(IN p_customer_id INT)
BEGIN
    START TRANSACTION;
    
    -- 고객 정보 업데이트
    UPDATE customers
    SET name = CONCAT('Updated Customer ', p_customer_id),
        email = CONCAT('updated', p_customer_id, '@example.com')
    WHERE id = p_customer_id;
    
    COMMIT;
    
    -- 고객 정보 즉시 조회
    SELECT * FROM customers WHERE id = p_customer_id;
END //
DELIMITER ;

-- 3. 주문 상태 변경 후 관련 통계 조회
DELIMITER //
CREATE PROCEDURE update_order_and_check_stats(IN p_order_id INT, IN p_new_status VARCHAR(20))
BEGIN
    START TRANSACTION;
    
    -- 주문 상태 변경
    UPDATE orders
    SET status = p_new_status
    WHERE id = p_order_id;
    
    COMMIT;
    
    -- 관련 통계 조회
    SELECT 
        status, 
        COUNT(*) as order_count, 
        AVG(total_amount) as avg_amount
    FROM 
        orders
    GROUP BY 
        status;
END //
DELIMITER ;

이 스크립트는 다음과 같은 작업을 수행합니다:
필요한 테이블들을 생성합니다.
각 테이블에 더미 데이터를 삽입합니다.
Causal Reads 테스트를 위한 세 가지 프로시저를 생성합니다:
create_and_check_order: 새 주문을 생성하고 즉시 조회합니다.
update_and_check_customer: 고객 정보를 업데이트하고 즉시 조회합니다.
update_order_and_check_stats: 주문 상태를 변경하고 관련 통계를 조회합니다.
이 프로시저들을 사용하여 Causal Reads 기능을 테스트할 수 있습니다. 예를 들어:
sql
CALL create_and_check_order(1);
CALL update_and_check_customer(1);
CALL update_order_and_check_stats(1, 'Shipped');

이러한 호출을 통해 데이터 일관성과 Causal Reads의 효과를 확인할 수 있습니다.