将Sakura Internet的数据搬迁到AWS上

由于存储成本较高,因此考虑是否可以迁移到AWS。

我现在同时进行着两项服务,一个是名为Nikolan的服务,另一个是名为nicoappli的服务。不过,nicoappli这个服务我并没有那么认真地做。

“ニコラン” 是NicoNico动画的独家排行榜网站。”nicoappli” 是将iTunes排行榜每周进行网页抓取并整合的结果。

尼科兰使用了樱花VPS的SSD 4G计划。尼科应用程序使用了樱花VPS的4G计划。尼科兰因为需要快速速度,所以选择了SSD,而尼科应用程序想要抓取数据,所以选择了带有大容量HHD(400GB)的计划。

合計で月7000円程度かかっており、年間8万程度なので若干高く感じている。もう少し安く出来ないかと考えていたが、最近AWSが安くなったので、試算してみた。AWS m1.large のspot instanceが0.0201ドルなので一ヶ月で約14ドルになる。だいぶお安くなるので、データストレージだけ乗り換えられないか検証してみた。幸いなことにm1.largeの容量は、420GBx2=840GBなので、容量不足に悩まされることはなさそうだ。SSDのHDDに比べてAWSの普通のHDDは遅いが、m1.largeはメモリが8GB付いているので、上手くメモリーに載せることで、高速化させる腹だ。

顺便提一句,尼克兰的存储使用的是SSD上的MySQL,而尼克应用的存储则是使用MongoDB,所以只要能迁移那边的数据就好了。

AWS側の準備 (LVMを使ってhddの容量増加)

在Ubuntu14.04上启动AWS的m1.large实例,并使用LVM来增加容量。

これを参考

使用420乘以2

ストレージの選択

予めEC2の起動時に、ストレージを2つ選択して立ち上げなければならない。
忘れるとあとで拡張できない。そのため注意が必要だ。

使用 LVM 增加容量。

ubuntu@ip-10-156-93-112:~$ sudo aptitude install -y lvm2
ubuntu@ip-10-156-93-112:~$ sudo modprobe dm-mod
ubuntu@ip-10-156-93-112:~$ sudo fdisk -l #<- fdiskで容量の確認

          Disk /dev/xvda1: 8589 MB, 8589934592 bytes
          255 heads, 63 sectors/track, 1044 cylinders, total 16777216 sectors
          Units = sectors of 1 * 512 = 512 bytes
          Sector size (logical/physical): 512 bytes / 512 bytes
          I/O size (minimum/optimal): 512 bytes / 512 bytes
          Disk identifier: 0x00000000

          Disk /dev/xvda1 doesn\'t contain a valid partition table

          Disk /dev/xvdb: 450.9 GB, 450934865920 bytes
          255 heads, 63 sectors/track, 54823 cylinders, total 880732160 sectors
          Units = sectors of 1 * 512 = 512 bytes
          Sector size (logical/physical): 512 bytes / 512 bytes
          I/O size (minimum/optimal): 512 bytes / 512 bytes
          Disk identifier: 0x00000000

          Disk /dev/xvdb doesn\'t contain a valid partition table

          Disk /dev/xvdc: 450.9 GB, 450934865920 bytes
          255 heads, 63 sectors/track, 54823 cylinders, total 880732160 sectors
          Units = sectors of 1 * 512 = 512 bytes
          Sector size (logical/physical): 512 bytes / 512 bytes
          I/O size (minimum/optimal): 512 bytes / 512 bytes
          Disk identifier: 0x00000000

          Disk /dev/xvdc doesn\'t contain a valid partition table

ubuntu@ip-10-156-93-112:~$ sudo umount /mnt #<-容量を増やす前に、umoutしないと怒られます。
ubuntu@ip-10-156-93-112:~$ sudo pvcreate /dev/xvdb 
            Physical volume "/dev/xvdb" successfully created
