网站三周年记

今天看了下DNSbed.com域名注册3年了。清楚的记得,3年前这个时候,正值深秋。住的地方靠着山,可以看到落叶飞舞。午后,阳台上金灿灿的阳光撒进来,小客厅里明亮安详。坐在长沙发上,注册了这个域名,写了策划文档,计划着如何提供自己的DNS服务。那时刚来珠海,周围环境很美、很新。秋天是深爱的季节,越是秋深,情思越浓。而秋天又充满惆怅,夕阳无限好,只是近黄昏。无端落木萧萧下,她如烟霞一般美丽。3年过去了,还是秋天,还是落叶缤纷。静静运行了近3年。烟霞明灭中,岁月模糊。此情可待成追忆,只是当时已惘然。

继续阅读

发表在 Common | 标签为 , | 网站三周年记已关闭评论

libev和libevent区别

两者都是事件驱动编程库,对于它们之间的区别,看了stackoverflow上libev的作者Marc Lehmann的解释,有所了解。简单说libev对libevent做了改进和精简。libevent使用全局变量,导致非线程安全。它的watcher结构也过大,把I/O、计时器、信号句柄整合在一起。而且(作者认为)libevent的附加组件如http和dns库都实现不好,且有安全问题。libev对这些地方做了改进,避免使用全局变量,拆分watcher等。另外libev去掉了外部库(比如http和dns),只专注于事件驱动服务,所以更精简。

继续阅读

发表在 Common | 标签为 , | libev和libevent区别已关闭评论

Perl异步访问Mysql数据库

注:这篇文章转发自Chinaunix的Perl论坛,原文请点这里,可能是本博的首篇转发文档。

这篇主要想介绍异步数据库,目前Perl的web框架主要是Dancer和Mojolicious,我用Dancer很久,但一直没法实现完整的异步数据库操作,改用Mojo才3天,很容易实现了异步数据库。

我先说完美的异步数据库操作的应该是什么样的。假设有一个web页面涉及5个sql查询操作,每个操作耗时1秒,在只有一个worker的情况下(单进程),如果有一个人访问这个页面,读取时间应该是1秒。如果有10个人同时访问这个页面,10个人都应该在1秒钟之内看到页面(理想状况下)。

继续阅读

发表在 Common | 标签为 , | Perl异步访问Mysql数据库已关闭评论

秋日周末登凤凰山

珠海是个美丽的城市,住的地方依山靠海,出门往前走50米是大海,往后走200米就是山脚 — 凤凰山。

之前只闻山名,未见真迹。这个周末正值金秋十月,秋风飒飒,阳光满怀,冷热适宜,于是决定去登山。

山并不高,20分钟可登顶,在悬崖上远眺大海,秋风萧瑟,洪波涌起,天海茫茫。

继续阅读

发表在 Common | 标签为 , | 秋日周末登凤凰山已关闭评论

亚马逊RDS与DRBD

Amazon的RDS的多AZ数据备份,可以将Mysql数据备份在多个不同地区,在主库挂掉后,启用备份库的服务。备份库平时不可读,只有在灾备时才启用。

In the event of planned database maintenance, DB Instance failure, or an Availability Zone failure, Amazon RDS will automatically failover to the up-to-date standby so that database operations can resume quickly without administrative intervention. Prior to failover you cannot directly access the standby, and it cannot be used to serve read traffic.

我感觉这种备份方式像DRBD+Heartbeat的方式。不过该方式一般用在同一局域网中,如果是跨AZ的部署,数据库写的效率应该很低。当然Amazon是否的确用了这种方式,我也不确认。几年前我测试过跨IDC的DRBD部署,效率很差,文档如下。

使用DRBD备份Mysql

发表在 Common | 标签为 | 亚马逊RDS与DRBD已关闭评论

中秋浪琴湾

中秋节下午临时决定去台山玩,由于出发较晚,到达川岛镇时,已经过了6点。本来计划在岛上的酒店过夜,结果下午5:30后船就停开了,没办法上岛。于是先去吃饭,好像是在一家叫肥标海鲜酒家吃的。都说吃海鲜到台山,还真不是吹的,这里的虾又大又肥又嫩,连我这不怎么爱吃海鲜的,都觉得味道很好。吃完饭后,发现川岛镇居然没家像样的酒店,没法住宿。于是连夜赶到距离30公里地的北陡镇,在镇上唯一一家酒店住下。忘记叫什么名字了,价格倒是便宜,120元一晚,但是条件差,被子上都有股霉味。第二天起来,吃过早餐后,前往浪琴湾。浪琴湾位于那琴村,从北陡镇过去还有20多公里路程,是一条水泥路一直走到底,路况很好,沿途风景也不错。浪琴湾其实就是一片沙滩,可以下去游泳。门票不贵,15元。海水一般,不怎么干净。由于是节假日,人还满多的。在里面呆了一上午,游了几圈泳。出来后在马路对面的饭店吃饭,也吃的海鲜,感觉明显不如肥标那家,主要是海鲜个头不够大,做的也不行。吃完午饭后,驱车回家。下面是浪琴湾的几张照片,小米拍的。

继续阅读

