窮物鬥賤人之雲端平台架構

現今社會,百物騰貴,銀紙貶值,要戰勝市場,必須要出奇制勝。小弟喺電腦界一向深居貧民窟,賤物鬥窮人嘅手段已經不能挑逗香港人嘅購買慾望。所以要用上絕招:窮物鬥賤人今次搭建一堆古代服務器,用作運行VM嘅Hypervisor。人賤要有個底線,CPU不能太舊,最少要支援Virtualization,呢個唔洗問。所以啲乜嘢Dell SC1425等等嘅Server,丟咗佢算啦(注意千奇唔好囖去放,無人要架!)。

 

選擇Platform

為咗用盡部腦,有啲嘢要就就,唔好幻想可以ESXi咁乜Q O/S 都裝得。首先,要Boot咗部嘢行Xen底,目的係要行para-virtualised guest。好,支援Xen嘅Linux有好幾個,用咩呢?答案係Ubuntu 13.04 x86_64。喂!點解唔用12.04 LTS啊?梗係有苦衷啦。下一節就解釋咗啦,因為13.04將FlashCache做咗落kernel度,你直接apt-get install flashcache就解決生理需要。講明係窮人,梗係用SATA啦,大都唔夠膽用,怕部古著Dell Server個BIOS唔肯相認,2TB算啦,打孖兩隻做Mirror。注意要買server grade嘅,貴啲嘅。一般價格嘅SATA係唔可以heavy duty長開,死硬(好多老闆唔知,凈係喺到小啲HD咁Q易壞)。大家注意!以DELL呢種cheap嘢嚟講,ubuntu絕對唔係一個選擇,因為BIOS同相關嘅utility都唔太支持,唔似CentOS同RHEL,可以為所欲為。所以自己執生。

 

FlashCache緩存技術

老實講,如果有米,直接用LSI RAID Controller嘅CacheCade技術。用FlashCache呢家嘢係逼不得已。FlashCache個理論好簡單,用一個快速儲存設備緩存慢速儲存設備,只要讀寫(注意即使做只讀緩存,寫速度都係好緊要,聰明人嘅你好難理解,但街市阿嬸就一定理解:你唔先寫底點緩存比人讀翻出嚟呀!?)。用一隻SSD Disk嚟做讀寫緩存嚟解決傳統硬盤嘅三大毛病:“跑得慢,無速度同唔夠快”。小弟用上Kingston V300 120GB SSD。注意呢件嘢讀寫速度都係得450MB/sec,吹咩!就係唔用Intel 530 Series。跑得快就得架咩!Intel 530 得寫入速度係80,000 IOPS,但讀取速度好Q慢,最快只有41,000 IOPS。緩存嘅意義在於唔喺多次讀取嘅時候唔洗讀取硬盤,省卻機械操作時間。咁讀得慢咪即係搵自己笨咯。而Kingston 就唔同,讀取速度有85,000 IOPS,而寫入速度都有55,000 IOPS(不過越大越慢,所以做cache唔好揀太大)。大家獲得讀寫IOPS嘅參數後,做一個簡單計算,就知道邊隻會快啲:假設一個block開始緩存(一個寫入操作),緩存後成功被HIT中2次(兩個讀出操作,即REREAD,日常操作何止重讀2次),邊隻總體操作時間短啲?小學生都識計啦!Kingston嘅價格方面仲700蚊(HKD)有找,平過Intel一大節。仲有!小弟用Kingston最緊要嘅原因,就系如果你部腦好似我咁係行緊 SATA2,咁IO SPEED幾快都無Q用,因為唔會超過300MB/sec。

使用FlashCache時要注意兩大問題,假如你用嚟緩存一個以6隻SAS一萬轉嘅 RAID0或RAID10,個SSD隨時會變咗bottleneck,要細心做iozone或其它讀寫測試證實有效至好用!其次就係,writeback cache有一定風險,小弟用上Ubuntu 13.04完全通過OS嚟解決應用問題係減低風險嘅最好辦法,即系個OS kernel唔support搞到要comiple kernel嘅就咪Q用啦,免卻無幸福。做writeback cache同樣要測試實質效果,用數據證明你嘅環境係唔係有賺,假如無賺或唔係有20%以上明顯改善,唔用好過用,因為你必須要恢復本機正常操作,先可以將死機前嘅dirty cache寫翻入harddisk,仲有必須完全理解精通LVM嘅人士(好似小弟有十幾年LVM經驗咁)先好用writeback。其實writethru已經好好用架啦。

