在 Linux 上创建 Software RAID 10

昨天重装一台老服务器的时候发现 Intel hardware RAID 控制卡有问题,不能识别所有硬盘,但是安装操作系统过程中可以识别所有硬盘,还有一个问题就是操作系统安装正常,但是安装完后无法启动,某种原因导致 BIOS 不能从硬盘启动系统。所以打算把操作系统安装到一个 USB 盘上,然后从 USB 盘启动系统,并给上面的6块硬盘做成 Software RAID 10 后挂载到系统里用。

做 Software RAID 不要求硬盘都一模一样,但是强烈推荐用同一厂商、型号和大小的硬盘。为啥 RAID 10,不选 RAID0, RAID1, RAID5 呢?答:RAID0 太危险,RAID1 性能稍逊一些,RAID5 频繁写情况下性能差,RAID10 似乎是当今磁盘阵列的最佳选择,特别适合做 KVM/Xen/VMware 虚拟机母机(host)的本地存储系统(如果不考虑 SAN 和分布式存储的话)。

这台服务器上有6块完全相同的硬盘,给每块硬盘分成一个区,分区格式为 Linux software raid:

# fdisk /dev/sda

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-91201, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-91201, default 91201):
Using default value 91201

Command (m for help): p

Disk /dev/sda: 750.2 GB, 750156374016 bytes
255 heads, 63 sectors/track, 91201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0005c259

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1       91201   732572001   83  Linux

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

按照上面的 /dev/sda 的分区例子依次给剩下的5块硬盘 sdc, sdd, sde, sdf, sdg 分区、更改分区格式:

# fdisk /dev/sdc
...
# fdisk /dev/sdd
...
# fdisk /dev/sde
...
# fdisk /dev/sdf
...
# fdisk /dev/sdg
...

分区完成后就可以开始创建 RAID 了,在上面的6个相同大小的分区上创建 raid10:

# mdadm --create /dev/md0 -v --raid-devices=6 --level=raid10 /dev/sda1 /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1 /dev/sdg1
mdadm: layout defaults to n2
mdadm: layout defaults to n2
mdadm: chunk size defaults to 512K
mdadm: size set to 732440576K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

查看磁盘阵列的初始化过程(build),根据磁盘大小和速度,整个过程大概需要几个小时:

# watch cat /proc/mdstat
Every 2.0s: cat /proc/mdstat                                       Tue Feb 11 12:51:25 2014

Personalities : [raid10]
md0 : active raid10 sdg1[5] sdf1[4] sde1[3] sdd1[2] sdc1[1] sda1[0]
      2197321728 blocks super 1.2 512K chunks 2 near-copies [6/6] [UUUUUU]
      [>....................]  resync =  0.2% (5826816/2197321728) finish=278.9min speed=13
0948K/sec

unused devices: 

等阵列完成初始化后,就可以给 md0 设备创建分区和文件系统了,有了文件系统就可以挂载到系统里:

# fdisk /dev/md0
# mkfs.ext4 /dev/md0p1

# mkdir /raid10
# mount /dev/md0p1 /raid10

修改 /etc/fstab 文件让每次系统启动时自动挂载:

# vi /etc/fstab
...
/dev/md0p1 /raid10 ext4 noatime,rw 0 0

在上面的 /etc/fstab 文件里使用 /dev/md0p1 设备名不是一个好办法,因为 udev 的缘故,这个设备名常在重启系统后变化,所以最好用 UUID,使用 blkid 命令找到相应分区的 UUID:

# blkid
...
/dev/md0p1: UUID="093e0605-1fa2-4279-99b2-746c70b78f1b" TYPE="ext4"

然后修改相应的 fstab,使用 UUID 挂载:

# vi /etc/fstab
...
#/dev/md0p1 /raid10 ext4 noatime,rw 0 0
UUID=093e0605-1fa2-4279-99b2-746c70b78f1b /raid10 ext4 noatime,rw 0 0

查看 RAID 的情况:

# mdadm --query --detail /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Tue Feb 11 12:50:38 2014
     Raid Level : raid10
     Array Size : 2197321728 (2095.53 GiB 2250.06 GB)
  Used Dev Size : 732440576 (698.51 GiB 750.02 GB)
   Raid Devices : 6
  Total Devices : 6
    Persistence : Superblock is persistent

    Update Time : Tue Feb 11 18:48:10 2014
          State : clean
 Active Devices : 6
