作者:Lightning@小宝
发布时间:September 28, 2009
分类:web服务器方向
在一个IP地址上运行多个基于域名的web站点 您的服务器有只一个IP地址,而在DNS中有很多域名(CNAMES)映射到这个机器。您而您想要在这个机器上运行www.example.com和www.example.org两个站点。
服务器配置
# 确保Apache在监听80端口
Listen 80
# 为虚拟主机在所有IP地址上监听
NameVirtualHost *:80 #不要忘记它哦!
<VirtualHost *:80>
DocumentRoot /www/example1
ServerName www.example.com
# 你可以在这里添加其他指令
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /www/example2
ServerName www.example.org
# 你可以在这里添加其他指令
</VirtualHost>
在不同的端口上运行不同的站点 如果您想让同一个IP的不同端口伺服多个域名。您可以借助在NameVirtualHost指令中定义端口的方法来达到这个目的。如果您想使用不带"name:port"的或是直接用Listen指令,您的配置将无法生效。
Listen 80
Listen 8080
NameVirtualHost 172.20.30.40:80
NameVirtualHost 172.20.30.40:8080
<VirtualHost 172.20.30.40:80>
ServerName www.example.com
DocumentRoot /www/domain-80
</VirtualHost>
<VirtualHost 172.20.30.40:8080>
ServerName www.example.com
DocumentRoot /www/domain-8080
</VirtualHost>
<VirtualHost 172.20.30.40:80>
ServerName www.example.org
DocumentRoot /www/otherdomain-80
</VirtualHost>
<VirtualHost 172.20.30.40:8080>
ServerName www.example.org
DocumentRoot /www/otherdomain-8080
</VirtualHost>
更多详情查看: apache虚拟主机配置文档
作者:Lightning@小宝
发布时间:September 25, 2009
分类:MySQL备份&优化&架构
最近发现master数据库和slave数据延时相差20分钟,赶紧登录slave看看服务器是不是繁忙,这时正好是早上8点多,数据应该不大,为什么导致这个问题呢?于是google到一篇有价值的文章(作者也是转载,我就不注明出处了)
Replication延时的类型
1.固定性的延时
Slave的数据持续性的落后于Master并且一直无法与Master的数据保持一致。
Slave的数据经常在白天落后于Master,而在晚上可以赶上并与Master的记录保持一致。
这种类型的延时通常是由于Slave服务器的负载已经到达了上限或在白天访问量大的时候到达上限造成的。
2. 非固定性的延时
Slave的数据只是短暂的落后于Master,可在短时间内恢复
这类型的延时通常与批量任务和报表有关,效率差的查询也会导致这类延时
Mysql Replication的限制
Mysql的Replication是单线程的,意味着只能有效的使用一个CPU内核和一个磁盘,一条复杂的查询或者事务都导致进程被阻塞,不过现在针对5.1版本的多线程Replication补丁,http://forge.mysql.com/wiki/ReplicationFeatures/ParallelSlave,还是pre版,有很多限制,感兴趣的可以去看看。
Replication的容量
1. 理解什么是Replication的容量
可以将Replication暂停一个小时,重新启动Replication后,观察Slave的数据多久可以与Master一致。从Replication重新启动到和Master数据一致所花费的时间与Replication暂停的时间的比值就是Replication的容量。
2. 建议保持Replication的容量在3倍以上,即延迟一个小时的数据,Slave只需要20分钟就能与Master的数据一致。
Replication的优化
1. 5.0的mysql中避免类似以下的更新语句
INSERT … SELECT
UPDATE …. WHERE (对于insert一条数据,然后又多次update的情况,个人建议,采用临时表(不是mysql的tmp table),可能一条数据在多次业务逻辑操作后,总会处于平静状态,这时候可以把它移动到另外的表做查询.)
复杂的查询会导致Replication线程阻塞。如果是insert或update与select结合的语句,可以讲select单独执行并保存在临时表中,然后再执行insert或者update。
如果使用的是5.1的mysql,新功能中的行级Replication(RBR)可以解决这个问题。RBR可以将在Master上通过复杂查询后更新的结果直接传给Slave,Slave可以直接将结果更新到数据库中。
2. 避免大的事务
太大的事务会造成Replication长时间阻塞,数据会严重滞后于Master。
Slave服务器的硬件选择
更快的CPU内核,对于单线程的Replication多核CPU是没有任何优势的。
更高速的硬盘,包括更高的转速和更好的高速缓存命中率,如果有钱的话上SSD吧
主从结构的扩展性问题
1.如何降低写操作的频率
Master的写操作会扩散到所有的Slave上,所以高频率的写操作会降低Slave的读操作效率。
至少保持一台Slave做全库同步,其他的Slave可以只做部分表的同步。当然,这需要web应用程序的配合来分配哪些查询读哪些Slave。(这一点很值得研究,这叫*分而治之*,有时候我们根本不需要全部去同步所有数据,按业务,和需求来同步,一方面减小的数据量,延迟明显就会下降,遇到复杂的sql语句,可以单独处理)
将一些更新操作放到memcached中,例如session和计数器。
Slave使用myisam引擎
将一些写入量很大的更新操作直接在slave上执行,而不通过Replication。(淘宝好像就是这样干的,把sql语句生成文件,然后拿到slave上执行)
2. 如何更有效的利用Slave的硬件资源
使用分区
有选择的对表进行同步
在Slave上对数据进行归档。
Session的持久化
为不同的应用服务器分配不同的Slave进行读操作。
或者根据查询类型的不同来分配不同的Slave。
3. 如何使你的程序最大化的利用Slave
将对数据更新不敏感的查询放到Slave上,而需要实时数据的查询则放到Master。
通过session的持久化,让做了修改的用户首先看到修改的内容,其他的用户可以等待Slave更新后再查看新内容。
对于某些数据,可以用memcached来存放数据的版本号,读Slave的程序可以先对比Slave的数据和memcached数据的版本,如果不一致则去读master。用户和博客类的信息可以用这种方法。
在查询前可以通过SHOW SLAVE STATUS检测Slave的状态,然后根据返回的结果进行服务器的选择。
作者:Lightning@小宝
发布时间:September 24, 2009
分类:JavaScript学习笔记
一般来说,我们判断 iframe 是否加载完成其实与 判断 JavaScript 文件是否加载完成 采用的方法很类似:
var iframe = document.createElement("iframe");
iframe.src = "http://www.planabc.net";
if (!/*@cc_on!@*/0) { //if not IE
iframe.onload = function(){
alert("Local iframe is now loaded.");
};
} else {
iframe.onreadystatechange = function(){
if (iframe.readyState == "complete"){
alert("Local iframe is now loaded.");
}
};
}
document.body.appendChild(iframe);
最近, Nicholas C. Zakas 文章《Iframes, onload, and document.domain》的评论中 Christopher 提供了一个新的判断方法(很完美):
var iframe = document.createElement("iframe");
iframe.src = "http://www.planabc.net";
if (iframe.attachEvent){
iframe.attachEvent("onload", function(){
alert("Local iframe is now loaded.");
});
} else {
iframe.onload = function(){
alert("Local iframe is now loaded.");
};
}
document.body.appendChild(iframe);
几点补充说明:
IE 支持 iframe 的 onload 事件,不过是隐形的,需要通过 attachEvent 来注册。
第二种方法比第一种方法更完美,因为 readystatechange 事件相对于 load 事件有一些潜在的问题。
转自:http://www.planabc.net/2009/09/22/iframe_onload/
作者:Lightning@小宝
发布时间:September 22, 2009
分类:JavaScript学习笔记
如果顶级域相同,使用document.domain可以实现跨域访问。
http://www.daxi8.cn/a.html
<script type="text/javascript">
document.domain = "daxi8.cn";
function test(){
alert('ok!');
}
</script>
<iframe src="http://blog.daxi8.cn/b.html"></iframe>
http://blog.daxi8.cn/b.html
<script type="text/javascript">
document.domain = "daxi8.cn";
//在iframe内页如果访问父窗口的js脚本方法及其全局变量呢?javascript给我们提供了 parent
parent.test();//猜猜会发生什么事。
</script>
如果是不同域名间的跨域,建议使用jsonp来实现跨域的访问。
作者:Lightning@小宝
发布时间:September 22, 2009
分类:JavaScript学习笔记

