要求:
    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. 传输控制层协议TCP概述---抄书

    1.TCP的主要特点 TCP是TCP/IP体系中非常复杂的一个协议.下面介绍TCP的最主要的特点. (1)TCP是面向连接的运输层协议.也就是说,应用程序在使用TCP协议之前,必须先建立TCP连接.在 ...

  2. HDU 4587 TWO NODES(割点)(2013 ACM-ICPC南京赛区全国邀请赛)

    Description Suppose that G is an undirected graph, and the value of stab is defined as follows: Amon ...

  3. python进制转换(二进制、十进制和十六进制)及注意事项

    使用内置函数实现进制转换实现比较简单,主要用到以下函数: bin().oct().int().hex() 下面分别详解一下各个函数的使用(附实例) 第一部分:其他进制转十进制 1.二进制转十进制 使用 ...

  4. Java作业09-异常

    6. 为如下代码加上异常处理 byte[] content = null; FileInputStream fis = new FileInputStream("testfis.txt&qu ...

  5. Winform常用知识总结

    Label中的文字自动换行 设置MaximumSize的width为正确的值,设置height为0,设置AutoSize为true. 绘制线条 放置一个Panel,设置size的高度为1,设置Bord ...

  6. java基础知识(一)- 数据类型

    Java有两大数据类型: 基本数据类型,基本数据类型都可以直接分配到栈中 引用数据类型,引用存放在栈中,对象本身存放在堆中 基本数据类型共有四类八种 第一类:字符型(char) 第二类:逻辑型(boo ...

  7. [剑指Offer] 42.和为S的两个数字

    题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. [思 ...

  8. P3434 [POI2006]KRA-The Disks

    题目描述 For his birthday present little Johnny has received from his parents a new plaything which cons ...

  9. AGC016C +/- Rectangle(构造)

    题目大意:给定H,W,h,w四个数,求是否满足矩阵的全部数之和和正数,h行w列之和为负数 如果h和w恰好是H,W的约数,则肯定不存在 否则肯定存在 只需要把h,w内每个元素填的足够大,然后小矩形的最后 ...

  10. [Leetcode] merge sorted array 合并数组

    Given two sorted integer arrays A and B, merge B into A as one sorted array. Note: You may assume th ...