使用 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….

最后,当所有节点全部启动,我们来看看是否所有帖子都能显示,如下图。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容