Linux‎ > ‎

實作Scale-out NAS – Gluster & Heartbeat

Preface

Gluster是一個分散式Scale-Out檔案系統,依據客戶端儲存體空間的需求可快速供應(Provisioning)你額外的儲存空間。它是一套開放原始碼軟體,可群聚多個檔案系統提供數以PB計的儲存資源(據官方網站說明,實際上可達到 72 brontobytes )及上千個用戶端作資源存取。GlusterFS在傳統的系統環境及低成本的情況下,可彈性的整合實體、虛擬及雲端儲存資源以實現高可用性及高效能的企業儲存資源。除此之外,還可透過高速頻寬的Infiniband RDMATCP/IP協定在多個叢集儲存節點上互連,並在單一全域命名空間上整合多個節點上的磁碟、記憶體資源及資料管理。

綜合Gluster特性,分列整理如下:

I.     Scalability and Performance

II.    High Availability

III.  Global Namespace

IV.   Elastic Hash Algorithm

V.    Elastic Volume Manager

VI.   Gluster Console Manager

VII.  Standards-based

 

LAB Environment

OS: CentOS 6.3 (2.6.32-279.el6.x86_64)

Node 1 (Gluster1)

eth0

eth1

Disk (Brick)

172.20.144.83 (Mgmt)

1.1.1.1 (Mirror & Heartbeat)

/dev/sda2

Node 2 (Gluster2)

eth0

eth1

Disk (Brick)

172.20.144.84 (Mgmt)

1.1.1.2 (Mirror & Heartbeat)

/dev/sda2

Virtual IP

eth0:0

172.20.144.80

Gluster Volume Name

gv0

 

 

1.      安裝Gluster (YUM自動安裝)

I.      CentOS作業系統安裝時,選擇Basic Server安裝。

II.    使用wget工具,下載Gluster YUM Repository。若連結失效請自行至該網站找最新連結。

III.   若無法使用YUM來自動安裝,可參考下一則手動安裝參考。

wget -P /etc/yum.repos.d http://download.gluster.org/pub/gluster/glusterfs/LATEST/EPEL.repo/glusterfs-epel.repo

 

IV.   安裝Gluster

yum -y install glusterfs{-fuse,-server}

 

2.      安裝Gluster (無法連至Internet,需手動安裝)

I.    CentOS安裝時,選擇Basic Server安裝。

II.   準備Gluster安裝套件

glusterfs-3.3.1-1.el6.x86_64.rpm

glusterfs-server-3.3.1-1.el7.x86_64.rpm

glusterfs-fuse-3.3.1-1.el7.x86_64.rpm

 

III.  安裝Gluster

# rpm -ivh glusterfs-3.3.1-1.el6.x86_64.rpm glusterfs-server-3.3.1-1.el7.x86_64.rpm glusterfs-fuse-3.3.1-1.el7.x86_64.rpm

 

3.      Nodes主機基礎設定 (兩台Nodes都需設定)

I.     命名主機名稱(Hostname)

Node 1: Gluster1

Node 2: Gluster2

II.    關閉iptablesSELinux服務

III.   修改 /etc/hosts,加入兩台主機名稱及IP

[root@Gluster1 ~]# vim /etc/hosts

1.1.1.1  Gluster1

1.1.1.2  Gluster2

 

IV.   IP配置,包含管理IP(172.20.144.x)Mirror IP(1.1.1.x)

V.    配置Bricks(Mirror Disk),本例使用裝置 /dev/sda2

[root@Gluster1 ~]# fdisk /dev/sda

 

VI.   格式化為XFS檔案系統,並設定開機自動掛載。(需先安裝xfsdump套件)

[root@Gluster1 ~]# yum -y install xfs

[root@Gluster1 ~]# mkdir -p /Brick1    //建立/dev/sda2掛載目錄

[root@Gluster1 ~]# mkfs.xfs -i size=512 /dev/sda2    //格式化為XFS檔案系統

[root@Gluster1 ~]# vim /etc/fstab    //設定開機自動掛載

/dev/sda2 /Brick1 xfs defaults 1 2

[root@Gluster1 ~]# mount -a && mount

 

4.      使用Gluster Console Manager – 命令列工具

