Tech.Memo 类别下的文章

Amazon 的 Dynamo 架构

我在 DBAnotes.net 上记录过不少比较大的网站架构分析(eg: eBay [1], eBay [2]) ,Amazon 一直找不到太多的资料。国庆期间读到了一篇关于 Amazon Dynamo 的论文,非常精彩。Amazon Dynamo 这个高可用、可扩展存储体系支撑了Amazon 不少核心服务.

先看一个示意图:

Amazon_sosp.png

从上图可以看出,Amazon 的架构是完全的分布式,去中心化。存储层也做到了分布式。

Dynamo 概述

Dynamo 的可扩展性和可用性采用的都比较成熟的技术,数据分区并用改进的一致性哈希(consistent hashing)方式进行复制,利用数据对象的版本化实现一致性。复制时因为更新产生的一致性问题的维护采取类似 quorum 的机制以及去中心化的复制同步协议。 Dynamo 是完全去中心化的系统,人工管理工作很小。

强调一下 Dynamo 的"额外"特点:
1) 总是可写
2) 可以根据应用类型优化

关键词

Key: Key 唯一代表一个数据对象,对该数据对象的读写操通过 Key 来完成.
节点(node):通常是一台自带硬盘的主机。每个节点有三个 Java 写的组件:请求协调器(request coordination)、成员与失败检测、本地持久引擎(local persistence engine)
实例(instance);每个实例由一组节点组成,从应用的角度看,实例提供 IO 能力。一个实例上的节点可能位于不同的数据中心内, 这样一个数据中心出问题也不会导致数据丢失。

上面提到的本地持久引擎支持不同的存储引擎。Dynamo 上最主要的引擎是 Berkeley Database Transactional Data Store(存储处理数百K的对象更为适合),其他还有 BDB Java Edition、MySQL 以及 一致性内存 Cache 等等。

三个关键参数 (N,R,W)

第一个关键参数是 N,这个 N 指的是数据对象将被复制到 N 台主机上,N 在 Dynamo 实例级别配置,协调器将负责把数据复制到 N-1 个节点上。N 的典型值设置为 3.

复制中的一致性,采用类似于 Quorum 系统的一致性协议实现。这个协议有两个关键值:R 与 W。R 代表一次成功的读取操作中最小参与节点数量,W 代表一次成功的写操作中最小参与节点数量。R + W>N ,则会产生类似 quorum 的效果。该模型中的读(写)延迟由最慢的 R(W)复制决定,为得到比较小的延迟,R 和 W 有的时候的和又设置比 N 小。

(N,R,W) 的值典型设置为 (3, 2 ,2),兼顾性能与可用性。R 和 W 直接影响性能、扩展性、一致性,如果 W 设置 为 1,则一个实例中只要有一个节点可用,也不会影响写操作,如果 R 设置为 1 ,只要有一个节点可用,也不会影响读请求,R 和 W 值过小则影响一致性,过大也不好,这两个值要平衡。对于这套系统的典型的 SLA 要求 99.9% 的读写操作在 300ms 内完成。


--待续--

更多阅读:Dynamo学习 -- http://donghao.org/2008/10/dynamoni.html

在做维护的时候,经常要写一些脚本定期检查一些状态信息,而比较糟的时候可能该脚本在执行周期内没完成,接着第二个脚本又开始跑了。如何确保 Shell 脚本只有一个实例运行就成了一个比较有意思的话题。

必需要承认,要做到 100% 的完美可能需要长篇大论才可以做到。如果对于粒度要求不高,这里总结两个粗糙的方法。

一个是在脚本执行的时候判断某个文件的存在,如果不存在,则 touch 创建该文件(该文件看作一个"占座"文件),脚本执行完毕的时候删掉。第二个进程如果启动,判断有该文件存在,则退出或者是 sleep 几秒钟重新判断。这个方法的关键是在删掉"占座"文件的处理方式上。必需要考虑到程序异常、被 Kill 等多个情况。根据需要 trap 搞一下。

trap 和 kill 命令的 -l 参数能够列出你想要的内容

第二个方法是过滤脚本的名字(当然最好把脚本起个独特一点容易过滤的名字),计数,如果存在一个或者多个 instance , 则退出或者 sleep 等待。否则执行脚本。这个方法最简单,但是移植性似乎要差一点,需要考虑不同平台或 Shell 上的表现。

