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

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:

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

Ứ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:

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

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:

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

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ệ:

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

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
  • Trả về Slave MySQL đang chạy. (LAG SLAVE: 0)
  • khác
    • Trả về MySQL là *xuống *
  • Lưu ý rằng người dùng MySQL được chỉ định phải có ít nhất máy khách sao chép và nô lệ sao chép để tập lệnh báo cáo chính xác.

    1. Trước khi việc triển khai bắt đầu, hãy chạy lệnh sau trên nút ClusterControl để thay thế mẫu kiểm tra sức khỏe cho bản sao MySQL:

      $ wget https://raw.githubusercontent.com/ashraf-s9s/mysqlchk/master/mysqlchk.mysql -O /usr/share/cmon/templates/mysqlchk.mysql
    2. Bây giờ chúng tôi rất tốt để triển khai hai trường hợp haproxy. Đảm bảo vai trò của tất cả các nút được đặt thành hoạt động và nhấp vào ‘Cài đặt HAProxy, để bắt đầu cài đặt:

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

      Lặp lại bước trên cho nút haproxy thứ hai.

    3. Để làm cho haproxy hoạt động với bản sao MySQL, hai người nghe HAPROXY (3307 cho Writes, 3308 để đọc) là bắt buộc. Chúng tôi cũng phải sử dụng kiểm tra TCP để phân biệt xem nút phụ trợ là một bậc thầy hoặc nô lệ lành mạnh. Để đạt được điều này, chúng tôi cần thực hiện một số sửa đổi cho tệp cấu hình haproxy đã cài đặt được đặt tại /etc/haproxy/haproxy.cfg của các nút cân bằng tải./etc/haproxy/haproxy.cfg of the load balancer nodes.

      Đảm bảo bạn có các dòng cấu hình sau trong haProxy.cfg trên cả hai nút cân bằng tải:

      listen  haproxy_192.168.55.110_3307
              bind *:3307
              mode tcp
              timeout client  10800s
              timeout server  10800s
              balance leastconn
              option tcp-check
              tcp-check expect string MySQL master
              option allbackups
              default-server port 9200 inter 2s downinter 5s rise 3 fall 2 slowstart 60s maxconn 64 maxqueue 128 weight 100
              server 192.168.55.111 192.168.55.111:3306 check
              server 192.168.55.112 192.168.55.112:3306 check
              server 192.168.55.113 192.168.55.113:3306 check
      
      listen  haproxy_192.168.55.110_3308
              bind *:3308
              mode tcp
              timeout client  10800s
              timeout server  10800s
              balance leastconn
              option tcp-check
              tcp-check expect string is running.
              option allbackups
              default-server port 9200 inter 2s downinter 5s rise 3 fall 2 slowstart 60s maxconn 64 maxqueue 128 weight 100
              server 192.168.55.111 192.168.55.111:3306 check
              server 192.168.55.112 192.168.55.112:3306 check
              server 192.168.55.113 192.168.55.113:3306 check

      ** Việc sử dụng ‘tùy chọn TCP-Check, và‘ TCP-Check mong đợi là rất quan trọng ở đây. Đây là cách HAPROXY có khả năng định tuyến truy vấn đến đến máy chủ phụ trợ chính xác. Các văn bản được chuyển hướng đến nút mà báo cáo Master Master MySQL đang chạy (do đó, chuỗi dự kiến ​​là Master MySQL Master). Các lần đọc được chuyển hướng đến các nút có chứa trên mạng đang chạy trong chuỗi trả về, để bao gồm Master (Master Master Master đang chạy) và tất cả các nô lệ (Slave MySQL đang chạy) trong bộ cân bằng tải chỉ đọc.option tcp-check’ and ‘tcp-check expect’ is vital here. This is how HAProxy is capable to route the incoming query to the correct backend server. Writes are redirected to the node which report ‘MySQL master is running’ (therefore the expected string is “MySQL master”). Reads are redirected to the nodes which contain “is running” in the return string, to include master (‘MySQL master is running’) and all slaves (‘MySQL slave is running’) in the read-only load balancing set.

    4. Sau đó, triển khai KeepAleD với địa chỉ IP ảo 192.168.55.100 thông qua ClusterControl> Action> Thêm bộ cân bằng tải> Cài đặt giữ hàng:

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

      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:

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

    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:

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

    Đó 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ệ:

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

    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:

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

    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:

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

    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:

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

    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