LINUX 高可用羣集之 ~Corosync~

Corosync:它屬於OpenAIS(開放式應用接口規範)中的一個項目corosync一版本中自己不具 備投票功能,到了corosync 2.0以後引入了votequorum子系統也具有了投票功能了,若是咱們用的是1版本的,又須要用到票數作決策時那該如何是好呢;固然,在紅帽上把 cman + corosync結合起來用,可是早期cman跟pacemaker無法結合起來,若是想用pacemaker又想用投票功能的話,那就把cman當成 corosync的插件來用,把cman當成corodync的投票功能,固然,這裏結合了兩個了Messaging Lader;Corosync目前有兩個主流的版本:一個是2系列的,另外一個是1系列的穩定版;2版本和1版本差異很大,1版本不具備投票功能,2版本之 後引入了votequorum後支持投票功能了;OpenAIS自從誕生以後,紅帽就基於這個規範研發了一個高可用集羣的解決方案叫cman,併爲cman提供了rgmangaer做爲資源管理器,而且容合conga全生命週期的管理接口造成了RHCS;node

   Conrosync是從OpenAIS這個大項目中分支出來的一個項目,而Pacemaker是heartbeat v3版本中分裂出來專門用於提供高可用集羣CRM的組件,功能十分強大, Coreosync在傳遞信息的時候能夠經過一個簡單的配置文件來定義信息傳遞的方式和協議等,Corosync能夠提供一個完整的HA功 能,Corosync是將來的發展方向,在之後的新項目裏,通常採用Corosync,而heartbeat_gui能夠提供很好的HA管理功能,能夠實 現圖形化的管理。

  Pacemaker是一個集羣管理器。它利用首選集羣基礎設施(OpenAIS 或heartbeat)提供的消息和成員能力,由輔助節點和系統進行故障檢測和回收,實現性羣集服務(亦稱資源)的高可用性。

corosync+pacemaker:在配置corosync時最好具備三個以上的節點,而且節點個數爲奇數個,若是使用偶數個節點的話也不要緊,只是要關閉不具備法定票數的決策策略功能;

實現過程:
   一、雙機互信須要設置好,hosts文件須要解析好,時間要同步    python

# vim /etc/hosts
172.16.27.1 node1.tanxw.com
172.16.27.2 node2.tanxw.com
# ssh-keygen -t rsa -P ‘’
# ssh-copy-id -i id_rsa.pub node2.tanxw.com

   二、安裝corosync,這裏咱們用ansible來安裝,要使用ansible在一臺主機上操做多臺主機得須要事先安裝ansible,那這裏咱們 就先說說安裝和配置使用ansible,安裝ansible也能夠用yum來安裝,不過須要解決依賴關係:    mysql

# yum -y install python-jinja2   解決依賴關係
# yum -y install ansible
安裝好以後再去/etc/ansible下配置兩個節點的hostname:
# vim /etc/ansible/hosts  把裏面的內容全都註釋掉,加下面你的節點hostname
[corosync]
node1.tanxw.com
node2.tanxw.com 

   保存退出!
   咱們這裏使用172.16.27.0這臺主機安裝ansible,操做172.16.27.1和.2這兩臺主機,測試一下:    web

# yum -y install python-jinja2   解決依賴關係
# yum -y install ansible
安裝好以後再去/etc/ansible下配置兩個節點的hostname:
# vim /etc/ansible/hosts  把裏面的內容全都註釋掉,加下面你的節點hostname
[corosync]
node1.tanxw.com
node2.tanxw.com

   三、時間同步,須要事先配置好一臺時間服務器,而後在crontab -e中輸入:    sql

# crontab -e
*/5 * * * * /usr/sbin/ntpdte 172.16.27.0 &> /dev/null   表示每隔5分鐘同步一次

   好,準備工做作好了以後就能夠安裝corosync了,使用ansible查看兩個節點是否已經安裝了corosync:shell

    

