2011-12-17 52 views
10

Tôi có một bản sao chủ/slave trên MySql DB của mình.MySql Replication - slave lagging phía sau master

DB nô lệ của tôi đã ngừng hoạt động trong vài giờ và được sao lưu lại (chính lúc nào cũng lên), khi phát hành show slave status Tôi có thể thấy rằng nô lệ là X giây phía sau chủ.

vấn đề là nô lệ không có vẻ để bắt kịp với các bậc thầy, những giây X đằng sau thầy không có vẻ để thả ...

bất kỳ ý tưởng về làm thế nào tôi có thể giúp các nô lệ bắt kịp?

+0

bạn có bảng khóa? –

+0

không phải là tôi biết của – Ran

+0

cuối cùng nô lệ sẽ bắt kịp, trừ khi bạn có tấn truy vấn như cập nhật và chèn trên tổng thể. bạn có rất nhiều truy vấn đến từ máy chủ không? –

Trả lời

13

Dưới đây là ý tưởng

Để bạn biết rằng MySQL đang xử lý hoàn toàn SQL từ nhật ký chuyển tiếp. Hãy thử các cách sau:

STOP SLAVE IO_THREAD; 

Thao tác này sẽ dừng sao chép các mục nhập mới từ bản gốc vào nhật ký chuyển tiếp.

Chủ đề khác, được gọi là chuỗi SQL, sẽ tiếp tục xử lý các câu lệnh SQL được tải xuống từ trình chủ.

Khi bạn chạy SHOW SLAVE STATUS\G, hãy để mắt đến Exec_Master_Log_Pos. Chạy lại SHOW SLAVE STATUS\G. Nếu Exec_Master_Log_Pos không di chuyển sau một phút, bạn có thể tiếp tục chạy START SLAVE IO_THREAD;. Điều này có thể làm giảm số lượng Seconds_Behind_Master.

Khác hơn thế, có thực sự là không có gì bạn có thể làm ngoại trừ việc:

  • Tín Replication
  • Monitor Seconds_Behind_Master
  • Monitor Exec_Master_Log_Pos
  • Run SHOW PROCESSLIST;, lưu ý các chủ đề SQL để xem nếu nó đang xử lý các truy vấn chạy dài.

BTW Hãy nhớ rằng khi bạn chạy SHOW PROCESSLIST; khi chạy sao chép, sẽ có hai kết nối DB có tên người dùng là system user. Một trong những kết nối DB sẽ có câu lệnh SQL hiện tại đang được xử lý bằng cách nhân bản. Miễn là một câu lệnh SQL khác nhau có thể nhìn thấy mỗi khi bạn chạy SHOW PROCESSLIST;, bạn có thể tin tưởng mysql vẫn đang sao chép đúng cách.

+0

Loại kỳ lạ nhưng dừng các chủ đề đã không giúp tôi, thay vì theo dõi Exec_Master_Log_Pos và hai phần từ người dùng hệ thống cho phép tôi không freak ra. Sau khi khởi động lại nô lệ, mọi thứ trở nên bình thường. Cảm ơn Rolando. –

3

"giây sau" không phải là một công cụ rất tốt để tìm hiểu xem tổng thể bạn thực sự là bao nhiêu. Những gì nó nói là "truy vấn tôi vừa thực hiện đã được thực hiện X giây trước trên chủ". Điều đó không có nghĩa là bạn sẽ bắt kịp và đứng ngay sau bậc thầy trong giây tiếp theo.

Nếu nô lệ của bạn thường không tụt lại phía sau và tải công việc trên tổng thể là không đổi, bạn sẽ bắt kịp, nhưng có thể mất một thời gian, thậm chí có thể mất "mãi mãi" nếu nô lệ bình thường với thầy. Slaves hoạt động trên một thread duy nhất vì vậy nó là do thiết kế chậm hơn nhiều so với master, cũng nếu có một số truy vấn mất một thời gian trên master, chúng sẽ chặn bản sao trong khi chạy trên slave.

1

Chỉ cần kiểm tra xem bạn có cùng thời gian và múi giờ trên cả hai máy chủ hay không, ví dụ: Chính cũng như Slave.

