Hướng dẫn haproxy mysql read/write splitting - chia tách đọc/ghi haproxy mysql

Bản sao MySQL được sử dụng trong nhiều trường hợp sử dụng - mở rộng khối lượng công việc đọc, cung cấp tính khả dụng cao và dự phòng địa lý, giảm tải và các công việc báo cáo/phân tích. Tuy nhiên, nó có một nhược điểm lớn - ứng dụng cần chỉ có thể gửi ghi cho Master. Cập nhật nhiều hơn một bậc thầy trong thiết lập sao chép có thể dẫn đến sự không nhất quán của dữ liệu và khiến việc sao chép bị phá vỡ.

Một bộ cân bằng tải SQL-Aware như MaxScale có thể giúp ở đây, vì nó có thể chuyển hướng SQL sang nút thích hợp. Nếu bạn đang sử dụng haproxy và ứng dụng được viết bằng PHP, việc phân tách đọc-ghi vẫn có thể đạt được với trình điều khiển gốc PHP MySQL với plugin chủ nô (còn gọi là PHP-MYSQLND_MS). Trình điều khiển có thể thực hiện phân tách đọc-write, cũng như cân bằng tải và chuyển đổi dự phòng. Có những lợi thế cho việc có một bộ cân bằng tải là tốt. PHP-MYSQLND_MS cũng có hỗ trợ thử nghiệm cho các thiết lập sao chép đa chủ như Galera hoặc MMM.php-mysqlnd_ms). The driver can perform the read-write splitting, as well as load balancing and failover. There are advantages for having a load balancer as well though. php-mysqlnd_ms also has experimental support for multi-master replication setups like Galera or MMM.

Trong bài đăng trên blog này, chúng tôi khám phá việc sử dụng PHP-MYSQLND_MS với ứng dụng PHP (WordPress) trên phụ trợ sao chép MySQL tiêu chuẩn.

Tại sao thêm haproxy giữa PHP-MYSQLND và MySQL?

Đề xuất ở đây là sử dụng HAPROXY giữa trình điều khiển PHP và MySQL, vì nó cung cấp một điểm truy cập điểm duy nhất cho ứng dụng, các truy vấn các tuyến đến các máy chủ MySQL phụ trợ và cũng chăm sóc kiểm tra sức khỏe nô lệ chính. Lý do đằng sau điều này là để giảm thiểu các thay đổi cần được thực hiện trên tệp cấu hình PHP-MYSQLND nằm trên mỗi máy chủ ứng dụng. Đặc biệt quan trọng trong quá trình kết nối sao chép động thay đổi, ví dụ, khi một nô lệ mới được thêm hoặc xóa khỏi thiết lập. Nếu bạn có nhiều máy chủ ứng dụng/web kết nối với một thiết lập sao chép hoặc máy chủ cơ sở dữ liệu được lưu trữ trong môi trường động liên tục thay đổi (ví dụ Docker, phiên bản đám mây), thì thiết lập này có thể là thứ bạn đang tìm kiếm.

Kiến trúc của chúng tôi trông như thế này:

Ứng dụng PHP (WordPress) được lưu trữ trên máy chủ web, & nbsp; và php-mysqlnd_ms sẽ chuyển hướng ghi vào nút haproxy trên cổng 3307 trong khi các lần đọc được chuyển hướng đến cổng 3308. Địa chỉ IP ảo. Máy chủ web kết nối với địa chỉ IP ảo trên cổng tương ứng dưới dạng một điểm truy cập duy nhất cho thiết lập sao chép MySQL của chúng tôi. Tất cả các nút trong thiết lập này đang chạy trên Debian 8 (Jessie).

Triển khai sao chép MySQL

Chúng tôi sử dụng ClusterControl để triển khai bản sao ba nút MySQL với hai nô lệ. Cài đặt ClusterControl và truy cập vào nút tạo cơ sở dữ liệu. Trong hộp thoại này, chúng ta sẽ tạo một nút chính sao MySQL. Chỉ định thông tin cần thiết và nhấp vào Triển khai trực tuyến:

Sau khi được thêm vào, chúng tôi sẽ sử dụng chức năng Thêm nút Thêm nút để thêm một nô lệ tại một thời điểm:

Lặp lại bước trên cho nô lệ thứ hai. Khi kết thúc việc triển khai, bạn sẽ thấy một cái gì đó như bên dưới trong thanh tóm tắt của ClusterControl. Bạn sẽ thấy một nút chính và hai nô lệ:

Triển khai HAPROXY và cấu hình kiểm tra sức khỏe

ClusterControl hỗ trợ triển khai HAProxy và Keepalive. Để sao chép MySQL, ClusterControl theo mặc định sử dụng tập lệnh có tên MySQLCHK được đặt tại/usr/local/sbin/mysqlchk trên mọi nút cơ sở dữ liệu để chạy kiểm tra sức khỏe đơn giản ‘chọn 1. Kịch bản không tạo ra kết quả kiểm tra sức khỏe chính xác và có thể phân biệt xem nút cơ sở dữ liệu là một bậc thầy hoặc nô lệ lành mạnh./usr/local/sbin/mysqlchk on the every database node to run a simple ‘select 1’ health check. The script doesn’t produce an accurate health check result and can’t distinguish whether the database node is a healthy master or slave.

