码迷,mamicode.com
首页 > Web开发 > 详细

高负载web架构(一)

时间:2015-08-12 15:05:05      阅读:288      评论:0      收藏:0      [点我收藏+]

标签:应用程序   服务器   动态   大规模、项目   

架构图

技术分享


需求分析
1.haproxy用来做多个web服务的前端反代,由于haproxy处于最前端而且是向外提供服务,如果出现宕机时那么整个服务都不可用,那么需要给haproxy做高可用,这里使用比较轻量级的keepalived作为haproxy的高可用;
2.使用varnish作为整个服务的第二层,我们知道varnish的并发能力并不是很优秀,这里varnish既提供了缓存功能又提供了反向代理的功能,此处用2台varnish来做高可用,并且实现后端内容的动静分离,动态内容都分发node4、node5,静态内容分发到node6、node7;
3.其中node4用来做tomcat的应用服务器[www.tree.org],node5用来做php的应用服务器[www.water.com],node6用来做静态内容的处理[.txt,.html,..],node7也是做静态内容处理的[.jpg,.png,jpeg...];
4.当应用程序需要获取数据时,其需要到后端取数据,这里用MySQL作为数据的存放位置,并且用corosync+pacemaker作为其高可用,使用DRBD作为其存储;这一层一般都可以扩展[使用读写分离、使用memcached作为读缓存]
5.使用zabbix来监控整个环境的运行状况;


实验环境需要11主机

1GRAM   一颗单核cpu

1.用虚拟机基于kickstart创建8台主机

实现:

a.部署好虚拟机

b.搭建好基于kickstart安装环境【DHCP+tftp+httpd

c.创建虚拟机

d.定义好主机名

 

2.server上部署好ansible环境,并且给各主机实现时间同步。

 

3.对各虚拟机全部做快照

 

4.部署好各环境

a.node7上安装nginx作为图片访问

b.node6上安装nginx作为静态内容处理

c.node5上安装nginx+php

d.node4上安装apache+tomcat

e.node8node88上部署好DRBDmysql高可用

f.node9上部署好zabbix

h.部署前端haproxy并且用keepalived高可用

i.部署缓存和方向代理varnish负载均衡

1.用虚拟机基于kickstart创建8台主机

实现:

a.部署好虚拟机

硬件虚拟化的支持:

#grep -E "vmx|svm"/proc/cpuinfo

有内容显示

当前内核模块是否对kvm支持了

# grep -i"kvm" /boot/config-2.6.32-504.el6.x86_64

CONFIG_KVM_CLOCK=y

CONFIG_KVM_GUEST=y

CONFIG_HAVE_KVM=y

CONFIG_HAVE_KVM_IRQCHIP=y

CONFIG_HAVE_KVM_EVENTFD=y

CONFIG_KVM_APIC_ARCHITECTURE=y

CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y

CONFIG_KVM=m

CONFIG_KVM_INTEL=m

CONFIG_KVM_AMD=m

加载模块kvm,kvm_intelIntel处理器】或者是kvm_amd【处理器】

#modprobe kvm

#modprobekvm_intel或者kvm_amd

 

/dev/kvm    装载模块后,就多出来这个kvm设备,管理虚拟机都通过/dev/kvm接口来实现的,是一个编程接口

kvm只能虚拟化cpu和内存,虚拟io需要通过qemu-kvm

# yum install -yqemu-kvm qemu-kvm-toolskvm的调试和诊断工具】

安装成功后,就可以安装虚拟机了

# rpm -ql qemu-kvm| less

/usr/libexec/qemu-kvm  管理工具,路径不在PATH路径下,

# ln -sv /usr/libexec/qemu-kvm/usr/bin/qemu-kvm

# yum installlibvirt python-virtinst -y    virt-top【监控各虚拟机的】 tigervnc

#service libvirtdstart virt工具的使用必须要启动libvirtd服务】

 

b.搭建好基于kickstart安装环境【DHCP+tftp+httpd

安装好所需的软件

#yum install -ydhcp tftp-server httpd syslinux

配置好httpd,把安装源放到httpd的根目录下

提供kickstart文件也放到httpd的根目录下

text

install

url--url=http://192.168.21.249/6/

lang en_US.UTF-8

keyboard us

network --onbootno --device eth0 --mtu=1500 --bootproto dhcp --noipv6

rootpw  --iscrypted$6$SsGkXXuathcIxjqb$eOqx2cgr5AVmzl2agp3/4r9BtSKfcKbAiwdTki8RTiq4.p/Aa5sqNva2kqM3cPlHKf.5YgBhuBHzZoBqRYGNx1

reboot

firewall--disabled

authconfig--enableshadow --passalgo=sha512

selinux --disabled

timezone --utcAsia/Shanghai

bootloader--location=partition --driveorder=sda --append="crashkernel=auto rhgbquiet"

clearpart --all--initlabel

zerombr

 

part /boot--fstype=ext4 --size=200

part swap --size=1536

part pv.008003--grow --size=200

