2017年3月17日 星期五

CentOS7 架設 RHCS (High-Availability Server)

環境架構:
c7-clustera    192.168.60.156
c7-clusterb    192.168.60.157
fencing          192.168.60.159
iSCSI            192.168.60.160

軟體說明:
corosync 套件:5405/UDP,5405/UDP
pcs 套件:有分 pcs 指令與 pcsd 服務套件!pcsd 使用 2224/TCP
pacemaker 套件:cluster 主要套件!使用 3121/TCP
dlm 套件:使用21064/TCP ,存取GFS2遠端檔案系統
fence-agents-all 套件:與 fence 主機連線


Cluster node 主機 SSH 設定:
利用 ssh 管理及設定:
c7-clustera 上產生 ssh key:
ssh-keygen -t dsa -f ~/.ssh/id_dsa -N ""

複製 id_dsa.pub 為 authorized_keys
cp ~/.ssh/id_dsa.pub ~/.ssh/authorized_keys

複製 .ssh 資料夾到其他節點:
scp -r ~/.ssh c7-clusterb:

確認可以用 ssh 直接連線,不需輸入密碼:
ssh c7-clusterb -- 'uname -n'

設定 Cluster node 主機:
每台節點 安裝相關套件:
yum install -y pcs corosync pacemaker psmisc
yum install policycoreutils-python    #如果 SELinux 沒有關閉,在後續設定 DRBD 軟體權限時會用到
補充:
psmisc 是協助管理 /proc 目錄程序
policycoreutils-python 是 semanage 指令輔助工具

在 /etc/hosts 加入各個節點的對應:
192.168.60.156 c7-clustera
192.168.60.157 c7-clusterb
192.168.60.159 fencing

每台節點 關閉SELinux、防火牆設定:
setenforce 0
systemctl disable firewalld.service
systemctl stop firewalld.service
iptables --flush

每台節點 啟動 pcsd 服務:
systemctl start pcsd.service pacemaker.service
systemctl enable pcsd.service pacemaker.service

每台節點 變更 hacluster 密碼:
echo redhat1 | passwd --stdin hacluster
ssh c7-clusterb -- 'echo redhat1 | passwd --stdin hacluster'

在任一台節點,進行身份驗證:
pcs cluster auth c7-clustera c7-clusterb

在任一台節點,建立 c7-clustera,c7-clusterb cluster 群(cluster 名稱: c7-cluster):
pcs cluster setup --start --name c7-cluster c7-clustera c7-clusterb

在任一台節點,啟動 c7-cluster 所有節點:
pcs cluster start --all

每台節點 確認 Corosync 版本:
corosync-cfgtool -s
corosync-cmapctl | grep members
pcs status corosync

確認 Pacemaker 是否執行中:
ps axf

pcs status --full

檢查錯誤訊息:
journalctl | grep -i 'error'
除了沒有配置STONITH相關的訊息外,正確設定時不會有錯誤訊息。

進行下一步時再檢查一次設定是否OK:
crm_verify -L -V    #會出現 STONITH 的 error,是因為啟用 Pacemaker 中的 STONITH ,但尚未設定。這裡暫時先關閉它。

在配置 STONITH 前,Cluster 無法啟動 Resource,這裡先關閉 STONITH,後面的步驟再設定啟用它:
pcs property set stonith-enabled=false
crm_verify -L -V

測試環境是兩台主機,目前在Cluster 裡没有監控的 policy 主機時,設定值設為 ignore
pcs property set no-quorum-policy=ignore

為兩台主機設定一個 (VIP) Resource 設定:
pcs resource create ClusterIP ocf:heartbeat:IPaddr2 ip=192.168.60.170 cidr_netmask=32 op monitor interval=30s      #設定一個 cluster IP 192.168.60.170

補充:
查詢可用的資源參數:
pcs resource standards
pcs resource providers
pcs resource agents ocf:heartbeat

檢查設定 Cluster IP Resource 後的狀態:
pcs status

測試在發生問題時,是否會切換主機:
pcs cluster standby c7-clustera    #恢復指令 pcs cluster unstandby c7-clustera
或者
pcs cluster stop c7-clustera

到另一節點觀察 Cluster 狀況:
pcs status

設定 resource-stickiness (讓維護主機的服務暫時保留在手動移轉到其他節點的主機上),防止 Resource 在 Recovery 後移動:
[root@c7-clustera ~]# pcs resource defaults resource-stickiness=100
[root@c7-clustera ~]# pcs resource defaults
resource-stickiness: 100

補充:
取消 resource-stickiness 設定:
pcs resource defaults resource-stickiness=0
或者建立Resource有指定meta resource-stickiness時,則可用:
pcs resource meta ClusterIP resource-stickiness=0

安裝 Apache Server:
yum install -y httpd
重要:
安裝後不要 enable httpd 服務。主要在透過 Cluster 軟體管理服務不應該由系統管理。
但是,在將它增加到 Cluster 之前,手動啟動服務,驗證它是否有效,然後再次停止它。
否則新增的 WebSite 監控 Resource 將無法啟動。

防火牆如未關閉需開啟允許 http 服務:
firewall-cmd --permanent --add-service=http
flrewall-cmd --reload

