:::

修復Proxmox VE:增加第二顆硬碟到LVM / Fix Proxmox VE: Add Another Disk to LVM

布丁布丁吃布丁

修復Proxmox VE:增加第二顆硬碟到LVM / Fix Proxmox VE: Add Another Disk to LVM

pablo

之前我寫過「Proxmox VE增加第二顆硬碟」的做法,是用額外掛載的方式來新增一個新的Storage。這次我要做的是比較完整的做法:將新增加硬碟加入LVM中。操作步驟主要參考Jarrod的LVM教學


操作環境 / Proxmox VE Environment

2015-06-21_222426

本文是以Proxmox VE 3.4為例子,以VirtualBox來架設。重點是這個電腦有兩顆硬碟,Proxmox VE是安裝在第一顆硬碟中,第二顆硬碟是空的。

操作步驟 / Operation Process

Step 1. 登入 / Login

image

你可以用Proxmox VE的Web GUI中的Shell來登入,也可以直接登入本機端。總之要先以root的身份操作指令。

Step 2. 分割新的硬碟 / Partition the new disk

首先我們要確定新硬碟的路徑。一般來說,第一顆SATA硬碟為 /dev/sda 、第二顆為 /dev/sdb,而IDE的路徑則是 /dev/had 、第二顆則是 /dev/hdb。詳情請看鳥哥的說明

因為我安裝的是第二顆的SATA硬碟,所以路徑為 /dev/sdb。

硬碟的分割要使用fdisk,搭配第二顆硬碟的路徑/dev/sdb,指令如下:(粗體的地方表示是我們要輸入的指令)

root@pve:~#fdisk /dev/sdb

接下來會跳到fdisk的對話介面:

Command (m for help):

如果該硬碟裡面已經有資料,那就要用d指令來刪除。

Command (m for help): d

Selected partition 1

image

然後新增磁碟分割區,建立一個主要分割區,空間為整顆硬碟:

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-2610, default 1): "enter"
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): "enter"
Using default value 2610

image

然後將該分割區的檔案類型修改為Linux LVM:

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)

image

最後將分割表的資訊寫入硬碟:

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

image

完成。新增硬碟的磁碟分割位置為 /dev/sdb1。

Step 3. 增加邏輯捲軸 / Increasing the logical volume

接下來要連續輸入四個指令。注意裡面的磁碟分割路徑 /dev/sdb1,這是剛剛用fdisk新增的磁碟分割。

pvcreate /dev/sdb1
vgextend pve /dev/sdb1
lvextend /dev/pve/data /dev/sdb1
resize2fs /dev/pve/data

image

這樣就把第二顆硬碟新增到Proxmox VE的local空間中。

image

使用lvdisplay指令來看看結果,可以發現/dev/pve/data的空間已經新增到了12.37GiB。

這樣就大功告成囉!同樣的這種做法也可以用在第三顆、第四顆硬碟上面,繼續擴大local的硬碟空間。

將硬碟從LVM中移除 / Remove disk from LVM

既然我們可以新增硬碟到LVM,那一樣可以從LVM中移除硬碟。但是這個步驟就比新增還要複雜很多,細節可以參考鳥哥的縮小LV容量,如果那天我遇到這種情況了再來深入研究吧。


結語:使用LVM的風險 / Conclusion: The risk of LVM

現在Linux在安裝時預設都是以LVM的形式來分割磁碟,所以對大多數的人來說都感覺不到LVM的存在。LVM雖然能夠像上面這樣任意擴充一顆硬碟來增加空間,但是LVM是一種以任意調整容量為目的的檔案系統,安全性、可恢復性則不在考量範圍內。而且LVM預設是用線性模式在寫入資料,一顆硬碟滿了再放下一顆,存取方式無法與RAID相比。簡單來說:

  1. 當LVM裡面其中一顆硬碟毀損時,你得花很多功夫來調整LV,以移除壞掉的硬碟。
  2. 其他作業系統無法讀取以LVM管理的硬碟資料,也無法用Gparted之類的工具來調整硬碟分割。
  3. 結合以上兩點,如果LVM的作業系統毀損、無法開機。除非是用救援模式進入系統,不然不能用外接硬碟的方式讀取LVM的資料。

既然大部分Linux發佈版預設都用LVM,我們應該也無法擺脫LVM壞掉時的風險。因此在使用LVM時,一定要有壞掉之後很難復原的心理準備喔。

(more...)

修復Proxmox VE:第二次安裝時遭遇LVM的問題 / Fix Proxmox VE: Solve unable to create volume group while installing Proxmox VE

布丁布丁吃布丁

修復Proxmox VE:第二次安裝時遭遇LVM的問題 / Fix Proxmox VE: Solve unable to create volume group while installing Proxmox VE

pablo (1)

安裝Proxmox VE的時候,如果事前硬碟上已經有安裝好的Proxmox VE時,再次安裝就會發生「unable to create volume group at /usr/bin/proxinstall line 706」的問題。這個問題必須先移除硬碟上名為「pve」的LVM,然後就可以正常安裝了。


問題狀況 / Problem Description

image

有時候安裝Proxmox VE的時候會遇到「unable to create volume group at /usr/bin/proxinstall line 706」的錯誤訊息,然後安裝就無法繼續下去。

問題原因 / Casues of Problem

造成這個問題的原因是因為原本硬碟上面已經安裝過Proxmox VE。Proxmox VE在安裝時會建立一個名為「pve」的邏輯捲軸管理員LVM。而LVM不能有相同的名字,因此第二次安裝Proxmox VE時,就無法建立相同名字的「pve」,因此造成失敗。

解決方案 / Solution

我們需要一個可以開機的Linux版本Live CD來刪除LVM。

Step 1. 以Live CD開機 / Boot from Live CD

image

我原本是使用Ubuntu 14.04桌面版,但是那個太大了,速度也很慢。我試了幾個Live CD的版本,太小的Live CD並不具備LVM的工具,找到最後是Ubuntu Rescue Remix 12.04版本,ISO大小為233MB,啟動速度很快。

image

將這個ISO燒錄成光碟之後,或是像我這樣用VirtualBox掛載ubuntu-rescue-remix-12-04.iso之後,我們就可以開機進入Live CD。

Step 2. 刪除Volume Group / Remove Volume Group

image

一路enter到最後會是這個畫面。請輸入指令:

sudo vgremove pve –-removemissing

接下來會一一確認是否要刪除Volume Group裡面的Logical volume,總共有swap、root跟data。請一律按「y」確定。

image

接下來確認是否有刪除這個Volume Group。

vgdisplay

如果沒有看到pve,那Volume Group「pve」就刪除完成了。

Step 3. 關機 / Shutdown

image

完成之後輸入關機指令:

sudo halt

在看到「Please remove installation media and close the tray (if any) then press ENTER:」的訊息時,取出光碟,然後按下Enter鍵繼續關機。

Step 4. 重新安裝Proxmox VE / Install Proxmox VE again

2015-06-21_210909

再來重新安裝Proxmox VE的時候就可以順利成功了。

(more...)

Proxmox VE以vmdk作為虛擬機器的硬碟 / Use vmdk format as Virtual Machine's disk in Proxmox VE

布丁布丁吃布丁

Proxmox VE以vmdk作為虛擬機器的硬碟 / Use vmdk format as Virtual Machine's disk in Proxmox VE

pablo

Proxmox VE預設採用qcow2作為虛擬機器的硬碟格式,如果要改用vmdk格式的話,建立虛擬機器時就要調整cache的設定為「Write through」才能讓虛擬機器正常開啟。


用vmdk跑虛擬機器比較好 / It is better to run a Virtual  Machine based on vmdk image disk format

經過多台虛擬機器的架設,我發現以vmdk作為硬碟影像檔格式架設的虛擬機器總是有較好的執行效率與壓縮率,不論是VirtualBox還是Proxmox VE都是如此。

而且qcow2預設不開啟動態配置模式,因此創建影像檔時,檔案大小就會是設定的硬碟大小。例如我建立一顆80GB的硬碟,即使尚未安裝任何作業系統,qcow2硬碟影像檔依然會佔實體硬碟80GB的空間。相較之下,vmdk或是設定了動態配置的vdi格式,一開始的檔案大小通常不會超過10MB,開始安裝作業系統、增加檔案之後,影像檔才會逐漸變大。

image

再考量到現在很多可以直接掛載vmdk的工具,例如WinMount (也可以掛載vdi,但這是一個付費軟體),這樣子要從備份資料中取回需要的資料也很方便。

總而言之,VMware不愧是虛擬技術界的龍頭老大,他們家的vmdk的確是比較好。

Proxmox VE無法開啟vmdk格式虛擬機器的問題 / The error message while start virtual machine based on vmdk

image

我們可以用預設值建立好虛擬機器,而虛擬機器的硬碟是用vmdk格式。但是這時候開啟虛擬機器時,卻會發生類似以下錯誤訊息:

「TASK ERROR: start failed: command '/usr/bin/kvm -id 106 -chardev 'socket,id=qmp,path=/var/run/qemu-server/106.qmp,server,nowait' -mon 'chardev=qmp,mode=control' -vnc unix:/var/run/qemu-server/106.vnc,x509,password -pidfile /var/run/qemu-server/106.pid -daemonize -smbios 'type=1,uuid=eece4916-f5e4-49de-a043-d2e77af96a53' -name test-vmdk -smp '1,sockets=1,cores=1,maxcpus=1' -nodefaults -boot 'menu=on,strict=on,reboot-timeout=1000' -vga cirrus -cpu qemu64 -m 512 -k en-us -cpuunits 1000 -device 'piix3-usb-uhci,id=uhci,bus=pci.0,addr=0x1.0x2' -device 'usb-tablet,id=tablet,bus=uhci.0,port=1' -device 'virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3' -iscsi 'initiator-name=iqn.1993-08.org.debian:01:0a39bcb174' -drive 'if=none,id=drive-ide2,media=cdrom,aio=native' -device 'ide-cd,bus=ide.1,unit=0,drive=drive-ide2,id=ide2,bootindex=200' -drive 'file=/var/lib/vz/images/106/vm-106-disk-1.vmdk,if=none,id=drive-ide0,format=vmdk,aio=native,cache=none,detect-zeroes=on' -device 'ide-hd,bus=ide.0,unit=0,drive=drive-ide0,id=ide0,bootindex=100' -netdev 'type=tap,id=net0,ifname=tap106i0,script=/var/lib/qemu-server/pve-bridge,downscript=/var/lib/qemu-server/pve-bridgedown' -device 'e1000,mac=FE:CE:E5:CC:F3:C4,netdev=net0,bus=pci.0,addr=0x12,id=net0,bootindex=300' -machine 'accel=tcg'' failed: exit code 1」

這是因為在KVM虛擬技術中,預設快取寫入硬碟的方式為「Default (No cache)」,但是vmdk必須使用「Write Through」設定,因此只要調整硬碟快取寫入方式就可以解決這個問題。

建立虛擬機器時調整硬碟設定 / The disk configuration while creating virtual machine

image

