hb v1 + haresourecenode
hb v2 + crm mysql
hb v3 + pacemaker + cluster-gluelinux
corosync + pacemaker + cluster-gluesql
cman + rgmanger數據庫
keepalived + scriptbootstrap
下面講述是利用corosync + pacemaker部署高可用集羣。vim
corosync早期是OpenAIS的組成部分,OpenAIS定義如何實現 Messaging Layer。08年corsync被獨立出來。08之前紅帽本身藉助於OpenAIS自主實現的cman,實現了投票機制。crosync2.0以前沒有投票系統,2.0之後實現了原生態投票系統。安全
corosync識別節點是經過authkey來實現的,不一樣於heartbeat v1 v2,corosync的authkey是經過corosync-keygen命令生成的,具備更高的安全性。bash
高可用節點(使用2個節點): 172.16.10.22 node2.example.com node2 172.16.10.33 node3.example.com node3 vip地址:172.16.10.200
一、全部節點的主機名稱和對應的IP地址解析服務能夠正常工做,且每一個節點的主機名稱須要跟 "uname -n「命令的結果保持一致; 所以,須要保證兩個節點上的/etc/hosts文件均爲下面的內容:(由ansible提供) 172.16.10.22 node2.example.com node2 172.16.10.33 node3.example.com node3 爲了使得從新啓動系統後仍能保持如上的主機名稱,還分別須要在各節點執行相似以下的命令: Node2: # sed -i 's@\(HOSTNAME=\).*@\1node2.example.com@g' /etc/sysconfig/network # hostname node2.example.com Node3: # sed -i 's@\(HOSTNAME=\).*@\1node3.example.com@g' /etc/sysconfig/network # hostname node3.example.com 二、設置高可用節點之間的的時間同步 可使用時間同步服務器 三、集羣節點之間能夠ssh互信通訊
# 使用 ansible Role 完成 crosync + pacemaker 的安裝和配置 # 下面是 Role 的目錄樹 # /root/corosync |-- ha.yml |-- roles | |-- common | | |-- default | | |-- files | | | `-- hosts | | |-- handlers | | |-- meta | | |-- tasks | | | `-- main.yml | | |-- templates | | `-- vars | |-- crmsh | | |-- files | | | |-- crmsh-1.2.6-4.el6.x86_64.rpm | | | `-- pssh-2.3.1-2.el6.x86_64.rpm | | `-- tasks | | `-- main.yml | `-- ha | |-- default | |-- files | | |-- authkey | | `-- corosync.conf | |-- handlers | | `-- main.yml | |-- meta | |-- tasks | | `-- main.yml | |-- templates | `-- vars `-- site.yml
下面是各個文件的內容:服務器
當前所在的目錄是: /root/corosync 如下出現是相對路徑 # cat ha.yml 是在最終執行的Playbokks - name: install and config corosync remote_user: root hosts: hbhosts roles: - common - ha - crmsh # 這是一個空文件,是ansible格式要求 cat site.yml # comman角色的任務,實現時間同步,提供hosts文件 # cat roles/common/tasks/main.yml - name: hosts file copy: src=hosts dest=/etc/hosts - name: sync time cron: name="sync time" minute="*/3" job="/usr/sbin/ntpdate 172.16.0.1 &> /dev/null" # cat roles/common/files/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.16.10.22 node2.example.com node2 172.16.10.33 node3.example.com node3 # 這是提供 pacemaker 配置接口的軟件的安裝 crmsh pssh # cat roles/crmsh/tasks/main.yml - name: copy pssh and crmsh copy: src={{ item }} dest=/tmp/ with_items: - pssh-2.3.1-2.el6.x86_64.rpm - crmsh-1.2.6-4.el6.x86_64.rpm - name: install pssh and crmsh yum: name={{ item }} state=present with_items: - /tmp/pssh-2.3.1-2.el6.x86_64.rpm - /tmp/crmsh-1.2.6-4.el6.x86_64.rpm # 軟件列表信息 # ll roles/crmsh/files/ total 536 -rw-r--r-- 1 root root 495332 Sep 15 2013 crmsh-1.2.6-4.el6.x86_64.rpm -rw-r--r-- 1 root root 49960 Sep 15 2013 pssh-2.3.1-2.el6.x86_64.rpm # 安裝和配置 corosync ll roles/ha/tasks/main.yml -rw-r--r-- 1 root root 472 Sep 20 16:50 roles/ha/tasks/main.yml [root@node1 corosync]# cat roles/ha/tasks/main.yml - name: installed corosync and pacemaker yum: name={{ item }} state=present with_items: - corosync - pacemaker tags: inst - name: auth key file copy: src=authkey dest=/etc/corosync/authkey owner=root group=root mode=0400 tags: authkey - name: configration file copy: src=corosync.conf dest=/etc/corosync/corosync.conf tags: conf notify: - restart corosync - name: start corosync service: name=corosync state=started enabled=no tags: start [root@node1 corosync]# cat roles/ha/handlers/main.yml - name: restart corosync service: name=corosync state=restarted # corosync的配置文件 cat roles/ha/files/corosync.conf # Please read the corosync.conf.5 manual page compatibility: whitetank totem { version: 2 secauth: on threads: 0 interface { ringnumber: 0 bindnetaddr: 172.16.0.0 mcastaddr: 228.10.10.10 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 { ver: 0 name: pacemaker } aisexec { user: root group: root } # corosync認證文件 ll roles/ha/files/authkey -r-------- 1 root root 128 Sep 20 16:04 roles/ha/files/authkey
執行 ansible-playbokks ha.yml,就可完成以上的配置。
# 這裏使用通用二進制包安裝 # 數據目錄: /mydata/data #### 在Node2 Node3上: # 添加用戶 groupadd -r mysql useradd -r -g mysql mysql # 二進制格式安裝mariadb tar xf mariadb-10.0.13-linux-x86_64.tar.gz -C /usr/local/ cd /usr/local/ ln -sv mariadb-10.0.13-linux-x86_64 mysql `mysql' -> `mariadb-10.0.13-linux-x86_64' cd mysql cp support-files/my-large.cnf /etc/my.cnf # 修改 vim /etc/my.cnf # 在mysqld下添加 datadir=/mydata/data # 提供服務腳本 cp support-files/mysql.server /etc/init.d/mysqld chmod +x /etc/init.d/mysqld
nfs服務端:172.16.10.11
yum install nfs-utils /mysqldata 172.16.0.0/16(rw,no_root_squash) mkdir /mysqldata setfacl -m u:493:rwx /mysqldata/ # 493是mysql用戶的UID
在Node2:
完成以上任務就能夠初始化數據庫了,以下圖:
初始化完成,就能夠登陸數據庫了,並受權:
說明:此處受權的的用戶不正確,應該是root@’172.16.%.%’
配置完成,在Node2上,驗證:
完成後,繼續:
在Node2和Node3上確保: mysqld 是關閉狀態; mysqld 開機不能啓動; 卸載 nfs 文件系統。
# 如下是定義的資源和資源約束 crm(live)# configure show node node2.example.com node node3.example.com primitive mysql-storge ocf:heartbeat:Filesystem \ params device="172.16.10.11:/mysqldata" directory="/mydata/" fstype="nfs" \ op start timeout="60s" interval="0" \ op stop timeout="60s" interval="0" primitive mysqlservice lsb:mysqld primitive vip ocf:heartbeat:IPaddr \ params ip="172.16.10.200" group mysql vip mysql-storge mysqlservice order fist_vip_storge_service_end Mandatory: vip mysql-storge mysqlservice 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="0" \ no-quorum-policy="ignore"
因爲受權的問題,在這裏須要從新受權,遠程端才能夠登陸。
遠程登陸訪問:
此時,若是有一個節點,出現故障?
遠端是否能夠正常訪問?
具體詳細配置可參考:http://guoting.blog.51cto.com/8886857/1553462 一、準備好共享磁盤 這裏使用的是 /dev/sda5。Node2 和 Node3上都是。 二、安裝軟件 rpm -ivh drbd-8.4.3-33.el6.x86_64.rpm drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm 三、配置文件 Node2: 1) 配置/etc/drbd.d/global-common.conf global { usage-count no; # 是否爲drbd官方收集數據 # minor-count dialog-refresh disable-ip-verification } # common是各個資源共用的選項 common { protocol C; # 複製協議 handlers { 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"; # 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 120; #degr-wfc-timeout 120; } disk { on-io-error detach; # 發生i/o錯誤的處理方法,detach將鏡像磁盤直接拔除 #fencing resource-only; } net { cram-hmac-alg "sha1"; shared-secret "mydrbdlab"; } syncer { rate 1000M; } } 2) 定義一個資源/etc/drbd.d/mysql.res,內容以下: resource mysql { on node2.example.com { device /dev/drbd0; disk /dev/sda5; address 172.16.10.22:7789; meta-disk internal; } on node3.example.com { device /dev/drbd0; disk /dev/sda5; address 172.16.10.33:7789; meta-disk internal; } } 3) scp /etc/drbd.d/* node3.example.com:/etc/drbd.d ############################################################################## 在兩個節點上初始化已定義的資源並啓動服務 1)初始化資源,在 Node2 和 Node3 上分別執行: drbdadm create-md test 2)啓動服務,在 Node3 和 Node2 上分別執行: /etc/init.d/drbd start 3)drbdadm primary --force mysql ############################################################################# 完成上面的步驟後,就可使用 /dev/drbd0 設備了,能夠正常的分區掛載使用。
完成後,繼續:
在Node2和Node3上確保: mysqld 是關閉狀態; mysqld 開機不能啓動; 卸載 drbd 文件系統; 確保 drbd 服務關閉; 確保 drbd 開機不能啓動; 保證drbd都爲從節點。
crm(live)configure# show node node2.example.com node node3.example.com primitive myip ocf:heartbeat:IPaddr \ params ip="172.16.10.200" primitive mysql_drbd ocf:linbit:drbd \ params drbd_resource="mysql" \ op monitor role="Master" interval="10s" timeout="60s" \ op monitor role="Slave" interval="20s" timeout="60s" \ op start timeout="240s" interval="0" \ op stop timeout="100s" interval="0" primitive mysql_service lsb:mysqld \ op monitor interval="20s" timeout="30s" primitive mysql_storage ocf:heartbeat:Filesystem \ params device="/dev/drbd0" directory="/mydata" fstype="ext4" \ op start timeout="60s" interval="0" \ op stop timeout="60s" interval="0" group mysqld myip mysql_storage mysql_service ms ms_mysql_drbd mysql_drbd \ meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" \ notify="True" colocation mysql_storage-with-ms_mysql_drbd_master \ inf: mysql_storage ms_mysql_drbd:Master colocation mysql_storage-with-mysql_service inf: mysql_service mysql_storage order fist_ip_storage_service_end Mandatory: myip mysql_storage mysql_service order mysql_storage-after-ms_mysql_drbd_master \ Mandatory: ms_mysql_drbd:promote mysql_storage:start property $id="cib-bootstrap-options" \ dc-version="1.1.10-14.el6_5.3-368c726" \ cluster-infrastructure="classic openais (with plugin)" \ expected-quorum-votes="2" \ stonith-enabled="0" \ no-quorum-policy="ignore" \ last-lrm-refresh="1411213570"
此時,若是有一個節點,出現故障?
具體詳細配置可參考:http://guoting.blog.51cto.com/8886857/1556487 # 192.168.1.11做爲 iSCSI服務器端: yum -y install scsi-target-utils # 修改配置文件/etc/tgt/targets.conf <target iqn.2014-09.com.example:mysql.ha> backing-store /dev/sda5 initiator-address 172.16.0.0/16 </target> # 啓動服務 service tgtd start chkconfig tgtd on
完成以上以後,iscsi服務端配置完成。
# 在Node2 Node3上: yum install iscsi-initiator-utils # 客戶端管理工具 # 如下配置是非必需的,默認狀況下,會有一個默認的iqn名稱 echo "InitiatorName=`iscsi-iname -p iqn.2014-09.com.example`" \ > /etc/iscsi/initiatorname.iscsi echo "InitiatorAlias=ha" >> /etc/iscsi/initiatorname.iscsi service iscsi start chkconfig iscsi on iscsiadm -m discovery -t sendtargets -p 172.16.10.11 iscsiadm -m node -T iqn.2014-09.com.example:mysql.ha -p 172.16.10.11 -l
完成以上任務後,本地會多出一塊向本地磁盤的設備。
能夠對這塊磁盤分區,格式化,掛載使用。
完成後,繼續:
在Node2和Node3上確保: mysqld 是關閉狀態; mysqld 開機不能啓動; 卸載文件系統; 保證drbd都爲從節點。
crm(live)configure# show node node2.example.com node node3.example.com primitive mysql-storge ocf:heartbeat:Filesystem \ params device="/dev/sdb1" directory="/mydata/" fstype="ext4" \ op start timeout="60s" interval="0" \ op stop timeout="60s" interval="0" primitive mysqlservice lsb:mysqld primitive vip ocf:heartbeat:IPaddr \ params ip="172.16.10.200" group mysql vip mysql-storge mysqlservice order first_vip_storge_service_end Mandatory: vip mysql-storge mysqlservice property $id="cib-bootstrap-options" \ dc-version="1.1.10-14.el6_5.3-368c726" \ cluster-infrastructure="classic openais (with plugin)" \ expected-quorum-votes="2" \ stonith-enabled="0" \ no-quorum-policy="ignore" \ last-lrm-refresh="1411224183"
驗證:
此時,若是有一個節點,出現故障?
到此,配置所有完成。