MySQL – Sharding
Beberapa hari yang lalu saya hadir di konferensi online yang diadakan oleh komunitas MySQL Indonesia. Praktis, karena online, jadi bisa dihadiri dari mana saja. Tapi sialnya, saya keliru waktu – saya kira dimulai pukul 22:00, ternyata sudah berjalan sejak pukul 20:00
Untunglah setiap konferensi dicatat, dan kemudian diposting di milis mysql-indonesia@googlegroups.com
Terlampir adalah catatan konferensi online pada tanggal 25 Juni 2009, dengan topik “Horizontal partitioning dengan menggunakan MySQL-Proxy dan Spock“, yang diadakan di channel #id-mysql di irc.freenode.net
Selamat menikmati.
ok..selamat malam teman-teman malam ini confernce # 18 materinya tentang horizontal partitioning yang akan ngizi crazynuxer silahkan dimulai.. ok beberapa minggu lalu sudah dijelas kan oleh bro dendie mengenai partition di mysql database cuman itu disebut sebagai vertikal partitioning jadi partition hanya di satu mesin nah horizontal partition ini adalah partition di beda mesin atau istilah kerennya sharding jadi istilah yang lebih dikenal sharding? atau klo saya istilahkan lebih mudahnya itu iya intinya sih load balance database berdasarkan record jadi misalnya kita ada 10 record 5 record di server A dan 5 record lagi di server B kira-kira sampai sejauh bisa dibayangin ga sharding itu gmn ? bisa klo dari wikipedia Horizontal partitioning is a design principle whereby rows of a database table are held separately, rather than splitting by columns (as for normalization). Each partition forms part of a shard, which may in turn be located on a separate database server or physical location. jadi kita melakukan scale out untuk meningkatkan performance secara scale out karena dukungan scalabilitas scale out itu apa ya? ada scale out dan scale in gini misalkan server kita udah bottleneck nih dan bottleneck itu karena hardware resource yg ga mumpuni atau mencukupi lagi ada 2 solusi untuk masalah ini
* d3ptzz (n=d3ptzz@125.163.244.26) has joined #mysql-idyang pertama kita beli server baru lagi dengan spesifikasi hardware yg lebih bagus dan lebih handal kemudian kita pindah datanya dan jalankan lagi servernya solusi ini disebut scale in trus? kelemahannya kita harus mengeluarkan banyak waktu dan tenaga selain itu kita juga harus rugi karena ada downtime lalu ada solusi lagi selain itu scale out istilahnya kerennya jadi kita memakai semacam balancer
* d3ptzz (n=d3ptzz@125.163.244.26) Quit (Remote closed the connection )dan dibelakang balancer itu ada beberapa server sebagai backend nya jadi ketika server kita sudah overload kita tinggal nambah backend lagi dibelakangnya jadi mempunyai skalabilitas yang bagus kita bisa menambah tanpa downtime dan mengurangi backend tanpa downtime karena dari sisi user diakan akan mengakses ipnya balancer lalu oleh balancer akan diberikan atau dibagi ke backend sesuai dengan algoritma sejauh ini masih paham ? algoritma nya? algoritmanya macem2 tergantung jenisnya dan kebutuhannya ada round-roubin, least-connection, weight least connection dll itu juga tergantung dari balancernya support apa ga ada juga yg berdasarkan schema misalnya spock proxy atau mysql-proxy yg berdasarkan algoritma didalam script lua nya nanti yg akan kita bahas adalah mengenai spock proxy “script lua nya”, mksdnya apa ya? dan mysql-proxy sebagai software horizontal partition di mysql lua itu jenis bahasa pemrograman yg biasanya di buat untuk game sampai sejauh ini bagaimana ? asiiikkk lumayan ok keren di mysql sendiri ada beberapa software yg digunakan untuk kebutuhan ini bahkan sudah ada engine yg sudah diciptakan ada mysql-proxy,spockproxy , sqlrelay dll mysql-proxy+hscale dan untuk engine sudah ada engine baru namanya spider engine cuman gue belum nyoba yg udah gue coba mysql-proxy dan spock proxy mysql-proxy dan spock proxy itu software ? pertama kita mulai dengan mysql-proxy ya iya mysql-proxy sekarang masih dalam tahap alpha dan belum layak untuk production hanya untuk main-main dan belajar saja itu yang dijelaskan di manualnya mysql-proxy untuk manualnya silahkan download di mysql.com cuman sebenernya mysql-proxy ini sangat flexible karena mendukung scripting language menggunakan lua brarti belajar Lua juga dong kekekekeke oh ya untuk sedikit info saya menggunakan linux ketika melakukan ujicoba kedua software ini hehehe iya tidak pun tidak2 apa karena sudah banyak scritpt yg siap pakai tapi… Enakan bisa keahlian untuk membaca script tetep harus dimiliki buat kustomisasi karena untuk proses troubleshoot klo bisa ya berarti lebih mantap ketika kita akan melakukan installasi mysql-proxy itu dari source jadi harus compile dan disource nya itu ada banyak contoh script2 lua yg bisa di coba mysql-proxy tidak hanya bisa melakukan load balance tapi bisa memanipulasi query mksdnya? jadi juga bisa dipakai untuk menambah fitur keamanan di manipulasi nya gimana nih karena dia bisa membaca dan menganalisa query yg bisa dilakukan oleh mysql-proxy create new commands filter queries (deny specific queries) collect statistics on usage implement usage quotas execute shell commands load balancing servers jadi beberapa hal diatas bisa dijalankan oleh mysql-proxy cuman satu kelemahan mysql-proxy belum stable untuk install tinggal download lalu ekstrak menggunakan perintah tar tar zxvf mysql-proxy.tar.gz -C /usr/local/src/ cd /usr/local/src/mysql-proxy/ ./configure –prefix=/opt/mysql-proxy make -j4 && make install finish sama di semua linux mas yups harusnya sama semua yang make -j4 itu bisa diganti make saja -j4 itu jika kita menggunakan prosesor yg quad core klo cuman single core ya make saja biar lebih cepet compile nya ada pertanyaan ? sejauh ini masih paham ? yang lain Bobo yah Ahahaha lumayan lagi liatin scriptnya ada cara yg lebih mudah jika pake ubuntu tinggal apt-get install mysql-proxy ada di repo wuih enak ya pake ubuntu.. slacker yah mas tundra kekekekeke source aja ams Mas — — read_query() gets the client query before it reaches the server – — @param packet the mysql-packet sent by client – — the packet contains a command-packet: — * the first byte the type (e.g. proxy.COM_QUERY) — * the argument of the command – — http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol#Command_Packet – — for a COM_QUERY it is the query itself in plain-text – function read_query( packet ) if string.byte(packet) == proxy.COM_QUERY then print(“we got a normal query: ” .. string.sub(packet, 2)) end end itu contoh script yg simple nya jadi nanti ketika anda menjalakan mysql proxy dan melakukan query akan tampil we got a normal query: “query_anda” di console di mysql-proxy ini ketika kita menjalankan akan ada 2 port yg dilisten yg pertama untuk admin port yg kedua itu port untuk balancer yg akan diakses user atau aplikasi saya menggunakan port 4041 untuk admin nya 4040 untuk diakses user atau aplikasi berikut saya kasih contohnya bentar ssh dulu ke mesinnya :LD untuk menjalankannya /usr/sbin/mysql-proxy –proxy-lua-script=/opt/proxy/lib/mysql-proxy/example.lua –proxy-address=xxx.xxx.xxx.xxx:4040 –proxy-backend-addresses=xxx.xxx.xxx.xxx:3306 –proxy-backend-addresses=xxx.xxx.xxx.xxx:3306 mysql-proxy –> itu binary nya –proxy-lua-script itu agar mysql-proxy menggunakan script example.lua –proxy-address=xxx.xxx.xxx.xxx:4040 ini adalah sebagai ip dan port yg akan diakses oleh client atau aplikasi atau ip balancer nya sedangkan backend address nya itu adalah server2 database yg dibelakang balancer setelah menjalankan perintah diatas kita bisa ngecheck apakah port 4040 dan 4041 sudah listen root@crazynuxer:~# netstat -nltp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 xxx.xxx.xxx.10:4040 0.0.0.0:* LISTEN 29432/mysql-proxy tcp 0 0 0.0.0.0:4041 0.0.0.0:* LISTEN 29432/mysql-proxy tcp 0 0 xxx.xxx.xxx.9:3306 0.0.0.0:* LISTEN 25706/mysqld tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 19049/sshd tcp6 0 0 :::22 :::* LISTEN 19049/sshd kita lihat sudah listen klo gitu kita akan coba melakukan query ya mysql -uroot -h xxx.xxx.xxx.10 -P 4040 -e ’select * from mysql.user’ -p dan masukkin passwordnya maka diconsole akan tampil Hello world! Seen the query: select @@version_comment limit 1 Hello world! Seen the query: select * from mysql.user sesuai dengan isi script yg ada diexample.lua berikut isi example.lua function read_query(packet) if string.byte(packet) == proxy.COM_QUERY then print(“Hello world! Seen the query: ” .. string.sub(packet, 2)) end end print(“test” )