Bản sao MySQL có bị ảnh hưởng bởi kết nối có độ trễ cao không?


11

Chúng ta đã có một thiết lập MySQL chủ và nô lệ vanilla cư trú trong các trung tâm dữ liệu khác nhau và một nô lệ khác trong cùng một trung tâm dữ liệu là chủ.

Băng thông giữa trung tâm dữ liệu khá cao (trong các điểm chuẩn mạng chúng tôi đã thực hiện, chúng tôi có thể đạt tới 15MB / giây), nhưng độ trễ tồn tại là khoảng 28ms. Nó không cao bằng bất kỳ phương tiện nào, nhưng nó cao hơn nhiều so với độ trễ dưới giây trong cùng một trung tâm dữ liệu.

Thỉnh thoảng, chúng tôi gặp phải độ trễ nghiêm trọng (2000 giây trở lên) với việc xóa nô lệ, trong khi nô lệ địa phương luôn cập nhật. Khi nhìn vào nô lệ từ xa bị trễ, luồng SQL thường dành thời gian chờ đợi luồng IO để cập nhật nhật ký chuyển tiếp. Bậc thầy cho thấy "chờ mạng" hoặc một cái gì đó cùng loại.

Vì vậy, nó có nghĩa là mạng, nhưng chúng tôi vẫn có băng thông miễn phí tại thời điểm điều này xảy ra.

Câu hỏi của tôi là : độ trễ giữa các trung tâm dữ liệu có ảnh hưởng đến hiệu suất sao chép không? Có phải chủ đề io nô lệ chỉ truyền phát các sự kiện cho đến khi chủ ngừng gửi chúng, hoặc nó đang gộp chủ bằng cách nào đó giữa các sự kiện?


2000 giây? Vì vậy, độ trễ 33 phút?
Richard

Đúng ... Nó lên xuống trong suốt cả ngày.
shlomoid

2
+1 vì tôi thích các loại câu hỏi trong trang web này. Xin hãy thông báo cho những người khác đến trang web này với những câu hỏi có tính chất này !!!
RolandoMySQLDBA

Câu trả lời:


7

Câu trả lời trực tiếp cho câu hỏi của bạn là Có, nhưng nó phụ thuộc vào phiên bản MySQL bạn đang chạy. Trước MySQL 5.5, sao chép sẽ hoạt động như sau:

  • Thạc sĩ thực thi SQL
  • Master Records Sự kiện SQL trong Nhật ký nhị phân của nó
  • Slave đọc sự kiện SQL từ Nhật ký nhị phân chính
  • Slave lưu trữ sự kiện SQL trong Nhật ký chuyển tiếp của nó thông qua chủ đề I / O
  • Slave đọc sự kiện SQL tiếp theo từ Nhật ký chuyển tiếp thông qua SQL Thread
  • Nô lệ thực thi SQL
  • Slave thừa nhận Bậc thầy về việc thực thi hoàn toàn sự kiện SQL

Kể từ MySQL 5.5, sử dụng Sao chép bán đồng bộ , giờ đây, sao chép sẽ hoạt động như sau:

  • Thạc sĩ thực thi SQL
  • Master Records Sự kiện SQL trong Nhật ký nhị phân của nó
  • Slave đọc sự kiện SQL từ Nhật ký nhị phân chính
  • Slave thừa nhận Bậc thầy về sự kiện SQL
  • Slave lưu trữ sự kiện SQL trong Nhật ký chuyển tiếp của nó thông qua chủ đề I / O
  • Slave đọc sự kiện SQL tiếp theo từ Nhật ký chuyển tiếp thông qua SQL Thread
  • Nô lệ thực thi SQL
  • Slave thừa nhận Bậc thầy về việc thực thi hoàn toàn sự kiện SQL

Mô hình mới này sẽ cho phép một Slave được đồng bộ hóa chặt chẽ hơn với Master của nó.