其實XenDesktop有Intellicache技術,係針對virtual disk放喺NFS嘅方案,唔係同一件事。我地係連本地harddisk都唔夠快嘅情況下尋求解決方案。而Intellicache好難搵到支援,按道理類似呢個方案係皇道,應該用嚟緩存一切存儲方案,不論本地、iSCSI、NFS等,而HA環境應該唔啟動writeback,之用writethru。

 

勁改硬件,擠入SSD Cache Disk

由於部1U嘅R200 Server得咁多位,點樣安置部SSD Cache Disk?就係拆Q咗部DVD(反正都係用USB安裝)。當然要一個1->2嘅SATA電源插將左邊Harddisk電源分比隻SSD用(高登G/F中間偏後有得賣)。注意,唔知點解,R200系列三個SATA接口,第三個唔識認隻SSD,解決方法係插SATA1,SATA0同SATA2插兩隻SATA 2TB Harddisk搞掂。

 

LINUX SOFTWARE RAID

好啦,開始安裝。講到明賤物,就係無HW RAID,注意一啲PCI 1x 嘅PCIe RAID卡千奇唔好用,隨時慢過software raid。仲有,如果用Dell嘅RAID CARD要H子頭至好用(即係LSI嘅)。對於software raid呢家嘢,用USB又好,CD又好,安裝過程中最重要嘅部份係partition嗰陣,一定係manual架啦。我重點講講,自己領略一下,小弟用咗10幾年啦,不論湯底係RedHat定係Debian,一定work,boot得到,賭命都得!

  1. 先Delete嗮啲舊partition,有lvm特別難,自己諗辦法。唔得就boot入rescue,用parted或fdisk嚟清理。
  2. 每隻disk建立一個primary partition 2GB,用途為LINUX SOFTWARE RAID,用嚟做/boot嘅。
  3. 揀上面 Linux Raid,Create一個RAID1,揀頭先建立兩個partition,跟住用途係ext4 f/s,mount point 揀 /boot,搞掂嘅boot file system啦。
  4. 然後整OS,用LVM做,先同普通建立LVM差不多,先每隻disk建立多一個primary partition用嗮餘下空間(可以細啲嘅,20G都可以),用途為LVM Physical Volume。
  5. 揀上面 LVM,Create一個vg_root嘅Volume Group,加入兩個啱啱create嘅partition。
  6. 喺呢個vg_root裏面建立一個20GB嘅Logical Volume:lv_root,用途ext4,mount point係 /。
  7. 再建立一個2GB嘅 lv_swap,用途當然就係swap。
  8. OK,搞掂SAVE走人。咁唔係mirror嚟播?唔好理,裝好OS至算。

 

LVM MIRROR

當成功啟動OS之後,做埋啲身後事,mirror兩個LV,注意要好長時間嘅,等啦。

lvconvert -m 1 --mirrorlog disk /dev/vg_root/lv_swap
lvconvert -m 1 --mirrorlog disk /dev/vg_root/lv_root

之後處理VM嘅storage方法有好幾種,先講一個比較容易嘅方法,就係喺上面做個vg_root嘅時候用嗮harddisk嘅空間。os嘅root同swap只係用咗不過30GB左右,如下嘅可以用一個部份嚟做一個mirror嘅Storage:

pvcreate /dev/sda5
pvcreate /dev/sdc5
vgcreate -s 128m vg_storage01 /dev/sda5 /dev/sdc5
lvcreate -L 120g -n lvstorage01 -m 1 --mirrorlog disk vg_storage01

呢度講講lvm其實係支持mirror嘅,至於用linux software raid好定係lvm mirror好?小弟答你,用lvm mirror係慢啲啲嘅,10% 至 20% 左右啦。

 

LINUX SOFTWARE RAID

建立software raid係無辦法之中嘅辦法,當今社會,點都應該用RAID Controller啦。不過都講講啦,建立需要兩個喺唔同disk嘅partition,最重要係要做啲事後工作,update個mdadm.conf,下面例子,應該可以可以幫到你:

 

mdid=2
md=md${mdid}
mdadm --create /dev/${md} --level=1 --raid-devices=2 /dev/sdc6 /dev/sda6

uuid=`mdadm --detail /dev/${md} | grep UUID | gawk -F '( : )' '{print $2}'`
sed -i "/UUID=$uuid/d" /etc/mdadm/mdadm.conf
echo ARRAY /dev/md/$mdid UUID=$uuid >> /etc/mdadm/mdadm.conf

update-initramfs -u

點做個mirror都好,最後用flashcache做個cachedev喺/dev/sdb1上,排除/dev/sdb1嘅lvm掃描就OK(下面有教點filter)。

 

