2013年3月22日 星期五

USB 3.0 介面卡與硬碟外接盒速度比較



因為那場惡夢, 為了找問題, 買了一些設備來交叉比對, 正好拿來做一些匹配性與速度的量測, 提供一些數據給網友們做參考!!

實驗設備


平台
    Windows Server 2003 R2 Enterprise Edition SP2 [5.2 Build 3790] (x64)

USB 3.0 介面卡A 
    晶片 uPD720201

USB 3.0 介面卡B
    晶片 ASM1042


USB 3.0硬碟外接盒 1 
   S25U3-6GUASP ( 晶片 ASM1053 )


USB 3.0硬碟外接盒 2
   AKE ( 晶片 ASM1051 )


SSD 
   Plextor M5S 256G

USB 3.0 隨身碟 1
   Transcend JF760 32G



USB 3.0 隨身碟 2
   Sandisk SDCZ80 64G



測速軟體
   CrystalDiskMark 3.0.2 (C)

測速執行設定
    Test : 1000 MB [P: 20.6% (49.0/238.5 GB)] (x1)





USB 3.0 介面卡A + USB 3.0硬碟外接盒 1 SSD  ( uPD720201+ ASM1053 )
           Sequential Read :   142.045 MB/s
          Sequential Write :   123.784 MB/s
         Random Read 512KB :   101.244 MB/s
        Random Write 512KB :   122.409 MB/s


USB 3.0 介面卡A + USB 3.0硬碟外接盒 2 SSD  ( uPD720201+ ASM1051 )
           Sequential Read :   130.193 MB/s
          Sequential Write :   122.727 MB/s
         Random Read 512KB :    95.896 MB/s
        Random Write 512KB :   121.705 MB/s


USB 3.0 介面卡A + USB 3.0 隨身碟 2    Sandisk SDCZ80 64G

           Sequential Read :   141.566 MB/s
          Sequential Write :   117.068 MB/s
         Random Read 512KB :   114.013 MB/s
        Random Write 512KB :    22.571 MB/s


USB 3.0 介面卡A + USB 3.0 隨身碟 1    Transcend JF760 32G

           Sequential Read :    82.885 MB/s
          Sequential Write :    42.714 MB/s
         Random Read 512KB :    72.650 MB/s
        Random Write 512KB :     1.641 MB/s



USB 3.0 介面卡B + USB 3.0硬碟外接盒 1 SSD  ( ASM1042 + ASM1053 )

           Sequential Read :   140.692 MB/s
          Sequential Write :   132.129 MB/s
         Random Read 512KB :   101.653 MB/s
        Random Write 512KB :   130.878 MB/s


USB 3.0 介面卡B + USB 3.0硬碟外接盒 2 SSD  ( ASM1042 + ASM1051 )

           Sequential Read :   137.518 MB/s
          Sequential Write :   128.360 MB/s
         Random Read 512KB :    99.963 MB/s
        Random Write 512KB :   128.468 MB/s


USB 3.0 介面卡B + USB 3.0 隨身碟 2    Sandisk SDCZ80 64G

           Sequential Read :   139.383 MB/s
          Sequential Write :   134.175 MB/s
         Random Read 512KB :   113.426 MB/s
        Random Write 512KB :    24.021 MB/s


USB 3.0 介面卡B + USB 3.0 隨身碟 1    Transcend JF760 32G

           Sequential Read :    82.937 MB/s
          Sequential Write :    42.334 MB/s
         Random Read 512KB :    72.578 MB/s
        Random Write 512KB :     1.506 MB/s


總結


  1. 介面卡的差異性不大, 兩者價錢也差不多, 幾乎沒差別, 唯一有差別的是ASM1042的介面卡, 在Windows平台上是需要安裝驅動程式的, 但uPD720201不需要額外裝驅動程式 !
  2. USB 3.0 硬碟外接盒差異性就有多些差異了, ASM1053的數字比較好, 但價差很大!! S25U3-6GUASP約七百多, 但AKE的三百元不到!! 不過因為我的主機板沒支援UASP, 所以前者也無法跑出廠商宣稱的更快速度.
  3. 同是隨身碟, 本身也有速度差, 若需求是快速存取, 建議是買大容量的, 因為即使是同一款式, 大容量的存取速度會比較快, 此外格式化的類型也有影響, 可參考先前的文章!!


2013年3月20日 星期三

Vmware 與Linux Kernel 更新衝突



這下"杯具"了 ...

前幾篇文章都在搞儲存媒體,  只為了加快Vmware所需的存取, 其中一個動作就是升級Kernel

從Ubuntu 11.04 3.0.0-32 升級到 12.04 3.2.0-39 甚至手動升級Kernel到 3.8.2

好不容易搞定儲存媒體, 結果執行後才知道該死了,...

VMware workstation 9.0.0 build 812388 沒支援這麼新的 Kernel !!!


一開始是告知 vmware kernel module updater 找不到  header ...

網路上的解法是

sudo ln -s /usr/src/linux-headers-$(uname -r)/include/generated/uapi/linux/version.h /usr/src/linux-headers-$(uname -r)/include/linux/version.h

但在後續安裝上仍會出問題 ...

VMware Blocking Filesystem 與 Virtual Machine Communication Interface 會出現編譯失敗

進一步得安裝 vmware patch for 3.8 kernel

但即使安裝後還是沒辦法解決問題

後續也嘗試著重新安裝, 但即使整個過程都沒有出現錯誤, 可以讓VMware順利執行, 但只要一執行任一 Guest OS, 底層的作業系統就立即掛掉 !!

難外網友建議, 不要搞Patch了, 直接以舊版Kernel啟動 !

看來這是階段性最好的方法了 !

2013年3月19日 星期二

隨身碟的檔案系統與速度比較



寫在前面

這篇內容, 提到不少格式化的動作 ! 有必要提醒一下, 磁碟或隨身碟格式化後, 資料就不見了(或者說是很難救回來), 所以操作前務必小心, 資料一定要先備份, 也別手滑了搞錯磁碟機 ! 


因為之前的那場惡夢, 所以買了Sandisk SDCZ80 64G隨身碟, 拆封後做了一些傳輸實驗, 速度還不錯, 讀取有到130MB/s 以上, 寫入也有 90MB/s !

但想說網路上說3C的商品瑕疵不少, 我的手氣也挺不好的, 還是 Format一下吧 , 做個驗證. 但就因此又出狀況了! 手氣背呀 !

FAT32有單檔4G的問題, 所以NTFS是比較直覺的選擇,

NTFS格式化後, 寫入速度竟然掉到40MB/s 以下 ! 不會吧, 這是USB 3.0的隨身碟耶 ! 剛到手的速度很好呀, 怎麼格式化後, 速度全沒了, 反而變慢很多!!

仔細參考網路上的說明, 招式不少, 但看來怪怪的, 效果不一... 還是自己實驗比較準..

測速系統平台
Linux ( Ubuntu 12.04, Kernel 3.8.2-030802 )
配備 USB 3.0介面卡

隨身碟
Sandisk SDCZ80 64G

測試檔案
ubuntu-9.10-dvd-amd64.iso 檔案大小 3.89GB ( 4174614528Bytes )


格式化用系統平台
Windows XP


實驗開始


當該隨身碟格式化為NTFS (配置單位大小為預設值 4K)

$ cat ubuntu-9.10-dvd-amd64.iso | pv -abt -B 0 > /media/2CBA24E6BA24ADF0/test1.data
寫入 3.89GB [32.3MB/s]


$ cat /media/2CBA24E6BA24ADF0/test1.data | pv -abt > ./testa.data
讀取 3.89GB [ 132MB/s]





當該隨身碟格式化為FAT32 (配置單位大小為預設值, 16K ?)
$ cat ubuntu-9.10-dvd-amd64.iso | pv -ab -B 0 > /media/26BB-E26D/test3.data
寫入 3.89GB [ 101MB/s]

$ cat /media/26BB-E26D/test2.data | pv -abt > ./testa.data
讀取 3.89GB [ 123MB/s]



當該隨身碟格式化為exFAT  (配置單位大小為預設值, 128K?  exFAT聽說是64GB Flash出廠的預設格式, Sandisk官網說的)

$ cat ubuntu-9.10-dvd-amd64.iso | pv -abt -B 0 > /media/2AC7-BD36/testa.data
寫入 3.89GB 0:00:39 [ 101MB/s]

$ cat /media/2AC7-BD36/testa.data | pv -abt > ./testa.data
讀取 3.89GB 0:00:31 [ 128MB/s]




嘿嘿, 看來找到玄機了 ! 相同環境下, 不同的磁碟格式, 效能差異很大 !!

不過這其中看到幾個變數調整點

  • 格式化的工具
    • 當在檔案總管時中,針對磁碟機按右鍵選擇格式化, 
      • 這邊執行格式化程式, 選項很少, 尤其是要調整配置單位大小, 通常不能調
      • 安裝完exFAT程式後, 格式化64GB隨身碟時, 格式將被鎖住, 只能選exFAT, 要選用其他格式, 需用其他方式.
    • 電腦管理中的磁碟管理, 這是另一個格式化程式的執行點, 要調整配置單位大小, 可從這邊進行
    • 另一個比較完整的掌控方法就是使用Dos Command
      • 下面指令假設 隨身碟的磁碟代號為 R ( 千萬別照抄 !!! )
      • Format R: /FS:FAT32 /A:8192 ( 將 R: 格式化為 FAT32, 配置單位大小為8K )
      • Format R: /FS:NTFS /A:64K ( 將 R: 格式化為 NTFS, 配置單位大小為64K )
      • Format R: /FS:exFAT /A:64K ( 將 R: 格式化為 exFAT, 配置單位大小為64K ) 
  • 格式化中的選項"配置單位大小"

當NTFS格式下, 不同的配置單位大小, 對效能是否有差異 ( 量測使用的Linux指令同上, 就不再贅述 )

當該隨身碟格式化為 NTFS 配置單位大小為64K

寫入 15.2MB/s  (不是一個慘字能形容)
讀取 124MB/s


當該隨身碟格式化為 NTFS 配置單位大小為8K

寫入 30.8MB/s  
讀取 124MB/s



當該隨身碟格式化為 NTFS 配置單位大小為2K

寫入 31.6MB/s  
讀取 126MB/s




當該隨身碟格式化為 NTFS 配置單位大小為512

寫入 31MB/s  
讀取 123MB/s



看來沒有提升, 影響性不大 ....





 換個格式FAT32, 試試不同的配置單位大小, 對效能是否有差異

當該隨身碟格式化為 FAT32 配置單位大小為64K

寫入 229MB/s
讀取 120MB/s



當該隨身碟格式化為 FAT32 配置單位大小為8K

寫入 235MB/s  
讀取 124MB/s



當該隨身碟格式化為 FAT32 配置單位大小為2K

寫入 228MB/s  
讀取 116MB/s




當該隨身碟格式化為 FAT32 配置單位大小為512

寫入 166MB/s  
讀取 121MB/s






 換個格式exFAT, 試試不同的配置單位大小, 對效能是否有差異

當該隨身碟格式化為 exFAT 配置單位大小為128K

寫入 124MB/s
讀取 118MB/s

當該隨身碟格式化為 exFAT 配置單位大小為64K

寫入 137MB/s
讀取 128MB/s


當該隨身碟格式化為 exFAT 配置單位大小為32K

寫入 91MB/s  
讀取 121MB/s


實驗結束


終於可以不用再Format那個可憐的隨身碟 !!





後續測試


CrystalDiskMark 3.0.2


測試條件
Test : 1000 MB [G: 0.0% (0.0/59.6 GB)] (x1)



當該隨身碟格式化為 FAT32 配置單位大小為64K



           Sequential Read :   142.897 MB/s
          Sequential Write :   125.653 MB/s
         Random Read 512KB :   117.681 MB/s
        Random Write 512KB :    20.001 MB/s




當該隨身碟格式化為 FAT32 配置單位大小為32K



           Sequential Read :   142.586 MB/s
          Sequential Write :   115.089 MB/s
         Random Read 512KB :   117.410 MB/s
        Random Write 512KB :    20.011 MB/s




當該隨身碟格式化為 FAT32 配置單位大小為16K




           Sequential Read :   142.838 MB/s
          Sequential Write :   124.905 MB/s
         Random Read 512KB :   117.410 MB/s
        Random Write 512KB :    20.930 MB/s





當該隨身碟格式化為 FAT32 配置單位大小為8K


           Sequential Read :   139.587 MB/s
          Sequential Write :   116.690 MB/s
         Random Read 512KB :   115.401 MB/s
        Random Write 512KB :    21.173 MB/s







當該隨身碟格式化為 FAT32 配置單位大小為4K



           Sequential Read :   140.390 MB/s
          Sequential Write :   125.233 MB/s
         Random Read 512KB :   115.989 MB/s
        Random Write 512KB :    20.146 MB/s







綜合結論


綜合以上數據, 與我個人使用的需求, 我會選擇 FAT32, 16K !

( VM檔案大, 重點在追求速度! 空間浪費問題是比較其次的, 放超過4G的檔案機率不大...)



後記

exFAT是比較新的檔案格式, Windows 7版本以上才有預設支援, 其他系統得升級後才能支援, 會對可攜性造成一定的影響, 請多留意 !  若使用的是XP系統須安裝 KB955704 的升級軟體, 才能支援 !

各格式的預設單位大小Microsoft有個參考表

2013年3月15日 星期五

惡夢! Ubuntu 上 USB 3.0



最近想搞一些VM, 也想把VM環境搞成可攜帶式, So... 首選衝SSD + USB 3.0 ...

一場惡夢就此開始 ...

環境:

USB 3.0 介面卡 
   LT105 (晶片 uPD720201 ) 兩張各裝在Ubuntu (11.10, 12.04) 與Windows ( Windows 2003 )

USB 3.0 硬碟外接盒1
   S25U3-6GUASP ( 晶片 ASM1053 )


SSD 
   Plextor M5S 256G


USB 3.0 隨身碟
   Transcend JF760 32G




我常用的環境是Ubuntu 主機, 所以就在Ubuntu上面的VMware上開始建立VM. 掛!!! 系統告知讀不到SSD! 甚至連帶慘到讓Linux kernel crash, 主機自動重新開機 !! 回頭翻syslog只是很輕描淡寫的告知  device not ready !!



Mar 14 10:13:08 Linux kernel: [  218.255774] xhci_hcd 0000:03:00.0: xHCI xhci_drop_endpoint called with disable
d ep ffff8803ae607540
Mar 14 10:13:08 Linux kernel: [  218.273966] sd 7:0:0:0: [sdc] Device not ready
Mar 14 10:13:08 Linux kernel: [  218.273975] sd 7:0:0:0: [sdc]  Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
Mar 14 10:13:08 Linux kernel: [  218.273984] sd 7:0:0:0: [sdc]  Sense Key : Not Ready [current]
Mar 14 10:13:08 Linux kernel: [  218.273993] sd 7:0:0:0: [sdc]  Add. Sense: Medium not present
Mar 14 10:13:08 Linux kernel: [  218.274003] sd 7:0:0:0: [sdc] CDB: Write(10): 2a 00 09 4d 7b d8 00 00 f0 00
Mar 14 10:13:08 Linux kernel: [  218.274022] end_request: I/O error, dev sdc, sector 156072920
Mar 14 10:13:08 Linux kernel: [  218.274030] quiet_error: 54 callbacks suppressed
Mar 14 10:13:08 Linux kernel: [  218.274037] Buffer I/O error on device sdc1, logical block 19508859
Mar 14 10:13:08 Linux kernel: [  218.274042] lost page write due to I/O error on sdc1
Mar 14 10:13:08 Linux kernel: [  218.274051] Buffer I/O error on device sdc1, logical block 19508860
Mar 14 10:13:08 Linux kernel: [  218.274056] lost page write due to I/O error on sdc1

