Linux/Python学习论坛-京峰教育

 找回密码
 立即注册

一键登录:

搜索
热搜: 活动 交友 discuz
查看: 506|回复: 0

分享我做的nginx+keepalived做的主主架构(二)

[复制链接]

238

主题

288

帖子

1925

积分

超级版主

Rank: 8Rank: 8

积分
1925
QQ
发表于 2015-3-20 14:54:06 | 显示全部楼层 |阅读模式
现在负载均衡层的nginx+keepalived双主、web层的nginx+php、数据库层的drbd+heartbeat+mysql都安装完成。
注意:由于我的测试环境机器每台只有1个网卡,所以drbd的心跳我才用再一个网卡上,在真实生产环境下,心跳一定要单独一个网卡一个网络。
对于web服务器之间的数据同步问题,我有了2个解决方法:
1、unison同步
2、使用nfs
最后我考虑使用nfs来解决同步问题。因为如果使用nfs的话,可以通过heartbeat来虚拟出一个ip(如10.1.88.198),同时要启动锁机制,因为同时有两个web节点要使用同一份数据,所以需要有总裁,这个尤其是在NFS给mysql用的时候是必须要用的,对于论坛或网站,要看情况,如果存在对同一文件同时修改的时候必须要启动NFS锁机制,如果没有这种情况,那么建议不要启动,启动了会降低NFS的性能:
四、安装nfs
服务器端与客户端都需要安装:
nfs-utils:NFS主程序
portmap:RPC主程序
yum -y install portmap nfs-utils
配置
vi /etc/exports  
/data/webnfs 10.1.88.0/24(rw,sync,anonuid=501,anongid=501)  
其中/data/webnfs是web挂载的目录,实现web间数据同步,,anonuid=501,anongid=501代表客户端在进行修改的时候,都以服务端的用户id501与组id501来进行操作,也就是说,如果在服务端www的用户与组id都为501,那种客户端在挂载时,进行添加、修改等操作时候,修改的用户与组均为服务器端的www。
启动nfs
service portmap start  
service nfs start  
注意:必须先启动portmap,因为portmap是一直在服务器里启动的,而nfs需要heartbeat来管理
chkconfig --level 345nfs off  
chkconfig --level 345 portmap on  
根据我朋友公司的实际情况,我决定启动nfs锁,虽然nfs性能降低,但能保证数据的完整性
/sbin/rpc.lockd  
echo "/sbin/rpc.lockd" /etc/rc.local  
由于需要heartbeat来管理nfs的启动与关闭,所以需要编写nfs启动脚本与挂载脚本
nfs启动脚本
#!/bin/bash  
NFS="/etc/rc.d/init.d/nfs"
NFSPID="/sbin/pidof nfsd`"
case $1 in  
start)  
$NFS start;  
;;  
stop)  
$NFS stop;  
        if [ "$NFSPID" != " " ];then  
                for NFSPID in $NFSPID  
                do   
                /bin/kill -9 $NFSPID;  
                done  
        fi  
;;  
*)  
echo "Usage:`basename $0` {start|stop }"  
;;  
esac  
更改权限

chmod 755 nfs   
nfs挂载脚本
#!/bin/bash  
/bin/mount -t nfs -o nosuid,noexec,nodev,rw,nouser,noauto,bg,hard,nointr,rsize=32k,wsize=32k,tcp 10.1.88.198:/data/nfs /data/www  
其中10.1.88.198是heartbeat为web里挂载虚拟的ip,而/data/nfs是服务端里为客户端挂载准备的目录,/data/www是客户端将服务端挂载到本地的目录
chmod 755 mountnfs.sh  
echo "/data/shell/mountnfs.sh" /etc/rc.local  
由于要heartbeat虚拟出web里做共享的vip,所以drbd与heartbeat都需要添加新内容:
test6里
[root@test6/]# cat /etc/ nfs.res  
#  
# please have a a look at the example configuration file in  
# /usr/share/doc/drbd83/drbd.conf  
#  

#  
# please have a a look at the example configuration file in  
# /usr/share/doc/drbd83/drbd.conf  
global {  
    # minor-count 64;  
    # dialog-refresh 5; # 5 seconds  
    # disable-ip-verification;  
usage-count no;     
}  

common {  
  syncer { rate 100M; }  
}  

