要求:
    1. 两台web服务器安装wordpress,数据库通过nfs共享
    2. 使用keepalived实现双主模型

环境:
    主机:
        系统:CentOS6.7 x64
        1. node1: 192.168.2.11  node2: 192.168.2.12 vip: 192.168.2.200
        service iptables stop
        selinux: disabled

一、两台主机分别配置lamp架构,并使用nfs实现数据库共享

[root@node1 ~]# yum install nfs-utils httpd php php-mysql mysql-server -y     # yum安装软件包
[root@node1 ~]# mkdir -pv /mydata/{web,data} # 创建共享web程序和数据库目录
mkdir: 已创建目录 "/mydata"
mkdir: 已创建目录 "/mydata/web"
mkdir: 已创建目录 "/mydata/data"
[root@node1 ~]# chown -R mysql:mysql /mydata/data/
[root@node1 ~]# chown -R apache:apache /mydata/web/
[root@node1 ~]# vim /etc/exports
/mydata *(rw,no_root_squash)
[root@node1 ~]# service nfs start
启动 NFS 服务: [确定]
关掉 NFS 配额: [确定]
启动 NFS mountd: [确定]
正在启动 RPC idmapd: [确定]
正在启动 RPC idmapd: [确定]
启动 NFS 守护进程: [确定]
[root@node1 ~]# showmount -e 192.168.2.11
Export list for 192.168.2.11:
/mydata *
[root@node2 ~]# mkdir /mydata
[root@node2 ~]# mount -t nfs 192.168.2.11:/mydata/ /mydata/
[root@node2 ~]# vim /etc/fstab
# 插入如下规则
192.168.2.11:/mydata /mydata nfs defaults
[root@node1 ~]# vim /etc/my.cnf
datadir=/mydata/data # 修改mysql数据存放目录 [root@node2 ~]# vim /etc/my.cnf
datadir=/mydata/data # 修改mysql数据存放目录 [root@node1 ~]# service mysqld start # 启动数据库
[root@node1 ~]# ls /mydata/data/ # 确认是否生成数据
ibdata1 ib_logfile0 ib_logfile1 mysql test
[root@node2 ~]# service mysqld start # 第一次读取共享可能会慢点 [root@node1 ~]# wget http://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_SC_UTF8.zip # 下载discuz web程序
[root@node1 ~]# unzip Discuz_X3.2_SC_UTF8.zip
[root@node1 ~]# cp -a upload/* /mydata/web/ # 将web程序复制到nfs共享目录
[root@node1 ~]# chown -R apache:apache /mydata/web/ # 给与apache的执行权限
[root@node1 ~]# vim /etc/httpd/conf/httpd.conf # 修改apache配置文件
# 修改如下参数
行号
276 ServerName localhost:80 292 DocumentRoot "/mydata/web/"
317 <Directory "/mydata/web">
[root@node1 ~]# service httpd start
[root@node1 ~]# scp /etc/httpd/conf/httpd.conf node2:/etc/httpd/conf/ # 将配置文件拷贝至node2服务器
[root@node2 ~]# service httpd start
[root@node1 ~]# mysql # 创建web程序的数据库
mysql> CREATE DATABASE ultrax;
mysql> GRANT ALL ON ultrax.* TO 'ultrax'@127.0.0.1 IDENTIFIED BY '123456';
mysql> FLUSH PRIVILEGES;
mysql> Bye

# node1 创建了库,node2最好重启下mysql

[root@node2 ~]# service mysqld restart

通过浏览器安装web程序

node1: 192.168.2.11

node2: 192.168.2.12

二、通过keepalived实现主备模式