这两个方法都太粗糙了,经不起考究,但是对于 99% 的系统可能都足够用了。反过来说,如果一个系统对于脚本运行的粒度要求非常高,需要考虑到操作的原子性,那么 Shell 或许并不适合完成这个任务。

解决问题就好,过分炫技不可取。

--EOF--

这是我唯一看到的 Web 2.0 公司使用 PostgreSQL 的,可惜还失败了。

FeedLounge 是一个提供在线 RSS Reader 的站点。已经在今年 6 月 1 日黯然宣布失败。这里不去讨论他们失败的各种原因,只说说从他们 Blog 上看来的关于他们选择数据库的经验。

FeedLounge 在数据库的使用上路线是这样的:

MySQL(MyISAM) --> MySQL(InnoDB) --> PostgreSQL 

最初是 MyISAM 方式,迁移到 InnoDB ,数据库从大约 1G 膨胀超出了 10G,而且发现引发了新的性能问题,经过尝试发现不能解决后,迁移到 PostgreSQL,总存储从 InnoDB 方式的 34G 缩小到 9.6G,而且,恢复时间也只是原来的大约 1/5 (导出用 Mysqldump,载入用 psql ). 此外,关于内存利用方式上也有一些差异, MySQL : innodb_buffer_pool 6GB + O_DIRECT flush, PostgreSQL 设置上限 2G,只用了 1.2 G。遗憾的是,看不到切换前后性能数据更为详细的对比。

FeedLounge 当时每天要处理的事务量:每天超过 400 万次查询,超过 200 万次的更新/插入操作,高峰期每秒钟有 2000 个更新/插入操作(这应该是批处理阶段)。硬件如何呢? 数据库服务器的硬件:两路 Opteron CPU,8 GB 内存, 6 SATA 7200RPM 16MB 硬盘, RAID 5 ,控制器有 128M. 可以看出来了吧, 7200 转的硬盘 + RAID 5 根本不适合这样的应用。从这一点上说,数据库类型切换其实解决不了本质的问题。

另外看到的有趣参考信息:

FeedDigest 在当时每天有超过 400 万次的查询,超过 200 万次插入,机器硬件只用了双奔四 CPU(2.8GHz) ,1G内存

--EOF--

因为这次 Dreamhost 的安全问题,不得不考虑调整站点备份的周期。备份方式是利用 cxRsync 通过 SSH 通道备份数据到本地 Windows 上。Rsync 在 Windows 上的实现有好几个包装好的工具,比如 DeltaCopyUnison 等。经过比较还是觉得 cxRsync 最好用.

cwRsync 的优点:

1) 配置简单。已经包装了 crgwin 库文件,下载安装就能直接调用命令进行同步。
2) 命令行即可操作. 与 Unix 上基本一样(DeltaCopy 则是图形化的,Unison 还需要熟悉后才可以)。

基本操作步骤:

1) 下载,安装 cwRsync.
2) (可选, Dreamhost 的安全都这样糟了,还不如直接用密码登录安全呢,嘿)创建 Key, 进入命令行模式, 调用 ssh-keygen 命令创建 Key. 公钥和私钥存储的位置就放在默认的位置即可。完成后将公钥串存入 ~/.ssh/authorized_keys 文件内。
3) 进入命令行模式, 调用 rsync 命令:

rsync  --exclude="/home/foo/tmp/" -avz [email protected]:foobar.net/ \ 
MySites\www.foobar.net\

说明: --exclude 过滤掉一些无关紧要的目录,比如 MT 目录下的 Cache 信息等,foo 和 foobar 请根据自己的情况做适当的替换。

最后,如果喜欢用 Windows 的任务调度的话,可以考虑调用。反正我是从来不用的。

--EOF--

这篇 Bash Shell Shortcuts 的快捷键总结的非常好。值得学习。下面内容大多数是拷贝粘贴与总结.

CTRL 键相关的快捷键:

Ctrl + a - Jump to the start of the line
Ctrl + b - Move back a char
Ctrl + c - Terminate the command  //用的最多了吧?
Ctrl + d - Delete from under the cursor
Ctrl + e - Jump to the end of the line
Ctrl + f - Move forward a char
Ctrl + k - Delete to EOL
Ctrl + l - Clear the screen  //清屏,类似 clear 命令
Ctrl + r - Search the history backwards  //查找历史命令
Ctrl + R - Search the history backwards with multi occurrence
Ctrl + u - Delete backward from cursor // 密码输入错误的时候比较有用
Ctrl + xx - Move between EOL and current cursor position
Ctrl + x @ - Show possible hostname completions 
Ctrl + z - Suspend/ Stop the command
补充:
Ctrl + h - 删除当前字符
Ctrl + w - 删除最后输入的单词 

ALT 键相关的快捷键:

平时很少用。有些和远程登陆工具冲突。
Alt + < - Move to the first line in the history
Alt + > - Move to the last line in the history
Alt + ? - Show current completion list
Alt + * - Insert all possible completions
Alt + / - Attempt to complete filename
Alt + . - Yank last argument to previous command
Alt + b - Move backward
Alt + c - Capitalize the word
Alt + d - Delete word
Alt + f - Move forward
Alt + l - Make word lowercase
Alt + n - Search the history forwards non-incremental
Alt + p - Search the history backwards non-incremental
Alt + r - Recall command
Alt + t - Move words around
Alt + u - Make word uppercase
Alt + back-space - Delete backward from cursor 
// SecureCRT 如果没有配置好,这个就很管用了。

其他特定的键绑定:

输入 bind -P 可以查看所有的键盘绑定。这一系列我觉得更为实用。
Here "2T" means Press TAB twice
$ 2T - All available commands(common) //命令行补全,我认为是 Bash 最好用的一点 
$ (string)2T - All available commands starting with (string)
$ /2T - Entire directory structure including Hidden one
$ ./2T - Only Sub Dirs inside including Hidden one
$ *2T - Only Sub Dirs inside without Hidden one
$ ~2T - All Present Users on system from "/etc/passwd" //第一次见到,很好用
$ $2T - All Sys variables //写Shell脚本的时候很实用
$ @2T - Entries from "/etc/hosts"  //第一次见到
$ =2T - Output like ls or dir //好像还不如 ls 快捷
补充:
Esc + T - 交换光标前面的两个单词

很多来自GNU 的 readline 库。另外一份总结也很好

记忆是所有技术人员的敌人。一次要把所有的都记住是不可能的。针对自己的使用习惯,对少数快捷键反复使用,短期内就会有效果。

你还知道那些好用的快捷键 ? 补充一下 ?

--EOF--

Crontab 笔记

关于 Crontab ,维基百科上的词条 Crontab非常好。可惜这个地址在国内不用代理访问不到。

虽然关于 Crontab 的介绍到处都是,详细读了一遍这个词条,收获还是有的。Crontab 这个名字来自 "chronos",一个古希腊语, “时间”的意思.

常见陷阱

每个SA、DBA 或者是普通的 Unix 用户,在第一次使用 Crontab 的时候都会遇到问题. 运行 Crontab 的常见错误包括如下几种:

1) 出于测试目的新创建了一条 Cron JOB, 时间间隔必须超过两分钟,否则 JOB 将调度不到。如果必须忽略这两分钟的载入配置时间差,可以通过重新启动 Cron Daemon 做到。

2) 从 Crontab 中启动 X Window 程序需要注意的事项:所以要么在程序前初始化 "DISPLAY=:0.0", 要么在应用程序后面追加参数 --display :0.0

3) 命令中的 % 必须做转义处理: \% .我个人的意见是不要在命令行里带这个参数,干脆写到脚本里,然后调度该脚本即可。

其实我倒是认为使用 Crontab 最常见的一个问题往往是因为环境变量不对。经常会看到论坛里有人问:为什么我的 Crontab 创建了不执行? 准备创建一条 Cron JOB 的时候,很多人都喜欢在命令行下运行一遍,因为这个时候环境变量是随着 Shell 自动带进来,在 Crontab 中则可能因为找不到正确的环境变量,JOB 就不能执行。这个小问题就像出天花,一次教训之后就都记得了。

必须使用的一则技巧

每条 JOB 执行完毕之后,系统会自动将输出发送邮件给当前系统用户。日积月累,非常的多,甚至会撑爆整个系统。所以每条 JOB 命令后面进行重定向处理是非常必要的: >/dev/null 2>&1 。前提是对 Job 中的命令需要正常输出已经作了一定的处理, 比如追加到某个特定日志文件。

