Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Khắc phục sự cố AlwaysOn - Đôi khi phải xem xét nhiều lần

Một vài tuần trước, tôi đã bắt đầu định cấu hình môi trường demo với nhiều cấu hình của Nhóm sẵn sàng AlwaysOn. Tôi có một cụm WSFC 5 nút - mỗi nút có một phiên bản độc lập có tên là SQL Server 2012 và cũng có hai Phiên bản cụm chuyển đổi dự phòng (FCI) được thiết lập trên đầu các nút này. Sơ đồ nhanh:

Vì vậy, bạn có thể thấy có 5 phiên bản được đặt tên độc lập (.\AGDEMO trên mỗi nút), và sau đó là hai FCI - một có thể có chủ sở hữu VM-AARON-1 và VM-AARON-2 (AGFCI1\AGFCI1 ), và sau đó là một với các chủ sở hữu có thể là VM-AARON-3, VM-AARON-4 và VM-AARON-5 (AGFCI2\AGFCI2 ). Bây giờ, việc lập sơ đồ theo cách thủ công sẽ phải phức tạp hơn đáng kể (sẽ nói thêm về điều đó sau), vì vậy tôi sẽ tránh nó vì những lý do rõ ràng. Về cơ bản, yêu cầu là phải có nhiều loại cấu hình AG:

  • Chính trên một FCI với một bản sao trên một hoặc nhiều bản sao độc lập
  • Chính trên một FCI với một bản sao trên một FCI khác
  • Chính trên một bản sao độc lập với bản sao trên một hoặc nhiều FCI
  • Chính trên một bản sao độc lập với một bản sao trên một hoặc nhiều bản sao độc lập
  • Chính trên một bản sao độc lập với các bản sao trên cả bản sao độc lập và FCIs

Và sau đó là sự kết hợp (nếu có thể) của cam kết đồng bộ so với không đồng bộ, chuyển đổi dự phòng thủ công so với tự động và bản phụ chỉ đọc. Có một số hạn chế kỹ thuật sẽ hạn chế các hoán vị có thể có ở đây, ví dụ:

  • Chuyển đổi dự phòng thủ công là cần thiết với bất kỳ bản sao nào có trên FCI
  • Không có nút WSFC nào có thể lưu trữ - hoặc thậm chí có thể là chủ sở hữu của - nhiều phiên bản, dù là độc lập hay nhóm, có liên quan đến cùng một Nhóm sẵn có. Bạn nhận được thông báo lỗi này:Không thể tạo, tham gia hoặc thêm bản sao vào nhóm khả dụng 'MyGroup', vì nút 'VM-AARON-1' có thể là chủ sở hữu cho cả bản sao 'AGFCI1 \ AGFCI1' và 'VM-AARON-1 \ AGDEMO '. Nếu một bản sao là phiên bản cụm chuyển đổi dự phòng, hãy xóa nút chồng chéo khỏi các chủ sở hữu có thể có của nó và thử lại. (Microsoft SQL Server, Lỗi:19405)

Hầu hết các tình huống mà tôi đang cố gắng trình bày đều không thực tế trong các tình huống trong thế giới thực, nhưng về mặt lý thuyết chúng có thể . Nếu bây giờ bạn vẫn chưa đoán ra, thì môi trường này đang được thiết lập rõ ràng để kiểm tra chức năng mới xung quanh Nhóm khả dụng mà chúng tôi dự định cung cấp trong phiên bản SQL Sentry trong tương lai. Chúng tôi đã giới thiệu sơ lược về một số công nghệ này trong bài phát biểu quan trọng của chúng tôi với Fusion-io tại hội nghị Giao lộ SQL gần đây ở Las Vegas.

Chướng ngại vật số 1

Thiết lập Nhóm khả dụng bằng trình hướng dẫn trong SSMS khá dễ dàng. Ví dụ, trừ khi bạn có đường dẫn tệp không đồng nhất. Trình hướng dẫn có xác thực đảm bảo rằng dữ liệu và đường dẫn nhật ký giống nhau tồn tại trên tất cả các bản sao. Điều này có thể gây khó khăn nếu bạn đang sử dụng đường dẫn dữ liệu mặc định cho hai phiên bản được đặt tên khác nhau hoặc nếu bạn có cấu hình ký tự ổ đĩa khác nhau (điều này thường xảy ra khi có liên quan đến FCI).

Kiểm tra tính tương thích của vị trí tệp cơ sở dữ liệu trên bản sao thứ cấp dẫn đến lỗi. (Microsoft.SqlServer.Management.HadrTasks)

Các vị trí thư mục sau không tồn tại trên phiên bản máy chủ lưu trữ bản sao thứ cấp VM-AARON-1 \ AGDEMO:

P:\ MSSQL11.AGFCI2 \ MSSQL \ DATA;
(Microsoft.SqlServer.Management.HadrTasks)

