Replkacja mysql

 

Replikacja danych na kilka serwerów może okazać się bardzo pomocna w kilku przypadkach. Przy średnim obciążeniu zapewni nam ciągły dostęp do danych, natomiast przy dużym obciążeniu zapytaniami pozwoli tak wysterować ruchem (za pomocą dodatkowego oprogramowania), aby rozłożyć zapytania na różne serwery, co za tym idzie odciążyć maszynę główną.

Przyjmijmy, że posiadamy kilka maszyn, obciążenie bazy danych nie jest spore, a my, jako leniwi administratorzy w razie awarii nie chcemy osiwieć, odzyskiwać danych ze zrzutów, tylko – po najmniejszej linii oporu przełączyć serwery między sobą i zając się naprawą awarii.

Dla konkretnego przykładu posiadamy w sieci trzy maszyny:

  • db-master0 10.88.12.23 (używany jako serwer główny)

Na masterze w pliku /etc/mysql/mariadb.conf.d/50-server.cnf(Raspi-os 2021-03-04 z zainstalowaną MariaDB) należy zastąpić linię "bind-address = 127.0.0.1"(localhost) przez "bind-address = 0.0.0.0"(all). Następnie powinieneś zrestartować serwer MySQL:$ sudo service mariadb restart

  • db-slave0 192.168.112.120 (używany jako serwer podrzędny 1)
  • db-slave1 172.16.6.14 (używany jako serwer podrzędny 2)

Po uruchomieniu serwera db-master0, utworzeniu baz danych, czy też po prostu – w każdej chwili jego działania, w momencie, gdy będziemy chcieli rozpocząć replikację, musimy dodać odpowiednie opcje konfiguracyjne do pliku my.cnf

  • server-id = 1
  • log-bin = /var/log/mysql/mysql-bin.log
  • max_binlog_size = 100M
  • sync_binlog = 1
  • innodb_flush_log_at_trx_commit=1
  • expire_logs_days = 14

Opcje innodb_flush_log_at_trx_commit = 1 oraz sync_binlog = 1, przy używaniu silnika InnoDB powinny zadbać o delikatność dla danych podczas nieplanowanych ugaszeń serwera baz danych, server-id musi być unikalne. Po zapisaniu zmian możemy zrestartować serwer mysql na db-master0.

Po restarcie na db-master0 musimy utworzyć użytkownika (lub kilku) oraz nadać mu (im) uprawnienia do replikacji danych:

CREATE USER 'slaveuser'@'db-slave0' IDENTIFIED BY 'bardzotajneilosowehaslonajlepiej2znakowe';
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser'@'db-slave0';
CREATE USER 'slaveuser'@'db-slave1' IDENTIFIED BY 'równietajnehaslonajlepiejzwielkimiliterami';
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser'@'db-slave1';
FLUSH PRIVILEGES;

Dla wygody i zrozumienia zapisałem zamiast adresów odpowiednie hosty (szybciej jest używać adresów IP, ale wygodniej dla leniwych adminów hostów). Należy upewnić się więc, że hosty db-master0, db-slave0 oraz db-slave1 są rozwiązywalne (i widoczne każda dla każdej), najlepiej dodając do pliku hosts odpowiednie wpisy oraz upewniając się, że host.conf ma odpowiednie wartości. Najlepiej jest po prostu zarówno z hosta db-slave0 jak i db-slave1 przetestować połączenia z mysqlem:

mysql -u slaveuser -h db-master0 -pJeżeli udało nam się połączyć z obu hostów slave – jest szansa, że wszystko zadziała poprawnie. Teraz należy dodać odpowiednie opcje w plikach my.cnf serwerów slave. Dla db-slave0:

  • server-id = 2
  • log-bin = /var/log/mysql/mysql-bin.log
  • sync_binlog = 1
  • report-host = db-slave0

Oraz dla serwera db-slave1:

  • server-id = 3
  • log-bin = /var/log/mysql/mysql-bin.log
  • sync_binlog = 1
  • report-host = db-slave1

