您的位置:首页 > 运维架构 > 网站架构

简单的网站架构设计方案 推荐

2012-08-23 20:36 671 查看
最近一直在找工作,好久都没有更新博客了。希望从这篇博客开始,自己继续以培训时的热情和动力去学习新的知识与技术;也希望自己从不自信和自卑中走出来,以自信饱满的姿态迎接以后的生活。同时也警示自己——快点找到工作吧,不然该饿肚子了。

这篇博客就是上篇博客中提到的夭折了的我的第一份毕业实训报告,为了以后能快速的找到就放在这里吧!和绝大多数计算机专业的毕业报告一样,前面的内容都是借鉴网上和其他人的毕业报告拼凑起来的,实在没什么营养,这里就略过了。下面所写的都是经过试验做出来的,然后写出来的,可靠性还是有保证的。废话不多说了,开始吧!

简单说明:

本网站架构设计方案采用LVS+Hearbeat实现Web集群的负载均衡和高可用;LNAMP架构提供Web服务;rsync+inotify实现数据的同步。

参考文献:高俊峰老师的《高性能Linux服务器构建实战》

操作系统:RHEL5.4——32位
第一部分 网站架构设计
1.1 网站架构设计
本网站大致使用了三个层次:第一层:LVS+Heartbeat的Director服务器,来实现负载均衡能力;第二层:提供Web服务的服务器,用来提供用户真正访问的服务;第三层:MySQL数据库层,提供数据的存储与查询,这里仅对MySQL服务器做主从设置,未采用高可用集群技术,因为没有用到共享存储,不过在实际应用环境中,是很有必要对MySQL做高可用的。
1.1.1 规划图



图1-1 逻辑示意图

IP命名规则:
DIP:配置在Director网卡上用来与后方RealServer通信的IP地址;
VIP:配置在Director网卡别名上用来提供服务的公有IP地址;
RIP:配置在RealServer上,用来与Director和其它服务器通信的IP地址;

1.1.2 IP地址规划

IP地址规划如表1-1所示:

服务器IP说明
Master DirectorDIP:192.168.1.11与后端Realserver通信
Master DirectorVIP:192.168.1.100提供服务的网络地址
Master Directoreth1:10.10.10.1用于与Slave Director传递心跳信息
Slave DirectorDIP:192.168.1.12与后端Realserver通信
Slave Directoreth1:10.10.10.2用于与Master Director传递心跳信息
RealServer 1RIP:192.168.1.21与前端Director通信
RealServer 1VIP:192.168.1.100用来直接响应客户端的请求
RealServer 2RIP:192.168.1.22与前端Director通信
RealServer 2VIP:192.168.1.100用来直接响应客户端的请求
Master MySQL192.168.1.23
Slave MySQL192.168.1.24
主机命名规范,如表1-2所示

ServerHostname
Master Directornode1.rrl.com
Slave Directornode2.rrl.com
RealServer 1r1.rrl.com
RealServer 2r2.rrl.com
Master MySQLmaster.mysql.com
Slave MySQLslave.mysql.com
第二部分 实现与测试

本部分将按上面分的层次分别实现,并对其进行必要的测试。网站的构建采用的是Linux操作系统,为什么采用Linux系统作为服务器的理由就不多说了,你懂的。我们采用的是RedHat发行版的Linux----RHEL5.4系统上构建。

2.1 MySQL数据库

注:MySQL从服务器的MySQL数据库版本必须与主服务器的版本相同或更新,因为软件一般都是向下兼容的,如果主服务器的版本比从服务器的高,可能某些特性无法使从服务器识别,从而导致数据的不一致现象,这种事情是不应该也不允许发生的。

2.1.1 MySQL的安装与配置

Master MySQL Server and Slave MySQL Server的安装与配置相同。

参见我的另一篇博客:架设LAMP平台的WEB服务器第二小节MySQL的安装。

2.1.2 MySQL主从配置

1、主MySQL服务器配置

1)、登陆MySQL数据库,为从服务器创建用户账户:

mysql>GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO replay@’192.168.1.24’ IDENTIFIED BY '123456';
mysql>FLUSH PRIVILEGES;
mysql>FLUSH MASTER;

复制需要REPLICATION CLIENT权限;监视和管理复制需要REPLICATION SLAVE权限。

2)、查看下二进制日志的信息:

