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

因爲網絡架構的緣由,在通常虛擬機或物理環境中常見的用 VIP 來實現雙機高可用方案,沒法照搬到 Azure 平臺。但利用 Azure 平臺提供的負載均衡或者內部負載均衡功能,能夠達到相似的效果。php

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

Note

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

基本架構以下:node

architecture

前提

此處使用已經存在的一個存儲帳號存儲全部的虛擬機磁盤。mysql

虛擬網絡中至少兩個子網,一個用於後端數據庫,一個用於前端 web。
以下圖,此處使用 lqihavnet 中 subnet-2 做爲後端數據庫子網;subnet-3 做爲前端 web 子網。linux

vnet

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

ASM 模式

在 Powershell 中執行以下命令。nginx

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,添加數據磁盤。git

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

建立內部負載均衡,並將虛擬機加入負載均衡。github

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,加入可用性集,配置負載均衡。web

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 ,保存文件,重啓服務器。

selunux-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

lsmod

在兩個節點上,新建一個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-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

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。

wordpress

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

故障轉移測試

咱們模擬每一個節點宕機的狀況下,看可否正常使用 wordpress。順序分別爲:

  1. mysql slave 宕機
  2. master 宕機
  3. nginx 中任何一個宕機

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

數據庫備用節點宕機

備用節點宕機徹底不影響服務正常使用,但從新啓用備用節點後,要注意觀察集羣服務是否恢復正常,如 pcs status, /proc/drbd。

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

pcs-status-2

啓動備用節點後,注意觀察節點狀態。

pcs-status-3

主節點宕機

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

pcs-status-4

從新啓動故障節點,注意觀察集羣狀態和 DRBD 同步狀態。

pcs-status-5

任一前端 web 宕機

前端 web 採用了負載均衡,所以不論那一臺宕機,服務會自動所有轉移到另外一節點。咱們分別在每一條宕機後更新一篇帖子:This is my fourth/fifth blog….

最後,當全部節點所有啓動,咱們來看看是否全部帖子都能顯示,以下圖。當即訪問http://market.azure.cn

web

相關文章
相關標籤/搜索