6.0 codebase i zvanično otišao u /dev/null
Spominjao sam već nekoliko puta ali evo sada i zvanično, 6.0 codebase je otišao u smeće. 90 procenata novina koje nisu vezane za falcon ili maria engine su backportovane nazad u 5.x drvo (većinom u 5.6) tako da će bolja podrška za windoze, bolji optimizer, ubrzanja u innodb-u, online backup i još mnogo drugih poboljšanja biti dostupni u 5.x codebase-u i polako, kako koji feature dobije GA status tako će biti prebacivan u AZALEA code. Falcon i Maria su ostavljeni da umru.
Monti razvija Maria storage engine nezavisno od Orakla mada i dalje, posle skoro 5 godina, Maria engine nije ni blizu produkcione upotrebe :(. Izbacili su podršku za transakcije (pošto nisu mogli godinama da naprave da to radi) i krenuli putem da naprave da Maria bude samo drop in zamena za MyISAM ali da bude crash safe ali ni to na žalost još uvek ne radi… MyISAM je odličan storage engine za mnoge prilike ali bi mnogo bilo iskusno kada bi postojala zamena koja je isto toliko brza a koja je crash safe, na moju veliku žalost (i na radovanje nekih zlobnika) Monti to još uvek nije uspeo da napravi. Ja se iskreno nadam da nisu daleko od cilja.
Što se Falcon-a tiče, današnji kompajleri prosto nisu dovoljno dobri za ono kako je Falcon storage engine zamišljen tako da ogromna zavisnost od pravilne implementacije exception-a od strane c++-a je učinilo da Falcon danas i dalje ne radi iako bi bio ozbiljan takmac InnoDB-u. Za sada je ostavljen u stranu za neka bolja vremena, pa možda, ako nekad neki c++ kompajler bude imao thread safe exception-e možda se i Falcon vrati iz pepela. Druga mogućnost je da će neke dobre ideje/tehnologija iz Falcon-a da se implementiraju u InnoDB i tako poboljša već odličan InnoDB storage engine.
Novosti sa UC-a 2010
Kao i za vreme ranijih MySQL User Conference-a i sada je tokom istog gomila novih verzija sa značajnim poboljšanjima izašla u javnost:
- MySQL 5.5.4-m4, trenutno najbolja verzija innodb (i klonova) dostupna na netu je u njemu
- MySQL Cluster 7.1 je postao GA sa verzijom 7.1.3
- MySQL WorkBench 5.2.18 beta8
Od prezentacija, meni je najznačajnija za mene je Bernhardova prezentacija novosti u MySQL Cluster-u 7.x sa posebnim osvrtom na 7.1.
Neki od bitnih detalja za 7.0:
- Online Add Node (dodavanje nodova bez prekida rada sistema – dakle online)
- Multi-threaded data nodes – ozbiljno poboljšanje u radu data nodova na multicore sistemima
- snapshot backup – mogucnost biranja “trenutka” konzistentnosti bekapa
- podrška za windoze (da, od 7.0 MySQL Cluster radi i na windozi)
I neki od bitnih detalja za 7.1:
- NDBINFO baza na SQL nodu za real time proveru statusa klastera
- novi klaster manager
- 40+ puta brzi restart
- Cluster/J i openJPA
Toliko za sada
MySQL AUDIT data
Jedan od velikih nedostataka MySQL-a za ozbiljno enterprise okruzenje je auditing. Nekakav minimalan auditing koji enterprise uglavnom zahteva je log
– ko se ulogovao
– kada se ulogovao
– odakle se ulogovao
– da li je logovanje bilo uspesno ili ne
– kada se odlogovao sa servera
Za web je ovo nepotrebno (bez potrebe bi u logu imali informaciju kada se web server zakacio/otkacio) ali za enterprise moze da bude vrlo korisno a vrlo cesto i neophodno, pogotovo kada enterprise aplikacije projektuju polupismeni developeri kojima baza radi autentifikaciju i user permissioning a ne aplikacija “posto im je tako lakse”.
Kao sto rekoh, MySQL ima jako slabu / nikakvu podrsku za auditing. Sve sto MySQL moze je da upali “general query log” i da u log fajl pise SVE (ko se okacio, kad, i stra je sve radio), ali to ima 2 mane
1. general query log trosi resurse (i do 20% usporenja ne high load aplikacijama)
2. general query log ne pamti neuspele konekcije
Kako je mysql-proxy postao vrlo popularan i koristi se vrlo cesto (sto za load balancing sto u neke druge svrhe) a i sastavni je deo MySQL Enterprise Monitor-a gde sve konekcije idu kroz MEM agent kako bi MEM mogao da pravi analizu upita, koristenje proxy-a za auditing uopste nije tako lose resenje.
Kako bi auditing radio, potrebno je instalirati mysql-proxy (ili agent), namestiti mysql da prima konekcije samo sa proxy-a (staviti ga na neki zaseban port i setovati firewall) a proxy podici na standardnom 3306 portu te ce vase aplikacije bez znanja sav traffic usmeriti kroz proxy.
Skript koji radi neki basic auditing bi izgledao:
function read_auth_result( auth )
local state = auth.packet:byte()
if state == proxy.MYSQLD_PACKET_OK then
print( os.date('%Y-%m-%d %H:%M:%S') .. ":AUTH OK:"
.. proxy.connection.server.thread_id .. ":"
.. proxy.connection.client.username .. ":"
.. proxy.connection.client.src.name .. "->"
.. proxy.connection.server.dst.name )
elseif state == proxy.MYSQLD_PACKET_ERR then
print( os.date('%Y-%m-%d %H:%M:%S') .. ":AUTH FAILED: "
.. proxy.connection.server.thread_id .. ":"
.. proxy.connection.client.username .. ":"
.. proxy.connection.client.src.name .. "->"
.. proxy.connection.server.dst.name )
else
print( os.date('%Y-%m-%d %H:%M:%S') .. ":AUTH UNKNOWN "
.. string.format("%q", auth.packet) .. ":"
.. proxy.connection.client.username .. ":"
.. proxy.connection.client.src.name .. "->"
.. proxy.connection.server.dst.name )
end
end
function disconnect_client()
if proxy.connection.server.thread_id then
print( os.date('%Y-%m-%d %H:%M:%S') .. ":DISCONNECT:"
.. proxy.connection.server.thread_id .. ":"
.. proxy.connection.client.username .. ":"
.. proxy.connection.client.src.name .. "->"
.. proxy.connection.server.dst.name )
end
end
Ako pogledamo, skript nam loguje vreme, username, thread na mysql-u i sors/destination adrese konekcije. Vidimo kada je neko pokusao da se uloguje na mysql, da li je uspeo ili ne i kada se otkacio.
Log izgleda otprilike ovako:
2010-02-08 17:21:22:AUTH OK:31:arhimed:127.0.0.1:44440->127.0.0.1:3306
2010-02-08 17:21:33:DISCONNECT:31:arhimed:127.0.0.1:44440->127.0.0.1:3306
2010-02-08 17:21:38:AUTH FAILED: 32:arhime:127.0.0.1:44587->127.0.0.1:3306
2010-02-08 17:21:38:DISCONNECT:32:arhime:127.0.0.1:44587->127.0.0.1:3306
2010-02-08 17:21:43:AUTH FAILED: 33:arhie:127.0.0.1:44622->127.0.0.1:3306
2010-02-08 17:21:43:DISCONNECT:33:arhie:127.0.0.1:44622->127.0.0.1:3306
Ako hocemo da logujemo i osnovne podatke o upitima koje korisnik izvrsava onda mozemo prosiriti lua skript:
function read_auth_result( auth )
local state = auth.packet:byte()
if state == proxy.MYSQLD_PACKET_OK then
print( os.date('%Y-%m-%d %H:%M:%S') .. ":AUTH OK:"
.. proxy.connection.server.thread_id .. ":"
.. proxy.connection.client.username .. ":"
.. proxy.connection.client.src.name .. "->"
.. proxy.connection.server.dst.name )
elseif state == proxy.MYSQLD_PACKET_ERR then
print( os.date('%Y-%m-%d %H:%M:%S') .. ":AUTH FAILED: "
.. proxy.connection.server.thread_id .. ":"
.. proxy.connection.client.username .. ":"
.. proxy.connection.client.src.name .. "->"
.. proxy.connection.server.dst.name )
else
print( os.date('%Y-%m-%d %H:%M:%S') .. ":AUTH UNKNOWN "
.. string.format("%q", auth.packet) .. ":"
.. proxy.connection.client.username .. ":"
.. proxy.connection.client.src.name .. "->"
.. proxy.connection.server.dst.name )
end
end
function disconnect_client()
if proxy.connection.server.thread_id then
print( os.date('%Y-%m-%d %H:%M:%S') .. ":DISCONNECT:"
.. proxy.connection.server.thread_id .. ":"
.. proxy.connection.client.username .. ":"
.. proxy.connection.client.src.name .. "->"
.. proxy.connection.server.dst.name )
end
end
function read_query( packet )
if string.byte(packet) == proxy.COM_QUERY then
proxy.queries:append(1, packet, {resultset_is_needed = true} )
return proxy.PROXY_SEND_QUERY
end
end
function read_query_result( inj )
local res = assert(inj.resultset)
local raw_len = assert(res.raw):len()
local packet = assert(inj.query)
local flags = res.flags
if res.affected_rows then
ar = res.affected_rows
else
ar = "0"
end
print( os.date('%Y-%m-%d %H:%M:%S')
.. ":QUERY:" .. proxy.connection.server.thread_id .. ":"
.. inj.query .. ":"
.. (inj.query_time / 1000) .. "ms" .. ":"
.. (inj.response_time / 1000) .. "ms" .. ":"
.. raw_len .. ":"
.. tostring(res.flags.no_good_index_used) .. ":"
.. tostring(res.flags.no_index_used) .. ":"
.. res.warning_count .. ":"
.. res.query_status .. ":"
.. ar
)
end
pa nam sada log izgleda malo drugacije:
2010-02-08 17:21:22:AUTH OK:31:arhimed:127.0.0.1:44440->127.0.0.1:3306
2010-02-08 17:21:22:QUERY:31:select @@version_comment limit 1:0.092ms:0.095ms:1:false:false:0:0:0
2010-02-08 17:21:23:QUERY:31:select * from mysql.user:0.281ms:0.305ms:1:false:true:0:0:0
2010-02-08 17:21:24:QUERY:31:select * from mysql.user:0.278ms:0.299ms:1:false:true:0:0:0
2010-02-08 17:21:25:QUERY:31:select * from mysql.user:0.272ms:0.293ms:1:false:true:0:0:0
2010-02-08 17:21:28:QUERY:31:select * from mysql.db:0.229ms:0.243ms:1:false:true:0:0:0
2010-02-08 17:21:33:DISCONNECT:31:arhimed:127.0.0.1:44440->127.0.0.1:3306
2010-02-08 17:21:38:AUTH FAILED: 32:arhime:127.0.0.1:44587->127.0.0.1:3306
2010-02-08 17:21:38:DISCONNECT:32:arhime:127.0.0.1:44587->127.0.0.1:3306
2010-02-08 17:21:43:AUTH FAILED: 33:arhie:127.0.0.1:44622->127.0.0.1:3306
2010-02-08 17:21:43:DISCONNECT:33:arhie:127.0.0.1:44622->127.0.0.1:3306
MySQL Sajt ne radi kako treba
Ako ste primetili da www.mysql.com ne radi / fale mu neki detalji (na primer download sekcija ili dokumentacija), to je zato sto se sajt trenutno reorganizuje.
Trazite dokumentaciju, nema je? pogledajte http://dev.mysql.com
Politika je gotova a sad malo da radimo
Oficijalni EC press release vezano za odobrenje ORACLE&SUN deal-a
Najzad, posle vise od pola godina prepucavanja, ORACLE & SUN dil ce da krene u implementaciju. Sta ce isti tacno doneti pokazace vreme. Ja sam za sada optimistican i mislim da je ovo veliki dan za open source zajednicu posto ORACLE ima mogucnost da od MySQL-a napravi “bezobrazno dobar RDBMS”. Oracle, koji je vec vlasnik najbitnijeg dela MySQL-a (InnoDB storage engine-a), je obecao da ce da ulozi znacajna sredstva u dalji razvoj MySQL-a.
Sta i kako dalje – videcemo.
Za sada i dalje vazi zabrana bilo kakvog komentarisanja od strane zaposlenih u SUN-u tako da cu sada da prekinem, vise kada nam skinu zabranu.


