Quá nhiều kết nối cơ sở dữ liệu trên Amazon RDS


9

Chúng tôi đang gặp sự cố với người dùng đang chạy truy vấn / lượt xem trong Drupal đôi khi khiến trang web của chúng tôi bị đóng băng. Việc đóng băng xảy ra do truy vấn làm cho số lượng kết nối cơ sở dữ liệu lên tới hơn 400 và về cơ bản bất cứ lúc nào trang web vượt quá 100 kết nối cơ sở dữ liệu, trang web sẽ chậm lại và không phản hồi.

Chúng tôi đang chạy Amazon RDS bằng MySQL Red Hat Linux

Chúng tôi có một EC2 đủ lớn trên máy chủ ứng dụng giao diện người dùng và RDS đủ lớn.

Cách chúng tôi đang khắc phục vấn đề này bây giờ là tìm truy vấn vi phạm và tiêu diệt nó. Khi truy vấn bị hủy ... các kết nối cơ sở dữ liệu của chúng tôi giảm xuống khoảng 20, đó là số tiền bình thường bạn thấy khi theo dõi số liệu thống kê trang web.

Có cách nào để ngăn chặn truy vấn vi phạm và giết nó trước khi nó chạy quá lâu và tiêu tốn các kết nối không? Tôi đang cố gắng tự động hóa việc tiêu diệt truy vấn xấu trước khi nó xảy ra, hoặc ít nhất nhận ra sau 30 giây đó là một truy vấn xấu và giết nó.


3
Giết truy vấn thông qua một quy trình tự động có vẻ như hoàn toàn là cách tiếp cận sai ... liệu thực tế RDS của bạn có bị thiếu năng lực hay không, gây ra sự chồng chất ban đầu ... hoặc có gì đó không đúng với logic trong ứng dụng của bạn, có vẻ như tìm thấy vấn đề thực tế với truy vấn sẽ là việc cần làm ...
Michael - sqlbot

Bạn có thể sử dụng MONyog- MySQL Monitor có trình thám thính dựa trên PROCESSLIST giúp thông báo và giết chết các truy vấn chạy dài. Nó cũng hoạt động tốt với Amazon RDS.
Peter Venderberghe

Không phải là một anh chàng MySql / Linux - làm thế nào bạn có thể có hơn 100 kết nối từ một trang web? Tôi chỉ làm asp.net và bất kỳ trang nào của tôi chỉ mở MỘT kết nối cùng một lúc - vì vậy điều đó có nghĩa là xử lý hơn 100 trang cùng một lúc (thực tế nhiều hơn là một trang chỉ có kết nối mở trong khi cần nó). Tôi sẽ xem xét cách tiếp cận của bạn trong việc xử lý các kết nối - đó là không hiệu quả nghiêm trọng.
TomTom

AWS thiết lập các kết nối tối đa dựa trên kích thước cá thể của bạn. công thức họ sử dụng là: max_connections = {DBInstanceClassMemory / 12582880} Xem tài liệu Nhóm tham số: https://console.aws.amazon.com/rds/home?region=us-east-1#parameter-groups:

Có thể bạn nên xem xét thực hiện một số loại kết nối.
mustaccio

Câu trả lời:


6

Dưới đây là một thủ tục được lưu trữ để tiêu diệt các CHỌN chạy dài

DELIMITER $$

DROP PROCEDURE IF EXISTS `test`.`Kill_Long_Running_Selects` $$
CREATE PROCEDURE `test`.`Kill_Long_Running_Selects` (time_limit INT,display INT)
BEGIN

    DECLARE ndx,lastndx INT;

    DROP TABLE IF EXISTS test.LongRunningSelects;
    CREATE TABLE test.LongRunningSelects
    (
        id INT NOT NULL AUTO_INCREMENT,
        idtokill BIGINT,
        PRIMARY KEY (id)
    ) ENGINE=MEMORY;
    INSERT INTO test.LongRunningSelects (idtokill)
    SELECT id FROM information_schema.processlist
    WHERE user<>'system user' AND info regexp '^SELECT' AND time > time_limit;

    SELECT COUNT(1) INTO lastndx FROM test.LongRunningSelects;
    SET ndx = 0;
    WHILE ndx < lastndx DO
        SET ndx = ndx + 1;
        SELECT idtokill INTO @kill_id
        FROM test.LongRunningSelects WHERE id = ndx;
        CALL mysql.rds_kill(@kill_id);
    END WHILE;

    IF lastndx > 0 THEN
        IF display = 1 THEN
            SELECT GROUP_CONCAT(idtokill) INTO @idlist FROM test.LongRunningSelects;
            SELECT @idlist IDs_KIlled;
            SELECT CONCAT('Processes Killed : ',lastndx) Kill_Long_Running_Selects;
        END IF;
    END IF;

END $$

Để tiêu diệt các CHỌN chạy dài hơn 30 giây, bạn chạy nó

CALL test.Kill_Long_Running_Selects(30,0);

Nếu bạn muốn xem các kết nối bị giết, bạn chạy nó

CALL test.Kill_Long_Running_Selects(30,1);

Có lẽ bạn có thể tạo Sự kiện MySQL để gọi Quy trình được lưu trữ này mỗi phút.

Nếu Amazon không cho phép bạn có đặc quyền EVENT , bạn sẽ phải viết một tập lệnh shell bên ngoài trên máy chủ EC2 để kết nối với DB và chạy Thủ tục lưu trữ. Kịch bản shell đó có thể được đưa vào một crontab.

Nếu Amazon không cho phép bạn có các đặc quyền PROCESSSUPER , bạn có thể cần phải chuyển DB ra khỏi RDS và vào một phiên bản EC2 khác chạy MySQL để thực hiện điều này. Sau đó, bạn có thể tạo Sự kiện MySQL mà không bị hạn chế lưu trữ của Amazon.


1
Đây là một câu trả lời tuyệt vời! Tôi đã sử dụng nó trên RDS ngày hôm nay bằng cách thay đổi dòng KILL @kill_id; để "gọi mysql.rds_kill (@kill_id);" và nó hoạt động hoàn hảo.
Dave R

@DaveR cảm ơn bạn. Tôi sẽ cập nhật dòng đó sau ngày hôm nay.
RolandoMySQLDBA

@DaveR Tôi vừa thực hiện thay đổi dòng đó. Cảm ơn đã chỉ ra điều này.
RolandoMySQLDBA
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.