每台節點 建立一個測試的網頁:
cat <<-END >/var/www/html/index.html
 <html>
 <body>My Test Site - $(hostname)</body>
 </html>
END

每台節點 建立一個監控 Apache 運作狀況的設定檔:
cat <<-END >/etc/httpd/conf.d/status.conf
 <Location /server-status>
    SetHandler server-status
    Require local
 </Location>
END

重啟 Apache 服務:
systemctl restart httpd.service
測試連線:
wget -O - http://localhost/server-status
或者
curl http://localhost/server-status

systemctl stop httpd.service      #測試上面的監控設定後,必須將 http 服務停止

配置監控 Apache Web Site 的 Cluster Resource:
pcs resource create WebSite ocf:heartbeat:apache configfile=/etc/httpd/conf/httpd.conf statusurl="http://localhost/server-status" op monitor interval=1min
pcs status


調整 Resource 啟動、停止、監控的時間(預設:20秒):
[root@c7-clustera ~]# pcs resource op defaults timeout=240s
[root@c7-clustera ~]# pcs resource op defaults
timeout: 240s

確認 Resource 執行在某一台主機上:
WebSite 運作於 Cluster 架構上,必須綁定一個連線 IP,在這裡設定 WebSite 綁定在 ClusterIP (VIP:192.168.60.170) 
(WebSite、ClusterIP 是之前建立的 Resource 名稱)
pcs constraint colocation add WebSite with ClusterIP INFINITY
pcs constraint
pcs constraint colocation

綁定 IP 後,利用瀏覽器連線,己經可以看到剛才建立的測試網頁:

補充:
如 Constraint 設定錯誤,移除不需要的綁定:
pcs constraint colocation remove <source_resource> <target_resource>
pcs constraint colocation remove WebSite ClusterIP

確保 Resource 按順序啟動和停止:
pcs constraint order ClusterIP then WebSite    #ClusterIP 的 resource 恢復時,觸發 WebSite 的 resource 也恢復運作

pcs constraint

設定 WebSite 預設啟動的節點(假設某一台的硬體資源較好,可以設定優先啟用服務在該台主機):
pcs constraint location WebSite prefers c7-clustera=50
pcs constraint

查看節點的順序權值分數:
crm_simulate -sL

強制手動移轉 WebSite Resource 到 c7-clusterb:
pcs constraint location WebSite prefers c7-clusterb=INFINITY
pcs constraint
pcs status

當完成維護時,可以刪除剛才手動移轉到 c7-clusterb 的 resource 綁定,首先取得綁定的 ID:
pcs constraint --full

例如刪掉 c7-clusterb:
pcs constraint remove location-WebSite-c7-clusterb-INFINITY
可以看到 Resource 還是停留在 c7-clusterb,是因為在前面的步驟有設定 pcs resource defaults resource-stickiness=100 讓服務停留在移轉後的主機上。
補充: 取消 resource-stickiness 設定 pcs resource defaults resource-stickiness=0 或者前面建立Resource有指定meta resource-stickiness時 則可用 pcs resource meta ClusterIP resource-stickiness=0


抄寫資料庫使用 DRDB
二台節點主機上匯入 GPG-KEY:

二台節點主機 安裝 DRDB 套件:
yum install -y kmod-drbd84 drbd84-utils

備註(我是用 CentOS 7.3。這個 bug 在 7.1 之後不知解決了沒?  我還是先下載修正程式了,因為文章作者有說明這個修正程式在軟體更新時會被取代。):
CentOS 7.1 附帶的 drbd84-utils 版本在 Pacemaker 中有一個錯誤。
在修訂之前,可從下列位址下載受影響的 script:
curl -o /usr/lib/ocf/resource.d/linbit/drbd 'http://git.linbit.com/gitweb.cgi?p=drbd-utils.git;a=blob_plain;f=scripts/drbd.ocf;h=cf6b966341377a993d1bf5f585a5b9fe72eaa5f2;hb=c11ba026bbbbc647b8112543df142f2185cb4b4b'

SELinux 設定 DRBD 權限(未關閉 SELinux):
semanage permissive -a drbd_t

防火牆未關閉須設定:
c7-clustera:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.60.156" port port="7789" protocol="tcp" accept'
firewall-cmd --reload

c7-clusterb:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.60.157" port port="7789" protocol="tcp" accept'
firewall-cmd --reload

台節點主機 建一個 LVM 磁區來測試:
新增一個空的磁碟做 LVM:
fdisk -l
fdisk /dev/sdb

每台節點主機 建 LV 空間來測試使用:
pvcreate /dev/sdb1
vgcreate testvg /dev/sdb1
lvcreate --name drbd-demo --size 1G testvg

配置 DRBD 資料庫:
cat <<END >/etc/drbd.d/wwwdata.res
resource wwwdata {
 protocol C;
 meta-disk internal;
 device /dev/drbd1;
 syncer {
  verify-alg sha1;
 }
 net {
  allow-two-primaries;
 }
 on c7-clustera {
  disk   /dev/testvg/drbd-demo;
  address  192.168.60.156:7789;
 }
 on c7-clusterb {
  disk   /dev/testvg/drbd-demo;
  address  192.168.60.157:7789;
 }
}
END
備註:
allow-two-primaries;    #可以兩台主機同時掛載

