多socket与多核心之间的考量
mac 无法安装来历不明的文件
朋友从微信给我发送了一个软件,到苹果上就是不让安装: 10.12版本的mac上不让信任任意开发者了:
解决办法:
通过cat命令变成一个新的文件,就能正常安装了
openstack kvm 磁盘限速
设置:
读写最大10MB/s,iops最大50/s
- 设置flavor, 在flavor上添加属性
1 |
# openstack flavor set m1.medium --property quota:disk_read_bytes_sec=10240000 --property quota:disk_write_bytes_sec=10240000 |
1 |
#openstack flavor set m1.medium --property quota:disk_write_iops_sec=50 --property quota:disk_read_iops_sec=50 |
- 通过virsh dumpxml验证:
1 |
virsh dumpxml instance-00000058 |
- 验证
关于对卷的限速: http://ceph.com/planet/openstack-ceph-rbd-and-qos/
The disk I/O options are:
disk_read_bytes_sec
disk_read_iops_sec
disk_write_bytes_sec
disk_write_iops_sec
disk_total_bytes_sec
disk_total_iops_sec
参考: https://docs.openstack.org/nova/pike/admin/flavors.html
对于单独创建的卷来讲,可以在创建卷时指定卷类型,而卷类型可以预先关联已定义好的qos规格的,如:
注意:
- 对于创建虚拟机时使用新建卷的情况,该限速没有被应用,应该是bug吧
- 官方文档的一点儿要问题
- openstack的dashboard上也有一些误导的地方:
这里的提示仅仅可以当做是示例,真正需要什么就写什么就行了,如,关于磁盘限速的相关键为:read_bytes_sec
read_iops_sec
write_bytes_sec
write_iops_sec
total_bytes_sec
total_iops_sec
注意: 这里不需要上面所谓的 disk_ 前缀
cephfs
- 一个cephfs可以add多个data pool,下面以单独的名为cephfs_data 的data pool为例说明
- 每个文件系统中的文件都在cephfs_data 这个pool中产生前缀相同的多个object,如:
产生3个rados object
三个对象分别在不同的pg、不同的osd上:
- 文件删除后,rados object会不立即消失,至少是一个异步的过程,可能几秒后才被删除
ceph 架构
关于osd的主从复制:
说明:
- 如此架构,写入性能取决于三个osd中最慢的osd的性能,似乎有些不妥;不过,每个osd都在同时担任多种角色,就不应该允许有问题的osd提供服务;另外,有工具可以发现那个osd响应慢
在一共4台机器,13个osd的情况下,某osd已经和其它osd创建了60个连接了:
ceph 之 cephfs认证权限问题
题记:
尽信书则不如无书
按照书上说的配置完cephfs后,无法mount成功,ceph-fuse的错误信息为:
1 |
handle_connect_reply connect got BADAUTHORIZER |
mds 日志错误信息为:
1 |
mds.client.cephfs ms_verify_authorizer: cannot decode auth caps bl of length 0 |
从代码来看,就是caps给的不够。
书上关于caps的命令为:
1 |
#ceph auth get-or-create client.cephfs mon 'allow r' osd 'allow rwx pool=cephfs_metadata, allow rwx pool=cephfs_data' |
实际上,还需要添加关于mds的授权,如果对mds之授权r, 则可以挂载,但是不可写;所以正常情况下,需要添加对mds的rw,更新授权信息如下:
1 |
# ceph auth caps client.cephfs mds 'allow rw' mon 'allow r' osd 'allow rwx pool=cephfs_metadata,allow rwx pool=cephfs_data' |
如果我们只想让client.cephfs 访问 /data 目录,则可以添加更新授权信息如下:
1 |
# ceph auth caps client.cephfs mds 'allow r, allow rw path=/data' mon 'allow r' osd 'allow rwx pool=cephfs_metadata,allow rwx pool=cephfs_data' |
注意: 这里似乎并未指定是哪个fs,如何区分不同的fs呢?
关于限制用户访问指定目录的问题,有更加方便的做法: http://docs.ceph.com/docs/master/cephfs/client-auth/)
eg:
其实,该操作也是反映在ceph auth里面的,如下:
如此来看,具体是哪个cephfs,其实不是本质的东西,本质上还是对pool的授权
另外:ceph fs authorize 命令目前似乎不能操作现有用户(不能修改、也不能删除),该命令只能添加新用户;需要修改删除啥的还是要使用ceph auth的
下面使用client.phpor 尝试挂载,验证权限是否生效:
权限设置生效
结论:
- 别忘了cephfs对mds添加授权
- 修改完caps后,需要重新mount才生效
关于授权这部分,官方文档似乎并未提及
参考:http://www.yangguanjun.com/2017/07/01/cephfs-client-authentication/
openstack with ceph
前言
openstack是个很不错的东西,结合ceph之后,openstack就如同插上了翅膀,更加强大了。
ceph的好处:
- 有了ceph这个共享存储,guest的热迁移就方便多了
- ceph提供的块儿存储支持snap和clone,是的创建虚机和快照都不用copy磁盘,使得创建虚机可以秒级完成,而且非常节省存储
我遇到的问题:
- 在我将openstack和ceph结合起来之后,创建虚机依然很慢,并没有达到创建虚机不复制磁盘的效果
解决办法:
- 调试虚拟创建过程,发现如果要利用上rbd的snap和clone的特性,需要在image上有location属性;然而,我创建的image并没有该属性,openstack image命令行没有location相关选项,dashboard上创建镜像也没有该属性,只有glance命令行允许指定或单独添加该属性,却又报location invisible的错误;临时解决办法:直接修改代码,在代码中添加:
- 关于glance设置location失败的问题,根据关键字去glance代码中查看代码,发现当配置文件中的show_multiple_locations = false时,是不允许操作location的:
然后,去glance-api的机器上grep show_multiple_locations ,并修改为True,重启glance-api 服务;然后再尝试location-add,提示url已存在,其实,该信息本来是存在的,只是显示与否的问题,现在不需要做任何操作,已经可以从image的信息中看到url了,如下:
参考配置文件 /etc/glance/glance-api.conf 得知,show_multiple_locations = True使得image的地址直接暴露给了client,client就可以直接操作image了,可能存在一定的安全问题;当我们认为这不是问题的时候,我们就可以修改该配置,现在,我正是想利用rbd的一些特性,就需要将给选项设置为True;
- 至此,纠结已经的问题正式告一段落
总结:
- 按照手册安装openstack没有太大意义,能发现问题并解决问题才能进步;在解决该问题的过程中,尝试了python的单步调试(效果很差)、从代码上了解了虚拟机创建的过程,也了解了一些glance的代码,受益匪浅
ceph -s 与 dashboard
rbd nbd
rbd vs rbd-nbd
两者功能一样,效果也没啥差别,只是实现方式有所不同; 前者使用内核的rbd模块访问ceph存储,当ceph较新(内核较旧)时,可能会有一些image的feature内核不支持,就不能map;后者使用librbd来访问ceph存储,基本不会存在feature不支持的情况,但是需要nbd内核模块(关于nbd内核模块的担心似乎也多余,nbd早就进入内核了,就算没有加载,rbd-nbd也会帮你加载的)。
同一个rbd image可以同时在一台服务器上map多次;但是只能mount一次,因为多次挂载后设备的uuid是同一个,文件系统不允许同时挂载两个相同uuid的设备的
同一个rbd image可以同时挂载到多个服务器上; (rbd的 –shared –image-shared 选项可以控制是否允许重复挂载)
–shared 允许给镜像加锁,避免写坏,实现特定条件下的共享
–image-shared 允许定义是否可以共享
也就是说,ceph的image是可以作为共享存储使用的(但是最好别这么做,没有任何机制保证并发写不会出问题)。
注意:
- 即使在两个不同的mnt名字空间,也不能同时分别mount同一个设备,依然有uuid冲突的问题
- 即使分别在不同的mnt名字空间执行rbd map,设备的uuid也都是一样的
- 即使在不同的服务器上执行rbd map,设备的uuid也都是一样的
创建新的名字空间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#define _GNU_SOURCE #include <sched.h> #include <stdio.h> #include <stdlib.h> #include <sys/wait.h> #include <unistd.h> static char child_stack[1048576]; static int child_fn() { printf("PID: %ld\n", (long)getpid()); sleep(100000); return 0; } int main(int ac, char** av) { int ch; int flag = SIGCHLD; while((ch = getopt(ac, av, "pmnuU")) != -1) { switch(ch) { case 'p': flag |= CLONE_NEWPID;break; case 'm': flag |= CLONE_NEWNS;break; case 'n': flag |= CLONE_NEWNET;break; case 'u': flag |= CLONE_NEWUTS;break; case 'U': flag |= CLONE_NEWUSER;break; } } pid_t child_pid = clone(child_fn, child_stack+1048576, flag, NULL); printf("clone() = %ld\n", (long)child_pid); waitpid(child_pid, NULL, 0); return 0; } |
功能: 创建新的名字空间,并使得进程处于sleep状态,可以随时nsenter进来
测试 mnt 时发现,似乎并没有实现mount的隔离; 测试方法:
./new-namespace -m &
然后使用nsenter,分别在名字空间内外查看 /proc/self/mountinfo 的内容,发现如何操作,内外都是一致的。
注意: 需要和pid名字空间一起使用:
1 2 |
./new-namespace -m -p & nsenter -m -p -t $pid |
参考: https://www.toptal.com/linux/separation-anxiety-isolating-your-system-with-linux-namespaces