[root@node0 ~]# ansible corosync -m shell -a 'rpm -q corosync'
node2.tanxw.com | FAILED | rc=1 >>
package corosync is not installed
node1.tanxw.com | FAILED | rc=1 >>
package corosync is not installed
# ansible corosync -m yum -a "name=corosync state=present"  所有輸出顯示爲綠色說明安裝成功
[root@node0 ~]# ansible corosync -m shell -a 'rpm -q corosync'  再查看一下corosync的安裝版本
node2.tanxw.com | success | rc=0 >>
corosync-1.4.1-17.el6.x86_64
node1.tanxw.com | success | rc=0 >>
corosync-1.4.1-17.el6.x86_64
# cp /etc/corosync/corosync.conf.example /etc/corosync.conf  複製一份corosync的樣本配置文件
# vim /etc/corosync/corosync.conf   編輯配置文件修改以下內容
compatibility: whitetank    #這個表示是否兼容0.8以前的版本
totem {    #圖騰,這是用來定義集羣中各節點中是怎麼通訊的以及參數
        version: 2        #圖騰的協議版本,它是種協議,協議是有版本的,它是用於各節點互相通訊的協議,這是定義版本的
        secauth: on        #表示安全認證功能是否啓用的
        threads: 0        #實現認證時的並行線程數,0表示默認配置
        interface {        # 指定在哪一個接口上發心跳信息的,它是個子模塊
                ringnumber: 0    #環號碼,集羣中有多個節點,每一個節點上有多個網卡,別的節點能夠接收,同時咱們本機的別一塊網卡也能夠接收,爲了不這些信息在這樣的環狀發送,所以要爲這個網卡定義一個惟一的環號碼,以免心跳信息環發送。
                bindnetaddr: 192.168.1.1        # 綁定的網絡地址
                mcastaddr: 226.94.1.1    #多播地址,一對多通訊
                mcastport: 5405        # 多播端口
                ttl: 1        # 表示只向外播一次
        }
}
logging {        # 跟日誌相關
        fileline: off
        to_stderr: no        # 表示是否須要發送到錯誤輸出
        to_logfile: yes        #是否是送給日誌文件
        to_syslog: no        #是否是送給系統日誌
        logfile: /var/log/cluster/corosync.log        #日誌文件路徑
        debug: off        #是否啓動調試
        timestamp: on        #日誌是否須要記錄時間戳
        logger_subsys {        #日誌的子系統
                subsys: AMF
                debug: off
        }
}
amf {        # 跟編程接口相關的
        mode: disabled
}
service {  #定義一個服務來啓動pacemaker
    ver: 0    #定義版本
    name: pacemaker  #這個表示啓動corosync時會自動啓動pacemaker
}
aisexec {  #表示啓動ais的功能時以哪一個用戶的身份去運行的
    user: root
    group: root  #其實這個塊定義不定義均可以,corosync默認就是以root身份去運行的
}

這裏咱們改一個隨機數墒池,再把配置好的corosync的配置和認證文件複製到另外一個節點上去:    編程

# mv /dev/random /dev/m
# ln /dev/urandom /dev/random  若是這把這個隨機數墒池改了能夠會產生隨機數不夠用,這個就要敲擊鍵盤給這個墒池一些隨機數;生成完這個key後把連接刪除,再把墒池改回來;不過這樣改能夠會有點爲安全,不過作測試的應該沒關係;
# corosync-keygen
# rm -rf /dev/random
# mv /dev/m /dev/random
對於corosync而言,咱們各節點之間通訊時必需要可以實現安全認證的,要用到一個密鑰文件:
# corosync-keygen    # 生成密鑰文件,用於雙機通訊互信,會生成一authkey的文件
# scp authkey corosync.conf node2.tanxw.com:/etc/corosync/   在配置好的節點上把這兩個文件複製給另外一個節點上的corosync的配置文件中去

安裝pacemakerbootstrap

   # ansible corosync -m yum -a 「name=pacemaker state=present」vim

   咱們要想使用pacemaker配置的話須要安裝一個pacemaker的接口,它的這個程序的接口叫crmshell,它在新版本的 pacemaker已經被獨立出來了,再也不是pacemaker的組成部分了,早期裝上pacemaker就會自帶有crmshell,所以要想用 crmshell的話得去安裝crmshell,而安裝crmshell又依賴於pssh的相關包,所以得安裝這兩個組件,(這裏的這兩個包是本身製件 的),哪一個節點配置就安裝在哪一個節點上就能夠了,也無需兩個節點都安裝這兩個包:    安全