I.   Gluster Console Manager是一個可下達指令的工具程式,它簡化了設定及儲存環境的管理,並可在1台節點同步下達指令給所有的節點。透過此工具能夠建立新的Volume、啟動及停止Volume的服務,亦可對線上的Volume進行動態的bricks新增、刪除修改。

Gluster Console ManagerSSH Console下分兩種操作模式,一是直接帶指令執行,另一方法則是進入互動模式來下達指令。

II.   範例1: 直接執行指令

# gluster peer command

For example:

# gluster peer status

 

III.   範例2: 進入互動模式

# gluster

You can execute gluster commands from the Console Manager prompt:

gluster> command

For example:

# gluster

gluster > peer status

 

5.      設定信任儲存池(Trusted Storage Pools)

I.     在開始配置Gluster volume之前,必須要先建立所有節點(儲存伺服器)間溝通的信任儲存池。在開始啟動第一台節點時,預設是只能看到本機,必須透過信任儲存池將其他可信任的節點加入進來,成為一個大型的儲存池。

II.    將本機(Gluster1)以外節點(Gluster2)加入信任儲存池

[root@Gluster1 ~]# gluster peer probe gluster2

Probe successful

 

III.    驗證節點狀態

[root@Gluster1 ~]# gluster peer status

Number of Peers: 1

 

Hostname: Gluster2

Uuid: ad9d26e6-50ac-4273-a2f1-186e6d910ceb

State: Peer in Cluster (Connected)

 

IV.   從信任儲存池中移除節點

[root@Gluster1 ~]# gluster peer detach gluster2

Detach successful

 

6.      設置Gluster Volume (只需在Node1執行)

I.    Gluster Volume在這邊指的是各個Node主機端磁碟(Bricks)邏輯上的集合,可以想像將數顆實體的磁碟虛擬成一顆可識別的邏輯磁碟。

II.  Gluster Volume於儲存環境上,依照需求提供七種不同型態的儲存方法。

Volume Type

Description

1.      Distributed

使用Distributed,檔案將會隨機被儲存至不同的NodeBricks上。需注意的是,當其中一台Node或磁碟發生故障,將會導致資料遺失問題。

範例:

# gluster volume create NEW-VOLNAME [transport [tcp | rdma | tcp,rdma]] NEW-BRICK...

 

2.      Replicated

使用Replicated,檔案將會同時複寫多份至Volume下所有的Bricks。此方法適合設計在需高可用性及高可靠性的企業上。需注意的是,所規劃的Replicated數量需等於目前配置的Bricks數量。

範例:

# gluster volume create NEW-VOLNAME [replica COUNT] [transport [tcp | rdma | tcp,rdma]] NEW-BRICK...

 

# gluster volume create test-volume replica 2 transport tcp server1:/exp1 server2:/exp2

 

3.      Striped

使用Striped,檔案將會被拆成數份儲存至被分配的Bricks上。需注意的是,所規劃的Striped數量需等於目前配置的Bricks數量。

範例:

# gluster volume create NEW-VOLNAME [stripe COUNT] [transport [tcp | rdma | tcp,rdma]] NEW-BRICK...

 

# gluster volume create test-volume stripe 2 transport tcp server1:/exp1 server2:/exp2

 

4.      Distributed Striped

使用Distributed Striped,檔案將會隨機被儲存至任一個Node,且被拆成數位儲存至被分配的Bricks上。Bricks數量必須要為Stripe count的倍數,例如2NodesBricks數量就要為4個。

範例:

# gluster volume create NEW-VOLNAME [stripe COUNT] [transport [tcp | rdma | tcp,rdma]] NEW-BRICK...

 

# gluster volume create test-volume stripe 4 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4 server5:/exp5 server6:/exp6 server7:/exp7 server8:/exp8

 

5.      Distributed Replicated

使用Distributed Replicated,檔案將會被複制至數個Nodes(Replicated volume),且被分散儲存在其一Brick上。Bricks數量必須要為Replicate count的倍數,例如2NodesBricks數量就要為4個。

範例:

# gluster volume create NEW-VOLNAME [replica COUNT] [transport [tcp | rdma | tcp,rdma]] NEW-BRICK...

 

# gluster volume create test-volume replica 2 transport tcp server1:/exp1 server2:/exp3 server1:/exp2 server2:/exp4

 

6.      Distributed Striped Replicated

使用Distributed Striped Replicated,檔案將會被拆成(Striped)數個,且分散(Distributed)儲存至多個複制(Replicated)Bricks上。Bricks數量必須要為Stripe countReplicate count的倍數。

範例:

# gluster volume create NEW-VOLNAME [stripe COUNT] [replica COUNT] [transport [tcp | rdma | tcp,rdma]] NEW-BRICK...

 

# gluster volume create test-volume stripe 2 replica 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4 server5:/exp5 server6:/exp6 server7:/exp7 server8:/exp8

 

 

7.      Striped Replicated

使用Striped Replicated,檔案將會被複制到多個Nodes,且被拆散儲存至各Node內不同的Bricks上。Bricks數量必須要為Stripe countReplicate count的倍數。

範例:

# gluster volume create NEW-VOLNAME [stripe COUNT] [replica COUNT] [transport [tcp | rdma | tcp,rdma]] NEW-BRICK...

 

# gluster volume create test-volume stripe 3 replica 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4 server5:/exp5 server6:/exp6

 

III.     本範例採用replicate方法來作2Nodes間檔案的複制及保護。

[root@Gluster1 ~]# service glusterd start    //啟動Gluster Daemon

Starting glusterd:                                         [  OK  ]

[root@Gluster1 ~]# gluster volume create gv0 replica 2 transport tcp Gluster1:/Brick1 Gluster2:/Brick2    //建立replicated volume

Creation of test-volume has been successful

Please start the volume to access data.

[root@Gluster1 ~]# gluster volume start gv0    //啟動gv0 volume

Starting volume gv0 has been successful

[root@Gluster1 ~]# gluster volume info    //確認volume資訊

Volume Name: gv0

Type: Replicate

Volume ID: 8f9331d8-e0ab-49f4-9160-b35686337e0f

Status: Started

Number of Bricks: 1 x 2 = 2

Transport-type: tcp

Bricks:

Brick1: gluster1:/Brick1

Brick2: gluster2:/Brick1






















IV.     手動掛載gluster檔案系統(glusterfs) (2Nodes都需設定) 

[root@Gluster1 ~]# mkdir -p /GShare

[root@Gluster1 ~]# mount -t glusterfs gluster1:/gv0 /GShare

[root@Gluster1 ~]# mount

/dev/sda2 on /Brick1 type xfs (rw)

Gluster1:/gv0 on /GShare type fuse.glusterfs (rw,default_permissions,allow_other,max_read=131072)

 

V.        設定開機自動掛載gluster檔案系統(glusterfs) (2Nodes都需設定)

[root@Gluster1 ~]# vim /etc/fstab    //加入下列一行

Gluster1:/gv0       /GShare       glusterfs defaults,_netdev    0 0

 

7.      測試Gluster volume資料寫入

I.           透過for廻圈連續寫入100筆檔案到gluster volume

[root@Gluster1 ~]# for i in `seq -w 1 100`; do cp -rp /var/log/messages* /GShare/test-$i; done

 

II.        確認所有Nodes檔案數量是否一致

[root@Gluster1 ~]# ls -al /GShare | wc -l ; ssh Gluster2 ls -al /GShare | wc -l

 

8.      Heartbeat (兩台Nodes都要設定)

I.  本範例將透過Heartbeat套件來提供一組對外Virtual IP,且2Nodes會定時互相偵測對方是否存活,並由Heartbeat服務來指派哪一台為PrimarySecondary。預設情況下,外部檔案只會經由Virtual IP傳給Primary Node,則Secondary Node只會被動接收Replicated的檔案。當Primary Node網卡異常或設備故障時,Heartbeat服務會立即判斷並將Virtual IP重新指向給Secondary Node

II.  安裝Heartbeat套件(建議使用yum工具安裝,免除相依性套件問題)

# yum -y localinstall heartbeat-3.0.4-1.el6.x86_64.rpm  heartbeat-devel-3.0.4-1.el6.x86_64.rpm heartbeat-libs-3.0.4-1.el6.x86_64.rpm

 

III. 新增Heartbeat服務於系統中

[root@Gluster1 ~]# chkconfig --add heartbeat

[root@Gluster1 ~]# chkconfig heartbeat on

 

IV.  Heartbeat有三個設定檔,分別為 ha.cfharesourcesauthkkeys,將此三個範例設定檔複制到 /etc/ha.d/ 目錄底下或手動新增。