初始化台節點主機上的 DRBD 資料庫:
drbdadm create-md wwwdata

modprobe drbd
drbdadm up wwwdata

設定其中一台節點主機為 primary:
drbdadm primary --force wwwdata

如果立即檢查狀態,會看到正在同步的狀態:
cat /proc/drbd

確認二台節點主機 上的 DRBD 狀態:
cat /proc/drbd


格式化 Primary DRBD 磁區(Secondary 不需要):
mkfs.xfs /dev/drbd1

掛載資料夾:
mount /dev/drbd1 /mnt

建一個測試網頁:
cat <<-END >/mnt/index.html
 <html>
  <body>My Test Site - DRBD</body>
 </html>
END

建立測試網頁後,缷載 /mnt:
umount /dev/drbd1

設定 DRBD Cluster 配置:
pcs cluster cib drbd_cfg

建立 Resource 並建立一個 Clone 資源,以允許資源同時在兩台 DRBD 運作:
pcs -f drbd_cfg resource create WebData ocf:linbit:drbd drbd_resource=wwwdata op monitor interval=60s
pcs -f drbd_cfg resource master WebDataClone WebData master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true

檢查 WebDtat Resource 狀況:
pcs -f drbd_cfg resource show


提交更新 drbd_cfg 配置的設定:
pcs cluster cib-push drbd_cfg

觀察設定:
pcs status

載入 DRBD 模組(在 CentOS 7 系統安裝 DRBD 似乎不會自動載入 DRBD 模組):
echo drbd > /etc/modules-load.d/drbd.conf

DRBD Split-Brain 處理:
Split-Brain 發生原因是兩台 DRBD 斷開了連接,都以 Primary 身份來運行。當再連接後發現對方也是 primary 狀態,就會立刻自行又開連接。
手動恢復前,確認要保留哪一台的資料後,到另一台 DRBD 主機上執行下列指令:
pcs resource disable WebFS
pcs resource disable WebSite
drbdadm secondary wwwdata    #將該台 DRBD 設定為 Secondary
drbdadm disconnect wwwdata
drbdadm -- --discard-my-data connect wwwdata
確認是否正常連線,若依然是 StandAlone 則需手動執行下列指令連線:

drbdadm connect wwwdata

設定 Cluster 的 Filesystem,並設定 WebFS 必須在 Apache 啟動時先啟動:
已經有一個工作的DRBD設備,現在需要建一個掛載它的檔案系統:
pcs cluster cib fs_cfg
pcs -f fs_cfg resource create WebFS Filesystem device="/dev/drbd1" directory="/var/www/html" fstype="xfs"    #將運作中的 /dev/drbd1 掛載到 /var/www/html
pcs -f fs_cfg constraint colocation add WebFS with WebDataClone INFINITY with-rsc-role=Master
pcs -f fs_cfg constraint order promote WebDataClone then start WebFS

告訴 Cluster,Apache需要與檔案系統在相同的機器上運行,並且它必須在Apache可以啟動之前處於活動狀態:
pcs -f fs_cfg constraint colocation add WebSite with WebFS INFINITY
pcs -f fs_cfg constraint order WebFS then WebSite

檢查更新後的配置:
pcs -f fs_cfg constraint

pcs -f fs_cfg resource show

確認提交設定 fs_cfg 配置的設定:
pcs cluster cib-push fs_cfg
pcs status

測試 Cluster Failover 移轉:
pcs cluster standby c7-clusterb
或者
pcs cluster stop c7-clusterb

觀察移轉狀況:
pcs status

恢復 c7-clustera standby 狀態:
pcs cluster unstandby c7-clustera
pcs status --full


設定 Fence Server (STONITH: Shoot The Other Node In The Head,  aka. fencing)
保護數據,避免非預期同一 Cluster 主機同時重覆訪問同一資料庫而造成損壞。

設定 Fence Server 管理所有節點:
補充:
fence_xvm 需要 cpu 支持 kvm
檢查 CPU 是否支援KVM:
egrep -c '(vmx|svm)' /proc/cpuinfo
如果輸出是 0,以下 Fence Server 的部份就不用做了

以下的步驟設定是成功了,但運作上還是有問題。可能真的是 CPU 不支援 KVM 或漏了哪個步驟吧?
留待日後再測試。

網路環境
主機名稱
ip 位址
fincing
eth0: 192.168.60.159/24 (和 virbr0 設定為 brige)
virbr0: 192.168.122.1/24
c7-clustera
192.168.60.156/24
c7-clusterb
192.168.60.157/24
fence_xvm_vip
192.168.60.180/24

Fence server 網路卡介面 ifcfg-eth0 設定修改為:
內容:
DEVICE=eth0
ONBOOT=yes
DOMAIN=tw.company
SEARCH=tw.company
#NM_CONTROLLED=no
HWADDR=00:0c:29:d8:82:17
BRIDGE=virbr0

新增網路卡介面 ifcfg-virbr0 設定修改為:
內容:
DEVICE="virbr0"
TYPE=BRIDGE
ONBOOT=yes
BOOTPROTO=static
IPADDR="192.168.60.159"
NETMASK="255.255.255.0"
GATEWAY="192.168.60.254"
DNS1="192.168.60.253"

網路 brige 功能需要開啟 multicast querier:
暫時開啟:
echo 1 > /sys/class/net/virbr0/bridge/multicast_querier
固定開啟:
touch /etc/sysconfig/network-scripts/vnet_querier_enable
chmod 755 /etc/sysconfig/network-scripts/vnet_querier_enable
vi /etc/sysconfig/network-scripts/vnet_querier_enable
內容:
#!/bin/sh
if [[ $INTERFACE == virbr* ]]; then
    /bin/echo 1 > /sys/devices/virtual/net/$INTERFACE/bridge/multicast_querier
fi

建立 udev 規則檔案:
vi /etc/udev/rules.d/61-virbr-querier.rules
內容:
ACTION=="add", SUBSYSTEM=="net", RUN+="/etc/sysconfig/network-scripts/vnet_querier_enable"

檢查是否有載入 KVM 模組:
lsmod | grep 'kvm'


Fence server 安裝相關套件:
yum install -y fence-virt fence-virtd fence-virtd-libvirt fence-virtd-multicast fence-virtd-serial virt-manager

安裝套件後,查看 節點狀態:
virsh list

Fence Server 上產生 fence_xvm.key 金鑰:
mkdir -p /etc/cluster
dd if=/dev/urandom of=/etc/cluster/fence_xvm.key bs=1k count=4

在 c7-clustera,c7-clusterb 建立 /etc/cluster
ssh c7-clustera -- 'mkdir -p /etc/cluster'
ssh c7-clusterb -- 'mkdir -p /etc/cluster'

複製 fence_xvm.key 到 c7-clustera,c7-clusterb 主機內的 /etc/cluster
scp /etc/cluster/fence_xvm.key c7-clustera:/etc/cluster
scp /etc/cluster/fence_xvm.key c7-clusterb:/etc/cluster

配置fence_virtd,fence_virt.conf 設定檔:
fence_virtd -c

產生的 fence 設定檔位置:
/etc/fence_virt.conf

啟動 fence Service:
systemctl start fence_virtd.service
systemctl enable fence_virtd.service

防火牆設定(fence 主機與各節點都要開啟):
確認是否有安裝 firewalld:
rpm -q firewalld
如何有:
firewall-cmd --permanent --add-port=1229/tcp
firewall-cmd --permanent --add-port=1229/udp
firewall-cmd --reload

顯示連線狀況:
virsh list

在 c7-clustera,c7-clusterb 節點設定 fence_xvm stonith resource:
安裝 fence-virt:
yum install -y fence-agents-all fence-virt

在 c7-clustera,c7-clusterb,fencing 主機上驗證設定:
fence_xvm -o list      #正確配置時,會顯示所有節點狀態

若出現下列訊息,表示前面的網路 brige 設定有問題:
# fence_xvm -o list
Timed out waiting for response
Operation failed

確認 c7-clustera,c7-clusterb 的 stonith-enabled 為 true 的狀態:
pcs property show stonith-enabled

如果為 false 狀態,使用下列指令啟用 stonith-enabled:
pcs property set stonith-enabled=true

在 c7-clustera 建立一個 fencd_xvm_fc 的 resource,並加入 fencd_xvm_group 群組:
pcs stonith create fence_xvm_fc fence_xvm key_file=/etc/cluster/fence_xvm.key --group fence_xvm_group

查看設定:
pcs stonith

在 c7-clustera 建立一個 fencd_xvm_vip 的 IPaddr2 resource,並加入 fencd_xvm_group 群組:
pcs resource create fence_xvm_vip IPaddr2 ip=192.168.60.180 cidr_netmask=24 --group fence_xvm_group

查看設定狀態:
pcs status

重啟 c7-clustera:
stonith_admin --reboot c7-clustera      #正確配置時,c7-clustera 應已經重新開機
pcs status

補充:
新增、移除 Cluster 主機:
新增:
在 c7-clustera 上將主機加入現有的 cluster:
pcs cluster auth -u hacluster -p hacluster c7-clusterc
pcs cluster node add c7-clusterc

c7-clusterc 驗證其他節點 hacluster 密碼:
pcs cluster auth -u hacluster -p redhat1

c7-clusterc 上設定重啟後可啟動 cluster sevice:
pcs cluster enable
pcs cluster start
pcs status

在 c7-clustera 上設定 fencing 加入 c7-clusterc:
pcs stonith create fence_c7-clusterc fence_xvm pcmk_host_list="c7-clusterc" multicast_address="255.0.0.12" key_file="/etc/cluster/fence_xvm.key"
或者
pcs stonith create fence_c7-clusterc fence_virt port="c7-clusterc" pcmk_host_list="c7-clusterc" ipaddr="fencing"

檢查 cluster 狀態:
pcs stonith show

fence server 重啟 fence_virtd 服務:
systemctl restart fence_virtd.service

重啟 c7-clusterc 確認服務正常運作:
reboot
pcs status

移除:
pcs cluster node remove c7-clusterc
移除 Cluster 主機後,有些 Resource 需要重設定。