crmsh-1.2.6-4.el6.x86_64.rpm
pssh-2.3.1-2.el6.x86_64.rpm
# yum -y install crmsh-1.2.6-4.el6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm

 

   一切都OK了以後就能夠啓動服務了,兩個節點都須要啓動:    

   wKioL1NXyRmBSNL3AABYjROFGpk958.jpg

   wKioL1NXySOyAA8hAABgi5IYFDw826.jpg

   在這裏crm是一個很複雜的命令,能夠在命令行直接輸入crm進入crm的命令行模式:# crm

   那在這裏,咱們如何去配置一個資源呢,雖然它跟heartbeat略有區別,可是概念基本上是同樣的,下面咱們就來配置一個web資源吧!
   因爲咱們的corosync默認是啓用stonith功能的,可是咱們這裏沒有stonith設備,若是咱們直接去配置資源的話,因爲沒有 stonith功能,因此資源的切換並不會完成,因此要禁用stonith功能,但禁用stonoith須要咱們去配置集羣的全局stonith屬性,全 局屬性是對全部的節點都生效;    

[root@node1 corosync]# crm configure    #進入crm命令行模式配置資源等
crm(live)configure# property    #切換到property目錄下,能夠用兩次tab鍵進行補全和查看
usage: property [$id=<set_id>] <option>=<value>    # property的用法和格式
crm(live)configure# property stonith-enabled=false        #禁用stonith-enabled
crm(live)configure# verify        #檢查設置的屬性是否正確
crm(live)configure# commit    #檢查沒問題就能夠提交了
crm(live)configure# show        #查看當前集羣的全部配置信息
node node1.tanxw.com
node node2.tanxw.com        #兩個節點
property $id="cib-bootstrap-options" \  
    dc-version="1.1.10-14.el6-368c726" \    #DC的版本號
    cluster-infrastructure="classic openais (with plugin)" \    #集羣的基礎架構,使用的是OpenAIS,插件式的
    expected-quorum-votes="2" \        #指望節點的票數
    stonith-enabled="false"        #禁用stonith功能
crm(live)configure#

   查看一下節點的運行狀態:

   wKioL1NXyVSxH83_AAFMy2iN2yY039.jpg

   要注意:若是一個節點掛了,就不擁有法定票數了,那資源是不會切換的
   集羣的策略有幾種:
   stopped    :中止服務    
   ignore    :忽略,繼續運行    
   freeze    :凍結,已經鏈接的請求繼續響應,新的請求再也不響應    
   suicide    :自殺,將服務kill掉    

 

   再進入crm定義咱們所須要的資源吧!  

crm(live)# configure
crm(live)configure# primitive webip ocf:heartbeat:IPaddr params ip=172.16.27.88
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# show
node node1.tanxw.com
node node2.tanxw.com
primitive webip ocf:heartbeat:IPaddr \
    params ip="172.16.27.88"
property $id="cib-bootstrap-options" \
    dc-version="1.1.10-14.el6-368c726" \
    cluster-infrastructure="classic openais (with plugin)" \
    expected-quorum-votes="2" \
    stonith-enabled="false"
crm(live)configure#

   wKiom1NXyl_jJi7eAAIiaeSV140988.jpg

   wKioL1NXym2zahYQAALzkd6oiDk304.jpg    

   定義一個組,把以後定義的資源加到這個組裏面去:
   # group weservice webip webserver

   wKioL1NXypiRQkNhAAMNOsmOv_M296.jpg

   讓node1節點離線:
   wKioL1NXyuDDZnjwAAH10_rL48M476.jpg

   好了,這種功能咱們也完成了,若是讓node1上線它也不會轉回的,由於咱們沒有定義它的傾向性和故障轉回,因此node1回來就回來吧,而服務依然運行在node2上;
   crm(live)node# online node1.tanxw.com   讓node1重新上線    

 


 

 

 DRBD (Distributed Replicated Block Device)分佈式複製塊設備,它是 Linux 平臺上的分散式儲存系統,一般用於高可用性(high availability, HA)集羣中。DRBD 相似磁盤陣列的RAID 1(鏡像),只不過 RAID 1 是在同一臺電腦內,而 DRBD 是透過網絡。


DRBD Resource:DRBD所具備的幾種屬性
   resource name:可使用除空白字符外的任意ACSII表中的字符;
   drbd設備:drbd的設備的訪問路徑,設備文件/dev/drbd#;
   disk:各節點爲組成此drbd設備所提供的塊設備,一般是一個磁盤分區;
   網絡屬性:節點間爲了實現跨主機磁盤鏡像而使用的網絡配置;
   注意:用戶空間工具與drdb與內核中使用的模塊版本要保持一致,只有在使用drbdadm工具時纔會讀取配置文件,對多個資源的公共配置,能夠提取出來只配置一次,一般保存在Common中,此外還有global配置,這種配置跟資源自己沒有關係的;