HARDWARE RAID

假如你發咗達,就可以考慮用LSI嘅RAID CARD,以Dell嚟講,H710或H800係可以行盡SSD嘅。而H700就唔得(唔能夠超出3Gbps,LSI同DELL都做手腳特登禁低個SPEED,吹咩!),不過可以照樣用。用嘅時候要放開懷抱,千奇唔好分開兩個RAID嚟行OS同DATA!假如你個籠可以放8隻disk,就用6隻disk(可以放12隻就用10至disk)做RAID10,再加1隻SSD(120GB或240GB最好),有啲米嘅可以加隻普通料嘅disk做hotspare(非heavy duty嘅disk好平)。唔好諗其它option,諗代表你好唔專業!你唔怕比人笑可以行RAID5或RAID50,然後等住比人淘汰。Form咗個大RAID之後,先做嘅300GB樓下嘅virtual disk出嚟做OS,其餘做DATA。咁300GB裝OS就好簡單啦,裝OS,點partition隨便。而DATA disk就要注意,最好做個partition,唔好直接用/dev/sdb!呢度要提提,一啲好舊嘅DELL SAS RAID就唔好用啦,隨時係行緊1.5Gpbs,用onboard sata好過。

 

XEN KERNEL

將嘅OS變身為xen唔係難,以下幾嘢立即見效。先安裝一下啲無謂package(自己斟酌),下一行就嚟料啦:

apt-get -y install vim wget sysstat ntp rcconf telnet lsof vim ifenslave-2.6 lsscsi perl flashcache-utils
apt-get -y install ubuntu-desktop vncviewer vlan bridge-utils xen-hypervisor-amd64 xen-tools xcp-xapi

可能會問你食豉油邊隻好,死就死啦!答用openvswitch啦。跟住修改/etc/default/grub,啟動xen kernel,然後修改 /etc/default/xen,改為 TOOLSTACK=xapi。然後到服務:

sed -i -e "s/^GRUB_DEFAULT\( *\)=\(.*\)$/GRUB_DEFAULT=2 # may be 3 or 4 :)/" \
  -e "s/^GRUB_CMDLINE_LINUX_DEFAULT\( *\)=\(.*\)$/GRUB_CMDLINE_LINUX_DEFAULT=\"quiet splash text\" # don't want X console/" \
  -e "s/^GRUB_CMDLINE_LINUX\( *\)=\(.*\)$/GRUB_CMDLINE_LINUX=\"apparmor=0\"/" \
  -e "/^GRUB_TERMINAL\( *\)=/d" \
  -e "/^GRUB_CMDLINE_XEN\( *\)=/d" \
    /etc/default/grub
printf "\n# XEN options\nGRUB_CMDLINE_XEN=\"dom0_mem=1G,max:1G dom0_max_vcpus=1\"\nGRUB_TERMINAL=console\n" >>\
    /etc/default/grub
update-grub

sed -i -e "s/^TOOLSTACK\(.*\)$/TOOLSTACK=xapi/" /etc/default/xen
sed -i -e 's/xend_start$/#xend_start/' -e 's/xend_stop$/#xend_stop/' /etc/init.d/xen
update-rc.d xendomains disable

記得最後reboot,不過搞埋下面network先。

 

網絡設定

自己喺本網站搵啦,“如何通過XCP管理Xen服務器的網絡”,跟住做就得。記住要學學點樣通過xcp嘅xe ...命令嚟管理個openvswitch而唔係用ovs-vsctl,因為xcp玩嗮,會clear咗ovs個setting從新再set一次,每次開機如是。我地需要嘅係窮人網絡,用bonding嚟用盡你部腦能提供嘅bandwidth,再通過vlan嚟做出唔同嘅network,滿足社會嘅需要。我地要嘅,一般包括:

management -  一般係bonding嘅native network(vlan 1呀)。

public -  哪!呢個就睇情況啦,你可以直接用public ip嚟行,xen 唔需要ip嘅,唔好浪費。又可以用比較普遍嘅方式,就係用一個internal ip 嘅 subnet,通過firewall做NAT。

privnet -  呢個一定會喺VM上set,高手(好似我咁),甚至用DHCP派發。

 

環境要有個PROXY

假如你嘅環境無個PROXY,好難生存,因為來來去去要download相同嘅package好多次,下下上網download一次啲bandwidth送嗮比ISP。 安裝好後要做做手腳,容許非官方網站都可以訪問,有啲網站更可以容許緩存。

