架构图
需求分析
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.在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
可以上传图片测试访问
转载于:https://blog.51cto.com/wdllife/1683861