Mặc dù vậy, độ trễ trong mạng có thể cản trở Bản sao Semisync của MySQL đến điểm mà nó trở lại bản sao không đồng bộ kiểu cũ. Tại sao ? Nếu thời gian chờ xảy ra mà không có bất kỳ nô lệ nào thừa nhận giao dịch, chủ sẽ hoàn nguyên về sao chép không đồng bộ. Khi có ít nhất một nô lệ bán đồng bộ bắt kịp, chủ sẽ quay trở lại sao chép bán đồng bộ.

CẬP NHẬT 2011-08-08 14:22 EDT

Cấu hình của bản sao bán đồng bộ MySQL 5.5 rất đơn giản

Bước 1) Thêm bốn (4) dòng này vào /etc/my.cnf

[mysqld]
plugin-dir=/usr/lib64/mysql/plugin
#rpl_semi_sync_master_enabled
#rpl_semi_sync_master_timeout=5000
#rpl_semi_sync_slave_enabled

Bước 2) Khởi động lại MySQL

service mysql restart

Bước 3) Chạy các lệnh này trong máy khách MySQL

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
INSTALL PLUGIN rpl_semi_sync_slave  SONAME 'semisync_slave.so';

Bước 4) Bỏ ghi chú ba tùy chọn rpm_semi_sync sau tùy chọn plugin-dir

[mysqld]
plugin-dir=/usr/lib64/mysql/plugin
rpl_semi_sync_master_enabled
rpl_semi_sync_master_timeout=5000
rpl_semi_sync_slave_enabled

Bước 5) Khởi động lại MySQL

service mysql restart

Tất cả đã được làm xong !!! Bây giờ chỉ cần thiết lập bản sao MySQL như bình thường.


Tôi không chắc chắn về giai đoạn cuối của sự sao chép không đồng bộ - Tôi không nghĩ chủ nhân biết mọi nô lệ đã đi được bao xa. Họ có thể yêu cầu bất kỳ phần nào của nhật ký nhị phân mà họ muốn, theo như tôi biết - bạn có tham khảo gì cho việc này không?
shlomoid

Ngoài ra, chúng tôi đang sử dụng bản sao không đồng bộ mặc định trong MySQL, không phải loại không đồng bộ - cần được bật theo mục đích bằng cách cài đặt plugin và lượt thích. Điều tôi đang cố gắng hiểu là liệu các sự kiện được dẫn theo kiểu mèo ròng vào nô lệ từ vị trí bắt đầu trong nhật ký hay là có sự trao đổi qua lại giữa chủ và nô lệ cho mỗi sự kiện, có thể phải chịu độ trễ như vậy.
shlomoid

Bằng mọi cách, tôi thực sự khuyên bạn nên sử dụng MySQL 5.5 để tận dụng hình thức Sao chép MySQL mới này cũng như các cải tiến của InnoDB.
RolandoMySQLDBA

1
Vâng, tất nhiên chúng tôi đang sử dụng MySQL 5.5, nhưng đây không phải là kiểu sao chép mặc định. Bạn cần phải trải qua toàn bộ quy trình cấu hình, cài đặt plugin và như vậy, để nó hoạt động theo cách bán đồng bộ.
shlomoid

2

Tôi thực sự thích cách Rolando mô tả chuỗi các hoạt động mà một bản sao thực hiện. Tuy nhiên, tôi nghĩ sẽ rõ ràng hơn nếu chúng ta thêm một thành phần khác - máy khách.