apt-get -y install squid-deb-proxy
echo "10.0.0.0/8" >> /etc/squid-deb-proxy/allowed-networks-src.acl.d/20-local
cat >/etc/squid-deb-proxy/mirror-dstdomain.acl.d/20-misc <<EOF
.virtualbox.org
.microsoft.com
ftp.cuhk.edu.hk
repo.cloudhosting.com.hk
centos.uhost.hk
.centos.org
.webmin.com
.somersettechsolutions.co.uk
.drupal.org
.github.io
.github.com
EOF
sed -i -e "s/^#http_access allow \!to_ubuntu_mirrors/http_access allow \!to_ubuntu_mirrors/" /etc/squid-deb-proxy/squid-deb-proxy.conf
service squid-deb-proxy restart

最後喺要用嘅機上做個/etc/hosts嘅entry,唔好直接用IP。注意default port係8000。

 

建立 TEMPLATE

用得XEN,重要照顧埋用paravirtualization,選擇好少。我只舉個Ubuntu 12.04 LTS嘅例,如果用CentOS 6反而簡單啲啲,因為template已經有,install VM時注意下就OK。好!開波:

VMID=`xe template-list name-label="Ubuntu Lucid Lynx 10.04 (64-bit)" --minimal`
VMID=`xe vm-clone uuid=$VMID new-name-label="Ubuntu Precise Pangolin 12.04 (64-bit)"`
xe template-param-set other-config:default_template=true other-config:debian-release=precise uuid=$VMID
xe template-param-set uuid=$VMID other-config:disks='<provision><disk device="0" size="32212254720" sr="" bootable="true" type="system"/></provision>'


咁樣造一個Ubuntu 12.04 LTS嘅Template,最後一句換咗OS disk為30GB(default係8GB,唔知做得乜)。跟住要準備一個boot image作安裝PV之用。哪!唔好改個directory,否則保證你唔work!

mkdir -p /boot/guest
cd /boot/guest
wget -O initrd.gz http://hk.archive.ubuntu.com/ubuntu/dists/precise/main/installer-amd64/current/images/netboot/xen/initrd.gz
wget -O vmlinuz http://hk.archive.ubuntu.com/ubuntu/dists/precise/main/installer-amd64/current/images/netboot/xen/vmlinuz

 

建立 FlashCache Device

要小心檢查你隻SSD裝咗喺邊個位,個device label係乜。lsscsi 幫到你。做兩份先,方便測試同將來有新存儲系統。下面例子,將來用時就係 /dev/sdc1。

ssddisk=sdc
parted /dev/${ssddisk} mklabel gpt
parted -a optimal /dev/${ssddisk} mkpart datacache 0% 35%
parted -a optimal /dev/${ssddisk} mkpart datacache 35% 100%

建立一個FlashCache對應你原來嘅block device(假設係 /dev/vg_root/lvstorage1)。注意以下係writethru cache,每次boot機都要做。下面示範通過一個mirrored lv提供一個block device同埋通過一個metadevice (linux software raid) 提供嘅blockdevice,點樣通過flashcache嚟提供cache服務:

/sbin/flashcache_create -p back cachedev-01 -m 128k /dev/sdc1 /dev/vg_storage01/lvstorage01
/sbin/flashcache_create -p thru cachedev-02 -b 256k /dev/sdc2 /dev/md2

注意 writethru cache 反而比較麻煩,因為一 boot 機就無Q嗮,要重新 create 過。而 writeback cache 嘅 mapper device係可以保留過夜。先講咗 writeback cache 嘅生命週期,建立咗之後會一直保存,直到你用dmsetup remove為止,而remove之後,會有殘留物喺SSD 個partition裏面,用flashcache_destroy去毀滅佢。poweroff過程會見到writeback cache 嘗試清理 dirty cache,寫翻入harddisk。咁如果死機會點?呢個時候要小心,要明白writeback cache程序邏輯理論,SSD內嘅dirty cache等同於RAID Controller上有battery嘅cache memory,死機後咩都唔會做(千奇唔好以為個battery會提供能源比harddisk咁天真!)一直等待再有電源供應,喺正式提供操作前將喺memory內養住嘅dirty cache寫翻入harddisk。一切死機情況,必須用盡辦法修復本機,memory、battery、任何harddisk都唔換得!!!修復後boot著部機進入single或正常模式再shutdown先至講。所以明白writeback cache嘅理論後,你先至真正成為datacenter達人,唔會做啲白癡嘢。 flashcache與memory cache不同之處係要靠OS嚟固化dirty cache,所以OS唔死得,要有一定嘅自救能力,點都要建立mirror,同時唔可以依賴flashcache自身(雞同雞蛋嘅問題,即係有啲人用部VM嚟manage翻啲hardware node,咁蠢嘅事都做得出我都無說話好講)。有慧根嘅你應該明白flashcache應該用喺非OS嘅 data disk 上。