採用 iSCSI 磁碟安裝 GFS2 Cluster 檔案系統:
使用 SELinux 時會有額外的檔案屬性,使用 GFS2 檔案系统時好關閉 SELinux,否則會降低其效能。

iSCSI 伺服器:
我的例子有新增一台提供 iSCSI 服務的伺服器,讓兩台 cluster 主機掛載同一共享資料夾:。
參考之前的步驟:

也可以不要用 iSCSI Server。
利用 cluster 主機剩餘的硬碟空間(或 VMWare 新增一個空磁碟)。

GFS2 Cluster 節點設定:
設定 no-quorum-policy :
pcs property set no-quorum-policy=freeze

安裝 GFS2 相關套件:
GFS2 (Global File System) 全球檔案系統
DLM(Distributed Lock Manager)鎖定管理程式

yum install -y gfs2-utils lvm2-cluster dlm

c7-clustera、c7-clusterb 上啟用 Cluster DLM:
lvmconf --enable-cluster
ssh c7-clusterb -- 'lvmconf --enable-cluster'

c7-clustera、c7-clusterb 確認 locking_type = 3:
grep 'locking_type' /etc/lvm/lvm.conf | grep -v '#'
結果為:
locking_type = 3

建立一個名稱為 gfs2_dlm 的 controld resource 並且 clone:
pcs resource create gfs2_dlm systemd:dlm op monitor interval=30s clone interleave=true ordered=true

建立一個名稱為 gfs2_clvmd 的 clvm resource 並且 clone:
pcs resource create gfs2_clvmd clvm op monitor interval=30s clone interleave=true ordered=true

觀察設定狀況:
pcs status

置 DLM CLVMD cluster resource 屬性:
pcs constraint order start gfs2_dlm-clone then gfs2_clvmd-clone

pcs constraint colocation add gfs2_clvmd-clone with gfs2_dlm-clone
pcs constraint colocation

c7-clustera、c7-clusterb 修改 /etc/lvm/lvm.conf:
[root@c7-clustera ~]# egrep 'volume_list' /etc/lvm/lvm.conf | grep -v '#'
    volume_list = [ "gfs2_vg", "testvg" ]    #gfs2_vg 是等下要建的 VG, testvg 是前面 DRBD 所建立的 VG

在 c7-clustera 上建立一個 LVM 或其他格式的磁區給 GFS2 使用:
說明:
1.這裡是利用 iSCSI 方式使用同一個共享的磁區。

建置 LVM 磁區:
參考之前做的步驟:

我在建立 LV 磁區時有可能會遇到一個錯誤,原因是節點間不會同步 PV、VG 資訊,可能是 lvm.conf 的檔案未修改
網路上還有其他原因,有的是說要用 clvmd -R 讓 PV、VG 同步資訊,也有要用 multipath -r 讓不同主機資料同步。



格式化 GFS2 磁區:
mkfs.gfs2 -p lock_dlm -t c7-cluster:gfs2fs -j 2 /dev/gfs2_vg/gfs2_lv

確認兩台節點所掛載的 iSCSI 磁區 UUID 是相同的:
blkid | grep '/dev/sdc1'

建立一個 GFS2 掛載目錄:
mkdir /gfs2_data
ssh c7-clusterb -- 'mkdir /gfs2_data'

建立一個 gfs2_res 的 Filesystem Resource:
pcs resource create gfs2_res Filesystem device="/dev/gfs2_vg/gfs2_lv" directory="/gfs2_data/" fstype="gfs2" options="noatime,nodiratime" op monitor interval=10s clone interleave=true

設定 GFS2 DLM resource 的啟動、停止順序:
pcs constraint order start gfs2_clvmd-clone then gfs2_res-clone

驗證 GFS2 掛載 iSCSI 目錄:


DRBD 重新配置為GFS2 檔案系統:
pcs resource disable WebFS
如果 WebSite 的運作在 c7-clusterb,而在 c7-clustera 執行下列指令:
[root@c7-clustera ~]# mkfs.gfs2 -p lock_dlm -j 2 -t c7-cluster:WebSite /dev/drbd1
則會出現下列錯誤訊息:
/dev/drbd1: Read-only file system

[root@c7-clusterb ~]# mount /dev/drbd1 /mnt
[root@c7-clusterb ~]# cat <<-END >/mnt/index.html
<html>
<body>My Test Site - GFS2</body>
</html>
END
[root@c7-clusterb ~]# umount /dev/drbd1
[root@c7-clusterb ~]# drbdadm verify wwwdata
[root@c7-clusterb ~]# pcs resource show WebFS

[root@c7-clusterb ~]# pcs resource update WebFS fstype=gfs2
[root@c7-clusterb ~]# pcs resource show WebFS

[root@c7-clusterb ~]# pcs constraint colocation add WebFS with gfs2_dlm-clone INFINITY
[root@c7-clusterb ~]# pcs constraint order gfs2_dlm-clone then WebFS
[root@c7-clusterb ~]# pcs resource enable WebFS
測試:


Clone Resource 配置:
因為無法同時訪問兩個 Cluster IP address,所以沒有必要讓這兩個 IP Active。所以設定一個 Clone IP address 綁定到 ClusterIP(VIP) Resource:
配置 loadbalance resource:
[root@c7-clustera ~]# pcs cluster cib loadbalance_cfg
[root@c7-clustera ~]# pcs -f loadbalance_cfg resource clone ClusterIP clone-max=2 clone-node-max=2 globally-unique=true
[root@c7-clustera ~]# pcs -f loadbalance_cfg constraint


