Cụm MySQL cân bằng tải mà không cần cân bằng tải


10

Tôi đang tìm cách tạo một cụm MySQL cân bằng tải, nhưng không có bộ cân bằng tải thực tế, để không thêm một điểm thất bại hay phức tạp nào.

Những gì tôi đã nghĩ là có những điều sau đây:

  1. Có một thiết lập chính chủ cho MySQL

  2. Trên mỗi máy khách, đặt một proxy vòng tròn đơn giản để xoay các yêu cầu giữa các máy chủ.

Điều này có thể không? Hoặc có những cách tốt hơn để đạt được điều này?

mysql 

Tôi tò mò, bạn sẽ sử dụng nó để làm gì?

Tôi cố gắng thêm HA vào giải pháp của chúng tôi, mà không liên quan đến cân bằng tải và các công cụ tương tự.

Câu trả lời:


3

Xin vui lòng đọc câu trả lời khác của tôi cho câu hỏi này trước khi thực sự sử dụng proxy MySQL dưới bất kỳ hình thức nào. Nếu bạn có 2 máy chủ chính mà CMS đang ghi và 10 httpd chỉ đọc từ nó, bạn sẽ ổn, nhưng (như đã chỉ ra trong câu trả lời khác) không phải lúc nào cũng như vậy. Mày đã được cảnh báo.

MySQL Proxy là một chương trình đơn giản nằm giữa máy khách của bạn và (các) máy chủ MySQL có thể theo dõi, phân tích hoặc chuyển đổi giao tiếp của họ. Tính linh hoạt của nó cho phép sử dụng không giới hạn; những cái phổ biến bao gồm: cân bằng tải; chuyển đổi dự phòng; phân tích truy vấn; lọc truy vấn và sửa đổi; và nhiều cái khác.

.

HAProxy là một giải pháp miễn phí, rất nhanh và đáng tin cậy cung cấp tính sẵn sàng cao, cân bằng tải và ủy quyền cho các ứng dụng dựa trên TCP và HTTP

Nếu bạn chạy nó ở chế độ TCP, nó thậm chí còn tốt hơn Wackamole. Nếu tôi phải chọn giữa chúng, tôi sẽ sử dụng HAProxy. Ngoài ra HAProxy có thể có rất nhiều phụ trợ, Waclamole chỉ có thể có 2. Lưu ý rằng HAProxy là "câm", nó kết nối các ổ cắm mà không cần tìm kiếm những gì bên trong luồng - Proxy MySQL chuyên dụng có thể có tùy chọn để chỉ các yêu cầu khác nhau đến các máy chủ được chỉ định .


Chỉ cần xác minh: 1) HAProxy sẽ yêu cầu thêm máy / 2 máy cho HA 2) Wackamole chỉ có thể hỗ trợ 2 máy chủ cho mỗi thiết lập? Trân trọng.

Mô hình sử dụng tiêu chuẩn của Wackamole (trên thực tế là cách duy nhất mà tôi biết) là để serverA và serverB theo dõi nhau và lấy IP của người kia nếu nó chết. Trang web của Wackamole nói rằng nó có thể được sử dụng để bảo vệ một nhóm IP ... Nhưng tôi phải nói rằng Wackamole không mang lại sự ổn định như người ta muốn, vì vậy tôi không đề xuất điều đó. Về HAProxy, Bạn sẽ đặt 2 trong số chúng vào 2 máy chuyên dụng để dự phòng hoặc thậm chí bạn có thể đặt một trên mỗi nút, như bạn đã nói trong câu hỏi. Nếu các truy vấn của bạn chủ yếu là đọc, thì tôi nghĩ nó sẽ hoạt động khá tốt.

Chào rạn san hô. Chỉ là một chút cuối cùng về Wackamole - từ kinh nghiệm của bạn, nó không đủ ổn định trên hai máy?

2 máy ping nhau đều ổn, nhưng một trong số chúng đã tải 200, tất cả các cpu đều sử dụng 100%, tất cả ram được sử dụng. MySQL đã bị sập. <- wackamole sẽ KHÔNG hoạt động ở đó. HAProxy có thể kiểm tra xem ỨNG DỤNG từ xa đã hết chưa, Wackamole chỉ khi máy chủ hoạt động và application_uptime <server_uptime. Chúng tôi đã có nhiều trường hợp chúng tôi dựa vào wackamole và nó làm chúng tôi thất vọng.

4

