最近一直在找工作,好久都没有更新博客了。希望从这篇博客开始,自己继续以培训时的热情和动力去学习新的知识与技术;也希望自己从不自信和自卑中走出来,以自信饱满的姿态迎接以后的生活。同时也警示自己——快点找到工作吧,不然该饿肚子了。
这篇博客就是上篇博客中提到的夭折了的我的第一份毕业实训报告,为了以后能快速的找到就放在这里吧!和绝大多数计算机专业的毕业报告一样,前面的内容都是借鉴网上和其他人的毕业报告拼凑起来的,实在没什么营养,这里就略过了。下面所写的都是经过试验做出来的,然后写出来的,可靠性还是有保证的。废话不多说了,开始吧!
简单说明:
本网站架构设计方案采用LVS+Hearbeat实现Web集群的负载均衡和高可用;LNAMP架构提供Web服务;rsync+inotify实现数据的同步。
参考文献:高俊峰老师的《高性能Linux服务器构建实战》
第一部分 网站架构设计
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 Director | DIP:192.168.1.11 | 与后端Realserver通信 |
Master Director | VIP:192.168.1.100 | 提供服务的网络地址 |
Master Director | eth1:10.10.10.1 | 用于与Slave Director传递心跳信息 |
Slave Director | DIP:192.168.1.12 | 与后端Realserver通信 |
Slave Director | eth1:10.10.10.2 | 用于与Master Director传递心跳信息 |
RealServer 1 | RIP:192.168.1.21 | 与前端Director通信 |
RealServer 1 | VIP:192.168.1.100 | 用来直接响应客户端的请求 |
RealServer 2 | RIP:192.168.1.22 | 与前端Director通信 |
RealServer 2 | VIP:192.168.1.100 | 用来直接响应客户端的请求 |
Master MySQL | 192.168.1.23 | |
Slave MySQL | 192.168.1.24 |
主机命名规范,如表1-2所示
Server | Hostname |
Master Director | node1.rrl.com |
Slave Director | node2.rrl.com |
RealServer 1 | r1.rrl.com |
RealServer 2 | r2.rrl.com |
Master MySQL | master.mysql.com |
Slave MySQL | slave.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.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
从测试结果说明数据库连接正常。
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的测试与验证
图2-6 访问Realserver1
图2-7 访问Realserver2
从测试结果可以看出nginx工作正常。
2.2.6 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实现数据同步
2.3.1 安装rsync与inotify-tools
- [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
- [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上的配置
- [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
图2-12
在Realserver2上已经同步到了相应的文件,由此可以看出,rsync+inotify配置成功。
2.4 LVS负载均衡的安装与配置
LVS是通过IPVS模块来实现的。IPVS是LVS集群系统的核心软件,主要用于完成用户的请求到达负载调度器后,如何将请求发送给每一个Realserver节点、Realserver节点如何响应数据给用户等。这里采用的是DR模型。
- [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
- [root@node1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
2)、Slave Director的配置
- [root@node2 ~]# ssh-keygen -t rsa
- [root@node2 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
2.4.3 安装Heartbeat2.1.3
Heartbeat的安装需要安装libnet软件包,所以先编译安装libnet。Libnet是一个高层次的API工具,可以从http://sourceforge.net/projects/libnet-dev/下载。
- [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
- [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
- [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
- node1.rrl.com IPaddr::192.168.1.100/24/eth0 ldirectord
3、配置heartbeat的认证文件/etc/ha.d/authkeys
- #auth 1
- #1 crc
- #2 sha1 HI!
- #3 md5 Hello!
- auth 1
- 1 sha1 f661f9b61ad0fdcbc2e20a5578ef089d
- [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
- [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上的配置
- [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
- [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
从上面的内容可以看出配置的集群已经正常工作了。所有配置工作完成。