mysql> SHOW MASTER STATUS;
+------------------+--------+--------------+------------------+
| File             |Position| Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+--------+--------------+------------------+
| mysql-bin.000003 |   107  |              |                  |
+------------------+--------+--------------+------------------+
1 row in set (0.00 sec)

2、从MySQL服务器配置

1)、编辑/etc/my.cnf配置文件

#log_bin         = mysql-bin         #关闭二进制日志
server-id        = 10
relayrelay_log   = relay-bin         #开启中继日志

注:从服务器的server-id的值必须不能与主服务器的相同。

2)、登陆MySQL数据库,执行下列命令

mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.1.23',
-> MASTER_USER='replay',
-> MASTER_PASSWORD='123456',
mysql>FLUSH SLAVE;
mysql>START SLAVE;

2.1.3 MySQL的测试与验证

1)、在从服务器上使用下面命令查看状态信息:

mysql>SHOW SLAVE STATUS\G




图2-1 从服务器状态图
如图,如果Slave_IO_Running与Slave_SQL_Running状态为Yes,说明MySQL主从服务器配置正常
2)、测试数据是否可以同步
首先,在主服务器上创建一个数据库,如图2-2所示



图2-2 主服务器创建数据库
从服务器上查看数据库信息,如图2-3所示



图2-3 从服务器数据库信息
从图2-1、图2-2以及图2-3可以看出MySQL主从服务器配置成功,且能实现数据同步,至此,MySQL主从服务器配置宣告结束。至于其它配置,等需要到时候会有所提及。
2.2 RealServer的实现

RealServer即真正提供服务的服务器,也就是真正意义上的Web Server。这里Web Server采用LNAMP架构构建,并采用rsync+inotify的机制实现Web页面的同步。需要注意的是我们将MySQL服务单独分离出去,所以,在RealServer上不提供MySQL服务。

2.2.1 Apache的安装与配置
2.2.2 PHP的安装与配置
这两部分同样参见我的另一篇博客:架设LAMP平台的WEB服务器一小节Apache的安装和第三小节PHP的安装

2.2.3 PHP的测试与验证

1)、测试数据库的连通性

修改/usr/local/httpd/htdocs/index.php文件

[root@r1 ~]#vim index.php
<?php
$link=mysql_connect(‘192.168.1.23’,’root’,’123456’);
if ($link)
echo “Successful”;
else
echo “Failure”;
mysql_close();
?>

在Master MySQL Server 和Slave MySQL Server为两台Realserver创建授权用户。由于命令相同,所以仅给出在Master MySQL Server授权的命令。

[root@master ~]#mysql -uroot -p123456
mysql>GRANT ALL PRIVILEGES ON *.* TO root@’192.168.1.21’ IDENTIFIED BY ‘123456’
mysql>GRANT ALL PRIVILEGES ON *.* TO root@’192.168.1.22’ IDENTIFIED BY ‘123456’

通过浏览器分别对其访问,如图2-4,访问Realserver1。图2-5,访问Realserver2




图2-4



图2-5
从测试结果说明数据库连接正常。
2.2.4 Nginx
1、编译安装Nginx

1)、首先为nginx添加用户,实现以这个用户的身份来安全的运行nginx服务进程:

[root@r1 ~]#groupadd -r nginx
[root@r1 ~]#useradd -r -g nginx -s /sbin/nologin -M nginx

2)、执行下列命令

[root@r1 ~]#tar xf nginx-1.0.13.tar.gz
[root@r1 ~]#cd nginx-1.0.13
[root@r1 nginx-1.0.13]#./configure --prefix=/usr/nginx \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx/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=/var/tmp/nginx/client/ 、
--http-proxy-temp-path=/var/tmp/nginx/proxy/ \
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ 、
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
--http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre
[root@r1 nginx-1.0.13]#make && make install

2、配置Nginx

为nginx提供SysV服务脚本/etc/rc.d/init.d/nginx,这样使我们可以使用service命令进行对其进行操作,因为在编译安装nginx的时候,默认是不提供这个服务脚本的。我们需要手动添加,脚本参见另一篇博客:RHEL5.4下实现LNMP中配置Nginx。

然后执行下列命令:

[root@r1 ~]#chmod +x /etc/rc.d/init.d/nginx
[root@r1 ~]#chkconfig --add nginx
[root@r1 ~]#chkconfig nginx on                #设置为开机启动
[root@r1 ~]#service nginx start

2.2.5 Nginx的测试与验证

通过浏览器分别访问Realserver1和Realserver2的Web服务,结果如图2-6,图2-7所示



