Archiwum z Lipiec 2008

Hasło w MySQL

wtorek, 15 Lipiec 2008

Znów pewnie zbyt słabo szukałem, żeby dowiedzieć się jak wyłączyć hasło w MySQL (np. dla root@localhost – jak tuż po instalacji). Jedyny sposób, to:

UPDATE mysql.user SET Password = NULL WHERE user = ‘root’ AND Host = ‘localhost’;
FLUSH PRIVILEGES;

Powyższe nie jest może zalecane, ale jak tylko my mamy dostęp do konsoli i nie ma tam niczego w stylu phpMyAdmin, to można się pokusić o taką akcję.

Ułatwić sobie życie przy łączeniu się lokalnie można także tworząc plik .my.cnf w katalogu domowym i dodając sekcję [mysql] (ew. [mysqladmin] czy [mysqldump]). Oprócz opcji ze standardowego pliku my.cnf można dodać:

user = <user>
password = <password>

VLAN we FreeBSD

czwartek, 10 Lipiec 2008

Nie znalazłem (może słabo szukałem) w Handbook‘u strony pokazującej jak konfigurować VLAN w rc.conf, co prawda istnieje vlan(4), niemniej tutaj krótka instrukcja:

cloned_interfaces=”vlan0″

powoduje stworzenie interfejsu (podobnie jak przy innych nie-fizycznych interfejsach, np. carp).

ifconfig_vlan0=”inet A.B.C.D/E vlan 0 vlandev fxp0″

czyli konfiguracja sieciowa, przypisanie vlan_tag (802.1Q VLAN header) oraz przyporządkowanie interfejsu fizycznego.

Ważne jest, że gdy fizyczny interfejs, do którego przypisany jest vlan nie ma adresu, musi zostać ‘podniesiony’ za pomocą:

ifconfig_fxp0=”up”

Replikacja baz MySQL

środa, 9 Lipiec 2008

Konfiguracja replikacji w skrócie:

  • MASTER

W sekcji [mysqld] w pliku konfiguracyjnym (my.cnf) dodać / zmienić następujące linie:

log-bin = mysql-bin
server-id = 1

Pierwsza to nazwa pliku, w którym zapisywane są binarne logi operacji na bazie (dopełniona sześcioma cyframi, np. mysqld-bin.000036), druga, to identyfikator serwer. Ważne, żeby był różny na obu serwerach i na serwerze MASTER wyższy.

Następnie za pomocą GRANT należy nadać odpowiednie uprawnienia:

SQL> GRANT REPLICATION SLAVE ON *.* TO <user>@<host> IDENTIFIED BY ‘<passwd>’;

Teraz trzeba działać szybko:

SQL> FLUSH TABLES WITH READ LOCK;
SQL> SHOW MASTER STATUS\G
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 98
Binlog_Do_DB:
Binlog_Ignore_DB:

1 row in set (0.00 sec)

Pierwszą komendą zablokowaliśmy tablice przed zapisem, żeby nikt nie zmienił żadnych danych, druga pokazuje nam w jakim stanie jest MASTER – istotna jest nazwa pliku oraz pozycja (które zapytanie się wykonało).

Kolejny krok, to wyłączenie bazy, skopiowanie danych (katalogi w datadir i pliki InnoDB), uruchomienie bazy i wykonanie:

SQL> UNLOCK TABLES;

MASTER gotowy i może dalej pracować.

  • SLAVE

W pliku my.cnf, w sekcji [mysqld] wpisujemy:

server-id = 2

Kopiujemy dane z serwera MASTER, uruchamiamy bazę i włączamy w tryb SLAVE:

SQL> CHANGE MASTER TO MASTER_HOST=’<host>’, MASTER_USER=’<user>’, MASTER_PASSWORD=’<passwd>’, MASTER_LOG_FILE=’<filename>’, MASTER_LOG_POS=<position>;
SQL> START SLAVE;

W pierwszym poleceniu podajemy odpowiednie wartości, drugie zaczyna replikować dane i voilà!