現在設定resource如何決定哪些請求由哪些主機處理。這裡指定clusterip_hash參數。sourceip 的取值表示著進入的來源IP地址將被 hash
[root@c7-clustera ~]# pcs -f loadbalance_cfg resource update ClusterIP clusterip_hash=sourceip

提交確認 loadbalance_cfg 配置:
[root@c7-clustera ~]# pcs cluster cib-push loadbalance_cfg
[root@c7-clustera ~]# pcs status

查看兩台主機的網路介面會發現各綁定了 VIP address : 192.168.60.170


Clone Filesystem 和 Apache Resource:
現在有一個 Cluster Filesystem,可以將請求 Loadbalance 要求綁定到一個共享的 VIP address,配置 Cluster 讓兩個節點都掛載檔案系統並回應Web請求。
[root@c7-clustera ~]# pcs cluster cib active_cfg
[root@c7-clustera ~]# pcs -f active_cfg resource clone WebFS
[root@c7-clustera ~]# pcs -f active_cfg resource clone WebSite
[root@c7-clustera ~]# pcs -f active_cfg constraint

通知Cluster允許將二台主機提升為DRBD Primary:
[root@c7-clustera ~]# pcs -f active_cfg resource update WebDataClone master-max=2

提交確認 Clone resource active_cfg 配置:
[root@c7-clustera ~]# pcs cluster cib-push active_cfg
[root@c7-clustera ~]# pcs resource enable WebFS
[root@c7-clustera ~]# pcs resource






2017年3月8日 星期三

Linux LVM (建立、擴充、移除LVM磁區) 操作筆記

一、建立新的LVM磁區(建立順序:PV、VG、LV)

使用 LVM 可在分割磁區時不必一次分割大量空間給各個 Partition,等日後哪個磁區空間不足時再分配之前未分配的空間或新增一顆硬碟來配給使用。

確認是否有安裝 LVM 套件:
rpm -qa lvm2

如果沒有需先安裝 lvm2 套件:
yum install -y lvm2

step:
1. 列出磁碟資訊
# fdisk -l

2. 進入磁碟分割功能
# fdisk /dev/sdb
Command (m for help): l     <--列出磁碟格式表

3. 新建一個磁區
Command (m for help): n     <--新建一個磁區 (磁區大小:20480M)

4. 變更磁碟格式 ID
Command (m for help): t     <--輸入 8e (8e磁碟格式 LVM)

5. 儲存磁區設定 & 離開磁碟格式功能
Command (m for help): w

6. 更新 Linux Kernel 分割表資訊,讓新 partition 不需重開機即可生效
# partprobe
或者
# partprobe /dev/sdb1

7. 建立 PV
# pvcreate /dev/sdb1
或者幾個磁區建立 PV
pvcreate /dev/sdb1 /dev/sdc1

8. 建立 VG
# vgcreate <vg_name> /dev/sdb1
或幾個 PV 建成一個 VG:
# vgcreate <vg_name> /dev/sdb1 /dev/sdb2/dev/sdc1

9. 建立 LV
# lvcreate -L 20476M -n testlv01 testvg    ### lvcreate -L 20476M(磁區大小) -n testlv01(LV名稱) testvg(VG名稱)
磁區大小數值會有些差異,要自己測試一下才能把剛才分割的 20GB 完全用掉。

10. 格式化 LV 磁區
查詢 LV 路徑:
# lvdisplay
格式化 testlv01
# mkfs.xfs /dev/testvg/testlv01

11. 建立掛載 LV 磁區的目錄
# mkdir /lvmdata
# mount /dev/testvg/testlv01 /lvmdata

12. 測試,COPY資到 lvmdata 底下,利用 df -h 查看變化
# df -h

補充指令:pvdisplay, vgdisplay, lvdisplay, pvscan, vgscan, lvscan



二、將 testvg 從 20480M 再加 20480M,總空間變為 40GB (將新的 PV 空間或未分配的磁碟空間加入已存在的 VG)
利用上面未分配的磁碟空間繼續作下面的練習:
1. 進入磁碟分割功能
# fdisk /dev/sdb
新增一顆硬碟
# fdisk /dev/sdc

2. 新建二個磁區
Command (m for help): n     <--利用之前未配置的空間再新建一個磁碟 (磁碟大小:20480M)

3. 變更磁碟格式 ID
Command (m for help): t     <--輸入 8e (8e磁碟格式 LVM)
因剛才又新增一個分割區,所以這邊要指定變更第2個分割區的磁碟格式 ID

4. 儲存磁區設定&離開磁碟格式功能
Command (m for help): w

5. 更新 Linux Kernel 分割表資訊,讓新 partition 不需重開機即可生效
# partporbe
# fdisk -l

6. 將分割好的磁區加入己存在的 VG
# vgextend testvg /dev/sdb2 /dev/sdc1   (testvg 是已存在的 VG)

7. 觀察 VG 磁區大小變化,原本 20GB 增加 sdb2,sdc1 後變為 60GB
# vgdisplay



