樹莓派使用實例之:2 Pi R
本文將建立一個底層框架,為倆樹莓派實現冗餘提供基礎服務,首先我要用 GlusterFS 建立一個集群網路文件系統。在之後的文章中,我還會介紹如何利用共享存儲來建立其他冗餘服務。注意,雖然本文使用的是樹莓派,但下面的配置操作同樣適用於其他硬體。
配置倆樹莓派
首先從樹莓派官網下載最新的 Linux 發行版,並安裝到兩塊 SD 卡中。將樹莓派接到電視機上,然後按照文檔提示選擇內核鏡像並啟動系統,確認一下 SSH 服務有沒有啟動(默認情況下 SSH 應該是開機啟動的)。你可以使用 raspi-config 命令來增加根分區空間,以便能充分利用 SD 卡的容量。確認系統正常工作、SSH 正常啟動後,我可以過程訪問它了。我將樹莓派與電視機斷開,並連到交換機上,重啟系統,沒有顯示界面。
默認情況下,Raspbian 會通過 DHCP 獲取自己的網路信息,但是在設置冗餘服務時,我們希望樹莓派每次開機都使用同一個 IP 地址。在我的環境中,我設置了我的 DHCP 伺服器,它會在樹莓派啟動時為它們分配固定的 IP 地址。而你可以編輯 /etc/network/interfaces 文件:
iface eth0 inet dhcp
修改成:
auto eth0
iface eth0 inet static
address 192.168.0.121
netmask 255.255.255.0
gateway 192.168.0.1
當然,要將上面的參數修改成你自己的參數,確保每個樹莓派使用不同的 IP 地址。我把兩個樹莓派的主機名都改了,便於在(通過 SSH)登錄的時候區分它們。怎麼改主機名呢?以 root 許可權編輯 /etc/hostname 文件。最後重啟系統,確認樹莓派使用了正確的網路配置和主機名。
配置 GlusterFS 伺服器
GlusterFS 是一個用戶態的集群文件系統,我選擇它,是因為它配置共享網路文件系統很方便。首先選一個樹莓派作為主設備(master)。在主設備上你需要做一些初始化操作,完成後,它們會自動執行故障轉移。下面是我架設的環境:
Master hostname: pi1
Master IP: 192.168.0.121
Master brick path: /srv/gv0
Secondary hostname: pi2
Secondary IP: 192.168.0.122
Secondary brick path: /srv/gv0
在開始之前,登入這兩個樹莓派,然後安裝 glusterfs-server 軟體包:
$ sudo apt-get install glusterfs-server
GlusterFS 將數據保存在一些被稱為「塊」的設備中。一個「塊」是一個系統路徑,由你指定給 gluster 使用。GlusterFS 會將所有「塊」組合成一個存儲卷,給客戶端使用。GlusterFS 會將文件的數據分割成多份,保存在不同的「塊」中。所以雖然一個「塊」看起來就是一個普通的路徑,你最好不要在樹莓派中直接操作它,而應該通過客戶端訪問 GlusterFS 服務,讓 GlusterFS 操作。本文中我在兩個樹莓派中都新建一個 /srv/gv0 目錄作為 GlusterFS 的「塊」:
$ sudo mkdir /srv/gv0
在我的環境中,我將 SD 卡上的根文件系統共享出來,而你可能需要共享更大的存儲空間。如果是這樣的話,在兩塊樹莓派上都接上 USB 硬碟,格式化後掛載到 /srv/gv0 上。編輯下 /etc/fstab 文件,確保系統每次啟動時都會把你的 USB 硬碟掛載上去。兩個樹莓派上的「塊」不一定需要有相同的名字或者相同的路徑名稱,但是把它們設置為相同的值也沒什麼壞處。
配置好「塊」的路徑,安裝好 glusterfs-server 軟體包,確認兩個樹莓派都正常工作,然後登入被你設為主設備的樹莓派,輸入「gluster peer probe」命令,將次設備加入到集群中。在我的環境中,我用 IP 地址表示第二個節點,如果你比較有個性,並且有設置過 DNS,你也可以用主機名表示這個節點。
pi@pi1 ~ $ sudo gluster peer probe 192.168.0.122
Probe successful
目前為止,我的 pi1 (192.168.0.121) 信任 pi2 (192.168.0.122),我可以建立一個存儲卷,名字都想好了:gv0。在主設備端運行命令「gluster volume create」:
pi@pi1 ~ $ sudo gluster volume create gv0 replica 2 192.168.0.121:/srv/gv0 192.168.0.122:/srv/gv0
Creation of volume gv0 has been successful. Please start
the volume to access data.
這裡稍微解釋一下命令的意思。「gluster volume create」就是新建一個卷;「gv0」是卷名,這個名稱將會在客戶端被用到;「replica 2」表示這個卷的數據會在兩個「塊」之間作冗餘,而不是將數據分割成兩份分別存於兩個「塊」。這個命令保證了卷內的數據會被複製成兩份分別保存在兩個「塊」中。最後我定義兩個獨立的「塊」,作為卷的存儲空間:192.168.0.121 上的 /srv/gv0 和 192.168.0.122 上的 /srv/gv0。
現在,卷被成功創建,我只需啟動它:
pi@pi1 ~ $ sudo gluster volume start gv0
Starting volume gv0 has been successful
然後我可以在任何一個樹莓派上使用「volume info」命令來查看狀態:
$ sudo gluster volume info
Volume Name: gv0
Type: Replicate
Status: Started
Number of Bricks: 2
Transport-type: tcp
Bricks:
Brick1: 192.168.0.121:/srv/gv0
Brick2: 192.168.0.122:/srv/gv0
配置 GlusterFS 客戶端
卷已啟動,現在我可以在一個支持 GlusterFS 的客戶端上,將它作為一個 GlusterFS 類型的文件系統掛載起來。首先我想在這兩個樹莓派上掛載這個卷,於是我在兩個樹莓派上都創建了掛載點,並下面的命令把這個卷掛載上去:
$ sudo mkdir -p /mnt/gluster1
$ sudo mount -t glusterfs 192.168.0.121:/gv0 /mnt/gluster1
$ df
Filesystem 1K-blocks Used Available Use% Mounted on
rootfs 1804128 1496464 216016 88% /
/dev/root 1804128 1496464 216016 88% /
devtmpfs 86184 0 86184 0% /dev
tmpfs 18888 216 18672 2% /run
tmpfs 5120 0 5120 0% /run/lock
tmpfs 37760 0 37760 0% /run/shm
/dev/mmcblk0p1 57288 18960 38328 34% /boot
192.168.0.121:/gv0 1804032 1496448 215936 88% /mnt/gluster1
如果你是一個喜歡鑽研的讀者,你可能會問了:「如果我指定了一個 IP 地址,如果192.168.0.121當機了,怎麼辦?」。別擔心,這個 IP 地址僅僅是為了指定使用哪個卷,當我們訪問這個卷的時候,卷內的兩個「塊」都會被訪問到。
當你掛載好這個文件系統後,試試在裡面新建文件,然後查看一下「塊」對應的路徑:/srv/gv0。你應該可以看到你在 /mngt/gluster1 里創建的文件,在兩個樹莓派的 /srv/gv0 上都出現了(重申一遍,不要往 /srv/gv0 里寫數據):
pi@pi1 ~ $ sudo touch /mnt/gluster1/test1
pi@pi1 ~ $ ls /mnt/gluster1/test1
/mnt/gluster1/test1
pi@pi1 ~ $ ls /srv/gv0
test1
pi@pi2 ~ $ ls /srv/gv0
test1
你可以在 /etc/fstab 上添加下面一段,就可以在系統啟動的時候自動把 GlusterFS 的卷掛載上來:
192.168.0.121:/gv0 /mnt/gluster1 glusterfs defaults,_netdev 0 0
注意:如果你想通過其他客戶端訪問到這個 GlusterFS 卷,只需要安裝一個 GlusterFS 客戶端(在基於 Debian 的發行版里,這個客戶端叫 glusterfs-client),然後接我上面介紹的,創建掛載點,將卷掛載上去。
冗餘測試
現在我們就來測試一下這個冗餘文件系統。我們的目標是,當其中一個節點當掉,我們還能訪問 GlusterFS 卷裡面的文件。首先我配置一個獨立的客戶端用於掛載 GlusterFS 卷,然後新建一個簡單的腳本文件放在卷中,文件名為「glustertest」:
#!/bin/bash
while [ 1 ]
do
date > /mnt/gluster1/test1
cat /mnt/gluster1/test1
sleep 1
done
這個腳本運行無限循環並每隔1秒列印出系統時間。當我運行這個腳本時,我可以看到下面的信息:
# chmod a+x /mnt/gluster1/glustertest
root@moses:~# /mnt/gluster1/glustertest
Sat Mar 9 13:19:02 PST 2013
Sat Mar 9 13:19:04 PST 2013
Sat Mar 9 13:19:05 PST 2013
Sat Mar 9 13:19:06 PST 2013
Sat Mar 9 13:19:07 PST 2013
Sat Mar 9 13:19:08 PST 2013
我發現這個腳本偶爾會跳過1秒,可能是 date 這個命令並不是很精確地每隔1秒鐘列印一次,所以偶爾會出現輸出時間不連慣的現象。
當我執行這個腳本後,我登入一個樹莓派並輸入「sudo reboot」重啟這個設備。這個腳本一直在運行,如果出現輸出時間不連慣現象,我不知道還是不是上面說的偶然現象。當第一個樹莓派啟動後,我重啟第二個樹莓派,確認下這個系統有一個節點丟失後,我的程序仍然能正常工作。這個冗餘系統配置起來只需要幾個命令,如果你需要一個冗餘系統,這是個不錯的選擇。
現在你已經實現了 2 Pi R 組成的冗餘文件系統,在我的下篇文章中,我將會加入新的冗餘服務,將這個共享存儲系統好好利用起來。
via: http://www.linuxjournal.com/content/two-pi-r
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive