关于存储的一些问题
Ceph增加osd的方法
如果在部署环境前无法识别硬盘,但是环境又要求存储必须为ceph,可以用如下方法:
部署模式按ceph走,在磁盘划分的时候根据实际情况划分
环境部署成功且各组件正常工作,这时候到相应的节点查看部署前未被识别的硬盘是否被识
别(注:不要对识别的新硬盘进行分区格式化!!!)如果有,请按如下方法进行ceph
的osd的增加:
1:首先查看当前环境的ceph环境
ceph osd tree
node-xxx
osd.4 up
记住相应节点的当前有几个osd,方便一会增加后进行核实
2:在相应的节点(非管理节点)执行如下命令
ceph-deploy osd prepare $(hostname -s):/dev/sdx
ceph-deploy osd activate $(hostname-s):/dev/sdx1
注:第一步执行后,它是在进行硬盘的分区和格式化,硬盘会被分成两个分区,只有第一个分区才是有用的,由于是首次操作,第二个分区用作OSD日志
3:在管理节点查看
ceph -s
正常的话,这时候就能看到相应节点已经新增了osd
ceph-deploy添加硬盘(存储上的LUN)报错
问题原因:ceph-deploy不支持外挂存储
解决方法:
手动添加OSD示例:
uuidgen
cephosd create 906f693a-acb0-4f24-8e2c-a8d7cdaec63f
mkdir/var/lib/ceph/osd/ceph-3
mkfs-t xfs /dev/mapper/mpathcp
mount-t xfs /dev/mapper/mpathcp1 /var/lib/ceph/osd/ceph-3
ceph-osd-i 3 --mkfs --mkkey --osd-uuid 906f693a-acb0-4f24-8e2c-a8d7cdaec63f
cephauth add osd.3 osd 'allow *' mon 'allow profile osd' -i/var/lib/ceph/osd/ceph-3/keyring
cephosd crush add osd.3 1.0 host=node-6
ceph-diskactivate /var/lib/ceph/osd/ceph-3
vim/etc/fstab
/dev/mapper/mpathcp /var/lib/ceph/osd/ceph-3 xfs defaults,noatime,inode64 00
从EBS启动的镜像准备方法
1、上传镜像到glance,执行glance p_w_picpath-list确保镜像上传成功
2、设置镜像的属性,glance p_w_picpath-update --propertyarchitecture=XXXX --property os_distro=XXXX --propertyos_version=XXXX --property vol_size=X p_w_picpath-ID
3、创建镜像对应的可启动卷,cinder create --p_w_picpath-id p_w_picpath-ID --display-name XXXX size,执行cinder list 确保volume创建成功
可以通过qemu-imginfo 来查看镜像的size,对于qcow2格式的镜像,size必须大于virtualsize。
4、设置volume的属性,cinder metadata volume-ID setawcloud_public_p_w_picpath=yes
5、经过上述设置,选择imge创建虚拟机时,会直接从对应的volume clone出一个新的volume。
1、上传镜像到glance,执行glance p_w_picpath-list确保镜像上传成功
2、设置镜像的属性,glance p_w_picpath-update --propertyarchitecture=XXXX --property os_distro=XXXX --propertyos_version=XXXX --property vol_size=X p_w_picpath-ID
3、创建镜像对应的可启动卷,cinder create --p_w_picpath-id p_w_picpath-ID --display-name XXXX size,执行cinder list 确保volume创建成功
可以通过qemu-img info 来查看镜像的size,对于qcow2格式的镜像,size必须大于virtual size。
4、设置volume的属性,cinder metadata volume-ID set awcloud_public_p_w_picpath=yes
5、经过上述设置,选择imge创建虚拟机时,会直接从对应的volumeclone出一个新的volume。
ceph中如何查找一个object或者rbd p_w_picpath的实际数据存储位置
ceph同时提供对象存储、块存储、文件存储三种接口,但本质上其实是对象存储,也就是说一个rbd p_w_picpath实际上包含了多个对象(默认情况下是p_w_picpath_size/4M),这里我们首先介绍一下如何查找一个对象的实际存储位置,然后介绍如何查找rbd p_w_picpath。
ceph中查找一个对象的位置
1、上传一个文件到pool(示例中叫做test)中
rados -p testput cirros cirros-0.3.2-x86_64-disk.img
2、查看pool中刚才上传的对象
rados -p test ls| grep cirros
3、查看对象的位置信息
ceph osd maptest cirros
输出结果:
osdmap e20062pool 'test' (13) object 'cirros' -> pg 13.9576dc54 (13.54) -> up ([5,3],p5) acting ([5,3], p5)
这代表pool test中的cirros这个对象位于13.54这个pg中,并且位于osd5和osd3上(两个副本)。
4、进入到对应osd的存储目录,找到对应文件即可。
cd /var/lib/ceph/osd/ceph-3/current/13.54_head; ls
这个目录下存放了13.54这个pg中所有的object,可以根据指纹9576dc54来定位到具体的文件。
ceph中查找一个rbd p_w_picpath的存储位置
正如文章开头提到,一个rbd p_w_picpath其实包含了多个obejct,因此我们只需找到这个p_w_picpath包含了哪些object,然后按照上面的方法找出每个object的位置即可。
1、在pool test中创建一个p_w_picpath1
rbd createtest/p_w_picpath1 --size 100 --p_w_picpath-format 2
2、查看这个p_w_picpath,找到指纹信息
rbd infotest/p_w_picpath1
命令输出
rbd p_w_picpath 'p_w_picpath1':
size 102400 kB in 25 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.4eed912ae8944a
format: 2
features: layering, exclusive
指纹就是4eed912ae8944a
3、根据指纹找到这个p_w_picpath的object
rados -p test ls| grep 4eed912ae8944a
这个命令的输出就是这个p_w_picpath的所有object
4、按照上面的方法即可找到每个object对应的实际存储位置
ceph 状态恢复同步过程卡住(大量pgs)
处理过程:
检查curshmap的分配是,如果有rack,查看该rack中的pg 是否够用,如果不够那就要向rack中添加主机:osd:容量等
问题原因分析:在同步过程中会不断的申请pg,所以在同步之前一定要检查容量和pg是有够用
PV丢失的故障处理
问题
手工创建逻辑卷失败,报错显示有PV丢失
现象:中科院云平台无法创建虚拟机
1.查看日志,发现是在创建逻辑卷的时候报错
2.手工创建逻辑卷失败,报错显示有PV丢失:
[root@node29archive]# lvcreate -L 1G -n testlv vgcloud
Cannotchange VG vgcloud while PVs are missing.
Considervgreduce --removemissing.
3.进一步查看:
[root@node29archive]# pvs
PV VG Fmt Attr PSize PFree
/dev/mapper/mpathbp1 vgcloud lvm2 a-- 1.82t 89.40g
/dev/mapper/mpathbp2 vgcloud lvm2 a-- 1.82t 91.14g
/dev/mapper/mpathbp3 vgcloud lvm2 a-- 1.82t 30.14g
/dev/mapper/mpathbp4 vgcloud lvm2 a-- 1.64t 30.00g
/dev/mapper/mpathcp1 vgcloud lvm2 a-m 1.82t 84.14g
/dev/mapper/mpathcp2 vgcloud lvm2 a-m 1.82t 117.14g
/dev/mapper/mpathcp3 vgcloud lvm2 a-m 1.82t 1.33t
/dev/mapper/mpathcp4 vgcloud lvm2 a-- 1.81t 1.81t
[root@node29archive]# vgs
VG #PV #LV #SN Attr VSize VFree
vgcloud 8 126 0 wz-pn- 14.36t 3.58t
其中发现有三个逻辑卷处于missing的状态
4.经过查找资料得知可以使用vgextend –restoremissing操作解决
#manvgextend
......
DESCRIPTION
vgextend allows you to add one or moreinitialized physical volumes ( see pvcre-
ate(8) ) to an existing volume group toextend it in size. Moreover, it allows you
to re-add a physical volume that hasgone missing previously, due to a transient
device failure, without re-initialisingit. Use vgextend --restoremissing to that
effect.
......
5.处理
[root@node26tmp]# vgextend --restoremissing vgcloud /dev/mapper/mpathcp1
Volume group "vgcloud" successfullyextended
[root@node26tmp]# vgextend --restoremissing vgcloud /dev/mapper/mpathcp2
Volume group "vgcloud" successfullyextended
[root@node26tmp]# vgextend --restoremissing vgcloud /dev/mapper/mpathcp3
Volume group "vgcloud" successfullyextended
6.再看已经没有missing状态标示了
手工创建逻辑卷
[root@node29archive]# lvcreate -L 1G -n testlv vgcloud
Logical volume "testlv" created
7.再创建虚拟机就可以了
在线添加磁盘
下面就是一般的给虚拟机的逻辑卷括容的操作了。首先查看虚拟机有多少块磁盘。
#virsh domblklist fuelmaster-ng
Target Source
------------------------------------------------
vda /var/lib/libvirt/ssd/fuelmaster61.img
hda /var/lib/libvirt/p_w_picpaths/fuel-community-6.1-396-2015-10-11_04-29-43.iso
其中fuelmaster-ng是虚拟机的名字。我们决定添加一个新磁盘vdb。
创建一个空的100GB磁盘文件。
# ddif=/dev/zero of=/var/lib/libvirt/p_w_picpaths/fuelmaster61vdb.img bs=1G seek=100count=0
记录了0+0 的读入
记录了0+0 的写出
0字节(0B)已复制,0.00384708 秒,0.0 kB/秒
创建一个设备描述XML。
vdb.xml
='file'>
=>
接着把这个设备在线添加到虚拟机。
#virsh attach-device --persistent fuelmaster-ng vdb.xml
成功附加设备
检查是否成功添加:
#virsh domblklist fuelmaster-ng
Target Source
------------------------------------------------
vda /var/lib/libvirt/ssd/fuelmaster61.img
vdb /var/lib/libvirt/p_w_picpaths/fuelmaster61vdb.img
hda /var/lib/libvirt/p_w_picpaths/fuel-community-6.1-396-2015-10-11_04-29-43.iso
在线扩容
下面的操作需要在虚拟机里进行。
首先用lsblk查看是否发现了新磁盘。
#lsblk
NAME
vda 252:0 0 100G 0disk
├─vda1 252:1 0 24M 0part
├─vda2 252:2 0 200M 0part /boot/efi
├─vda3 252:3 0 200M 0part /boot
└─vda4 252:4 0 99.6G 0 part
├─os-swap(dm-0) 253:0 0 3.9G 0lvm [SWAP]
├─os-root(dm-1) 253:1 0 9.8G 0lvm /
├─os-var(dm-2) 253:2 0 26.4G 0 lvm /var
├─os-varlibdocker(dm-3) 253:3 0 27.7G 0 lvm /var/lib/docker
└─os-varlog(dm-4) 253:4 0 31.8G 0 lvm /var/log
sr0 11:0 1 2.9G 0rom
vdb 252:16 0 100G 0disk
看到一个100G的vdb。
接着创建物理卷。
#pvcreate /dev/vdb
Physical volume "/dev/vdb"successfully created
接着对卷组os进行括容。
#vgextend os /dev/vdb
Volume group "os" successfullyextended
接着对逻辑卷varlibdocker括容。
#lvextend --extent +100%FREE /dev/os/varlibdocker
Size of logical volume os/varlibdockerchanged from 27.69 GiB (886 extents) to 127.75 GiB (4088 extents).
Logical volume varlibdocker successfullyresized
注意是+100%不是100%。
最后对文件系统括容。
#resize2fs /dev/os/varlibdocker
resize2fs1.41.12 (17-May-2010)
Filesystemat /dev/os/varlibdocker is mounted on /var/lib/docker; on-line resizingrequired
olddesc_blocks = 2, new_desc_blocks = 8
Performingan on-line resize of /dev/os/varlibdocker to 33488896 (4k) blocks.
Thefilesystem on /dev/os/varlibdocker is now 33488896 blocks long.
Fuel的问题
Web界面删除OpenStack环境长时间无响应的处理
如果有节点掉线,或者有的节点正在安装操作系统,终止部署和删除环境都可能等待很长时间无法完成。
在这种情况下,可以通过登录fuel master的ssh,使用fuel后台命令强制删除节点和环境。
用fuel task列出所有任务,示例输出如下:
[root@fuelmaster ~]# fuel task
id | status | name | cluster | progress| uuid
---|---------|------------|---------|----------|-------------------------------------
46 | ready | provision | 1 | 100 | 57427dff-ec6e-4219-a1e8-c8ccb490f3a3
47 | running | deployment | 1 | 50 | 19cbf0d7-8e9b-4366-af86-9f45558611e4
43 | running | deploy | 1 | 64 |66de25c6-be12-40c9-8bde-1695aa004c06
如果是删除环境没有完成,会看到一个处于running状态的删除环境的任务。强制删除没有完成的任务。
fuel task --delete --force --task XX
其中XX是刚才列出来的task的编号。
用fuel env命令列出所有的环境:
[root@fuelmaster ~]# fuel env
id | status | name | mode | release_id | changes |pending_release_id
---|------------|------|------------|------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------
1 |deployment | test | ha_compact | 1 | [{u'node_id': None, u'name': u'attributes'}, {u'node_id': None,u'name': u'networks'}, {u'node_id': 1, u'name': u'disks'}, {u'node_id': 2,u'name': u'disks'}] | None
重置这个环境:
fuel reset --env X
其中X是这个环境的id。
接着就需要手动重启所有这个环境里的物理机。物理机重启成功后,会进入bootstrap系统,然后抹除当前系统里的磁盘数据,再重启。
使用fuel task命令可以观察到出现一个新的reset任务。这个任务完成后,等待所有物理机进入bootstrap系统。用fuel node命令应该能看到这些节点处于discover状态。
这时就可以在界面上正常删除OpenStack环境了。
如果仍然有问题,使用下面的命令强制删除node,然后重启物理机,重新发现。
fuel node --node-id X1,X2,X3--delete-from-db
其中X1、X2、X3是用fuel node命令看到的node编号。
修改数据库中承载网的VLAN ID
进入fuel master的postgresql的命令行。
dockerctl shell postgres sudo -u postgrespsql -d nailgun
运行下面的sql命令
select * from network_groups;
示例输出
nailgun=#select * from network_groups;
id | name | release | vlan_start| cidr | gateway |
meta | group_id
----+---------------+---------+------------+------------------+-----------------+---------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------+----------
1 | fuelweb_admin | | | 10.20.0.0/24 | | {"notation": "ip_ranges", "render_type":null, "assign_vip": false,
"configurable":false, "unmovable": true, "use_gateway": true,"render_addr_mask": null, "map_priority": 0}
|
2 | public | 1 | | 192.168.247.0/24| 192.168.247.254 | {"name": "public","notation": "ip_ranges", "render_type": null,"as
sign_vip":true, "map_priority": 1, "floating_range_var":"floating_ranges", "use_gateway": true, "vlan_start":null, "render_addr_mask": "public", "c
idr":"172.16.0.0/24", "configurable": true,"ip_range": ["172.16.0.2", "172.16.0.126"]}| 1
3 | management | 1 | 1001 |192.168.0.0/24 | | {"name":"management", "notation": "cidr","render_type": "cidr", "a
ssign_vip":true, "map_priority": 2, "use_gateway": false,"vlan_start": null, "render_addr_mask":"internal", "cidr": "192.168.0.0/24","configurable
":true} | 1
4 | storage | 1 | 1002 |192.168.1.0/24 | | {"name":"storage", "notation": "cidr","render_type": "cidr", "assi
gn_vip":false, "map_priority": 2, "use_gateway": false,"vlan_start": null, "render_addr_mask":"storage", "cidr": "192.168.1.0/24","configurable":
true} | 1
5 | private | 1 | | | | {"name": "private","notation": null, "render_type": null, "assign_v
ip":false, "map_priority": 2, "use_gateway": false,"vlan_start": null, "render_addr_mask": null,"neutron_vlan_range": true, "configurable": false,
"seg_type":"vlan"} | 1
(5rows)
譬如要修改存储网的VLAN ID,在上面的输出中,存储网的数据库ID是4,那么执行下面的语句。
updatenetwork_groups set vlan_start=1003 where id=4;
示例输出
nailgun=#update network_groups set vlan_start=1003 where id=4;
UPDATE1
这时候再刷新Web界面,看到存储网的ID已经变了。
P2V过程异常类
windows迁移后起虚拟机蓝屏
处理过程:先保证你的第一块盘,也就是系统盘是IDE,然后开机,安装RHEV-toolsetup;然后关机;这时候你要将你的网卡改成virtro,然后最重要的是你要额外填加一块virtro的硬盘,然后开机,这时候系统会发现新硬件并安装相应的驱动;之后关机,删除第二块硬盘,并将系统盘改成virtro,然后开机
问题原因分析:系统虽然安装了virtro硬盘驱动,但是如果没有相应硬盘,windows就没有办法发现硬件并安装驱动。
让已部署的节点临时进入Bootstrap模式
有时希望测试已部署的节点的硬件,比如测试网卡性能,而已部署的节点大都建了bond、网桥、服务网络,要拆除这些设备然后测网卡会比较麻烦。
一个简单的方法是重启机器并进入Bootstrap模式。主要的问题是,重启机器后PXE收到的菜单里只有本地磁盘启动,并且菜单超时时间为0,没有机会选择进入Bootstrap。
可以从Cobbler的后台修改菜单,实现进入Bootstrap。首先记录目标机器的PXE网卡的MAC地址,然后进入cobbler容器,并执行下面的操作。
dockerctl shell cobbler
cd /var/lib/tftpboot/pxelinux.cfg/
备份现在的菜单,假设目标机器的PXE网卡的MAC地址是01:0c:c4:7a:18:93:74
mv 01-0c-c4-7a-18-93-74 01-0c-c4-7a-18-93-74.bk
cp default 01-0c-c4-7a-18-93-74 # 用Bootstrap菜单覆盖现在的菜单
接着,重启目标机器,自然就进入Bootstrap系统了。要回到原来的系统,就再次进入cobbler容器,还原刚才备份的01-0c-c4-7a-18-93-74.bk文件即可。
注意,有时目标机器不是从eth0启动的,或者启动的网卡的顺序不固定,如果发现不能进入Bootstrap系统,可以找到其他几块网卡对的MAC地址对应的菜单文件,用Bootstrap菜单覆盖掉即可。