基 于 corosync+pacemaker实 现 nfs+nginx(crm管 理 )高 可 用 -centos7
pcs相 关 配 置 :(因 为 在 7版 本 ,所 以 pcs支 持 比 较 好 ,crmsh比 较 复 杂 )
环 境 主 机 -centos7:node1:172.25.0.29 node2:172.25.0.30
配 置 集 群 的 前 提 :
1、时 间 同 步
2、主 机 名 互 相 访 问
3、是 否 使 用 仲 裁 设 备 。
生 命 周 期 管 理 工 具 主 要 包 括 以 下 :
Pcs:agent(pcsd) :应 用 于 corosync+pacemaker
Crash:pssh : 应 用 于 ansible相 关 的 服 务
一 、安 装 corosync+pacemaker和 crm管 理 包
1、先 配 置 相 关 主 机 和 相 关 时 间 同 步 服 务 器 :
node1:
[root@node1 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.25.0.29 node1 172.25.0.30 node2 [root@node1 ~]# crontab -e */5 * * * * ntpdate cn.pool.ntp.org ###添 加 任 务
node2:
[root@node2 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.25.0.29 node1 172.25.0.30 node2 [root@node1 ~]# crontab -e */5 * * * * ntpdate cn.pool.ntp.org ###添 加 任 务
在 node1和 node2上 可 以 看 到 已 经 添 加 时 间 任 务 :
[root@node1 ~]# crontab -l */5 * * * * ntpdate cn.pool.ntp.org [root@node2 ~]# crontab -l */5 * * * * ntpdate cn.pool.ntp.org
添 加 node1和 node2的 信 任 关 系
[root@node1 ~]# ssh-keygen [root@node1 ~]# ssh-copy-id node2 The authenticity of host 'node2 (172.25.0.30)' can't be established. ECDSA key fingerprint is ae:88:02:59:f9:7f:e9:4f:48:8d:78:d2:6f:c7:7a:f1. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system.
我 这 里 已 经 添 加 了 ,才 会 出 现 警 告
2、在 node1和 node2个 结 点 上 执 行 :
[root@node1 corosync]# yum install -y pacemaker pcs psmisc policycoreutils-python [root@node2 corosync]# yum install -y pacemaker pcs psmisc policycoreutils-python
3、node1和 node2上 启 动 pcs并 且 让 开 机 启 动 :
[root@node1 corosync]# systemctl start pcsd.service [root@node1 corosync]# systemctl enable pcsd [root@node2 corosync]# systemctl start pcsd.service [root@node2 corosync]# systemctl enable pcsd
4、在 两 台 主 机 上 修 改 用 户 hacluster的 密 码 :
[root@node1 corosync]# echo 123456 | passwd --stdin hacluster [root@node2 corosync]# echo 123456 | passwd --stdin hacluster
下 面 的 可 以 一 台 主 机 同 步 配 置 了
node1上 :
5、注 册 pcs集 群 主 机 (默 认 注 册 使 用 用 户 名 hacluster,和 密 码 ):
[root@node1 corosync]# pcs cluster auth node1 node2 ##设 置 注 册 那 个 集 群 节 点 node2: Already authorized node1: Already authorized
6、在 集 群 上 注 册 两 台 集 群 :
[root@node1 corosync]# pcs cluster setup --name mycluster node1 node2 --force ##设 置 集 群
7、接 下 来 就 在 某 个 节 点 上 已 经 生 成 来 corosync配 置 文 件 :
[root@node1 ~]# cd /etc/corosync/ ##进 入 corosync目 录 [root@node1 corosync]# ls corosync.conf corosync.conf.example corosync.conf.example.udpu corosync.xml.example uidgid.d
#我 们 看 到 生 成 来 corosync.conf配 置 文 件 :
8、启 动 集 群 :
[root@node2 corosync]# pcs cluster start --all node1: Starting Cluster... node2: Starting Cluster... ##相 当 于 启 动 pacemaker和 corosync: [root@node1 corosync]# ps -ef | grep corosync root 19586 1 0 18:05 ? 00:00:40 corosync root 29230 21295 0 19:13 pts/1 00:00:00 grep --color=auto corosync [root@node1 corosync]# ps -ef | grep pacemaker root 1843 1 0 11:21 ? 00:00:04 /usr/libexec/pacemaker/lrmd haclust+ 1845 1 0 11:21 ? 00:00:03 /usr/libexec/pacemaker/pengine root 19593 1 0 18:05 ? 00:00:01 /usr/sbin/pacemakerd -f haclust+ 19594 19593 0 18:05 ? 00:00:01 /usr/libexec/pacemaker/cib root 19595 19593 0 18:05 ? 00:00:00 /usr/libexec/pacemaker/stonithd haclust+ 19596 19593 0 18:05 ? 00:00:00 /usr/libexec/pacemaker/attrd haclust+ 19597 19593 0 18:05 ? 00:00:01 /usr/libexec/pacemaker/crmd root 29288 21295 0 19:14 pts/1 00:00:00 grep --color=auto pacemaker ###可 以 看 到 corosync和 pacemaker已 经 起 来 了
9、查 看 集 群 的 状 态
[root@node1 corosync]# corosync-cfgtool -s Printing ring status. Local node ID 1 RING ID 0 id= 172.25.0.29 status= ring 0 active with no faults [root@node1 corosync]# ssh node2 corosync-cfgtool -s Printing ring status. Local node ID 2 RING ID 0 id= 172.25.0.30 status= ring 0 active with no faults ###可 以 发 现 node1和 node2的 集 群 都 已 经 起 来 。
10、到 这 里 我 们 先 查 看 集 群 是 否 有 错 :
[root@node1 corosync]# crm_verify -L -V error: unpack_resources: Resource start-up disabled since no STONITH resources have been defined error: unpack_resources: Either configure some or disable STONITH with the stonith-enabled option error: unpack_resources: NOTE: Clusters with shared data need STONITH to ensure data integrity Errors found during check: config not valid ##发 现 有 错 ,要 我 们 关 掉 stonith-enabled,避 免 下 一 步 出 错 我 们 先 关 掉 这 个 [root@node1 corosync]# pcs property set stonith-enabled=false [root@node1 corosync]# crm_verify -L -V [root@node1 corosync]# pcs property list Cluster Properties: cluster-infrastructure: corosync cluster-name: mycluster dc-version: 1.1.16-12.el7_4.2-94ff4df have-watchdog: false stonith-enabled: false
11、现 在 我 们 可 以 下 载 安 装 crmsh来 操 作 (从 github来 下 载 ,然 后 解 压 直 接 安 装 ):
https://codeload.github.com/ClusterLabs/crmsh/tar.gz/2.3.2
node1上 :
[root@node1 ~]# cd /usr/local/src/ [root@node1 src]# ls crmsh-2.3.2.tar [root@node1 src]#tar xvf crmsh-2.3.2.tar [root@node1 src]# ls crmsh-2.3.2.tar crmsh-2.3.2 [root@node1 src]# cd crmsh-2.3.2 [root@node1 crmsh-2.3.2]# python setup.py install ##编 译 安 装
node2上 :跟 node1同 样 的 操 作
二 、源 代 码 安 装 nginx和 安 装 nfs
###在 node1和 node2安 装 nginx,下 面 是 node1的 操 作 :
1、安 装 nginx软 件 依 赖 包 :
yum -y groupinstall "Development Tools" "Server Platform Deveopment" yum -y install openssl-devel pcre-devel
2、在 所 有 的 主 机 上 面 都 操 作 ,下 载 nginx包
[root@node1 src]# yum install wget Cy ##安 装 wget工 具
3、下 载 nginx包 :
[root@node1 src]# wget http://****/download/nginx-1.12.0.tar.gz
4、添 加 nginx运 行 的 用 户 :
[root@node1 sbin]# useradd nginx
5解 压 nginx包 ,并 且 安 装 :
[root@node1 src]# tar zxvf nginx-1.12.0.tar.gz [root@node1 src]# cd nginx-1.12.0/
6、安 装 nginx包 :
[root@node1 nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre ###编 译 安 装 [root@node1 nginx-1.12.0]# make && make install node1、node2装 完 后 测 试 nginx
6、测 试 nginx:
node1上 :
[root@node1 nginx]# cd /usr/local/nginx/ [root@node1 nginx]# echo node1 > html/index.html [root@node1 nginx]#/usr/local/nginx/sbin/nginx
node2上 :
[root@node2 nginx]# cd /usr/local/nginx/ [root@node2 nginx]# echo node2 > html/index.html [root@node2 nginx]#/usr/local/nginx/sbin/nginx
访 问 web服 务 :
[root@node1 nginx]#curl 172.25.0.29 node1 [root@node1 nginx]#curl 172.25.0.29 node2
node1、node2可 以 正 常 访 问
把 nginx关 闭 ,因 为 等 会 利 用 corosync和 pacemaker自 动 管 理 nginx
建 个 nginx启 动 脚 本 ,等 下 启 动 nginx需 要 ,在 node1和 node2上 都 要 新 建
[root@node1 ~]# cat /etc/systemd/system/nginx.service [Unit] Description=nginx After=network.target [Service] Type=forking ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s quit PrivateTmp=true [Install] WantedBy=multi-user.target ##node2上 也 同 样 的 操 作
需 要 给 脚 本 执 行 权 限
[root@node1 ~]# chmod a+x /etc/systemd/system/nginx.service [root@node2 ~]# chmod a+x /etc/systemd/system/nginx.service [root@node1 ~]# systemctl enable nginx [root@node2 ~]# systemctl enable nginx ##在 systemd资 源 代 理 下 ,要 有 enable 才 能 被 crm识 别 ,所 以 要 把 nginx enable掉
nfs搭 建 :
nfs的 作 用 我 们 都 明 确 ,所 以 我 们 只 需 在 一 台 上 安 装 就 好 ,我 这 里 在 node1安 装
[root@node1 ~]#yum install -y rpc-bind nfs-utils [root@node1 ~]# mkdir /www ###新 建 www的 目 录 ,等 会 用 于 共 享 。 [root@node1 ~]# cat /etc/exports /www *(rw,async,no_root_squash) [root@node1 ~]#systemctl restart nfs ###重 启 nfs [root@node1 ~]# showmount -e 172.25.0.29 Export list for 172.25.0.29: /www * ##可 以 发 现 www这 个 目 录 已 经 共 享 了 [root@node1 ~]# echo node > /www/index.html ###给 共 享 目 录 添 加 index.html,用 于 虚 拟 ip的 访 问
三 、高 可 用 实 现 nfs+nginx
1、资 源 嗲 里 的 使 用 方 法 :
在 node1上 配 置 :
[root@node1 ~]# crm ra crm(live)ra# info systemd:nginx systemd unit file for nginx (systemd:nginx) Cluster Controlled nginx Operations' defaults (advisory minimum): start timeout=100 stop timeout=100 status timeout=100 monitor timeout=100 interval=60
2、进 入 配 置 模 式 configure下 :
crm(live)ra# cd crm(live)#cd configure crm(live)configure# primitive webip ocf:heartbeat:IPaddr params ip=172.25.0.100 ###添 加 虚 拟 ip ##配 置 好 之 后 用 show查 看 crm(live)configure# show node 1: node1 node 2: node2 primitive webip IPaddr \ params ip=172.25.0.100 property cib-bootstrap-options: \ have-watchdog=false \ dc-version=1.1.16-12.el7_4.2-94ff4df \ cluster-infrastructure=corosync \ cluster-name=mycluster \ stonith-enabled=false crm(live)configure# verify #检 查 脚 本 是 否 有 错 crm(live)configure# commit ##提 交 、保 存 crm(live)configure# cd
3、定 义 web服 务 资 源 :
进 入 配 置 模 式 configure:
crm(live)configure# primitive webserver systemd:nginx ##添 加 nginx服 务 crm(live)configure# verify WARNING: webserver: default timeout 20s for start is smaller than the advised 100 WARNING: webserver: default timeout 20s for stop is smaller than the advised 100 ### 小 于 时 间 间 隔 会 有 警 告 ,可 以 不 用 理 会 。 crm(live)configure# commit WARNING: webserver: default timeout 20s for start is smaller than the advised 100 WARNING: webserver: default timeout 20s for stop is smaller than the advised 100
##提 交 有 个 警 告 不 用 管 :
crm(live)configure# show node 1: node1 \ attributes standby=off node 2: node2 primitive vip IPaddr \ params ip=172.25.0 primitive web systemd:nginx \ op monitor interval=30s timeout=100s \ op start timeout=100s interval=0 \ op stop timeout=100s interval=0 property cib-bootstrap-options: \ have-watchdog=false \ dc-version=1.1.16-12.el7_4.4-94ff4df \ cluster-infrastructure=corosync \ cluster-name=mycluster \ stonith-enabled=false
##我 们 检 测 下 已 经 有 两 个 资 源 了 :
crm(live)configure# cd crm(live)# status Stack: corosync Current DC: node1 (version 1.1.16-12.el7_4.2-94ff4df) - partition with quorum Last updated: Sat Oct 14 21:20:59 2017 Last change: Sat Oct 14 21:17:43 2017 by root via cibadmin on node1 2 nodes configured 2 resources configured Online: [ node1 node2 ] Full list of resources: webip (ocf::heartbeat:IPaddr): Started node2 webserver (systemd:nginx): Started node1
##我 们 也 发 现 默 认 资 源 也 是 均 衡 了 ,但 是 我 们 发 现 不 均 衡 了 分 配 了 资 源 ,但 是 我 们 需 要 定 义 是 一 个 组 的 ,所 以 把 两 个 资 源 加 一 组 (为 了 实 现 高 可 用 )
把 两 个 添 加 到 同 个 组 里 面 :
crm(live)# configure crm(live)configure# group webservice webip webserver ##添 加 webservice webip在 同 个 组 里 面 crm(live)configure# verify crm(live)configure# commit crm(live)configure# cd .. crm(live)# status Stack: corosync Current DC: node1 (version 1.1.16-12.el7_4.2-94ff4df) - partition with quorum Last updated: Sat Oct 14 21:24:17 2017 Last change: Sat Oct 14 21:24:12 2017 by root via cibadmin on node1 2 nodes configured 2 resources configured Online: [ node1 node2 ] Full list of resources: Resource Group: webservice webip (ocf::heartbeat:IPaddr): Started node1 webserver (systemd:httpd): Started node1 ##可 以 发 现 webservice webip在 同 个 组 里 面 了
4、定 义 nfs资 源 :
查 看 文 件 系 统 类 型
crm(live)ra# info ocf:heartbeat:Filesystem device* (string): block device The name of block device for the filesystem, or -U, -L options for mount, or NFS mount specification. directory* (string): mount point The mount point for the filesystem. fstype* (string): filesystem type The type of filesystem to be mounted.
###有 三 个 必 填 项 目
##开 始 配 置
crm(live)configure# primitive webstore ocf:heartbeat:Filesystem params device="172.25.0.29:/www" directory="/usr/local/nginx/html" fstype="nfs" op start timeout=60s op stop timeout=60s op monitor interval=20s timeout=40s ###定 义 /www 挂 载 到 /usr/local/nginx/html下
5、定 义 排 列 约 束 :
crm(live)configure# colocation webserver_with_webstore_and_webip inf: webserver ( webip webstore) crm(live)configure# verify WARNING: webserver_with_webstore_and_webip: resource webserver is grouped, constraints should apply to the group WARNING: webserver_with_webstore_and_webip: resource webip is grouped, constraints should apply to the group crm(live)configure# commit
##查 看 状 态 :
crm(live)configure# show node 1: node1 \ attributes standby=off node 2: node2 primitive webip IPaddr \ params ip=172.25.0.100 primitive webserver systemd:nginx \ op monitor interval=30s timeout=100s \ op start timeout=60s interval=0 \ op stop timeout=60s interval=0 primitive webstore Filesystem \ params device="172.25.0.29:/www" directory="/usr/local/nginx/html" fstype=nfs \ op start timeout=60s interval=0 \ op stop timeout=60s interval=0 \ op monitor interval=20s timeout=40s group webservice webip webserver colocation webserver_with_webstore_and_webip inf: webserver ( webip webstore ) property cib-bootstrap-options: \ have-watchdog=false \ dc-version=1.1.16-12.el7_4.4-94ff4df \ cluster-infrastructure=corosync \ cluster-name=mycluster \ stonith-enabled=false \
6、定 义 执 行 顺 序 :
crm(live)configure# order webstore_after_webip Mandatory: webip webstore crm(live)configure# verify crm(live)configure# order webserver_after_webstore Mandatory: webstore webserver crm(live)configure#
###查 看 一 下 状 态
crm(live)# status Stack: corosync Current DC: node1 (version 1.1.16-12.el7_4.4-94ff4df) - partition with quorum Last updated: Wed Oct 25 20:46:41 2017 Last change: Wed Oct 25 16:56:52 2017 by root via cibadmin on node1 2 nodes configured 3 resources configured Online: [ node1 node2 ] Full list of resources: Resource Group: webservice webip(ocf::heartbeat:IPaddr):Started node1 webserver(systemd:nginx):Started node1 webstore(ocf::heartbeat:Filesystem):Started node1 ##可 以 看 到 我 们 的 顺 序 是 webip webserver webstore
7、测 试
[root@node1 ~]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:49:e9:da brd ff:ff:ff:ff:ff:ff inet 172.25.0.29/24 brd 172.25.0.255 scope global ens33 valid_lft forever preferred_lft forever inet 172.25.0.100/24 brd 172.25.0.255 scope global secondary ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe49:e9da/64 scope link
可 以 看 到 vip已 经 起 来 了
接 下 来 访 问 web服 务 :
[root@node1 ~]# curl 172.25.0.100 node
可 以 发 现 访 问 的 是 /www/index里 的 内 用
我 们 把 node1的 pacemaker和 corosync停 掉
[root@node1 ~]# systemctl stop pacemaker ##先 关 pacemaker先 [root@node1 ~]# systemctl stop corosync
在 node2上 可 以 看 到 node2已 经 接 管 了
[root@node2 crmsh-2.3.2]# crm crm(live)# status Stack: corosync Current DC: node2 (version 1.1.16-12.el7_4.4-94ff4df) - partition with quorum Last updated: Wed Oct 25 20:54:33 2017 Last change: Wed Oct 25 16:56:52 2017 by root via cibadmin on node1 2 nodes configured 3 resources configured Online: [ node2 ] OFFLINE: [ node1 ] Full list of resources: Resource Group: webservice webip(ocf::heartbeat:IPaddr):Started node2 webserver(systemd:nginx):Started node2 webstore(ocf::heartbeat:Filesystem):Started node2 crm(live)#exit [root@node2 crmsh-2.3.2]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:64:00:b1 brd ff:ff:ff:ff:ff:ff inet 172.25.0.30/24 brd 172.25.0.255 scope global ens33 valid_lft forever preferred_lft forever inet 172.25.0.100/24 brd 172.25.0.255 scope global secondary ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe64:b1/64 scope link
##vip已 经 转 移 到 node2上
[root@node2 crmsh-2.3.2]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/cl-root 18G 2.5G 16G 14% / devtmpfs 226M 0 226M 0% /dev tmpfs 237M 86M 151M 37% /dev/shm tmpfs 237M 8.6M 228M 4% /run tmpfs 237M 0 237M 0% /sys/fs/cgroup /dev/sda1 1014M 197M 818M 20% /boot tmpfs 48M 0 48M 0% /run/user/0 172.25.0.29:/www 18G 2.5G 16G 14% /usr/local/nginx/html
###/www 也 已 经 挂 载 到 /usr/local/nginx/html下
[root@node2 crmsh-2.3.2]# curl 172.25.0.100 node
###访 问 web资 源 也 没 问 题 了 ,说 明 实 现 成 功
在 node1上 把 pacemaker和 corosync重 启
[root@node1 ~]# crm crm(live)# status Stack: corosync Current DC: node2 (version 1.1.16-12.el7_4.4-94ff4df) - partition with quorum Last updated: Wed Oct 25 21:00:40 2017 Last change: Wed Oct 25 16:56:52 2017 by root via cibadmin on node1 2 nodes configured 3 resources configured Online: [ node1 node2 ] Full list of resources: Resource Group: webservice webip(ocf::heartbeat:IPaddr):Started node2 webserver(systemd:nginx):Started node2 webstore(ocf::heartbeat:Filesystem):Started node2 crm(live)#
###可 以 看 到 node2已 经 接 管 了 。
四 、其 他 优 化
如 果 设 置 抢 占 模 式 可 以 这 样 设
crm(live)configure# location nginx_in_node1 nginx inf: node1 ###位 置 绑 定 ,慎 用
服 务 管 理
crm(live)configure# property migration-limit=1 ###当 本 地 服 务 停 掉 了 ,将 会 启 动 本 地 服 务 一 次 ,如 果 起 不 来 就 换 到 另 一 主 机 的 服 务 。
crm更 改 文 件
crm(live)# configure crm(live)configure# edit ###会 进 入 配 置 文 件 ,模 式 相 当 于 vim的 模 式 node 1: node1 \ attributes standby=off node 2: node2 primitive webip IPaddr \ params ip=172.25.0.100 primitive webserver systemd:nginx \ op monitor interval=30s timeout=100s \ op start timeout=60s interval=0 \ op stop timeout=60s interval=0 primitive webstore Filesystem \ params device="172.25.0.29:/www" directory="/usr/local/nginx/html" fstype=nfs \ op start timeout=60s interval=0 \ op stop timeout=60s interval=0 \ op monitor interval=20s timeout=40s group webservice webip webserver order webserver_after_webstore Mandatory: webstore webserver colocation webserver_with_webstore_and_webip inf: webserver ( webip webstore ) order webstore_after_webip Mandatory: webip webstore property cib-bootstrap-options: \ have-watchdog=false \ dc-version=1.1.16-12.el7_4.4-94ff4df \ cluster-infrastructure=corosync \ cluster-name=mycluster \ stonith-enabled=false \ migration-limit=1
###可 以 看 到 刚 刚 配 的 内 容 ,可 以 增 删 修 改 。
以 上 所 有 是 我 基 于 pacemaker+corosync实 现 nfs+nginx部 署 内 容 。
来源http://www.qdjyedu.com