聶永的博客

          記錄工作/學(xué)習(xí)的點(diǎn)點(diǎn)滴滴。

          從無到有,搭建一個(gè)簡單版的JAVA PAAS云平臺

          前言

          PAAS:platform as a service,平臺即服務(wù),把軟件研發(fā)的平臺作為一種服務(wù),提供給用戶使用。當(dāng)前PAAS平臺服務(wù)商,諸如google app engine,sina app egine,cloud foundry等,都是程序員們的福音,可以避免從無到有搭建程序運(yùn)行的平臺,多了一個(gè)選擇。

          本著學(xué)習(xí)PAAS的態(tài)度,構(gòu)建一個(gè)簡易版PAAS平臺,構(gòu)建JAVA運(yùn)行時(shí)環(huán)境,提供tomcat servlet容器服務(wù)。當(dāng)然,不局限于JAVA,PHP、ROR、nodejs等,理論上行得通。但這里以構(gòu)建Tomcat Servlet環(huán)境為主。

          說是簡易版,基本靠譜,所有的操作,都需要手動操作,高端功能組件,諸如計(jì)費(fèi)、安全等,暫時(shí)還不涉及。僅搭建一個(gè)原型,別期望過多,可能為了表示最核心的PAAS的核心部分,其它更為先進(jìn)的功能,都是在核心的功能上進(jìn)行的拓展。但這對認(rèn)識PAAS,可能會有點(diǎn)幫助。

          一般來說,虛擬化建立在性能強(qiáng)勁的物理機(jī)器上,IAAS(基礎(chǔ)即服務(wù))建立在虛擬化技術(shù)的基礎(chǔ)上,PAAS建立在IAAS基礎(chǔ)上,SAAS(軟件即服務(wù))可以建立在PAAS的基礎(chǔ)上。可以從總體上感知各種服務(wù)之間關(guān)系,這樣做資源利用會更高效些。

          PAAS,每一個(gè)Tomcat運(yùn)行平臺之間,諸如內(nèi)存空間、CPU使用、磁盤IO等資源,需要做到相互隔離,并且可以配置。目前Linux服務(wù)器一般用KVM、XEN、LVS等虛擬化方案,但與Lxc(Linux Container)相比,有些重。Lxc是一種Linux內(nèi)核虛擬化技術(shù),可以提供輕量級的虛擬化,以便隔離進(jìn)程和資源,而且不需要提供指令解釋機(jī)制以及全虛擬化的其他復(fù)雜性(更多解釋,見http://baike.baidu.com/view/6572152.htm)。一般被用作隔離的虛擬容器使用。

          目前vmware的cloud foundry開源的PAAS,單獨(dú)使用了cgroups + c 語言組件使用了比Lxc更為輕量的方案,有時(shí)間會談一下。Lxc,借助cgroups組件,可以做到精確到CPU、內(nèi)存、IO性能等,但cgroups無法做到磁盤限額,借助LVM的強(qiáng)大功能,可以做到單個(gè)應(yīng)用磁盤容量的精確控制。

          Lxc的另一個(gè)替代品,OpenVZ,使用上可能會簡單些,起碼在磁盤限額方面,比Lxc做的更好一些。

           

          準(zhǔn)備

          VirtualBox 4.1

          所有操作環(huán)境,都是基于免費(fèi)的VritualBox虛擬機(jī)基礎(chǔ)上。若有興趣嘗試者,也建議安裝一個(gè)。在進(jìn)行后面步驟之前,需要熟悉VritualBox的各項(xiàng)操作,都很簡單。

          官網(wǎng)

          Ubuntu 12.04 Server

          Ubuntu 12.04服務(wù)器版,在虛擬支持方面,比Centos等系統(tǒng)更友好,也更完善。其已經(jīng)內(nèi)置對LXC等的支持,十分簡單、易用。

          LVM

          Linux下邏輯磁盤管理工具,可能需要一點(diǎn)點(diǎn)了解。它是一個(gè)好東西,Linux系統(tǒng)管理員應(yīng)該不會陌生,可以對磁盤、分區(qū)動態(tài)進(jìn)行容量管理維護(hù),十分強(qiáng)大。

          LXC

          Linux Container,在一個(gè)ubuntu服務(wù)器上虛擬若干個(gè)互相隔離的子系統(tǒng),每一個(gè)子系統(tǒng)用于托管Java Web應(yīng)用。

          安裝

          在Virtualbox中安裝Ubuntu 12.04,若32位操作系統(tǒng),只能安裝32位Ubuntu服務(wù)器,若是64位版本,可以安裝64位服務(wù)器版本。

          網(wǎng)絡(luò)連接,選擇橋接模式即可(我的網(wǎng)絡(luò)環(huán)境為DHCP),利用了現(xiàn)有的網(wǎng)絡(luò)設(shè)施,便于安裝一些組件。

          安裝后,確定openssh服務(wù)器已經(jīng)安裝,否則,將很麻煩。記錄下IP地址(這里DHCP地址最好)記下IP地址,使用SSH客戶端Xshell連接,進(jìn)行維護(hù)操作。

          Ubuntu安裝時(shí),記得選擇LVM管理磁盤;安裝好之后,還是可以使用LVM管理磁盤的。


          虛擬機(jī)安裝

          掛載新磁盤

          這一步不是必須,僅為了建立名稱為lxc的卷組。有了卷組,可以方便進(jìn)行虛擬機(jī)的磁盤容量管理,同時(shí)也用于單獨(dú)存放虛擬機(jī)的文件系統(tǒng)。

          安裝好ubuntu 12.04 之后,VritualBox中為當(dāng)前系統(tǒng)“創(chuàng)建一個(gè)新的虛擬硬盤”,假設(shè)磁盤名稱為NewHardDsik1.vmdk。

          很多安裝都需要切換到root用戶角色下操作,這里優(yōu)先切換到root管理員下

          sudo -i

          安裝lxc和lvm

          apt-get install lxc

          備注:若安裝Ubuntu時(shí),若沒有選擇LVM分區(qū)管理等,則默認(rèn)情況下,lvm2軟件沒有被安裝,單獨(dú)安裝lvm2軟件包:

          apt-get install lvm2

          建立lxc卷組

          為第二塊磁盤創(chuàng)建一個(gè)物理卷

          pvcreate /dev/sdb

          創(chuàng)建一個(gè)物理卷組名稱為lxc:

          vgcreate lxc /dev/sdb

          輸入vgdisplay查看卷組

          root@localhost:~# vgdisplay
            --- Volume group ---
            VG Name               lxc
            System ID            
            Format                lvm2
            Metadata Areas        1
            Metadata Sequence No  18
            VG Access             read/write
            VG Status             resizable
            MAX LV                0
            Cur LV                3
            Open LV               1
            Max PV                0
            Cur PV                1
            Act PV                1
            VG Size               8.00 GiB
            PE Size               4.00 MiB
            Total PE              2047
            Alloc PE / Size       768 / 3.00 GiB
            Free  PE / Size       1279 / 5.00 GiB
            VG UUID               SCoO4G-NImr-15WF-CMha-1QAV-7nm3-gnHGz2

          配置屬性

          lxc所有通用配置位于/etc/lxc/lxc.conf,基于默認(rèn)配置基礎(chǔ)上創(chuàng)建一個(gè)最小配置lxc_min.conf:

          #vi /etc/lxc/lxc_min.conf

          lxc.network.type = veth
          lxc.network.link = lxcbr0
          lxc.network.flags = up

          lxc.cgroup.cpuset.cpus = 0
          lxc.cgroup.cpu.shares = 1024

          lxc.cgroup.memory.limit_in_bytes = 512M
          lxc.cgroup.memory.memsw.limit_in_bytes = 768M

           

          創(chuàng)建虛擬機(jī)

          創(chuàng)建一個(gè)虛擬機(jī):

          lxc-create -t ubuntu -n s4 –f /etc/lxc/lxc_min.conf -B lvm --lvname s4 --vgname lxc --fstype ext4 --fssize 1000M

          -t  : 創(chuàng)建的虛擬機(jī)模板名稱,默認(rèn)為ubuntu 12.04最小安裝版,非常小

          -n : 創(chuàng)建的虛擬名稱,需要指定,這里設(shè)置為s4,默認(rèn)情況下也是新建虛擬機(jī)的機(jī)器名,即 hostnmae

          -f : 指定配置文件

          -B : 虛擬機(jī)磁盤的系統(tǒng),為了控制單個(gè)虛擬機(jī)的磁盤容量限制,這里使用lvm進(jìn)行管理。

          --lvname :虛擬機(jī)使用卷名,默認(rèn)使用虛擬機(jī)名

          --vgname :卷組名稱,這個(gè)一定要有,默認(rèn)名稱為lxc,可以單獨(dú)指定。若不指定此選項(xiàng),則要求名稱為lxc的卷組已經(jīng)存在,否則,請指定已經(jīng)卷組名。

          --fstype :文件系統(tǒng)類型,默認(rèn)為ext4類型

          --fssize :磁盤容量,默認(rèn)為1G,單個(gè)應(yīng)用所占有磁盤空間,一般安裝之后,除了系統(tǒng)文件等,也就剩下500M作用可以使用。

          簡化后的命令:

          lxc-create -t ubuntu -n s4 –f /etc/lxc/lxc_min.conf  -B lvm

          指定lvm創(chuàng)建的虛擬機(jī)磁盤文件位置為 /dev/lxc/s4

          第一次安裝,會耗費(fèi)些時(shí)間,需要從網(wǎng)絡(luò)上下載一些軟件包進(jìn)行安裝,若沒有網(wǎng)絡(luò)的話,會很慘。第二次安裝之后,一些軟件包被緩存了之后,會很快的。

          另外指定磁盤格式為lvm,創(chuàng)建時(shí),將十分消耗內(nèi)存。

          此虛擬機(jī)為最小安裝方式,相當(dāng)綠色,可能會缺失一下軟件包,需要登陸進(jìn)入之后進(jìn)行安裝。  

          啟動虛擬機(jī)

          lxc-start -n s4 -d

          注意一定要加 -d 參數(shù),標(biāo)記為后臺運(yùn)行,否則,將不太利于管理了。

          登錄管理

          lxc-console -n s4

          lxc-console到了SSH的效果,默認(rèn)的用戶名和密碼都是ubuntu,輸入之后,正常管理。

          退出管理

          ctrl + a ,然后敲入字母q,即可退出當(dāng)前系統(tǒng)s4。

          SSH連接

          登陸進(jìn)入之后,通過ifconfig命令獲得IP地址,使用SSH可連接。

          ssh ubuntu@10.0.3.138

          hostname解析

          建立一個(gè)虛擬機(jī)之后,登陸進(jìn)去之后才能夠獲得IP,下次重啟,動態(tài)IP可能會變化,對維護(hù)操作帶來不便。在創(chuàng)建虛擬時(shí),我們已經(jīng)指定了虛擬機(jī)名稱,同時(shí)也是虛擬hostname的名稱,通過虛擬機(jī)hostname建立SSH連接最是方便了。

          一般采用:

          vi /etc/resolv.conf

          nameserver 10.0.3.1
          nameserver 8.8.8.8

          一定要注意順序,nameserver 10.0.3.1用以解析虛擬機(jī),下面一條隨便填寫,只要能夠使用即可。這里使用免費(fèi)的8.8.8.8替代。

          nslookup s4 & ping s4

          測試是否解析正常。

          但是一旦系統(tǒng)重啟,上述配置會消失,補(bǔ)救:

          #vi /etc/resolvconf/resolv.conf.d/tail

          nameserver 10.0.3.1
          nameserver 8.8.8.8

          保存,使之生效:

          #/etc/init.d/resolvconf restart

          這樣下次重啟宿主機(jī),可以不用擔(dān)心DNS失效。

          以下方法,可以不用去做:

          可不用修改LXC虛擬機(jī)s4的 /etc/dhcp/dhclient.conf 配置文件

          send host-name "s4";

          當(dāng)然,修改后,需要生效之:

          /etc/init.d/networking restart

          SSH正常連接

          ssh ubuntu@s4

          在宿主機(jī)下基于SSH使用scp命令執(zhí)行文件傳輸?shù)龋驁?zhí)行管理維護(hù)命令:

          #scp jdk-6u33-linux-i586.bin ubuntu@s4:/home/ubuntu

          #scp apache-tomcat-7.0.27.tar.gz ubuntu@s4:/home/ubuntu

          在S4中安裝JDK之后,設(shè)置環(huán)境變量:

          ubuntu@s4:~$sudo vi /etc/environment

          JAVA_HOME=/usr/java/jdk1.6
          CLASSPATH=/usr/java/jdk1.6/lib

          PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:$JAVA_HOME/bin:$CLASSPATH"

          export PATH

          保存退出,然后執(zhí)行:

          ubuntu@s4:~$sudo update-alternatives --install /usr/bin/javac javac  /usr/java/jdk1.6/bin/javac  1071

          ubuntu@s4:~$sudo update-alternatives --install /usr/bin/java  java  /usr/java/jdk1.6/bin/java  1071

           

          同時(shí)設(shè)置tomcat解析到s4的/home/ubuntu目錄下,mv改名為tomcat,注意設(shè)置.sh腳本的啟動權(quán)限。

          安裝好JDK,設(shè)置tomcat開機(jī)自動運(yùn)行的腳本/etc/init.d/tomcat (后面沒有.sh后綴,參考原文,需翻*墻)

          #sudo vi /etc/init.d/tomcat

          完整內(nèi)容:

          #!/bin/sh
          #tomcat auto-start
          #export JAVA_HOME=/usr/lib/jvm/java-1.6.0-sun // 已設(shè)置JAVA_HOME了,此句可省略。

          case $1 in
          start)
          sh /home/ubuntu/tomcat/bin/startup.sh
          ;;
          stop)
          sh /home/ubuntu/tomcat/bin/shutdown.sh
          ;;
          restart)
          sh /home/ubuntu/tomcat/bin/shutdown.sh
          sh /home/ubuntu/tomcat/bin/startup.sh
          ;;
          *)
          echo 'Usage:tomcat7 start|stop|restart'
          ;;
          esac
          exit 0

          添加到啟動項(xiàng)中:

          #sudo chmod +x /etc/init.d/tomcat ; sudo update-rc.d tomcat defaults

          關(guān)閉,便于后面克隆等操作:

          #sudo lxc-stop –n s4

          虛擬機(jī)克隆

          上面虛擬機(jī)s4安裝好之后,執(zhí)行快速的克隆操作:

          lxc-clone -o s4 -n s5 -s -L 1000M

          -s 要克隆的景象快照,虛擬機(jī)s5和虛擬機(jī)s4保持一致了
          -L 虛擬機(jī)s5的文件系統(tǒng)大小,默認(rèn)為2G。這里指定和S4一樣的文件系統(tǒng)容量。

          虛擬機(jī)s4使用lvm管理磁盤,克隆后的s5自然也使用LVM,位置位于 /dev/lxc/s5。

          這樣,克隆出來的S5就對應(yīng)一個(gè)具體的Tomcat Servlet平臺。

          克隆的速度比創(chuàng)建的速度就是快,5秒之內(nèi)搞定。

          啟動s5

          lxc-start –n s5 –d && ssh ubuntu@s5

          輸入java –version可以看到j(luò)ava已經(jīng)安裝成功,tomcat的目錄為 /home/ubuntu/tomcat,執(zhí)行啟動腳本:

          /home/ubuntu/tomcat/bin/start.

          刪除/注銷

          lxc-destroy -n s7 -f

          -f 參數(shù)可以強(qiáng)制銷毀正在運(yùn)行中的虛擬s7

          虛擬機(jī)自動啟動

          把虛擬s5設(shè)置為自動啟動:

          ln -s /var/lib/lxc/s5/config /etc/lxc/auto/s5.conf

          下次宿主機(jī)重啟,s5會自動啟動。其它虛擬機(jī)設(shè)置于此類同。

          按照以上辦法,克隆s6,s7更多的虛擬機(jī),執(zhí)行SSH連接,部署WAR包,重啟tomcat等,這一切操作可以在宿主機(jī)上創(chuàng)建一個(gè)sh腳本執(zhí)行。

          注意事項(xiàng)

          lxc暫時(shí)還不能直接查看內(nèi)存,CPU等信息,通過free、top或/proc/meminfo、/proc/cpuinfo 是不準(zhǔn)確的,看到的都是宿主機(jī)的信息。

          要想查看,到/sys/fs/cgroup/*/lxc/虛擬機(jī)名稱下/查看。

          查看虛擬機(jī)s5當(dāng)前內(nèi)存:

          #cat /sys/fs/cgroup/memory/lxc/s5/memory.usage_in_bytes

          查看虛擬機(jī)s5內(nèi)存上限

          #cat /sys/fs/cgroup/memory/lxc/s5/memory.limit_in_bytes

          查看交換分區(qū) + 內(nèi)存的上限

          #cat /sys/fs/cgroup/memory/lxc/s5/memory.memsw.limit_in_bytes

          有關(guān)cpu,或者cpuset,于此類似。

          即時(shí)修改虛擬機(jī)s5的內(nèi)存上限:

          echo 800M > /sys/fs/cgroup/memory/lxc/s5/memory.limit_in_bytes

          其它修改也是如此,很簡單。

          但若是主動mount /cgroup ,則以上位置會發(fā)生變化。

          PAAS路由

          單臺宿主機(jī)路由

          一臺宿主機(jī)上存在若干個(gè)Tomcat Servlet平臺,外部請求如何動態(tài)轉(zhuǎn)發(fā)到相應(yīng)的虛擬機(jī)對應(yīng)平臺上,本文環(huán)境是一臺宿主機(jī)(想虛擬兩臺,但筆記本太爛),比較好辦。

          關(guān)掉防火墻

          ufw disable

          然后重啟

          安裝nginx:

          apt-get install nginx

          創(chuàng)建目錄 /home/test/hosts,一般用戶可讀寫。

          修改nginx配置文件,在http大括號體最好一行添加內(nèi)容:
          vi /etc/nginx/nginx.conf

          inlcude /home/test/hosts/*.conf;

          建立虛擬機(jī)s5的Tomcat Servlet平臺配置片段:

          vi /home/test/hosts/s5.conf

          server {
              listen 80;
              server_name s5.yong.com;

              location / {
                  proxy_set_header X-Real-IP $remote_addr;
                  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                  proxy_set_header Host $http_host;
                  proxy_pass http://s5:8080;
              }
          }

          一個(gè)虛擬機(jī)一個(gè)配置文件,其它虛擬機(jī)配置于此類似,都丟在此目錄下。nginx啟動/重新加載時(shí),自動會讀取。

          測試時(shí),在本地的hosts文件,添加映射

          # 192.168.2.28 為宿主機(jī)IP
          192.168.2.28 s5.yong.com

          使用瀏覽器即可訪問。

          一般使用非root用戶操作nginx,使用iptables等防火墻工具進(jìn)行端口映射,這里省略。

          另外,要做到nginx不重新加載或重啟,可能需要定制nginx路由部分了,比如淘寶采用了nginx + lua實(shí)現(xiàn)。

          這里有一群淘寶牛人開源的nginx組件集 http://openresty.org/ ,可供參考。

           

          多臺宿主機(jī)路由

          這個(gè)路由規(guī)則相當(dāng)復(fù)雜,可以設(shè)置單獨(dú)一臺DHCP服務(wù)器,可以分配10.*.*.*私有IP。這樣可以保證一個(gè)IP對應(yīng)一個(gè)外網(wǎng)域名。

          但,如cloud foudry 采用nginx + lua + ruby進(jìn)行路由轉(zhuǎn)發(fā)交換數(shù)據(jù),更為復(fù)雜。

          聽說,Heroku則采用nginx + erlang進(jìn)行路由處理。

          有機(jī)會再說說這一部分吧。

           

          結(jié)束語

          好吧,我承認(rèn)標(biāo)題有些大,不過,標(biāo)題黨就是這樣,先吸引過來再說。但不是初衷,起一個(gè)名字,用以概括全文,但最終發(fā)現(xiàn),還是有些虛了,頗感無奈。

          類似于資源分配,安全策略,流量計(jì)費(fèi)等,提供SQL,NOSQL,隊(duì)列服務(wù)等高級Topic,太廣泛,省略之。

          所有操作都是基于終端命令,若是外層可以使用JSP等腳本簡單包裝一下,那就成了PAAS Tomcat Servlet環(huán)境托管管理系統(tǒng)了。

          用慣了Tomcat,理論上Jetty或者JAVA EE完整版容器也是可以的。

          有關(guān)LXC更多、更深入用法,請見參考資料。

           

          參考資料

          1. https://help.ubuntu.com/12.04/serverguide/lxc.html
          2. Virtualization in the EC2 cloud using LXC

          posted on 2012-06-23 11:36 nieyong 閱讀(11555) 評論(0)  編輯  收藏 所屬分類: 容器

          公告

          所有文章皆為原創(chuàng),若轉(zhuǎn)載請標(biāo)明出處,謝謝~

          新浪微博,歡迎關(guān)注:

          導(dǎo)航

          <2012年6月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          統(tǒng)計(jì)

          常用鏈接

          留言簿(58)

          隨筆分類(130)

          隨筆檔案(151)

          個(gè)人收藏

          最新隨筆

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 固始县| 广汉市| 托克逊县| 洮南市| 平陆县| 大港区| 祥云县| 邳州市| 额敏县| 武城县| 昭通市| 富蕴县| 奈曼旗| 昆山市| 平原县| 遂昌县| 休宁县| 沛县| 饶河县| 海伦市| 平原县| 嘉定区| 天津市| 马关县| 安仁县| 建阳市| 柳林县| 易门县| 滨州市| 扶余县| 壤塘县| 汶上县| 西贡区| 咸丰县| 军事| 华安县| 荣昌县| 开原市| 永定县| 博罗县| 梁河县|