Chúng ta phải đi ra với một kiểm tra sức khỏe tốt hơn phù hợp với HAProxy. Với mục đích của bài đăng trên blog này, chúng tôi đã xây dựng một tập lệnh kiểm tra sức khỏe tùy chỉnh. Kịch bản phát hiện vai trò sao chép MySQL trên nút cơ sở dữ liệu như bên dưới:

  • Nếu chủ (hiển thị máy chủ nô lệ & nbsp;> 1 và read_only = off)
    • Trả về Master MySQL Master đang chạy.
  • Nếu nô lệ (nô lệ_io_rasty = Có và Slave_sql_rasty = Có và (Second_behind_master = 0 hoặc Seconds_behind_master Action> Thêm bộ cân bằng tải> Cài đặt giữ hàng:

    Tại thời điểm này, tất cả các nút đã được triển khai chính xác - như được chỉ ra bởi các ve xanh trong thanh tóm tắt:

  • Cơ sở dữ liệu và các tầng cân bằng tải hiện đã được triển khai. Hãy để di chuyển đến tầng ứng dụng.

    Triển khai máy chủ web và định cấu hình php-mysqlnd cho chủ nô

    Các bước sau nên được thực hiện trên máy chủ web/ứng dụng:

    1. Cài đặt Apache Web Server và các gói Php 5:

      $ apt-get install apache2 libapache2-mod-php5 php5-common php5-gd php5-json php5-curl php5-mysqlnd php-pear php5-dev
    2. Cài đặt mô -đun MySQLND_MS thông qua PECL:

      $ pecl install mysqlnd_ms
    3. Tạo tệp cấu hình cho mysqlnd_ms:

      $ vi /etc/php5/mods-available/mysqlnd_ms.ini

      Thêm dòng sau:

      ** Chúng tôi đang sử dụng ưu tiên = 40 vì nó yêu cầu mô-đun PHP-MYSQLND được tải trước.

    4. Bật mô -đun:

      $ php5enmod mysqlnd_ms
    5. Tạo tệp cấu hình mysqlnd_ms.json

      $ vi /etc/php5/mods-available/mysqlnd_ms.json

      Thêm các dòng sau:

      { "wordpress_ms": { "master": { "master_0": { "host": "192.168.55.100", "port": "3307", "user": "wpress", "password": "password", "db": "wpress" } }, "slave": { "slave_0": { "host": "192.168.55.100", "port": "3308", "user": "wpress", "password": "password", "db": "wpress" } } } }

      Chúng tôi đã xác định tên ứng dụng là Word WordPress_ms, giá trị này sẽ được sử dụng để thay thế giá trị ’máy chủ trong cuộc gọi hàm MySQL. Phần chính cung cấp thông tin về Master MySQL - Chúng tôi chuyển tiếp ghi vào địa chỉ IP ảo trên nút HAPROXY, trên cổng 3307. HAPROXY sẽ tự động khám phá đúng Master để gửi Writs. Phần nô lệ cung cấp thông tin cho nô lệ MySQL - Chúng tôi chuyển tiếp đọc đến địa chỉ IP ảo trên nút HAPROXY, trên cổng 3308. HAPROXY sau đó sẽ tự động khám phá các nút nào có sẵn để gửi đọc đến.

    6. Tệp cấu hình JSON phải được người dùng Apache truy cập, trong trường hợp này chúng tôi đang sử dụng dữ liệu www mặc định. Áp dụng quyền sở hữu chính xác trên tệp cấu hình:

      $ chown www-data.www-data /etc/php5/mods-available/mysqlnd_ms.json

    Bây giờ chúng tôi đã sẵn sàng để triển khai WordPess với sao chép MySQL làm phụ trợ cơ sở dữ liệu.

    Cài đặt WordPress

    Khi cài đặt WordPress, chỉ định tên ứng dụng mysqlnd_ms (wordpess_ms) làm giá trị máy chủ cơ sở dữ liệu:

    Đó là nó! Bây giờ bạn đang chạy WordPress với việc phân tách đọc-ghi trên đầu sao chép MySQL.

    Kiểm tra

    Viết chỉ được thực hiện trên máy chủ chính. Nếu chủ thất bại, sao chép sẽ dừng lại. Chuyển đổi dự phòng phải được thực hiện bằng cách quảng bá nô lệ được cập nhật nhất, trước khi sao chép có thể tiếp tục. Các ứng dụng thực hiện cập nhật sau đó phải kết nối lại với Master mới được quảng bá và sau đó tiếp tục hoạt động.

    Nếu Master (192.168.55.111) giảm, chúng ta cần quảng bá một trong những nô lệ (192.168.55.112) cho New Master. Để đạt được điều này, hãy truy cập ClusterControl> Nút> Chọn 192.168.55.112> Quảng cáo nô lệ:

    Sau khi được chọn, nhấp vào ‘Thực thi. Bạn sẽ được nhắc với những điều sau:

    Khi nô lệ được chọn đã trở thành Master mới, các nô lệ khác sẽ tự động chuyển giới cho Master mới và tiếp tục nhận được cập nhật trong khi Master cũ bị suy sụp. Khi Old Master xuất hiện một lần nữa, nó sẽ đóng vai trò của một nô lệ và đồng bộ hóa với Master mới (đang xử lý các bản cập nhật ứng dụng). Điều này được phối hợp bởi ClusterControl. Ảnh chụp màn hình sau đây cho thấy Master cũ (192.168.55.111) đã trở thành nô lệ trong chuỗi sao chép:

    Khi Master cũ được cập nhật với Master mới, Old Master sẽ vẫn là nô lệ.

    Khi một chủ mới được quảng bá, HAPROXY sẽ tự động gửi các chữ viết đến nút mới được quảng bá, như được hiển thị trong trang thống kê HAPROXY bên dưới:

    Thiết lập này sẽ không yêu cầu thay đổi trên cấp cân bằng ứng dụng và tải trọng nếu cấu trúc liên kết sao chép thay đổi. Dễ dàng hơn để quản lý và ít có lỗi dễ bị. Happy Read-Write Splits!

    Đăng ký để có được nội dung tốt nhất và mới nhất của chúng tôi

Chủ đề