Với máy khách, chuỗi thao tác sao chép không đồng bộ có thể như sau:

  1. Máy khách gửi cho chủ truy vấn SQL (ví dụ: chèn) bằng các giao dịch

  2. Sư phụ thực hiện giao dịch. Trong trường hợp thành công, bản ghi được lưu trữ trên đĩa, nhưng giao dịch chưa được cam kết.

  3. Master ghi lại sự kiện chèn trong nhật ký nhị phân chính Nếu chủ không thể lưu trữ nó trong nhật ký nhị phân, giao dịch được khôi phục.

  4. Khách hàng nhận được phản hồi từ chủ (thành công hoặc rollback).

  5. Trong trường hợp giao dịch thành công, luồng kết xuất trên bản gốc đọc sự kiện từ nhật ký nhị phân và gửi nó đến luồng I / O nô lệ.

  6. Chủ đề I / O nô lệ nhận sự kiện và ghi nó vào cuối tệp nhật ký chuyển tiếp.

  7. Khi sự kiện đã vào nhật ký chuyển tiếp, luồng SQL nô lệ thực thi
    sự kiện để áp dụng các thay đổi cho cơ sở dữ liệu trên Slave.

Trong kịch bản này, chủ nhân không quan tâm đến nô lệ và khách hàng chỉ biết rằng có điều gì đó không ổn đối với nô lệ bằng cách thực hiện thủ công lệnh "SHOW SLAVE STATUS".

n trường hợp sao chép bán đồng bộ, chuỗi các thao tác có thể như sau:

  1. Máy khách gửi cho chủ truy vấn SQL (ví dụ: chèn) bằng các giao dịch.

  2. Sư phụ thực hiện giao dịch. Trong trường hợp thành công, bản ghi được lưu trên đĩa, nhưng giao dịch không được cam kết.

  3. Master ghi lại sự kiện chèn trong nhật ký nhị phân chính Nếu chủ không thể lưu trữ nó trong nhật ký nhị phân, giao dịch được khôi phục và khách hàng chỉ nhận được phản hồi trong trường hợp quay ngược lại.

  4. Do sự thành công của giao dịch trên bản gốc, luồng kết xuất trên bản gốc đọc sự kiện từ nhật ký nhị phân và gửi nó đến luồng I / O nô lệ.

  5. Chủ đề I / O nô lệ nhận sự kiện và ghi nó vào cuối tệp nhật ký chuyển tiếp.

  6. Slave Acrecledges Làm chủ bản ghi sự kiện trong tệp nhật ký chuyển tiếp.

  7. Master cam kết giao dịch chèn.

  8. Khách hàng nhận được phản hồi từ chủ (thành công).

  9. Khi sự kiện đã vào nhật ký chuyển tiếp, luồng SQL nô lệ thực thi
    sự kiện. Sư phụ và khách hàng không biết liệu cuộc hành quyết có thành công hay không.

Bản sao bán đồng bộ đã giải quyết một trường hợp quan trọng khi nô lệ hoặc mạng chết và chủ tiếp tục tiến hành. Sau đó, master chết và bạn muốn khởi động lại nô lệ cũ như chủ mới chỉ vì bạn đã sửa nút đó.

Vì vậy, bạn đã bắt đầu nút đó với tư cách là chủ mới, bạn đã sửa lỗi chủ cũ và bây giờ bạn muốn sử dụng nó làm nô lệ. Nút đó vẫn có dữ liệu, nhưng nếu nô lệ mới bắt đầu từ vị trí mà chủ mới bắt đầu thì sẽ có các bản ghi trùng lặp.

Nếu thời gian chờ là vô hạn, vị trí nhật ký nhị phân chính sẽ luôn đồng bộ với vị trí nhật ký chuyển tiếp nô lệ giả định rằng tất cả các truy vấn trên nô lệ đã thành công. Làm thế nào thực tế giả định này?

Tôi nghĩ nó rất thực tế. Một trong những trường hợp phổ biến nhất của lỗi truy vấn nô lệ là "bản ghi trùng lặp". Trường hợp bản ghi trùng lặp đến nô lệ nếu chủ không có nó? Nó đến từ vị trí sai được trao cho nô lệ để bắt đầu sao chép. Vị trí sao chép bắt đầu bao gồm bản ghi đã được sao chép. Trong trường hợp nhân rộng bán đồng bộ, tình huống này sẽ không xảy ra.

Jacob Nikom


1

Vòng loại : Tôi không phải là người dùng MySQL, vì vậy, đây chỉ là nghiên cứu của tôi trên internet.