三、將 testlv01 從 20480M 擴充加大到30720M (利用新加入的 VG 來擴大 LV)
1. 增加10G磁區空間到 testlv01
lvresize -L +10240M /dev/testvg/testlv01

2. 上圖己經成功增加 LV 磁區空間,但還必須用 xfs_growfs 讓 testlv01 檔案系統擴大
# xfs_growfs /dev/testvg/testlv01     #(xfs磁碟格式指令) 



四、移除 testlv01、testvg、pv (移除 LVM 空間依循步驟)
1. umount /lvmdata
2. lvremove /dev/testvg/testlv01
3. vgchange -an testvg      # vgchange -an <VG_name> 讓 VG 不具有 Active 標誌
4. vgremove testvg
5. pvremove /dev/sdx#


、縮小 LVM 空間 (縮小 LVM 空間前必須備份資料,否則資料將會移失)
1. 縮小 LV 空間
lvresize -L -512M /dev/testvg/testlv01

1.1 利用 lvdispaly 觀察 LV 空間
# lvdisplay

2. 縮小 VG 空間
# umount /lvmdata
# lvremove /dev/testvg/testlv01
# vgreduce testvg /dev/sdb2

2.1 利用 vgdispaly 觀察 LVM 變化
# vgdisplay
# pvdisplay


LVM 指令列表:

2017年3月5日 星期日

CentOS 7 安裝 Plex Media Server

下載 Plex Server 套件

CentOS 64bit 套件:

安裝 Plex 套件:

設定開機啟動:
systemctl enable plexmediaserver.service
systemctl start plexmediaserver.service

到 Plex 官網註冊一個帳號:

註冊後第一次登入自己的 Plex Server 要在同一網段:
http://local_ip_address:32400/web

之後可以利用免費的 DNS 服務註冊一個網址,就可以使用網址連線了。 

設定從外部連線 Plex Server:
1.防火牆設備要設定 NAT 埠號 32400 從外部進入到內部 Plex Server
2.設定 Plex Server 使用固定連線埠號

3.在主機內新增一個資料夾存放媒體檔案,上傳多媒體檔案
mkdir /PlexMedia

4.回到 Plex Server 網頁首頁


依步驟選擇剛才新增的資料夾,到這就己經可以使用 Plex Client 軟體 或者直接利用瀏覽器連線觀賞


5.有時明明有放檔案到媒體庫,但就是無法看到檔案。可以調整一下掃描器設定試試。



2017年3月3日 星期五

openshift OC 指令部署 CentOS 7



要使用 openshift Enterprise 系統,必須先註冊一個帳號及等待開通帳號的通知

openshift 網址:
https://www.openshift.com/?sc_cid=7016000000128KfAAI&gclid=Cj0KEQiAot_FBRCqt8jVsoDKoZABEiQAqFL76AwuqrAKItlr6RUqwcFz_gxzdOuhd8_OJw6tKwjUaQ0aAtfL8P8HAQ

收到帳號開通的通知後就可以登入 openshift Enterprise WEB 介面了。

下載 OC 執行檔
for Linux
for Linux
將下載的壓縮檔解壓縮,把 oc 放到系統 path 環數變數下的任一目錄下
登入 openshift:
(openshift 右上角 <Command Line Tools> 頁面裡的 login 連結網址)
oc login https://api.preview.openshift.com --token=...click to show token...

for Windows
for Windows
將下載的壓縮檔解壓縮,把 oc.exe 放到系統 path 環數變數下的任一目錄下
開啟 DOS 視窗:
(openshift 右上角 <Command Line Tools> 頁面裡的 login 連結網址)
oc login https://api.preview.openshift.com --token= ...click to show token...

到此順利的話,就已經登入 openshift 管理後台。



部署一個空的 CentOS 7 系統
oc run centos7 --image=centos /usr/sbin/init

查尋看有哪些 pods
oc get pods

登入 pod
oc exec -it <pod name> sh

或啟動後在 WEB 上也可以登入 terminal





2017年3月1日 星期三

CentOS 7 安裝 iSCSI Server

SERVER 端:
yum 安裝 iSCSI 套件
yum install -y targetcli

防火牆如果沒有關掉,必須打開 iSCSI 所使用的 Port
firewall-cmd --permanent --add-port=3260/tcp
firewall-cmd --reload

啟動 iSCSI 服務
systemctl start target.service
systemctl enable target.service

建一個資料夾存放測試的虛擬磁碟影像檔
mkdir /iscsi_disks

產生二個虛擬磁碟影像檔
dd if=/dev/zero of=/iscsi_disks/linux-disk.img bs=1M count=1024
dd if=/dev/zero of=/iscsi_disks/windows-disk.img bs=1M count=1024

登入 iSCSI 管理介面
targetcli

iSCSI 的設定架構


建立 iSCSI 檔案連結要分享的虛擬磁碟影像檔
iSCSI 磁碟有四種類型可以選擇:
cd backstores/
fileio/ create linux-disk /iscsi_disks/linux-disk.img
block/ create windows-disk /iscsi_disks/windows-disk.img
類型:
block         #用 block 方式分享
fileio          #將檔案建於 file system 之上, 再通過 iSCSI 當做 block device 分享出去
pscsi         #連結的設備原本就是 iSCSI 設備時,選 pscsi
remdisk    #不需長久儲存時,可用 ramdisk 分享