图2-6 访问Realserver1



图2-7 访问Realserver2
从测试结果可以看出nginx工作正常。
2.2.6 Nginx的反向代理与缓存配置

这里将所有的动态请求转给Apache进行处理,静态页面直接通过Nginx进行响应。
1、编辑Nginx的配置文件/etc/nginx/nginx.conf,如没有特殊说明,则表示Realserver1和Realserver2的配置是一样的。

[root@r1 ~]#vim /etc/nginx/nginx.conf
在http容器下,server容器外添加如下内容:
proxy_cache_path    /var/nginx/cache        levels=1:2 keys_zone=STATIC:10m inactive=24h max_size=1g;
修改server容器中的server_name 字段
Realserver1的修改为:server_name r1.rrl.com;
Realserver2的修改为:server_name r2.rrl.com;
在server容器中添加如下内容:
location ~ \.php?$ {
proxy_pass http://127.0.0.1:8080; proxy_set_header    Host $host;
proxy_cache         STATIC;
proxy_cache_valid   200 1d;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
}

location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
expires     30d;
}

location ~ .*\.(js|css)?$ {
expires     1h;
}

保存退出,创建缓存目录:

[root@r1 ~]#mkdir /var/nginx/cache –pv
[root@r1 ~]#chown –R nginx.nginx /var/nginx/cache
[root@r1 ~]#service nginx configtest       #检查配置文件是否有语法错误
[root@r1 ~]#service nginx restart          #重启nginx服务

2.2.7 Nginx的反向代理与缓存的验证

1)、验证代理功能

查看分别查看Nginx和Apache的网页存放位置下有哪儿些文件。如图2-8所示




图2-8
通过浏览器访问Web页面,如图2-9所示



图2-9 Web访问页面
从图中可以看出通过浏览器访问Realserver1的动态请求转发给Apache处理,并返回结果。而静态请求直接从Nginx返回。由此可以验证反向代理功能已经正常工作。
2)、验证缓存功能

查看/var/nginx/cache缓存目录下是否有缓存文件存在,如图2-10所示




图2-10
由图中结果,可以看出,缓存已经生效。Realserver2的验证不再给出。
2.3 rsync+inotify实现数据同步

为了方便管理与维护,将Nginx与Apache的Web页面放置在/var/www目录下。具体配置不再给出。
2.3.1 安装rsync与inotify-tools

inotify-tools是用来监控文件系统变化的工具,因此必须安装在内容发布节点,服务节点无需安装inotify-tools,另外需要在Realserver1和Realserver2节点上安装rsync。在这个案例中,内容发布节点充当了rsync客户端的角色,而服务节点充当了rsync服务器端的角色,整个数据同步的过程,其实就是一个从客户端向服务端推送数据的过程。这里讲Realserver1配置为内容分发节点,Realserver2为服务节点。编译安装rsync
[root@r1 ~]#tar xf rsync-3.0.4.tar.gz
[root@r1 ~]#cd rsync-3.0.4
[root@r1 rsync-3.0.4]#./configure
[root@r1 rsync-3.0.4]#make && make install

编译安装inotify-tools
[root@r1 ~]#tar xf inotify-tools-3.14.tar.gz
[root@r1 ~]#cd inotify-tools-3.14
[root@r1 inotify-tools-3.14]#./configure
[root@r1 inotify-tools-3.14]#make && make install

2.3.2 Realserver2服务节点的rsync配置文件的配置

这个配置文件默认是没有的,需要手动创建。
[root@r2 ~]# vim /etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot = no
max connections = 10
strict modes = yes
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log

[web]
path = /var/www/
comment = web file
ignore errors
read only = no
write only = no
hosts allow = 192.168.1.21
hosts deny = *
list = false
uid = root
gid = root
auth users = webuser
secrets file = /etc/web.pass

创建认证文件
[root@r2 ~]# vim /etc/web.pass
webuser:123456
[root@r2 ~]# chmod 600 /etc/web.pass
[root@r2 ~]# /usr/local/bin/rsync –daemon
[root@r2 ~]# echo "/usr/local/bin/rsync --daemon" >> /etc/rc.local


2.3.3 Realserver1上的配置

编写一个脚本来将文件同步到Realserver2上的/var/www目录中。脚本如下:
[root@r1 ~]# vim rsync.sh

#!/bin/bash
host=192.168.1.22
src=/var/www/
dst=web
user=webuser

/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,delete,create,attrib $src | while read files
do
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/web.pass $src $user@$host::$dst