Có lẽ đáng nói, Bản sao Galera cho MySQL cho một thiết lập MySQL đa chủ thực sự. Galera là một giao thức sao chép đồng bộ, vì vậy các ứng dụng có thể đọc và ghi vào bất kỳ Máy chủ MySQL nào. Đây là một hướng dẫn nhanh: http://www.severalnines.com/clustercontrol-mysql-galera-tutorial

Đối với các bộ cân bằng tải trước Máy chủ MySQL, hãy sử dụng trình kết nối MySQL hỗ trợ chức năng này (ví dụ: Trình kết nối / J cho Java hoặc Mysqlnd cho php)

Nếu bạn không có trình kết nối có thể làm điều này, thì hãy sử dụng cái gì đó như HA Proxy. Tập lệnh này tự động thiết lập HA Proxy và duy trì danh sách Máy chủ MySQL tốt: https://github.com/severalnines/haproxy

Trân trọng,

Vinay

www.severalnines.com


Điều quan trọng là bạn phải tiết lộ sự liên kết của mình với sản phẩm mà bạn đang giới thiệu rất rõ ràng. Ngoài ra, trang web này không phải để tự quảng cáo. Nếu bạn có một sản phẩm sẽ giải quyết vấn đề được đăng, thật tuyệt! Nếu tất cả các câu trả lời của bạn xoay quanh các sản phẩm của bạn, thì bạn có thể muốn nói chuyện với ai đó về việc nhận không gian quảng cáo thay vì đăng câu trả lời. Xin vui lòng xem faq của chúng tôi .
JNK

3

Sao chép chính chủ không tốt như bạn nghĩ, tương tự với proxy vòng tròn và các giải pháp 'dễ dàng' tương tự. Nếu Bạn cam kết dữ liệu va chạm để phân tách máy chủ đủ nhanh (nhanh hơn độ trễ giữa các máy chủ, mà trên các máy chủ sản xuất có thể lên đến một giây *), cả hai sẽ chấp nhận dữ liệu. Nếu bạn có một máy chủ đấu giá, bạn chỉ cần bán cùng một chiếc xe hai lần . Ai đã mua nó? Nó phụ thuộc vào DB mà bạn sẽ yêu cầu!

Ứng dụng phải nhận thức được rằng thực sự có 2 cơ sở dữ liệu ngoài đó và nó phải biết cả hai địa chỉ IP của chúng. Nếu bạn muốn "bán", bạn nên

DB_number = `auction_number` % `number_of_databases`

( %dành cho modulo)

... và cam kết nó với cơ sở dữ liệu DB_number. Nếu bạn gặp lỗi kết nối, thì có lẽ phải làm điều đó với một lỗi khác (nhưng trong trường hợp máy chủ đấu giá, tôi chỉ hiển thị lỗi).

Ngoài ra, các địa chỉ IP phải là wackamole -d giữa cả hai máy chủ. Trong trường hợp thảm họa, khi một máy chủ cơ sở dữ liệu ngừng hoạt động trong vài giờ trong thời gian sử dụng cao điểm, Bạn sẽ thấy rằng ứng dụng sẽ cố gắng kết nối với máy chủ vắng mặt và treo cho đến khi TIME, 3 giây. Đột nhiên một nửa các truy vấn của bạn chạy lâu hơn 3 giây (và cuối cùng tất cả chúng đều đi đến cùng một cơ sở dữ liệu - điều này không làm cho nó chạy nhanh hơn trước thảm họa). Điều này không làm cho httpd của bạn hài lòng, vì nó có thể có một nhóm kết nối hạn chế của các luồng xử lý yêu cầu đồng thời ...

* độ trễ sao chép trên các máy chủ sản xuất có thể lên đến một giây - tôi đã thử nghiệm điều này trong một vị trí từ xa và trong trung tâm dữ liệu của chúng tôi và trong khoảng 99% thời gian là 0, nhưng đôi khi mysql hiển thị 1 giây. Trên lưu lượng truy cập lớn, tôi đã có nhiều xung đột do ứng dụng khách thực hiện hai yêu cầu dẫn đến hai truy vấn, chèn và chọn. Đối với một số trường hợp, hàng chỉ không có ở đó chưa , vì vậy Chúng tôi sử dụng hash của userID và nó cố định vấn đề

Tôi hy vọng bạn sẽ học hỏi từ những sai lầm của tôi ;-)