建立虛擬機器的時候,在設定硬碟的這一個步驟中可以找到快取寫入的設定。(註:Proxmox VE不同版本在這一部上有很大的不同,這是3.4的版本) 預設是使用「Default (No cache)」,請把他修改成「Write through」即可。

其實上面的Bus/Device改成VIRTIO的話,一般來說效能會更好,因為這是虛擬裝置原生的通道,而非模擬出來的IDE或SATA。

修改既有的虛擬機器 / Revise the disk disk configuration for existed Virtual Machine

image

如果是已經建立完成的虛擬機器,那也可以修改硬碟的相關設定。首先我們先開啟該虛擬機器的硬體頁面(hardware),找到vmdk的那一顆硬碟。

image

選擇該硬碟,按下編輯按鈕(edit)。

image

在這邊修改硬碟設定。讓我們把原本的「Default (No cache)」設定改成「Write through」,然後按下OK。

image

這樣子就能夠正常啟動vmdk囉。

如何在沒有CPU虛擬化技術支援下開啟KVM? / How to run KVM virtual machine without CPU Virtualization Technology?

image

我是在自己電腦上以VirtualBox架設Proxmox VE來測試。在這種情況下,一般來說是不能啟動KVM的。這時候得要在「Options」中關閉「KVM hardware virtualization」選項,然後就能順利開啟。當然,這種情況下只能測試用,不能運作實際的作業系統。

要如何將qcow2轉換成vmdk? / How to convert qcow2 format to vmdk?

image

如果我們虛擬機器已經是以qcow2架設了,那難道就沒辦法使用vmdk的好處嗎?

別擔心,我們可以用qemu-img convert指令可以讓你把qcow2格式轉換成vmdk格式。首先我們要先切換到映像檔所在的目錄,Proxmox VE存放在local的資料夾,路徑為:

/var/lib/vz/images/[VMID]/

如果虛擬機器的VMID為106,則路徑為:

/var/lib/vz/images/106/

qemu-img convert指令用法如下:

$qemu-img convert -f qcow2 –O vmdk vm-106-disk-2.qcow2 vm-106-disk-2.vmdk

  • vm-106-disk-2.qcow2:來源的檔案
  • vm-106-disk-2.vmdk:輸出的檔案
  • -O是大寫的o,不是0

image

硬碟越大,轉換所需要的時間越久。轉換完成之後,可以看到原始的qcow2大小為33GB,而轉換成vmdk之後只剩下4.1MB。這就是vmdk的優勢。

如果要運作虛擬機器的話,要記得在虛擬機器的硬體(hardware)中把硬碟改為轉換後的vmdk那一顆硬碟,並且設定快取寫入為「Write through」,就可以正常開啟囉。確認運作正常之後,原始的qcow2就可以刪除了。


結論:虛擬化技術的相容性 / Conclusion: The Compatibility of VMDK image format

Proxmox VE使用的KVM,以及VirtualBox這兩種虛擬化技術都有提供對vmdk的相容。因此我們不僅可以用Turnkey Linux提供的虛擬應用範本,也能夠在VMware的Virtual Application???找到其他的虛擬應用範本。就算是容器虛擬化技術OpenVZ,也能用一些比較複雜的步驟將虛擬機器轉換成vmdk來輸出(雖然是這樣想,但其實難度跟P2V一樣,並沒有真的如上面用qemu-img轉換來得容易)。如果沒有特別的考量的話,以vmdk架設傳統的虛擬機器應該是不二首選,不過這還是無法跟容器虛擬化的OpenVZ與Docker相比就是了。

(more...)

內容分析、文本分析、敘說分析的差異 / The Difference between Content Analysis, Textual Analysis and Discourse Analysis

布丁布丁吃布丁

內容分析、文本分析、敘說分析的差異 / The Difference between Content Analysis, Textual Analysis and Discourse Analysis

image

做訪談就是質性研究?做問卷就是量化研究?其實訪談跟問卷都是研究方法(Method),研究的類型應該是基於他們背後的哲學背景,也就是方法論(Methodoloy)。儘管都是文本型資料(註),但是根據研究目的的不同,研究的方式也有很大的差異。以下介紹內容分析、文本分析與敘說分析的差異,歡迎底下大家來討論。

註:電腦界喜歡稱之為「非結構性資料」(unstructured / textual data),也是現在巨量資料議題中主要研究的對象。


書目資料 / Bibliography

游美惠(2000)。內容分析、文本分析與論述分析在社會研究的運用。調查研究-方法與應用8。上網日期:2014年4月21日,檢自:http://www.airitilibrary.com/Publication/alDetailedMesh?docid=10281649-200008-201207230020-201207230020-5-42

關鍵字 / Keywords

  • 內容分析
  • 文本分析
  • 論述分析 (我的筆記中翻譯為敘說分析,又有人稱為言談分析)

摘要 / Abstract

image

(由於是中文論文,我想就沒必要擺上全部的摘要,僅摘錄第一段)

內容分析、文本分析輿論述分析這類的研究方法近年來越來越受到社會科學研究的重視,然而現今台灣的社會研究,對世這方面的討論與實際運用,明顯不足;但本文也並不打算全面地解說在社會研究中進行內容分析、文本分析輿論述分析的方法與步驟,筆者寫作本文的問意,其實是於欲強調現今的社會研究,在今日多元方法交叉撿證 ( triangulation) 的研究策略已漸受重視之際,除了主流的社會調查方法以及質化取向的訪談或民族誌田野工作之外,各種不同的研究方法與技術,其實都應納入基礎訓練之中,以便使研究者能善用研究工具與不同的方法取徑,並對蒐集得來的資料有更進一步的掌握與分析,以臻研究之精進。


筆記全文 / Note Fulltext

Content Analysis 內容分析

哲學背景:Positivism 實證主義,知識存在於文本本身,拒絕先備知識與思辨

內容分析特色:

  • 客觀性:在研究過程中,每一個步驟的進行都必須基於釐訂明確的規則和秩序;
  • 系統性:內容或領目的採用和捨棄,必須符合始終一致的法則;
  • 定量性:分析內容可按規則對擬訂之類目和分析單位加以計量,用數字比較符號文字出現的次數,以達到準確的要求

批評:

  • 內容分析難以反映研究對象的真實:當分析者企圖由先拆解文本,將文本視為可供測量的單位(字眼、表現、陳述等) ,從而建立文本的意義時,事實上便已經搗毀他們所要研究的客體(Jensen & J ankowski, 1996)
  • 將大量資料量化為概念(概念化)的過程容易受人質疑:因此需要特別描述編碼者(coder)與編碼表的製作過程
  • 量化分析結果不一定與情境配合,而無法產生合理且具說服力的解釋:因此不應只統計字數頻率,而忽略了情境脈絡(context)
  • 內容分析僅對明顯訊息加以分析,不去處理潛隱的內容

(布丁註:任何以編碼來描述特定族群對象的概括行為的研究,以及序列分析都是這個類型的研究方法)

Textual Analysis文本分析

哲學背景:Social Constructivism 社會建構主義,知識是由集體產生的

文本分析特色:

  • 拆解與關連文本分析是將一文學作品拆解,觀察其部份之間是如何拼湊相合在一起 (seeing how the parts fit together)
  • 搭配社會價值的詮釋則是將與某()知識傳統相連的價值(理論架構),如心理分析思想、符號學理論、馬克思思想、社會學和人類學理論或女性主義思想等,文本進行詮釋
    image
  • 文本分析反映歷史意識型態趨勢
  • 互為正文性 (intertextuality) :欲掌握社會的因素及其與文本的互動,或者說欲連結社會結構與文本結構。
  • 語境分析 [(con)textual analysis]:考量到上下文脈絡與社會情境脈絡,適切地詮釋文本的社會意涵,避免斷章取義。 例如電影與文化研究中,著重分析文化、政治、制度或機構方面對於電影的影響,也就是關心其中的文化生產過程。

批評:

  • 缺乏系統化的方法論與分析方式,較難為人信服:可透過Griswold (1994)的文化鑽石(the cultural diamond)來進行分析:
    image
  • 詮釋方式容易受研究者的意識型態而造成主觀的一面之詞

(布丁註:國際比較研究通常是這個類型)

Discourse Analysis 敘說分析

哲學背景:Social Constructionism 社會建構論,世界是由敘說所建立的

敘說分析的特色

  • 不限於文本本身,還要分析文本建構情境:避免單純檢視「文本本身」,而應該將具有建構作用論述的社會歷史都納入分析,讓分析立論更有根據,且能提供更多洞見(insights)。因此文本分析是敘說分析的一部分
  • 敘說文件不僅反映規範,也形塑規範:人類的行為是基於社會結構中產生,但反過來也建構了社會結構(Smart, 1997)
    • 拒絕因果性:但是需注意敘說分析容易將歷史與社會拆解成隨機與不確定性,拒斥歷史與社會的可理解性、因果的規律性、解釋性的機制(Best & Kellner, 1992)
  • 兼顧微觀與鉅觀的連結 (the micro-macro link):若能將文本與社會脈絡都廣泛且有系統地加以分析,便能深刻地掌握其社會意涵與運作機制,達到其他研究方法難以兼顧的成果
  • 著重敘說上的重現(權力架構、社會情境),而不像實證主義把文本作為管道或媒介

批評:

  • 與文本分析相同,許多研究都缺乏方法論的說明,只有分析結果,而主觀、直覺的詮釋分析常引來批評:
    • 應是基於可信的實證資料,之間的交叉驗證 (triangulated empirical materials that are trustworthy, Denzin, 1994)

(布丁註:個案分析屬於這一類型。)


內容分析、文本分析、敘說分析的比較 / Analysis of Content Analysis, Textual Analysis and Discourse Analysis

Content Analysis 內容分析 Textual Analysis 文本分析 Discourse Analysis 敘說分析
哲學背景 Positivism 實證主義 Social Constructivism 社會建構主義 Social Constructionism 社會建構論
特性
  • 量化分析
  • 拆解與關連
  • 搭配社會價值的詮釋
  • 互為正文性
  • 語境分析
  • 分析文本的建構情境
  • 敘說形塑規範
  • 拒絕因果論
  • 兼顧圍觀與鉅觀的連結
批評
  •  無法精確反映情境脈絡
  • 缺乏系統化的方法論
方法論上的問題與改進
  • 概念化不易:需規範編碼者與編碼表
  • 可搭配文化鑽石架構進行分析
  • 應基於可信實證資料的交互驗證
研究目的:探索 透過文本反映的知識表徵,來理解外部世界 以文本對某社會價值互為正文的關係,來補強某社會價值的世界 文本及其相關建構脈絡,及能建構世界
分析對象 文本拆解:字句、概念 文本與社會價值的關聯 文本與建構脈絡

布丁補充