Uwagi końcowe:

  1. Warto od czasu do czasu czyścić logi binarne za pomocą PURGE MASTER LOGS, np:
  2. PURGE MASTER LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);

    Jeżeli wierzymy, że replikacja zawsze będzie działać, ew. monitorujemy to wystarczająco często, to można posiłkować się zmienną expire_logs_days, by zautomatyzować proces czyszczenia logów.

  3. Zalecane jest, by monitorować stan serwera SLAVE za pomocą:
  4. SHOW SLAVE STATUS\G

    Interesujące dane to
    Seconds_Behind_Master – powinno zawsze wynosić 0, jeśli nie, to szukamy Last_Error.

  5. Replikację dobrze zaplanować we wczesnej fazie projektu. Zanim baza rozrośnie się do niebotycznych rozmiarów (długie kopiowanie i downtime) i będzie krytyczną (np. osiem milionów serwerów musi jednocześnie z niej korzystać).

Do replikacji nie trzeba jakoś specjalnie przekonywać: failover i load-balancing same nas przekonają. Więcej do poczytania na stronie MySQL AB (czy jak kto woli – Sun).

BIND’s views

środa, 9 Lipiec 2008

Swego czasu opracowałem metodę zabezpieczenia łącz (w sensie dostępu do sieci / hosta, gdy protokoły takie jak BGP są niedostępne) za pomocą kierowania ruchem i odpowiedniej konfiguracji DNS.

Na widokach w BIND działało to bardzo dobrze. Konfiguracja sprowadza się do podania warunków, dla których dane strefy będą przetwarzane. Mając do dyspozycji match-clients i match-destinations możemy naprawdę wiele zrobić. Skorzystanie z tej funkcjonalności oszczędzi nam uruchamiania drugiego serwera nazw np. dla sieci lokalnej czy dla konkretnego łącza.

Z czasem zacząłem wykorzystywać PowerDNS (z racji świetnie działającej natywnej obsługi baz danych) i właśnie funkcjonalności widoków mi brakuje. Co prawda można mieć jedną bazę z dodatkową kolumną content, ale i tak trzeba uruchomić dwa serwery. Nadzieją mogło by być wykorzystanie adresu IP klienta (odpowiedni warunek w zapytaniu SQL), ale to niemożliwe sądząc po (niejednej) wypowiedzi developerów na liście dyskusyjnej PowerDNS.

relayd (hoststated)

czwartek, 3 Lipiec 2008

Przypatrywałem się projektowi od wczesnej jego wersji (wcześniej kompilowałem ze źródeł slbd na FreeBSD), początkowo porzuciłem wdrażanie produkcyjnie, bo obsługiwał tylko protokół HTTP (i kiepsko HTTPS, a do tego był mi najbardziej wówczas potrzebny). Wróciłem, gdy pojawił się w OpenBSD 4.1 i dobrze radził sobie z SMTP.

Obecnie działa całkiem dobrze, ale ma pewne niedociągnięcia. Przykładowo proces rodzic nie zapisuje swojego PIDa w /var/run. Ot niby drobnostka, ale jednak. relayctl (8) mógłby też obsługiwać komendę shutdown. Wysłałem nawet w tej sprawie feature request i oto co otrzymałem w odpowiedzi od Pierre-Yves Ritschard:

My answer:

$ sudo -i
# pkill relayd.
# relayd

ekipa Theo

Żeby było bardziej technicznie, to sekcja REDIRECTIONS wygląda u mnie tak:

redirect smtpredirect {
listen on $ext_addr port smtp
listen on $ext_addr port submission
forward to <mailhosts> check send nothing expect „220 *”
}

redirect smtpsredirect {
listen on $ext_addr port smtps
forward to <mailhosts> check ssl
}

Nie wiem czemu, ale przez SMTPS nie zadziałało pobieranie odpowiedzi, więc jest tylko nawiązywane połączenie SSL (SSL handshake).

Poza tym przy dwóch przekierowaniach demon często przestaje działać (chyba dlatego). W logach można zobaczyć coś takiego (data i godzina jakoś tak zabawnie się zgrały :>):

[...]
Jul  3 13:37:13 bastard relayd[6348]: host 10.0.25.249, check tcp use ssl (210ms), state up -> down, availability 94.53%
Jul  3 13:37:13 bastard relayd[6348]: host 10.0.25.247, check tcp use ssl (210ms), state up -> down, availability 93.01%
Jul  3 13:37:16 bastard relayd[19372]: fatal: flush_table: cannot flush table stats: Operation not supported by device
Jul  3 13:37:16 bastard relayd[6348]: host check engine exiting
Jul  3 13:37:16 bastard relayd[17749]: check_child: lost child: pf update engine exited
Jul  3 13:37:16 bastard relayd[17749]: terminating