Chào. Cám ơn vì đã chia sẻ. Tôi nghĩ về Wackamole, điều này thực sự tốt cho HA. Vấn đề của tôi với nó là tất cả tải sẽ nằm trên một trong các máy chủ chính, khi thứ hai sẽ không hoạt động, về cơ bản tạo ra hoạt động / thụ động, trong khi tôi đang tìm kiếm hoạt động / hoạt động. Có lẽ tốt hơn là đặt một số giải pháp LB nhẹ trên mỗi máy khách, để cho phép nó chuyển đổi yêu cầu giữa các máy chủ? Bất kỳ ý tưởng nếu công cụ như vậy tồn tại?

Nếu bạn cần dự phòng, thì "một làm việc, một nhàn rỗi" là tốt. Giả sử một trong 2 máy chủ chết (Tôi nhắc nhở bạn rằng Bạn đã mua máy chủ kia vì vậy nếu máy chủ đầu tiên bị hỏng Bạn vẫn có thể hoạt động). Nếu máy chủ thứ hai không thể xử lý tất cả lưu lượng, thì đó là quy mô, không phải cho HA! Ngoài ra: chỉ dựa vào Wackamole là một giải pháp tồi (ping ok! = Mysqld ok).

3

Một cụm cơ sở dữ liệu MySQL (hoặc một số khác) cân bằng tải là khá vô ích. Nếu bạn đang viết thư cho nhiều máy chủ thì bạn sẽ gặp rắc rối hoặc bạn sử dụng sao chép đồng bộ (dù sao MySQL cũng không hỗ trợ) và điều đó làm tổn hại đến hiệu suất khi nó cần đồng bộ hóa các khóa.

Tôi khuyên bạn nên phân chia tải đọc / ghi và cân bằng tải giữa các lần đọc giữa các nô lệ mysql và có một chủ duy nhất để ghi hoặc sử dụng cặp chuyển đổi dự phòng chủ động / thụ động cho chủ của bạn.

Về cơ bản, bạn không thể mở rộng quy mô ghi bằng cách đặt nhiều máy chủ vào cơ sở dữ liệu dưới dạng nô lệ, vì mỗi máy chủ vẫn phải ghi toàn bộ tải ghi của ứng dụng.

Để chia tỷ lệ ghi, bạn cần phân chia dữ liệu của mình một cách hợp lý trên nhiều máy chủ, bằng cách phân vùng hoặc "shending", v.v. Điều này thường đòi hỏi các thay đổi không cần thiết (nghĩ rất khó kiểm tra) cho ứng dụng của bạn, vì vậy bạn không muốn làm điều này trừ khi bạn THỰC SỰ cần nó.


Tất nhiên bạn có thể sử dụng cụm MySQL nếu bạn thực sự muốn, nhưng đó là một công cụ hoàn toàn khác với các tính năng và nhược điểm riêng - việc cài đặt hơi phức tạp nhưng thực sự cung cấp cơ sở dữ liệu cân bằng tải HA trên phần cứng hàng hóa. Nó vẫn phải chịu các hình phạt về hiệu suất ghi khi sử dụng sao chép đồng bộ, nhưng cho phép bạn chia tỷ lệ ghi vì nó đã được xây dựng trong phân vùng trên các máy chủ.


3

Một hướng dẫn tuyệt vời khác về chủ đề này tôi đã tìm thấy ...

http://www.dancowder.com/2010/01/mysql-circular-replication

Đây là phần 1 của loạt bài ba bài:

  • Hướng dẫn cụm cân bằng tải của MySQL - Phần 1 - tự thiết lập các máy chủ và định cấu hình sao chép MySQL.

  • Hướng dẫn cụm cân bằng tải của MySQL - Phần 2 - thiết lập một tập lệnh để theo dõi trạng thái của các nút cụm MySQL của bạn, chúng tôi sẽ sử dụng trong hướng dẫn tiếp theo để thiết lập proxy của chúng tôi.

  • Hướng dẫn cụm cân bằng tải của MySQL - Phần 3 - thiết lập bộ cân bằng tải với HAProxy, sử dụng các tập lệnh giám sát


2

Cá nhân, cách tốt hơn là sử dụng bộ cân bằng tải!

Đúng, nó có thêm một điểm thất bại, nhưng bất kỳ thói quen nào bạn đặt, hoặc cài đặt trên MỌI máy khách, sẽ phức tạp hơn nhiều so với bộ cân bằng tải tiêu chuẩn ....


Điều này có ý nghĩa, nhưng vấn đề là điểm thất bại duy nhất - ngay cả với 2 LB ... Trong trường hợp một trong những khách hàng gặp sự cố, chỉ có nó bị ảnh hưởng và không có ai khác.

