大数据网站降低单点故障损失的方法0+

66,406 views / 2009.09.03 / 12:12 上午

大数据网站的数据具有访问频率高,更新速度快,更新量大,不便于备份等特点,如果我们依然用传统的单服务器单数据库去构架,首先不能保证大流量访问,其次数据备份困难,再次数据出现故障不能及时修复,所以,我们从两个方面着手,本着低成本的原则,提出解决方案。

一 采用双网卡,内网外网分离,维护时内网操作,外网负载均衡后提供服务。采用主从数据库的方式。

目的:提高系统稳健性,降低单点故障给系统构成的影响。

前提:1. BIGIP自动识别异常服务器功能正常工作;2. 系统挂载的存储及数据库正常工作

方式

1. web端的冗余

a) 唯一性数据存放在存储服务器上(模板、静态化文件、碎片等)

b)程序等多份数据(选择一台机器做为主机器,用rysnc进行程序更新以及分发),程序定期更新至svn。

 2 . 数据库冗余

采用M-S模式,进行读写分离。在程序上进行控制,要是有一个出问题直接切回单机模式,来防止数据库机器损害带来的长时间停机。(应用程序修改大,需要较长时间,可以考虑进一步优化)

如图:

1

二 挂载双存储,每个存储分多个挂载点挂载到前端服务器。

如果系统存储只有一台服务器,如果出问题,会造成长时间服务中断,我们讨论出一套方案,可以使损失降到尽量小。

设存储一为s1,存储二为s2, 这两台都有三个挂载点,记为data1,data2,data3,我们把s1的data1,data2挂载在前端机器上,把s2的data3也挂载在前端机器上,同时每天把s1的data1,data2同步到s2, 把s2的data3同步到s1,保证两个存储数据尽量同步。

如图:

2

当故障发生时,比如s2宕掉,可以快速的把前端服务器的data3挂载改为s1的data3,这样只有最多一天的单个目录数据丢失,我们可以再对其进行简单的恢复操作。?

优点:1. 单存储负载被分担 2.线上已有产品程序不用调整 3.故障时处理迅速

缺点:故障恢复时,当天的部分数据可能会丢失。

同时兼容32位与64位机器的php hash函数2+

41,907 views / 2009.09.01 / 8:08 下午

时代在进步,社会在发展,64位机的出现导致移位元算不再很轻易溢出,这固然是件值得高兴的事情,可在系统迁移中,忽然发现64位机器hash函数得出的结果居然与32位不一样,震惊之余赶紧研究算法在发现是移位运算符号的问题。

没办法,只好对系统进行判断,并针对64位机器重写了算法,代码如下:

if (exec("getconf LONG_BIT") == "32") {
 function _hash($apszData = "", $MAX_TABLE_NUM = 0) {
  $_hash = $x = $i = 0;
  for($i = 0; $i < strlen($apszData); $i++) {
   $_hash = ($_hash << 4) + ord($apszData[$i]);
   if (($x = $_hash &0xF0000000) != 0) {
    $_hash ^= ($x >> 24);
    $_hash &= ~$x;
   } 
  } 
  return ($_hash &0x7FFFFFFF) % $MAX_TABLE_NUM + 1;
 } 
} else {
 function _hash($apszData = "", $MAX_TABLE_NUM = 0) {
  $hash = $x = $i = 0;
  for($i = 0; $i < strlen($apszData); $i++) {
   $hash = ($hash << 4) + ((ord($apszData[$i])) << 32);
 
   if (($x = $hash &0xF000000000000000) != 0) {
    $hash ^= $x >> 24;
    $hash &= (~$x) &0xFFFFFFFF00000000;
   } 
  }
 
  $ret = ($hash &0x7FFFFFFF00000000) % ($MAX_TABLE_NUM << 32) + (1 << 32);
  $ret >>= 32;
  $ret &= 0xFFFFFFFF;
  return $ret;
 } 
}

如果你不知道hash函数的作用,请参阅 http://baike.baidu.com/view/20089.htm

