高負載web架構(一)

架構圖

wKiom1XKmgPD3e9xAAbEiOa9GOc976.jpg


需求分析
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

可以上傳圖片測試訪問

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章