Điểm:1

Tính nhất quán của dữ liệu trong SQL AlwaysOn Availability Group

lá cờ ng

Tôi có cụm Luôn bật của SQL Server 2019, chứa Nhóm khả dụng gồm 3 bản sao ở chế độ Đồng bộ. Dựa theo tài liệu của Microsoft:

  1. Bản sao phụ làm cứng nhật ký và trả lại xác nhận cho bản sao chính.
  2. Khi nhận được xác nhận từ bản sao phụ, bản sao chính kết thúc quá trình xử lý cam kết và gửi thông báo xác nhận tới máy khách.

bài viết này đi vào chi tiết hơn và giải thích rằng:

  1. Trong bản sao phụ, Nhận nhật ký nhận các bản ghi nhật ký từ bản sao chính và ghi vào bộ đệm Nhật ký. Quá trình này được lặp lại trên mỗi bản sao phụ tham gia vào chế độ cam kết đồng bộ.
  2. Trên mỗi bản sao phụ, luồng Làm lại tồn tại và nó ghi tất cả các thay đổi được đề cập trong bản ghi nhật ký vào trang dữ liệu và trang chỉ mục. Nó xóa nhật ký để làm cứng nhật ký cơ sở dữ liệu thứ cấp.
  3. Như đã nêu trước đó, trong cam kết dữ liệu đồng bộ, bản sao chính chờ xác nhận từ bản sao phụ. Ở giai đoạn này, bản sao thứ cấp sẽ gửi xác nhận rằng quá trình xử lý cứng giao dịch đã hoàn tất trên bản sao thứ cấp.
  4. Sau khi Bản sao chính nhận được xác nhận từ bản sao phụ, nó sẽ gửi thông báo hoàn thành giao dịch tới máy khách.

Vì vậy, nếu tôi hiểu đúng: Nếu tôi cập nhật thành công một bản ghi qua Bản sao chính, thì giá trị được cập nhật này sẽ là ngay lập tức có sẵn cho khách hàng truy vấn các bản sao thứ cấp.

Tuy nhiên, khi tôi kiểm tra điều này, cái này không hoạt động nên. Tôi chạy một tệp bó đơn giản, trông như thế này:

sqlcmd -E -S tcp:SQL-AG-Listener -d TestDB -Q "BẮT ĐẦU GIAO DỊCH; CẬP NHẬT TestSyncTable SET CurrentTime='%currentTime%'; CAM KẾT GIAO DỊCH;"
sqlcmd -E -S tcp:SQL-Server01 -d TestDB -Q "CHỌN * TỪ TestSyncTable" -K ReadOnly
sqlcmd -E -S tcp:SQL-Server02 -d TestDB -Q "CHỌN * TỪ TestSyncTable" -K ReadOnly
sqlcmd -E -S tcp:SQL-Server03 -d TestDB -Q "CHỌN * TỪ TestSyncTable" -K ReadOnly

Vì vậy, tôi đang cập nhật Thời điểm hiện tại trường thông qua bản sao Chính (lưu trữ Trình nghe AG) và sau đó đọc nó ngay lập tức qua cả ba bản sao. Mỗi sqlcmd lệnh là một quy trình máy khách riêng biệt, do đó, nó sẽ mở kết nối TCP độc lập của riêng mình.

Và sau đó tôi thấy một cái gì đó như thế này:

SQL-Server01: Thời gian hiện tại = 20:02:19,93
SQL-Server02: Thời gian hiện tại = 20:02:16,94
SQL-Server03: Thời gian hiện tại = 20:02:19,93

(Đã định dạng lại đầu ra để dễ đọc hơn tại đây)

Theo những gì tôi thấy, bản sao Chính luôn trả về giá trị được cập nhật. Và các lớp thứ hai cũng vậy - nhưng chỉ có một số độ trễ ngắn.

Vì vậy, câu hỏi là: tại sao? Chế độ Đồng bộ có nên đảm bảo rằng kết quả của thao tác đọc phù hợp với thao tác ghi không? Nếu bản sao phụ chỉ gửi xác nhận sau khi chuỗi Làm lại của nó cập nhật trang dữ liệu - thì làm sao có thể?

Cảm ơn, chất nhày.

Điểm:1
lá cờ cn

Từ cùng một bài viết SQL Shack mà bạn đã trích dẫn trong câu hỏi của mình:

  1. Bản sao phụ cũng chứa một luồng làm lại và nó độc lập với quy trình chặn nhật ký trong SQL Server Luôn bật. Các chủ đề làm lại đọc nhật ký từ bộ nhớ đệm nhật ký. Có thể có sự chậm trễ trong quá trình xử lý bởi chuỗi làm lại và các bản ghi nhật ký có thể không có sẵn trong bộ nhớ đệm nhật ký vì nó đã được ghi cứng vào đĩa. Trong trường hợp này, hãy làm lại các khối nhật ký đọc luồng từ đĩa nhật ký.

Điều mà tôi đọc được có nghĩa là quy trình làm cứng nhật ký không làm cho các thay đổi có sẵn ngay lập tức trong cơ sở dữ liệu thứ cấp mà thay vào đó, chuỗi làm lại trên cơ sở thứ cấp cần xử lý chúng trước.

Cat Mucius avatar
lá cờ ng
Vâng, có vẻ như bài viết số 6 của SQL Shack gây hiểu lầm. Bản thân quy trình ghi các thay đổi trong cơ sở dữ liệu độc lập với quy trình làm cứng nhật ký và xác nhận được gửi đến bản sao Chính mà không phụ thuộc vào công việc của nó. Bài viết này của Microsoft cũng hỗ trợ điều này: https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2012/dn135338(v=sql.110)

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.