2009-09-30 12 views
13

Z tej pozycji: What's best Drupal deployment strategy? .... cytuję:Strategie wdrażania Drupal DATABASE?

Bazy danych są trudniejsze; czyszczenie bazy danych dev/staging i przesuwanie jej do trybu live jest najłatwiejsze przy początkowym wdrożeniu, ale przy wykonywaniu przyrostowych aktualizacji DB występuje kilka zmarszczek, jeśli użytkownicy witryny na żywo również generują zawartość.

Chcę trochę pomysłów, jak to zrobić? Obecnie otrzymuję pełną kopię istniejącej bazy danych na moim komputerze lokalnym, zatwierdzam tę subversion, a następnie wdrażam całą bazę danych. Obecnie plik ma 15megs i za każdym razem muszę przesłać cały plik (uważam, że subversion widzi go jako nowy plik, ponieważ ma za każdym razem tyle zmian).

więc moje pytania są naprawdę:

  1. Jak mogę dostać mój rozmiar Db dół, gdy popełnienie (inne niż rzadziej popełniają)?
  2. Czy istnieje inny sposób na zsynchronizowanie bazy danych DB i serwera? zwłaszcza biorąc pod uwagę, że użytkownicy będą publikować nowe dane przez cały czas?

Odpowiedz

13

Czy istnieje inny sposób na utrzymanie synchronizacji między bazą danych a bazą danych serwera? zwłaszcza biorąc pod uwagę, że użytkownicy będą publikować nowe dane przez cały czas?

Mamy duży, rozproszony zespół i personel redakcyjny wszędzie, więc wdrożenie bazy danych jest niewykonalne.

Aby obejść ten problem, szeroko wykorzystujemy funkcje aktualizacji. Mamy moduł, który nie ma prawdziwego kodu, którego używamy do aktualizacji ustawień. Za każdym razem, gdy deweloper dokonuje zmiany konfiguracji, piszą funkcję aktualizacji w tym module, która po uruchomieniu wprowadzi odpowiednią zmianę w innych bazach danych deweloperskich, przemieszczających się i na żywo.

Występują problemy, w szczególności z zależnościami krzyżowymi (jeśli ludzie piszą funkcje aktualizacji w więcej niż jednym module), i może zająć trochę czasu, aby zakodować coś, co jest względnie niewielką zmianą w administratorze. Pomocne w tym jest Install profile api.

Na przykład

function mysite_update_6000() { 
    install_include(array('user')); 
    $editor_rid = install_add_role('editor'); 
    install_add_permissions(DRUPAL_ANONYMOUS_RID, array('do something')); 
    install_add_permissions($editor_rid, array('do something', 'administer nodes')); 
    return array(); 
} 

doda rolę i przypisać pewne uprawnienia do niego. W ten sposób wszystkie zmiany w kodzie są zachowywane, dzięki czemu nie trzeba próbować migrować i synchronizować baz danych.

Istnieje również moduł migration, który może w tym pomóc, rejestruje zmiany w tabelach i zapisuje je w funkcji aktualizacji. Nie należy tego mylić z modułem migracyjnym drupal.org służącym do migracji treści.

Odnieśliśmy sukces, ale także niektóre problemy z modułem features, które mogą pomóc w migracji funkcji.

+1

+1 - Dobry pomysł, aby użyć modułu "dummy", aby umożliwić niestandardowe funkcje aktualizacji. –

+0

@Jeremy: Uważam, że twoje podejście jest bardzo interesujące, biorąc pod uwagę, że moduł funkcji nie działa dla wszystkich rzeczy. Ale zastanawiam się, jak możesz napisać udpate kod dla wszystkich rzeczy, które robisz jako administrator Druapl. Na przykład włączam wszystkie moduły związane z tłumaczeniami/ustawieniami regionalnymi, a następnie tworzę przetłumaczone wersje elementów menu we wszystkich moich menu. Gdzie chciałbyś się dowiedzieć, jaki kod pisać w funkcjach aktualizacji? –