drbd的組成部分:第一部分用戶空間工具;第二部分是內核模塊(在2.6.33及之後版本的內核直接在內核中就有了)
   用戶空間工具:跟內核版本關係比較鬆散,只要是能適用於CentOS 6及對應硬件平臺的就OK;
   內核模塊:必須與當下內核版本嚴格對應;其中drbd內核模塊代碼已經整合進Linux內核2.6.33之後的版本中,所以,若是您的內核版本高於此版本的話,你只須要安裝管理工具便可;不然,您須要同時安裝內核模塊和管理工具兩個軟件包,而且此二者的版本號必定要保持對應。

進程間通訊的三種方式:消息序列、旗語及共享內存:

什麼是消息隊列:
   消息被髮送到隊列中,"消息隊列"是在消息的傳輸過程當中保存消息的容器。消息隊列管理器在將消息從它的源中繼到它的目標時充當中間人。隊列的主要目的是 提供路由並保證消息的傳遞;若是發送消息時接收者不可用,消息隊列會保留消息,直到能夠成功地傳遞它;消息隊列就是一個消息的鏈表。能夠把消息看做一個記 錄,具備特定的格式以及特定的優先級。對消息隊列有寫權限的進程能夠向消息隊列中按照必定的規則添加新消息;對消息隊列有讀權限的進程則能夠從消息隊列中 讀走消息。消息隊列是隨內核持續的。    

什麼是旗語、什麼是信號量:
   Linux的旗語就是操做系統原理中的信號量,有PV操做,釋放旗語會自動喚醒下一個等待獲取旗語的進程;
   爲了防止出現因多個程序同時訪問一個共享資源而引起的一系列問題,咱們須要一種方法,它能夠經過生成並使用令牌來受權,在任一時刻只能有一個執行線程訪 問代碼的臨界區域。臨界區域是指執行數據更新的代碼須要獨佔式地執行。而信號量就能夠提供這樣的一種訪問機制,讓一個臨界區同一時間只有一個線程在訪問 它,也就是說信號量是用來調協進程對共享資源的訪問的。
信號量是一個特殊的變量,程序對其訪問都是原子操做,且只容許對它進行等待(即P(信號變量))和發送(即V(信號變量))信息操做。最簡單的信號量是隻能取0和1的變量,這也是信號量最多見的一種形式,叫作二進制信號量。而能夠取多個正整數的信號量被稱爲通用信號量。

什麼是共享內存:
   顧名思義,共享內存就是容許兩個不相關的進程訪問同一個邏輯內存。共享內存是在兩個正在運行的進程之間共享和傳遞數據的一種很是有效的方式。不一樣進程之 間共享的內存一般安排爲同一段物理內存。進程能夠將同一段共享內存鏈接到它們本身的地址空間中,全部進程均可以訪問共享內存中的地址,就好像它們是由用C 語言函數malloc分配的內存同樣。而若是某個進程向共享內存寫入數據,所作的改動將當即影響到能夠訪問同一段共享內存的任何其餘進程。

 

數據存儲的幾種類型:

wKioL1NWUGGQ8YFWAABRFCUBqFA797.gif 9

 

1.1存儲的概念與術語

1.1.3 DAS 介紹

DAS 是直連式存儲(Direct-Attached Storage)的簡稱,是指將存儲設備經過SCSI接口 或光纖通道直接鏈接到一臺計算機上。當服務器在地理上比較分散,很難經過遠程進行互連 時,DAS是比較好的解決方案。可是這種式存儲只能經過與之鏈接的主機進行訪問,不能實現數據與其餘主機的共享,同時,DAS會佔用服務器操做系統資源, 例如CPU資源、IO資 源等,而且數據置越大,佔用操做系統資源就越嚴重。

  NAS:(Network Attach Srorage)網絡附加存儲,它 就是個文件服務器,是文件系統級別,NAS和傳統的文件存儲服務或直接存儲設備不一樣的地方在於NAS設備上面的操做系統和軟件只提供了數據存儲、數據訪 問、以及相關的管理功能;此外,NAS設備也提供了不止一種文件傳輸協議。NAS系統一般有一個以上的硬盤,並且和傳統的文件服務器同樣,一般會把它們組 成RAID來提供服務;有了NAS之後,網絡上的其餘服務器就能夠沒必要再兼任文件服務器的功能。NAS的型式不少樣化,能夠是一個大量生產的嵌入式設備, 也能夠在通常的計算機上運行NAS的軟件。

NAS用的是以文件爲單位的通訊協議,例如像是NFS(在UNIX系統上很常見)或是SMB(常 用於Windows系統)。NAS所用的是以文件爲單位的通訊協議,你們都很清楚它們的運做模式,相對之下,存儲區域網絡(SAN)用的則是以區塊爲單位 的通訊協議、一般是經過SCSI再轉爲光纖通道或是iSCSI。(還有其餘各類不一樣的SAN通訊協議,像是ATA over Ethernet和HyperSCSI,不過這些都不常見。)

  SAN:(Storage Area Network)存儲區域網絡,把 SCSI協議藉助於其它網絡協議實現傳送的;1991年,IBM公司在S/390服務器中推出了ESCON(Enterprise System Connection)技術。它是基於光纖介質,最大傳輸速率達17MB/s的服務器訪問存儲器的一種鏈接方式。在此基礎上,進一步推出了功能更強的 ESCON Director(FC SWitch),構建了一套最原始的SAN系統。
它是一種高速網絡或子網絡,提供在計算機與存儲系統之間的數據傳輸。存儲設備是指一臺或多臺用以存儲計算機數據的磁盤設備,一般指磁盤陣列。

DAS、NAS和SAN三種存儲方式比較  
   存儲應用最大的特色是沒有標準的體系結構,這三種存儲方式共存,互相補充,已經很好知足企業信息化應用。
從    鏈接方式上對比,DAS採用了存儲設備直接鏈接應用服務器,具備必定的靈活性和限制性;NAS經過網絡(TCP/IP,ATM,FDDI)技術鏈接存儲 設備和應用服務器,存儲設備位置靈活,隨着萬兆網的出現,傳輸速率有了很大的提升;SAN則是經過光纖通道(Fibre Channel)技術鏈接存儲設備和應用服務器,具備很好的傳輸速率和擴展性能。三種存儲方式各有優點,相互共存,佔到了磁盤存儲市場的70%以上。 SAN和NAS產品的價格仍然遠遠高於DAS.許多用戶出於價格因素考慮選擇了低效率的直連存儲而不是高效率的共享存儲。
   客觀的說,SAN和NAS系統已經能夠利用相似自動精簡配置(thin provisioning)這樣的技術來彌補早期存儲分配不靈活的短板。然而,以前它們消耗了太多的時間來解決存儲分配的問題,以致於給DAS留有足夠的 時間在數據中心領域站穩腳跟。此外,SAN和NAS依然問題多多,至今沒法解決。

 

DRBD在遠程傳輸上支持三種模式:
   一、異步:所謂異步就是指數據只須要發給本地的TCP/IP協議棧就能夠了,本地存完就OK;而DRBD只須要把數據放到TCP/IP協議棧,放到發送隊列中準備發送就返回了;這種方式更高效;
   二、半同步:數據已經發送到對方的TCP/IP協議棧上,對方的TCP/IP協議棧已經把數據接收下來了就返回,數據存不存下來就無論了;
   三、同步:數據必須確保對方把數據寫入對方的磁盤再返回的就叫同步;這種方式數據更可靠;

官方提供的DRBD的工做流程圖:

   wKiom1NgbRPzAB4LAABNdBRd5XE362.gif

 


====================DRBD + Corosync、Pacemaker實現DRBD角色自動切換=======================


在 運行drbd時,他並不會自動完成角色的切換,那怎麼讓它具備這樣的功能呢,這裏就得用到Corosync+Pacemaker了,結合 corosync+pacemaker的drbd就能夠自動完成角色的切換,一旦一個drbd的節點出現故障就能夠自動切換到別一個節點上繼續提供服務, 那接下來咱們就來配置一下drbd + corosync、pacemaker的實現;

 

第一步:配置兩個節點上的雙機互信,這步我前面的博文中已經寫到過了,能夠參數前面的博文:CentOS 6.5 heartbeat高可用集羣的詳解實現以及工做流程;

 

第二步:安裝DRBD程序包,這一步必定要格外注意版本匹配問題:

內核模塊程序包必定要跟你的系統內核保持一致,uname -r查看你的內核版本,內核模塊的版本必需要嚴格對應,而用戶空間的模塊就不那麼嚴格要求了,兩個節點的時間也須要保持一致性;
drbd-8.4.3-33.el6.x86_64.rpm   -->用戶空間工具
drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm   -->內核空間模塊,這個必需要跟內核版本保持一致

   wKioL1Ng767jDONvAACWfkcB7WQ111.jpg

   wKiom1Ng8AOzkV6kAAA75slrSoQ957.jpg

# yum -y install drbd-8.4.3-33.el6.x86_64.rpm drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm        每一個節點都須要安裝上這兩個程序包

   安裝完成能夠看一下drbd的配置文件:

# vim /etc/drbd.conf   主配置文件
# vim /etc/drbd.d/global_common.conf  全局和common的配置
global {  #全局配置
        usage-count no;   #這個爲yes表示若是你本機能夠鏈接互聯網時drbd會經過互聯網收集到你安裝drbd的信息,官方統計說又多了一我的使用drbd實例,不用能夠改成no
        # minor-count dialog-refresh disable-ip-verification
}
common {
        handlers {    #處理器
                # These are EXAMPLE handlers only.
                # They may have severe implications,
                # like hard resetting the node under certain circumstances.
                # Be careful when chosing your poison.
                pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";    定義了若是主節點降級了怎麼處理的
                pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";    這個定義了若是有腦裂了以後找不到主節點怎麼處理的
                local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";    定義了一旦本地節點發生IO錯誤時應該怎麼處理
                # fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
                # split-brain "/usr/lib/drbd/notify-split-brain.sh root";
                # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
                # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";
                # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
        }
        startup {    定義一個節點啓動時另外一個節點應該怎麼作              
                # wfc-timeout(等待另外一個節點上線的超時時長)
                # degr-wfc-timeout(等待超時後作降級處理)
                # outdated-wfc-timeout(過時的等待超時)
                # wait-after-sb(腦裂以後等待多長時長)
        }
        options {
                # cpu-mask on-no-data-accessible
        }
        disk {
                on-io-error detach;
                # size max-bio-bvecs on-io-error fencing disk-barrier disk-flushes
                # disk-drain md-flushes resync-rate resync-after al-extents
                # c-plan-ahead c-delay-target c-fill-target c-max-rate
                # c-min-rate disk-timeout
        }
        net {
                protocol C;
                cram-hmac-alg "sha1";
                shared-secret "drbd.tanxw.com";
                # protocol timeout max-epoch-size max-buffers unplug-watermark
                # connect-int ping-int sndbuf-size rcvbuf-size ko-count
                # allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri
                # after-sb-1pri after-sb-2pri always-asbp rr-conflict
                # ping-timeout data-integrity-alg tcp-cork on-congestion
                # congestion-fill congestion-extents csums-alg verify-alg
                # use-rle
        }
        syncer {
                rate 1000M;
        }
}

保存退出。


  第三步:爲兩個節點準備等同大小的磁盤分區,分區好以後不須要格式化,分好區而且識別出就能夠了;

[root@node2 drbd.d]# fdisk /dev/sda
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').
Command (m for help): p
Disk /dev/sda: 85.9 GB, 85899345920 bytes
255 heads, 63 sectors/track, 10443 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000e89e2
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26        7859    62914560   8e  Linux LVM
/dev/sda3            7859        9164    10489446   8e  Linux LVM
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
e
Selected partition 4
First cylinder (9165-10443, default 9165):
Using default value 9165
Last cylinder, +cylinders or +size{K,M,G} (9165-10443, default 10443):
Using default value 10443
Command (m for help): n
First cylinder (9165-10443, default 9165):
Using default value 9165
Last cylinder, +cylinders or +size{K,M,G} (9165-10443, default 10443): +3G
Command (m for help): p
Disk /dev/sda: 85.9 GB, 85899345920 bytes
255 heads, 63 sectors/track, 10443 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000e89e2
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26        7859    62914560   8e  Linux LVM
/dev/sda3            7859        9164    10489446   8e  Linux LVM
/dev/sda4            9165       10443    10273567+   5  Extended
/dev/sda5            9165        9557     3156741   83  Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
[root@node2 drbd.d]# kpartx -af /dev/sda
device-mapper: reload ioctl on sda1 failed: Invalid argument
create/reload failed on sda1
device-mapper: reload ioctl on sda2 failed: Invalid argument
create/reload failed on sda2
device-mapper: reload ioctl on sda3 failed: Invalid argument
create/reload failed on sda3
device-mapper: reload ioctl on sda4 failed: Invalid argument
create/reload failed on sda4
device-mapper: reload ioctl on sda5 failed: Invalid argument
create/reload failed on sda5
[root@node2 drbd.d]# partx -a /dev/sda
BLKPG: Device or resource busy
error adding partition 1
BLKPG: Device or resource busy
error adding partition 2
BLKPG: Device or resource busy
error adding partition 3
[root@node2 drbd.d]# partx -a /dev/sda
BLKPG: Device or resource busy
error adding partition 1
BLKPG: Device or resource busy
error adding partition 2
BLKPG: Device or resource busy
error adding partition 3
BLKPG: Device or resource busy
error adding partition 4
BLKPG: Device or resource busy
error adding partition 5
[root@node2 drbd.d]#

   第四步:根據上面的描述,咱們要給它定義資源,包括資源名,drbd設備,disk以及網絡屬性,主要是這四個方面;
定義一個資源/etc/drbd.d/,內容以下:    

# cd /etc/drbd.d/
# vim mystore.res
resource mystore {                    #定義一個資源,用關鍵字resource;
  on node1.tanxw.com {                #on說明在哪一個節點上,跟uname -n保持一致,有多少個節點就定義多少個;
    device    /dev/drbd0;            #在磁盤上表現的drbd叫什麼名;
    disk      /dev/sda5;            #所使用的磁盤設備是哪一個;
    address   172.16.27.1:7789;        #在node1這個節點上監聽的套接字,默認監聽在7789端口上;
    meta-disk internal;                #保存drbd元數據信息的,表示就放在本身的磁盤區分上,也能夠放在外部的磁盤上;
  }
  on node2.tanxw.com {
    device    /dev/drbd0;
    disk      /dev/sda5;
    address   172.16.27.2:7789;
    meta-disk internal;
  }
}

保存退出,複製一份到別一個節點上,它們的配置文件要保持一致:    

# scp global_common.conf  mystore.res node2.tanxw.com:/etc/drbd.d/
# drdbadm create-md mystore  在各自的節點上初始化資源
# server drbd start   啓動drbd
# watch -n 1 'cat /proc/drbd'   實現查看磁盤信息
# drbdadm primary --force mystore   在節點上把其中一個提高爲主的
# watch -n 1 'cat /proc/drbd'   提高爲主的以後再實現查看磁盤信息

注意:哪一個是主節點哪一個就能夠掛載使用,不是主節點的連掛載都不能夠掛載;

OK、看到兩個節點上的數據正在同步了,磁盤越大同步時須要時間越久;  

wKioL1Ng8NWg90gnAAGaJJFGrsk231.jpg  wKiom1Ng8LvQHXhOAAFlgvXkdGc315.jpg

   第五步:在其中一個節點上進行格式化:   

# scp global_common.conf  mystore.res node2.tanxw.com:/etc/drbd.d/
# drdbadm create-md mystore  在各自的節點上初始化資源
# server drbd start   啓動drbd
# watch -n 1 'cat /proc/drbd'   實現查看磁盤信息
# drbdadm primary --force mystore   在節點上把其中一個提高爲主的
# watch -n 1 'cat /proc/drbd'   提高爲主的以後再實現查看磁盤信息

好了,到這裏就完成的drbd的工做模式就這麼順利的完成了,我不知道我是否說明白了!

 

要完成drbd的角色自動切換得要藉助於corosync+pacmaker,那接下來咱們就來安裝配置corosync和pacemaker吧;

爲了讓高可用的配置順利,兩個節點都不能設置爲主的,並且都不能啓動,也不能開機自動啓動,因此卸載降級:    

# cd
# umount /dev/drbd0
# drbdadm secondary mystore        哪一個是主的就在哪相節點上降級
# service drbd stop        兩個節點都須要中止服務
# chkconfig drbd off

