Seconds_Behind_Master thực sự giống như xem quá khứ thông qua du hành thời gian.
Nghĩ theo cách này:
- Mặt trời là 93.000.000 dặm từ Trái Đất
- Vận tốc ánh sáng là 186.000 dặm / giây
- Phân chia đơn giản cho thấy phải mất khoảng 500 giây (8 phút 20 giây) để ánh sáng của Mặt trời đến Trái đất
- Khi bạn nhìn vào Mặt trời, bạn thực sự không thấy Mặt trời. Bạn thấy nơi đó là 8 phút 20 giây trước.
Theo cách tương tự, có vẻ như Master đang xử lý rất nhiều truy vấn cùng một lúc.
Bạn nhìn lại Slave, chạy SHOW SLAVE STATUS\G
và nó báo 200 cho Seconds_Behind_Master
. Con số đó được tính như thế nào? Thời gian đồng hồ của Slave (UNIX_TIMESTAMP (NOW ()) - TIMESTAMP của Truy vấn khi nó được hoàn thành và ghi lại trong Nhật ký nhị phân của Master.
Có một số liệu khác để xem xét bên cạnh Seconds_Behind_Master
. Số liệu đó được gọi là Relay_Log_Space
. Đó là tổng của tất cả các byte cho tất cả các tệp chuyển tiếp trên Slave. Theo mặc định, nhật ký chuyển tiếp đơn lớn nhất được giới hạn ở 1GB. Nếu Relay_Log_Space
dưới 1GB, điều này cho thấy rằng nhiều truy vấn chạy dài được thực thi song song trên Master. Thật không may, do tính chất SQL của Bản sao đơn luồng, các truy vấn được thực hiện nối tiếp nhau.
Ví dụ: giả sử bạn có kịch bản sau đây trên Master:
- Nhật ký truy vấn chậm được bật
- 20 truy vấn được thực hiện song song trên Master
- Mỗi truy vấn mất 3 giây
- Mỗi truy vấn được ghi lại trong Nhật ký nhị phân chính có cùng dấu thời gian
Khi Slave đọc các truy vấn đó từ nhật ký chuyển tiếp của nó và xử lý từng truy vấn một
- Đồng hồ của Slave sẽ di chuyển
- TIMESTAMP cho mỗi trong số 20 truy vấn sẽ giống hệt nhau
- sự khác biệt sẽ tăng 3 giây được hoàn thành truy vấn
- kết quả này trong 60 giây cho
Seconds_Behind_Master
Liên quan đến Nhật ký chậm, mặc định cho long_query_time là 10 giây. Nếu tất cả các truy vấn của bạn trong nhật ký chuyển tiếp dưới 10 giây, bạn sẽ không bao giờ bắt được bất cứ điều gì trong Nhật ký truy vấn chậm.
Tôi có các đề xuất sau cho cả máy chủ Master và Slave
- KIẾN NGHỊ # 1 : Nâng cấp lên MySQL 5.5 . Trong MySQL 5.5 và Percona Server 5.1,38+, bạn có thể điều chỉnh InnoDB để truy cập nhiều CPU. Tôi đã viết bài trước đây về điều này
- KIẾN NGHỊ # 2 : Sử dụng InnoDB cho tất cả các bảng . InnoDB lưu trữ dữ liệu và chỉ mục trong RAM, MyISAM chỉ lưu trữ các chỉ mục.
- KIẾN NGHỊ # 3 : Tăng RAM . Bạn phải lưu trữ nhiều dữ liệu và chỉ mục hơn trên Slave và Master như nhau
- KIẾN NGHỊ # 4 : Điều chỉnh tất cả các truy vấn. Giảm mili giây từ các truy vấn chạy hàng trăm lần sẽ giúp giảm bớt
Seconds_Behind_Master
.
THÊM XỬ LÝ SỰ CỐ
Nếu bạn muốn xem các truy vấn gây ra độ trễ thay thế, hãy làm như sau:
SHOW SLAVE STATUS\G
- Lấy tên của nhật ký chuyển tiếp từ
Relay_Log_File
STOP SLAVE;
START SLAVE;
- Trong HĐH,
cd /var/lib/mysql
hoặc bất cứ nơi nào ghi nhật ký chuyển tiếp
- Kết xuất nhật ký chuyển tiếp vào một tệp văn bản
Ví dụ: Hãy làm SHOW SLAVE STATUS\G
Slave_IO_State: Waiting for master to send event
Master_Host: 10.64.51.149
Master_User: replicant
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000009
Read_Master_Log_Pos: 1024035856
Relay_Log_File: relay-bin.000030
Relay_Log_Pos: 794732078
Relay_Master_Log_File: mysql-bin.000009
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB: search_cache
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1024035856
Relay_Log_Space: 794732271
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 106451149
Nếu tôi chạy STOP SLAVE; START SLAVE;
, nhật ký chuyển tiếp sẽ đóng và một cái mới được mở. Tuy nhiên, bạn muốn relay-bin.000030
.
Kết xuất nội dung như sau:
cd /var/lib/mysql
mysqlbinlog relay-bin.000030 > /root/RelayLogQueries.txt
less /root/RelayLogQueries.txt
Bây giờ bạn có thể thấy các truy vấn mà Slave hiện đang cố xử lý. Bạn có thể sử dụng các truy vấn đó làm điểm bắt đầu để điều chỉnh.