適用資料 抽樣資料 反映社會價值的資料 獨特性資料
示意圖 image image image
可推論對象 (適用於大部分的外部世界) (適用於與社會價值上) (獨特無法推論)
推論適用時間 (世界時常改變,抽樣代表性逐漸下降) (社會價值存在就持續有用) (歷史地位上獨特地位)
題目舉例 發展社運中的參考服務 從社運中的參考服務反思政府公開資訊 太陽花學運中的參考服務
研究目的 探討在社運進行參考服務的重要性與實施方式 規劃先導性服務,以蒐集改進建議 探討政府公開資訊的定義 從社運中的參考問答對政府公開資訊進行反思 對於政府公開資訊重新定義 探討太陽花學運的來龍去脈 探討在太陽花學運中實施參考服務的緣由與進行方式 探討在太陽花學運中參考服務問答的來龍去脈
(more...)

Docker到底哪裡比OpenVZ好? / Why Docker is better than OpenVZ?

Docker到底哪裡比OpenVZ好? / Why Docker is better than OpenVZ?

image

要說近年來虛擬化的革命性技術,大家都會講說是Docker,但是OpenVZ卻被遺忘在歷史的洪流中。由於Proxmox VE的緣故,我很常使用OpenVZ容器虛擬化技術。到底Docker是哪裡比較好呢?以下就讓我姑且做個簡單的比較吧。


Docker的入門手冊 / Guide to Docker

同樣是使用Container容器虛擬化技術,每次看到Docker 的熱門程度大幅度超越OpenVZ的時候,作為OpenVZ愛用者的我總是百感交集。最近利用Google Book看了一下GitBook中的《Docker —— 從入門到實踐­》,赫然發現……Docker真的很厲害,竟然把我想要實作的功能都內建了!

image

Docker到底哪裡好? / Advantages of Docker

跟我很熟的人應該都常常在聽我講OpenVZ的優點,主要是全虛擬機器封裝、運作快速等等。Docker作為OpenVZ的後起之輩,同樣採用容器虛擬化技術,但是在運作效率、資料管理、網路管理與映像檔發布上又有更好的作法:

效率部分 / System Efficiency

OpenVZ跟Docker採同樣的技術,但Docker在運作APP(不是手機的APP)時,只會啟動相關的process,因此資源消耗更低。細節請看5.1. 啟動

資料管理 / Data Management

OpenVZ是完整封裝一個虛擬機器,但Docker則是將一個虛擬機器拆分成多個層次:映像檔(包含作業系統)、資料卷或資料卷容器(存放設定檔與運作資料)。因此可以架設多個虛擬機器,但是存取同樣的資料卷,以達到分散式運作的架構。細節請看7.2. 資料卷容器

從這篇建置MongoDB Docker虛擬機器的教學來看,甚至連文件型資料庫(大多數關聯式資料庫都是文件型)的資料庫檔案都可以掛載在資料卷上。這個意思是說可以取代資料庫的高可用架構HA了嗎?

我現在在OpenVZ上使用NFS掛載,並另外架設資料庫HA,但是操作順序比較複雜,不是很好用。

網路管理 / Network Management

Docker內建連接埠轉遞的功能,細節請看9.4. 端口映射實作。雖然後來Proxmox VE也把連接埠轉遞做到Firewall裡面,但操作上仍比較麻煩。

我現在是架設Zentyal路由器來控制連接埠轉遞。優點是可以加上Pound實作反向代理伺服器,這就是Docker無法匹敵的功能了。

映像檔發佈與保存庫(倉庫) / Publish Image & Repository

Docker採用git版本控制技術來發布影像檔,官方也有Docker Hub集中保存的倉庫,細節請看 6. 倉庫。相較之下,OpenVZ的虛擬應用範本只能在論壇中自行貼上連結,連上傳空間都要自己想辦法。就算一個OpenVZ的虛擬應用範本只要200MB左右,要找地方擺放也是個麻煩。更何況版本一修改就要重新打包上傳,非常麻煩啊!

Docker的其他資源 / Resource for Docker

Docker的網頁圖形化管理介面:Panamax / Web GUI Management Tool for Docker: Panamax

marketing_screen_03_big

以前我會嫌Docker都要用指令來操作,還是很不成熟。就算CoreOS多穩定,也不能解決管理上的問題。但是現在已經出現像是Panamax這樣子的網頁管理工具,可以免去學習指令操作的學習曲線。

在Windows上運作Docker:Boot2Docker / Run Docker in Windows: Boot2Docker

0Z13V137-2

就連Windows上也可以直接運作Docker了,運作一個Docker只要佔用27MB的記憶體,並且只需要5秒就能起動,詳細請看這篇Boot2Docker的說明,或直接到Boot2docker專案首頁下載。


結語 / Conclusion

因此越看越覺得Docker真是令人心動,是不是該來裝個Core OS搭配網頁管理介面Panamax來玩玩看Docker呢?

備註:這篇本來只是想在Facebook上隨便寫寫,可是想說心得文應該寫在Blogger中,所以改用Android上的Blogger APP撰寫草稿,沒想到越寫越長。草稿打完之後改到電腦上用Windows Live Writer來撰寫,加了大量的鏈結與圖片,就變成這一篇一千多字的心得隨筆。根據以上經驗所獲得的結論是:還是用Evernote來寫比較好,Blogger的APP並不是一個稱職的豐富文本(Rich-text)編輯器啊。

(more...)

行為編碼與序列分析 / Introduction of Behavior Coding and Sequential Analysis

行為編碼與序列分析 / Introduction of Behavior Coding and Sequential Analysis

image

這是我在今年六月時應台科大高老師的邀約,到她實驗室跟同學介紹數位學習中質性行為的編碼、編碼者一致性信度計算以及序列分析的原理。以下分享投影片與相關工具給大家使用。


什麼是序列分析? / What’s Sequential Analysis

image

序列分析,或說是行為序列分析(Behavior Sequential Analysis)是將研究對象的行為資料進行編碼,並以二項式檢定(bionomial distribution)計算編碼與編碼之間的轉換是否有達到顯著性的一種方法。

必須先聲明的是,本篇在講的是行為序列分析,跟統計的時間序列分析 (Time Series Forecasting Method) 以及資料探勘的循序樣式分析(Sequential Pattern Mining)是不同的方法喔。雖然名稱很像,但是計算方式有很大的不同,請不要搞錯了。


投影片 / Slide

下載:Google DriveOneDriveMegaSlideShare

這份投影片算是之前序列分析簡介中投影片的完整版本。原本的投影片只有介紹後面的序列分析,這次連前面的行為編碼也一併介紹了。

相關工具 / Tools

投影片中會使用到一些工具。質性行為編碼的工具包括:

編碼 階段 運作
1 定義問題 具體描繪問題或釐清問題的定義
2 尋求解決方法 針對問題提供(詳細/簡略的)資訊或解決方法
3 分析與歸納 分析、比較與評論他人提出的意見、解決方法以及資訊
4 統整與結論 歸納先前的提議或意 見,並提出結論
5 其他 與主題無關的討論

序列分析會使用到的工具包括:

一般化序列查詢器 / GSEQ

GSEQ5big

除了以上我自己開發的工具之外,序列分析的作者Bakeman等人也開發了專門做序列分析的工具:Generalized Sequential Querier。現在已經是免費下載了:

我的工具畢竟還不算是十分完美,只能說是入門基本款而已,有些Bug到現在也還沒有時間好好研究。未來應該要更深入來研究GSEQ的使用才對。


結語:結合質性與量化的研究方法 / Conclusion: The mixed research method of qualitative and quantitative

一般都認為質性研究跟量化研究是水火不容的兩種方法。這是由於兩種方法所站的哲學角度是有所不同:質性研究是基於社會建構論(social constructionism),認為這個世界是由獨立的個體組成,每個人都是獨一無二,世界是由微觀的行為與鉅觀的社會脈絡所建構而成;量化研究相信實證主義(positivism),認為這個世界一定存在唯一不變的真理,而我們可以利用取樣來由小見大。

而序列分析則是將這種兩者方法結合在一起:我們記錄質性的行為資料,然後進行編碼分析,再來使用量化的推論統計來解釋行為序列的轉換。一般的質性研究大概十人上下各30分鐘的訪談就是一篇碩士論文,但是數位學習的序列分析通常是取兩個班級、共約60人左右,而且是做兩個小時以上的行為觀察。一般的量化研究通常是跑獨立樣本t檢定(兩組平均數比較)、變異數分析(三組以上的平均數比較)、共變數分析(考量前測的平均數比較)、皮爾森相關係數分析,但是序列分析則是使用二項式檢定 (其實統計課都會教,沒印象的人回去跟統計老師道歉) 。不管是從質性研究還是量化研究的角度來看,序列分析要做得事情都不比前兩種還少。

由於序列分析工具做起來很簡單,我本來以為兩個小時就能講完序列分析的內涵。結果講到最後竟然用了快三個半小時,越講越覺得序列分析真是博大精深。不過序列分析依然有其侷限:只能呈現行為之間的轉換,而非建模。在研究分析上應結合其他方法一起應用。

話說回來,從哲學觀點來看,序列分析其實比較偏向量化研究,也就就是實證主義的哲學觀點。因為他是希望從大量資料中歸納出具有推論性的結論。就這個就觀點來看,如果分析質性資料的時候腦袋裡面還想著「在受訪對象中有一半人都發生這樣的行為」,那其實這是一種量化研究的思維,而不是質性研究喔。很多人都以為做訪談就是質性研究、問卷就是量化研究,其實並非如此,有必要跟大家釐清一下。

總之經過這次的歷練,如果下次還有誰想要認識序列分析的話,歡迎來找我去介紹。預計下次就會再加入GSEQ的介紹了吧XD

(more...)

PostgreSQL高可用架構:pgpool2虛擬應用範本 / HA structure of PostgreSQL: pgpool2 Virtual Application Template

PostgreSQL高可用架構:pgpool2虛擬應用範本 / HA structure of PostgreSQL: pgpool2 Virtual Application Template

image

傳統的關聯式資料庫PostgreSQL一般而言都是裝在本機端上運作,但是搭配了pgpool中介工具,就能夠串聯多臺PostgreSQL伺服器,以達到高可用(High Available)的架構。我將pgpool與PosgreSQL的高可用架構做成了兩臺虛擬應用範本pgpool-master跟pgpool-slave提供大家下載,並說明擴充的方法。


什麼是pgpool? / What is pgpool?

pgpool是PostgreSQL的中介工具(middleware),現在的版本為pgpool-II,所以軟體名稱通常是pgpool2,以下內容翻譯自pgpool Wiki

pgpool-II採BSD開放原始碼授權,提供了以下功能:

  • 資料庫連線池管理(Connection Pooling):pgpool-II保存連線到PostgreSQL伺服器的連線,當同樣設定的人進行連線時,就拿以保存的連線來使用。這可以降低資料庫連線的額外負擔(overhead),並且改善系統整體效能。(布丁註:早期我在DSpace上使用Proxool也是同樣的目的)
  • 資料複製(replication):pgpool-II可以管理多個PostgreSQL伺服器。使用複製功能,可以即時將資料備份在2個或更多的實體硬碟中,如此一來即使硬碟損毀,伺服器仍然可以繼續提供服務。
  • 負載平衡(Load Balancing):當資料複製功能開啟時,在任何伺服器上執行SELECT查詢時的會獲得同樣地結果。pgpool-II將SELECT查詢分散到多個PostgreSQL伺服器上,以改進整體的效能。PostgreSQL伺服器的數量越多,效能提升的幅度越多。負載平衡特別適用於很多使用者同時執行大量查詢的時候。
  • 限制超量的資料庫連線:PostgreSQL會限制最大同時連線數量,超量的連線將會被拒絕。調整資料庫連線上限會增加資源消耗量,並影響系統效能。pgpool-II也可以設定連線數量的上限,而超過的連線將會列入等待,而不會立即回傳錯誤
  • 並行查詢(Parallel Query):使用並行查詢功能,查詢本身會切割成多個部分,並同時在多臺伺服器上同時進行查詢、取回資料、並進行合併,以此降低整體執行的時間。(布丁註:類似RAID-0的概念) 並行查詢的功能最適合用在查詢大規模的資料上。

pgpool-II將PostgreSQL伺服器作為後端與前端的通訊接口,並仰賴與伺服器之間的連線。因此,資料庫應用程式(前端,意思是網站)會將pgpool-II視為一臺PostgreSQL伺服器,而資料庫伺服器(後端)則會視pgpool-II為它的客戶端。因為pgpool-II對伺服器與客戶端來說都是透明的,因此既有的資料庫應用程式(網站)可以直接使用pgpool-II而幾乎不需要更改設定。(布丁註:通常修改連接埠即可)

(我翻譯完才發現pgpool有中文wiki…)

pgpool-II的配置 / Configuring pgpool-II

pgpool有很多模式,每一種模式都會啟用或關閉部分功能,詳細的設定一般會位於 /etc/pgpool.conf 與 /etc/pcp.conf。讓我們來看看pgpool的四種模式:

功能/模式 原始模式(*3) 複製模式 主/備模式 並行查詢模式
連接池管理 X O O O
資料複製 X O X (*1)
負載平衡 X O O (*1)
故障恢復 O O O X
線上恢復 X O (*2) X
並行查詢 X X X O
需要伺服器數量 1 或更多 2 或更多 2 或更多 2 或更多
是否需要系統資料庫
  • O表示可用、X表示不可用。
  • *1 並行模式需要同時打開複製與負載平衡的設定,但是複製和負載平衡無法用於並行查詢模式中的分佈式表。
  • *2 線上恢復可以和串流複製同時使用。
  • *3 客戶端僅是透過pgpool-II連接到PostgreSQL伺服器。這種模式僅用於限制連到伺服器的連接數,或著在多臺機器上啟用故障恢復的功能。

本文主要的目標在於第二種模式:複製模式。以下大致上說明安裝的過程,至於結果請直接用虛擬應用範本就好了。

安裝pgpool-II / Install pgpool-II

我以Turunkey Linux的PostgreSQL虛擬應用範本為基礎,以apt-get安裝pgpool2,然後修改配置後完成。大致做法如下:

  1. 下載Turnkey Linux Postgresql:這個虛擬應用範本做得很貼心,安裝完成之後可以自動提示設定PostgreSQL預設帳號postgres的密碼,使用https連線就會開啟phpPgAdmin
  2. 從虛擬應用範本建立虛擬機器:做法請看我之前寫的教學:Proxmox VE 3安裝與建立OpenVZ虛擬機器。建立的虛擬機器有兩臺,各別是pgpool-master與pgpool-slave。以下步驟大部分都會在這兩台上進行。這兩台伺服器的IP為:
    1. pgpool-master: 192.168.11.110
    2. pgpool-slave: 192.168.11.111
  3. 啟動Turnkey Linux Postgresql:Turnkey Linux的虛擬應用範本啟動時都要先進行初始化,大概要花10分鐘的時間。
  4. 安裝pgpool2:安裝指令為:
    apt-get install –y pgpool2
  5. 設定伺服器之間SSH的連線:
    1. 先設定postgres帳號的密碼:
      passwd postgres
      設定密碼為: password
    2. 切換到posgresql帳號:
      su postgres
    3. 在pgpool-master電腦上建立ssh金鑰:
      ssk-keygen
      當詢問passphrase的時候,直接enter就好了,不設定passphrase。
      image
    4. 複製金鑰到pgpool-slave:
      ssh-copy-id postgres@192.168.11.111
      詢問密碼時,輸入剛剛設定postgres的密碼:password
      image
  6. 設定PostgreSQL的連線權限:
    1. 修改/etc/postgresql/9.1/main/pg_hba.conf ,注意,路徑可能會因為PostgreSQL的版本而有所不同,我用的是9.1版本。
    2. 將METHOD中使用peer與md5的登入方式全部改成password。例如:
      host    all         all         0.0.0.0/0             password #md5
      image
  7. 設定 /etc/pgpool2/pcp.conf
    image
    1. 建立要連線帳號的md5密碼,我們用預設帳號postgres來做這件事情:
      pg_md5 postgres –p
    2. 輸入密碼,我建立公開範本的統一密碼都是password
    3. 取得md5編碼:「88e2d8cd1e92fd5544c8621508cd706b」
    4. 連同帳號組成「postgres:88e2d8cd1e92fd5544c8621508cd706b」,加到 /etc/pgpool2/pcp.conf最後一行
  8. 調整 /etc/pgpool2/pgpool.conf 基本設定:
    1. listen_addresses = '*' # 表示可讓任何其他伺服器連線到pgpool。
    2. replication_mode = on  # 啟用資料複製
    3. load_balance_mode = on # 啟用負載平衡
  9. 調整 /etc/pgpool2/pgpool.conf 連接PostgreSQL伺服器的設定,backend_hostname1就是pgpool-slave:
    backend_hostname1 = 'localhost'
    backend_port1 = 5432
    backend_weight1 = 1
    backend_hostname1 = '192.168.11.111'
    backend_port1 = 5432
    backend_weight1 = 1

    image
  10. 修改phpPgAdmin的連接埠設定 /etc/phppgadmin/config.inc.php:
    $conf['servers'][0]['port'] = 5433;
    這樣phppgadmin就會連到pgpool,而不是原本的PostgreSQL。
  11. 重新啟動pgpool-II跟PostgreSQL:
    service pgpool2 restart
    service pgpool2 postgresql
  12. 開啟phpPgAdmin看看成果:
    https://192.168.11.110
    image
    這個網址應該可以打開phpPgAdmin,然後請用postgres / password來登入。登入之後的任何操作都會在pgpool-master跟pgpool-slave上生效。這就代表成功了。