Bây giờ không cần phải nói rằng bạn không muốn thiết lập kịch bản này trong bất kỳ loại môi trường nào cần phải chịu đựng thử thách của thời gian. Mọi thứ sẽ đi về phía nam rất nhanh, chẳng hạn như sau này bạn thêm một tệp mới vào một trong các cơ sở dữ liệu. Nhưng đối với môi trường thử nghiệm / demo, bằng chứng về khái niệm hoặc môi trường mà bạn mong đợi sẽ ổn định trong một thời gian đáng kể, đừng lo lắng:bạn vẫn có thể làm điều này mà không cần trình hướng dẫn.

Thật không may, để thêm sự xúc phạm đến chấn thương, trình hướng dẫn không cho phép bạn viết kịch bản cho nó. Bạn không thể vượt qua lỗi xác thực và không có Script nút:

Vì vậy, điều này có nghĩa là bạn cần phải tự mã nó (vì DDL không thực hiện bất kỳ xác thực "hữu ích" nào cho bạn). Nếu bạn có các trường hợp khác tồn tại các đường dẫn giống nhau, bạn có thể thực hiện việc này bằng cách làm theo cùng một trình hướng dẫn, đi qua màn hình xác thực, sau đó nhấp vào Script thay vì Finish và thay đổi (các) tên máy chủ và thêm bằng WITH MOVE các tùy chọn để khôi phục ban đầu. Hoặc bạn có thể tự viết từ đầu, tương tự như thế này (tập lệnh giả định rằng bạn đã định cấu hình các điểm cuối và quyền và tất cả các phiên bản đã bật tính năng Nhóm khả dụng):

 - Sử dụng chế độ SQLCMD và bỏ ghi chú các lệnh:CONNECT-- hoặc chỉ chạy hai phân đoạn riêng biệt / thay đổi kết nối--:CONNECT Server1 TẠO NHÓM CÓ SN [Tên nhóm] VỚI (AUTOMATED_BACKUP_PREFERENCE =SECONDARY) CHO DATABASE [Cơ sở dữ liệu1] - , ... REPLICA ON - chính:N'Server1 'WITH (ENDPOINT_URL =N'TCP:// Server1:5022', FAILOVER_MODE =MANUAL, AVAILABILITY_MODE =ASYNCHRONOUS_COMMIT, BACKUP_PRIORITY =50, SECONDARY_ROLE), ALLOW_C - phụ:N'Server2 'WITH (ENDPOINT_URL =N'TCP:// Server2:5022', FAILOVER_MODE =MANUAL, AVAILABILITY_MODE =ASYNCHRONOUS_COMMIT, BACKUP_PRIORITY =50, SECONDARY_ROLE (ALLOW_CONNECTIONS =NO)); ALTER AVAILABILITY GROUP [GroupName] ADD LISTENER N'ListenerName '(VỚI IP ((N'10.x.x.x', N'255.255.255.0 ')), PORT =1433); CƠ SỞ DỮ LIỆU DỰ PHÒNG1 TO DISK ='\\ Server1 \ Share \ db1.bak' VỚI INIT, COPY_ONLY, COMPRESSION; BACKUP LOG Database1 TO DISK ='\\ Server1 \ Share \ db1.trn' VỚI INIT, COMPRESSION; -:CONNECT Server2ALTER AVAILABILITY GROUP [Tên nhóm] THAM GIA; KHÔI PHỤC CƠ SỞ DỮ LIỆU1 FROM DISK ='\\ Server1 \ Share \ db1.bak' VỚI THAY THẾ, NORECOVERY, NOUNLOAD, DI CHUYỂN 'data_file_name' TO 'P:\ path \ file.mdf', MOVE 'log_file_name' TO 'P:\ path \ file.ldf '; KHÔI PHỤC Cơ sở dữ liệu nhật ký1 FROM DISK ='\\ Server1 \ Share \ db1.trn' VỚI NORECOVERY, NOUNLOAD; ALTER DATABASE Database1 SET HADR AVAILABILITY GROUP =[GroupName]; 

Chướng ngại vật số 2

Nếu bạn có nhiều phiên bản trên cùng một máy chủ, bạn có thể thấy rằng cả hai phiên bản đều không thể chia sẻ cổng 5022 cho điểm cuối sao chép cơ sở dữ liệu của chúng (là điểm cuối giống nhau được sử dụng bởi Nhóm khả dụng). Điều này có nghĩa là bạn sẽ phải thả và tạo lại điểm cuối để đặt nó thành một cổng khả dụng.

 DROP ENDPOINT [Hadr_endpoint]; ĐI TẠO ENDPOINT [Hadr_endpoint] STATE =BẮT ĐẦU NHƯ TCP (LISTENER_PORT =5023) CHO DATABASE_MIRRORING (ROLE =ALL); 

Bây giờ tôi có thể chỉ định một phiên bản có điểm cuối trên ServerName:5023 .

Chướng ngại vật số 3