初步懷疑是USB 3.0 介面卡的問題, 找了很久!
甚至從 Ubuntu 11.10( kernel 3.0.0-32 )升級到 Ubuntu 12.04 (kernel 3.2.0-38)!
最後火大了, 手動升級Kernel到 3.8.2 ...
結果還是掛...

不過最新的kernel會好一點, 掛掉時只是該檔案操作程序失敗, 不至於拖垮整個系統!

所以疑點擴大了, 該是透過系統性的實驗來找問題了.


SSD 資料讀取實驗 Linux

SSD ---- > 外接盒1 --- > USB介面卡 --- > Ubuntu
複製大量資料 (4G以上) 系統正常 速度還跑出了超過100MB/s令人感動的數字

SSD 資料寫入實驗 Linux (掛點)

SSD  < ---- 外接盒1  < --- USB介面卡  < --- Ubuntu
複製大量資料 (4G以上) 一開始還不錯, 然後沒多久就掛了, 沒完成, 速度數字就不重要了



SSD 資料讀取實驗 PC Windows 

SSD --- > 外接盒1 --- > USB介面卡 --- > Windows
複製大量資料 (4G以上) 系統正常 速度還OK 約81MB/s

SSD 資料寫入實驗 PC Windows

SSD  < ---  外接盒1  < ---  USB介面卡  < ---  Windows
複製大量資料 (4G以上) 系統正常 速度 82MB/s



SSD 資料讀取實驗 NB Windows

SSD  --- > Notebook(原生USB 3.0介面)
複製大量資料 (4G以上) 系統正常 速度--49MB/s

SSD 資料寫入實驗 NB Windows

SSD  < --- Notebook(原生USB 3.0介面)
複製大量資料 (4G以上) 系統正常 速度--64MB/s



對照組出場
USB 3.0 隨身碟 Transcend JF760 32G


隨身碟資料讀取實驗 Linux

隨身碟 --- > USB介面卡 --- > Ubuntu
複製大量資料 (4G以上) 系統正常 速度83MB/s


隨身碟資料寫入實驗 Linux

隨身碟  < ---  USB介面卡  < ---  Ubuntu
複製大量資料 (4G以上) 系統正常 速度74MB/s


隨身碟資料讀取實驗 PC Windows

隨身碟 --- > USB介面卡 --- > Windows
複製大量資料 (4G以上) 系統正常 速度--52MB/s

隨身碟資料寫入實驗 PC Windows

隨身碟 < ---  USB介面卡 < ---  Windows
複製大量資料 (4G以上) 系統正常 速度--41MB/s


隨身碟資料讀取實驗 NB Windows

隨身碟  --- > Notebook(原生USB 3.0介面)
複製大量資料 (4G以上) 系統正常 速度--51MB/s

隨身碟資料寫入實驗 NB Windows

隨身碟 < ---  Notebook(原生USB 3.0介面)
複製大量資料 (4G以上) 系統正常 速度--37MB/s


結論

  • X的! 一開始構想的SSD加上外接盒的方案就是個錯誤的開始, 還不如搞個隨身碟方案!
  • Linux 上USB 3.0介面卡的穩定度真的還存在不少問題, 即使是升級到相當新的版本也是一樣.
  • 硬碟外接盒的相容性似乎也有問題, 等另一款外接盒到手時, 再來個交互驗證.


2013年2月26日 星期二

建立 SSH Tunnel (使用者端 Windows平台)




目的


   出門在外可用加密連線方式連回遠端系統, 跳過所處環境的種種限制, 進行各種活動...

警告

   這些作法, 因為是跳過所處環境的網路限制, 對制度面,法律責任或資訊安全層次, 會產生一定程度衝擊或破壞, 使用前請想清楚並自行承擔責任.

環境


  遠端伺服器 

    Internet --- (1)VDSL --- (2)Router --- (3)Server A

  使用者端

    PC --- Internet


   遠端伺服器需先準備,  相關設定方法請參考



  本文只討論設定使用者端的電腦, 讓該台電腦可以連線回遠端的伺服器 Server A


基本設定

    先下載Putty等工具程式, 讓主機有SSH連線能力, 可至PUTTY下載網址, 只需putty.exe, 軟體很小, 也不需安裝, 頗方便的, 建議放在桌面, 隨身碟等可就近存取的地方.

     開啟 putty.exe 於HostName 區域填入遠端伺服器資料 (如下方舉例 ip為 12.34.56.78 ), 連線方式請選SSH, 點選下方 OPEN.




    請填入SSH伺服器中建立的帳號與密碼, 即可連線到SSH 遠端伺服器.



使用指令


       透過上述方法, 即可使用指令操作遠端伺服器.

使用FTP


      以FileZilla工具程式為例, 輸入以下主機, 帳號名, 密碼, 連線埠請填22.按下快速連線.

      連線成功後, 就可以進行檔案傳輸作業. 有趣的是, 只要遠端伺服器上有SSH服務就可以提供檔案傳輸服務, 遠端伺服器是不須另外安裝FTP Server服務喔!

使用VNC Client


      遠端伺服器需先開啟VNC服務
      使用PUTTY.EXE, 先設定 Session資料, 但還要設定Tunnel資料, 在這步驟先不要按下Open按鈕.

      設定Connect--> Tunnel參數, 填入Source Port 12345, Destination 填入 localhost:5900, 選擇local, Auto, 然後按下 Add, 此時設定完成, 就可以按下Open鍵
     
      登入後, PUTTY不要關.開啟VNC客戶端程式,連線對象不是對方主機喔, 而是localhost, Port號為 12345, 即可連線到遠端的VNC桌面!

      在VNC登出後, 才可以把PUTTY關掉.

使用遠端桌面 Remote Desktop


      遠端伺服器需先安裝與開啟遠端桌面服務
      使用PUTTY.EXE, 先設定 Session資料, 但還要設定Tunnel資料, 在這步驟先不要按下Open按鈕. 同上面的畫面
      設定Connect--> Tunnel參數, 填入Source Port 13456, Destination 填入 localhost:3389, 選擇local, Auto, 然後按下 Add, 此時設定完成, 就可以按下Open鍵


      登入後在透過遠端桌面客戶端程式, 連線對象一樣為localhost, Port號為 13456, 即可看到遠端主機的桌面!

      要注意的是, 這方式連線的遠端桌面是類似Terminal Service相似的作法, 是給你另一個新的Session或是以前未關閉的桌面環境, 並非是遠端主機前螢幕看到的那個桌面. 這對某些應用來說是會是困擾, 請多留意 !!

使用瀏覽器並進行遠端代理 

      使用PUTTY.EXE, 先設定 Session資料, 但還要設定Tunnel資料, 在這步驟先不要按下Open按鈕.

      設定Connect--> Tunnel參數, 填入Source Port 18088, Destination 保持空白, 選擇Dynamic( 這選項與上面不同, 請注意) ,Auto, 然後按下 Add, 此時設定完成, 就可以按下Open鍵


     
      登入後, PUTTY不要關.
      在開啟瀏覽器程式, 設定連線代理, 方式為Socks V5, Proxy Server為127.0.0.1, Port號為 18088, 透過遠端進行連線. 下圖以Firefox為例的設定畫面

      要注意的是, HTTP Proxy的設定要拿掉, SOCKS V5要選, 這樣才能順利連線.

      可以連線到 http://ifconfig.me/ip, 看看遠方伺服器看到的IP變化, 就可以知道目前上網的出口點, 已從近端的IP, 轉換到了遠端的IP了,  恭喜!繞道成功!!



2013年2月25日 星期一

建立 SSH Tunnel ( 使用者端 Linux平台 )



目的


   出門在外可用加密連線方式連回遠端系統, 跳過所處環境的種種限制, 進行各種活動...