Working Devices : 6
 Failed Devices : 0
  Spare Devices : 0

         Layout : near=2
     Chunk Size : 512K

           Name : local:0  (local to host local)
           UUID : e3044b6c:5ab972ea:8e742b70:3f766a11
         Events : 70

    Number   Major   Minor   RaidDevice State
       0       8        1        0      active sync   /dev/sda1
       1       8       33        1      active sync   /dev/sdc1
       2       8       49        2      active sync   /dev/sdd1
       3       8       65        3      active sync   /dev/sde1
       4       8       81        4      active sync   /dev/sdf1
       5       8       97        5      active sync   /dev/sdg1

Bloglines 的技术选择和经验

VPSee 以前常用 Bloglines 的 RSS 阅读器订阅一些博客,后来改成 Google Reader 用了一段时间,再后来干脆直接在 Mac 上装个 NetNewWire 客户端,并且可以和 Google Reader 同步,非常方便阅读和管理。这篇文章介绍了 Bloglines 创始人 Mark Fletcher 的的一些创业经验、技术选择和架构等,值得学习学习,特别是对一边工作一边创业的小团队来说。

Bloglines 是典型的车库文化,Mark Fletcher 当初是一边干着正式的工作一边开始自己的创业的,硅谷有很多 startup(创业公司)都是这样起步的,这是包括著名高科技风险投资公司 Y Combinator 创始人 Paul Graham 在内的很多创业大师都推荐的创业方式,在确定自己的创业/赚钱想法可行之前保持稳定的收入来源,这样有助于减少创业的风险和压力,毕竟不是每个人都是 Bill Gates,不是每个人都可以放弃大学或工作开始创业并取得成功的。让人惊奇的是,Bloglines 2005年卖给 Ask.com 的时候还不到10个人。遗憾的是,Ask.com 决定将在今年的10月1日关闭 Blogline.

创业经验

  • 激情,因为这辈子大部分时间都会花在工作和事业上,如果对自己所做的事情没有兴趣和激情的话是不可能坚持到最后的;
  • 采用廉价的技术,现在是互联网创业的好时候,硬件和软件(开源)越来越便宜;
  • Keep it simple,保持简单,使用简单的技术并让为用户觉得简单;(把简单的事情做好就是不简单
  • 夜晚工作,使用自己晚上或者周末的时间工作在自己的创业项目上,从亲朋好友那里寻找资金,免费的服务=更少的压力,免费服务 down 几个小时不会有人抱怨;
  • 雇佣一个律师
  • Web services API 是个好东西
  • 寻找帮助(尤其需要找个好的系统管理员)
  • 考虑外包(eLance.com)

软件选择

  • DBJ (http://cr.yp.to), qmail, djbdns, daemontools
  • ClearSilver (web templating package)
  • Berkeley DBs
  • Linux/Apache
  • C/C++/Bash/Python
  • Skiplist data structure(一个数据结构算法)
  • 避免使用 NFS
  • 避免在 MySQL 中使用表级别的锁,因为不 scale

硬件选择

  • 是租用独立服务器还是托管呢?Bloglines 选择了租用,起步的费用更少;
  • 一切为廉价硬件设计,Google 就是个用廉价硬件搭建服务器集群的好例子;
  • eBay 是个买便宜硬件的好地方;
  • APC PDUs;
  • HP ProCurve 很不错;
  • 避免使用 Seagate Ultra-SCSI 硬盘;
  • 一个有好的 ssh 客户端的手机,这样可以在任何地方 ssh 到服务器上。

存储选择

  • 关系数据库 vs. 文件,他们的所有博客文章都采用文件方式存储;
  • RAID vs. Redundant,他们在所有机器上都保留博客文章副本,如果一台机器 down 了不影响访问;
  • Linux software RAID 1,非常稳定。

系统管理

  • 网站服务器采用 DNS round robin,不必设置负载均衡;
  • 采用热备份冷处理,每小时备份,但是到线下再处理数据(比如 RSS 的订阅数可以每天线下统计,不必即时统计);
  • 小心服务器温度,如果硬盘出问题,可能是服务器过热、温度不适造成的。