使用 Load Balancer,Corosync,Pacemaker 搭建 Linux 高可用集群

由于網絡架構的原因,在一般虛擬機或物理環境中常見的用 VIP 來實現雙機高可用方案,無法照搬到 Azure 平臺。但利用 Azure 平臺提供的負載均衡或者內部負載均衡功能,可以達到類似的效果。

本文介紹如何基于 Azure Load Balancer (LB), 結合 Linux 開源的產品 DRBD,Pacemaker 和 Corosync 實現 MariaDB 的雙機高可用,并且搭建了一個 web 環境用戶演示 HA 的故障轉移。

Note

在實際生產中,用戶請根據自己的需求在此架構上進行擴展改進。

基本架構如下:

前提

此處使用已經存在的一個存儲賬號存儲所有的虛擬機磁盤。

虛擬網絡中至少兩個子網,一個用于后端數據庫,一個用于前端 web。

如下圖,此處使用 lqihavnet 中 subnet-2 作為后端數據庫子網;subnet-3 作為前端 web 子網。

創建虛擬機、可用性集和負載均衡

ASM 模式

在 Powershell 中執行如下命令。

復制

add-azureaccount -e azurechinacloud

$stor="lqihastor"

$vnet="lqihavnet"

$svc="lqi1eha02"

$vmname1="lqi1ecmy01"

$vmname2="lqi1ecmy02"

$av1="mysqlav"

$av2="webav"

$vmname3="lqi1ecmy03"

$vmname4="lqi1ecmy04"

$sub1="Subnet-2"

$ip1="10.0.1.4"

$ip2="10.0.1.5"

$sub2="Subnet-3"

$ip3="10.0.2.4"

$ip4="10.0.2.5"

$loc="china east"

$imagename="f1179221e23b4dbb89e39d70e5bc9e72__OpenLogic-CentOS-72-20161027"

$vmsize="Small"

$vmuser="azureuser"

$vmpassword="P@ssw0rd01"

$datadisksize="5"

$ilb="lqilbmysql"

$epname1="MySQL"

$prot1="TCP"

$locport1="3306"

$pubport1="3306"

$ilbdist="SourceIP"

$ilbip="10.0.1.10"

$lb="lqilbweb"

$epname2="HTTP"

$prot2="TCP"

$locport2="80"

$pubport2="80"

$probeport="80"

$lbdist="SourceIP"

Set-AzureSubscription -SubscriptionId 9ef8a15c-15a2-4ef1-a19b-e31876ab177c -CurrentStorageAccountName $stor

創建后端數據庫虛擬機:設置網絡,靜態內網 IP,添加數據磁盤。

復制

New-AzureVMConfig -Name "$vmname1" -InstanceSize $vmsize? -ImageName $imagename -AvailabilitySetName $av1 |

Add-AzureProvisioningConfig -Linux -LinuxUser $vmuser -Password $vmpassword |

Set-AzureSubnet -SubnetNames $sub1 |

Set-AzureStaticVNetIP -IPAddress $ip1 |

Add-AzureDataDisk -CreateNew -DiskSizeInGB $datadisksize -DiskLabel "DataDisk" -LUN 0 |

New-AzureVM -ServiceName $svc -vNetName $vnet? -Location $loc

New-AzureVMConfig -Name "$vmname2" -InstanceSize $vmsize? -ImageName $imagename -AvailabilitySetName $av1 |

Add-AzureProvisioningConfig -Linux -LinuxUser $vmuser -Password $vmpassword |

Set-AzureSubnet -SubnetNames $sub1 |

Set-AzureStaticVNetIP -IPAddress $ip2 |

Add-AzureDataDisk -CreateNew -DiskSizeInGB $datadisksize -DiskLabel "DataDisk" -LUN 0 |

New-AzureVM -ServiceName $svc -vNetName $vnet? -Location $loc

創建內部負載均衡,并將虛擬機加入負載均衡。

復制

Add-AzureInternalLoadBalancer -ServiceName $svc -InternalLoadBalancerName $ilb –SubnetName $sub1 –StaticVNetIPAddress $ilbip

Get-AzureVM –ServiceName $svc –Name $vmname1 | Add-AzureEndpoint -Name $epname1 -Protocol $prot1 -LocalPort $locport1 -PublicPort $pubport1 -LoadBalancerDistribution $ilbdist –DefaultProbe -InternalLoadBalancerName $ilb | update-AzureVM

Get-AzureVM –ServiceName $svc –Name $vmname2 | Add-AzureEndpoint -Name $epname1 -Protocol $prot1 -LocalPort $locport1 -PublicPort $pubport1 -LoadBalancerDistribution $ilbdist –DefaultProbe -InternalLoadBalancerName $ilb | update-AzureVM

創建前端 web 虛擬機:設置網絡,靜態內網 IP,加入可用性集,配置負載均衡。

復制

New-AzureVMConfig -Name "$vmname3" -InstanceSize $vmsize? -ImageName $imagename -AvailabilitySetName $av2 |

Add-AzureProvisioningConfig -Linux -LinuxUser $vmuser -Password $vmpassword |

Set-AzureSubnet -SubnetNames $sub2 |

Set-AzureStaticVNetIP -IPAddress $ip3 |

Add-AzureEndpoint -Name $epname2 -Protocol $prot2 -PublicPort $pubport2 -LocalPort $locport2 -LBSetName $lb -ProbePort $probeport -ProbeProtocol $prot2 -ProbeIntervalInSeconds 10 |

New-AzureVM -ServiceName $svc -vNetName $vnet? -Location $loc

New-AzureVMConfig -Name "$vmname4" -InstanceSize $vmsize? -ImageName $imagename -AvailabilitySetName $av2 |

Add-AzureProvisioningConfig -Linux -LinuxUser $vmuser -Password $vmpassword |

Set-AzureSubnet -SubnetNames $sub2 |

Set-AzureStaticVNetIP -IPAddress $ip4 |

Add-AzureEndpoint -Name $epname2 -Protocol $prot2 -PublicPort $pubport2 -LocalPort $locport2 -LBSetName $lb -ProbePort $probeport -ProbeProtocol $prot2 -ProbeIntervalInSeconds 10 |

New-AzureVM -ServiceName $svc -vNetName $vnet? -Location $loc

ARM 模式

從該 GitHub Repo :Azure-Customized-Resources中部署。

配置后端數據庫 HA

后端數據庫使用 DRBD + Pacemake + Corosync 實現 MariaDB 主備集群。

其中,DRBD 實現數據的復制。管理工具 drbdadm。更多參考點擊drbd 介紹、工作原理及腦裂故障處理

Corosync 是集群引擎,管理消息和成員。Pacemaker 是集群資源管理器,管理工具 pcs。

CentOS 7 中,將原來的管理工具進行了改進集成,現在僅需要使用 pcs 即可管理引擎和資源,進行配置同步。

如果您使用 CentOS 6,配置流程一樣,但配置使用的命令參數需要調整。

CentOS 7 開始,由于 license 問題,mysql 數據庫改成了開源的 MariaDB。

CentOS 7默認開啟了 SeLinux 增強安全功能,為方便 demo,這里關閉該功能,生產環境中如果需要開啟,在配置 DRDB 等時需要額外配置一些 SeLinux 規則,這里省略介紹。

配置前準備工作

在兩個節點上分別執行如下命令:

在兩節點上編輯/etc/selinux/config,將SELINUX改為disabled,保存文件,重啟服務器。

用全盤做一個主分區/dev/sdc, 不需要格式化成任何文件系統,該分區將由 DRBD 接管,文件系統將建立在 DRBD 設備上。

復制

# fdisk /dev/sdc

配置 yum 倉庫以及后續需要使用的安裝包。

復制

# wget http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

# rpm -ivh elrepo-release-7.0-2.el7.elrepo.noarch.rpm

# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-elrepo.org

# yum repolist

配置DRBD

在兩個節點上分別執行如下命令。

安裝 DRBD 模塊,安裝完成后,重啟服務器。

復制

# yum install kmod-drbd84 drbd84-utils

加載 DRBD 內核模塊,使用 lsmod 查看是否加載成功。

復制

# modprobe drbd

# lsmod | grep drbd

在兩個節點上,新建一個DRBD 資源。

命令中的mysqlr0,lqi1ecmy01,10.0.1.4,lqilecmy02,10.0.1.5部分根據自己的環境替換。

復制

# vi /etc/drbd.d/mysqlr0.res

resource mysqlr0 {

protocol C;

on lqi1ecmy01 {

device /dev/drbd1;

disk /dev/sdc;

address 10.0.1.4:7788;

meta-disk internal;

}

on lqi1ecmy02 {

device /dev/drbd1;

disk /dev/sdc;

address 10.0.1.5:7788;

meta-disk internal;

}

}

初始化 DRBD 資源,在兩個節點上分別執行:

復制

# drbdadm create-md mysqlr0

啟動 DRBD 服務,一個節點上執行 start 命令后,立刻在另一個節點同步執行,兩條命令執行完畢,DRDB 服務將成功啟動。使用 status 命令查看服務狀態,使用 enable 命令設置開機自啟動。

復制

# systemctl start drbd

# systemctl status drbd

# systemctl enable drbd

選擇其中一個節點執行下面命令。命令執行成功,該節點將成為 DRBD 主節點,另一節點成為備用節點,并開始第一次狀態和數據同步。