第六步:安裝corosync + pacemaker,這裏直接用yum來安裝,兩個節點都要安裝上;    

# yum -y install corosync pacemaker
# yum -y install crmsh pssh
# cp /etc/corosync.conf.example /etc/corosync/corosync.conf
# vim /etc/corosync/corosync.conf
compatibility: whitetank
totem {
        version: 2
        secauth: on
        threads: 0
        interface {
                ringnumber: 0
                bindnetaddr: 172.16.0.0
                mcastaddr: 226.98.188.188
                mcastport: 5405
                ttl: 1
        }
}
logging {
        fileline: off
        to_stderr: no
        to_logfile: yes
        to_syslog: no
        logfile: /var/log/cluster/corosync.log
        debug: off
        timestamp: on
        logger_subsys {
                subsys: AMF
                debug: off
        }
}
amf {
        mode: disabled
}
service {
        name:   pacemaker
        ver:    0
}
aisexce {
        user:   root
        group:  root
}
# mv /dev/random /dev/m
# ln /dev/urandom /dev/random  若是這把這個隨機數墒池改了能夠會產生隨機數不夠用,這個就要敲擊鍵盤給這個墒池一些隨機數;生成完這個key後把連接刪除,再把墒池改回來;不過這樣改能夠會有點爲安全,不過作測試的應該沒關係;
# corosync-keygen
# rm -rf /dev/random
# mv /dev/m /dev/random
再把改好的配置複製一份到別一個節點上去,也保留一份給另外一個節點:
# scp -p authkey corosync.conf node2.tanxw.com:/etc/corosync/

   啓動Corosync,每一個節點都須要啓動;

   wKiom1Ng8ceBCT9QAABh0bWRDhk383.jpg

   wKioL1Ng8aiyy7U_AAB3mbStVUQ376.jpg

   wKiom1Ng8ivgBz8lAAGDY9K91c4290.jpg

  第七步:接下來進入crm命令行接口定義資源:

   # crm status  查看節點的運行狀態    

# crm
# configure
# property stonith-enabled=false
# property no-quorum-policy=ignore
# rsc_defaults resource-stickiness=100
# verify
# commit
# show
# meta ocf:linbit:drbd   查看drbd的詳細信息
# 定義資源,切換到configure中,mysqlstore定義資源名,drbd_resource=mystore這個是drbd名,後面定義的都是一些監控
# primitive mysqlstore ocf:linbit:drbd params drbd_resource=mystore op monitor role=Master interval=30s timeout=20s op monitor role=Slave interval=60s timeout=20s op start timeout=240s op stop timeout=100s
# verify    檢查語法
# 定義主資源
# master ms_mysqlstore mysqlstore meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=」True」
# verify
#commit
定義共享文件的資源,而且讓服務器切換時能夠自動掛載,device=/dev/drbd0掛載的設備,directory=/drbd掛載點,兩個掛載點的文件名要一致:
# primitive mysqlfs ocf:heartbeat:Filesystem params device=/dev/drbd0 directory=/drbd fstype=ext4 op monitor interval=30s timeout=40s on-fail-restart op start timeout=60s op stop timeout=60s
# verify
定義排列約束:
# collocation mysqlfs_with_ms_mysqlstore_master inf: mysqlfs ms_mysqlstore:Master
# verify
定義順序約束:
# order mysqlfs_after_ms_mysqlstore_master mandatory: ms_mysqlstore:promote mysqlfs:start
# show
# commit

wKioL1Ng8imi_3ybAAP4WAuO8Ak906.jpg

   OK,再查看一下它們如今的狀態,node2是主的,而node1是從的,能夠到node2上查看文件是否已經掛載上去的,驗證一下,再建立或修改幾個文件進去均可以作一下測試的,然後再讓node2停掉,看看node1是否會自動切換爲主的:

   wKiom1Ng8pjQ2qVpAAItE6aSpo4383.jpg

   wKiom1Ng8ybyASV2AADiCmwq26E699.jpg

   改變節點的主從位置:    

crm(live)# node standby node2.tanxw.com   把node2提高爲備用的
crm(live)# node noline node2.tanxw.com    讓node2上線
crm(live)# node standby node1.tanxw.com   把node1提高爲備用的
crm(live)# node noline node1.tanxw.com    讓node1上線,均可以隨意切換一下再檢測一下掛載的效果的;
相關文章
相關標籤/搜索