前端httpd+heepalived加后端heartbeat+nfs+drbd实现httpd服务的高效应用及资源统一管理

本文介绍了一个高可用架构的实现方案,包括使用Keepalived搭建HTTP负载均衡集群,通过DRBD实现文件系统的高可用存储,以及Heartbeat实现服务的故障转移。

本文四台机器:Centos6.0

lv1、lv2两台机器做httpd的前端,使用keepalived做高可用;虚拟出一个vip供client访问。

node1、node2应用drbd技术实现文件镜像存储,虚拟出一个vip做nfsserver_ip供httpd服务,方便配置,资料的统一管理;

涉及应用技术;httpd、keepalived、drbd、nfs、heartbeat

如图:


lv1: 192.168.182.130

lv2: 192.168.182.129     VIP:192.168.182.200 该vip供client访问

node1:192.168.182.133

node2:192.168.182.134  VIP:192.168.182.150  该VIP充当nfsserver进行挂载  

首先关闭了selinux、iptables;当然真实环境并非如此,我们进行分别配置即可

一、开始配置,lv1、lv2;进行测试前端是否正常

1、分别执行:yum install -y httpd ipvsadm keepalived

为了分别出lv1、lv2的页面区别,分别在页面标识lv1、lv2

2、接下来配置keepalived;

lv1:上配置

vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
  notification_email {
    coffee_lanshan@sina.com
  }
  notification_email_from admin@example.com
  smtp_server 127.0.0.1
  smtp_connect_timeout 30
  router_id LV_ha
}

vrrp_instance httpd {
   state MASTER
   interface eth0
   virtual_router_id 51
   priority 100
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
       192.168.182.200
   }
}

virtual_server 192.168.182.200 80 {
   delay_loop 2
   lb_algo rr
   lb_kind DR
   persistence_timeout 50
   protocol TCP

   real_server 192.168.182.130 80 {
       weight 3
   notify_down    /var/www/httpd.sh
   TCP_CHECK {
   connect_timeout    3
   nb_get_retry    3
   delay_before_retry    3
   connect_port 80
       }
   }
}
lv2:配置

vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
  notification_email {
    coffee_lanshan@sina.com
  }
  notification_email_from admin@example.com
  smtp_server 127.0.0.1
  smtp_connect_timeout 30
  router_id LV_ha
}

vrrp_instance httpd {
   state MASTER
   interface eth0
   virtual_router_id 51
   priority 100
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
       192.168.182.200
   }
}

virtual_server 192.168.182.200 80 {
   delay_loop 2
   lb_algo rr
   lb_kind DR
   persistence_timeout 50
   protocol TCP

   real_server 192.168.182.129 80 {
       weight 3
   notify_down    /var/www/httpd.sh
   TCP_CHECK {
   connect_timeout    3
   nb_get_retry    3
   delay_before_retry    3
   connect_port 80
       }
   }
}
分别在lv1、lv2创建httpd.sh

vim /var/www/httpd.sh

#!/bin/sh
pkill    keepalived

#####

chmod +x httpd.sh

现在为此测试上面的是否正常,是否正常转移

发现现在是lv1在提供服务,在vrrp中也可以看到( priority 100);

现在在lv1停掉httpd

现在发现是lv2在提供服务,现在当你启动lv1上的httpd和keepalived的服务后,httpd会自动切换会lv1上;这里不演示了;

二:现在开始node1、node2配置drbd+heartbeat+nfs并进行测试;

1、配置hosts,安装drbd、heartbeat、nfs

1>、node1、node2:

vim hosts

192.168.182.133    node1
192.168.182.134    node2

2>、drbd安装

yum -y install gcc kernel-devel kernel-headers flex

wget http://oss.linbit.com/drbd/8.4/drbd-8.4.3.tar.gz
 tar zxvf drbd-8.4.3.tar.gz
   cd drbd-8.4.3
   ./configure --prefix=/usr/local/drbd --with-km
   make KDIR=/usr/src/kernels/2.6.32-71.el6.i686/
  make install
   mkdir -p /usr/local/drbd/var/run/drbd
    cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d
    chkconfig --add drbd
    chkconfig drbd on
    cd drbd
    cp drbd.ko /lib/modules/`uname -r`/kernel/lib/
    depmod
    modprobe drbd

确定加载了drbd模块