[root@Gluster1 ~]# vim /etc/ha.d/ha.cf

[root@Gluster1 ~]# vim /etc/ha.d/haresources

[root@Gluster1 ~]# vim /etc/ha.d/authkeys

 

V.  編輯Heartbeat主要配置檔ha.cf

[root@Gluster1 ~]# vim /etc/ha.d/ha.cf

autojoin none

 

# Debug messages

debugfile /var/log/ha-debug

 

# Other messages

logfile /var/log/ha-log

 

# Syslog系統日誌

logfacility local0

 

# 多久時間確認對方是否存活(單位:)

keepalive 2

 

# 多久時間確認對方已完全失去聯繫(單位:)

deadtime 10

 

# 連續多久時間聯繫不上後開始警告提示(單位:)

warntime 4

 

# 主機若重開機,等待網路開啟或其他應用程式執行的時間。(單位:)

initdead 60

 

# 使用694 Port來作Heartbeat監控

udpport 694

 

# 採用網路卡eth1UDP廣播來發送heartbeat訊息

#bcast eth1

 

# 採用網路卡eth1UDP單播 來發送heartbeat訊息,IP為對方IP位置。建議採用單播,避免多組cluster主機都會看到對方節點(第二台主機則填對方IP)

ucast eth0 172.20.144.84

ucast eth1 1.1.1.2

 

# Primay異常修復完畢,是否需要從Secondary自動切換回Primary。建議設定off

auto_failback off

 

# 節點1與節點2,必須要與 uname -n 指令得到的名稱一致。

node Gluster1

node Gluster2

 

ping 172.20.144.254

 

respawn hacluster /usr/lib64/heartbeat/ipfail

respawn hacluster /usr/lib64/heartbeat/dopd

apiauth dopd gid=haclient uid=hacluster

 

VI.   編輯Heartbeat認證資訊檔authkeys (兩台主機authkeys內容需一致)

            i.    AuthkeysCluster節點間相互認證的密碼,也就是說主機必須擁有此密碼才可加入該Cluster群組。Authkeys共有三種認証方式,分別為crcmd5sha1,依安全性等級區分,sha1最不易破解,其次md5,最後為crc

          ii.     Authkeys的權限必須為600

         iii.     兩台主機authkeys內容需一致

[root@DRBD-1 ~]# (echo -ne "auth 1\n1 sha1 "; echo $RANDOM | openssl sha1 | awk '{print $2}') > /etc/ha.d/authkeys

[root@Gluster1 ~]# chmod 600 /etc/ha.d/authkeys

[root@Gluster1 ~]# scp /etc/ha.d/authkeys root@Gluster2:/etc/ha.d/

 

# authkeys開啟內容如下

auth 1

1 sha1 ccde56f52bc06bcda0918cfa9439f5c91d941de6

 

 

VII.  編輯Heartbeat資源檔haresources (兩台主機內容需一致)

            i.    Haresources每一行代表一個資源組

          ii.    資源組的啟動順序是由左至右,關閉順序是由右往左。

        iii.      Script的參數是由 :: 來傳遞及分隔。

        iv.      每一個資源則以空格間隔

[root@Gluster1 ~]# vim /etc/ha.d/haresources

Gluster1 172.20.144.80

 

參數說明:

 

Gluster1

指定Primary節點

172.20.144.80

Cluster IP位址

 

VIII.  啟動Heartbeat服務 (兩台主機)

[root@Gluster1 ~]# service heartbeat start; ssh Gluster2 service heartbeat start

[root@Gluster1 ~]# service heartbeat status ; ssh Gluster2 service heartbeat status

heartbeat OK [pid 3352 et al] is running on Gluster1 [Gluster1]...

heartbeat OK [pid 3003 et al] is running on Gluster2 [Gluster2]...

 

IX.     啟動完Heartbeat服務後,確認Primary主機是否具備以下狀態。

            i.  Heartbeart新增一組Cluster IP

[root@Gluster1 ~]# ifconfig

eth0:0    Link encap:Ethernet  HWaddr 00:50:56:BD:45:CC

          inet addr:172.20.144.200  Bcast:172.20.144.255  Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

 

ĉ
James Chan,
2013年5月3日 凌晨2:22
Ċ
James Chan,
2013年5月3日 凌晨2:22
Comments