復制

# drbdadm primary mysqlr0 --force

使用下面命令查看同步狀態,你可能看到 DRBD 處于 sync 狀態。等待 sync 成功,兩節點都變成 UptoDate 狀態,再進行下一步操作。

復制

# cat /proc/drbd

或者

復制

# drbd-overview

在創建的 DRBD 資源上創建文件系統并掛載。在主節點上執行:

復制

# mkfs.ext3 /dev/drbd1

# mkdir /var/lib/mysql

# mount /dev/drbd1 /var/lib/mysql/

DRBD 配置完成,接下來安裝 MariaDB 服務器。

安裝 MariaDB 數據庫

在主節點上執行如下命令,并初始化 mysql 安裝選項。

復制

# yum -y install mariadb-server mariadb

# service mariadb start

# /usr/bin/mysql_secure_installation

接著在備用節點上安裝數據庫。首先停止主節點上相關服務:

復制

# systemctl stop mariadb.service

# umount /var/lib/mysql/

# drbdadm secondary mysqlr0

在另一節點上:

復制

# drbdadm primary mysqlr0

# mount /dev/drbd1 /var/lib/mysql

# yum install mariadb-server

# service mariadb start

然后在該節點上登錄數據庫,創建 web 應用需要的數據庫和用戶。

復制

# mysql -u root -p

MariaDB [(none)]> create database wordpress;

Query OK, 1 row affected (0.04 sec)

MariaDB [(none)]> create user 'wpuser'@'%' identified by 'wppassword';

Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> grant all privileges on wordpress.* to 'wpuser'@'%';

Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> flush privileges;

Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> exit

Bye

配置 Pacemaker + Corosync

在兩個節點上分別執行如下命令。

復制

# yum install corosync pacemaker pcs

# systemctl start pcsd.service

# systemctl enable pcsd.service

為集群用戶設置密碼,該用戶將用來在集群節點間通信,進行數據同步。

復制

# passwd hacluster

該步驟僅需要在某一節點上執行。

復制

# pcs cluster auth lqi1ecmy01 lqi1ecmy02

創建集群,啟動集群,查看集群狀態。

復制

# pcs cluster setup --name mysqlcluster lqi1ecmy01 lqi1ecmy02

# pcs cluster start –all

# pcs status

因為虛擬機沒有真正的 fence 設備,所以需要禁用 fence 功能。

復制

# pcs property set stonith-enabled=false

因為兩節點集群不需要在 vote 功能,所以禁用 quorum。

復制

# pcs property set no-quorum-policy=ignore

添加集群資源,將 DRBD,文件系統和MariaDB服務納入集群管理,并設置彼此之間的依賴關系。

復制

# pcs -f drbd_cfg resource create drbd_ha ocf:linbit:drbd drbd_resource=mysqlr0 op monitor interval=60s

# pcs -f drbd_cfg resource master? ms_drbd_ha drbd_ha master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true

# pcs -f drbd_cfg resource create drbd_fs Filesystem device="/dev/drbd1" directory="/var/lib/mysql" fstype="ext3"

# pcs -f drbd_cfg resource constraint colocation add drbd_fs with ms_drbd_ha INFINITY with-rsc-role=Master

# pcs -f drbd_cfg constraint colocation add drbd_fs with ms_drbd_ha INFINITY with-rsc-role=Master

# pcs -f drbd_cfg constraint order promote ms_drbd_ha then start drbd_fs

# pcs -f drbd_cfg resource create mysql_svc ocf:heartbeat:mysql binary="/usr/bin/mysqld_safe" config="/etc/my.cnf" datadir="/var/lib/mysql" pid="/var/run/mariadb/mariadb.pid" socket="/var/lib/mysql/mysql.sock"? additional_parameters="--bind-address=0.0.0.0" op start timeout=60s op stop timeout=60s op monitor interval=20s timeout=30s

# pcs -f drbd_cfg constraint colocation add mysql_svc with drbd_fs INFINITY

# pcs -f drbd_cfg constraint order drbd_fs then mysql_svc

# pcs cluster cib-push drbd_cfg

配置好之后,查看集群運行狀態。正常狀態如下,若有異常,請根據錯誤信息進行故障排除。日志文件在/var/log/下。

復制

# pcs status

在兩邊節點上,執行下面命令設置 Corosync,Pacemaker 開機自啟動。MariaDB 不需要設置,集群會根據 DRBD 主備關系自動判斷在哪個節點啟動該服務。

復制

# systemctl enable corosync pacemaker

配置前端 web LB

同樣,我們需要在系統中禁用 Selinux,步驟參考前面配置 MariaDB 部分。在實際生產環境中,建議開啟,因為 web 服務器和端口是曝露在公網環境中的。