警告

   這些作法, 因為是跳過所處環境的網路限制, 對制度面,法律責任或資訊安全層次, 會產生一定程度衝擊或破壞, 使用前請想清楚並自行承擔責任.

環境


  遠端伺服器

    Internet --- (1)VDSL --- (2)Router --- (3)Server A

  使用者端

    PC --- Internet

  設定讓該台電腦可以連線回遠端的伺服器


基本設定


    先確認可以用以下指令, 以SSH 連線至遠端伺服器.

       $ssh username@RemoteHostIPorDomain


使用TENET指令


       $ssh username@RemoteHostIPorDomain    
      登入後, 就可以進行指令運作模式

使用FTP


       $sftp username@RemoteHostIPorDomain
      登入後, 就可以進行指令運作模式

使用VNC Client


      遠端伺服器需先開啟VNC服務
      先執行
       $ssh -C2fNL 12345:localhost:5900 username@RemoteHostIPorDomain
      登入後再透過VNC客戶端程式,連線對象不是對方主機喔, 而是localhost, Port號為 12345, 即可連線到遠端的VNC, 但速度比remote desktop慢很多. 不太推!

使用遠端桌面 Remote Desktop


      遠端伺服器需先安裝與開啟遠端桌面服務
      先執行
       $ssh -C2fNL 13456:localhost:3389 username@RemoteHostIPorDomain
      登入後在透過遠端桌面客戶端程式, 連線對象一樣為localhost, Port號為 13456, 即可看到遠端主機的桌面!

      可是要注意的是, 遠端桌面是類似Terminal Service一樣的作法, 是給你另一個新的Session或以前未正常結束的桌面環境, 並非是遠端主機前螢幕看到的那個桌面. 這對某些應用來說是個很大的困擾.

使用瀏覽器並進行遠端代理 


      先執行
       $ssh -C2fNqD localhost:18088 username@RemoteHostIPorDomain
      登入後在透過瀏覽器程式, 設定連線代理, 方式為Socks V5, Proxy Server為localhost, Port號為 18088, 透過遠端進行連線. 下圖以Firefox為例的設定畫面

      要注意的是, HTTP Proxy的設定要拿掉, SOCKS V5要選, 這樣才能順利連線.

      可以連線到 http://ifconfig.me/ip, 看看遠方伺服器看到的IP變化, 就可以知道目前上網的出口點, 已從近端的IP, 轉換到了遠端的IP了,  恭喜!繞道成功!!




建立 SSH Tunnel ( 遠端伺服器 Linux平台 )


目的


   出門在外可用加密連線方式連回遠端系統, 跳過所處環境的種種限制, 進行各種活動...


警告

   這些作法, 因為是跳過所處環境的網路限制, 對於制度面,法律任或資訊安全層次, 會產生一定程度衝擊或破壞, 使用前請想清楚並自行承擔責任.


環境

  遠端伺服器

  Internet --- (1)Router --- (2)Server A
  1. 網路分享器
  2. 內部伺服器 Server A ( Linux Server )


基本設定



  1. 先要在Router上的Firewall個開口(如果有的話), 讓外部可以存取到Port 22, 採用Router內建的Port Forward設定, 將22 Port TCP封包引導到 Server A的 22 Port去.
  2. 在A伺服器中, 有SSHD Service, 並建立存取帳號  

測試

  • 若以上基本設定完成, 就可以透過 ssh 連線到Server A, 進行登入測試.

2012年8月13日 星期一

大失敗!


再六天就要搬家了, 異想天開的想在廚房牆上貼卡典西德, 用來保護牆面...

失敗了, 下場很慘, 真正是"掉漆"呀  !!






2012年7月26日 星期四

javax.mail POP3 接收 GMail 信件最後時間重置


  最近在撰寫Javax.mail的程式, 用來接收GMail的信件, 程式碼不難, 採用POP3方式收信, 另存成eml檔案, 並將相關標題日期等資訊萃取出來另存xml, 以便做後續搜尋索引..

  在開發期發現一個特別的現象, 透過POP3收下的信, 在連線上去時就找不到了! 即使設定連線為ReadOnly, 還是會消失在Message[]中...


   一直變換的內容, 對開發與測試來說並不方便, 翻找API, 也沒有重新設定位置的功能.


   原因找到了 !! GMail很"貼心"的會去紀錄你POP3收下信件中的最後時間, 可以讓User不會一直得從第一封開始收, 老是收到重複的信. 


   但是若要重置這最後時間, 可在GMail中的「設定」功能, 於POP/IMAP的頁籤中,  選擇 all mail , 然後儲存! 就可以重新回到起點 !

2012年6月27日 星期三

Redis + Keepalived Failover System


  

搞redis很久了, 但卻一直沒等到redis的Cluster, 只好自力救濟, 搞搞自動Failover ...

各系統版本號


  • Centos 5.4
  • Keepalived 1.2.2
  • redis 2.4.15
  系統架構啟發來自Youtube的一個影片 , 想參考的是可以加減看看啦, 但影片中有很多問題!

  1. 沒有字幕
  2. 口白不是英文, 本人完全聽不懂(因作者是西班牙籍, 猜想是西班牙語 )
  3. 字跡非常潦草, 還不斷塗塗改改修正
  4. 更慘的是裡面錯誤很多 (白板上的和視窗內的資料常常對不起來, 還常下錯指令, 奇怪咧為何不重錄? )
  雖然這影片有如此多缺陷, 但至少給了個起點與方向. google了一大堆內容, 自己也try了好幾天 ! 透過不斷得嘗試與找路, 終於陸續找到可行的方法, 而終於搞定了!

  既然找到可行方法了, 就留個紀錄吧, 未來自己可能再用上, 也希望對看到此文的人有點幫助, 少花點時間走冤枉路....

重點:

      先搞定Keepalived !

目的:

      因為主要是要作redis系統的Failover, 所以我挑選的Keepalived模式為Virtual Router Redundancy Protocol (VRRP) 運作模式. ( 抱歉. 後面也不會解釋VRRP, 不清楚的請自行找資料. )

環境:

       有兩台Server 各有自己的IP
           Centos 1 : 10.10.6.156   預設角色為Master server
           Centos 2 : 10.10.6.159   預設角色為Backup server
       想對外有個共同的服務窗口
           Virtual Ip Address (VIP) 10.10.6.200

運作模式:

       當 Centos 1, Centos 2運作正常時, Centos 1負責服務, Centos 2則閒置Standby, 只要Centos 1 沒掛掉, Master不會換人當, 若此時 Master身份的 Centos 1 掛了, Centos 2 則立即扛起Master的責任, 對外提供服務. 即使後來 Centos 1 復原了, Master 仍舊由Centos 2擔當, 直到下次Master掛掉為止. 至於外部使用者, 則不需考慮這麼多, 因為都是使用 VIP 來使用服務, 只要至少有一台活著, 服務就不會中斷...
     

安裝 Keepalived

下載

            請至Keepalived官網 http://www.keepalived.org/下載, 此時最新版本為 1.2.2
        Keepalived for Linux Virtual Server - Version 1.2.2 - January 16, 2011
   

安裝

             解壓縮 tar -xvf  keepalived-1.2.2.tar.gz
             進入目錄 
             開始設定 ./configure
             若出現以下內容  


Keepalived configuration

------------------------

Keepalived version       : 1.2.2

Compiler                 : gcc

Compiler flags           : -g -O2 -DETHERTYPE_IPV6=0x86dd

Extra Lib                : -lpopt -lssl -lcrypto 
Use IPVS Framework       : No
IPVS sync daemon support : No
Use VRRP Framework       : Yes
Use Debug flags          : No

              這是有問題的, 需另外指定kernel目錄 (目錄請自行調整 )
              ./configure --with-kernel-dir=/usr/src/kernels/2.6.18-164.el5-x86_64/ 
              出現以下內容, 才能算勉強過關 ( 我曾試著安裝libnl 但發現非必要, Debug flags 對於找問題, 也沒有什麼用處, 看/var/log/messages比較實際些 )


