高考中国网高可用、负载均衡、可扩展设计与实现

作者:田逸(sery@163.com

 

 

第一章       项目描述

高考中国主要包含“高考志愿通”志愿填报系统的研究开发、产品运营;高考中国网站(www.gaokaochina.com)的开发、维护与运营。

“高考志愿通”是经过数十位全国高考志愿填报指导专家、计算机网络专家、数学模型专家和数据统计专家历时多年精心打造。成为中国第一套高考志愿填报综合分析系统,信息最全最新的高考志愿填报综合分析系统,分析最科学、最精确的填报指导系统。

目前已经开发了服务全国高考考生的志愿填报辅助参考系统——《高考志愿通》网络版,光盘版和校园版。高考志愿通每年服务上百万考生,目前在全国20多个省市设立销售机构。

他全国独创的位次、线差、曲线填报方式,为考生们科学合理的填报志愿,提供了方法和依据,让所有家长和考生一看就能够清楚明白好用的系统。从03年推广至今,深受家长和考生们的好评。高达98%以上的志愿填报成功率,帮助考生实现上大学、上好大学好专业的梦想。

高考中国网站(www.gaokaochina.com)是以刊登高考最新动态、高考新闻、招生信息、各大院校最新信息、备考辅导、政策法规等高考相关内容为主。高考中国网站本着发布最新最全的高考信息为目标,为高考生打造一个专业的高考门户网站。

1.1      高考中国网现行的运行架构 

高考中国网的基本架构是典型的LAMP架构,即系统采用linux,应用使用apache整合php,然后加上开源数据库mysql.经验证明,这是一个比较高效而且节省成本的解决方案:除了硬件而外,每个组件都是免费的。当初,由于用户数量少,就把所有的组件都安装在一个服务器硬件上面;其主要目的是节省带宽费、托管费以及硬件购置费。图1-1是其基本结构逻辑。

图1-1 所有应用运行在一个服务主机上的逻辑图

随着公司商业推广的进行,访问该网站的用户数量急剧增加。加之高考即将临近,估计未来几个月内,用户数量可能成几何级的增长,这对于公司来说,应该是件好事。但是,随着用户的增长,现行的平台将无法支撑更大规模的访问服务。

由于是商业网站,保证其365*7*24可用是必须的了。以一个服务器运行所有程序,将可能面临如下几个问题:

◆     故障:只要任何一个组件服务出故障,整个服务都会停止。

◆     扩展:为提高性能或存储容量,可以增加内存等部件,但总有一个限度。

◆     性能:用户越多,性能越差,速度越慢。

◆     带宽:用户越多,消耗的带宽也就越大,但是单个服务器的带宽是固定的,理论值是1G,当带宽消耗带一定量时,即不能提供访问,也无法在增加带宽。

◆     硬件冗余:服务器任何一个部件实效,整个网站的服务都不再可用。

把这些不利状况归纳起来,就是现行的网站不具备高可用、可扩展、负载均衡的特点。尽管当前网站运行状况还能应付,但对于上述几个方面的忧虑却令企业负责人寝食难安,他要求务必在高考来临之前解决这些问题。

1.2      功能需求 

 

本系统为典型的互联网服务型网站,需要达到365*7*24可提供访问服务,用现在流行的专业术语描述,就是高可用、可扩展、负载均衡的架构;只有这样的架构,才有可能达到这个要求。

1.2.1  高可用 

 

高可用是指在一段时间内(通常是一年),系统能正常提供服务的时间,它是以一个百分比来度量,如可用性99.99%。当然,没有任何人能保证系统可用性达到100%,但可以通过良好的设计,不断地接近100%。对外宣称小数点后能到达9的个数,是一个技术团队实力的体现。

1.2.2 可扩展 

用户的增加,引起访问数乃至流量的增加,这种情形下,需要对系统进行扩容,以应对这种快速增长。对于提供高可用服务的互联网网站,其对可扩展的基本要求就是在保持系统服务不终止的情况下,透明的扩充容量,即用户不知道扩容的存在,或者说是扩容不对现有的服务产生任何负面作用。这些扩展主要包括:带宽扩展、服务器扩展、存储容量扩展、数据库扩展等,当然也包括主机增加内存等方面的扩展。只要能保证可以在线扩展,我们就可以认为系统具有很好的扩展性。

1.2.3负载均衡 

一个应用或服务由数个物理服务器提供,并且每个物理服务器运行的应用或服务是相同的,我们可以让用户的访问通过某种控制策略,把负载分摊到不同的物理服务器,从而保持每个物理服务器有比较合理的负载。同时,负载均衡还具备故障隔离的功能,当某些物理服务器失效时,自动从负载转发队列剔除故障服务器,一旦故障得以恢复,用户访问负载则自动加载上来。负载均衡一般是2层架构:转发器和真实提供服务或应用的服务器。除了真实服务器可以失效且不影响服务外,转发器也能做到其中一个失效,另外一个自动失败切换,从来保持服务的可用性。

当整个系统的负载趋于饱和时,通过增加物理服务器和扩充物理带宽来扩容。增加物理服务器以后,系统的负载情况将重新在所有集群的物理服务器之间按照指定的算法重新达到新的均衡。例如:现在有50000个并发连接,4个机器,按照wlc 等权值的负载策略,则每个物理服务器的大概连接数为1250;此时再增加一个服务器,负载策略不变,则稳定后的每个物理服务器连接数大概为1000。

1.2.4 平台状态可视化

尽管有前面描述的措施保证系统的高可用、可扩展及负载均衡,但我们还需要随时知道系统的运行状态,一旦有机器失效或者某个服务不可用,应当及时发现并及时处理,而不要让故障一直积累,直到所有的服务都不可用以后,再来处理就谈不上什么高可用了。因此,监控平台的启用是不可或缺的了,有了它,就相当于多了一双“眼睛”,随时随地,我们都可以知道整个平台是否正常运行。 (全文 …)

简单cdn

On 2009年12月29日, in 云计算, by admin
5

第七章 简单cdn

作者:田逸(sery@163.com

 

7.1 cdn概述

Cdn是Content Delivery Network首字母缩写,译成中文就是内容分发网络。使用cdn技术的主要目的在于增加访问速度、解决南北互联(中国适用)、提高用户体验等等。Cdn历史上最有名的事件:当属关于克林顿丑闻的斯塔尔报告被放在互联网,因下载该报告的人太多,最终导致服务器瘫痪。该事件直接促使cdn的诞生。

最早的商业cdn服务可能诞生于1999年,但本人闻之cdn这个业务则是2005年的事情了。到了2006年的春天,我有幸得到一个cdn设计方面的工作,这才有机会全面了解cdn原理、设计、部署以及运营等。

7.1.1 为什么需要使用cdn

1、  解决网站高流量、大并发的问题。我们知道,任何一个物理设备,其负载都有一个极限。为了应对访问量突增,使用cdn服务是一个好的系统扩容方案。

2、  解决南北互联问题。我国的网络是划江而治的格局,因为利益之争,各网络服务商之间并不是通力协作,而是采取各种手段相互限制。这就导致各网之间的互联互通存在很大的问题,具体表现为:电信的用户访问放置在网通机房的服务器,响应时间特别长,反之亦然。使用cdn技术,可以让电信的用户访问电信的内容缓存服务器,网通的用户访问网通的内容缓存服务器。通过这样一种策略,绕开了运行商之间人为设置的障碍。

3、  访问加速。Cdn采用缓存技术,把访问对象缓存起来,有的技术甚至能把对象缓存到内存(如varnish),这在效果上表现出来就是访问加速。

4、  降低总体运营成本。在一些互联互通比较好的第三方BGP机房,其带宽费高达300-400元/兆/月,而二、三线城市单线接入的带宽费100M一年的费用才5万左右。使用cdn运营方案,我们把源站放在BGP机房,而把缓存服务器放置在带宽费用较低的其它地方。因为cdn的大部分流量被转移到缓存服务器上,源站只有较小的访问请求,因此总体运营成本大幅降低。

5、  提高网站的可用性。源站的访问量变得很小,这意味着源站系统有更低的负载,更低的磁盘i/o,除故障的几率大大降低。对于缓存服务器,多个服务器做成集群,保证整个系统的高可用。

6、  防ddos攻击。攻击负载被分配到不同的物理服务器,客观上起到防ddos的作用。

 

7.1.2 cdn适用的场合

任何一门技术,都有一定的适用范围,cdn也不另外。实践证明,cdn对于静态对象的加速和发布具有很好的效果,但对于动态的网站,则效果不佳。为了使用cdn技术所带来的好处,我们可以通过动态内容静态化、静态内容分离(如动态站点里的图片)等方式,来加速访问和增强用户体验。

有哪些对象是静态可缓存的呢?这包括html页面文件、视频文件、js文件、css文件、exe文件、图片文件(jpeg、gif、png等)等。

7.1.3 cdn的组成

 

Cdn是一种组合技术,它包括源站、缓存服务器、智能dns、客户端等几个部分。

源站指发布内容的原始站点。新增、删除和更改网站的文件,都是在源站上进行的;缓存服务器抓取的对象也全部来自于源站。

缓存服务器是直接提供给用户访问的站点资源,有一个或数个服务器组成;当一个用户发起访问时,他的访问请求被智能dns定位到离他较近的缓存服务器。如果访问所需的内容没有被缓存,则缓存服务器向邻近的缓存服务器或直接向源站抓取内容,然后再返还给用户;如果用户所请求的内容刚好在缓存里面,则直接把内容返还给用户。

智能dns是整个cdn的核心,它负责根据用户的来源,将其访问请求转向到离用户较近或较合适的缓存服务器—如把长沙电信的用户请求转向到长沙电信机房的缓存服务器。实现智能dns的一种技术是:bind view,在bind 9以后的版本,都应该支持view 视图这个功能。另外还有一个次一点的方案,即dns轮询方式。

客户端即普通发起访问的用户,一般的访问方式是浏览器。这个不再做说明。 (全文 …)

Tagged with:
 

moosefs-1.6.10安装手记

On 2009年12月24日, in 云计算, by admin
4

Moosefs-1.6.10 INSTALL

 

Forms 1

rule OS ip Service Host quantity
Master Centos 5.3 192.168.0.19 Mfsmaster,mfsmetalogger 1
chunkserver Centos5.3/freebsd7.* 192.168.0.71~74 chunkserver 4
Mfs client Centos5.3/freebsd7.* 192.168.0.0/24 mfsmount several

 

Use software:

1 fuse-2.7.4.tar.gz

2 mfs-1.6.10.tar.gz

 

 

Master install and running steps:

1 add mfs user :useradd mfs –s /sbin/nologin

 

2 install mfs: tar zxvf mfs-1.6.10.tar.gz; cd mfs-1.6.10; ./configure –prefix=/usr/local/mfs –with-default-user=mfs –with-default-group=mfs; make ; make install

 

3 produce and modify configuration file:

(1) cd /usr/local/mfs/etc ; cp mfsmaster.cfg.dist mfsmaster.cfg ; cp mfsmetalogger.cfg.dist mfsmetalogger.cfg

(2) vi mfsmetalogger.cfg –>  MASTER_HOST = 192.168.0.19

(3) mkdir /var/run/mfs ; chown –R mfs:mfs /var/run/mfs

 

4 running mfsmaster:

(1) cd /usr/local/mfs ; sbin/mfsmaster start

(2) sbin/mfsmetalogger start

(3) check process: ps aux | grep mfsmaster

(4) check system log: tail –f /var/log/messages

(5) check network status: netstat –an | grep tcp

tcp4       0     52  192.168.0.19.22        192.168.1.252.49020    ESTABLISHEDtcp4       0      0  192.168.0.19.9420      192.168.0.75.16178     ESTABLISHED

tcp4       0      0  192.168.0.19.9420      192.168.0.72.42870     ESTABLISHED

tcp4       0      0  192.168.0.19.9420      192.168.0.71.2740      ESTABLISHED

tcp4       0      0  192.168.0.19.9420      192.168.0.73.38114     ESTABLISHED

tcp4       0      0  192.168.0.19.9419      192.168.0.19.25712     ESTABLISHED

tcp4       0      0  *.9421                 *.*                    LISTEN

tcp4       0      0  *.9420                 *.*                    LISTEN

tcp4       0      0  *.9419                 *.*                    LISTEN

…………………….(omitted)…………………………..

 

Everything seems to be fine!!!!!

 

 

Chunkserver install and running steps:

1 add mfs user :useradd mfs –s /sbin/nologin

 

2 install mfs: tar zxvf mfs-1.6.10.tar.gz; cd mfs-1.6.10; ./configure –prefix=/usr/local/mfs –with-default-user=mfs –with-default-group=mfs; make ; make install

 

3 produce and modify configuration file:

(1) cd /usr/local/mfs/etc ; cp mfschunkserver.cfg.dist mfschunkser.cfg ; cp mfshdd.cfg.dist  mfshdd.cfg

(2) vi mfschunkserver.cfg –> MASTER_HOST = 192.168.0.19

(3) vi mfshdd.cfg –> /data (It is a separate partition)

(4) mkdir /var/run/mfs ; chown –R mfs:mfs /var/run/mfs

(5) chown –R mfs:mfs /data

 

4 running mfsmaster:

(1) cd /usr/local/mfs ; sbin/mfschunkserver start

(2) check process: ps aux | grep mfsmaster

(3) check system log: tail –f /var/log/messages

(4) check network status: netstat –an | grep tcp

(5) check directory /data , Observed the existence of a file or directory: ls –al /data

[root@mfs-1 etc]# ls -al /data/total 1036

drwxr-xr-x 258 mfs  mfs  4096 Dec 23 11:59 .

drwxr-xr-x  24 root root 4096 Dec 22 10:17 ..

drwxr-x—   2 mfs  mfs  4096 Dec 23 11:59 00

drwxr-x—   2 mfs  mfs  4096 Dec 23 11:59 01

drwxr-x—   2 mfs  mfs  4096 Dec 23 11:59 02

drwxr-x—   2 mfs  mfs  4096 Dec 23 11:59 03

………………………………

Everything seems to be fine!!!!!

 

 

Mfs client install and mount operation steps:

1 add mfs user :useradd mfs –s /sbin/nologin

 

2 install mfs: tar zxvf mfs-1.6.10.tar.gz; cd mfs-1.6.10; ./configure –prefix=/usr/local/mfs –with-default-user=mfs –with-default-group=mfs –enable-mfsmount; make ; make install

 

3 mount mfs:

(1) when os is freebsd: mkdir /mnt/mfs ; /usr/local/mfs/bin/mfsmount -h 192.168.0.19 ; df –h Output is as follows

shoucang5# df -hFilesystem                          Size    Used   Avail Capacity  Mounted on

/dev/ad4s1a                          19G    1.8G     16G    10%    /

devfs                               1.0K    1.0K      0B   100%    /dev

……………………………………………………………………..

/dev/fuse0                          7.1T      0B    7.1T     0%    /mnt/mfs

(2)when os is centos:mkdir /mnt/mfs ; /usr/local/mfs/bin/mfsmount -H 192.168.0.19 /mnt Output is as follows

[root@dl-src mfs]# bin/mfsmount -H 192.168.0.19 /mntmfsmaster register error: Permission denied

 

It is not fine!!!!!!!

 

Note:If found not fuse , you can perform command in unix shell .

#export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig

 

But when I use mfs-1.5.12 as mfsclient installing to mount master(version1.6.10),It is ok!

Tagged with:
 

问题描述:主从复制在某个时刻,从服务器同步失败,并给出报错消息。

消息内容:基本意思是缺少某个库的某个表

原因:主从服务长时间不同步,主库已经生成很多新的表或者库,而从库却没有。

操作过程
(1)登陆主服务器,查看主服务器的状态.

mysql>show master status;

(2)登陆从服务器,执行同步操作。

mysql>stop slave;

mysql > change master to …(此处省略);

 mysql > start slave;

(3)从服务器上查看状态

mysql > show slave status\G;

看报错信息少什么表或库,少什么就直接从主服务器通过scp复制,然后重复过程(1)~(3)直到不报错为止。

Tagged with:
 
问题描述:写了一个脚本,命名为check_mysql_slave. 其内容如下:

  1. #!/bin/sh
  2. declare -a    slave_is
  3. slave_is=($(mysql -p&hsg^d3    -e “show slave status\G”|grep Running |awk ‘{print $2}’))
  4. if [ "${slave_is[0]}” = “Yes” -a “${slave_is[1]}” = “Yes” ]
  5.      then
  6.      echo “OK -slave is running”
  7.      exit 0
  8. else
  9.      echo “Critical -slave is error”
  10.      exit 2
  11. fi

复制代码

把这个脚本放在从mysql服务器的目录/usr/local/nrpe/libexec,先登录到mysql,执行

  1. mysql> show slave status

复制代码

,了解到从服务器跟主服务器是正常同步的。再手动运行脚本

  1. ./check_mysql_slave

复制代码

,其输出为

  1. OK -slave is running

复制代码

正是我所期待的结果。接着把nrpe.cfg加入这个项目,然后执行

  1. libexec/check_nrpe -H 192.168.93.17 -c check_mysql_slave

复制代码

,无论mysql从服务器的状态是啥,都输出“Critical -slave is error”.即脚本check_mysql_slave下没有生效。

原因:手动执行脚本,使用的是root帐号,因此mysql登录也使用默认的mysql root帐号。而使用nrpe, 则是使用默认帐号nagios,但mysql本身并没有这个帐号。

处理:在主服务器上创建帐号nagios

  1. mysql > grant Replication client on *.* to    ‘nagios’@'%’ identified by ‘nagios’;   
  2. mysql> flush privileges;

复制代码

,接着修改脚本check_mysql_slave,其内容为:

  1. #!/bin/sh
  2. declare -a    slave_is
  3. slave_is=($(/usr/local/mysql/bin/mysql -unagios -pnagios    -e “show slave status\G”|grep Running |awk ‘{print $2}’))
  4. if [ "${slave_is[0]}” = “Yes” -a “${slave_is[1]}” = “Yes” ]
  5.      then
  6.      echo “OK -slave is running”
  7.      exit 0
  8. else
  9.      echo “Critical -slave is error”
  10.      exit 2
  11. fi

复制代码

修改完毕,手动执行脚本,看是否正常;然后再执行

  1. libexec/check_nrpe -H 192.168.93.17 -c check_mysql_slave

复制代码

一切正常!

Tagged with: