:::
顯示具有 OS/Proxmox VE 標籤的文章。 顯示所有文章

修復Proxmox VE:用指令強制刪除虛擬機器 / Fix Proxmox VE: Remove OpenVZ Container by a Command

布丁布丁吃布丁

修復Proxmox VE:用指令強制刪除虛擬機器 / Fix Proxmox VE: Remove OpenVZ Container by a Command

image

本篇是介紹如何處理在Proxmox VE中無法在網頁管理介面(web-based management)中刪除OpenVZ的問題。這個錯誤是因為OpenVZ虛擬機器的本體檔案在刪除、備份、還原的途中被強制中斷,導致OpenVZ檔案遺失、但是設定檔(*.conf)卻還在節點(node)之中,所以在網頁管理介面中仍然會出現那個虛擬機器,但是無法藉由網頁管理介面刪除。這時候只要用指令列中移除在 /etc/pve/openvz/ 的設定檔,刪不掉的虛擬機器就會消失了。

(more...)

Zentyal的DLLL-CIAS Router更新記錄 / DLLL-CIAS Router Moduel Update

Zentyal的DLLL-CIAS Router更新記錄 / DLLL-CIAS Router Moduel Update

image

DLLL-CIAS Router是我在開放原始碼的網路路由器Zentyal上所開發的模組。這次我在Zentyal 4.1版本上再度開發了新版本的DLLL-CIAS Router。這個版本是特別為了DLLL-CIAS架構中的網路管理伺服器(Router)、資料儲存伺服器(Storage)、虛擬機器管理伺服器(Virtual Environment)、以及虛擬機器(Virtual Machines)的架構所設計,並且融入知識管理、允許重複網域名稱的功能,最後則是留下完整的安裝方法與自動備份的功能,即使Zentyal再度毀損也能夠輕易地將之還原。這篇記錄著這一版本DLLL-CIAS Router所增加的各種功能。

(more...)

修復Proxmox VE:網路錯誤「No route to host (595)」 / Fix Proxmox VE: Network error “No route to host (595)”

布丁布丁吃布丁

修復Proxmox VE:網路錯誤「No route to host (595)」 / Fix Proxmox VE: Network error “No route to host (595)”

image

本篇是修復Proxmox VE 3/4的集叢(Cluster)中遇到「No route to host (595)」錯誤的解決方法。這個錯誤是因為Proxmox VE伺服器變更了網路設定,但是並沒有完全設定好的關係。以下說明造成錯誤的原因以及解決方法。

(more...)

想用無限空間沒那麼容易!Google Drive與伺服器整合失敗記錄 / Solution to Integrate Google Drive with Services: not reliable

想用無限空間沒那麼容易!Google Drive與伺服器整合失敗記錄 / Solution to Integrate Google Drive with Services: not reliable

image

最近花了一段時間在研究怎麽把Google Drive (Google雲端硬碟)ZoteroProxmox伺服器整合。整合之後可以運作,但是可能是因為檔案處理速度過慢或是Google Drive API配額的限制,最後都無法順利運作。這篇記錄一下到目前為止的研究進度。

(more...)

修復Proxmox VE:節點全部離線 / Fix Proxmox VE: All Nodes Offline

布丁布丁吃布丁

修復Proxmox VE:節點全部離線 / Fix Proxmox VE: All Nodes Offline

image

本篇是修復Proxmox VE的集叢(Cluster)中全部節點都變成「離線」狀態,而且重新啟動CMAN的時候還會卡在「Unmounting configfs...」的錯誤。這個錯誤是因為掛載的儲存裝置NAS無法正常連線的問題。確保NAS正常運作之後,所有節點就會恢復正常。以下說明造成錯誤的原因以及解決方法。

This article aims to solve the problem that all nodes of Proxmox VE Cluster are offline (but still can be connected). When restarting CMAN service, it was hang on the message “Unmounting configfs...” and stopped to restart. The cause of this problem is that Proxmox Cluster’s storage, NAS, is not work. Proxmox Cluster can be restored after resuming NAS again. Following I will discribe the problem and the solution.

(more...)

Proxmox VE 4.2配置失敗記錄 / Failed to Setup Proxmox VE 4.2

Proxmox VE 4.2配置失敗記錄 / Failed to Setup Proxmox VE 4.2

image

繼前幾天開始研究Proxmox VE 4.2,我也試著將Proxmox VE 4.2以VirtualBox虛擬機器架設,並且測試看看新的虛擬化技術lxc新的高可用叢集Proxmox VE HA Manager,然後看看有沒有其他的功能好用。結果很遺憾,我未能順利成功使用這些功能。我想在這邊記錄一下這些失敗的過程,也許未來的我知道怎麼操作的話,也許看了會有些不同的感觸吧。

(more...)

OpenVZ虛擬應用範本備份 / Backup OpenVZ Format Virtual Templates

OpenVZ虛擬應用範本備份 / Backup OpenVZ Format Virtual Templates

image

最近在觀看Proxmox VE改版的時候才發現Proxmox VE已經捨棄使用OpenVZ虛擬化技術,而且虛擬應用範本主要的來源Turnkey Linux亦不再提供OpenVZ的格式。為了避免以後使用OpenVZ時找不到虛擬應用範本可供安裝,我認為需要趕快將手邊有的虛擬應用範本備份到其他地方,以供未來需要的時候還能找來下載。下面我以虛擬應用範本內含的系統來分類,有些混雜了下載自Proxmox VE跟我自己做的虛擬應用範本,全部一併備份吧。

(more...)

Proxmox VE 3.4到4.2的更新資訊 / Promxox VE 3.4 to 4.2 Changelog

Proxmox VE 3.4到4.2的更新資訊 / Promxox VE 3.4 to 4.2 Changelog

image

最近發現Proxmox VE已經推出了4.2版,跟我主要使用的3.2跟3.4已經相差已久。4.2版不僅採用了較新的Sencha Ext JS 6,而且還新增了很多功能。我想一邊在回顧Proxmox VE從3.4改版的內容之外,也一邊在這裡做個記錄。

(more...)

修復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...)

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...)

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...)