resource nfs {  
  protocol      C;  
  handlers {  
    pri-on-incon-degr "echo o > /proc/sysrq-trigger ; halt -f";  
    pri-lost-after-sb "echo o > /proc/sysrq-trigger ; halt -f";  
    local-io-error "echo o > /proc/sysrq-trigger ; halt -f";  
    fence-peer "/usr/lib64/heartbeat/drbd-peer-outdater -t 5";  
    pri-lost "echo pri-lost. Have a look at the log files. | mail -s 'DRBD Alert' denglei@ctfo.com";  
    split-brain "/usr/lib/drbd/notify-split-brain.sh denglei@ctfo.com";  
    out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh denglei@ctfo.com";  
  }  

  net {  
    # timeout           60;  
    # connect-int       10;  
    # ping-int          10;  
    # max-buffers     2048;  
    # max-epoch-size  2048;  
    cram-hmac-alg "sha1";  
shared-secret "MySQL-HA";  
  }  

  disk {  
    on-io-error detach;  
fencing resource-only;  
  }  

  startup {  
    wfc-timeout 120;  
    degr-wfc-timeout 120;  
  }  


  on test6 {  
device /dev/drbd2;  
disk        /dev/sda8;  
address     10.1.88.175:7788;  
    meta-disk   internal;  
  }  
  on test7 {  
device /dev/drbd2;  
disk        /dev/sda8;  
address     10.1.88.179:7788;  
    meta-disk   internal;  
  }  
其中/dev/drbd2是块设备文件,/dev/sda8s 复制nfs的分区
把这个文件复制到test7里
剩下的操作与之前讲的操作一样,就不浪费时间了
修改heartbeat资源
[root@test6 ~]# grep -v "^#" /etc/ha.d/haresources   

test6 IPaddr::10.1.88.199/24/eth0:1 mysqld_umount mysqld  
test6 IPaddr::10.1.88.198/24/eth0:1 drbddisk::nfs Filesystem::/dev/drbd2::/data/drbd/nfs::ext3 nfs  
其中drbddisk::www是资源组的名字
IPaddr::10.1.88.198/24/eth0:用IPaddr脚本配置浮动nfs的VIP
Filesystem::/dev/drbd2::/data/drbd/nfs::ext3 nfs:用Filesystem脚本实现磁盘挂载和卸载
cp nfs /etc/ha.d/resource.d/  
chmod 755 /etc/ha.d/resource.d/nfs  
现在整个架构都解释完成,相信大家都有个疑问,为什么我在弄web间使用nfs进行数据同步的操作不是在刚开始安装drbd里进行,我的解释是:web间同步的方法很多,rsync、unison或者rsync+inotify等等都可以,只是看你的实际需要来选择,把nfs放到最后是为了让大家看清楚之前drbd的操作,因为drbd这一块操作很难,不易学习,而且web之间数据同步的方法也不一定是nfs,其他的方法也不是不行,所以我把nfs同步放到了最后。
如果大家有什么疑问,可以在下面留言,我会努力的帮助大家解决;我写博客的目的就是为了分享我的成功、经验,与大家一起交流、学习,请大家不吝赐教!
为了让大家能够更清楚的明白我设计的架构,我特意买了6个vps来制作这个架构,下面是架构在vps里的图:

下图是各个服务在vps里的地址

由于vps是256m内存,所以drbd+heartbeat安装不成功,而且负载均衡层的keepalived也不成功,但由于负载均衡层每台服务器都有双ip,所以我通过每台服务器的第二个ip左右负载均衡双主的vip,作为dns轮询的ip,这样也能实现负载均衡双主的功能(实在是在vps没有办法实现我才这样,而且vps好贵啊,如果不是为了给大家做展示与测试,我才不买;公司的测试机器也没有外网ip,所以才用vps给大家展示,请见谅!)
下图是dns做轮询的查看图

从图中可以看到,www.netnvo.com这个域名对于2个ip,分别是184.82.79.165与184.82.79.161,实现了dns轮询。

由于我vps的内存是256m的,所以在进行ab与webbench的时候,最多只能到7000并发,在我做测试的测试环境里,并发到1w是没有问题,这里的vps架构只是为了大家的研究,测试就别做太多的并发,否则会把vps的内存给消耗没的,大家注意这点!

BTW:在制作这个架构中,我的很多朋友与群友给了我很多帮助性的建议,我还从网上的很多blog中学会了很多知识,尤其是http://bbs.ywlm.net/thread-965-1-1.html这篇blog给了我很大的参考性,十分感谢他们!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|京峰教育,只为有梦想的人 ( 京ICP备15013173号 )

GMT+8, 2019-7-20 23:49 , Processed in 0.049981 second(s), 12 queries , Apc On.

快速回复 返回顶部 返回列表