安裝pgpoolAdmin / Install pgpoolAdmin

pgpoolAdmin是用來管理pgpool-II的PHP網頁管理工具。我們可以用它來快速確認pgpool是否正常運作。安裝方法參考自Aric Gardner的PGPOOL-II-ADMIN安裝教學。我把pgpoolAdmin跟phpPgAdmin結合,大致上步驟如下:

  1. 下載pgpoolAdmin:
  2. 解壓縮後,更改目錄名為admin-tool
  3. 修改擁有者為root
    chown -R root admin-tool
  4. 修改目錄與檔案為777
    chmod 777 templates_c
    chmod 777 conf/pgmgt.conf.php
  5. 放置到phpPgAdmin的網頁目錄:/usr/share/phppgadmin/admin-tool/
  6. 開啟網頁 https://192.168.11.110/admin-tool/install,按照指示設定。主要設定包括了
    1. 修改以下目錄與檔案的修改為777 (使用chmod)
      1. /etc/pgpool2/pcp.conf
      2. /etc/pgpool2//etc/pgpool2/pgpool.conf
    2. pgpool.conf File (string): /etc/pgpool2/pgpool.conf
    3. Password File (string): /etc/pgpool2/pcp.conf
    4. pgpool Command (string): /usr/sbin/pgpool
    5. PCP Directory (string): /usr/sbin/
  7. 設定完成後,刪除install資料夾
    rm -rf /usr/share/phppgadmin/admin-tool/install/

開啟網頁:https://192.168.11.110/admin-tool/status.php

image

設定完成。


下載pgpool虛擬應用範本 / Download pgpool Virtual Application Template

經過以上漫長的安裝過程之後,最後成果就是pgpool-master跟pgpool-slave這兩個虛擬應用範本啦。

建立虛擬應用範本的方法請參考我之前寫的教學:Proxmox VE 3安裝與建立OpenVZ虛擬機器

image

建置好之後,設定啟動,預設就是這兩台伺服器的PostgreSQL高可用架構。


pgpool虛擬應用範本操作教學 / pgpool Virtual Application Guide

接下來我要說明使用教學。在以下教學中的網路設定如下:

  • pgpool-master: 192.168.11.110 (主要操作都在這進行)
  • pgpool-slave:192.168.11.111
  • pgpool-slave2 (複製pgpool-slave):192.168.11.112
如何操作pgpool?

請使用phpPgAdmin來操作pgpool,操作方式就跟原本操作PostgreSQL一樣!

image

網址是: https://[pgpool-master-ip]/

如何觀看pgpool的運作狀況?

請使用pgpoolAdmin,網址是:https://[pgpool-master-ip]/admin-tool/

image

如何連接到pgpool? / How to connect to pgpool?

很簡單,使用原本連接到PostgreSQL的設定方式,連線到pgpool-master,然後連接埠改成5433就可以了。(PostgreSQL預設連接埠為5432)

CodeIgnitor的資料庫連線設定來舉例,

原本的設定可能是連線到localhost本機端:
$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "password";
$db['default']['database'] = "database_name";
$db['default']['dbdriver'] = "postgres";

現在要改成連線到pgpool-master (假設IP為192.168.11.110),而且要指定連接埠為5433:
$db['default']['hostname'] = "192.168.11.110";
$db['default']['username'] = "root";
$db['default']['password'] = "password";
$db['default']['database'] = "database_name";
$db['default']['dbdriver'] = "postgres";
$db['default']['port'] = 5433;

如何增加pgpool的數量? / How to extend pgpool structure?

首先,我們要再建置一臺pgpool-slave,設定為pgpool-slave2,設定網路位址為192.168.11.112

2015-06-20_000510

然後來到pgpool-master上,修改 /etc/pgpool2/pgpool.conf。加入以下設定:(因為是第三臺,所以編號為2,下一臺編號就是3,依此類推)
backend_hostname2 = '192.168.11.112'
backend_port2 = 5432
backend_weight2 = 1

重新啟動pgpool:
service pgpool2 restart

從pgpoolAdmin來看,pgpool-slave2已經加入節點中。

image

有其他問題怎麼辦? / Other Questions

請使用Blogger的「張貼留言」來描述您的問題。


結論 / Conclusion

其實最近我連續做了很多個OpenVZ的虛擬應用範本,可是大部分是做給實驗室內部使用的,因此還沒能花時間轉換成可以發佈的版本。老實說,用OpenVZ製作虛擬應用範本有點麻煩。即使我用了Turnkey Linux來製作虛擬機器,可是檔案還是有200MB以上,要找到空間擺放,實在是不太容易。而且如果我要修改一個檔案,那就要重新打包、上傳,這樣子維護虛擬應用範本實在是太沒有效率。

OpenVZ虛擬應用範本在更新上實在很麻煩,因此我開始關注起Docker的倉庫運作方式。不知道這個倉庫的運作方不方便使用?

(more...)