volgroup vg_lvm--pesize=4096 pv.008003

logvol /--fstype=ext4 --name=lv1 --vgname=vg_lvm --size=20480

logvol /var--fstype=ext4 --name=lv2 --vgname=vg_lvm --size=10240

 

repo--name="CentOS"  --baseurl=http://192.168.21.249/6/--cost=100

 

%packages

@Base

@Core

iptraf

ntp

openssh-server

sysstat

vim

 

%end

 

%post

service ip6tablesstop

sed -i‘s/ONBOOT="no"/ONBOOT="yes"/‘/etc/sysconfig/network-scripts/ifcfg-eth0

sed -i‘s/NM_CONTROLLED="yes"/NM_CONTROLLED="no"/‘/etc/sysconfig/network-scripts/ifcfg-eth0

service networkrestart

配置DHCP服务

subnet ... netmask... {

       ...

       next-server TFTP-SERVER-IP;

       filename "pxelinux.0";

}

配置tftp server

# chkconfig tftpon

# service xinetdrestart

# ss -unl | grep:69

提供PXE的工作环境

# cp/usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/

提供引导内核等文件

挂载系统光盘,假设位置为/media/cdrom/

# cp/media/cdrom/images/pxeboot/{vmlinuz,initrd.img}  /var/lib/tftpboot/

# cp/media/cdrom/isolinux/{splash.jpg,vesamenu.c32,boot.msg}  /var/lib/tftpboot

# mkdir/var/lib/tftpboot/pxelinux.cfg/

# cp/media/cdrom/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default

提供安装源

基于http服务实现

# mkdir -pv/var/www/html/centos/6/x84_64

#mount/dev/cdrom  /media/cdrom

# mount --bind/media/cdrom /var/www/html/centos/6/x84_64

 

c.创建虚拟机

先创建好磁盘镜像文件

#!/bin/bash

#

for num in 1 11 23 4 5 8 88;do

    qemu-img create -f qcow2/kvm/imgs/node${num}.qcow2 50G

done

开始创建虚拟机

#!/bin/bash

#

declare -i n=2

 

for num in 1 11 23 4 5 8 88;do

virt-install--name=node${num} --ram=1024 --vcpus=1 --disk/kvm/imgs/node${num}.qcow2,format=qcow2,size=100,bus=virtio,sparse --accelerate--location http://192.168.21.249/6/ --extra-args "linuxks=http://192.168.21.249/ks6.cfg" --vnc --vncport=590${n}--vnclisten=0.0.0.0 --network bridge=br0,model=virtio --force --noautoconsole

 

let n++

done

 

d.定义好主机名

#hostname XXXX

#sed -i‘s/HOSTNAME=localhost.localdomain/HOSTNAME=XXXX/g‘ /etc/sysconfig/network

# cat /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4localhost4.localdomain4

::1         localhost localhost.localdomainlocalhost6 localhost6.localdomain6

192.168.21.152node1

192.168.21.171node11

192.168.21.178node2

192.168.21.167node3

192.168.21.166node4

192.168.21.150node5

192.168.21.157node6

192.168.21.234node7

192.168.21.159node8

192.168.21.168node88

192.168.21.174node9

 

2.server上部署好ansible环境,并且给各主机实现时间同步。

提供好yum源,这里用阿里的yum

[epel]

name=Epel package

baseurl=http://mirrors.aliyun.com/epel/6/x86_64/

gpgcheck=1

enabled=1

gpgkey=http://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-6

添加到/etc/yum.repos.d/CentOS-Base.repo

#yum install -yansible

/etc/ansible/hosts中添加如下内容:

[ips]

192.168.21.152

192.168.21.171

192.168.21.178

192.168.21.167

192.168.21.166

192.168.21.150

192.168.21.157

192.168.21.234

192.168.21.159

192.168.21.168

192.168.21.174

生成密钥实现通过密钥的方式来进行认证登录

# ssh-keygen -trsa -P ‘‘

# ansible <host pattern> [-m MODULE] –a ‘MODULE_ARGS’

登录时使用密码

修改文件/etc/ansible/hosts

[ips]

192.168.21.152 ansible_ssh_pass=123456

192.168.21.171 ansible_ssh_pass=123456

192.168.21.178 ansible_ssh_pass=123456

192.168.21.167 ansible_ssh_pass=123456

192.168.21.166 ansible_ssh_pass=123456

192.168.21.150 ansible_ssh_pass=123456

192.168.21.157 ansible_ssh_pass=123456

192.168.21.234 ansible_ssh_pass=123456

192.168.21.159 ansible_ssh_pass=123456

192.168.21.168 ansible_ssh_pass=123456

192.168.21.174 ansible_ssh_pass=123456

# ansible ips -mcommand -a ‘mkdir /root/.ssh‘

# ansible ips -mcopy -a ‘src=/root/.ssh/id_rsa.pub dest=/root/.ssh/authorized_keys owner=rootgroup=root mode=0600‘

删除刚添加的密码,以后就可以通过密钥来进行登录了

