架構圖php
需求分析
1.haproxy用來作多個web服務的前端反代,因爲haproxy處於最前端並且是向外提供服務,若是出現宕機時那麼整個服務都不可用,那麼須要給haproxy作高可用,這裏使用比較輕量級的keepalived做爲haproxy的高可用;
2.使用varnish做爲整個服務的第二層,咱們知道varnish的併發能力並非很優秀,這裏varnish既提供了緩存功能又提供了反向代理的功能,此處用2臺varnish來作高可用,而且實現後端內容的動靜分離,動態內容都分發node四、node5,靜態內容分發到node六、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來監控整個環境的運行情況;html
實驗環境須要11主機前端
1GRAM 一顆單核cpunode
1.用虛擬機基於kickstart建立8臺主機python
實現:mysql
a.部署好虛擬機linux
b.搭建好基於kickstart安裝環境【DHCP+tftp+httpd】nginx
c.建立虛擬機c++
d.定義好主機名web
2.在server上部署好ansible環境,而且給各主機實現時間同步。
3.對各虛擬機所有作快照
4.部署好各環境
a.在node7上安裝nginx做爲圖片訪問
b.在node6上安裝nginx做爲靜態內容處理
c.在node5上安裝nginx+php
d.在node4上安裝apache+tomcat
e.在node8和node88上部署好DRBD和mysql高可用
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_intel【Intel處理器】或者是kvm_amd【處理器】
#modprobe kvm
#modprobekvm_intel或者kvm_amd
/dev/kvm 裝載模塊後,就多出來這個kvm設備,管理虛擬機都經過/dev/kvm接口來實現的,是一個編程接口
kvm只能虛擬化cpu和內存,虛擬io須要經過qemu-kvm,
# yum install -yqemu-kvm qemu-kvm-tools【kvm的調試和診斷工具】
安裝成功後,就能夠安裝虛擬機了
# 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/p_w_picpaths/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
能夠上傳圖片測試訪問