2013-12-22
Amazon EC2数据备份之EBS
众所周知,amazon EC2中创建的虚拟机instance在关闭后,数据是不保留的。也就是说,如果instance因为意外操作或者AWS宕机等原因被重启了,哪这个系统中所有的数据就都没有了 🙁
之所以AWS被设计为如此,应该是为了节约资源的考虑。大部分的EC2 instance应该是为纯计算型应用服务的,用的时候创建进行运算服务,运算结果可以由用户导出下载到本地,云中是不需要保存这部分数据的,因此为每个instance保留数据实例,意义并不大。
但是如果想用EC2做web host,数据持久化是必须要面对的问题。针对这个情况 ,amazon提供了对应的EBS服务,elastic block storage 。
通过EBS创建的volum卷可以挂载到指定的instance之上,EBS卷上的数据不会受到关联的instance的启动或者关闭的影响,数据是持久保存的,因此用EBS来实现instance上数据的持久化是最简单的选择。
铺垫了这么多,言归正传,pixcase.me在EC2上毫无保障地裸奔了一个多月之后,今天终于用EBS建起了最基本的数据保障。拖延症和极端的乐观主义果然是有直接关系的,悲观主义者肯定第一天就把数据备份的问题搞定了,怕宕机啊。。。
pixcase.me用wordpress搭建,现在在instance上跑的主要是一个apache和一个mysqld,需要备份的数据只有/var/www目录下的网站代码和上传的文件,另外还需要备份的还有mysql数据库。
在AWS management console里面创建一个新的ebs volum,Amazon Aws Trail免费套装里面EBS有30G的免费额度,之间创建的micro instance只占用了8g,我们还有22G免费额度可用。考虑以后还可能继续折腾,暂时创建了一个8G的新卷,剩下来的额度留着今后折腾别的用~。
EBS卷创建完毕之后,右键点击卷名,选择挂载到我们之前创建到得instance之上。
打开终端,在/dev目录下,可以看到新出现了一个新设备xvdf
root@ip-172-31-5-135:~# cd /dev/ root@ip-172-31-5-135:/dev# ll | grep xvd brw-rw---- 1 root disk 202, 1 Oct 19 13:50 xvda1 brw-rw---- 1 root disk 202, 80 Dec 22 07:54 xvdf
新创建的EBS卷要格式化后才能使用
root@ip-172-31-5-135:/dev# sudo mkfs.ext4 /dev/xvdf
然后再挂载到系统之中
root@ip-172-31-5-135:/dev# mkdir -m 000 /vol root@ip-172-31-5-135:/dev# echo "/dev/xvdf /vol auto noatime 0 0" | tee -a /etc/fstab root@ip-172-31-5-135:/dev# sudo mount /vol
ubuntu@ip-172-31-5-135:~$ df -h Filesystem Size Used Avail Use% Mounted on /dev/xvda1 7.9G 1.2G 6.3G 16% / udev 288M 8.0K 288M 1% /dev tmpfs 119M 176K 118M 1% /run none 5.0M 0 5.0M 0% /run/lock none 296M 0 296M 0% /run/shm /dev/xvdf 7.9G 218M 7.3G 3% /vol
新卷挂载完成之后,我们就可以把关键数据迁移到新卷之上了。
首先是拷贝网页代码到新卷之下:
ubuntu@ip-172-31-5-135:~$ cd /vol ubuntu@ip-172-31-5-135:/vol$ sudo mkdir www ubuntu@ip-172-31-5-135:/vol$ sudo cp -rfp /var/www/* www/
修改对应的apache配置文件,将site的DocumentRoot指向/vol/www
重新加载apache配置,完成数据迁移。
ubuntu@ip-172-31-5-135:/vol$ sudo /etc/init.d/apache2 reload * Reloading web server config apache2 [ OK ]
下面是迁移mysql数据库文件,首先拷贝文件到新的EBS卷之下:
ubuntu@ip-172-31-5-135:/vol$ sudo mkdir mysql_datadir ubuntu@ip-172-31-5-135:/vol$ sudo cp -rfp /var/lib/mysql/* /vol/mysql_datadir/* ubuntu@ip-172-31-5-135:/vol$ sudo chown mysql.mysql -R /vol/mysqld_datadir
拷贝完数据后,然后修改/etc/mysq/my.cnf,将datadir指向/vol/mysql_datadir。
迁移完毕,重启mysql,然后可耻的失败了 🙁 这是为何?
ubuntu自7.10开始启用了一套新的安全机制AppArmor,这个安全软件会在你的文件系统中创建一个允许应用程序访问的区域(专业术语:应 用程序访问控制)。如果不为MySQL修改AppArmor配置文件,永远也无法为新设置的数据库存储位置启动。
sudo nano /etc/apparmor.d/usr.sbin.mysqld
注释掉/var/lib/mysql/这两行,并加入新的配置
/vol/mysql_datadir/ r, /vol/mysql_datadir/** rwk,
配置修改完毕后,再次重启mysql
ubuntu@ip-172-31-5-135:~$ sudo /etc/init.d/mysql restart Rather than invoking init scripts through /etc/init.d, use the service(8) utility, e.g. service mysql restart Since the script you are attempting to invoke has been converted to an Upstart job, you may also use the stop(8) and then start(8) utilities, e.g. stop mysql ; start mysql. The restart(8) utility is also available. mysql stop/waiting mysql start/running, process 8967
大功告成,今晚可以安心睡觉了~ 🙂