ubuntu@ip-10-156-93-112:~$ sudo pvcreate /dev/xvdc
            Physical volume "/dev/xvdc" successfully created
ubuntu@ip-10-156-93-112:~$ sudo pvscan #<- 420GBづつあります。
            PV /dev/xvdb                      lvm2 [419.97 GiB]
            PV /dev/xvdc                      lvm2 [419.97 GiB]
            Total: 2 [839.93 GiB] / in use: 0 [0   ] / in no VG: 2 [839.93 GiB]
ubuntu@ip-10-156-93-112:~$ sudo vgcreate vsakura /dev/xvdb /dev/xvdc
            Volume group "vsakura" successfully created
ubuntu@ip-10-156-93-112:~$ sudo vgs
            VG      #PV #LV #SN Attr   VSize   VFree
            vsakura   2   0   0 wz--n- 839.93g 839.93g
ubuntu@ip-10-156-93-112:~$ sudo lvcreate -l 100%FREE -n sdata vsakura #<- 100%で割り当て
            Logical volume "sdata" created
ubuntu@ip-10-156-93-112:~$ sudo lvscan
            ACTIVE            '/dev/vsakura/sdata' [839.93 GiB] inherit
ubuntu@ip-10-156-93-112:~$ sudo mkfs.ext4 -j /dev/vsakura/sdata #<- ファイルシステムを作る。若干時間がかかります
          mke2fs 1.42.9 (4-Feb-2014)
         ...
          Writing superblocks and filesystem accounting information:
          done
ubuntu@ip-10-156-93-112:~$ sudo mount /dev/vsakura/sdata /mnt #<-マウントします
ubuntu@ip-10-156-93-112:~$ df -h
          Filesystem                 Size  Used Avail Use% Mounted on
          /dev/mapper/vsakura-sdata  827G   73M  785G   1% /mnt #<- 増えた

将mysql-server和mongodb的数据文件夹更改为大容量的硬盘。

上で、データディスクの容量を増やしたが、mysql,mongodbともデータフォルダは/var/lib以下にある。そのため先ほど追加した/mntの容量が増えても、それを利用できない。mysql,mongoとも、/mnt以下を利用するように修正が必要だ。

mysql-server,mongodbのインストール

首先,安装所需的软件包。

ubuntu@ip-10-156-93-112:/etc$sudo aptitude install -y emacs
ubuntu@ip-10-156-93-112:/etc$sudo aptitude install -y tmux

ubuntu@ip-10-156-93-112:/etc$ sudo aptitude install -y mysql-server-5.6
ubuntu@ip-10-156-93-112:/etc/mysql$ sudo service mysql stop #<-修正するので止める
ubuntu@ip-10-156-93-112:/etc/mysql$ sudo aptitude install -y  mongodb
ubuntu@ip-10-156-93-112:/etc/mysql$ sudo service  mongodb stop #<-修正するので止める

在途中进行了Mongo数据库的连接测试时,

ubuntu@ip-10-156-93-112:/etc/mysql$ mongo
MongoDB shell version: 2.4.9
connecting to: test
Sat Jun  7 08:10:46.416 Error: couldn\'t connect to server 127.0.0.1:27017 at src/mongo/shell/mongo.js:145
exception: connect failed

当出现这种错误时,请参考http://stackoverflow.com/questions/22128884/mongo-is-not-connecting-but-installed-and-show-version。

sudo rm /var/lib/mongodb/mongod.lock

只需要一个选择,那就是“进行这项操作就好了。同时进行数据库的修复工作。”

将数据库的存储位置更改。

将MongoDB和MySQL的数据存储位置进行更改。

ubuntu@ip-10-156-93-112:/mnt/lib$ cd /mnt/lib
ubuntu@ip-10-156-93-112:/mnt/lib$ sudo mv /var/lib/mongodb mongodb
ubuntu@ip-10-156-93-112:/mnt/lib$ sudo mv /var/lib/mysql mysql