2

W przypadku mniejszych projektów nadal robimy coś podobnego do obecnej procedury, ponieważ blokujemy instancję na żywo, aby czytać tylko poprzez blokowanie wszystkich użytkowników z prawami do edycji, niż zrzucanie bazy danych, przesyłanie jej do instancji stage, wykonywanie wszystkich aktualizacji potrzebujemy tego, a kiedy już jesteśmy zadowoleni z wyników, przełączamy instancję sceny, aby stać się kolejną wersją na żywo. Ale nawet w małych przypadkach jest to bolesne i dalekie od dobrego rozwiązania.

W dwóch większych projektach jesteśmy w tej samej łodzi, co Jeremy, ponieważ cała konfiguracja jest skomplikowana, jeśli chodzi o wdrażanie kompletnych zrzutów bazy danych, zwłaszcza, że ​​nie możemy pozwolić na zablokowanie instancji tylko w trybie tylko do odczytu dla niektórych aktualizacje.

W pewnym zakresie użyliśmy do pewnego stopnia Migraine (patrz także this related discussion). Nie jest to moduł Drupala, ale skrypt Pythona, który dostosowaliśmy nieco do naszych potrzeb. Ma on na celu stworzenie nieco uporządkowanych zrzutu, oddzielając dostarczone przez użytkownika treści od ustawień i innych rzeczy, umożliwiając w ten sposób bardziej selektywną aktualizację i strategie etapowania. Jednak biorąc pod uwagę mniej lub bardziej chaotyczną strukturę bazy danych Drupal (szczególnie brak referencyjnej kontroli integralności), stosowanie tego podejścia wymaga ciągłego modyfikowania przy dodawaniu nowych modułów i jest dość ryzykowne, ponieważ trzeba mieć pewność, że dump/update only spójne zestawy tabele.

Staramy się zminimalizować potrzebę "hurtowych" operacji zrzutu/aktualizacji za pomocą funkcji aktualizacji naszych niestandardowych modułów i lubię sugestię Jeremy'ego Frencha dodania modułu "dummy" tylko po to, aby dodać funkcje aktualizacji dla innych ustawienia!

Podsumowując, aktualizacja/migracja wystąpień Drupala jest teraz dużym problemem i mam nadzieję, że w przyszłych wersjach pojawi się bardziej spójne rozwiązanie, chociaż widzę, że trudno jest opracować uogólnione podejście, biorąc pod uwagę aktualny schemat bazy danych i ilość niestandardowych modułów z poszczególnymi dodatkami tam:/


PS: Backup and Migrate jest moduł Drupal, który zdaje się podejście podobne do tego skryptu migrena, ale nie zostały wykorzystane jeszcze.

2

Henrik i Jeremy dali doskonałe odpowiedzi na temat stanu wdrożenia. Słyszałem również o Capistrano (ruby), który został użyty do dobrego efektu. DrupalCampLA Case Study opisuje wykorzystywany przez nie mechanizm wdrażania (w tym Capistrano), a pakiet pobierania zawiera jego skrypt (y) wdrażania.

Aby zminimalizować rozmiar zrzutu bazy danych, należy go dostosować, aby wykluczyć tabele pamięci podręcznej i watchdoga. Domyślnie Backup i Migrate UI pokazuje, które tabele są warte ignorowania.

+0

+1 za sugerowanie innej alternatywy - wcześniej nie słyszałem o Capistrano, ale wygląda/brzmi obiecująco, by to sprawdzić. –

1

Najlepszym sposobem, aby to zrobić, jest zachowanie wszystkich zmian w kodzie i używanie narzędzi jako features module w celu przeniesienia zmian w inscenizacji i/lub produkcji.

To więcej pracy podczas opracowywania, to fakt, ale jeśli pracujesz razem z grupą osób, które mają własną bazę danych lub chcesz z łatwością wprowadzić zmiany w produkcji, funkcje są ograniczone. droga do przebycia.