2011-09-08 5 views
14

Nasz zespół był ostatnio bardzo zainteresowany ciągłymi wdrożeniami, ale natrafiliśmy na małą przeszkodę, jeśli chodzi o faktyczne wdrożenie kodu na Heroku - wydaje się nieuniknione, że musi upłynąć trochę czasu zepchnąć kod do Heroku.Czy Heroku można skonfigurować tak, aby działał bez problemu?

W tradycyjnym środowisku, wdrażania kod będzie prawdopodobnie wyglądać następująco:

  1. Naciśnij kod aż do katalogu pomostowym gdzieś (stary kod jest nadal żyje)
  2. Run migracje w bazie danych (więcej często, bezpieczniejsze jest wcześniejsze uruchomienie migracji, a kilka, które złamią kod, może być strzeżonych).
  3. Weź połowę (lub pewien procent serwerów) z systemu równoważenia obciążenia.
  4. Wdróż kod na tych serwerach.
  5. Jeśli to możliwe, należy uruchomić jakąś zautomatyzowanego testu dymu/wykonywać serwerach więc są „gorące”
  6. Przełącznik które serwery są i poza równoważenia obciążenia
  7. spłukać i powtórzyć.

Z Heroku, mam bardzo małą kontrolę nad dwoma krytycznych etapów:

  • Nie mogę przeprowadzić migrację bazy danych pierwszy. Jednym ze sposobów, które rozważyłem, aby obejść ten problem, to utrzymać migracje baz danych oddzielnie i skierować je najpierw do heroku - co, choć bolesne, rozwiąże problem - ale tylko zaostrzy ...
  • Czas rozpędzania dyna może zająć dość długo - oczywiście, jest to bardziej wina Railsów niż Heroku, ale kluczowym problemem jest to, że nie mogę zrobić czegoś podobnego do powyższego shuffle load balancer, aby upewnić się, że moja aplikacja jest gotowa i załadowana przed nowo wdrożonym serwerem jest ponownie umieszczany w systemie równoważenia obciążenia. Zamiast tego, nie mam innego wyboru niż dać użytkownikom 10-15 sekundowy ekran ładowania i mieć nadzieję na najlepsze rozwiązanie (i robić to DWUDNIE, jeśli używam strategii wdrażania bazy danych z góry).

Korzystamy z konserwacji na ekranie, ale nie będzie to skalowalne rozwiązanie, jeśli przejdziemy do pełnego, ciągłego wdrażania (prawdopodobnie będziemy mieć około 10-20 wdrożeń dziennie, a 10-20 * 30 sekund ekranu konserwacji zacznie się sumować)

Czy ktoś napotkał podobne problemy? Jak się do nich zwracałeś? Jakieś wspaniałe studia przypadków/historie sukcesu dla ciągłego wdrażania na heroku?

Odpowiedz

10

chodzi o spin-up czasu hamowni, Heroku posiada funkcję beta zajęcia tylko, że:

https://devcenter.heroku.com/articles/labs-preboot/

Zasadniczo inicjują nowe hamowni pierwszy, czeka chwilę, przełączane ruch i dopiero wtedy zabija stare. Moja aplikacja zauważyła wyraźną poprawę wydajności podczas wdrażania. Możesz przeczytać to tutaj:

http://ylan.segal-family.com/blog/2012/08/27/deploy-to-heroku-with-near-zero-downtime/

+0

To wygląda na idealne dopasowanie dla nas! Dzięki, że dałeś mi znać! –

+0

Używam tej funkcji w produkcji na www.versioneye.com i działa idealnie. Jest kilka opinii do zauważenia. To nie jest rozwiązanie do dużych migracji baz danych. Ale do rozwijania funkcji z mniejszą zmianą db jest idealny. Kocham to. –

7

Na Heroku wyślemy SIGTERM do twoich dysz (y) przy ponownym uruchomieniu. Po krótkiej chwili, jeśli proces (y) się nie zatrzyma, zostaną zabici. Powinno to pozwolić na wystarczający czas oczekiwania na bezproblemowy restart, gdy nie są przeprowadzane migracje.

Zawsze można przesłać kod do aplikacji pomostowej, która wskazuje na bazę danych produkcyjnych i uruchamiać z niej migracje. Pedro napisał fajny wpis na blogu o przeprowadzaniu zerowych migracji, które powinny również pomóc: http://pedro.herokuapp.com/past/2011/7/13/rails_migrations_with_no_downtime/

Mam nadzieję, że to pomoże niektórym.

+0

Dzięki! Wydaje mi się, że ma to wiele świetnych strategii w zakresie bazy danych - choć wciąż jest czas na rozpoczęcie gry, to wielki krok we właściwym kierunku. Odnośnie twojego pierwszego punktu, nie jestem pewien, jak bardzo to pomaga - zawsze będą użytkownicy, którzy uderzają w stronę podczas gry w dynama, i zobaczą długi czas oczekiwania, chyba że będę brakować coś tam. –