6

Bạn đang sử dụng định dạng nhật ký nhị phân nào?Bạn đang sử dụng ROW hoặc STATEMENT?

SHOW GLOBAL VARIABLES LIKE 'binlog_format'; 

Nếu bạn đang sử dụng ROW như một định dạng binlog chắc chắn rằng tất cả các bảng của bạn có tiểu hoặc Unique chính:

SELECT t.table_schema,t.table_name,engine 
FROM information_schema.tables t 
INNER JOIN information_schema .columns c 
on t.table_schema=c.table_schema 
and t.table_name=c.table_name 
and t.table_schema not in ('performance_schema','information_schema','mysql') 
GROUP BY t.table_schema,t.table_name 
HAVING sum(if(column_key in ('PRI','UNI'), 1,0)) =0; 

Nếu bạn thực hiện ví dụ một tuyên bố xóa trên tổng thể để xóa 1 triệu bản ghi trên một bảng mà không có PK hoặc khóa duy nhất thì chỉ có một lần quét toàn bộ bảng sẽ diễn ra trên mặt của chủ, không phải là trường hợp trên nô lệ.

Khi ROW binlog_format đang được sử dụng, MySQL ghi các thay đổi hàng vào nhật ký nhị phân (không phải là câu lệnh như STATEMENT binlog_format) và thay đổi đó sẽ được áp dụng trên hàng bên của hàng phụ, có nghĩa là 1 triệu bảng đầy đủ quét sẽ diễn ra trên các nô lệ để phản ánh chỉ có một tuyên bố xóa trên tổng thể và đó là gây ra vấn đề tụt hậu nô lệ.

0

Chúng tôi có cùng một vấn đề sau khi thiết lập nô lệ của chúng tôi từ bản sao lưu gần đây.

Chúng tôi đã thay đổi cấu hình của nô lệ của chúng tôi để có nhiều vụ tai nạn an toàn:

sync_binlog = 1 
sync_master_info = 1 
relay_log_info_repository = TABLE 
relay_log_recovery = 1 

Tôi nghĩ rằng đặc biệt là sync_binlog = 1 gây ra các vấn đề, như các thông số kỹ thuật của nô lệ này không phải là quá nhanh như trong bậc thầy. Tùy chọn cấu hình này buộc nô lệ lưu trữ mọi giao dịch trong lo nhị phân trước khi chúng được thực hiện (thay vì mỗi giao dịch 10k mặc định).

Sau khi vô hiệu hóa các tùy chọn cấu hình này trở lại các giá trị mặc định của chúng, tôi thấy rằng nô lệ đang bắt kịp trở lại.

0

Chỉ cần thêm kết quả vào trường hợp tương tự của tôi.

Có rất ít bảng tạm thời chèn/cập nhật/xóa đã xảy ra trong bản gốc chiếm phần lớn không gian từ nhật ký relay trong slave. Và trong Mysql 5.5, kể từ khi được đơn luồng, CPU luôn ở 100% và mất rất nhiều thời gian để xử lý các bản ghi này.

Tất cả tôi đã làm là để thêm các dòng trong mysql CNF tập tin

replicate-ignore-table=<dbname>.<temptablename1> 
replicate-ignore-table=<dbname>.<temptablename2> 

và mọi thứ trở nên mịn màng trở lại.

Sắp xếp để tìm ra bảng nào đang chiếm nhiều không gian hơn trong nhật ký chuyển tiếp, hãy thử lệnh sau rồi mở trong trình chỉnh sửa văn bản. Bạn có thể nhận được một số gợi ý

cd /var/lib/mysql 
mysqlbinlog relay-bin.000010 > /root/RelayQueries.txt 
less /root/RelayQueries.txt 
0

Nếu u có nhiều schema của xem xét sử dụng replication.This đa nô lệ ren là tính năng tương đối mới.

Điều này có thể được thực hiện tự động mà không cần dừng máy chủ.Chỉ cần dừng chuỗi chỉ số sql.

STOP SLAVE SQL_THREAD; 
SET GLOBAL slave_parallel_threads = 4; 
START SLAVE SQL_THREAD; 
Các vấn đề liên quan