echo "${files} was rsynced" >> /tmp/rsync.log 2>&1
done

创建相应的认证文件
[root@r1 ~]# vim /etc/web.pass
123456
[root@r1 ~]# ./rsync.sh &
[root@r1 ~]# echo "rsync.sh &" >> /etc/rc.local

2.3.4 文件同步验证

在Realserver1的/var/www目录下创建一个文件,如图2-11




图2-11
从图中可以看出文件正在传输,我们再来看Realserver2的/var/www目录,如图2-12



图2-12
在Realserver2上已经同步到了相应的文件,由此可以看出,rsync+inotify配置成功。

2.4 LVS负载均衡的安装与配置

LVS是通过IPVS模块来实现的。IPVS是LVS集群系统的核心软件,主要用于完成用户的请求到达负载调度器后,如何将请求发送给每一个Realserver节点、Realserver节点如何响应数据给用户等。这里采用的是DR模型。

在配置之前,首先应该查看内核是否支持IPVS模块
[root@node1 ~]# modprobe -l | grep ipvs
/lib/modules/2.6.18-164.el5/kernel/net/ipv4/ipvs/ip_vs.ko
/lib/modules/2.6.18-164.el5/kernel/net/ipv4/ipvs/ip_vs_dh.ko
/lib/modules/2.6.18-164.el5/kernel/net/ipv4/ipvs/ip_vs_ftp.ko
/lib/modules/2.6.18-164.el5/kernel/net/ipv4/ipvs/ip_vs_lblc.ko
/lib/modules/2.6.18-164.el5/kernel/net/ipv4/ipvs/ip_vs_lblcr.ko
/lib/modules/2.6.18-164.el5/kernel/net/ipv4/ipvs/ip_vs_lc.ko
/lib/modules/2.6.18-164.el5/kernel/net/ipv4/ipvs/ip_vs_nq.ko
/lib/modules/2.6.18-164.el5/kernel/net/ipv4/ipvs/ip_vs_rr.ko
/lib/modules/2.6.18-164.el5/kernel/net/ipv4/ipvs/ip_vs_sed.ko
/lib/modules/2.6.18-164.el5/kernel/net/ipv4/ipvs/ip_vs_sh.ko
/lib/modules/2.6.18-164.el5/kernel/net/ipv4/ipvs/ip_vs_wlc.ko
/lib/modules/2.6.18-164.el5/kernel/net/ipv4/ipvs/ip_vs_wrr.ko

如果有上面这些信息输出,表明内核支持IPVS模块。接下来就可以安装IPVS管理软件,并进行集群配置了。

2.4.1 安装ipvsadm管理软件

这里采用yum方式安装,yum源的配置上面已经给出,这里直接安装。

[root@node1 ~]# yum install ipvsadm -y

2.4.2 两台Director建立双机互信

1)、Master Director的配置生成一对密钥:(私钥).ssh/id_rsa,.ssh/id_rsa.pub

[root@node1 ~]# ssh-keygen -t rsa

把公钥.ssh/id_rsa.pub复制到Slave Director的root用户的家目录下的.ssh目录中的authorized_keys文件中去
[root@node1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.12

2)、Slave Director的配置

生成一对密钥:(私钥).ssh/id_rsa,.ssh/id_rsa.pub
[root@node2 ~]# ssh-keygen -t rsa

把公钥.ssh/id_rsa.pub复制到Master Director的root用户的家目录下的.ssh目录中的authorized_keys文件中去
[root@node2 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.11

2.4.3 安装Heartbeat2.1.3

Heartbeat的安装需要安装libnet软件包,所以先编译安装libnet。Libnet是一个高层次的API工具,可以从http://sourceforge.net/projects/libnet-dev/下载。

1)、安装libnet
[root@node1 ~]# tar xf libnet-1.1.6.tar.gz
[root@node1 ~]# cd libnet-1.1.6
[root@node1 libnet-1.1.6]# ./configure
[root@node1 libnet-1.1.6]# make && make install

2)、安装heartbeat
[root@node1 ~]# tar xf heartbeat-2.1.3.tar.gz
[root@node1 ~]# cd heartbeat-2.1.3
[root@node1 heartbeat-2.1.3]# ./ConfigureMe configure --disable-swig --disable-snmp-subagent
[root@node1 heartbeat-2.1.3]#make
[root@node1 heartbeat-2.1.3]#make install
[root@node1 heartbeat-2.1.3]# cp doc/ha.cf doc/haresources doc/authkeys /etc/ha.d/
[root@node1 heartbeat-2.1.3]# cp ldirectord/ldirectord.cf /etc/ha.d/
[root@node1 heartbeat-2.1.3]# groupadd -g 256 haclient
[root@node1 heartbeat-2.1.3]# useradd -u 256 -g haclient hacluster