Następne cztery kroki należy wykonać relatywnie prędko (w przypadku, gdy nie tworzymy replikacji w oknie serwisowym lub po prostu dla prestiżu dostępności naszych usług).

  1. Na serwerze db-master musimy zablokować możliwość dodawania, usuwania i zmian danych do naszych baz: FLUSH TABLES WITH READ LOCK;
  2. Teraz musimy odczytać i na chwilę zapamiętać aktualny plik dziennika (File: mysql-bin.XXX) oraz aktualną pozycję ostatniego zdarzenia z dziennika (Position: YYYshow master status G
  3. Możemy przystąpić do zrzucania bazy/baz danych z serwera master (tutaj zrzucamy wszystkie bazy danych wraz z danymi o użytkownikach oraz procedurami): mysqldump --master-data --add-drop-table --quick --routines --all-databases -u root -p > /tmp/db-master0-alldatabases.sql
  4. Po wykonaniu zrzutu możemy odblokować tabele: UNLOCK TABLES;

Polecam napisać sobie szybki skrypt powłoki w celu zminimalizowania przestojów spowodowanych człowiekiem:

#!/bin/bash
# Wywołanie: $0 db-user db-password
/bin/echo "FLUSH TABLES WITH READ LOCK;" | /usr/bin/mysql -u$1 -p$2
/usr/bin/mysqldump --master-data --add-drop-table --quick --routines --all-database -u$1 -p$2 > /tmp/db-master0-alldatabases.sql
/bin/echo "SHOW MASTER STATUS \G" | /usr/bin/mysql -u$1 -p$2
/bin/echo "UNLOCK TABLES;" | /usr/bin/mysql -u$1 -p$2

Wykonany zrzut musimy teraz przerzucić na serwery db-slave0 oraz db-slave1 – można to zrobić dowolnie, najwygodniej udostępnić po NFS lub przenieść korzystając z SCP:

scp /tmp/db-master0-alldatabases.sql user@db-slave0:/tmp/
scp /tmp/db-master0-alldatabases.sql user@db-slave1:/tmp/

Po przerzuceniu lub udostępniueniu plików należy zalogować się do konsoli mysql serwera db-slave0 (i db-slave1), a następnie wykonać następujące kroki:

  • Dla servera db-slave0:
    1. Zatrzymać serwer db-slave0:
      STOP SLAVE;
    2. Zaimportować plik ze zrzuconymi bazami z db-mastera:
      SOURCE /tmp/db-master0-alldatabases.sql
    3. Ustawić na serwerze db-slave0 informację o serwerze master, aktualnym dzienniku binarnym i pozycji ostatniego rekordu w dzienniku:
      CHANGE MASTER TO MASTER_HOST = 'db-master0', MASTER_USER = 'slaveuser', MASTER_PASSWORD = 'bardzotajneilosowehaslonajlepiej2znakowe', MASTER_LOG_FILE = 'mysql-bin.XXX', MASTER_LOG_POS = YYY;
    4. Uruchomić serwer db-slave0:
      START SLAVE;
    5. Spradzić czy działa:
      SHOW SLAVE STATUS \G
  • Dla servera db-slave1:
    1. Zatrzymać serwer db-slave1:
      STOP SLAVE;
    2. Zaimportować plik ze zrzuconymi bazami z db-mastera:
      SOURCE /tmp/db-master0-alldatabases.sql
    3. Ustawić na serwerze db-slave1 informację o serwerze master, aktualnym dzienniku binarnym i pozycji ostatniego rekordu w dzienniku:
      CHANGE MASTER TO MASTER_HOST = 'db-master0', MASTER_USER = 'slaveuser', MASTER_PASSWORD = 'równietajnehaslonajlepiejzwielkimiliterami', MASTER_LOG_FILE = 'mysql-bin.XXX', MASTER_LOG_POS = YYY;
    4. Uruchomić serwer db-slave1:
      START SLAVE;
    5. Spradzić czy działa:
      SHOW SLAVE STATUS \G

Jeżeli ostatnia komenda zwróci dwa razy Yes dla parametrów Slave_IO_Running oraz Slave_SQL_Running, udało nam się wykonać replikację.

Warto na serwerach slave przerestartować demona mysql w celu określenia czy wstaje bez problemów. W przypadku gdy replikujemy dane z różnych wersji serwera mysql, sczególnie gdy na serwerze db-master0 jest starsza wersja od tych, zainstalowanych na db-slave0 i db-slave1, na serwerach slave może pojawić się komunikat: Cannot load from mysql.proc. The table is probably corrupted. Uleczyć to można poprzez wymuszoną aktualizację tabel do nowej wersji: mysql_upgrade -u root -p -force

W skrócie tyle. Aby spokojnie położyć się spać warto od czasu do czasu sprawdzać stan replikacji na serwerach slave, używając składni: SHOW SLAVE STATUS G. W przypadku zatrzymania replikacji i chęci jej najprostrzego przywrócenia zalecam wykonać wszystkie kroki z pominięciem konfiguracji w plikach my.cnf

Co w przypadku awarii naszego db-master0? Wybieramy sobie jeden z naszych serwerów slave (na przykład db-slave0), wyłączamy na nim replikację: STOP SLAVE; Następnie dodajemy do pliku my.cnf opcję: skip-slave-start, wymieniamy jego adres IP i naprawiamy usterkę na serwerze db-master0.

CITIZEN W770 tips and tricks

Myki związane z zegarkiem Citizen W770

Kasowanie telefonu/urządzenia z pamieci zegarka:
1. wyciągamy koronkę na pozycję 2
2. ustawiamy na odpowiedni telefon 
        5 sekunda – tel 1
       10 sekunda – tel 2
       15 sekunda – tel 3
3. po ustawieniu na odpowiednim telefonie naciskamy oba przyciski aż wskazówka sekundnika ustawi się na 12
Skasowano urządzenie z telefonu.

 

Parowanie telefon <-> zegarek

Wyciągnij koronkę 1 kliknięcie
Przełącz zegarek w tryb TMR lub L-TM
Wsuń koronkę do końca
Naciśnij górny przycisk
Poczekaj, aż sekundnik przejdzie do „40-sekundowego znaku”
Otwórz aplikację Citizen Bluetooth
Twój telefon i zegarek zostaną automatycznie sparowane, a następnie Twój zestaw

Co tam czytamy w 2019

  1. Bogowie pustyni – Michał Gołkowski
  2. Czerwony wariant – Siergiej Niedorub
  3. Filary ziemi – Ken Follet
  4. Zły las – Andrzej Pilipiuk
  5. W ogniu walki – Marko Kloos
  6. Deniwelacja – Remigiusz Mróz
  7. Zerwa – Remigiusz Mróz
  8. Świątynia na bagnach – Michał Gołkowski
  9. Dzikie dziecko miłości – Aneta Jadowska
  10. Inwigilacja – Remigiusz Mróz
  11. Oskarżenie – Remigiusz Mróz
  12. Testament – Remigiusz Mróz
  13. Virion Adept – Andrzej Ziemiański
  14. Szwindel – Jakub Ćwiek
  15. Księga zepsucia t.1 – Marcin Podlewski
  16. Oczy diabła – Wiktor Noczkin
  17. Kontratyp – Remigiusz Mróz
  18. Eurodżihad – Marcin Wolski
  19. Virion Obława – Andrzej Ziemiański
  20. Karpie bijem – Andrzej Pilipiuk
  21. Rozgwieżdżone niebo – Lars Wilderäng
  22. Złote miasto – Michał Gołkowski
  23. Sieci widma – Leszek Herman
  24. Do zobaczenia w piekle – Sławomir Nieściur
  25. Punkt uderzenia – Marko Kloss
  26. Zmierzch bogów – Michał Gołkowski
  27. Martwy sezon – Aneta Jadowska
  28. Riese – Robert J. Szmidt

Co tam sobie czytamy w 2018

Książki przeczytane lub wysłuchane w 2018.

    1. Początek – Dan Brown
    2. Zakuty w stal – Miroslav Žamboch
    3. Wstęga – Andriej Lewicki
    4. Bramy Światłości tom 2 – Maja Lidia Kossakowska
    5. Immunited – Remigiusz Mróz
    6. Spiżowy gniew – Michał Gołkowski
    7. Wampir z KC – Andrzej Pilipiuk
    8. Trup na plaży i inne sekrety rodzinne – Aneta Jadowska
    9. Tamta strona świata – Eugeniusz Dębski
    10. Tamta strona czasu – Eugeniusz Dębski
    11. Python dla każdego podstawy programowania – Michael Dawson
    12. Wędrowiec – Suren Cormudian
    13. Stróże – Jakub Ćwiek
    14. Biblia diabła – Leszek Herman
    15. Piter Wojna – Szymun Wronczek
    16. Wędrowiec – Suren Cormudian
    17. Jeszcze krótsza historia czasu – Stephen Hawking
    18. Bagno szaleńców – Joanna Kanicka
    19. Bestie i ludzie – Jacek Piekara
    20. Władcy nocy, złodzieje snów – Eugeniusz Dębski
    21. Najemnicy – Tomas Bartos
    22. Projekt berserker – Vladimír Šlechta
    23. Jack Reacher Jednym strzałem – Lee Child
    24. Wojna – Andrzej Lewicki
    25. Ostatniego zeżrą psy – Sławomir Nieściur
    26. Diabelski młyn – Aneta Jadowska
    27. Virion. Obława – Andrzej Ziemiański
    28. Łańcuch dowodzenia – Marko Kloos
    29. Bramy Światłości: Tom 3 – Maja Lidia Kossakowska
    30. Tatuażysta z Auschwitz – Heather Morris
    31. Diabelski eliksir – Raymond Khoury