到此两台机器的drbd安装完毕;开始config

首先需要在node1、node2;fdisk新增的disk(这里我新增了一个8G的disk来做drbd),切记不可格式化

node1:

cd /usr/local/drbd/etc/drbd.d

mv global_common.conf global_common.conf.bak

vim global_common.conf

global    {
   usage-count    yes;  #是否参加DRBD使用者统计,默认yes
   }
   common    {
   net    {
      protocol    C;  #使用drbd的第三种同步协议,表示收到远程主机的写入确认后,则认为写入完成.
   }
   }

vim r0.res

resource    r0    {
       on node1    {   #每个主机的说明以on开头,后面是hostname
       device    /dev/drbd1;   #drbd设备名
       disk    /dev/sdb1;  #/dev/drbd1使用的磁盘分区是/dev/sdb1。
       address    192.168.182.133:7789;    #设置DRBD的监听端口,用于与另一台主机通信。
       meta-disk    internal;
   }
       on node2    {
       device    /dev/drbd1;
       disk    /dev/sdb1;
       address    192.168.182.134:7789;
       meta-disk    internal;
   }
}

将上面这个配置文件分别复制到两台主机的/etc/drbd.d目录下。

2、 启动DRBD

在两个节点执行
在启动DRBD之前,你需要分别在两台主机的sdb1分区上,创建供DRBD记录信息的数据块.分别在两台主机上执行: 
[root@Centos ~]# drbdadm create-md r0 或者执行drbdadm create-md all
[root@Centos ~]# drbdadm create-md r0
在两个节点启动服务
[root@Centos ~]#/etc/init.d/drbd start
[root@Centos ~]#/etc/init.d/drbd start
最好同时启动
在任意节点查看节点状态

对输出的含义解释如下:
ro表示角色信息,第一次启动drbd时,两个drbd节点默认都处于Secondary状态,
ds是磁盘状态信息,“Inconsistent/Inconsisten”,即为“不一致/不一致”状态,表示两个节点的磁盘数据处于不一致状态。“UpToDate/UpToDate”。即为“实时/实时”状态了。
Ns表示网络发送的数据包信息。
Dw是磁盘写信息
Dr是磁盘读信息

设置主节点
由于默认没有主次节点之分,因而需要设置两个主机的主次节点,选择需要设置为主节点的主机,然后执行如下命令:

drbdsetup /dev/drbd1 primary --o

第一次执行完此命令后,在后面如果需要设置哪个是主节点时,就可以使用另外一个命令:

drbdadm primary r0或者drbdadm primary all

执行此命令后,开始同步两台机器对应磁盘的数据

从输出可知:
   “ro状态现在变为“Primary/Secondary”,“ds”状态也变为“UpToDate/Inconsistent”,也就是“实时/不一致”状态,现在数据正在主备两个主机的磁盘间进行同步,且同步进度为8.4%,同步速度每秒10M左右。
等待片刻,再次查看同步状态,输出如下:


可以看到同步完成了,并且“ds“状态也变为“UpToDate/UpToDate”了。即为“实时/实时”状态了。

格式化disk

mkfs.ext4 /dev/drbd1

接下了就可以mount 使用了

3、安装heartbeat、nfs

yum install heartbeat nfs libnet -y

cp /usr/share/doc/heartbeat-3.0.4/authkeys ha.cf haresources /etc/ha.d/

1、node1配置ha.cf

logfile    /var/log/ha-log

logfacility    local0

keepalive 2

deadtime 30

warntime 10

initdead 120

udpport    694

ucast eth0 192.168.182.134

auto_failback off

node node1
node node2

ping 192.168.182.2

respawn root /usr/lib/heartbeat/ipfail

++++++++++++++++++++++++++++++++

node2的ha.cf和上面一样,只是ucast eth0 192.168.182.133(对方IP)

配置/etc/ha.d/authkeys

auth 2
#1 crc
2 sha1 heartbeat
#3 md5 Hello!

node2同上

配置/etc/ha.d/haresources 

node1 IPaddr::192.168.182.150/24/eth0 drbddisk::r0 Filesystem::/dev/drbd1::/mnt::ext4 nfs

node2同上

chmod 600 authkeys

node2同上

cp /usr/local/drbd/etc/ha.d/resource.d/drbddisk /etc/ha.d/resource.d/