此處通過安裝 Nginx + Wordpress 來演示負載均衡。下面步驟需要在兩個節點上分別執行。

安裝 nginx, PHP, mariaDB 客戶端。

首先配置 yum 倉庫。

復制

# vi /etc/yum.repos.d/nginx.repo

[nginx]

name=nginx repo

baseurl=http://nginx.org/packages/mainline/rhel/7/$basearch/

gpgcheck=0

enabled=1

# yum install mariadb nginx php php-fpm php-mysql

配置 nginx,同樣根據自己的環境替換lqi1eha02,wordpress,wpuser,wppassword,10.0.1.10部分內容。

復制

# vi /etc/nginx/conf.d/default.conf

server {

listen 80;

server_name lqi1eha02.chinacloudapp.cn;

access_log /usr/share/nginx/lqi1eha02.chinacloudapp.cn/logs/access.log;

error_log /usr/share/nginx/lqi1eha02.chinacloudapp.cn/logs/error.log;

location / {

root /usr/share/nginx/lqi1eha02.chinacloudapp.cn;

index index.php index.html index.htm;

if (-f $request_filename) {

expires 30d;

break;

}

if (!-e $request_filename) {

rewrite ^(.+)$ /index.php?q=$1 last;

}

}

location ~ .php$ {

fastcgi_pass? localhost:9000;? # port where FastCGI processes were spawned

fastcgi_index? index.php;

fastcgi_param? SCRIPT_FILENAME? /usr/share/nginx/lqi1eha02.chinacloudapp.cn$fastcgi_script_name;? # same path as above

fastcgi_param PATH_INFO? ? ? ? ? ? ? $fastcgi_script_name;

include /etc/nginx/fastcgi_params;

}

}

# vi /etc/php.ini

cgi.fix_pathinfo=0

# mkdir /usr/share/nginx/lqi1eha02.chinacloudapp.cn/

# mkdir /usr/share/nginx/lqi1eha02.chinacloudapp.cn/logs

安裝 wordpress。配置數據庫連接信息。兩節點上分別執行。

復制

# wget http://wordpress.org/latest.tar.gz

# tar zxvf wordpress-4.6.1.tar.gz

# mv wordpress/* /usr/share/nginx/lqi1eha02.chinacloudapp.cn/

# cp /usr/share/nginx/lqi1eha02.chinacloudapp.cn/wp-config-sample.php /usr/share/nginx/lqi1eha02.chinacloudapp.cn/wp-config.php

# vi wp-config.php

// ** MySQL settings - You can get this info from your web host ** //

/** The name of the database for WordPress */

define('DB_NAME', 'wordpress');

/** MySQL database username */

define('DB_USER', 'wpuser');

/** MySQL database password */

define('DB_PASSWORD', 'wppassword');

/** MySQL hostname */

define('DB_HOST', '10.0.1.10');

# chown +R nginx:nginx /usr/share/nginx/lqi1eha02.chinacloudapp.cn/

# chmod +R 777 /usr/share/nginx/lqi1eha02.chinacloudapp.cn/

重啟服務,使配置生效,并設置開機自啟動。

復制

# systemctl restart nginx php-fpm

# systemctl enable nginx php-fpm

通過瀏覽器訪問 web 域名,初始化 wordpress。

這樣,一個簡單的 web 環境就設置好了。下面進行測試。

故障轉移測試

我們模擬每個節點宕機的情況下,看能否正常使用 wordpress。順序分別為:

mysql slave 宕機

master 宕機

nginx 中任何一個宕機

在每個節點宕機后,更新一篇帖子,再將服務集群恢復,看是否能正確更新到數據庫,并顯示出來。

數據庫備用節點宕機

備用節點宕機完全不影響服務正常使用,但重新啟用備用節點后,要注意觀察集群服務是否恢復正常,如 pcs status, /proc/drbd。

下圖顯示備用節點宕機。我們更新一篇帖子:This is my second blog…(詳細看最后 wordpress 截圖)

啟動備用節點后,注意觀察節點狀態。

主節點宕機

如下圖所示,服務自動切換到備用節點。我們更新一篇帖子:this is my third blog…

重新啟動故障節點,注意觀察集群狀態和 DRBD 同步狀態。

任一前端 web 宕機

前端 web 采用了負載均衡,因此不論那一臺宕機,服務會自動全部轉移到另一節點。我們分別在每一條宕機后更新一篇帖子:This is my fourth/fifth blog….

最后,當所有節點全部啟動,我們來看看是否所有帖子都能顯示,如下圖。立即訪問http://market.azure.cn

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,087評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,521評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,493評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,207評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,603評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,813評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,364評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,110評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,305評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,532評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,953評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,209評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,033評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,268評論 2 375

推薦閱讀更多精彩內容