Categories: 感悟 Tags: , ,

操作页面刷新后,数据不能及时更新1+

93,426 views / 2009.09.01 / 6:06 下午

众所周知,刷新页面可以直接在html的head标签中使用如下代码:

<meta http-equiv="refresh" content="1; URL=http://www.71j.cn">

其中content中的数字1表示等待是时间(秒)

也可以使用php发送头消息:

header("location:http://71j.cn");

甚至可以使用js中window.location.reload()方法,但是我们在开发过程中发现,因为浏览器或者CDN等带有的缓存机制会使页面刷新后,数据得不到刷新。

解决办法如下:

function autorefresh(){
var s="&";
var href=window.location.href;
if(href.indexOf("t=")==-1){
if(href.indexOf("?")==-1) s="?";
window.location.href+=s+"t="+new Date().getTime();
}else{
window.location.href = href.replace(/t=[0-9]+/,"t="+new Date().getTime());
}
}

这样给url加上时间戳,可以有效解决本问题。

Categories: 感悟 Tags: , , ,

使用javascript从url获取参数值0+

71,939 views / 2009.09.01 / 6:06 下午

随着Ajax的泛滥,有时需要我们从url获取变量进行用户交互,本函数提供了获取方法:

function getQuery(name)
{
var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if (r!=null) return unescape(r[2]); return null;
}

如需要从下面地址中获取id的值:
http://71j.cn/a.php?a=my&id=7&m=1
只需要在当前页面调用getQuery(“id”)即可。

Categories: 感悟 Tags: , ,

我也收集了一些常用的正则表达式0+

68,902 views / 2009.09.01 / 5:05 下午

兄弟姊妹们,这可是极品文章,强烈建议大家收藏,以后不用每次都费劲脑汁编正则表达式了!
匹配中文字符的正则表达式: [\u4e00-\u9fa5]

匹配双字节字符(包括汉字在内):[^\x00-\xff]

应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}

匹配空行的正则表达式:\n[\s| ]*\r

匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/

匹配首尾空格的正则表达式:(^\s*)|(\s*$)

应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现,如下:

String.prototype.trim = function()
{
return this.replace(/(^\s*)|(\s*$)/g, "");
}

利用正则表达式分解和转换IP地址:

下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的javascript程序:

function IP2V(ip)
{
re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正则表达式
if(re.test(ip))
{
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
}
else
{
throw new Error("Not a valid IP address!")
}
}

不过上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下:

var ip="10.100.20.168"
ip=ip.split(".")
alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))

匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

匹配网址URL的正则表达式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?

利用正则表达式去除字串中重复的字符的算法程序:[注:此程序不正确,原因见本贴回复]

var s="abacabefgeeii"
var s1=s.replace(/(.).*\1/g,"$1")
var re=new RegExp("["+s1+"]","g")
var s2=s.replace(re,"")
alert(s1+s2) //结果为:abcefgi

我原来在CSDN上发贴寻求一个表达式来实现去除重复字符的方法,最终没有找到,这是我能想到的最简单的实现方法。思路是使用后向引用取出包括重复的字符,再以重复的字符建立第二个表达式,取到不重复的字符,两者串连。这个方法对于字符顺序有要求的字符串可能不适用。

得用正则表达式从URL地址中提取文件名的javascript程序,如下结果为page1

s="http://www.71j.cn/page1.htm"
s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")
alert(s)

利用正则表达式限制网页表单里的文本框输入内容:

用正则表达式限制只能输入中文:

onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"

用正则表达式限制只能输入全角字符:

 onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"

用正则表达式限制只能输入数字:

onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

用正则表达式限制只能输入数字和英文:

onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

判断是否为数字

function isNumber(oNum)
{
if(!oNum) return false;
var strP=/^\d+(\.\d+)?$/;
if(!strP.test(oNum)) return false;
try{
if(parseFloat(oNum)!=oNum) return false;
}
catch(ex)
{
return false;
}
return true;
}
Categories: 分享 Tags: , ,