Mac 下远程访问 Ubuntu 桌面

自从给项目组每个人开了一个 Xen VPS 后麻烦就不断,一会儿要求加硬盘,一会儿要求加内存,还有人想在上面跑图形桌面,完全不顾 VPSee 的业余时间:(,昨晚简单测了一下多个 Ubuntu 9.04 桌面系统同时运行在一个服务器上(用 Xen 虚拟化)的情况,速度还可以,比想像的要好。主要时间都浪费在配置上,比如配置 FreeNX、VNC 等,网上教程都不全,用了不少时间排错。这里介绍 Mac 通过网络远程访问 Ubuntu 桌面的常用三种方法,最好的方法应该是用 FreeNX,安全而且速度快:

X11

这是最简单最方便的方法,不需要在 Ubuntu 端做任何配置,不过在 Mac 端必须已装有 X11,在 Terminal 上敲(把 ubuntu 换成对应的服务器 IP 地址或域名):

$ Xnest -geometry 1280x800 :1 & DISPLAY=:1 ssh -X ubuntu  gnome-session

mac x11 forwarding

FreeNX

上面用 X11 forwarding 的方法虽然很简单,在局域网内用用还可以,如果想在 Internet 上连一个远程桌面的话就不合适了,速度很慢。FreeNX 有安全、速度快、功能强等优点,尤其适应网络环境恶劣的情况。按照 Ubuntu 的一篇帮助文档:FreeNX执行如下步骤:

$ sudo vi /etc/apt/sources.list
deb http://ppa.launchpad.net/freenx-team/ppa/ubuntu jaunty main
deb-src http://ppa.launchpad.net/freenx-team/ppa/ubuntu jaunty main

$ sudo apt-key adv --recv-keys \
--keyserver keyserver.ubuntu.com 2a8e3034d018a4ce

$ sudo apt-get update

$ sudo aptitude install freenx

$ sudo /usr/lib/nx/nxsetup --install 

下载一个 Mac NX 客户端连接服务器报错,查看日志后发现 authenticate 没通过,怀疑是 SSH keys 问题:

The NX service is not available or the NX access was disabled on host 172.X.X.X.

在 NX 服务器端修改 sshd_config 文件:

$ sudo vi /etc/ssh/sshd_config
AuthorizedKeysFile      /var/lib/nxserver/home/.ssh/authorized_keys2

$ sudo /etc/init.d/ssh restart

在 NX 客户端把 /var/lib/nxserver/home/.ssh/client.id_dsa.key 文件拷贝到客户端后,用 NX 客户端工具导入。NX 客户端再次连接 FreeNX Server,依然报错,不过错误信息变了:

NX> 103 Welcome to: ubuntu user: root
NX> 105 listsession –user=”root” –status=”suspended,running” –geometry=”1440x900x32+render” –type=”unix-gnome”
mktemp: cannot create temp file /tmp/nxserver_tmp.rQAHzfLbK: Permission denied
/usr/bin/nxserver: line 273: $TMPFILE: ambiguous redirect

显然是 /tmp 权限问题,这个问题很容易解决:

$ sudo chmod 777 /tmp

再次连接,终于看到了 Ubuntu 桌面,如果你不需要太高的安全性,到这里就可以结束了,enjoy it.

上面的连接使用的是默认的 SSH Keys,会带来安全隐患,如果需要更高的安全性可以用自己定制的 SSH Keys,重新配置:

$ sudo dpkg-reconfigure freenx-server

上面命令会弹出对话框,选择 ”Create new custom keys” 后,会在 /var/lib/nxserver/home/custom_keys/ 下创建一个 client.id_dsa.key 文件,把这个文件拷贝到 NX 客户端,然后在客户端导入这个 Key 文件就可以正常连接 FreeNX 服务了。如果 key 通过了认证,可以在服务器端和客户端删除这个 key 文件。

VNC

还有一种古老的方法就是使用 VNC,和 FreeNX 相比VNC 速度较慢,因为 FreeNX 是将 X Window 的数据压缩后传输到远程客户端显示,而 VNC 则是直接截取屏幕后传输过去,在较差的网络中这种延迟和速度差异很明显。先在 Ubuntu 上装一个 VNC Server:

$ sudo apt-get install vnc4server
$ vncserver :1 -geometry 1024x768 -depth 16

然后在 Mac 上装一个 VNC Viewer(推荐 Chicken of the VNC)就可以连上 Ubuntu,不过这个时候看到的是 X Window 界面,不是 Ubuntu 桌面,在 X Window 中手动启动 Ubuntu 桌面:

$ gnome-session &

如果不想每次都手动的话,在当前用户目录根目录下修改 ~/.vnc/xstartup:

$ vi ~/.vnc/xstartup
# twm &
gnome-session &

$ sudo shutdown -r now

$ vncserver :1 -geometry 1024x768 -depth 16

重新启动 Ubuntu 并打开 VNC Server 服务,用 VNC 客户端连接就可以看到 Ubuntu 图形桌面了。

SuperBytes:$6 64MB OpenVZ VPS

superbytes

SuperBytes 是一家加拿大公司,是 Kerplunc Hosting 的一部分,只做 VPS 业务。普通 hosting 业务由 Kerplunc Hosting 的另外一家叫做 Fanatical Host 的公司负责,其实主要都是由创始人 Matthew Hall 和 Nick Barrett 两个人在打理,公司规模很小,2007年创立,客户目前有几百个,服务器10多台。有兴趣购买之前看看这个帖子 WHT,优惠 25%,相当于只要4.5美元每月。VPS 配置如下:

服务器在 Toronto, Ontario Canada, IPHouse Datacenter (London, UK) and Databank Datacenter (Dallas, Texas US).
SolusVM 控制面板
6GB 硬盘
64MB Guaranteed,128MB Burst
60 GB 带宽
6美元

服务器数据中心网络信息:

All of our new servers are Core 2 Quad or Multi Core Xeon machines with between 6gb and 12gb of RAM. They are all outfitted with RAID1 hard drive setups and at least one Gigabit network adapter but usually two.

Our servers are UPS Protected and there is also a dedicated backup generator on site. We utilize a premium mix of Peer 1, All Stream and Atria Networks(multiple fibre connections including Hydro One Telecom) with TorIX peering.

Linux 下给图片批量加水印

一个非盈利组织的项目负责人突发奇想想给他们网站上的每张照片加上水印,说实话那些照片都是平时活动、party 的生活照片用不着用水印那么夸张,第一次听说给生活照加水印的。没办法,谁让我们和他们有合作项目呢。还好他们服务器用的是 Linux,在 Linux 下给图片批量加水印简单多了,用 imagemagick + 一个小脚本搞定。

在 CentOS 下安装:

# yum install ImageMagick

在 Ubuntu 下安装:

$ sudo apt-get install imagemagick

先用画图工具制作好一个水印图片 watermark.jpg,然后执行 composite 命令把这个 watermark.jpg 水印加到图片 vpsee.jpg 上,-dissolve 15 是指 watermark.jpg 使用15%的透明附在原图上:

$ composite -gravity northeast -dissolve 15 watermark.jpg vpsee.jpg vpsee.jpg

要事先做个 watermark.jpg 好麻烦,有没有不用 watermark.jpg 直接加水印的方法?有,不过这种方法需要 Linux 系统上已经安装 True 字体(一般来说服务器都没有安装,不建议为了一个水印安装一个硕大的字体),以下命令把 vpsee.com 字符串加到 image.jpg 图片上:

$ mogrify -font /usr/share/fonts/truetype/thai/Purisa.ttf -pointsize 15 \
-verbose -draw "fill black text 5,23 'vpsee.com' \
fill orange text 6,24 'vpsee.com' " image.jpg

可以用下面的 shell script 对某个目录的所有图片加水印,需要注意的是处理带空白字符的文件名很麻烦,所以下面的脚本先处理空白字符,把包含空白字符的文件名用 “_” 字符替代,比如:image 1.jpg 替换成 image_1.jpg:

#!/bin/bash

echo "Image watermarking Script"
echo "http://www.vpsee.com"
echo ""

if [ $# -ne 2 ]
then
    echo "usage: ./watermark watermark.jpg picture_directory"
    echo ""
        exit
fi

MARK=$1
PICDIR=$2
for each in $PICDIR/*{.jpg,.jpeg,.png,.JPG,.JPEG,PNG}
do
    mv "$each" `echo $each | tr ' ' '_'`;
    composite -gravity northeast -dissolve 15.3 $MARK $each $each 2> /dev/null
    echo "$each: done!"
done
exit 0

imagemagick 的功能很强大,把上面脚本中的 composite 一行换成下面这行就成了批量给图片改大小了:

$ convert -resize 400 old_image.jpg new_image.jpg

如果想直接把原图改小,用新图片覆盖原图片的话:

$ convert -resize 400 image.jpg image.jpg

Craigslist 的 LAMP 架构

关于 Craigslist 的介绍以及一些访问量多大、负载多强大的数据就省略了,VPSee 关心的是背后的技术架构,主要参考文章:MySQL and Sphinx at CraigslistDatabase War Stories #5: craigslist.

架构

硬件环境: Supermicro 4U 7043-P8、Dual Intel Xeon 3.2 512KB CPU、16GB 内存、16个硬盘组成的 Raid 10;
软件系统: Suse Linux 操作系统,网站大部分用 Perl 编写,使用标准的 LAMP 组合,memcached 做缓存,使用 Sphinx 全文搜索。

craigslist internals overview

数据库

所有数据库服务器都运行 64 位的 Linux,每个服务器有 16GB 内存和16个硬盘。几台数据库服务器组成一个 db cluster,每个 db cluster 运行一个 Craigslist 服务。

forums:1个 master + 1个 slave,slave 主要用来备份,表使用 myIsam 引擎,DataDir 大小达到 17GB(包括索引在内),最大一个表有近4200万行。

classifeds:1个 master + 12个 slaves,多种不同用途的 slaves,其中 teamreader, longreader, thrashbox 用来备份以及一些非常耗时的特殊查询。还有1个离线 slave 以应付突发情况,比如 colo 崩溃了。其中数据库容积达到 114G(包括索引),最大一个表达到5600万条记录,数据表也是使用 myIsam 引擎。

archivedb:1个 master + 1个 slave,用来归档那些时间超过3个月的帖子,除了比上面的 classifeds 存的数据量大以外,其结构非常类似 classifeds,238G 的数据,9600万条记录。不同的是数据表使用的是 mrg_mylsam,MySQL 的 merge 引擎,方便把 archive 上分散的数据 merge 成更容易管理的块。这也是 merge 表的好处,这里一张表,那里一张表不方便管理,合成一张表更容易管理一些,不过 merge 引擎要求相似的表才能 merge,不是随便什么表都可以 merge 的。

searchdbs:4个 clusters(16台服务器),把 live 的帖子按照 area/category 切分,每个 cluster 只包含 一部分的 live 帖子,使用 myIsam 全文索引。不过要注意的是,全文索引(Indexing)很耗资源,很烧钱。

authdb:1个 master + 1个 slave,这个最小了,只是存一些临时、短暂的数据(transient data)。

MySQL 似乎在 64 位的机器上运行得更好一些。

全文搜索

Craigslist 刚开始使用了 MySQL 全文搜索(Full text indexing and searching),随着规模变大,MySQL 全文搜索逐渐不能应付要求,不能 scale,改用 Sphinx 做搜索,一段时间后发现 Sphinx 也不能满足需求,不能 scale,最后不得不 patch sphinx 以满足日益增长的庞大数据库和搜索需求。Craigslist 的经验是,在一张很大的表上做全文索引和搜索是行不通的,因为用户没有耐心去等待漫长的搜索过程,搜索结果往往不能在用户期望的时间内返回。

Burst Networks:$8 256MB OpenVZ VPS

burstnetworks

Burst Networks 是一家澳大利亚公司,一直听说澳大利亚带宽较贵,从他们的 VPS 就可以看出一点,这款 VPS 每月就只给 20GB 带宽。域名显示 Burst Networks 2008年12月底才注册,运行不到一年,网站上没有公司任何信息。购买时要注意网站上列出的 $8 是 Australian dollars,如果使用 WHT 的优惠码只要5.95澳元,VPS 配置如下:

服务器在澳大利亚
SolusVM 控制面板
10GB 硬盘
256MB
20 GB 带宽
8澳元(1美元=1.16澳元)

服务器数据中心网络信息:

Burst Networks resides all of our servers, routers and other networking equipment in the world class Pegasus Data Centre. Pegasus Data Centre is a Tier 2, N+1 facility housing over 1400 server and over 80 42RU cabinets. CISCO networking equipment. Peering with the “E3 Networks”.

Odisha Hosting:$6.95 128MB Virtuozzo VPS

odishahosting

Odisha Hosting 是一家位于新泽西的美国公司,是 AP ARTS INTERNATIONAL LLC NJ 的子公司。AP ARTS INTERNATIONAL 是一家商业信息解决方案提供商,后来把自己多年在服务器、网络等信息技术方面的经验独立出来成立了一家 hosting 公司,就是这个 Odisha Hosting,2005年上线,已有多年经验,并在2009年1月并购了另一家 hosting 公司,Vixile web hosting,同年7月又在印度的 CtrlS Datacenters Ltd 开了 VPS 业务,看样子业务做得不错。比较强的是 Odisha Hosting 承诺99.9%的在线保证,如果不到99.9%的话可以根据他们一个 SLA Agreement 来要求补偿。两款10美元以下 VPS 配置如下:

数据中心在 Chicago, Illinois/Philadelphia, Pennsylvania 和 India
Virtuozzo 控制面板
5GB 硬盘/7.5GB
128MB Guaranteed RAM,256MB Burst/192MB,384MB
50 GB 带宽/75GB
6.95美元/8.95美元

服务器硬件和网络信息:

DELL powered hardware with Dual Quad Core Xeon 5410 ( 8 x 2.33GHz )& Nehalem 5520 Processors.

调整 Xen 虚拟硬盘大小

今天有人跑来实验室抱怨说给他们配置的 4GB Xen 虚拟硬盘太小,系统占了 2GB,再装一些工具,比如 jdk/mysql/tomcat/red5/asterisk 之类的空间就不够了。如何增加 Xen 虚拟硬盘的大小呢,也就是说如何扩充 Xen 的镜像文件大小呢?(这里的方法适用于镜像文件在 ext2 和 ext3 文件系统的情况)

关闭虚拟机:

# /usr/sbin/xm shutdown vm01

给虚拟机镜像文件(.img)追加 4GB 空间:

# dd if=/dev/zero bs=1024k count=4096 >> /vm/vm01.img

扫描检查镜像文件:

# /sbin/e2fsck -f /vm/vm01.img

这个时候只是增加了镜像文件(硬盘)的大小,这个镜像文件不是普通的文件,里面包含可 mount/umount 的 loop 文件系统,所以需要调整文件系统大小,不然的话进入虚拟机后 df 会发现硬盘大小没变:

# /sbin/resize2fs /vm/vm01.img

重新启动 Xen 虚拟机:

# /usr/sbin/xm create vm01

进入虚拟机后查看硬盘大小:

# /usr/sbin/xm console vm01
# df -h

这里提到了 mount/umount,说一点题外话,从技术角度来说现在的 VPS 其实都不安全,因为 VPS 服务商随时可以 mount/umount 你的虚拟机文件、分区来读取、甚至写入内容,如果你的虚拟机所在的那台服务器的 root 密码被坏人拿到,那就毫无安全可言了,坏人可以随意在你虚拟机上做手脚。所以说安全性是云计算的一个大问题,尤其是那些搭建在虚拟技术上的云计算,这也可能是企业迟迟不愿意使用公有云的原因吧,一些 Startup 也只是把不重要的数据放在类似 Amazon S3 之类的云存储上,对于机密数据还是自己保存比较好。所以 VPSee 认为私有云会有更大的发展空间。

Paxos 算法

Paxos 是分布式计算里非常重要的一个算法,最初由 Leslie Lamport 在1990年发表,题为:The Part-time Parliament,这是一篇很有趣的论文,Lamport 在这篇论文里面把人物(分布式计算领域内的重要科学家)的英文名字用希腊文代替,并且整篇论文站在人类学家的立场、古文明、议会的角度来写导致人们很难理解这是一篇计算机学术论文,所以论文一直没能被发表,更糟的是,没人能真正理解其中的算法。就这样直到1998年,一个 ACM 的编辑从一堆旧稿中发现这篇论文觉得有点价值才得以发表。不过人们依然抱怨算法太难理解,于是 2001 年 Lamport 写了一篇简单容易理解的 Paxos Made Simple,直到现在还是有大部分人不能完全理解这个算法。Consensus 是分布式计算中的一个经典问题,Paxos 就是用来解决 consensus 问题的其中一种重要的 protocol,类似的 protocol 还有:Castro 和 Liskov 的 PBFT.

问题由来

什么是 consensus (一致性)问题呢?在一个分布式系统中,有一组的 process,每个 process 都可以提出一个 value,consensus 算法就是用来从这些 values 里选定一个最终 value。如果没有 value 被提出来,那么就没有 value 被选中;如果有1个 value 被选中,那么所有的 process 都应该被通知到。

上面问题看上去很好解决,比如用一个 master,所有 process 都向这个 master 提交 value,这个 master 可以根据先到的原则选择最先到达的 value 为最终 value 并通知给所有 process。这里有个问题,如果这个 master 断了、当机、重启、崩溃了怎么办?所以一个好的方法就是选择一组 masters,value 由这一组 masters 共同决定,有点像 ”议会“。为了解决这个问题,大家提出了各种各样的 protocols(协议),其中最有名的就是 Lamport 的 Paxos.

算法

Paxos is a consensus algorithm executed by a set of processes, termed replicas, to agree on a single value in the presence of failures.

在实际的分布式系统中,replicas 面临崩溃、当机、重启,replicas 之间的网络可能会丢包、延迟、瘫痪等各种不可预测的问题,所以 replicas 需要一个可永久保存的日志来记录步骤,以便需要时从灾难中恢复,就像数据库日志那样。一些 replicas 可以提交 value 就一致性问题进行协商,如果大部分 replicas 运行的时间足够长,到最后的结果就是:所有的 replicas 就某个提交的 value 达成一致。Paxos 算法大致可以分为3部分:

  1. 选一个 replicas 出来做 leader;
  2. leader 选一个 value 出来然后通知给所有 replicas 进行协商,replicas 要么接受要么拒绝;
  3. 一旦多数 replicas 接受 leader,consensus(一致性问题)达成,leader 随后抄送给所有 replicas.

要理解上面的算法是怎么工作的可以假设一个最简单的情形,假如只有一个 leader 而且永不崩溃,这时只要多数 replicas 接受并回复 leader,consensus 就可达成,即使少数 replicas 崩溃也没有关系,只要有一个 replica “活着” 就可以收到 consensus value.

现在假设事情稍微变得复杂一点,在实际场合 leader 可能会崩溃,所以如果有多个 leader 的话就不怕其中一个 leader 崩溃了。Paxos 并不要求某时某刻只能存在一个 leader,可以有多个 replicas 成为 leader. 这样一来就会有新问题,多 leader 会选出多个不同的 value 出来给 replicas 协商,怎么办呢?Paxos 引入两条机制来解决这个问题:a) 给每个 leader 按顺序编号;b) 限制 leader 只能选一个 value. 给 leader 编号以后,每个 replica 就能分辨哪个是 current leader 发的 value,哪个是pervious leader 发的 value,replicas 就能在达成 consensus 后拒绝从 old leaders 发来的 value. 每个 replica 都跟踪最新收到的 leader 编号。如果一个 replica 想成为 leader,它生成的 leader 编号必须大于它最新收到的那个 leader 编号,并且告诉给所有的 replicas. 如果多数 replicas 回复并且告知他们跟踪的编号里面没有比这个更高的,那么这个 replica 就成为 leader.

一旦某个 consensus value 达成一致了,Paxos 必须强制未来的新 leader 会依然遵守这个 consensus value,不会出现翻旧账的情况。Paxos 如何做到这点呢?从 replica 发出的通知消息中包含2条信息,一个是最近 value,另一个是 leader 编号,新 leader 会选择从最近 leader 那里得到的 value,因为这个 value 的 leader 编号是所有 replica 发出的消息中最高的。如果通知消息中没有 value,新 leader 就随意选一个 value 然后协商。

想要更深入了解 Paxos 算法还是要看原作者的 The Part-time Parliament Paxos Made Simple.

应用

Keyspace 是 Scalien 公司开发的高可靠 key-value 存储系统,可以参考:Keyspace:高可靠的 Key-Value 存储系统Keyspace Whitepaper.

Chubby 是 Google 开发的一个分布式文件系统,提供分布式锁机制和小文件的存储,可以参考:Paxos Made Live – An Engineering PerspectiveThe Chubby Lock Service for Loosely-Coupled Distributed Systems.

Gotekky:$7.77 256MB OpenVZ VPS

gotekky

Gotekky 是2008 年创立的一家加拿大公司。有意思的是他们做了一个 java applet 页面在网站上,这样可以通过 live 摄像头实时查看数据中心的情况。3个月的 money back,24/7 技术支持,都快成 VPS 的标配了。VPS 用的是 HyperVM 控制面板,现在 HyperVM 已经 open source 了,漏洞也补了,可以放心使用。VPS 配置如下:

使用 Canix 的数据中心,在 Montreal, CA
HyperVM/Kloxo 控制面板
15GB 硬盘
256MB Guaranteed RAM
200 GB 带宽
7.77美元

这个价格只有年付才可以拿到,半年付是9.77美元/月。

Keyspace:高可靠的 Key-Value 存储系统

Keyspace 是一家叫做 Scalien 的创业公司开发的高可靠 key-value 存储系统。比起 Redis、Tokyo Tyrant 等系统来说,Keyspace 还非常新,才上线几个月。有一篇 white paper 详细介绍了 Keyspace 的设计和架构。Keyspace 强调的技术点是高可靠性,有以下一些特点:

  • Key-value store:一个 key-value 数据存储系统,只支持一些基本操作,如:SET(key, value) 和 GET(key) 等;
  • 分布式:多台机器(nodes)同时存储数据和状态,彼此交换消息来保持数据一致,可视为一个完整的存储系统。为了更可靠,Keyspace 推荐使用奇数个 nodes,比如:3,5,7等;
  • 数据一致:所有机器上的数据都是同步更新的、不用担心得到不一致的结果,Keyspace 使用著名的 Paxos 分布式算法;
  • 冗余:所有机器(nodes)保存相同的数据,整个系统的存储能力取决于单台机器(node)的能力;
  • 容错:如果有少数 nodes 出错,比如重启、当机、断网、网络丢包等各种 fault/fail 都不影响整个系统的运行;
  • 高可靠性:容错、冗余等保证了 Keyspace 的可靠性。

架构

keyspace architecture

Keyspace 的整个架构不复杂很清晰,最核心的就是 Leslie Lamport 的 Paxos consensus algorithm,这是分布式系统的经典的算法,具体可以看 VPSee 的这篇文章:Paxos 算法。(八卦一下,Leslie Lamport 大牛还是 LaTeX 的创建者和早期开发人员,现在在 Microsoft Research 工作)

Paxos 通过一个消息层来发消息给其他 nodes,Paxos 本身并不假设每次消息都能发送成功,因为消息可能在发送的过程中丢失、延迟、重组等。面临这些可能会出现的 fail 以及对应的容错措施都是由 Paxos 算法本身来处理的。Keyspace 是一个 master-slave 系统,如果 master node 出错、当机了怎么办?Keyspace 中的每个 node 都可以得到 master lease 并且一次可以占用5秒钟,当然可以继续占有这个 master lease 只要 node 没 fail 掉,如果 fail 的话,master lease 就会过期(超过5秒),自动释放了 master lease,这个时候另一个 node 就接过 master lease 充当起 master,Keyspace 用 PaxosLease Protocol 来释放 master lease。PaxosLease 算法和其他 lease 算法一样对时钟很敏感,所以要正常运行 Keyspace 的话必须同步每个 node 的时钟,如可以用 Unix 上面的标准 Network Time Protocol (NTP) 来同步。为了同时支持 TCP 和 UDP 协议,Keyspace 做了一个 Message Transport 层,这样就可以用 UDP 来发小消息,用 TCP 来发包含很多数据的大消息。图中的 Paxos 层用来实现 Paxos 算法,用 Paxos 来冗余数据库的写操作,这里的 Paxos 只是用来找 consensus,一旦确定 consensus 后各个 nodes 都会被通知到 consensus 值已经找到。一旦 consensus 被确定,ReplicatedLog 层就会把写操作交给 KeyspaceDB 模块,由这个模块负责把写数据写到本地硬盘上。Keyspace 使用 Berkeley DB 的 Transactional Data Store 引擎存储数据。图中最上面的 HTTP 和 Keyspace Protocol 提供了接口给用户使用,用户可以通过这些 API 来操作 Keyspace 存储系统。

操作

Keyspace 是一个 master based 的冗余数据库,一些操作只能由 master node 来执行,如:

write 操作(SET, TEST-AND-SET, ADD, DELETE, REMOVE, PRUNE and SUBMIT)
safe read 操作(GET, LIST-KEYS, LIST-KEYVALUES)

也有一些操作可以由任意的 node 来执行,如:

get current master 操作(GET-MASTER)
dirty read 操作(DIRTY-GET, DIRTY-LIST-KEYS, DIRTY-LIST-KEYVALUES)

dirty read 操作可以从任意 node 上读取结果,但是返回的结果可能会不一致,所以称为 “dirty”。如果要修改数据库的话必须连上 master 在 master 上操作,如果只是读取数据库而且不是很在意数据一致性的话可以连上任意 node 进行 dirty read 操作。如果需要数据一致怎么办?可以层通过修改应用程序的逻辑来取得数据的一致性,比如在读之前停止所有写操作。

所有操作都可以通过 HTTP 的 GET 来执行,所以可以通过浏览器来执行这些操作。不过 HTTP 只用来测试,因为每个操作会创建一个新 TCP/HTTP 连接,系统开销太大而且没有必要。Keyspace APIs 使用 Keyspace protocol 来操作 Keyspace 系统。

安装

安装 Keyspace 的过程很简单,安装完必要软件包后下载 keyspace 源代码编译:

# yum install gcc-c++ db4 db4-devel

# wget http://scalien.com/releases/keyspace/keyspace-1.0.1.tgz
# tar zxvf keyspace-1.0.1.tgz
# cd keyspace-1.0.1
# make

使用

在单机上运行 Keyspace:

# script/safe_keyspaced bin/keyspaced test/0/keyspace.conf test/0
# script/safe_keyspaced bin/keyspaced test/1/keyspace.conf test/1
# script/safe_keyspaced bin/keyspaced test/2/keyspace.conf test/2

然后通过 HTTP 访问 Keyspace:

# curl http://localhost:8080/getmaster
0
I'm the master

# curl http://localhost:8081/getmaster
0
I'm a slave

# curl http://localhost:8082/getmaster
0
I'm a slave

如果想在多台机器运行需要修改每台机器的 keyspace.conf 配置文件。

更多 HTTP 命令(HTTP 操作 Keyspace 开销太大,建议在生产环境下使用 Keyspace protocol):

http://yoursever:port/getmaster
http://yoursever:port/get?key
http://yoursever:port/dirtyget?key
http://yoursever:port/set?key,value
http://yoursever:port/testandset?key,test,value
http://yoursever:port/add?key,num
http://yoursever:port/rename?key,newKey
http://yoursever:port/delete?key
http://yoursever:port/remove?key
http://yoursever:port/prune?prefix
http://yoursever:port/listkeys?prefix,startkey,count,next
http://yoursever:port/listkeyvalues?prefix,startkey,count,next
http://yoursever:port/dirtylistkeys?prefix,startkey,count,next
http://yoursever:port/dirtylistkeyvalues?prefix,startkey,count,next