MariaDB
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> MariaDB

Di chuyển mạng Zero Downtime với MySQL Galera Cluster bằng cách sử dụng nút chuyển tiếp

Việc cung cấp nút tự động của Galera Cluster đơn giản hóa sự phức tạp của việc mở rộng một cụm cơ sở dữ liệu với tính nhất quán dữ liệu được đảm bảo. SST và IST cải thiện khả năng sử dụng của đồng bộ hóa dữ liệu ban đầu mà không cần sao lưu cơ sở dữ liệu theo cách thủ công và sao chép nó vào nút mới. Kết hợp điều này với khả năng của Galera trong việc dung nạp các thiết lập mạng khác nhau (ví dụ:sao chép WAN), giờ đây chúng tôi có thể di chuyển cơ sở dữ liệu giữa các mạng bị cô lập khác nhau mà không bị gián đoạn dịch vụ.

Trong bài đăng trên blog này, chúng ta sẽ xem xét cách di chuyển Cụm MySQL Galera của chúng tôi mà không cần thời gian ngừng hoạt động. Chúng tôi sẽ di chuyển cơ sở dữ liệu từ Amazon Web Service (AWS) EC2 sang Google Cloud Platform (GCP) Compute Engine, với sự trợ giúp của một nút chuyển tiếp. Xin lưu ý rằng trước đây chúng tôi đã có một bài đăng trên blog tương tự, nhưng bài này sử dụng một cách tiếp cận khác.

Sơ đồ sau đây đơn giản hóa kế hoạch di chuyển của chúng tôi:

Chuẩn bị địa điểm cũ

Vì cả hai trang web không thể giao tiếp với nhau do cách ly nhóm bảo mật hoặc VPC, chúng ta cần có một nút chuyển tiếp để kết nối hai trang web này với nhau. Nút này có thể được đặt trên một trong hai trang web, nhưng phải có khả năng kết nối với một hoặc nhiều nút ở phía bên kia trên cổng 3306 (MySQL), 4444 (SST), 4567 (gcomm) và 4568 (IST). Đây là những gì chúng tôi đã có và cách chúng tôi sẽ mở rộng quy mô trang web cũ:

Bạn cũng có thể sử dụng một nút Galera hiện có (ví dụ:nút thứ ba) làm nút chuyển tiếp, miễn là nó có kết nối với phía bên kia. Nhược điểm là dung lượng cụm sẽ giảm xuống còn hai, vì một nút sẽ được sử dụng cho SST và chuyển tiếp luồng nhân bản Galera giữa các trang web. Tùy thuộc vào kích thước tập dữ liệu và kết nối giữa các trang web, điều này có thể gây ra các vấn đề về độ tin cậy của cơ sở dữ liệu trên cụm hiện tại.

Vì vậy, chúng tôi sẽ sử dụng nút thứ tư, để giảm rủi ro trên cụm sản xuất hiện tại khi đồng bộ hóa với phía bên kia. Đầu tiên, tạo một phiên bản mới trong Bảng điều khiển AWS với địa chỉ IP công cộng (để nó có thể nói chuyện với thế giới bên ngoài) và cho phép các cổng giao tiếp Galera bắt buộc (TCP 3306, 4444, 4567-4568).

Triển khai nút thứ tư (nút chuyển tiếp) trên trang web cũ. Nếu bạn đang sử dụng ClusterControl, bạn có thể chỉ cần sử dụng tính năng "Thêm nút" để mở rộng cụm (đừng quên thiết lập trước SSH không mật khẩu từ nút ClusterControl sang máy chủ thứ tư này):

Đảm bảo nút chuyển tiếp đồng bộ với cụm hiện tại và có thể giao tiếp với phía bên kia.

Từ trang web mới, chúng tôi sẽ kết nối với nút chuyển tiếp vì đây là nút duy nhất có kết nối với thế giới bên ngoài.

Triển khai trang web mới

Trên trang web mới, chúng tôi sẽ triển khai một thiết lập tương tự với một nút ClusterControl và Cụm Galera ba nút. Cả hai trang web phải sử dụng cùng một phiên bản MySQL. Đây là kiến ​​trúc của chúng tôi trên trang web mới:

Với ClusterControl, việc triển khai cụm mới chỉ là một vài cú nhấp chuột và là một tính năng miễn phí trong phiên bản cộng đồng. Đi tới ClusterControl -> Triển khai Cụm cơ sở dữ liệu -> MySQL Galera và làm theo trình hướng dẫn triển khai:

Nhấp vào Triển khai và theo dõi tiến trình trong Hoạt động -> Công việc -> Tạo cụm. Sau khi hoàn tất, bạn sẽ có những thông tin sau trên trang tổng quan:

Tại thời điểm này, bạn đang có hai Cụm Galera riêng biệt - 4 nút ở trang web cũ và 3 nút ở trang web mới.

Kết nối cả hai trang web

Trên trang web mới (GCP), hãy chọn một nút để giao tiếp với nút chuyển tiếp trên trang cũ. Chúng tôi sẽ chọn galera-gcp1 làm trình kết nối với nút chuyển tiếp (galera-aws4). Sơ đồ sau minh họa kế hoạch bắc cầu của chúng tôi:

Những điều quan trọng để định cấu hình là các tham số sau:

  • wsrep_sst_donor : wsrep_node_name của nút nhà tài trợ. Trên galera-gcp1, hãy đặt nhà tài trợ thành galera-aws4.
  • wsrep_sst_auth :Thông tin đăng nhập người dùng SST ở tên người dùng:định dạng mật khẩu phải tuân theo trang web cũ (AWS).
  • wsrep_sst_receive_address :Địa chỉ IP sẽ nhận SST trên nút kết hợp. Trên galera-gcp1, hãy đặt nó thành địa chỉ IP công cộng của nút này.
  • wsrep_cluster_address :Chuỗi kết nối Galera. Trên galera-gcp1, hãy thêm địa chỉ IP công khai của galera-aws4.
  • wsrep_provider_options :
    • gmcast.segment:Mặc định là 0. Đặt một số nguyên khác trên tất cả các nút trong GCP.
  1. Trên nút chuyển tiếp (galera-aws4), truy xuất wsrep_node_name:

    $ mysql -uroot -p -e 'SELECT @@wsrep_node_name'
    Enter password:
    +-------------------+
    | @@wsrep_node_name |
    +-------------------+
    | 10.0.0.13         |
    +-------------------+
  2. Trên my.cnf của galera-gcp1, hãy đặt wsrep_sst_donor giá trị cho wsrep_node_name của nút chuyển tiếp và wsrep_sst_receive_address tới địa chỉ IP công cộng của galera-gcp1:

    wsrep_sst_donor=10.0.0.13
    wsrep_sst_receive_address=35.197.136.232
  3. Trên tất cả các nút trên GCP, hãy đảm bảo wsrep_sst_auth giá trị giống nhau sau trang web cũ (AWS) và thay đổi phân đoạn Galera thành 1 (để Galera biết cả hai trang web đều thuộc các mạng khác nhau):

    wsrep_sst_auth=backupuser:mysecretP4ssW0rd
    wsrep_provider_options="base_port=4567; gcache.size=512M; gmcast.segment=1"
  4. Trên galera-gcp1, đặt wsrep_cluster_address để bao gồm địa chỉ IP công cộng của nút chuyển tiếp:

    wsrep_cluster_address=gcomm://10.148.0.2,10.148.0.3,10.148.0.4,13.229.247.149

    ** Chỉ sửa đổi wsrep_cluster_address trên galera-gcp1. Không sửa đổi thông số này trên galera-gcp2 và galera-gcp3.

  5. Dừng tất cả các nút trên GCP. Nếu bạn đang sử dụng ClusterControl, hãy chuyển đến trình đơn thả xuống Cluster Actions -> Stop Cluster. Bạn cũng được yêu cầu tắt khôi phục tự động ở cả cấp độ cụm và nút, vì vậy ClusterControl sẽ không cố gắng khôi phục các nút bị lỗi.

  6. Bây giờ là phần đồng bộ hóa. Khởi động galera-gcp1. Bạn có thể thấy từ nhật ký lỗi MySQL trên nút nhà tài trợ rằng SST được khởi tạo giữa nút chuyển tiếp (10.0.0.13) bằng địa chỉ công khai trên galera-gcp1 (35.197.136.232):

    2017-12-19T13:58:04.765238Z 0 [Note] WSREP: Initiating SST/IST transfer on DONOR side (wsrep_sst_xtrabackup-v2 --role 'donor' --address '35.197.136.232:4444/xtrabackup_sst//1' --socket '/var/lib/mysql/m
    ysql.sock' --datadir '/var/lib/mysql/' --defaults-file '/etc/my.cnf' --defaults-group-suffix ''   '' --gtid 'df23adb8-b567-11e7-8c50-a386c8cc7711:151181')
    2017-12-19T13:58:04.765468Z 5 [Note] WSREP: DONOR thread signaled with 0
            2017-12-19T13:58:15.158757Z WSREP_SST: [INFO] Streaming the backup to joiner at 35.197.136.232 4444
    2017-12-19T13:58:52.512143Z 0 [Note] WSREP: 1.0 (10.0.0.13): State transfer to 0.0 (10.148.0.2) complete.

    Hãy lưu ý rằng tại thời điểm này, galera-gcp1 sẽ tràn ngập các dòng sau:

    2017-12-19T13:32:47.111002Z 0 [Note] WSREP: (ed66842b, 'tcp://0.0.0.0:4567') connection to peer 00000000 with addr tcp://10.0.0.118:4567 timed out, no messages seen in PT3S
    2017-12-19T13:32:48.111123Z 0 [Note] WSREP: (ed66842b, 'tcp://0.0.0.0:4567') connection to peer 00000000 with addr tcp://10.0.0.90:4567 timed out, no messages seen in PT3S
    2017-12-19T13:32:50.611462Z 0 [Note] WSREP: (ed66842b, 'tcp://0.0.0.0:4567') connection to peer 00000000 with addr tcp://10.0.0.25:4567 timed out, no messages seen in PT3S

    Bạn có thể bỏ qua cảnh báo này một cách an toàn vì galera-gcp1 tiếp tục cố gắng xem các nút còn lại ngoài nút chuyển tiếp trên AWS.

  7. Sau khi hoàn tất SST trên galera-gcp1, ClusterControl trên GCE sẽ không thể kết nối các nút cơ sở dữ liệu do thiếu GRANT (GRANT hiện có đã bị ghi đè sau khi đồng bộ hóa từ AWS). Vì vậy, đây là những gì chúng ta cần làm sau khi SST hoàn tất trên galera-gcp1:

    mysql> GRANT ALL PRIVILEGES ON *.* TO [email protected]'10.148.0.5' IDENTIFIED BY 'cmon' WITH GRANT OPTION;

    Khi điều này được thực hiện, ClusterControl sẽ báo cáo chính xác trạng thái của galera-gcp1 như được đánh dấu bên dưới:

  8. Phần cuối cùng là khởi động galera-gcp2 và galera-gcp3 còn lại, mỗi lần một nút. Vào ClusterControl -> Nodes -> chọn nút -> Start Node. Sau khi tất cả các nút được đồng bộ hóa, bạn sẽ nhận được 7 làm kích thước cụm:

Cụm hiện đang hoạt động trên cả hai trang web và việc mở rộng quy mô đã hoàn tất.

Ngừng hoạt động

Sau khi quá trình di chuyển hoàn tất và tất cả các nút đã được đồng bộ hóa, bạn có thể bắt đầu chuyển ứng dụng của mình sang cụm mới trên GCP:

Tại thời điểm này, dữ liệu MySQL được sao chép đến tất cả các nút cho đến khi ngừng hoạt động. Hiệu suất sao chép sẽ tốt như nút xa nhất trong cụm cho phép. Nút chuyển tiếp rất quan trọng, vì nó phát các bản ghi sang phía bên kia. Từ quan điểm ứng dụng, bạn chỉ nên ghi vào một trang web tại một thời điểm, có nghĩa là bạn sẽ phải bắt đầu chuyển hướng đọc / ghi từ AWS và thay vào đó phân phát chúng từ cụm GCP.

Để ngừng truyền các nút cơ sở dữ liệu cũ và di chuyển đến cụm trên GCP, chúng tôi phải thực hiện tắt nhanh (một nút tại một thời điểm) trên AWS. Điều quan trọng là phải tắt các nút một cách duyên dáng, vì trang AWS nắm giữ phần lớn số lượng nút (4/7) cho cụm này. Việc tắt tất cả chúng cùng một lúc sẽ khiến cụm trên GCP chuyển sang trạng thái không phải chính, buộc cụm từ chối hoạt động. Đảm bảo rằng nút cuối cùng tắt ở phía AWS là nút chuyển tiếp.

Đừng quên cập nhật các thông số sau trên galera-gcp1 cho phù hợp:

  • wsrep_cluster_address - Xóa địa chỉ IP công cộng của nút chuyển tiếp.
  • wsrep_sst_donor - Bình luận dòng này. Hãy để Galera tự động chọn nhà tài trợ.
  • wsrep_sst_receive_address - Bình luận dòng này. Hãy để Galera tự động chọn giao diện nhận.

Galera Cluster của bạn hiện đang chạy trên nền tảng, máy chủ và mạng hoàn toàn mới mà không mất một giây thời gian ngừng hoạt động đối với dịch vụ cơ sở dữ liệu của bạn trong quá trình di chuyển. Điều đó thật tuyệt làm sao?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MariaDB JSON_KEYS () Giải thích

  2. Các tùy chọn chuyển đổi dự phòng cho cụm cơ sở dữ liệu đầy đủ đa đám mây cho cụm MariaDB

  3. MariaDB JSON_OBJECT () Giải thích

  4. Cách CEILING () hoạt động trong MariaDB

  5. 4 cách để tách biệt giờ, phút và giây với một giá trị thời gian trong MariaDB