Tự động chuyển đổi dự phòng DB trong c # không hoạt động khi máy chủ chính thực sự ngoại tuyến


9

Tôi đang thiết lập chuyển đổi dự phòng tự động DB trong C # với SQL Server 2008 và tôi có 'độ an toàn cao với gương chuyển đổi dự phòng tự động' bằng cách sử dụng thiết lập nhân chứng và chuỗi kết nối của tôi trông giống như

"Server=tcp:DC01; Failover Partner=tcp:DC02; database=dbname; uid=sewebsite;pwd=somerndpwd;Connect Timeout=10;Pooling=True;"

Trong quá trình thử nghiệm, khi tôi tắt dịch vụ SQL Server trên máy chủ chính, tính năng tự động chuyển đổi dự phòng sẽ hoạt động như một cơ duyên, nhưng nếu tôi lấy máy chủ chính ngoại tuyến (bằng cách tắt máy chủ hoặc tắt thẻ mạng) thì chuyển đổi tự động không hoạt động và tôi trang web chỉ cần thời gian ra.

Tôi đã tìm thấy bài viết này trong đó bài đăng cuối cùng thứ hai gợi ý rằng đó là vì chúng tôi đang sử dụng các đường ống có tên không hoạt động khi hiệu trưởng ngoại tuyến, nhưng chúng tôi buộc TCP trong chuỗi kết nối của chúng tôi.

Tôi còn thiếu gì để chuyển đổi dự phòng tự động DB này hoạt động?


Cái này có cần thẻ [C #] không? Nó dường như không đặc trưng cho C # theo bất kỳ cách nào.
Gabe

Câu trả lời:


6

Sau khi làm việc với MS được một tuần, chúng tôi đã tìm ra lý do tại sao điều này xảy ra.

Về cơ bản, ứng dụng không bị lỗi vì cần chắc chắn rằng cơ sở dữ liệu đã bị lỗi - và kết nối sql đã hết thời gian trước khi kết nối xác định rằng db đã bị lỗi.

Quá trình xác nhận rằng cơ sở dữ liệu đã thất bại (với tất cả các cài đặt đăng ký tcp mặc định) là:

  1. cố gắng liên lạc với hiệu trưởng, thấy rằng đó không phải là hiệu trưởng nữa
  2. liên lạc với failover để đảm bảo rằng nó đã thất bại và bây giờ nó là hiệu trưởng mới.

Khi hiệu trưởng ngừng hoạt động, giao tiếp này mất khoảng 21 giây vì nó sẽ:

  1. cố gắng liên lạc với hiệu trưởng, đợi 3 giây, hết thời gian
  2. cố gắng liên lạc lại với hiệu trưởng, đợi 6 giây, hết thời gian
  3. cố gắng liên lạc lại với hiệu trưởng, đợi 12 giây, hết thời gian
  4. cố gắng liên lạc với đối tác failover, thấy rằng nó đã thất bại, vì vậy thất bại trong ứng dụng.

Vì vậy, nếu kết nối sql của bạn không chờ 21 giây (có thể nhiều hơn trong thực tế) thì nó sẽ hết thời gian chờ trước khi kết thúc điệu nhảy này và nó sẽ không thất bại chút nào.

Giải pháp là đặt thời gian chờ trong chuỗi kết nối của bạn thành giá trị lớn, chúng tôi sử dụng 60 giây để an toàn.

Chúc mừng


0

Tôi tự hỏi nếu các điều kiện của chuyển đổi dự phòng tự động không được đáp ứng tại thời điểm kiểm tra của bạn? Cụ thể - nếu cơ sở dữ liệu không được đồng bộ hóa với máy nhân bản (kiểm tra trạng thái phản chiếu từ sys.database_mirroring) tại thời điểm thất bại VÀ / HOẶC nếu nhân chứng và gương không được kết nối tại thời điểm đó (kiểm tra qua ping giữa các vai trò tham gia).

Bạn cũng có thể gặp tình huống Đối tác và Gương của bạn không được kết nối với nhau - nhưng cơ sở dữ liệu đối tác và gương vẫn được kết nối độc lập với nhân chứng. Trong trường hợp đó, nhân chứng thấy không có gì sai (và do đó không có chuyển đổi dự phòng). Nhưng bạn đã đề cập rằng bạn tự tắt máy chủ, vì vậy điều này có vẻ ít khả năng hơn.

Hoặc bạn đang nói rằng chuyển đổi dự phòng cuối cùng xảy ra nhưng kết nối lại của bạn không thành công? Trong trường hợp này, thời gian phát hiện và chuyển đổi dự phòng khác nhau tùy thuộc vào cách hiệu trưởng thất bại và tổng thời gian để khôi phục db gương.

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.