-->

..:: seize the day ::..

February 18, 2008

Oracle [orakel]ar - kelar

Filed under: my work

Weekend ini gue, TN, WI, sama Candra dikerjain sama Oracle dan Microsoft emoticon

Gara-gara ada masalah listrik di client perusahaan gue, masalah sinkronisasi dari genset ke PLN, ada trouble di mesin cluster Windows 2000. Padahal mereka udah pakai UPS untuk ngatasin masalah-masalah kayak gini. Yang bikin panik adalah software yang running di mesin yang bermasalah ini adalah server untuk produksi, software ini mengatur "kanban" sistem, just in time process di sebuah pabrik. Waktu datang dan ngelihat truk-truk yang ngebawa bahan baku dan yang mau ngambil barang produksi pada ngantri, macet, gue bilang dalam hati "hell, we will stay in this weekend in the server room again"

Nothing wrong with the design, software dan server-server ini sudah berjalan hampir 6 tahun tanpa banyak komplain. Waktu kita buat sistem ini dengan Windows 2000 Cluster, yang "iklannya" adalah High Availability menurut si Bill, dan pakai Oracle database kita yakin sekali sistem ini akan tahan ujian dan cobaan, walaupun kita tahu kadang-kadang si Ora ini kurang suka juga sama si Mic. Hardwarenya sendiri walaupun high-end di tahun 2002, tapi masih handal untuk kondisi sekarang. Shared disknya pakai RAID ARRAY, yang belum obsolete. Sekali lagi nothing wrong for mission critical system.

Tadinya kita pikir ini masalah cluster, tapi waktu kita test read/write ke shared Itu service Ora gak mau jalan-jalan. Emangnya si Ora punya kaki apa mau jalan-jalan emoticon Gue sama TN coba-coba tulis di shared disknya, terus kita pindah-pindahin nodenya. No problem. Jadi kesimpulan kita clusternya OK. It’s around 9 PM Saturday night now. Giliran si Candra jajal kemampuan di si Ora, dengan sqlplus dan command line toolsnya yang gue kagak ngerti. Eh si Ora pundung gak mau konek. Gue lihat di Perf window itu proses read ke shared disk manteng di 100%. Gue dan Candra terus cari-cari error message nya si Ora ke temen kita mas Google. Intinya mas Google bilang itu si Ora gak mau baca karena dia menganggap udah ada session dan user yang ngebaca database, jadinya access deny.

Kesimpulan sementara ada masalah either di shared disk (bad sector, whatever) atau di proses instance-nya si Ora. OK kita sepakat untuk deinstall si Ora dan format ulang shared disk.

Deinstall si Ora sih gampang, sampai registrynya kita bersihin sekalian di node 1 dan 2. Terus kita matiin node2, karena kita mau format shared disknya. Eh si Cluster managementnya protes. Setelah pusing-pusing, mas Google ngasih tahu kalau mau format share disk di cluster windows, si cluster harus dibohongin. Caranya waktu pengecekan disk di cluster service harus dipanjangin. Kita set jadi 10 menit, baru si format mau kerja. he..he..he… gue bo’ongin lu. Gue tambahain chkdsk /f /r biar yakin gak ada bad sector di shared disk.

Sekarang tugas Candra untuk reinstall si Ora sama instancenya terus create ulang database dan restore. Jam udah 01.00 AM Minggu pagi. Setelah 2 jam berkutat dia nyerah. Selalu gagal berhenti di create database. Itu Disk read perfnya manteng di 100%. Gue amat-amatin lagi nih si node. Akhirnya gue ambil kesimpulan OK kita uninstall cluster servicenya dan kita create ulang. Supaya gak salah si TN gue minta capture semua Cluster admin ke bmp terus gue check satu-satu network card MAC Address dan IP Address. Jam 4.30 AM gue berhenti Subuhan dulu. Habis Subuhan gue lanjutin lagi dan karena ngecheck MAC Address satu-satu gue nemuin anomali di Hartbeatnya si cluster. Ternyata setting speednya NIC gak sama. Wah ini nih sumber masalahnya emoticon

 Candra on action