node2同上

启动heartbeat

/etc/init.d/heartbeat start

现在为止:你会发现node1上网卡

将node1上heartbeat关闭:你会发现node2

自动挂载,drbd状态自动切换,vip自动漂移全部正常

分别在node1、node2上配置nfs共享目录

[root@node2 ~]# vim /etc/exports 

/root/data      *(rw)

[root@node2 ~]# exportfs -r
[root@node2 ~]# exportfs -u
/root/data        <world>

4、接下来怎么在前面的两台lv上面挂载充当httpd服务的主目录;

lv1、lv2:

mount -t nfs 192.168.182.150:/root/data /var/www/html

可以把这个写到fstab中,开机启动

192.168.182.150:/root/data    /var/www/html    nfs    defaults    0    0

5、接下来进行测试了:

1>、我们在node1中的/root/data/ 中创建index.html;期中内容:node+heartbeat+test

2>、现在我们将lv1宕机掉进行测试也是一样的,不影响

3>、现在我们将node1宕掉,node间的服务会切换到node2,然后修改index.html的内容进行分别

这里新增了two一个标识

node1:/etc/init.d/heartbeat stop

node2:

[root@node2 data]# vim index.html 

node+heartbeat+test two

现在再访问vip

一切正常!ok

这样方便统一管理了资源,并且实现了可靠性;

本文出自 “Coffee_蓝山” 博客,请务必保留此出处http://lansgg.blog.51cto.com/5675165/1208485

### 使用C++与Apache HTTP服务器(httpd)构建Web后端服务指南 #### 1. 环境准备 为了使用C++编写能够处理HTTP请求的应用程序并与Apache HTTP服务器集成,环境设置至关重要。安装必要的开发工具链和库文件是第一步。 对于Linux系统而言,可以通过包管理器来获取所需的依赖项。例如,在基于Debian的发行版上可以执行以下命令: ```bash sudo apt-get update && sudo apt-get install apache2 libapache2-mod-proxy-cpp g++ ``` 这会安装Apache HTTP Server以及支持通过C++模块化扩展的能力[^1]。 #### 2. 编写简单的CGI应用程序 Common Gateway Interface (CGI) 是一种标准接口协议,允许网页浏览器向服务器发送数据并接收响应。下面是一个非常基础的例子展示如何创建一个用C++编写的简单CGI脚本: ```cpp #include <iostream> using namespace std; int main() { cout << "Content-Type:text/html\r\n\r\n"; cout << "<html><body>"; cout << "<h1>Hello from a C++ CGI Script!</h1>"; cout << "</body></html>"; } ``` 保存上述代码到`hello.cpp` 文件中,并将其编译成名为 `hello.cgi` 的可执行文件: ```bash g++ hello.cpp -o hello.cgi ``` 确保给予适当权限以便于执行此二进制文件: ```bash chmod +x hello.cgi ``` 接着把生成好的`.cgi` 文件放置在Apache配置指定的位置下,默认情况下可能是 `/usr/lib/cgi-bin/`. #### 3. 配置Apache以运行CGI脚本 编辑Apache配置文件通常位于路径 `/etc/apache2/sites-available/default.conf`, 添或修改如下指令使能CGI功能和支持特定目录下的C++程序作为CGI处理器: ```apacheconf <Directory "/usr/lib/cgi-bin"> AllowOverride None Options ExecCGI Indexes FollowSymLinks MultiViews AddHandler cgi-script .cgi </Directory> ScriptAlias /cgi-bin/ "/usr/lib/cgi-bin/" <Location "/cgi-bin"> SetHandler cgi-script </Location> ``` 重启Apache服务让更改生效: ```bash sudo systemctl restart apache2.service ``` 现在应该可以在浏览器地址栏输入类似于这样的URL访问刚才部署的服务:`http://localhost/cgi-bin/hello.cgi`. #### 4. 进阶:利用第三方框架简化开发过程 虽然可以直接借助CGI机制实现基本的功能需求,但对于更复杂的应用场景来说可能不够灵活高效。此时可以选择一些专门为C++设计的网络编程库或者web应用框架,比如CppCMS 或者 Crow 来速项目进展并提高生产力。 这些现代框架提供了诸如路由定义、模板渲染等功能特性,极大地方便了开发者专注于业务逻辑而非底层细节上的工作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值