# ansible ips -mcron -a ‘name="sync datetime" minute=1 job="/usr/sbin/ntpdatetime.windows.com &> /dev/null"‘

 

3.对各虚拟机全部做快照

#!/bin/bash

#

for num in 1 2 3 45 8 11 88;do

    virsh snapshot-create-as node${num}node${num}_clean

done

 

4.部署好各环境

a.node7上安装nginx作为图片访问

编译安装nginx

# tar xfnginx-1.6.1.tar.gz -C /usr/local/

首先添加用户nginx,实现以之运行nginx服务进程:

# groupadd -rnginx

# useradd -r -gnginx nginx

安装一些依赖的包

# yum install -ygcc gcc-c++ pcre-devel openssl-devel

接着开始编译和安装:

# ./configure--prefix=/usr/local/nginx --error-log-path=/var/log/nginx/error.log--http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid--lock-path=/var/lock/nginx.lock --user=nginx --group=nginx--with-http_ssl_module --with-http_flv_module --with-http_stub_status_module--with-http_gzip_static_module--http-client-body-temp-path=/usr/local/nginx/client--http-proxy-temp-path=/usr/local/nginx/proxy --with-pcre

# make &&make install

提供启动脚本,/etc/rc.d/init.d/nginx

#!/bin/sh

#

# nginx - thisscript starts and stops the nginx daemon

#

# chkconfig:   - 85 15

#description:  Nginx is an HTTP(S) server,HTTP(S) reverse \

#               proxy and IMAP/POP3 proxy server

# processname:nginx

# config:      /etc/nginx/nginx.conf

# config:      /etc/sysconfig/nginx

# pidfile:     /var/run/nginx.pid

 

# Source functionlibrary.

./etc/rc.d/init.d/functions

 

# Sourcenetworking configuration.

./etc/sysconfig/network

 

# Check thatnetworking is up.

["$NETWORKING" = "no" ] && exit 0

 

nginx="/usr/local/nginx/sbin/nginx"

prog=$(basename$nginx)

 

NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"

 

[ -f/etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

 

lockfile=/var/lock/subsys/nginx

 

make_dirs() {

   # make required directories

   user=`nginx -V 2>&1 | grep"configure arguments:" | sed ‘s/[^*]*--user=\([^ ]*\).*/\1/g‘ -`

   options=`$nginx -V 2>&1 | grep‘configure arguments:‘`

   for opt in $options; do

       if [ `echo $opt | grep ‘.*-temp-path‘`]; then

           value=`echo $opt | cut -d"=" -f 2`

           if [ ! -d "$value" ]; then

               # echo "creating"$value

               mkdir -p $value && chown-R $user $value

           fi

       fi

   done

}

 

start() {

    [ -x $nginx ] || exit 5

    [ -f $NGINX_CONF_FILE ] || exit 6

    make_dirs

    echo -n $"Starting $prog: "

    daemon $nginx -c $NGINX_CONF_FILE

    retval=$?

    echo

    [ $retval -eq 0 ] && touch$lockfile

    return $retval

}

 

stop() {

    echo -n $"Stopping $prog: "

    killproc $prog -QUIT

    retval=$?

    echo

    [ $retval -eq 0 ] && rm -f$lockfile

    return $retval

}

 

restart() {

    configtest || return $?

    stop

    sleep 1

    start

}

 

reload() {

    configtest || return $?

    echo -n $"Reloading $prog: "

    killproc $nginx -HUP

    RETVAL=$?

    echo

}

 

force_reload() {

    restart

}

 

configtest() {

  $nginx -t -c $NGINX_CONF_FILE

}

 

rh_status() {

    status $prog

}

 

rh_status_q() {

    rh_status >/dev/null 2>&1

}

 

case"$1" in

    start)

        rh_status_q && exit 0

        $1

        ;;

    stop)

        rh_status_q || exit 0

        $1

        ;;

    restart|configtest)

        $1

        ;;

    reload)

        rh_status_q || exit 7

        $1

        ;;

    force-reload)

        force_reload

        ;;

    status)

        rh_status

        ;;

    condrestart|try-restart)

        rh_status_q || exit 0

            ;;

    *)

        echo $"Usage: $0{start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"

        exit 2

esac

而后为此脚本赋予执行权限:

# chmod +x/etc/rc.d/init.d/nginx

添加至服务管理列表,并让其开机自动启动:

# chkconfig --addnginx

# chkconfig nginxon

而后就可以启动服务并测试了:

# service nginxstart

# ss -tnlp | grep80

启动时出现这种错误是因为没有创建nginx用户

#/usr/local/nginx/sbin/nginx

nginx: [emerg] getpwnam("nginx")failed

可以上传图片测试访问

本文出自 “快乐就好” 博客,请务必保留此出处http://wdllife.blog.51cto.com/6615958/1683861

高负载web架构(一)

标签:应用程序   服务器   动态   大规模、项目   

原文地址:http://wdllife.blog.51cto.com/6615958/1683861

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!