Jadi rupanya karena electrical instability, ini NIC ngereset akibatnya private ip untuk heartbeat gak sama speednya, yang satu 100Mbps/Full Duplex yang satu lagi Autosense, which is gak boleh. Gue inget waktu ngerjain cluster di Linux kalau heartbeatnya gue set di Autosense selalu aja gak jalan. Jadi gue set dua-duanya ke 100Mbps/Half-Duplex. Gue restart ulang kedua node, dan gue minta Candra untuk coba create database dan ngecopy backup datanya. Jam 07.30 AM Minggu pagi.

Jam 08.45 ini proses copy database ora kelar juga. Gue ngambil kesimpulan bahwa masalah yang terjadi adalah instabilitas pada Raid Array dan Fibre Channel mengakibatkan proses I/O yang ora kelar-kelar sehingga mengacaukan Cluster dan databas. Gue putuskan untuk ambil server cadangan di kantor untuk backup siapa tahu kita gak bisa ngejinakin yang pada pundung ini. Ternyata gak mudah juga ngatur orang di hari Minggu. Yang megang kunci kantor masih tidur, terus Bang Sahlan driver kitalagi nganterin TN pulang ke Depok, maklum istrinya lagi hamil muda jadi kita nggak bisa maksa dia untuk terus kerja. Eh gak tahunya Bang Sahlan ketiduran di Depok, jadinya itu server baru dateng ke Sunter jam 11.00 siang. Begitu saya periksa si server ini pakai harddisk SAS yang nggak ada drivernya di Windows 2000. Time is running out, gak sempat nyari-nyari di internet. Akhirnya sekitar jam 3 sore kita ambil lagi server lain di kantor yang harddisknya SATA. Kita install OS dan database. Terus ngedump data. Sementara itu gue terus juga ngebenerin si RAID ARRAY dan Cluster Server.

Singkat cerita jam 02.00 pagi hari Senin kita berhasil ngesetup server backup dengan database dan aplikasi yang siap dipakai untuk produksi hari Senin. Sementara itu gue perhatiin Cluster Server dan Raid Array yang gue benerin juga udah mulai berbaik hati sama gue, dia gak lagi ngabisin waktu untuk proses I/O yang gak jelas walaupun masih terasa cukup lama dibandingkan proses I/O di server backup. I give up dan saya usul untuk ngebawa orang prinsipal untuk nganalisa hardwarenya. 

February 14, 2008

Bandwidth Shaper di openSUSE

Filed under: IT stuff

 

Seorang rekan menanyakan kenapa mengkonfigurasi openSuSE koq susah sekali. Katanya untuk ngejalanin script sederhana membuat default route aja musti ngebuat script yang njlimet. He…he..he….
Dia bilang kalau di RedHat dan turunannya seperti Fedora dan Centos khan ada rc.local, terus kalau di openSUSE padanannya apa?

OK. Sebetulnya masalah ini sudah pernah saya bahas diblog saya yang dulu dan dibeberapa email saya tapi tak mengapa saya ulang lagi di sini dan saya tambahkan beberapa hal yang saya anggap relevan karena kebetulan ada juga yang nanya tentang load balancing trafik internet ke dua gateway dan implementasi htb (hierarchical tocken bucket) untuk traffic shaping.

Jadi saya akan menjelaskan implementasi load balancing, traffic shaping dan rc.local di openSuSE sekaligus, mumpung lagi ada kesempatan nulis.

LOAD BALANCING TRAFIK INTERNET

Di tempat saya koneksi internet terhubung ke dua ISP, LC 128 kbps ke ISP-A dan ADSL ke ISP-B. Singkat cerita saya menggunakan sebuah server dengan 3 ethernet card

eth0 ip address 202.158.xx.yyy netmask 255.255.255.240 gw 202.158.xx.yyy
eth1 ip address 10.0.50.5 netmask 255.255.255.248 gw 10.0.50.1
eth2 ip address 192.168.117.171 netmask 255.255.255.0 gw 192.168.117.171