Tuy nhiên, khi tôi đã làm điều này, khi tôi đến bước cuối cùng trong tập lệnh ở trên, sau chính xác 48 giây - mọi lúc - tôi sẽ nhận được thông báo lỗi không hữu ích này:

Msg 35250, Mức 16, Trạng thái 7, Dòng 2
Kết nối với bản sao chính không hoạt động. Các lệnh có thể không được xử lý.

Điều này đã khiến tôi phải theo đuổi tất cả các loại vấn đề tiềm ẩn - ví dụ:kiểm tra tường lửa và Trình quản lý cấu hình máy chủ SQL để tìm bất kỳ thứ gì đang chặn các cổng giữa các phiên bản. Không. Tôi đã tìm thấy nhiều lỗi khác nhau trong nhật ký lỗi của SQL Server:

Cố gắng đăng nhập phản chiếu cơ sở dữ liệu không thành công với lỗi:'Bắt ​​tay kết nối không thành công. Không có thuật toán mã hóa tương thích. Trạng thái 22. '.

Cố gắng đăng nhập phản chiếu cơ sở dữ liệu không thành công với lỗi:'Bắt ​​tay kết nối không thành công. Cuộc gọi hệ điều hành không thành công:(80090303) 0x80090303 (Mục tiêu được chỉ định không xác định hoặc không thể truy cập). Trạng thái 66. '.

Đã xảy ra thời gian chờ kết nối khi cố gắng thiết lập kết nối với bản sao khả dụng 'VM-AARON-1 \ AGDEMO' với id [5AF5B58D-BBD5-40BB-BE69-08AC50010BE0]. Có sự cố mạng hoặc tường lửa hoặc địa chỉ điểm cuối được cung cấp cho bản sao không phải là điểm cuối phản chiếu cơ sở dữ liệu của phiên bản máy chủ lưu trữ.

Hóa ra (và cảm ơn Thomas Stringer (@SQLife)) rằng sự cố này là do sự kết hợp của các triệu chứng:(a) Kerberos không được thiết lập đúng cách và (b) thuật toán mã hóa cho hadr_endpoint mà tôi đã tạo mặc định sang RC4. Điều này sẽ ổn nếu tất cả các phiên bản độc lập cũng đang sử dụng RC4, nhưng chúng thì không. Truyện dài ngắn, tôi đã bỏ và tạo lại các điểm cuối một lần nữa , trên tất cả các trường hợp. Vì đây là môi trường phòng thí nghiệm và tôi không thực sự cần sự hỗ trợ của Kerberos (và bởi vì tôi đã đầu tư đủ thời gian cho những vấn đề này nên tôi cũng không muốn theo đuổi các vấn đề của Kerberos), tôi đã thiết lập tất cả các điểm cuối để sử dụng Thương lượng với AES:

 DROP ENDPOINT [Hadr_endpoint]; ĐI TẠO ENDPOINT [Hadr_endpoint] STATE =BẮT ĐẦU NHƯ TCP (LISTENER_PORT =5023) CHO DATABASE_MIRRORING (AUTHENTICATION =WINDOWS NEGOTIATE, ENCRYPTION =REQUIRED ALGORITHES =ALL);  

(Ted Krueger (@onpnt) gần đây cũng đã viết blog về một vấn đề tương tự.)

Bây giờ, cuối cùng, tôi đã có thể tạo Nhóm khả dụng với tất cả các yêu cầu khác nhau mà tôi có, giữa các nút có đường dẫn tệp không đồng nhất và sử dụng nhiều phiên bản trên cùng một nút (chỉ không nằm trong cùng một nhóm). Dưới đây là cái nhìn sơ lược về một trong các chế độ xem AlwaysOn Management của chúng tôi sẽ trông như thế nào (nhấp vào để phóng to để có cái nhìn tổng quan hơn nhiều):

Bây giờ, đó chỉ là một chút trêu chọc, và nó hoàn toàn có chủ ý. Tôi sẽ viết blog nhiều hơn về chức năng này trong những tuần tới!

Kết luận

Khi bạn dành đủ thời gian để xem xét một vấn đề, bạn có thể bỏ qua một số điều khá rõ ràng. Trong trường hợp này, có một số vấn đề rõ ràng bị ẩn bởi một số thông báo lỗi hoàn toàn không trực quan. Tôi muốn cảm ơn Joe Sack (@JosephSack), Allan Hirt (@SQLHA) và Thomas Stringer (@SQLife) vì đã bỏ mọi thứ để giúp đỡ một thành viên cộng đồng đang gặp khó khăn.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Các công cụ trực tuyến để thử thiết kế và truy vấn SQL

  2. Các tác vụ Postgres phổ biến trên CentOS 7

  3. Tra cứu bảng trong công việc IRI tương thích với sắp xếpCL

  4. Cách các kế hoạch song song bắt đầu - Phần 5

  5. Một đối số khác cho các thủ tục được lưu trữ