2013年3月28日 星期四

gemfire 安裝

gemfire安裝上~ 其實非常的簡單~
偶這是安裝在ubuntu server 12上, 其實win也是很像~ 比hadoop還簡單一u一...
有收錢跟沒收錢的還是有差~~

首先安裝SUN JDK...並記錄一下JAVA_HOME的位置~
###install sun jdk
cd /etc
su
mkdir jdk
cd jdk
cp /home/administrator/Downloads/jdk-6u32-linux-x64.bin .
chmod 755 jdk-6u32-linux-x64.bin
./jdk-6u32-linux-x64.bin

從官網下載gemfire包~ 傳到主機上~
###install gemfire
#download gemfire (ex:vFabric_GemFire_70_b38623.zip)
#upload file to ap
#create work dir (change folder owner first~) (ex: /etc/gemfire)
#cp gemfire and unzip here

總之~ 解壓縮做完~ 就是開始做路徑設定~ 我是有啟用gfsh...
###active gfsh
cd /etc/gemfire/vFabric_GemFire_70/bin
vim gfsh
##add
JAVA_HOME=/etc/jdk/jdk1.6.0_32/
##append jars (如果不跑練習的話~ 就可以不用SampleCode的jar)
:$GEMFIRE/lib/commons-logging.jar
:$GEMFIRE/lib/gfSecurityImpl.jar
:$GEMFIRE/lib/jackson-core-asl-1.9.9.jar
:$GEMFIRE/SampleCode/quickstart/classes
:$GEMFIRE/SampleCode/tutorial/classes

另外他原本的shell~ 反正~ 如果有用到跑不起來~ 就都去設個JAVA_HOME或是xxx_HOME之類的~就是了一_一"...都是java程序配shell

以上這樣子~ 其實基本安裝就完成了!!

接著設定locator, server的位置
(主要這邊是放gemfire 系統log, 跟gemfire server的工作路徑~ 是可以隨便指定啦~ 但是一堆檔會亂七八糟~ 所以我後來都有弄地方給他們住)
我是以 /etc/gemfire/vFabric_GemFire_70 為管理的目錄來做~
cd /etc/gemfire/vFabric_GemFire_70
###create locator1 folder
mkdir locator1

###create server1 folder
mkdir server1

再來就是掛上自己寫的程式與設定...因為我後來一台機器有起N個Node(所以才叫server1, server2...)...為了佈署方便~ 所以也掛在管理的目錄底下
cd /etc/gemfire/vFabric_GemFire_70
###create my lib folder
mkdir libs

#install my libs
cp ~/xxxx.jar libs