建立 iSCSI target 名稱
cd /iscsi
iscsi> create iqn.2017-03.company.tw:linux.disk     #這邊的網域名稱要反轉輸入,也可以直接輸入 create 讓它自動產生
iscsi> create iqn.2017-03.company.tw:windows.disk

建立 ACL(access control list) 存取清單,iSCSI 預設是不讓任何人存取,所以必須設定存取名單
cd iscsi/iqn.2017-03.company.tw:linux.disk/tpg1/acls
create iqn.2017-03.company.tw:linux-pc    #client 連線時所要設定的[啟動器名稱 || InitiatorName]
cd /iscsi/iqn.2017-03.company.tw:windows.disk/tpg1/acls
create iqn.2017-03.company.tw:windows-pc

連結 LUN
cd /iscsi/iqn.2017-03.company.tw:linux.disk/tpg1/luns
create /backstores/fileio/linux-disk
cd /iscsi/iqn.2017-03.company.tw:windows.disk/tpg1/luns
create /backstores/block/windows-disk

建立 portal (iSCSI 預設會建立一個 0.0.0.0:3260 如無特殊要求使用預設值即可)
cd /iscsi/iqn.2017-03.company.tw:linux.disk/tpg1/portals
create 192.168.60.160    #可以直接輸入 create 讓它自動產生
cd /iscsi/iqn.2017-03.company.tw:windows.disk/tpg1/portals
create 192.168.60.160

若出現 <Could not create NetworkPortal in configFS>,表示系統已先建立 0.0.0.0:3260 的 portal
先刪除舊的 portal 建立新的
cd /iscsi/iqn.2017-03.company.tw:linux.disk/tpg1/portals/
delete 0.0.0.0 3260

存檔、離開
cd /
saveconfig
exit

完成的設定:


其他設定:
關閉 tpg1 密碼驗證       #連線時,server messages log 出現 <Target is enforcing iSCSI Authentication, login failed> 登入失敗,可關閉 authentication 驗證來測試
cd /iscsi/iqn.2017-03.company.tw:windows.disk/tpg1
set attribute authentication=0

關閉 tpg1 的 ACL
cd /iscsi/iqn.2017-03.company.tw:windows.disk/tpg1
set attribute generate_node_acls=0

如要設定 iSCSI 連線密碼
targetcli
cd /iscsi/iqn.2017-03.company.tw:windows.disk/tpg1/acls/iqn.2017-03.company.tw:windows-pc/
#Linux Client 設定密碼
set auth userid=usr
set auth password=pwd
get auth


Windows 用戶端:
(Windows 7 正常連線,Windows 10、2012 要一直重試,需要一點運氣)
控制台 > 系統管理工具 > iSCSI 啟動器 > 設定 <啟動器名稱>
輸入:
iqn.2017-03.company.tw:windows-pc    #名稱要與 Server iSCSI 建立 ACL 設定的名稱相同
(為了測試方便,Linux iSCSI Server 裡把 windows.disk 的 password 驗證關閉了)



電腦 > 管理 > 磁碟管理,會多出一個<未配置>的磁區




Linux 用戶端:
安裝 iSCSI Client 軟體
yum install -y iscsi-initiator-utils

編輯設定檔
vi /etc/iscsi/initiatorname.iscsi
內容:
InitiatorName=iqn.2017-03.company.tw:linux-pc    #名稱要與 Server iSCSI 建立 ACL 設定的名稱相同

重啟用戶端
systemctl restart iscsid.service

搜找可用的 iscsi server 分享的設備
iscsiadm -m discovery -t st -p 192.168.60.160


登入or登出 iscsi 設備
iscsiadm -m node -T iqn.2017-03.company.tw:linux.disk -p 192.168.60.160 --[login | logout]

觀察線後是否有多出一個硬碟
# fdisk -l

# file /dev/sdb

格式化及掛載 iscsi 硬碟
mkdir /iscsidisk
mkfs.xfs /dev/sdb
mount /dev/sdb /iscsidisk

開機掛載 iSCSI
先查詢 id 碼:
blkid | grep /dev/sdb
/dev/sdb: UUID="eb9cbf2f-fce8-413a-b770-8b0f243e8ad6" TYPE="xfs"

vi /etc/fstab
/dev/sdb: UUID=eb9cbf2f-fce8-413a-b770-8b0f243e8ad6 /iscsidisk xfs default,_netdev 0 0

刪掉不要的iscsi target

# iscsiadm -m node -o delete -T iqn.2017-03.company.tw:linux.disk



CubeCOS 虛擬機刪除網路介面,且主機內沒有 virtio 驅動程式成為孤島主機時,進行 virtio iso 掛載流程

 # 當 CubeCOS 虛擬機刪除網路介面,且主機內沒有 virtio 驅動程式成為孤島主機時,進行 virtio iso 掛載流程。 # 步驟一:確認目標虛擬機的底層名稱 # 在 Compute Node(計算節點)上列出運行中的 instance,並反查對應的 OpenSt...