概述
在RDS的存储中,我们使用LVM卷给Docker container使用,默认LVM是不使用thin的feature的;在LVM 的 2.02.89 版本后,引入了Thin Pool的概念,开始支持创建Thin Provision的volume;
我们线上的LVM版本为:
1 | openstack@trove-server1:~$ sudo lvm version |
所以我们这里调整LVM的配置,来支持创建的volume为Thin Provision的volume,提高设备的资源使用率
LVM创建Thin Provision Volume
创建Thin Pool
1 | root@trove-server1:/home/openstack# vgs |
查看Thin Pool
1 | root@trove-server1:/home/openstack# lvdisplay volume-group-sata/vg-sata-thin-pool |
创建Thin Volume
1 | root@trove-server1:/home/openstack# lvcreate -V 5G --thin -n thin_vol_test volume-group-sata/vg-sata-thin-pool |
从上述的Data%中可以看出,创建5.00G的volume,vg-sata-thin-pool的Data%为0.00;
删除Thin Volume
1 | root@trove-server1:/home/openstack# lvremove volume-group-sata/thin_vol_test |
Thin Volume创建时间
测试下Thin Volume的创建时间是否与volume size有关系
1 | root@BJ-BGP03-001-001:/home/openstack/mikeyang# time lvcreate -V 30G --thin -n volume-test volume-group-sata/volume-group-sata-pool |
从上述测试中可以看出,Thin Volume的创建时间很短,不受volume size大小影响
扩容Thin Pool
因为Thin Pool对应的其实也是一个LVM volume,所以通过lvextend命令即可扩容
1 | # lvextend -L 2.5t volume-group-pcie/volume-group-pcie-pool |
参考
https://linux.cn/article-4288-1.html
http://mathslinux.org/?p=379
Cinder支持创建Thin Provision volume
Cinder配置
查询Cinder代码,发现cinder是支持thin的lvm格式的;
需要在cinder中添加如下配置:
1 | /opt/etc/cinder/cinder.conf |
如上述配置,只需要添加:lvm_type = thin 即可;LVM会自动创建名称为
重启服务
1 | openstack@trove-server1:~$ service cinder-api restart; service cinder-backup restart; service cinder-scheduler restart; service cinder-volume restart; |
重启cinder服务后,测试创建RDS实例即可;
原有volumes迁移
修改为支持Thin Provision Volumes后,对之前创建的volume需要迁移到Thin Provision Volume上,这里给出迁移方案
在RDS的两个docker container中,一端一端的做volume的迁移;
Umount volume
1 | openstack@trove-server1:~$ docker exec -it 583e869197cd bash |
停止Docker Container
1 | openstack@trove-server1:~$ docker stop 583e869197cd |
rename原有volume
1 | root@trove-server1:/home/openstack# lvrename volume-group-pcie/volume-ca880d25-c95f-4d19-993c-ee7ccfbf8d1c volume-group-pcie/backup-volume |
创建新的Thin Provision Volume
1 | root@trove-server1:/home/openstack# lvcreate -V 5G --thin -n volume-ca880d25-c95f-4d19-993c-ee7ccfbf8d1c volume-group-ssd/volume-group-ssd-pool |
格式化新的Thin Provision Volume
1 | root@trove-server1:/home/openstack# mkfs.ext3 /dev/volume-group-ssd/volume-ca880d25-c95f-4d19-993c-ee7ccfbf8d1c |
volume数据迁移
1 | root@trove-server1:/home/openstack# mount /dev/volume-group-ssd/volume-ca880d25-c95f-4d19-993c-ee7ccfbf8d1c /mnt/destination/ |
启动Docker Container
1 | openstack@trove-server1:~$ nova reboot 9709c88c-d392-4a52-8301-4135cadcdea6 |
若报错,则先执行nova start
检查trove实例状态
1 | openstack@trove-server1:~$ docker exec -it 583e869197cd bash |
若发现mysql没启动,可能是因为/var/lib/mysql/里的文件权限导致的,把/var/lib/mysql/的权限修改为mysql:mysql 即可;
注意事项
- 最好先迁移floating ip不在的trove实例上的volume;然后切换floating ip后,再迁移另外一个trove实例的volume;
- 最好在客户使用rds服务不频繁的时候做数据迁移;
- 迁移完一端的trove实例后,需要等待mysql为active-active状态后再迁移另外一端;