scrollHeight: 获取对象的滚动高度。
scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离
scrollTop:设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离
scrollWidth:获取对象的滚动宽度
offsetHeight:获取对象相对于版面或由父坐标 offsetParent 属性指定的父坐标的高度
offsetLeft:获取对象相对于版面或由 offsetParent 属性指定的父坐标的计算左侧位置
offsetTop:获取对象相对于版面或由 offsetTop 属性指定的父坐标的计算顶端位置
event.clientX 相对文档的水平座标
event.clientY 相对文档的垂直座标
event.offsetX 相对容器的水平坐标
event.offsetY 相对容器的垂直坐标
document.documentElement.scrollTop 垂直方向滚动的值
event.clientX+document.documentElement.scrollTop 相对文档的水平座标+垂直方向滚动的量
以上主要指IE之中,FireFox差异如下:
IE6.0、FF1.06+:
clientWidth = width + padding
clientHeight = height + padding
offsetWidth = width + padding + border
offsetHeight = height + padding + border
scrollHeight = 当前元素Height + 内部隐藏元素Height
IE5.0/5.5:
clientWidth = width - border
clientHeight = height - border
offsetWidth = width
offsetHeight = height
(需要提一下:CSS中的margin属性,与clientWidth、offsetWidth、clientHeight、offsetHeight均无关)
- 页码:
- 1
- 2
- 3
- 4
- ...
- 7
- »