Thật khó để duy trì LB trên mỗi nút. Nếu bạn cài đặt LB trên 12 máy chủ và sau đó Bạn sẽ muốn thay đổi một cái gì đó (địa chỉ của một trong các DB hoặc thêm DB hoặc một cái gì đó) - Bạn sẽ nhận thấy sự cố. Tôi đã làm.

1

Trình kết nối / J có khả năng truy vấn cân bằng tải trên một số máy chủ. Điều này chủ yếu dành cho MySQL NDB Cluster trong đó tất cả các nút SQL sẽ có chế độ xem dữ liệu nhất quán nhưng nếu bạn có thể đảm bảo rằng cơ sở dữ liệu hai thạc sĩ sẽ thống nhất hợp lý giữa hai chủ này thì có thể an toàn cho ứng dụng của bạn.

Chuỗi kết nối sẽ trông giống như:

jdbc: mysql: loadbalance: // host-1, host-2, ... host-n / dbname? loadBalanceStrargety = "ngẫu nhiên" & loadBalanceBlacklistTimeout = 5000


0

Chia tách ghi sẽ không tải xuống các máy chủ vì ghi vẫn phải được sao chép.

Nếu bạn chỉ sử dụng 2 máy chủ, hãy sử dụng heartbeat với drbd và để drbd xử lý sao chép. Nếu máy chủ thứ nhất thất bại, máy chủ thứ hai sẽ tiếp quản. Nếu bạn muốn đặt máy chủ thứ hai để sử dụng, bạn có thể sử dụng gfs trên drbd và sau đó chạy máy chủ thứ hai dưới dạng chỉ đọc và sử dụng nó làm máy chủ đọc. Khi chuyển đổi dự phòng xảy ra, sau đó thay đổi máy chủ để đọc / ghi.

re: wackamole - wackamole không giới hạn ở 2 máy chủ

Tôi đang làm việc trên một loạt hướng dẫn bao gồm điều này, nhưng nó thực sự đơn giản để thiết lập.


Vâng, về lý thuyết, wackamole có thể hỗ trợ hơn 2 máy chủ, nhưng bạn đã bao giờ thử điều này trong sản xuất chưa? Chúng tôi đã làm. Bây giờ chúng tôi rất hối hận.

Cho đến nay tôi không có vấn đề gì, ngoài thực tế là tôi không thể biên dịch nó dưới centos 5 64 bit

0

Để đưa ra câu trả lời gần đây hơn cho câu hỏi này, với phiên bản 5.6 của MySQL, nó đã giới thiệu GTID (Mã định danh giao dịch toàn cầu) nhằm mục đích làm cho bản sao không đồng bộ mạnh mẽ hơn và đưa MySQL vào cuộc đua về HA (Tính sẵn sàng cao) một lần nữa.

Phần này giải thích sao chép dựa trên giao dịch bằng cách sử dụng số nhận dạng giao dịch toàn cầu (GTID). Khi sử dụng GTID, mỗi giao dịch có thể được xác định và theo dõi vì nó được cam kết trên máy chủ ban đầu và được áp dụng bởi bất kỳ nô lệ nào; điều này có nghĩa là không cần thiết khi sử dụng GTID để chỉ các tệp nhật ký hoặc vị trí trong các tệp đó khi bắt đầu một nô lệ mới hoặc không chuyển sang chủ mới, điều này giúp đơn giản hóa rất nhiều các tác vụ này. Vì sao chép dựa trên GTID hoàn toàn dựa trên giao dịch, nên việc xác định liệu chủ và nô lệ có nhất quán hay không; miễn là tất cả các giao dịch được thực hiện trên một chủ cũng được cam kết trên một nô lệ, tính nhất quán giữa hai giao dịch được đảm bảo. Bạn có thể sử dụng bản sao dựa trên câu lệnh hoặc dựa trên hàng với GTID (xem Phần 16.2.1, Định dạng sao chép bản sao); tuy nhiên, để có kết quả tốt nhất,

Tham khảo: 16.1.3 Sao chép với Số nhận dạng giao dịch toàn cầu (Tài liệu MySQL)

Tôi nghĩ rằng việc sử dụng HAProxy cho các truy vấn cân bằng tải đang giới thiệu SPOF (Điểm duy nhất thất bại) và thêm nhịp tim khiến giải pháp này trở nên cồng kềnh.

Một giải pháp đơn giản hơn là kết nối thông qua trình kết nối Java JConnector nhằm mục đích tải các truy vấn cân bằng thông qua url jdbc với tất cả các nút MySQL. Nó có thể xử lý các thiết lập master / Slave hoặc master / master .

Điều đó cho phép thiết lập một giải pháp cụm HA ra khỏi hộp với MySQL.

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.