Untuk load balancing trafik ini saya mengacu pada dokumen LARTC (Linux Advanced Routing & Traffic Control) How To yang disusun oleh Bert Hubert (thanks Om Bert) di http://lartc.org. Syarat untuk load balancing adalah sudah terinstallnya paket iproute2, yang sudah terinstall saat saya menginstall openSUSE 10.3.

Selanjutnya silakan mengacu ke tulisan saya di sini
     
Perlu diingat bahwa balancing disini tidak sempurna, karena route based, dan routes di-cache. Jadi route ke site yang sering dikunjungi akan selalu melaui provider yang sama. Contoh di server ini kalau saya traceroute www.detik.com akan selalu lewat ISP-A dan traceroute www.republika.co.id akan selalu melalui ISP-B.

TRAFFIC SHAPING

Tujuan traffic shaping di sini adalah (tentu saja anda bisa melakukan shaping dengan tujuan lain he..he…he..):
- menjaga low latency untuk interactive trafic, jangan sampai upload atau download mengganggu ssh.
- menjaga agar browsing berjalan pada reasonable speeds sementara melalukan up atau downloading.
- menjaga agar upload tidak mengganggu download dan sebaliknya.
- menandakan port atau host yang sering memakan traffic sebagai low priority.

Ada banyak sumber di intenet misalnya http://www.topwebhosts.org/tools/traffic-control.php dan favorit saya adalah sekali lagi om Bert di http://lartc.org/howto/lartc.cookbook.ultimate-tc.html. Jangan lupa baca pre-requisites untuk ngejalanin HTB dan pastikan kernel anda mendukungnya.
Mengapa tidak menggunakan fasilitas FW_HTB_TUNE_DEV yang tersedia di SuSEfirewall? Karena ternyata HTB_TUNE di SuSEfirewall tidak memadai untuk kasus saya, saya sudah mentestnya tetapi masih sering hang kalau trafficnya sudah mulai queuing.

Implementasi di tempat saya seperti di bawah ini. Setup ini saya dapatkan setelah berulang kali mencoba berbagai tipe queuing, CBQ, HTB, dan SFQ akhirnya saya mendapatkan setting yang sangat memuaskan. ADSL yang saya gunakan (Speedy Office) bisa dikatakan tidak pernah mati karena excessive upload yang membuat macet di sisi download. Saya hanya menset script di bawah untuk eth1 yang terhubung ke ADSL yang kecepatannya tidak simetris (dl = 1 mbps, ul = 128 kbps). Untuk eth0 saya tidak mensetnya karena kecepatannya simetris. Selain itu karena saya menset traffic dari LAN saya sebagian besar melewati ADSL.

        # script bandwidth shaping for SuSE 10.3 by medwinz@gmail.com
        # free to copy
        #

        echo -n "Starting NSI bandwidth shaping HTB qdiscs in eth1"

        DOWNLINK=968
        UPLINK=110

        # clean existing downlink and uplink qdiscs, hide errors
        tc qdisc del dev eth1 root    2> /dev/null > /dev/null
        sleep 2
        tc qdisc del dev eth1 ingress 2> /dev/null > /dev/null
        sleep 1

        # make qdisc
        tc qdisc add dev eth1 root handle 1: htb default 15
        tc class add dev eth1 parent 1: classid 1:1 htb rate ${UPLINK}kbit ceil ${UPLINK}kbit
        tc class add dev eth1 parent 1:1 classid 1:10 htb rate 36kbit ceil 36kbit prio 0
        tc class add dev eth1 parent 1:1 classid 1:11 htb rate 36kbit ceil ${UPLINK}kbit prio 1
        tc class add dev eth1 parent 1:1 classid 1:12 htb rate 9kbit ceil ${UPLINK}kbit prio 2
        tc class add dev eth1 parent 1:1 classid 1:13 htb rate 9kbit ceil ${UPLINK}kbit prio 2
        tc class add dev eth1 parent 1:1 classid 1:14 htb rate 11kbit ceil ${UPLINK}kbit prio 3
        tc class add dev eth1 parent 1:1 classid 1:15 htb rate 9kbit ceil ${UPLINK}kbit prio 3
        tc qdisc add dev eth1 parent 1:12 handle 120: sfq perturb 10
        tc qdisc add dev eth1 parent 1:13 handle 130: sfq perturb 10
        tc qdisc add dev eth1 parent 1:14 handle 140: sfq perturb 10
        tc qdisc add dev eth1 parent 1:15 handle 150: sfq perturb 10

        tc filter add dev eth1 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:10
        tc filter add dev eth1 parent 1:0 protocol ip prio 2 handle 2 fw classid 1:11
        tc filter add dev eth1 parent 1:0 protocol ip prio 3 handle 3 fw classid 1:12
        tc filter add dev eth1 parent 1:0 protocol ip prio 4 handle 4 fw classid 1:13
        tc filter add dev eth1 parent 1:0 protocol ip prio 5 handle 5 fw classid 1:14
        tc filter add dev eth1 parent 1:0 protocol ip prio 6 handle 6 fw classid 1:15

        # attach ingress policer;
        # slowdown download a bit
        tc qdisc add dev eth1 handle ffff: ingress

        # slowdown everything that’s coming in too fast
        tc filter add dev eth1 parent ffff: protocol ip prio 50 u32 match ip src \
           0.0.0.0/0 police rate ${DOWNLINK}kbit burst 10k drop flowid :1