A na serwerze pocztowym (przesunięcie czasowe jednych logów względem drugim nie ma znaczenia):

Jul 15 00:03:40 mailin-ng2 postfix/smtpd[4609]: setting up TLS connection from bastard[10.0.25.254]
Jul 15 00:03:40 mailin-ng2 postfix/smtpd[4609]: Anonymous TLS connection established from bastard[10.0.25.254]: TLSv1 with cipher DHE-RSA-AES25
6-SHA (256/256 bits)
Jul 15 00:03:40 mailin-ng2 postfix/smtpd[4609]: lost connection after CONNECT from bastard[10.0.25.254]
Jul 15 00:03:40 mailin-ng2 postfix/smtpd[4609]: disconnect from bastard[10.0.25.254]
[...]
Jul 15 00:03:45 mailin-ng2 postfix/smtpd[4609]: connect from bastard[10.0.25.254]
Jul 15 00:03:45 mailin-ng2 postfix/smtpd[4609]: setting up TLS connection from bastard[10.0.25.254]
Jul 15 00:03:45 mailin-ng2 postfix/smtpd[4609]: SSL_accept error from bastard[10.0.25.254]: -1
Jul 15 00:03:45 mailin-ng2 postfix/smtpd[4609]: lost connection after CONNECT from bastard[10.0.25.254]
Jul 15 00:03:45 mailin-ng2 postfix/smtpd[4609]: disconnect from bastard[10.0.25.254]

Być może jest to związane z faktem, że jednocześnie wszystkie hosty są niedostępne. Podobno od maja w -current jest to poprawione (jakiś tydzień po 4.3).

Working file: relayd.c
revision 1.74
date: 2008/05/06 09:52:47; author: pyr; state: Exp; lines: +10 -1
do not attempt to reload a configuration if we come from a non pf
requiring configuration to a pf requiring one.
ok reyk@

Working file: relayd.h
revision 1.100
date: 2008/05/06 06:09:48; author: pyr; state: Exp; lines: +2 -1
Do not unconditionnaly load pf. If pf isn’t required by the configuration
the initialisation isn’t done properly.

Working file: pfe_filter.c
revision 1.25
date: 2008/05/06 11:52:49; author: reyk; state: Exp; lines: +6 -1
fix the table stats clr ioctl

Working file: relay.c
revision 1.88
date: 2008/05/05 12:33:55; author: pyr; state: Exp; lines: +4 -1
Put relay sockets in non blocking mode too. This got forgotten along the
way and didn’t show since our read buffers are small.
„put it in” reyk@

No cóż, pozostaje czekać do listopada…

… a tymczasem:

pfctl -a ‘relayd/smtpredirect’ -Fa

mail/tpop3d 1.5.4

czwartek, 3 Lipiec 2008

Dzięki mojemu staraniu port mail/tpop3d dla FreeBSD został zaktualizowany do wersji 1.5.4.

W przeszłości nawet napisałem jakąś poprawkę do samego tpop3d i próbowałem rozwijać statystyki w SQL. Uważam, że to dobre oprogramowanie, szkoda, że Chris Lightfoot odszedł. Miejmy nadzieję, że Arkadiusz Miśkiewicz godnie go zastąpi i projekt będzie żył nadal.

Inne moje zgłoszenia (FreeBSD):

TCP window scaling and broken routers

wtorek, 1 Lipiec 2008

Dotychczas router (pod kontrolą OpenBSD 4.3) pracował głównie jako NAT (maszyny w DMZ, reguły rdr i nat oraz pass / block do nich), ale zaszła potrzeba wydzielenia segmentu sieci dla klientów i routowania adresów.

No i pojawił się problem (moje niedopatrzenie). Głównie za sprawą TCP window scaling. Trzeba pamiętać, że od wersji 4.1 OpenBSD domyślne flagi dla reguł TCP to flags S/SA, a każda reguła tworzy stan, kiedy pakiet pasuje do niej (keep state). Ja zapomniałem o tym na chwilę i coś przestało się łączyć, gdzieś pakiety ginęły i ogólnie ‘siwy dym’.

Reasumując pakiety wchodzące na zewnętrznym interfejsie wpuszczamy. Pakiety wchodzące na wewnętrznym interfejsie wpuszczamy. Pakiety wychodzące na wewnętrznym interfejsie też musimy puszczać z flags S/SA keep state.