附: Crontab 的格式说明如下:

* 逗号(',') 指定列表值。如: "1,3,4,7,8"
* 中横线('-') 指定范围值 如 "1-6", 代表 "1,2,3,4,5,6"
* 星号 ('*') 代表所有可能的值

Linux(开源系统似乎都可以)下还有个 "/" 可以用. 在 Minute 字段上,*/15 表示每 15 分钟执行一次. 而这个特性在商业 Unix ,比如 AIX 上就没有.

# Use the hash sign to prefix a comment
# +---------------- minute (0 - 59)
# |  +------------- hour (0 - 23)
# |  |  +---------- day of month (1 - 31)
# |  |  |  +------- month (1 - 12)
# |  |  |  |  +---- day of week (0 - 7) (Sunday=0 or 7)
# |  |  |  |  |
# *  *  *  *  *  command to be executed

新的笔记本拿到了,旧系统上的很多信息要前一到新机器上来,还要作不少配置,系统才可以用起来得心应手。这些都做完了感觉还真的做了不少操作,记录一下供大家参考。

网上有一些经验可以介绍,比如这篇《重新安装系统后要做的十件大事》,但里面有几条随着 XP 的 SP2 发布后已不适用。

备份

需要备份的有:

收藏夹内容。IE 收藏夹内容备份比较好做。Firefox 的则需要在安装目录下寻找 bookmarks.htm 的文件,拷贝到目标机器上。

证书备份 我的机器上有两个需要备份的:招行专业版的证书,支付宝证书(参考)。

Outlook 配置信息备份 通过Office工具"Microsoft Office 2003 用户设置保存向导"来做,当然还需要备份邮件的数据文件

IM 工具的历史聊天记录。阿里旺旺的聊天记录备份只需要把安装目录中的 Users 文件夹复制到远程即可。MSN Messenger 的记录在"我的文档"里面。

此外还有 Flashget 下载的历史数据文件,SecureCRT 配置信息等等,IE 的 Cookie 也有必要导出并导入到新的环境。

打开 Windows XP SP2 的防火墙

先不要接入网络,打开 Windows XP SP2 的防火墙,这是重新安装系统后的第一件事情。否则如果感染病毒的话,就要反复折腾几次才能好。

关闭恼人的媒体自动播放功能

单击"开始→运行",在"打开"框中,键入"gpedit.msc",单击"确定"按钮,打开"组策略"窗口;
在左窗格的"本地计算机策略"下,展开"计算机配置→管理模板→系统",然后在右窗格的"设置"标题下,双击"关闭自动播放";
单击"设置"选项卡,选中"已启用"复选钮,然后在"关闭自动播放"框中单击"所有驱动器",单击"确定"按钮,最后关闭"组策略"窗口。
在"用户配置"中同样也存在这个"关闭自动播放"设置。但"计算机配置"中的设置比"用户配置"中的设置优先。

取消压缩文件夹支持

这条经验来自上面的"十件事",运行命令:

"regsvr32 /u zipfldr.dll" ,回车,出现提示窗口"zipfldr.dll中的Dll UnrgisterServer成功"即可取消Windows XP的压缩文件夹支持。另外,输入regsvr32 shdocvw.dll可以取消"图片和传真"与图片文件的关联。

微软的 Powertoys for Windows XP 工具中的 Tweak UI 也很好用的,做个性化设置可以尝试一下。

其它需要处理的有:

  • Ultraedit 语言配置文件
  • 输入法词库的备份
  • Firefox 插件列表备份

--EOF--

监控 Linux 服务器的时候,经常在 /var/log/messages 文件中看到类似如下的信息:

fooServer ntpd[7250]: can't open /etc/ntp/drift.TEMP: Permission denied

快速解决:

编辑 /etc/ntpd.conf 文件,找到这一行:

driftfile /etc/ntp/drift
修改为:
driftfile /var/lib/ntp/drift
更多信息参考这里

这个问题最容易在 RHEL 服务器上遇到,碰上两次了,记录一下备忘。

--EOF--

1 2 3 4 5 6

关于归档

本页包含 Tech.Memo 类别下的所有文章.

上一类别为 Startup.

Web 为下一类别.

回到 首页 查看最近发表的文章或者查看所有 归档文章.