到writethru cache啦,必須要做手腳處理,喺正式執行應用cache個mapper device嘅邏輯之前,必須重新建立!可以用 init 方法,下面係一個例子,假設你啲data disk係來自iSCSI應該都適用。做法好簡易,建立一個文件,/etc/init/xcp-cachedev.conf,內容主要為建立flashcache嘅command。如:

description     "prepare flashcache device for xcp"

start on (starting network-interface
          or starting network-manager
          or starting networking)

exec /sbin/flashcache_create -p thru cachedev-data -b 8k /dev/sdc2 /dev/md2

注意呀!凈係會見到 writethru cache 嘅command,writeback cache 係kernel幫你搞掂。

 

建立 Storage

XCP應用存儲非常規範,要跟足手續,少個步驟都死人。先要說明,下面個例子唔係最理想,大家可以用meta device 做mirror。

先啟動 LVM 存儲模式。Default唔啟動,你吹佢唔漲:

cd /usr/lib/xcp/sm
ln -s LVHDSR.py LVHDSR
service xcp-xapi restart

到真正建立storage嘅時候啦,我地用嘅係LVM方式,即係VM個virtual disk係Xen服務器嘅一個LV,呢個LV喺create virtual disk嘅時候就會自動建立,唔會有獨立os嘅command比你見到。而下面建立storage嘅command將會建立嘅係一個VG(volume group),啲LV就會喺你指定嘅storage對應個VG裏面產生。

xe sr-create content-type=user shared=false name-label="Storage01" \
  device-config:device=/dev/mapper/cachedev-01 type=lvhd
xe sr-create content-type=user shared=false name-label="Storage02" \
  device-config:device=/dev/mapper/cachedev-02 type=lvhd

咁樣實際係建立咗一個volume group,用vgs可以見到,而呢個vg係建立咗喺呢個cache device(cachedev-..)上面。通過xe sr-list可以見到喺XCP嘅storage。呢個時候你會發現有個Duplicate乜乜七七嘅error。唔洗驚,大把嘢你要驚啊細路。事關要先做做config,將多餘嘅device排除,喺 /etc/lvm/lvm.conf 做,搵 filter = [ "a/.*/" ] 呢句,改為:

filter = [ "a|/dev/mapper/cachedev.*|", "r|/dev/vg_root/.*|", "r|/dev/md.*|", "r|/dev/disk/.*|", "r|/dev/mapper/.*|", "r|/dev/dm-.*|", "a/.*/" ]

其實後面 "r|/dev/disk/.*|", "r|/dev/mapper/.*|", "r|/dev/dm-.*|", "a/.*/" 係好應該咁打。前面三個係主動先將flashcache嘅設備加入,同將被cache咗個設備排除。好啦!有嗮要嘅資源啦,可以做VM啦。

 

建立 VM

下面有個例子,建立一個PV。

host=u1204pv1
defaultstorage="Storage01"

VMID=$(xe vm-install new-name-label="$host" sr-name-label="$defaultstorage" template="Ubuntu Precise Pangolin 12.04 (64-bit)")
xe vm-memory-limits-set vm=$VMID dynamic-min=512MiB dynamic-max=1024MiB static-min=128MiB static-max=1024MiB
net0=`xe network-list name-label=publicnet --minimal`
xe vif-create vm-uuid="$VMID" network-uuid="$net0" mac=random device=0
net1=`xe network-list name-label=privnet --minimal`  
xe vif-create vm-uuid="$VMID" network-uuid="$net1" mac=random device=1
xe vm-param-set other-config:install-repository=http://hk.archive.ubuntu.com/ubuntu/ uuid=$VMID
xe vm-param-set uuid=$VMID PV-bootloader=
xe vm-param-set uuid=$VMID PV-kernel="/boot/guest/vmlinuz"
xe vm-param-set uuid=$VMID PV-ramdisk="/boot/guest/initrd.gz"
xe vm-param-set uuid=$VMID PV-args="-- ro quiet console=hvc0"
xe vm-start uuid="$VMID"

xeconsole $host

xe vm-param-set uuid=$VMID PV-bootloader=pygrub

其中xeconsole係小弟私人製造,其實大家可以猜猜係邊個port,用vncviewer 127.0.0.1:{port} 就得。