[root@node1 ~]# yum install keepalived -y
[root@node1 ~]# vim /etc/keepalived/keepalived.conf
# 全部内容如下
! Configuration File for keepalived global_defs {
notification_email {
root@localhost
}
notification_email_from root@localhost
smtp_server 127.0.0.1
smtp_connect_timeout
router_id nodeA
}
vrrp_script chk_httpd {
script "/etc/keepalived/bash/chk_httpd.sh"
interval
weight -
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id
priority
advert_int
authentication {
auth_type PASS
auth_pass
}
track_script {
chk_httpd
}
virtual_ipaddress {
192.168.2.200/
}
}
[root@node1 ~]# mkdir /etc/keepalived/bash     # 创建检查脚本存放目录
[root@node1 ~]# vim /etc/keepalived/bash/chk_httpd.sh # 编写检查脚本
# 使用该脚本必须有wget命令,如没有请执行:yum install wget -y
#!/bin/bash pidfile=/var/lock/subsys/`basename $`.pid
if [ -f $pidfile ] && [ -e /proc/`cat $pidfile` ] ; then
exit
fi
trap "rm -rf $pidfile ; exit 0"
echo $$ > $pidfile
maxfails=
fails=
success= while [ ]
do /usr/bin/wget --timeout= --tries= http://192.168.2.11/ -q -O /dev/null && ping -c1 192.168.2.1 &> /dev/null
if [ $? -ne ] ; then
let fails=$[$fails+]
success=
else
fails=
let success=$[$success+]
fi if [ $fails -ge $maxfails ] ; then
fails=
success=
#check keepalived is running ? try to stop it
/etc/init.d/keepalived status | grep 正在运行
if [ $? -eq ] ; then
/usr/bin/logger -is "local service fails $maxfails times ... try to stop keepalived."
/etc/init.d/keepalived stop >& | /usr/bin/logger
fi fi if [ $success -gt $maxfails ] ; then
#check keepalived is stopped ? try to start it
/etc/init.d/keepalived status | grep 已停    # 脚本中这里要注意,如果系统是英文安装的为 grep stopped 如果是中文为 grep 已停
if [ $? -eq ] ; then
/usr/bin/logger -is "service changes normal, try to start keepalived ."
/etc/init.d/keepalived start
fi
success=
fi
sleep done [root@node1 ~]# chmod +x /etc/keepalived/bash/chk_httpd.sh
[root@node1 ~]# cd /etc/keepalived/bash/
[root@node1 bash]# sh -x chk_httpd.sh # 调试脚本,让脚本来启动keepalived 这样就做到了检查脚本的目的 [root@node1 bash]# ps uaxfww | grep keepalived | grep -v grep
root 0.0 0.1 ? Ss : : /usr/sbin/keepalived -D
root 0.0 0.2 ? S : : \_ /usr/sbin/keepalived -D
root 0.0 0.2 ? S : : \_ /usr/sbin/keepalived -D
root 0.0 0.1 ? S : : /bin/bash /etc/keepalived/bash/chk_httpd.sh

node2 安装keepalived及配置

[root@node2 ~]# yum install keepalived -y
[root@node1 ~]# scp /etc/keepalived/keepalived.conf node2:/etc/keepalived/ #直接使用node1的配置文件覆盖并修改
[root@node1 ~]# scp -r /etc/keepalived/bash node2:/etc/keepalived/ # 将检查脚本也直接复制过去,不过需要修改,切记!
[root@node2 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs {
notification_email {
root@localhost
}
notification_email_from root@localhost
smtp_server 127.0.0.1
smtp_connect_timeout
router_id nodeB
}
vrrp_script chk_httpd {
script "/etc/keepalived/bash/chk_httpd.sh"
interval
weight -
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id
priority
advert_int
authentication {
auth_type PASS
auth_pass
}
track_script {
chk_httpd
}
virtual_ipaddress {
192.168.2.200/
}
} [root@node2 bash]# vim chk_httpd.sh
# 修改如下一行代码
/usr/bin/wget --timeout= --tries= http://192.168.2.12/ -q -O /dev/null && ping -c1 192.168.2.1 &> /dev/null [root@node2 bash]# ps auxfww | grep keepalived | grep -v grep
root 0.0 0.2 ? Ss : : /usr/sbin/keepalived -D
root 0.0 0.6 ? S : : \_ /usr/sbin/keepalived -D
root 0.0 0.4 ? S : : \_ /usr/sbin/keepalived -D
root 0.0 0.2 ? S : : /bin/bash /etc/keepalived/bash/chk_httpd.sh

三、测试

node1:
[root@node1 ~]# ip a
inet 192.168.2.11/ brd 192.168.2.255 scope global eth0
inet 192.168.2.200/ scope global secondary eth0

[root@node1 ~]# service httpd stop     # 停止node1的web服务

node2:
[root@node2 bash]# ip a
inet 192.168.2.12/ brd 192.168.2.255 scope global eth0
inet 192.168.2.200/ scope global secondary eth0

测试成功。

四、练习小结:
    该服务器架构仅仅只是用来测试,这里存在很多问题:
        1. 如果node1节点down掉了,nfs共享也就断掉了
        2. keepalived也只是仅仅对http做了检测,如果mysql服务down掉,是无法进行主备切换的。

经过调整,可以使用如下架构:

【 Linux 】Keepalived实现双主模型高可用集群的更多相关文章

  1. KeepAlived双主模式高可用集群

    keepalived是vrrp协议的实现,原生设计目的是为了高可用ipvs服务,keepalived能够配置文件中的定义生成ipvs规则,并能够对各RS的健康状态进行检测:通过共用的虚拟IP地址对外提 ...

  2. Keepalived+LVS+nginx搭建nginx高可用集群

    1. 环境准备 1. VMware; 2. 4台CentOs7虚拟主机:192.168.122.248,192.168.122.68, 192.168.122.110, 192.168.122.167 ...

  3. keepalived+mysql双主复制高可用方案

    MySQL双主复制,即互为Master-Slave(只有一个Master提供写操作),可以实现数据库服务器的热备,但是一个Master宕机后不能实现动态切换.而Keepalived通过虚拟IP,实现了 ...

  4. activitmq+keepalived+nfs 非zk的高可用集群构建

    nfs 192.168.10.32 maast 192.168.10.4 savel 192.168.10.31 应对这个需求既要高可用又要消息延迟,只能使用变态方式实现 nfs部署 #yum ins ...

  5. Linux 笔记 - 第十八章 Linux 集群之(一)Keepalived 高可用集群

    一.前言 Linux 集群从功能上可以分为两大类:高可用集群和负载均衡集群.此处只讲高可用集群,负载均衡放在下一篇博客讲解. 高可用集群(High Availability Cluster,简称 HA ...

  6. Kubernetes容器集群 - harbor仓库高可用集群部署说明

    之前介绍Harbor私有仓库的安装和使用,这里重点说下Harbor高可用集群方案的部署,目前主要有两种主流的Harbor高可用集群方案:1)双主复制:2)多harbor实例共享后端存储. 一.Harb ...

  7. 【转】harbor仓库高可用集群部署说明

    之前介绍Harbor私有仓库的安装和使用,这里重点说下Harbor高可用集群方案的部署,目前主要有两种主流的Harbor高可用集群方案:1)双主复制:2)多harbor实例共享后端存储. 一.Harb ...

  8. LVS+Keepalived-DR模式负载均衡高可用集群

    LVS+Keepalived DR模式负载均衡+高可用集群架构图 工作原理: Keepalived采用VRRP热备份协议实现Linux服务器的多机热备功能. VRRP,虚拟路由冗余协议,是针对路由器的 ...

  9. 基于Keepalived实现LVS双主高可用集群

    Reference:  https://mp.weixin.qq.com/s?src=3&timestamp=1512896424&ver=1&signature=L1C7us ...