除了程式jar檔之外~ 還有眾多設定檔~ 那~ 當gemfire server起來時~工作路徑classpath在那呢~ 噹噹~ 就是上面開的server1啦~~
cd /etc/gemfire/vFabric_GemFire_70
###install properties(include log4j/myproerties/gemfire properties)
cp ~/*.properties server1

布署gemfire server xml~ 這個server xml的位置是可以自己指定位置的~ 不過我習慣把他放在server/xml下, 以做區別(他這個server的細部設定~ 可以從程式init~ 也可從xml init...兩邊可以做的事情是一模一樣的~ 像hibernate一樣~ 只不過寫在xml裡~ )
cd /etc/gemfire/vFabric_GemFire_70
###install gemfire server properties
cp ~/xxx_server.xml server1/xml

簡單的說~ 該上去的檔都好了~ 可以啟動Server了~

使用的架構上~ 有使用locator...locator預設port就是10334...不過值寫清楚比較不會亂~
cd /etc/gemfire/vFabric_GemFire_70 
###start locator
bin/gfsh start locator --name=locator1 --port=10334

耐心等待~ 過一陣子~ 有成功的話就會寫xxxx running...
理論上, 在這就可以去locator1 folder裡面看到~ 生出了log, 幾個file...log可以殺~ 但是其他的檔不能殺~ 這些是他判定server狀態的檔...
啟動失敗有錯的話~ 就是看log才知道是怎麼了~Orz...console上只會顯示xxx Fail ...stop running...類似的字樣

locator起好後~ 起server
cd /etc/gemfire/vFabric_GemFire_70
###start cacheserver
bin/cacheserver start -classpath="../libs/mylib-1.0.jar:../libs/mylib2-1.0.jar" locators=localhost[10334] mcast-port=0 cache-xml-file=../server1/xml/xxx_server.xml -server-port=0 -dir=server1

有起來的話~ 他也會寫xxx running...失敗的話~ 會再多一行...xxx stop running...
import 自訂libs..在-classpath裡面加(其實偶實際用到是一拖拉庫~)
指定locators, 就是指到前面的locator1, 同一台可用localhost, 不同台打ip...
cache-xml-file, 指定gemfire server xml位置~
dir, 指定該server的工作路徑~
注意一下~ 路徑上除了dir外, 都是以bin路徑做相對路徑的撰寫...
cacheserver還有其他的參數可以定~

這個shell會長很大(因為要import的lib太多)~ 所以後面都是寫成一個shell..不然每次貼很麻煩~~

一個cacheserver就是一個node(也是一個java VM)...所以多個node就是多個server的意思~ locator主要只是紀錄叢集的登錄者~ 他只記有那台server有串連~ 或是提供給client一個統一的連結入口~
locator並不是一定要存在~ 單一node其實可以不需要locator就能讓系統運作~~

如果要起多個node指向同一份jar就是小改一下就好~~設定檔我習慣就是大家own自己的~
bin/cacheserver start -classpath="../libs/mylib-1.0.jar:../libs/mylib2-1.0.jar" locators=localhost[10334] mcast-port=0 cache-xml-file=../server2/xml/xxx_server.xml -server-port=0 -dir=server2

多個node要注意的是~ gemfire server xml的內容設定必須一模一樣!!!!...不然他會生氣錯亂就起不起來了XD...可是lib不一樣他不會叫喔XD...所以可以搞成~ 同一份的儲存形態~ 但是用不同的程式算XDXD"...(通常是多台先找一台來試~ 或是寫log...一台單測OK了才全換)

gemfire有個優點就是可以online擴充...在多node的時候~ 隨便換其中一個node下上~ 並不會影響整體的資料異動與運作~ 所以可以維持在資料不動的情況~ 抽換演算法(debug時算好用~ 不然去重倒一次資料超麻煩的...)

shutdown的方式如下~如果有指定資料夾就很方便
###shutdown server
bin/cacheserver stop -dir=server1

如果沒指定資料夾~ 就得找出他的pid...pid在他server生出來的pid檔裡~cat 一下就可以看到id(java程序id, 每次都會換的)
###shutdown server by pid
bin/gfsh stop server --pid=1564

停止locator我是用這樣, 去查locator1底下的pid檔~ 再關~(locator幾乎不會死~ 而且他也不用動內容~ 偶爾手動關是沒差)
###shutdown locator by pid
bin/gfsh stop locator --pid=1676

不過之前也有亂搞到~ 怎麼停也停不掉~
反正~ 最後還有reboot大法!!!
不過資料就會掉了XD(有加設定的話是會回存啦~)

gemfire 碎碎念...

Gemfire...如果把他丟進wiki...你會得到一個遊戲...
但是丟到Java...就是...囧rz...

其實這個現在是vmware底下的一個產品~
前身是gemstone公司做的~ 後來被vmware買走~
聽了一些課~ 搞了一個POC~
簡單的認知就是一個以Java為Base(可跨平台Win/linux), 可以做為In Memory DB/Grid, 分散式可擴充的運算或儲存的一個實作架構...
(在儲存處理的部分~ 是以RAM為主~ 也可配置Disk使用~ 當然這邊就是靠設定在做... )
另外因為是以Memory為主, 所以在I/O上有很大的優勢~~是新名詞Fast Data的一環...
(之前一堆人喊 Big Data...現在還要Fast...是想逼死我們這些苦命工程師喔QQ)

官網在這
https://www.vmware.com/products/application-platform/vfabric-gemfire/overview.html

說到很囧的原因是...
這東西~ 在台灣沒人用過阿阿阿阿阿.....
目前就大陸那邊有個代理gemfire的~ 台灣vmware大概今年才會開始在台灣努力一下...
目前偶公司是想當代理還是SI技術支援之類的~不管他...反正就公司政策啦...

前提就是~ 只有業務說得像真的一樣的~ PPT演講~
外國人來上一天的實機安裝(用啥spring的ide...完全不知道在幹麻~光ide就不會用了一_一)
靠著官網...下載試用...
還有官方文件就是一本九百多頁但是完全不會變重的pdf...user guild...
就這麼的莫名其妙的...靠文件, 靠Java, 有看跟沒有懂的shell, log, 加上一點直覺...
也莫名其妙的做了一點成果(至少會動啦一_一")
(提一下spring, 原來他們也被vmware買走了~vmware買了不少有open source的公司阿~)

雖然大陸人後來有來幫我們上課~ (其實還蠻有用的~ 直接把架構跟做法拿給他們看跟討論...改一下就很有進步)...不過是真的晚了點(前面自己奮鬥了兩個半月Q__Q..你們早點來教不就簡單多了)


在設計理念的前提下~ 偶是把他當一個大型的memory pool來看~
反正就是可以多台叢集~ 把多台的RAM連起來一樣~~~資料交換與儲存都在memory中~ 最後只把對其他系統交換的結果寫出檔案或寫進DB裡...
後來再加進grid的概念下來做分散式運算~


使用後的心得是~ 在硬體上~ gemfire就是個以memory儲存為主的架構~ 所以RAM一定要大!!
至少配8G以上吧~ 測試區有4G的~ 很容易就被打爆到out of memory...
CPU也不要太差~ 因為他很多是用Thread的方式在進行...CPU高處理快~ Queue住的Thread就會比較少...Thread太多排隊要做~ 也是會撐爆RAM的...

OS要求很簡單~ 就盡量使用64位元的吧~ 主要是64位元~ 可定義的RAM才比較大~ 比較好用...平台要省錢就是用linex系列...

軟體環境只要JDK...大家都知道7有問題(被商業化就爛尾了XD)...所以好習慣請使用6以上即可...我都是另外用SUN JDK...預設open jdk常常有怪問題...

至於選用server版或桌面版都可以~ 話說偶看到linux那些桌面版反而都不會用Orz...雖然很痛恨黑白畫面~ 但是有畫面更不會用.../默...所以管理上比較習慣是主機都全灌server版, 然後配一台win的做所有putty/client GUI/跳版管理...


有一點比較麻煩的是~ 傳統儲存都是DB或是File..之類的~ 存在memory...就想成是一堆資料流~ 並沒有被實體化~ 說真的寫了什麼進去都常搞不清楚XD...初期還寫了一套DB儲存的備案(因為怕gemfire做不出來開天窗就GG了)...可以看看資料在不同程序下的變化~
不過gemfire也是有一些管理工具啦~ 不過有其他的安裝跟設定~ 當初沒有研究就...
還有些工具需要授權碼才能開啟功能~ 也是個麻煩的地方...
(台灣其實也沒有正式代理~ 那個碼你有錢也買不到...反正就跟原廠凹一個來用就對了XD)

另外是運算概念的不同~ 主要差別在分散式的概念~ 以前多筆就是一個LOOP下去~ 一直跑跑完就是了~ 現在是分散到不同機器去跑~ "總量"的統計變成困難~ 還有運算的結束時間點判定困難~ 都是一些在效能比較時會碰到的問題~

延伸出來的就是~ 不同Thread同時去讀/寫同一個資料的問題~ 在DB中有良好的trsation機制來看...但是在這邊就要自行處理~ 還有"多台主機"同時access"同一份資料"的議題也算是新的...(聽說DB叢集是每一台都有一份一模一樣的資料~ 所以都只會ACCESS自己主機的資料~ 不過在gemfire裡面~ 資料是分散儲存的~ 資料碰撞的問題會更明顯)

有一部分是設定的部分~ 他提供的XML設定項目多的...看user guild還不是全部的哩~~~
如果搞懂設定~ 的確可以使用到很多很方便的功能!!...少寫很多處理的程式~~
不過設定歸設定~ 設定後是不是真的如你所想的運作~ 嗯哼~ 要有測或出事了才知道Orz...


還有一個常比較的是~ 要快的話~ DB資料可以做trigger...gemfire也大多是利用這個特性來達到分散運算(就是省client-server資料傳輸)~ 所以變成DB的預存程序會來跟他做比較~ 上課討論中~ 大家也都是吵預存程序的問題還蠻多的XD...
偶想了很久~真要說gemfire在這裡的優點就是~ 容易外掛功能~ 像...web service處理之類的~ DB能發web service去介接外部API和功能嗎
另外就是DB程序人員的凋零XD...現在畢業出來有多少人是主攻DB設計的~ 另外不同加的DB提供的function也不一樣~ 管理也不同~ 是一個比較封閉的平台..吧O_o

那gemfire能取代DB/File嗎~ 基本上還是不太行~ 雖然RAM可以串連變大~ 但是簡單的說~ 要搞到1T的ram...和1T的硬碟那個比較簡單=___=|||...所以偶覺得他的定位是比較偏向Fast data...利用memory加速I/O..以及分散式運算...可彈性擴充延展做為一個middle ware...
而且有速度要求的系統並也不是很多~ 以CP值和管理維護來說~ 依據系統提供服務的特性來選用架構是還是比較正確的~