创建符号链接

ubuntu@ip-10-156-93-112:/var/lib$ sudo ln -s /mnt/lib/mongodb mongodb
ubuntu@ip-10-156-93-112:/var/lib$ sudo ln -s /mnt/lib/mysql mysql

修正 mongodb 数据路径

调整 /etc/mongodb.conf 文件。

# Where to store the data.
dbpath=/var/lib/mongodb
↓
# Where to store the data.
dbpath=/mnt/lib/mongodb

修改MySQL路径
修改/etc/mysql/my.cnf文件

datadir         = /var/lib/mysql
↓
datadir         = /mnt/lib/mysql

在mysql的apparmor配置中添加之前的数据文件夹。

在Ubuntu上,MySQL使用名为AppArmor的机制来限制可以访问的路径。请参考下面的链接,在AppArmor中添加新的数据目录(dir)。

在apparmor中添加MySQL。
编辑/etc/apparmor.d/local/usr.sbin.mysqld。

/mnt/lib/mysql/ r,
/mnt/lib/mysql/** rwk,

添加

接下来,重新启动MySQL服务器和MongoDB服务器。如果各自的日志中没有错误,则表示OK。

提高MySQL的速度

在上述例子中,无论是MySQL还是MongoDB的容量都增加了。另外,就MySQL而言,我们进行了MySQL的调优,旨在提升其速度。

我已将my.cnf文件进行以下修改。

[mysqld]
...中略

# * InnoDB
#
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql
/.
# Read the manual for more InnoDB related options. There are many!

# You can write your other MySQL server options here
# ...
#innodb_data_home_dir =
#
# Data files must be able to hold your data and indexes
# innodb_data_file_path = /db/ibdata1:2000M;/dr2/db/ibdata2:2000M:aut
oextend
#
# Set buffer pool size to 50-80% of your computer's memory,
# but make sure on Linux x86 total memory usage is < 2GB
innodb_buffer_pool_size = 4G #<- m1.largeは7.5GBなどで、4GB程度取る。

# innodb_log_group_home_dir = /dr3/iblogs
#
innodb_log_files_in_group = 2
#
# Set the log file size to about 25% of the buffer pool size
innodb_log_file_size= 1G
innodb_log_buffer_size=8M
#
innodb_flush_log_at_trx_commit=1
#innodb_lock_wait_timeout=50
#
# Uncomment the next lines if you want to use them
#innodb_thread_concurrency=5
innodb_file_per_table=1 #< テーブルごとにidbを作る。

随后,重新启动MySQL。

其它的数据迁移工作

然后进行了数据迁移工作。

MySQL使用了复制机制。复制机制的详细内容可以参考http://wadslab.net/wiki/index.php?MySQL%20复制机制。

关于MongoDB的复制功能,参考了http://www.onaxer.com/2013/02/05/setup-mongodb-masterslave-replication/ 这个链接。只需要将mongodb.conf中的master/slave参数分别设为true,并将source指定为slave就可以了,非常简单。需要注意的是,在开始之前要确保从slave能够正确访问到master的MongoDB。

尝试比较MySQL的速度。

在将Sakura的SSD迁移到m1.large时,我关注的是SQL的执行速度。我进行了比较。

比较的表格是包含了每日标签积分的表格。表格的规模为400万条记录。

这里是使用过的SQL。

select tag,avg(point) as avg,count(*) as cnt from daily_tag_points where date between "2013-05-01" and "2014-06-01"  group by tag having cnt > 20 order by cnt desc,avg desc limit 100;
タイプm1.largeサクラSSD4G表示結果(1 min 16.43 sec)(33.07 sec)秒数変換76.43 sec33.07 sec

大致上,m1.large 的速度比较慢约为其两倍。固态硬盘确实是有其优势。不过,我觉得这个速度还是能够接受的。

广告
将在 10 秒后关闭
bannerAds