Script ini bekerja cukup baik pada ADSL tapi harus dicoba-coba sampai didapat nilai optimum untuk nilai di DOWNLINK dan UPLINK. Masalah umum ADSL adalah kecepatan upload yang jauh dibawah kecepatan download, dan karena sifat TCP/IP yang terus mengirim paket sampai akhirnya tidak ada tempat lagi untuk paket, biasanya modem akan hang. Dengan kecepatan dowload yang kencang biasanya user terus mendownload beberapa sites sekaligus sehingga akumulasi upload menjadi besar. Bila traffic upload ini mencapai modem ADSL maka modem akan hang.

Karena itu harus diatur agar traffic upload kita kontrol dan tidak mencapai modem ADSL hal ini dilakukan dengan menurunkan nilai UPLOAD sampai nilai optimum. Hal ini tercapai jika network latency mencapai nilai terendah dan network tidak putus. Selain itu set  MTU di modem anda di bawah 1500 (misalnya 1492), dan nilai yang sama juga diset di eth anda. Lebih jauh silakan baca pada dokumen LARTC Om Bert di atas.

rc.local di openSUSE

Tidak ada rc.local di openSUSE (he..he…he…)
Kalau kita lihat di RedHat (dan cloningnya) rc.local dijalankan setelah semua service selesai dijalankan di run level 5. Ini gak ada padanannya di openSUSE.

User biasanya mengira boot.local di /etc/init.d adalah padanan dari rc.local. Ini adalah perkiraan yang salah karena boot.local akan jalan paling awal sebelum service-service yang lain dijalankan. Sehingga seringkali user membuat script iptables dan disisipkan pada boot.local kemudian komplain karena scriptnya tidak jalan. Ini terjadi karena script iptables dipanggil sebelum service network dikonfigurasi di run level 3 sehingga sudah pasti tidak akan berfungsi.

Di openSUSE kita harus mengetahui pada saat mana script kita harus jalan apa saja syarat yang dibutuhkan, walaupun umumnya akan jalan di run level 3 dan 5. Misalnya kita ingin menjalankan script load balancing di atas, maka sebelum script ini jalan service network harus sudah jalan dulu.

Untuk dasar dari script tersebut kita dapat menggunakan file /etc/init.d/skeleton sebagai dasar, walaupun tidak tertutup kemungkinan menggunakan script lain seperti yang akan saya contohkan.

Script untuk traffic shapper:

#!/bin/sh
#
#
# /etc/init.d/mebwshaper_eth1
#
### BEGIN INIT INFO
# Provides:          mebwshaper_eth1
# Required-Start:    $network
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start:     3 5
# Default-Stop:      0 1 2 6
# Short-Description: Custom bandwidth shaping by medwinz@gmail.com
# Description:       Custom bandwidth shaping by medwinz@gmail.com
### END INIT INFO
#

test -s /etc/rc.status && . /etc/rc.status && rc_reset

