Category Archives: devops

MongoDB on EBS with RAID10, LVM, XFS

I keep forgetting these commands since those are used once in a blue moon, so
writing this post to refer them when needed.

As mentioned in MongoDB – Amazon EC2 Docs [1], we will create a RAID10 array.
RAID10 provides both striping (speed) and mirroring (redundancy).[2]

– Create RAID10 array

4 Disks of 8 GB Each – 16 Gigs available for use

$ mdadm --verbose --create /dev/md0 --level=10 --chunk=256 --raid-devices=4 /dev/sdf{1..4}
$ blockdev --setra 512 /dev/md0 # [3]

I used to set “readahead” to “65536” [4] , but then I got following warning with MongoDB 2.4.x

Readahead for /path/to/mongo/partition is set to 2048KB, we suggest setting it to 256KB.

Refer [3] for more details.

$ mdadm --detail --scan >> /etc/mdadm/mdadm.conf

16 Gigs is not a huge space, You will have to increase this space as your DB grows. For that we need LVM [5] .

– Create a physical volume
$ pvcreate /dev/md0

– Create a volume group
$ vgcreate VOL_GRP_NAME /dev/md0

– Check available Free Physical Extents (Free PE), use that number in next command
$ vgdisplay VOL_GRP_NAME

$ lvcreate --name LOGICAL_VOL_NAME --extents +100%FREE VOL_GRP_NAME

– Create file system
$ mkfs.xfs -f /dev/VOL_GRP_NAME/LOGICAL_VOL_NAME

– Mount newly created partition
$ mount -t xfs -o noatime,noexec,nodiratime /dev/VOL_GRP_NAME/LOGICAL_VOL_NAME /MOUNT_POINT/

– Put an /etc/fstab entry so the partition will mount automatically if you reboot.
$ echo "/dev/VOL_GRP_NAME/LOGICAL_VOL_GRP /MOUNT_POINT xfs noatime,noexec,nodiratime 0 0" >> /etc/fstab

– When you want to increase the size of an array, create another RAID10 array /dev/md1

– Extend Volume Group
$ vgextend VOL_GRP_NAME /dev/md1

– Extend Logical Volume
$ lvextend -l +100%FREE /dev/VOL_GRP_NAME/LOGICAL_VOL_NAME

– Finally extend file system on it
$ xfs_growfs /MOUNT_POINT

(You don’t have to un-mount partition or reboot system since XFS supports live expansion) [6]