随机推荐

  1. TensorFlow 同时调用多个预训练好的模型

    在某些任务中,我们需要针对不同的情况训练多个不同的神经网络模型,这时候,在测试阶段,我们就需要调用多个预训练好的模型分别来进行预测. 调用单个预训练好的模型请点击此处 弄明白了如何调用单个模型,其实调 ...

  2. python 面试题: 列表表达式

    [process() for item1 in iterable1 if condition1 for item2 in iterable2 if condition2 For item3 in it ...

  3. Week3 Teamework from Z.XML-团队分工及贡献分分配办法

    引言:团队项目即将开展,本文将就团队分工,以及分数分配办法进行阐述 一.团队分工 本周我们团队进行了初步的分工,结果如下: PM: 李孟 Dev:毛宇 薛亚杰 肖俊鹏 罗凡 Test:周敏轩 马辰 李 ...

  4. get? post? put? delete? head? trace? options? http请求方法

    http1.1协议里面定义了八种请求方法: get:用作获取,读取数据 post:向指定的资源提交数据 put:更新,向指定的资源上传一个内容,比如说:更新一个用户的头像或者替换掉已有的一个视频 de ...

  5. 关于<!DOCTYPE html>的学习(转)

    DOCTYPE是对Document type的缩写,说明用XHTML或者HTML是什么版本的.必须出现在<html>标签的前面,不需要关闭标签. <!DOCTYPE>声明不是标 ...

  6. poi解析excel出现格式不正确

    后缀为xlsx的excel做系统导入时出现bug: Strict OOXML isn't currently supported, please see bug #57699 为了同时兼容03.07及 ...

  7. C - 安装雷达

    C - 安装雷达 Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others) Problem Descr ...

  8. [洛谷P2839][国家集训队]middle

    题目大意:给你一个长度为$n$的序列$s$.$Q$个询问,问在$s$中的左端点在$[a,b]$之间,右端点在$[c,d]$之间的子段中,最大的中位数. 强制在线. 题解:区间中位数?二分答案,如果询问 ...

  9. [Leetcode] subsets 求数组所有的子集

    Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset must be ...

  10. git查看和操作commit命令

    git reflog 显示所有branch的commit,包括commit和reset,以及已删除的commit.而git log只显示当前branch的commit,不包括已删除的commit gi ...