Keepalived configuration

------------------------

Keepalived version       : 1.2.2

Compiler                 : gcc

Compiler flags           : -g -O2 -DETHERTYPE_IPV6=0x86dd

Extra Lib                : -lpopt -lssl -lcrypto 
Use IPVS Framework       : Yes
IPVS sync daemon support : Yes
IPVS use libnl           : No
Use VRRP Framework       : Yes
Use Debug flags          : No

             編譯 make
             安裝編譯 make install

             以上安裝完成後, 我沒去多花時間設定init.d等開機啟動設定, 因為應該先搞定設定檔, 等能正常運作再說 ...             
          

    設定 Keepalived         
        這是重頭戲 !! 預設的keepalived.conf存放於 /etc/keepalived 目錄中




        先看 Centos 1 的 keepalived.conf(預設角色Master) 
             

! Configuration File for keepalived

global_defs {
   notification_email {
     youremail@abc.com.tw
   }
   notification_email_from youremail@abc.com.tw
   smtp_server  smtp.server.com.tw
   smtp_connect_timeout 30
   router_id Centos1  #這個是可以改的 建議和Hostname一致 收到信件時方便辨識
}

vrrp_instance VI_Redis {
    state MASTER
    interface eth0
    garp_master_delay 10
    smtp_alert
    virtual_router_id 10
    priority 101
    nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.10.6.200
    }
}


        再來看 Centos 2 的 keepalived.conf(預設角色Backup)

! Configuration File for keepalived

global_defs {
   notification_email {
     youremail@abc.com.tw
   }
   notification_email_from youremail@abc.com.tw
   smtp_server  smtp.server.com.tw
   smtp_connect_timeout 30
   router_id Centos2  #這個是可以改的 建議和Hostname一致 收到信件時方便辨識
}

vrrp_instance VI_Redis {
    state BACKUP
    interface eth0
    garp_master_delay 10
    smtp_alert
    virtual_router_id 10
    priority 100
    nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.10.6.200
    }
}

        有幾個重點, vrrp_instance名字必須相同, Master的priority必須比BACKUP的高...

         檔案配置好後, 即可開始啟動 Keepalived 進行測試 !

測試 Keepalived           


         因暫時沒其他的服務 可先用ping 測試 VIP  運作效果
         ping 10.10.6.200          
         然後 各自在Centos 1 與 Centos 2觀察 /var/log/messages
         tail -f /var/log/messages
         此時因為 Master 與 Backup 服務都還沒啟動  ping 應該會是失敗的
         先在 Centos 1 啟動 keepalived 
         因為有服務了 ping 將開始有正常回應 
         接著在 Centos 2 啟動 keepalived  
         ping 也該是正常回應 
         
         此時重點來了, 除了看messages的log, 誰知道Master是哪一台? 擁有VIP的? 使用ifconfig 是沒用的,看不到 VIP 的資料, 請改用 ip addr 的指令

[root@Centos2 redis]# ip addr
1: lo: mtu 16436 qdisc noqueue 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 08:00:27:ff:3f:20 brd ff:ff:ff:ff:ff:ff
    inet 10.10.6.159/24 brd 10.10.6.255 scope global eth0
    inet 10.10.6.200/32 scope global eth0
    inet6 fe80::a00:27ff:feff:3f20/64 scope link 
       valid_lft forever preferred_lft forever
3: sit0: mtu 1480 qdisc noop 
    link/sit 0.0.0.0 brd 0.0.0.0

         哪台Server有多上面標示藍色的那一行, 就表示是在Master狀態 ....

         但是運氣背時會發現兩台統統都處於Master狀態, 恭喜你, 我也遇到了! 這問題花了我不少時間找答案, 解法卻很簡單... 

         請試著關閉Centos的預設Firewall. 運作就會正常了, 因為Master/Backup無法互相溝通, 所以Backup Server 也自己宣佈接手成為Master !!  ( 有誰願意幫忙找找Keepalived是用哪個Port來互相溝通的 ? )
         
         進一步測試可用下方指令把Master或Backup Server的 keepalived 程序砍掉
         killall keepalived 
         再使用ip addr來確認 Master是由哪台Server負責?
         是否整個切換運作順暢?
         ping VIP是否能持續正常服務?

         若以上的測試能如預期的正常運作, 後續的就簡單多了 !



進階配置 Keepalived


客製化的檢查方法


             剛剛的Master/Backup的切換是透過檢查Keepalived程序是否存活來做判斷, 但這不是我要的, 也不會是大多的人需要的. 所以要改變Keepalived的檢查程序, 讓它改成監控我們指定的程序或服務, 依照指定的程序或服務的健康狀況, 來作Master/Backup的切換!

             先看以下的shell script, 這是監控Redis獨有的, 但程序很簡單. 有需要的可以自己改寫成監控其他系統的程式.

[root@Centos1 redis]# more redis_check.sh 
#!/bin/sh
alive=`/usr/local/redis/redis-cli PING`
if [ "$alive" == "PONG" ]; then
  echo "OK"
  exit 0
fi
  #echo "$alive"
  echo "NG"
  exit 1

             正常的 redis Server會對PING的指令, 回覆PONG的文字, 就像字義的乒乓球一樣. 可用來判斷伺服器是否運作正常. 當運作正常時, 整個檢查程序執行後的回覆碼應該為0 . 異常時則回覆非零值.

            當此檔案編輯完成, 有個容易疏忽的動作就是要chmod, 一定要設定!! 讓此shell script能正確被執行(包含權限), 後續提到的shell script請也一併要做好設定!

            所以 更新後的 Centos 1 的 keepalived.conf(預設角色Master) 為


[root@CentosVBox1 redis]# more /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
     youremail@abc.com.tw
   }
   notification_email_from youremail@abc.com.tw
   smtp_server  smtp.server.com.tw
   smtp_connect_timeout 30
   router_id Centos1  #這個是可以改的 建議和Hostname一致 收到信件時方便辨識
}

vrrp_script chk_redis {
    script "/etc/keepalived/redis/redis_check.sh"
    interval 1 
}

vrrp_instance VI_Redis {
    state MASTER
    interface eth0
    garp_master_delay 10
    smtp_alert
    virtual_router_id 10
    priority 101
    nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.10.6.200
    }
    track_script {
        chk_redis 
    }
    notify_master /etc/keepalived/redis/master.sh
    notify_backup /etc/keepalived/redis/backup.sh
    notify_fault  /etc/keepalived/redis/fault.sh
    #notify
    notify_stop   /etc/keepalived/redis/stop.sh
}


            新加了 vrrp_script 區塊, 並透過 track_script 指定運行. ( 紅色區塊有關notify等 後續會解說 )

            在這邊提醒一點, 據網路上的說法 track_script 後面要加一個空白才能接著 "{" , 否則檢查程序會有運作不正常的狀態. 有空的朋友可以自己試試..

            有些文章會在 vrrp_script 區塊中加入weight, 但我試了很多次, 都沒成功切換. 後來看了這篇文章, 才試著去除weight, 採行強迫Keepalived只要檢查出錯誤就立即切換的方法. 不必再花力氣解開weight與priority間的數學問題!

            再來也一併更新 Centos 2 的 keepalived.conf(預設Backup) 

! Configuration File for keepalived

global_defs {
   notification_email {
     youremail@abc.com.tw
   }
   notification_email_from youremail@abc.com.tw
   smtp_server  smtp.server.com.tw
   smtp_connect_timeout 30
   router_id Centos2  #這個是可以改的 建議和Hostname一致 收到信件時方便辨識
}

vrrp_script chk_redis {
    script "/etc/keepalived/redis/redis_check.sh"
    interval 1 
}

vrrp_instance VI_Redis {
    state BACKUP
    debug
    interface eth0
    garp_master_delay 10
    smtp_alert
    virtual_router_id 10
    priority 100
    nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.10.6.200
    }
    track_script {
        chk_redis 
    }
    notify_master /etc/keepalived/redis/master.sh
    notify_backup /etc/keepalived/redis/backup.sh
    notify_fault  /etc/keepalived/redis/fault.sh
    #notify
    notify_stop   /etc/keepalived/redis/stop.sh

}

redis的配置


         本文重點不是擺在redis的一般配置, 所以細節就不多說. 只專注於redis的 Master/Slave設定部份.

         Centos 1 的 redis.conf(預設角色Master) 

################################# REPLICATION #################################

# Master-Slave replication. Use slaveof to make a Redis instance a copy of
# another Redis server. Note that the configuration is local to the slave
# so for example it is possible to configure the slave to save the DB with a
# different interval, or to listen to another port, and so on.
#
# slaveof


         Centos 2 的 redis.conf(預設角色Backup/Slave) 

################################# REPLICATION #################################

# Master-Slave replication. Use slaveof to make a Redis instance a copy of
# another Redis server. Note that the configuration is local to the slave
# so for example it is possible to configure the slave to save the DB with a
# different interval, or to listen to another port, and so on.
#
# slaveof
slaveof 10.10.6.156 6379


初步測試redis與Keepalived 合體


         這次因為加入了監控redis的script 所以一定要先啟動redis
         依照往例在各系統還沒啟動前,先用redis-cli 測試 Redis VIP  運作效果, 執行下述指令 
         redis-cli  -h 10.10.6.200 info
         這時自然該得到連線失敗的訊息.
         先在 Centos 1 啟動 redis , 然後是 Centos 2 的 redis, 在後來是Centos 1的Keepalived 
         因為Keepalived啟動了, VIP開始運作,  redis-cli 將開始有正常回應 
         接著在 Centos 2 啟動 keepalived, redis-cli  也該是正常回應 

         此時兩套redis與Keepalived應該都是在運作正常的狀態, redis-cli  -h 10.10.6.200 info 看到的內容應該是 Centos1作為Master負責回應, 上面的redis Server也是Master 所以可以看到類似下面的回應.


role:master

slave0:10.10.6.159,57424,online


         若把Centos1 的 redis-server 停掉, 將導致 keepalived檢查發現異常, 進一步使得Centos1失去Master地位, Centos1的狀態將退至Fault, 在此同時 Centos2會由Backup地位扶正為Master!
         此時redis-cli  -h 10.10.6.200 info 看到的內容應該是 Centos2作為Master負責回應, 但運行的redis Server此仍是Slave 所以可以看到類似下面的回應.


role:slave

master_host:10.10.6.156

master_port:6379

master_link_status:down

master_last_io_seconds_ago:-1

master_sync_in_progress:0
master_link_down_since_seconds:17

         雖說測試到現在的階段, 這樣的運作結果對Keepalived是正確的. 但對redis來說卻還差一點.因為這個版本redis的Master與Slave只有單向複製的關係. 也就是redis Server的Master收到新資料時會把新資料的更新內容傳送給Slave一併更新, 可是換成Slave收到新資料時卻無法傳送給Master. 將會導致資料的不一致性! 也就是說為了資料的一致性, Slave最好只做ReadOnly的角色或當成備用機. 

         所以恰當的配置是當某一Server被Keepalived指定為Master時, VIP會由此Server負責,此台的redis Server應當要切換為Master, 同時另一Backup身份的Server則該設定為redis的Slave, 做好接收異動抄寫的任務, 隨時 Standby. 

進一步調整讓redis的Master/Slave配合Keepalived的Master/Backup切換

        在上面的keepalived.conf設定中有個紅色區塊的內容就是運作關鍵, 因為Keepalived在轉換狀態時會依照狀態來呼叫. 

        當進入Master狀態時會呼叫notify_master
        當進入Backup狀態時會呼叫notify_backup
        當發現異常時進入FAULT狀態時將呼叫notify_fault
        當Keepalived程式終止時則呼叫notify_stop

    notify_master /etc/keepalived/redis/master.sh
    notify_backup /etc/keepalived/redis/backup.sh
    notify_fault  /etc/keepalived/redis/fault.sh
    notify_stop   /etc/keepalived/redis/stop.sh

        我們先來看 Centos 1 的 master.sh 


[root@Centos1 redis]# more master.sh 

#!/bin/sh

KLOG=/var/log/keepalived-state.log

RLOG=/var/log/redis-state.log

echo "[master]" >> $KLOG

date >> $KLOG
echo "----------" >> $KLOG

echo "[master]" >> $RLOG
date >> $RLOG
echo "being master...." >> $RLOG 2>&1
echo " run slaveof cmd ..." >> $RLOG
echo SLAVEOF 10.10.6.159 6379 | /usr/local/redis/redis-cli >>$RLOG  2>&1
sleep 1
echo " run sync cmd ..." >> $RLOG
echo SYNC | /usr/local/redis/redis-cli >>$RLOG 2>&1
sleep 1
echo " run slaveof no one cmd ..." >> $RLOG
echo SLAVEOF NO ONE | /usr/local/redis/redis-cli >>$RLOG 2>&1

        整體概念先是假設從Slave模式轉換到Master時, 先要指定為Slave, 把資料抄回來, 再回復為Master.

        再來是 Centos 1 的 backup.sh 


[root@Centos1 redis]# more backup.sh 

#!/bin/sh

KLOG=/var/log/keepalived-state.log

RLOG=/var/log/redis-state.log

echo "[backup]" >> $KLOG

date >> $KLOG
echo "----------" >> $KLOG

echo "[backup]" >> $RLOG
date >> $RLOG
echo "being slave...." >> $RLOG 2>&1
echo " run slaveof cmd ..." >> $RLOG
echo SLAVEOF 10.10.6.159 6379 | /usr/local/redis/redis-cli >>$RLOG  2>&1
echo " run sync cmd ..." >> $RLOG
echo SYNC | /usr/local/redis/redis-cli >> $RLOG 2>&1 

        大致內容是直接設定為Slave模式並要求資料抄寫


        再來看 Centos 2 的 master.sh  


[root@Centos2 redis]# more master.sh 

#!/bin/sh

KLOG=/var/log/keepalived-state.log

RLOG=/var/log/redis-state.log

echo "[master]" >> $KLOG

date >> $KLOG
echo "----------" >> $KLOG

echo "[master]" >> $RLOG
date >> $RLOG
echo "being master...." >> $RLOG 2>&1
echo " run slaveof cmd ..." >> $RLOG
echo SLAVEOF 10.10.6.156 6379 | /usr/local/redis/redis-cli >>$RLOG  2>&1
sleep 1
echo " run sync cmd ..." >> $RLOG
echo SYNC | /usr/local/redis/redis-cli >>$RLOG 2>&1
sleep 1
echo " run slaveof no one cmd ..." >> $RLOG
echo SLAVEOF NO ONE | /usr/local/redis/redis-cli >>$RLOG 2>&1

        再來是 Centos 2 的 backup.sh 


[root@Centos2 redis]# more backup.sh 

#!/bin/sh

KLOG=/var/log/keepalived-state.log

RLOG=/var/log/redis-state.log

echo "[backup]" >> $KLOG

date >> $KLOG
echo "----------" >> $KLOG

echo "[backup]" >> $RLOG
date >> $RLOG
sleep 10
echo "being slave...." >> $RLOG 2>&1
echo " run slaveof cmd ..." >> $RLOG
echo SLAVEOF 10.10.6.156 6379 | /usr/local/redis/redis-cli >>$RLOG  2>&1
echo " run sync cmd ..." >> $RLOG
echo SYNC | /usr/local/redis/redis-cli >> $RLOG 2>&1 

        Centos2的master.sh與backup.sh類同Centos1, 但只是方向相反!

        最後是 fault.sh 與 stop.sh, 因為只單純做log紀錄 所以兩台Server的script都是一樣的.

[root@Centos1 redis]# more fault.sh 
#!/bin/sh

