Jak mogę wgrać 1000 węzłów na godzinę na stronę Live Drupal 7 i uniknąć impasu?


9

Nie tak dawno temu pisałem o impasie tutaj: PDOException: SQLSTATE [40001] : Błąd serializacji: 1213 znaleziono impas podczas próby uzyskania blokady;

Pomimo wszystkiego, co mój zespół programistów stara się zrobić, nadal występują takie błędy:

PDOException: SQLSTATE [40001]: Błąd serializacji: 1213 Podczas próby uzyskania blokady znaleziono zakleszczenie; spróbuj zrestartować transakcję: INSERT INTO {instancja_pozycji} (nid, vid, uid, genid, lid) WARTOŚCI (: db_insert_placeholder_0,: db_insert_placeholder_1,: db_insert_placeholder_2,: db_insert_placeholder_4,: db_insert_placeholder_4); Tablica ([: db_insert_placeholder_0] => 1059 [: db_insert_placeholder_1] => 1059 [: db_insert_placeholder_2] => 0 [: db_insert_placeholder_3] => cck: field_item_location: 1059 [: db_insert_placeholder_4] => 1000) w /var/www/website.com/sites/all/modules/location/location.module).

Pomimo określonej tabeli w tym przykładzie, ten błąd pojawia się w innych tabelach.

Oto moja sytuacja. Wziąłem duży projekt uniwersytecki. W dowolnym momencie z systemu korzysta 50 000 mieszkańców kampusu. Oprócz tego migruję setki z 1000 elementów treści zarówno ręcznie, jak i za pomocą niestandardowego kodu modułu (migracja ze starych danych uniwersyteckich) do nowej witryny Drupal 7.

Ten błąd nas zabija do tego stopnia, że ​​jesteśmy prawie gotowi na zebranie pracy z ostatnich lat i pójść z czymś innym, jeśli Drupal nie jest w stanie poradzić sobie z tego rodzaju obciążeniem.

Ale to mniej więcej moje pytanie - jak Drupal może poradzić sobie z tego rodzaju ładunkami? Jak mogę zorganizować przepływ pracy, aby móc obsłużyć tak wiele działań? Czy to problem z Drupalem? Problem z bazą danych?

W szczególności korzystam z Ubuntu, stos LAMP 16 GB RAM. Jestem otwarty na wszelkie sugestie, czy będzie to związane z Drupalem, związane z bazą danych, konfiguracją serwera lub innym przepływem pracy do pracy w ramach możliwości Drupala, więc możesz zaproponować cokolwiek, jeśli masz doświadczenie z tak dużą aktywnością.


Jest artykuł o importowaniu dużego zestawu danych evolvingweb.ca/story/...
kalabro

Dziękuję za to. To bardzo zachęcające, aby zobaczyć, że woluminy danych można rzeczywiście zaimportować niemal natychmiast. A co z kwestią pojedynczych użytkowników wysyłających posty za pośrednictwem własnych kont za pośrednictwem formularzy węzłów? Gdy kopię i zagłębiam się w ten problem, retoryczne pytania w mojej głowie narastają: „Czy Drupal poradzi sobie z tak dużym ruchem na żywo? Jeśli nie, to o co chodzi?” Oprócz importu mamy zespół około 20 osób, które normalnie dodają treści za pośrednictwem swoich kont. Czy Drupal „zapamiętuje węzeł” naprawdę może obsłużyć tylko 20 użytkowników jednocześnie dodających dane?
blue928

Przetestowaliśmy naszą witrynę Drupal za pomocą Apache JMeter przy użyciu MySQL i PostgreSQL. W przypadku MySQL nasze wyniki wyniosły około 20 węzłów. Wyniki PostgreSQL były znacznie lepsze.
kalabro

Odpowiedzi:


5

Pracuję na Uniwersytecie Stanforda i robię podobne rzeczy. Ciągle musimy regularnie ładować ponad 100 000 węzłów. Pracujemy nad własnym niestandardowym kodem ładującym od 2 lat, jesteśmy w stanie znacznie przyspieszyć proces przy użyciu pcntl_fork. Jedyne, o czym musisz pamiętać, to zamknąć wszystkie połączenia gniazd przed wywołaniem rozwidlenia. Na przykład musisz zamknąć połączenie mysql, połączenie memcache, a nawet połączenie mongo. Drupal automatycznie utworzy nowe połączenia, jeśli takie nie istnieje. Jeśli chodzi o problem impasu, udało nam się rozwiązać ten problem, umieszczając innodb_locks_unsafe_for_binlog = 1.


czy ładujesz je wsadowo niestandardowym kodem, czy używasz niektórych funkcji API drupala, takich jak node_save? Lub moduł typu migracji? Czy wspomniany kod jest także dostępny do wyświetlania publicznego? Byłoby miło zobaczyć, jak pcntl_fork jest zintegrowany z drupalem, aby zobaczyć, jak pokonaliście tę przeszkodę. Dzięki za wskazówkę binlog!
blue928

2

Odpowiedź brzmi: poprawnie skonfiguruj plik MySQL my.cnf.

Po nieco ponad tygodniu badań odkryłem, że Drupal 7 rzeczywiście może poradzić sobie z tak dużo równoczesnym ruchem wejściowym.

Te wyjątki PDO Deadlock dotyczyły nieprawidłowego zoptymalizowania pliku MySQL my.cnf. Z pomocą grupy Drupal High Performance i innych źródeł nasz zespół nie miał ani jednego impasu od czasu wdrożenia nowych ustawień konfiguracyjnych dla MySQL. Przetestowaliśmy nasze skrypty wsadowe, aby bez problemu symulować nawet 500 obecnych użytkowników zapisujących treści. Sprawdź wątek tutaj.

http://groups.drupal.org/node/260938

W szczególności Dalin zasugerował użycie kreatora, aby uzyskać podstawowy plik konfiguracyjny na podstawie specyfikacji serwera i typów tabel. Po użyciu tego, nawet bez dalszego poprawiania, impasy ustały. Oto link do kreatora, jeśli chcesz go wypróbować: https://tools.percona.com/wizard

Z przyjemnością opublikuję plik my.cnf, jeśli ktoś uzna to za pomocne.

Chociaż problem zakleszczenia nie jest już problemem, teraz bardzo często pojawia się ten błąd:

PDOException: SQLSTATE[42000]: Syntax error or access violation: 
1305 SAVEPOINT savepoint_1 does not exist: ROLLBACK TO SAVEPOINT savepoint_1; 
Array ( ) in file_usage_add() (line 661 of /var/www/website.com/includes/file.inc).

Czy może to być również problem z konfiguracją mysql?


Sami zaczynamy dostrzegać ten błąd. Czy kiedykolwiek znalazłeś odpowiedź na swoje pytanie?
trimbletodd 10.10.2013

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.