发表在 Common | 标签为 , | 中秋浪琴湾已关闭评论

Couchbase权威指南(二十一)

客户端与集群的交互

在开发应用时,最常见的问题是,客户端和客户端库如何与集群通信,如何适应运行中集群的拓扑结构改变。通常而言,在客户端与数据库交互中,couchbase扮演一个黑盒子。假如你使用了smart client,集群的拓扑、节点结构,以及对应信息的变更,完全由vBucket映射表和客户端库联合起来自动处理。

客户端库负责客户端与集群中各个节点的直接通信。你用来初次建立连接的那个节点,不会扮演代理或网关的角色。smart client(或Moxi)会加载vBucket映射表,从映射表里学习到把不同信息存储到集群里的哪个节点。客户端直接与正确的节点通信,中间没有代理或网关。

在拓扑结构改变时(例如,rebalance或者故障转移),客户端库自动处理任何临时的错误。总之而言,你不必关心任何集群的配置与拓扑相关信息。

关于客户端与集群的通信机制,请见之前的文档,Couchbase的Smartclient有何作用

发表在 Common | 标签为 | Couchbase权威指南(二十一)已关闭评论

Couchbase权威指南(二十)

过期时间

过期时间(time to live [TTL])的用途是,在存储信息时设置一个超时值,它让文档自动过期删除。除了delete()函数外,文档的过期值是从数据库里删除信息的唯一方法。一旦过期时间到了,数据就会删除。

过期时间设置为一个数字,它代表秒数。如果这个数字代表的秒数,小余30天(30*24*60*60秒),这个值就是相对值。例如,3600秒表示文档在一个小时后过期。如果秒数大于30天,过期值就是绝对值,表示从epoch时间以来的绝对秒数。

过期时间可以用在不同的应用场景,但最普通的场景是使用它存储session数据。例如你可以用它存储session并设置过期时间2小时,用户如果超过2小时没访问网站,session自动删除。

如果用户还在访问数据,可以使用touch()和getAndTouch()函数来更新过期时间,不必另外执行数据更新操作来更新过期值。

标签

除了过期时间,所有文档在存储时也带了一系列标签(flags)。并非所有的客户端库都支持标签,但如果支持,你可以用标签来增加文档描述信息,例如文档类型。

发表在 Common | 标签为 | Couchbase权威指南(二十)已关闭评论

Couchbase初次小测

【注】这次测试中,遇到了一些问题,因此本文用E文编写,随后发到Couchbase社区咨询一下。

We have five nodes as the couchbase cluster, the servers have enough memory and disk, with ubuntu 12.04 OS. Couchbase server version: 2.0.1 community edition (build-170). I use the default bucket for test, it has been assigned 5GB memory totally.

The test Ruby script is as below:

require 'couchbase'
require 'securerandom'

client = Couchbase.connect("http://couch.example.com:8091/pools/default/buckets/default")

100000.times do |s|
value_10k = SecureRandom.hex(5120)
key_uuid = SecureRandom.uuid

begin
client.set key_uuid, value_10k, :ttl => 3600
rescue Couchbase::Error::Base => e
puts e
end
end

继续阅读

发表在 Common | 标签为 | Couchbase初次小测已关闭评论

Couchbase权威指南(十九)

文档数据

文档数据是纯字节序列,服务器不会试图去解析或理解存储的文档格式。这意味着你可以存储从数字到图片的任何东西。这种开放的存储结构,也意味着不必去声明或定义要存储信息的结构,你可以充分灵活的自己定义所需要的结构。

存储简单的信息,例如数字或字串,只需简单的将数据写进文档值。存储复杂的信息结构,你可能需要序列化对象,或者更通用的JSON结构。

序列化

序列化将特定语言的复杂的内部结构,例如hash或对象,转换为字节序列,从而可以存储在couchbase里。序列化的结构还能被还原成原来的数据结构,从而被特定的语言直接使用。

所有的couchbase客户端库在存取文档时,都自动支持序列化和反序列化结构或对象。

JSON

序列化信息的问题是,它是语言约定的。假如你在Java里存储一个对象或数据结构到couchbase,它被序列化为一个只有java语言库才能识别的串。假如要跨语言进行信息存储,你需要使用更通用的格式,比如JSON。

JSON之所以流行,一是因为它很简洁(它看起来像许多脚本语言的内置hash结构),二是它可以被Javascript直接使用,这样在web基础的应用里,不必对它做特别处理。

JSON的格式有良好的描述,详见http://json.org. 在couchebase里使用JSON的最好方法是,每条记录存储一个JSON哈希结构。例如,可以定义一条啤酒记录如下:

{
"id": "beer_Hoptimus_Prime",
"type": "beer",
"abv": 10.0,
"brewery": "Legacy Brewing Co.",
"category": "North American Ale",
"name": "Hoptimus Prime",
"style": "Imperial or Double India Pale Ale",
}

许多语言支持类似的hash、hashmap或关联数组结构,有相应的库可以将hash结构转换为JSON格式,并还原它们。

请注意:couchbase 2.0在使用JSON存储信息时,允许你使用查询和索引的高级功能。

发表在 Common | 标签为 | Couchbase权威指南(十九)已关闭评论