KLOG=/var/log/keepalived-state.log
echo "[fault]" >> $KLOG
date >> $KLOG
echo "----------" >> $KLOG


[root@CentosV1 redis]# more stop.sh 
#!/bin/sh

KLOG=/var/log/keepalived-state.log
echo "[stop]" >> $KLOG
date >> $KLOG
echo "----------" >> $KLOG

         

最終測試redis與Keepalived 合體


         依照往例在各系統還沒啟動前,先用redis-cli 測試 Redis VIP 運作效果, 執行下述指令 
         redis-cli  -h 10.10.6.200 info
         這時自然該得到連線失敗的訊息.
         先在 Centos 1 啟動 redis , 然後是 Centos 2 的 redis, 在後來是Centos 1的Keepalived 
         因為Keepalived啟動了, VIP開始運作,  redis-cli 將開始有正常回應 
         接著在 Centos 2 啟動 keepalived, redis-cli  也該是正常回應 

         此時兩套redis與Keepalived應該都是在運作正常的狀態, redis-cli  -h 10.10.6.200 info 看到的內容應該是 Centos1作為Master負責回應, 上面的redis Server也是Master 所以可以看到類似下面的回應.


role:master
slave0:10.10.6.159,41920,online



此時試著存取redis


patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.200 set "hello" "abc"
OK


patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.200 get "hello"
"abc"


patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.156 get "hello"  
"abc"


patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.159 get "hello"
"abc"



         不論是VIP (10.10.6.200), Centos1 (10.10.6.156) 還是 Centos2 (10.10.6.159)都完整取得新資料了. 也就是透過VIP存取, 兩台Server間都正確的複製內容資訊!

把Centos1的redis弄掛試試看

patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.200 debug segfault
I/O error while reading from socket: Success


patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.200 info
redis_version:2.4.15
.... (刪除過多無用資訊, 只節錄重點 )
role:master

patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.156 info
Could not connect to Redis at 10.10.6.156:6379: connect: Connection refused

patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.159 info
redis_version:2.4.15
.... (刪除過多無用資訊, 只節錄重點 )
role:master

patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.200 set "hello" "efg"
OK

patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.200 get "hello" 
"efg"

         可以看到即使是Centos1掛了!若透過VIP來存取, 還是可以維持正常運作, 這就是我們希望Keepalived達成的Failover效果!(中間檢測與切換可能有一兩秒的延遲), 透過指令可看到Centos1已經無法回應,Keepalived, 此時Centos2除了在Keepalived中取得Master地位, 也一併在redis中取得了Master的身份!!

假設經過一段時間Centos1的redis救回,能正常運作了,那會如何?

         於重啟動Centos1的redis 服務後

patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.200 info
redis_version:2.4.15
.... (刪除過多無用資訊, 只節錄重點 )
role:master
slave0:10.10.6.156,48910,online

patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.156 info
redis_version:2.4.15
.... (刪除過多無用資訊, 只節錄重點 )
role:slave
master_host:10.10.6.159
master_port:6379
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0

patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.159 info
redis_version:2.4.15
.... (刪除過多無用資訊, 只節錄重點 )
role:master
slave0:10.10.6.156,48910,online

patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.200 get "hello" 
"efg"
patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.156 get "hello" 
"efg"
patrick@PatrickLinux:/redis$ ./redis-cli  -h 10.10.6.159 get "hello" 
"efg"

         可以看到即使是Centos1的redis已回復正常運作但Keepalived仍視為Backup身份, 並不會立即把Master身份搶回來, 同時Centos1上的redis也被設定為是Cenots2的Slave
         就資料更新方面, 剛剛在Centos1故障期間設定的"hello","efg" 資訊, 也在Centos1正常運作後無誤的同步過來了!


         透過Centos1的/var/log/keepalived-state.log可以看到整個狀態轉換的完整過程

[master]
Wed Jun 27 18:29:08 CST 2012
----------
[fault]
Wed Jun 27 18:35:43 CST 2012
----------
[backup]
Wed Jun 27 18:44:11 CST 2012
----------

         再看看Centos2的/var/log/keepalived-state.log


[backup]

Wed Jun 27 18:29:11 CST 2012

----------

[master]

Wed Jun 27 18:35:47 CST 2012

----------

         到此算是完成了. 雖然還有很多不完美的地方, 但至少運作還算如預期 !

         有興趣的朋友請告知後再轉載, 但一定要註明出處. 當發現錯誤或有建議請留言或發信告知, 謝謝 !!

----------------------------------------------------------------------------------------------------------------

2012/7/20補充

         Keepalived 2012/7/13推出新版了, 新的版本為1.2.3, 但此版本不能在Centos5或Kernel版本低於2.6.29的系統下完成make編譯!! 會出現以下錯誤訊息 ....


vrrp_vmac.c: In function ‘netlink_link_setmode’:
vrrp_vmac.c:85: error: ‘IFLA_LINKINFO’ undeclared (first use in this function)
vrrp_vmac.c:85: error: (Each undeclared identifier is reported only once
vrrp_vmac.c:85: error: for each function it appears in.)
vrrp_vmac.c:86: error: ‘IFLA_INFO_KIND’ undeclared (first use in this function)
vrrp_vmac.c:90: error: ‘IFLA_INFO_DATA’ undeclared (first use in this function)
vrrp_vmac.c:96: error: ‘IFLA_MACVLAN_MODE’ undeclared (first use in this function)
vrrp_vmac.c:97: error: ‘MACVLAN_MODE_PRIVATE’ undeclared (first use in this function)
vrrp_vmac.c: In function ‘netlink_link_add_vmac’:
vrrp_vmac.c:160: error: ‘IFLA_LINKINFO’ undeclared (first use in this function)
vrrp_vmac.c:161: error: ‘IFLA_INFO_KIND’ undeclared (first use in this function)
make[2]: *** [vrrp_vmac.o] Error 1

         看來keepalived 1.2.3版只能安裝在Centos6.x上了 !! 

----------------------------------------------------------------------------------------------------------------

2012/7/24補充

         Keepalived 版本為1.2.3, 於Centos6.3, Kernel版本2.6.32-279下make編譯!! 仍會出現以下錯誤訊息 ....


make[2]: Entering directory `/root/keepalived-1.2.3/keepalived/libipvs-2.6'
gcc -g -O2  -I/usr/src/kernels/2.6.32-279.2.1.el6.x86_64/include -DLIBIPVS_DONTUSE_NL -Wall -Wunused -c -o libipvs.o libipvs.c
libipvs.c:882: error: expected ‘)’ before ‘fwmark’
libipvs.c: In function ‘ipvs_strerror’:
libipvs.c:1099: error: ‘ipvs_get_service’ undeclared (first use in this function)
libipvs.c:1099: error: (Each undeclared identifier is reported only once
libipvs.c:1099: error: for each function it appears in.)
make[2]: *** [libipvs.o] Error 1
make[2]: Leaving directory `/root/keepalived-1.2.3/keepalived/libipvs-2.6'

    目前試到一個解決編譯的方法就是去修改 keepalived/libipvs-2.6/ip_vs.h


#include
#include
#include   /* <--- 新增此行 Add this line  */
#include
#include

    修改完即可通過編譯 !




2009年9月13日 星期日

嘟的新任務 福木種子栽培

2009年9月12日

今天是週六, 上午和嘟與老婆去社區騎腳踏車, 9點多了天氣頗熱, 到了一個有林蔭的地方, 就先休息一下.

旁邊剛好有種福木, 其中一顆結實累累. 掛滿了綠色與黃色的果實, 地上也有很多. 就地取材就和嘟玩起了果實. 當足球用踢的, 當棒球用丟的. 好玩就好. 嘟很高興能玩丟球的遊戲!

又丟又踢的, 果實耐不柱了, 外皮, 果肉, 種子全分離了. 先前在網路上看過, 有人拿福木種子來種. 呵呵, 剛好, 踢破的種子留下來還可種看看!

它的種子是褐色的, 果肉有點榴槤味或者瓦斯味的特殊味道, 汁液很粘( 要小心, 網路上說這汁液有毒 ) .

很快的, 原先掉到地上的陸續被踢爛了, 沒果實了, 於是我就試著去搖搖樹, 看看有沒有成熟的會掉下來. 嘟也來幫忙, 又搖了一些下來. (要小心, 會被掉落的果實打到頭) , 嘟還分了一些果實給一個小朋友玩.

再玩了一陣子後, 嘟也累了, 流汗多到上衣都濕了. 收拾好種子, 回家囉.

趁洗澡時把種子洗乾淨, 泡在水裡, 等發芽, 但是得每天換水, 避免腐爛. 於是每天換水的工作變成的嘟的新任務囉!


福木長的很慢, 很耐旱, 不會掉很多葉子, 蠻適合當室內觀賞植物! 不過長的真的很慢, 種子順利的話得要45-60天才會發芽, 聽說用盆栽養長半年才6-8片葉子...

這麼久, 嘟這小子會有耐性嗎? 試試看囉...

真有蟲緣.. 邂逅大麗

2009年9月10日

早上去買了一些甲蟲的木屑果凍等消耗品. 剛好今天老婆有任務, 到林口的竹林山觀音寺附近家長的家裡訪談. 回程順道去寺裡借了廁所, 原本沒計畫要拜拜的, 既然來到這邊, 就去上柱香囉!

在停車場停好車子, 要經過小公園才能到觀音寺. 嘿, 在公園的樹下竟然發現了一隻甲蟲, 背部非常光亮, 是隻母的鬼艷鍬形蟲.


最近還真有甲蟲的緣分呀! 已經是第四隻囉! 剛好都是湊成對! 但更驚訝的是老婆也認得這是鬼艷喔! 看來我教她們認識與分辨扁鍬與鬼艷的區別時, 都聽懂了!

按照慣例, 先請一頓水果餐吧. 牠比較好命, 今天剛進貨香蕉口味的果凍, 看牠吃的多開心呀!

嘟幫牠取名了, 叫做"大麗", 沒太多創意, 但他很堅持.

至於何時要讓大麗與巧克力洞房呢? 改天吧, 先讓大麗養養身體, 不過野外的雌蟲多半都已交配過了, 是否可以如願成功洞房, 看運氣囉!

查過網路資料了, 真糟糕, 鬼艷超會生但幼蟲三齡後不好養耶, 稍受打擾就無法羽化, 牠產卵與幼蟲的習性和獨角仙比較接近, 牠喜歡的不是木屑, 而是腐植土, 那我的材料還得要再買嗎? 還要擴建宿舍嗎?

嗯.....  我這收不到房租的包租公覺得很猶豫!

育嬰中心改建宿舍(2)

2009年9月4日

一開始買的是20個杯子, 只改建9杯宿舍. 當然不夠囉.  還有一個養殖箱, 裡面還有. 還有多少隻就不知道了. 開始行動!



先把原先裝飾用的木頭移開. 開始慢慢挖掘. 哇咧, 這下子糟糕了, 一個小小的養殖箱竟然挖出了26隻幼蟲還一顆未孵化的卵....



有大有小, A的那隻應該已經進入2齡了, B的應該還是一齡蟲, A與B兩隻很明顯的不一樣! C則很害羞, 拍照時急忙躲到木屑下方去了只留下屁股見人.



此外還發現一顆卵, 以時間推算應該不會孵化了, 母蟲沒放在這養殖箱是很久前了, 時間應該超過3週了. 會孵化的早該孵化了. 算是有點遺珠之憾吧!

可是還有一個放產木的產房... 我越來越沒勇氣去挖了...

光是這一批就有35隻幼蟲成功孵化, 這這會不會太多了一點啊! 趕快再去補貨啊, 買杯子, 買木屑 ....

趁著週末, 還找嘟一起幫忙, 他來幫忙在每個杯蓋上貼上透氣膠帶.我則是把紙箱子挖洞來透氣, 並利用紙板來製作筒狀樑柱, 透過樑柱的支撐, 一個紙箱就可放兩層!



PS : 幼蟲的呼吸量不大, 不用擔心, 若還怕悶死幼蟲, 貼完膠帶後再拿細針戳幾個洞就可以了 , 封住的吸管洞, 則可以透氣, 但濕氣不會大量流失! 也可以減少螞蟻飛蟲的進入.

這是一樓的樣子, 還有幾根筒狀的樑柱, 再放上一片瓦愣紙就可以再放一層囉 !




這是二樓的樣子, 一層樓放10個杯子宿舍剛剛好!



這是A棟宿舍外觀圖! 感謝xxx大賣場贊助此(紙箱)宿舍! 也剛好上面的字是提醒說這是溫度敏感類的商品. 也是啦. 有錢的蟲友還蓋專屬冷氣房, 24HR控溫給甲蟲住. 抱歉囉. 待遇不好別見怪, 簡陋的宿舍就將就點吧!



老婆還因此笑我, 說我升格了, 當了現成的包租公..

2009年9月12日 星期六

育嬰中心改建宿舍(1)


2009年9月4日
看到論壇上很多人說幼蟲應該分開養比較好, 或者容器的底面積至少要給一個拳頭大的空間. 看來我的育嬰中心是太小了些, 有些幼蟲還大幅擴展領域到其他幼蟲的範圍去了. 是該整理育嬰中心的時候了.
陸續準備了很久, 包含木屑的購買與塑膠杯的採購. 最後採購的塑膠杯是360cc的透明飲料杯, 蓋子上還有用來插吸管的孔. 那就先買二十個杯子吧,
先把木屑加水弄濕, 要到多濕呢? 約略是用手掌抓一把可以捏成塊不會立即散開, 但用力擠不會擠出水的程度(我先前調製是比較濕一些有點滴幾滴水也沒關係). 把木屑先裝半杯, 用手指或其他工具壓緊, 然後再裝一些再壓緊. 若整杯裝滿鬆木屑再壓會比較不好施力, 反而比較慢. 做好後放著備用, 等一下幼蟲挖出來後, 就可以立即放入杯中了. 此外因為要混合濕木屑, 填裝, 壓縮. 通常地上與手都會弄得髒髒亂亂的, 我有準備一個水桶混合木屑, 另外用一個藍色托盤當桌面, 減少掉木屑到地上的量. 這樣比較乾淨些省事些.
前置作業搞定後, 該拿出育嬰中心啦, 在這育嬰中心裡放了九顆卵. 運氣好的話可以全部孵化成幼蟲. 都是小麗的心血喔. 小心將一部分一部分的逐區塊倒出來, 幼蟲很脆弱, 得小心些, 用一個塑膠湯匙, 一塊塊的土塊慢慢刮開檢查. 嘿發現囉! 有較大的也有較小的喔, 看看圖片吧! 挖出來的先用杯子的塑膠蓋裝著, 還有一件事很重要, 挖到幼蟲時, 記的把那時幼蟲週遭的木屑, 和幼蟲一起保留起來, 這樣一同移到新的木屑杯中時, 牠才有機會逐漸適應. 而非大幅改變. 這個小動作應該有助於提高存活率.
嘿嘿, 運氣真的很好( 或說是小麗的努力 ). 育嬰中心9顆卵全部孵化! 恭喜恭喜, 全部一起照個像吧!
下一個步驟就是裝入杯子囉, 為了讓幼蟲省力些, 我在壓緊木屑的杯子中間, 用筷子戳了一個洞, 還加入一些育嬰中心舊的木屑(顏色較深的). 讓牠們有更好的適應性. 然後把幼蟲放入中間的洞中. 上面在覆蓋原先留下的舊木屑. 再把吸管洞上的塑膠片拔掉, 貼上透氣膠布, 蓋上蓋子, 完成囉! 一間嶄新的宿舍完成囉!
好囉新建的九間宿舍完工. 只剩貼透氣膠步的步驟了. 來個合照吧!