case "$1" in
start )
        # script bandwidth shaping for SuSE 10.3 by medwinz@gmail.com
        # free to copy
        #

        echo -n "Starting bandwidth shaping HTB qdiscs in eth1"

        DOWNLINK=968
        UPLINK=110

        # clean existing downlink and uplink qdiscs, hide errors
        tc qdisc del dev eth1 root    2> /dev/null > /dev/null
        sleep 2
        tc qdisc del dev eth1 ingress 2> /dev/null > /dev/null
        sleep 1

        # make qdisc
        tc qdisc add dev eth1 root handle 1: htb default 15
        tc class add dev eth1 parent 1: classid 1:1 htb rate ${UPLINK}kbit ceil ${UPLINK}kbit
        tc class add dev eth1 parent 1:1 classid 1:10 htb rate 36kbit ceil 36kbit prio 0
        tc class add dev eth1 parent 1:1 classid 1:11 htb rate 36kbit ceil ${UPLINK}kbit prio 1
        tc class add dev eth1 parent 1:1 classid 1:12 htb rate 9kbit ceil ${UPLINK}kbit prio 2
        tc class add dev eth1 parent 1:1 classid 1:13 htb rate 9kbit ceil ${UPLINK}kbit prio 2
        tc class add dev eth1 parent 1:1 classid 1:14 htb rate 11kbit ceil ${UPLINK}kbit prio 3
        tc class add dev eth1 parent 1:1 classid 1:15 htb rate 9kbit ceil ${UPLINK}kbit prio 3
        tc qdisc add dev eth1 parent 1:12 handle 120: sfq perturb 10
        tc qdisc add dev eth1 parent 1:13 handle 130: sfq perturb 10
        tc qdisc add dev eth1 parent 1:14 handle 140: sfq perturb 10
        tc qdisc add dev eth1 parent 1:15 handle 150: sfq perturb 10

        tc filter add dev eth1 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:10
        tc filter add dev eth1 parent 1:0 protocol ip prio 2 handle 2 fw classid 1:11
        tc filter add dev eth1 parent 1:0 protocol ip prio 3 handle 3 fw classid 1:12
        tc filter add dev eth1 parent 1:0 protocol ip prio 4 handle 4 fw classid 1:13
        tc filter add dev eth1 parent 1:0 protocol ip prio 5 handle 5 fw classid 1:14
        tc filter add dev eth1 parent 1:0 protocol ip prio 6 handle 6 fw classid 1:15

        # attach ingress policer;
        # slowdown download a bit
        tc qdisc add dev eth1 handle ffff: ingress

        # slowdown everything that’s coming in too fast
        tc filter add dev eth1 parent ffff: protocol ip prio 50 u32 match ip src \
           0.0.0.0/0 police rate ${DOWNLINK}kbit burst 10k drop flowid :1

        rc_status -v
        ;;

stop)
        # clean existing downlink and uplink qdiscs, hide errors

        echo -n "Delete all HTB qdiscs on eth1"

        tc qdisc del dev eth1 root    2> /dev/null > /dev/null
        sleep 3
        tc qdisc del dev eth1 ingress 2> /dev/null > /dev/null
        sleep 2
        rc_status -v
        ;;

restart)
        ## Stop the service and regardless of whether it was
        ## running or not, start it again.
        $0 stop
        $0 start

        # Remember status and be quiet
        rc_status
        ;;

    *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
        ;;

esac
rc_exit

Kemudian lakukan symbolic link file tersebut ke /usr/sbin atau /sbin, misalnya dengan nama rcmebwshaper_eth1

> ln-s /etc/init.d/rcmebwshaper_eth1 /usr/sbin/rcmebwshaper_eth1

sehingga anda bisa memanggilnya dengan perintah

> rcmebwshaper_eth1 {start|stop|restart}

OK selamat mencoba. Till then keep safe and stop global warming  emoticon

 

 

PS:

Untuk sementara anda terima saja script ini, nanti akan saya jelaskan apa maksudnya di tulisan yang sedang saya buat. Selain itu agar hasilnya lebih baik anda harus melakukan packet marking dan mangling di iptables anda  emoticon