Như tôi chắc chắn bạn biết, hạn chế lớn nhất của sao chép MySQL là nó đơn luồng. Vì vậy, trong khi luồng đang bận gửi dữ liệu đến nô lệ trong nhà, thì nó sẽ không thể gửi dữ liệu đến nô lệ từ xa. Đây là mỗi ở đây .


Mỗi đây :

Một điều mà bạn cần chắc chắn phải làm là giảm thời gian giao dịch. Điều này cho phép luồng nhân rộng của bạn có cơ hội bắt kịp những gì đang diễn ra trong cơ sở dữ liệu. Bạn muốn giao dịch của bạn càng ngắn càng tốt.

Một cách để làm điều này là thông qua việc truy vấn; giới hạn các hàng được thay đổi bởi CẬP NHẬT hoặc XÓA thông qua việc sử dụng các mệnh đề WHERE. Nếu bạn dính vào vòng lặp đó, bạn có thể lặp qua danh sách, bắt đầu và thực hiện giao dịch mỗi lần. (UPDATE / DELETE thứ ba đầu tiên, thứ ba giây, sau đó lần thứ ba thức mỗi giao dịch riêng của mình.) Cá nhân tôi sẽ mạnh mẽ khuyên làm điều này vì bạn mở lòng ra đón nhận khả năng của dữ liệu trong bảng thay đổi giữa các giao dịch. Nhưng, đó là một khả năng để cải thiện hiệu suất này nếu bạn chắc chắn rằng không có ai khác làm hỏng bảng (và sẽ không bao giờ) .

Một khả năng khác là không sao chép các giao dịch chạy dài đó mà thay vào đó, chạy chúng trên cả bản gốc (sao chép thành nô lệ cục bộ) và sau đó chạy riêng trên nô lệ từ xa. Điều này sẽ giải phóng chuỗi sao chép để nó không bị chậm lại đến hơn 30 phút.


Mỗi đây :

Một khả năng cuối cùng sẽ là điều chỉnh kích thước bộ đệm TCP của bạn. Mục tiêu là giảm số lượng liên lạc mà bạn thực hiện giữa chủ và nô lệ. Điều này có thể giúp giảm độ trễ.

Cá nhân, tôi sẽ thử điều này nếu tất cả những thứ khác thất bại. Tôi nghi ngờ rằng vấn đề này được gây ra nhiều hơn bởi hệ thống sao chép đơn luồng hơn là độ trễ mạng. Mạng thường sẽ hết thời gian dài trước mốc 30 phút. (30 phút?!)


Dấu trang ngon của Joutmerb có một số liên kết để sao chép mysql mà bạn có thể muốn kiểm tra.

Tôi hy vọng điều đó sẽ giúp.


1
Bạn nhận được +1 khi đề cập đến cách sao chép MySQL là một luồng đơn, nhưng tôi cần đủ điều kiện tuyên bố của bạn như sau: Bản sao MySQL được xử lý luồng kép bằng cách sử dụng một luồng I / O để tải xuống các sự kiện SQL từ Master sang Slave và một luồng SQL để xử lý Sự kiện SQL cục bộ trên Slave. Tuy nhiên, việc truyền các Sự kiện SQL là một luồng đơn, điều này đúng theo ngữ cảnh cho câu hỏi này.
RolandoMySQLDBA

2
BTW Vui lòng không sử dụng GIỚI HẠN với các câu lệnh CẬP NHẬT và XÓA vì thứ tự các hàng được cập nhật hoặc xóa có thể không giống nhau trên Slave như trên Master. Nếu thực tế, các thông báo cảnh báo về điều này xuất hiện một cái gì đó như "Statement Not BinLog-Safe" trong nhật ký lỗi.
RolandoMySQLDBA

Ôi, điểm hay của việc không sử dụng GIỚI HẠN với CẬP NHẬT và XÓA. Tôi sẽ sửa đổi câu trả lời của tôi để loại bỏ điều đó.
Richard
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.