Mamy aplikację, która łączy w sobie zarówno szybką (<1 sekundę), jak i powolną migrację bazy danych (> 30 sekund). W tej chwili przeprowadzamy migracje baz danych jako część CI, ale nasze narzędzie CI musi znać wszystkie parametry połączenia z bazą danych dla naszej aplikacji (w wielu środowiskach), co nie jest idealne. Chcemy zmienić ten proces, aby aplikacja uruchamiała własne migracje baz danych podczas uruchamiania.
Oto sytuacja:
Mamy wiele wystąpień tej aplikacji - około 5 w produkcji. Zadzwońmy do nich node1, ..., node5
. Każda aplikacja łączy się z pojedynczą instancją SQL Server, a my nie używamy wdrożeń kroczących (o ile wiem, wszystkie aplikacje są wdrażane jednocześnie)
Problem: powiedzmy, że mamy długą migrację. W takim przypadku node1
rozpoczyna się, a następnie rozpoczyna migrację. Teraz node4
zaczyna się, a migracja długoterminowa jeszcze się nie zakończyła, więc node4
zaczyna się także migracja -> możliwe uszkodzenie danych? Jak zapobiegniesz temu problemowi, czy problem jest wystarczająco ważny, aby się o niego martwić?
Myślałem o rozwiązaniu tego problemu za pomocą zamka rozproszonego (za pomocą etcd
lub czegoś podobnego). Zasadniczo wszystkie aplikacje próbują uzyskać blokadę, tylko jedna z nich ją pobiera i uruchamia migracje, a następnie odblokowuje. Gdy reszta aplikacji uruchomi się i przejdzie do sekcji krytycznej, wszystkie migracje zostały już uruchomione, więc skrypt migracji właśnie kończy działanie.
Jednak mam przeczucie, że „to przesada, musi być prostsze rozwiązanie”, więc pomyślałem, że poproszę tutaj, aby sprawdzić, czy ktoś ma jakieś lepsze pomysły.