编辑
2019-08-09
探索与发现
00
请注意,本文编写于 1662 天前,最后修改于 388 天前,其中某些信息可能已经过时。

目录

设定主机名
设定统一的 Host File
IPv4 转发设定
安装 Nginx
安装 Pacemaker + CoroSync + Crmsh
配置 CoroSync
生成 CoroSync 集群之间的密钥
修改配置文件
向所有节点复制上述的配置文件与认证文件
启动所有的集群服务
启动 CoroSync
启动 Pacemaker
查看集群状态
配置 Nginx 高可用
关闭 Stonith
配置 VIP 资源
配置 Nginx 资源
查看资源的状态
创建资源组
查看资源组的状态
验证阶段
进阶讨论

CoroSync 是我在使用 Proxmox 虚拟化的时候了解到的高可用集群方案。与 Keepalived 不同的是,该方案能够为有状态服务提供 VIP 切换。

设定主机名

bash
hostnamectl set-hostname ng-a.runlion.priv hostnamectl set-hostname ng-b.runlion.priv hostnamectl set-hostname ng-c.runlion.priv

设定统一的 Host File

bash
# 在所有节点上执行 echo -e "192.168.173.161 ng-a ng-a.runlion.priv\n192.168.173.162 ng-b ng-b.runlion.priv\n192.168.173.163 ng-c ng-c.runlion.priv\n192.168.173.138 ng-front ng-front.runlion.priv" >> /etc/hosts

IPv4 转发设定

bash
# 在所有节点上执行 echo -e "net.ipv4.ip_nonlocal_bind = 1\nnet.ipv4.ip_forward = 1" >> /etc/sysctl.conf

安装 Nginx

尽管本文介绍的是「使用 Corosync + Pacemaker 完成 Nginx 的高可用」,但是如何安装 Nginx 这不是本文所关注的,需要注意的是你需要为 Nginx 配置 systemd

本文使用 Yum 快速完成 Nginx 的安装

bash
# 在所有节点上执行 yum -y install nginx

安装后请不要启动 Nginx

bash
# 在所有节点上执行 systemctl stop nginx

安装 Pacemaker + CoroSync + Crmsh

Crmsh 是一款使用 Python 编写的集群管理工具,在安装前你需要配置 YUM 源

bash
[network_ha-clustering_Stable] name=Stable High Availability/Clustering packages (CentOS_CentOS-7) baseurl=http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-7/ priority=1 gpgcheck=0 enabled=1

然后运行以下命令完成安装

Bash
# 在所有节点上执行 yum -y install pacemaker corosync crmsh pcs

配置 CoroSync

生成 CoroSync 集群之间的密钥

在开始之前,我们需要安装 haveged 以更好的生成随机数。

Bash
# 在所有节点运行 yum install -y haveged
Bash
# 在任意一个节点执行 corosync-keygen

修改配置文件

CoroSync 能够有多种方式配置集群成员,比如使用组播的方式,这样是无需在配置文件中填写成员的。不过,当网络设备不支持组播或是网络性能有限时,可以配置单播的方式,并将成员信息手动写入配置。显然,这各有利弊。请根据情况各自取舍。

本文使用单播的配置方式,并填写全部的成员信息。

yaml
totem { version: 2 cluster_name: test-ng-cluster token: 10000 secauth: on ip_version: ipv4 interface { ringnumber: 0 bindnetaddr: 192.168.173.0 knet_transport: sctp } } nodelist { node { name: ng-a nodeid: 1 quorum_votes: 1 ring0_addr: 192.168.173.138 } node { name: ng-b nodeid: 2 quorum_votes: 1 ring0_addr: 192.168.173.161 } node { name: ng-c nodeid: 3 quorum_votes: 1 ring0_addr: 192.168.173.162 } } logging { fileline: off to_stderr: no to_logfile: yes logfile: /var/log/cluster/corosync.log to_syslog: yes debug: off timestamp: on logger_subsys { subsys: QUORUM debug: off } } quorum { provider: corosync_votequorum } service { ver:0 name:pacemaker } aisexec { user :root group:root }

向所有节点复制上述的配置文件与认证文件

bash
cd /etc/corosync scp -r authkey corosync.conf root@192.168.173.162:/etc/corosync scp -r authkey corosync.conf root@192.168.173.163:/etc/corosync

启动所有的集群服务

启动 CoroSync

bash
# 在所有节点执行 systemctl start corosync systemctl enable corosync

启动 Pacemaker

bash
# 在所有节点执行 systemctl start pacemaker systemctl enable pacemaker

查看集群状态

Bash
# 检查节点在线状态 crm status # 检查 CoroSync 成员信息 corosync-cmapctl | grep members

配置 Nginx 高可用

关闭 Stonith

Stonith 是个好东西,但是我们没有这样的设备,所以只能关闭掉它

bash
# 在任意一个节点执行 crm configure property stonith-enabled=false crm configure property no-quorum-policy=ignore

配置 VIP 资源

bash
# 在任意一个节点执行 crm configure primitive nginx_ip \ ocf:heartbeat:IPaddr2 params ip="192.168.173.138" \ cidr_netmask="32" op monitor interval="10s" \ meta migration-threshold="10"

配置 Nginx 资源

bash
# 在任意一个节点执行 crm configure primitive nginx \ ocf:heartbeat:nginx configfile=/etc/nginx/nginx.conf \ op start timeout="40s" interval="0" \ op stop timeout="60s" interval="0" \ op monitor interval="10s" timeout="60s" \ meta migration-threshold="10"

查看资源的状态

bash
# 在任意一个节点执行 crm resource status

创建资源组

bash
# 在任意一个节点执行 crm configure group nginx_ha nginx_ip nginx

查看资源组的状态

Bash
# 在任意一个节点执行 crm resource show

验证阶段

经过上面的配置,Nginx 与 VIP 应该已经被 Pacemaker 拉起,访问 http://192.168.173.138 应该能够看到熟悉的 Nginx 欢迎页面。

你可以关闭掉任意一台节点以验证 Nginx 与 VIP 能否实现漂移。

进阶讨论

尽管通过上述方案 Nginx 与 VIP 能够实现了高可用,但是 Nginx 的配置与静态资源文件并没有被集群间实现共享。网络上常见的方案是使用 GFS2 和 NFS 的方式来实现。

但是,现在到了 9102 年了,我更建议使用 GlusterFS 或是 BeeGFS 这样的分布式存储来实现集群之间的数据共享。需要注意的是,如果文件是非只读的情况下,应考虑开启分布式锁。

本文作者:XiaFan

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!