Zależności między składnikami zarządzanymi przez różne składniki zapisywania
Istnieją sytuacje, w których dane z jednego modułu zapisywania zależą od danych zarządzanych przez inny składnik zapisywania. W takich przypadkach należy utworzyć kopię zapasową lub przywrócić dane z obu składników zapisywania.
Usługa VSS obsługuje ten problem za pomocą pojęcia jawnej zależności składnika zapisywania i interfejsu IVssWMDependency.
Składnik zapisywania dodaje co najmniej jedną zależność podczas tworzenia dokumentu metadanych składnika zapisywania przy użyciu metody IVssCreateWriterMetadata::AddComponentDependency. Składnik zapisywania przekazuje metodę jako nazwę i ścieżkę logiczną składnika zależnego (którym zarządza), a także nazwę i ścieżkę logiczną oraz identyfikator klasy zapisywania (identyfikator GUID identyfikujący klasę) składnika, od którego zależy.
Po ustanowieniu ta zależność informuje osoby żądające, że podczas każdej operacji tworzenia kopii zapasowej lub przywracania zarówno składnik zależny, jak i obiekty docelowe jego zależności muszą uczestniczyć.
Dany składnik może mieć wiele zależności, co wymaga, aby i wszystkie zależne elementy docelowe brały udział w kopii zapasowej i przywracaniu razem.
Składnik zależny i/lub obiekty docelowe jego zależności można uwzględnić jawnie lub niejawnie w operacjach tworzenia kopii zapasowej lub przywracania.
Jawny mechanizm zależności składnika zapisywania nie powinien być używany do tworzenia zależności między dwoma składnikami w tym samym składniku zapisywania. Reguły wyboru mogą wydajniej dostarczać te same funkcje bez ryzyka zależności cyklicznego.
Na przykład IVssCreateWriterMetadata::AddComponentDependency można użyć do zdefiniowania zależności składnika writerData (ze ścieżką logiczną "") składnika Zapisywania MyWriter w składniku InternetData (z logiczną ścieżką "Połączenia") składnika zapisywania o nazwie InternetConnector z identyfikatorem klasy zapisywania X. (chociaż istnieje możliwość, aby wiele składników zapisywania o tym samym identyfikatorze klasy było jednocześnie w systemie, uniknąć pomyłek, ponieważ kombinacja ścieżki logicznej i nazwy składnika jest unikatowa w systemie w programie VSS).
Składnik zapisywania dodaje wiele zależności do danego składnika po prostu wywołując IVssCreateWriterMetadata::AddComponentDependency powtarzane z różnymi składnikami z różnych składników. Liczba innych składników, od których zależy dany składnik, można znaleźć, sprawdzając cDependencies składowej struktury VSS_COMPONENTINFO.
Składnik zapisywania lub moduł żądający pobiera wystąpienia interfejsu IVssWMDependency za pomocą interfejsu IVssWMComponent::GetDependency. IVssWMDependency zwraca nazwę składnika, ścieżkę logiczną i identyfikator klasy składnika zapisywania zarządzającego składnikiem docelowym zależności.
Mechanizm zależności nie określa żadnej określonej kolejności preferencji między składnikiem zależnym a celami jego zależności. Jak wspomniano powyżej, wszystkie zależności wskazują, że za każdym razem, gdy dany składnik jest kopii zapasowej lub przywrócony, składnik lub składniki, od których zależy, musi również zostać utworzona kopia zapasowa lub przywrócona. Dokładna implementacja zależności jest według uznania aplikacji do tworzenia kopii zapasowych.
Na przykład w powyższym przypadku składnik zapisywaniaData (ścieżka logiczna "") zależy od składnika InternetConnector (ścieżka logiczna "Połączenia"). Żądający może to interpretować w jeden z następujących sposobów:
- Jeśli składnik zależny, writerData, jest wybrany (niejawnie lub jawnie) do tworzenia kopii zapasowej lub przywracania, żądający musi wybrać (niejawnie lub jawnie) element docelowy jego zależności, InternetData
- Jeśli element docelowy zależności, InternetData, nie jest wybrany do tworzenia kopii zapasowej, nie należy wybierać składnika zależnego, zapisywaniaData.
Jednak podczas opracowywania obsługi zależności deweloperzy żądający powinni wiedzieć, że nie ma możliwości, aby składnik zapisywania mógł określić, czy jeden z jego składników jest elementem docelowym zależności.
Deklarowanie zależności zdalnych
Aplikacja rozproszona to aplikacja, którą można skonfigurować do korzystania z jednego lub większej liczby komputerów jednocześnie. Zazwyczaj aplikacja działa na co najmniej jednym komputerze serwera aplikacji i komunikuje się z (ale może lub nie działa) co najmniej jeden komputer serwera bazy danych. Ta konfiguracja jest czasami nazywana wdrożeniem wielosystemowym. Często tę samą aplikację można również skonfigurować do uruchamiania na jednym komputerze z serwerem aplikacji i serwerem bazy danych. Taka konfiguracja jest nazywana wdrożeniem z jednym systemem. W obu konfiguracjach serwer aplikacji i serwer bazy danych mają własne niezależne składniki zapisywania usługi VSS.
W przypadku wdrożenia wielosystemowego, jeśli składnik zarządzany przez składnik zapisywania aplikacji zależy od składnika zdalnego zarządzanego przez składnik zapisywania serwera bazy danych, jest to nazywane zależnością zdalną. (Natomiast wdrożenie z jednym systemem ma tylko zależności lokalne).
Jako przykład wdrożenia z wieloma systemami rozważ serwer aplikacji, który używa serwera bazy danych programu SQL Server jako magazynu danych. Dane specyficzne dla aplikacji, w tym składniki Web Part, pliki zawartości sieci Web i metabaza usług IIS, znajdują się na co najmniej jednym komputerze nazywanym serwerami internetowymi frontonu. Rzeczywisty magazyn danych SQL, który obejmuje bazę danych konfiguracji i wiele baz danych zawartości, znajduje się na co najmniej jednym innym komputerze nazywanym serwerami baz danych zaplecza. Każdy z serwerów internetowych frontonu zawiera tę samą zawartość i konfigurację specyficzną dla aplikacji. Każdy z serwerów baz danych zaplecza może hostować dowolną bazę danych zawartości lub bazę danych konfiguracji. Oprogramowanie aplikacji działa tylko na serwerach internetowych frontonu, a nie na serwerach baz danych. W tej konfiguracji składnik zapisywania usługi VSS aplikacji ma zdalne zależności od składników zarządzanych przez składnik zapisywania SQL.
Składnik zapisywania może zadeklarować zależność zdalną, wywołując metodę AddComponentDependency, poprzedzając metodę "\\RemoteComputerName\", gdzie RemoteComputerName jest nazwą komputera, na którym znajduje się składnik zdalny, do ścieżki logicznej w parametrze wszOnLogicalPath. Wartość RemoteComputerName może być adresem IP lub nazwą komputera zwróconą przez funkcję GetComputerNameEx.
Windows Server 2003: Składnik zapisywania nie może zadeklarować zależności zdalnych do systemu Windows Server 2003 z dodatkiem Service Pack 1 (SP1).
Aby zidentyfikować zależność, moduł żądający wywołuje metody GetWriterId, GetLogicalPathi GetComponentName metod interfejsuIVssWMDependency. Obiekt żądający musi zbadać nazwę składnika, która GetComponentName jest zwracana w parametrze pbstrComponentName. Jeśli nazwa składnika zaczyna się od "\\", żądający musi założyć, że określa zależność zdalną i że pierwszy składnik po "\\" jest RemoteComputerName określony podczas zapisywania o nazwie AddComponentDependency. Jeśli nazwa składnika nie zaczyna się od "\\", żądający powinien założyć, że określa zależność lokalną.
Jeśli istnieje zależność zdalna, moduł żądający musi utworzyć kopię zapasową składnika zdalnego podczas tworzenia kopii zapasowej składnika lokalnego. Aby utworzyć kopię zapasową składnika zdalnego, żądający powinien mieć agenta na komputerze zdalnym i powinien zainicjować kopię zapasową na komputerze zdalnym.
Tworzenie struktury zależności zdalnych
Ważne jest, aby zrozumieć, że zależność nie jest składnikiem samym w sobie. Składnik jest niezbędny do przechowywania zależności.
W poniższych przykładach przedstawiono dwa sposoby tworzenia struktury zestawu zależności.
Example 1:
Writer 1
Component A
File A
File B
Dependency (SQL/MSDE Writer, Component X, "\")
Dependency (SQL/MSDE Writer, Component Y, "\")
Example 2:
Writer 2
Component A
File A
File B
Component B
Dependency (SQL/MSDE Writer, Component X, "\")
Dependency (SQL/MSDE Writer, Component Y, "\")
Na przykład 1 zależności są przechowywane przez składnik A. Ponieważ można wybrać tylko składniki, a nie poszczególne pliki, strukturyzowanie zależności składnika A w ten sposób wymagałoby, aby cały składnik, zarówno pliki, jak i zależności, zawsze były tworzone i przywracane razem. Nie można utworzyć kopii zapasowej ani przywrócić ich pojedynczo.
Na przykład 2 oddzielne składniki (składniki A i B) przechowują każdą z zależności. W takim przypadku dwa składniki można wybrać niezależnie, a w związku z tym utworzyć kopię zapasową i przywrócić niezależnie. Struktura zależności w ten sposób zapewnia aplikację rozproszoną znacznie większą elastyczność zarządzania jej zdalnymi zależnościami.
Obsługa zależności zdalnych
Żądający może zapewnić pełną lub częściową obsługę zdalnych zależności.
Aby zapewnić pełną obsługę, żądający powinien wykonać następujące czynności w czasie tworzenia kopii zapasowej i przywracania.
W czasie tworzenia kopii zapasowej żądający musi uruchomić kopię zapasową na komputerze frontonu (lokalnym), określić zależności, które istnieją, oraz utworzyć bufor dodatkowe zadania tworzenia kopii zapasowej w celu przechwycenia baz danych zaplecza. Żądający musi poczekać, aż zadania kopii zapasowej zaplecza na komputerze zdalnym zostały ukończone przed wywołaniem IVssBackupComponents::SetBackupSucceededed i IVssBackupComponents::BackupComplete metod. Jeśli żądający czeka na ukończenie tworzenia kopii zapasowej składników zaplecza przed wywołaniem BackupComplete, spowoduje to łatwiejsze odzyskanie kopii zapasowej modułu zapisywania, który implementuje dodatkowe ulepszenia , takie jak blokowanie topologii, na przykład podczas tworzenia kopii zapasowej. Poniższa procedura zawiera opis czynności, które powinien wykonać żądający:
- Na komputerze lokalnym moduł żądający wywołuje IVssBackupComponents::InitializeForBackup, IVssBackupComponents::GatherWriterMetadata, IVssBackupComponents::P repareForBackupi IVssBackupComponents::D oSnapshotSet metod.
- Po zakończeniu lokalnej kopii w tle, ale przed ukończeniem tworzenia kopii zapasowej, żądający buforuje dodatkowe zadania kopii zapasowej, wysyłając żądanie do agenta na komputerze zdalnym.
- Na komputerze zdalnym agent obiektu żądającego wykonuje buforowaną sekwencję kopii zapasowej, wywołując InitializeForBackup, GatherWriterMetadata, PrepareForBackup, DoSnapshotSet, SetBackupSucceedededi BackupComplete.
- Gdy agent obiektu żądającego ukończy buforowane zadania na komputerze zdalnym, żądający ukończy sekwencję kopii zapasowej, wywołując SetBackupSucceededed i BackupComplete.
W czasie przywracania moduł żądający musi uruchomić przywracanie obejmujące komputer frontonu (lokalnego), wybrać składniki i ich zależności do przywrócenia, a następnie wysłać zdarzenie PreRestore przez wywołanie metody IVssBackupComponents::P Restore. Następnie obiekt żądający powinien buforować zadania przywracania zaplecza na komputerze zdalnym i wywołać IVssBackupComponents::P ostRestore metodę po zakończeniu przywracania zaplecza. To wymaganie zapewnia modułowi zapisywania frontonu większą kontrolę nad środowiskiem przywracania i lepszym środowiskiem użytkownika administratora. Ponieważ kopie zapasowe w poszczególnych systemach nie są wykonywane w tym samym momencie w czasie, moduł zapisywania frontonu będzie musiał wykonać pewne czyszczenie danych zaplecza. W przykładowej aplikacji omówionej w poprzednim artykule "Deklarowanie zależności zdalnych" składnik zapisywania powinien zainicjować ponowne mapowanie witryny lub ponowne indeksowanie po zakończeniu przywracania jednej z baz danych zaplecza. W tym celu składnik zapisywania musi odbierać zdarzenia na serwerze frontonu. Poniższa procedura zawiera opis czynności, które powinien wykonać żądający:
- Na komputerze lokalnym element żądający wywołuje IVssBackupComponents::InitializeForRestore, GatherWriterMetadata, IVssBackupComponents:::SetSelectedForRestore (lub IVssBackupComponentsEx::SetSelectedForRestoreEx) i PreRestore.
- Po zakończeniu fazyPreRestore, ale przed rozpoczęciem fazyPostRestore, żądający buforuje dodatkowe zadania przywracania, wysyłając żądanie do agenta na komputerze zdalnym.
- Na komputerze zdalnym, agent obiektu żądającego wykonuje buforowane zadania przywracania, wywołując InitializeForRestore, GatherWriterMetadata, SetSelectedForRestore, PreRestore, SetFileRestoreStatus (lub SetSelectedForRestoreEx) i PostRestore.
- Po zakończeniu buforowanych zadań agenta żądania na komputerze zdalnym program żądający ukończy sekwencję przywracania, wywołując IVssBackupComponents::SetFileRestoreStatus i PostRestore.
Aby zapewnić częściową obsługę zależności zdalnych, żądający musi postępować zgodnie z zależnościami zdalnymi i uwzględnić je w ramach kopii zapasowej, ale kolejność zdarzeń w systemach frontonu i zaplecza zgodnie z opisem w poprzednich dwóch procedurach nie byłaby wymagana. Aby żądać, który implementuje tylko częściową obsługę, żądający powinien zapoznać się z dokumentacją tworzenia/przywracania kopii zapasowej aplikacji modułu zapisywania, aby zrozumieć, jakie scenariusze mogą być obsługiwane.