为了保证ldirectord插件可用,需要安装perl-MailTools的rpm包
[root@node1 ~]# yum localinstall perl-MailTools-1.77-1.el5.noarch.rpm --nogpgcheck -y

2.4.4 配置集群服务

1、配置heartbeat的主配置文件/etc/ha.d/ha.cf

将下面列出的字段启用或做相应更改:
logfile /var/log/ha-log
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport 694
bcast     eth1
node    node1.rrl.com
node    node2.rrl.com
ping 192.168.1.1

2、配置heartbeat的资源文件/etc/ha.d/haresources

Haresources文件用于指定双机系统的主节点、集群IP、子网掩码、广播地址以及启动的服务等集群资源。文件每一行可以包含一个活多个资源脚本名,资源脚本名之间用空格隔开,参数之间使用两个冒号隔开。
node1.rrl.com   IPaddr::192.168.1.100/24/eth0 ldirectord

3、配置heartbeat的认证文件/etc/ha.d/authkeys

Authkeys文件用于设定heartbeat的认证方式,该文件有3种可用的认证方式:crc、sha1和md5,这里使用sha1认证方式。设置如下:
#auth 1
#1 crc
#2 sha1 HI!
#3 md5 Hello!
auth 1
1 sha1 f661f9b61ad0fdcbc2e20a5578ef089d

而且这个文件的权限必须是600,所以执行下列命令:
[root@node1 ~]#chmod 600 /etc/ha.d/authkeys

4、配置Ldirectord的配置文件/etc/ha.d/ldirectord.cf

将相关选项修改为下面内容
virtual=192.168.1.100:80
real=192.168.1.21:80 gate
real=192.168.1.22:80 gate
fallback=127.0.0.1:80 gate
service=http
request=".test.html"
receive="OK"
scheduler=rr
#persistent=600
#netmask=255.255.255.255
protocol=tcp
checktype=negotiate
checkport=80

5、将上面修改的配置文件复制到Slave Director上
[root@node1 ~]# scp -p /etc/ha.d/haresources /etc/ha.d/ldirectord.cf /etc/ha.d/authkeys /etc/ha.d/ha.cf 192.168.1.12:/etc/ha.d/

6、Realserver上的配置

在LVS的DR模型下,用户的访问请求到达Realserver后,是直接返回给用户的,不再经过前端的Director Server,因此,需要在每个Realserver节点上增加虚拟的VIP地址,这样数据才能直接返回给用户。增加VIP的操作可以通过创建脚本的方式来实现。创建文件/etc/init.d/lvsrs.脚本内容如下:

[root@r1 ~]# vim /etc/init.d/lvsrs
#!/bin/bash
#
# Script to start LVS DR real server.
# description: LVS DR real server
#
.  /etc/rc.d/init.d/functions
VIP=192.168.1.100
host=`/bin/hostname`
case "$1" in
start)
# Start LVS-DR real server on this machine.
/sbin/ifconfig lo down
/sbin/ifconfig lo up
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
;;
stop)
# Stop LVS-DR real server loopback device(s).
/sbin/ifconfig lo:0 down
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
;;
status)
# Status of LVS-DR real server.
islothere=`/sbin/ifconfig lo:0 | grep $VIP`
isrothere=`netstat -rn | grep "lo:0" | grep $VIP`
if [ ! "$islothere" -o ! "isrothere" ];then
# Either the route or the lo:0 device
# not found.
echo "LVS-DR real server Stopped."
else
echo "LVS-DR real server Running."
fi
;;
*)
# Invalid entry.
echo "$0: Usage: $0 {start|status|stop}"
exit 1
;;
esac

并在nginx的页面目录下创建.test.html文件
[root@r1 ~]# vim /usr/nginx/html/.test.html
OK

3.4.5 LVS的负载均衡的验证

1)、通过浏览器访问192.168.1.100,结果如图2-13所示




图2-13
查看集群资源,如图2-14所示



图2-14
查看虚拟IP,如图2-15所示



图2-15
从上面的内容可以看出配置的集群已经正常工作了。所有配置工作完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息