• 关于

    随机网络错误如何解决

    的搜索结果

问题

Logtail 如何快速诊断问题?

轩墨 2019-12-01 22:04:04 1111 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 Q: ossfs适合什么样的程序? ossfs能把oss bucket挂载到本地,如果您使用的软件没有支持OSS,但您又想让数据能自动同步到OSS,那么ossfs是很好的选择。 Q: ossfs有什么局限性? 由于数据需要经过网络同步到云端,ossfs在性能和功能上可能与本地文件系统有差距。如果您想让数据库等对io要求很高的应用跑在ossfs挂载的盘上,请慎重考虑。和本地文件系统具体差异: 随机或者追加写文件会导致整个文件的重写。 元数据操作,例如list directory,性能较差,因为需要远程访问OSS服务器。 文件/文件夹的rename操作不是原子的。 多个客户端挂载同一个oss bucket时,依赖用户自行协调各个客户端的行为。例如避免多个客户端写同一个文件等等。 不支持hard link。 Q: ossfs一定要阿里云的机器才能用么? ossfs不限制一定要阿里云的内网才可以使用,外网机器依然可以使用。 Q: ossfs能不能同时挂载多个OSS bucket? 可以的,在passwd-ossfs文件中写入多个OSS配置信息即可。支持不同帐号的OSS。 Q: 我在yum/apt-get安装ossfs,遇到conflicts with file from package fuse-devel的错误,请问是怎么回事? 您的系统中存在老版本的fuse,请先使用相关的包管理器卸载,再重新安装ossfs。 Q: ossfs工作不正常,如何debug? 您可以使用在挂载时,加上-d -o f2参数,ossfs会把日志写入到系统日志中。在centos系统中,在/var/log/messages中。 您也可以在挂载时使用-f -d -o f2参数,ossfs会把日志输出到屏幕上。 Q: 为什么我在mount时遇到 ossfs: unable to access MOUNTPOINT /tmp/ossfs: Transport endpoint is not connected这样的错误? 请先umount对应的目录。 请检查您在使用ossfs挂载时,填入的url参数是否正确,是否和bucket/access key id/access key secret匹配。 特别注意:url中不包含bucket的名字。例如:您在oss控制台中看到bucket的域名是这样的:ossfs-test-1.oss-cn-hangzhou.aliyuncs.com。那么填入的url则是:http://oss-cn-hangzhou.aliyuncs.com。 Q: ossfs提示ossfs: unable to access MOUNTPOINT /tmp/odat: No such file or directory 这是您未创建该目录导致的,在挂载前需要创建对应目录。 Q: 我把bucket挂载到本地后,ls目录,却收到operation not permitted错误,这是为什么? 请检查您的bucket中,是否包含目录名含有不可见字符的OSS object。文件系统对文件/目录名有更严格的限制,因此会收到上述错误。使用其他工具对这些object重命名后,ls就能正确显示目录内容了。 Q: 我的一个目录下有非常多的文件,为什么ls该目录很慢? 假设一个目录下有n个文件,那么ls该目录至少需要n次OSS http requests。在文件非常多的时候,这可能造成严重的性能问题。 您可以采用下面两个办法优化: 通过-omax_stat_cache_size=xxx参数增大stat cache的size,这样第一次ls会较慢,但是后续的ls就快了,因为文件的元数据都在本地cache中。默认这个值是1000,大约消耗4MB内存,请根据您机器内存大小调整为合适的值。 使用ls -f命令,这个命令会消除与OSS的n次http请求。 具体参见issue 13。 Q: ossfs挂载时如何设置权限? 如果要允许其他用户访问挂载文件夹,可以在运行ossfs的时候指定allow_other参数: ossfs your_bucket your_mount_point -ourl=your_endpoint -o allow_other 为什么使用allow_other参数,仍然不能访问文件? 注意:allow_other是赋予挂载目录其他用户访问的权限,不是里面的文件!如果您要更改文件夹中的文件,请用chmod命令。 allow_other默认赋予挂载目录777权限,我想让挂载目录的权限为770,该怎么办? 可以通过umask来设置,参见这里。 Q: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user: 方法一: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user,则需要以user的身份创建挂载文件夹和使用ossfs: sudo -u user mkdir /tmp/ossfs sudo -u user ossfs bucket-name /tmp/ossfs 方法二: 首先通过id命令获得指定用户的uid/gid信息。例如获取www用户的uid/gid信息:id www;然后挂载时指定uid/gid参数: ossfs your_bucket your_mountpoint -ourl=your_url -ouid=your_uid -ogid=your_gid 注意:uid/gid都是数字。 Q: 我不是root用户,如何umount ossfs挂载的目录 fusermount -u your_mountpoint Q: 如何开机自动挂载ossfs? Step 1 首先请参考使用说明,把bucket name,access key id/secret等信息写入/etc/passwd-ossfs,并将该文件权限修改为640。 echo your_bucket_name:your_access_key_id:your_access_key_secret > /etc/passwd-ossfs chmod 640 /etc/passwd-ossfs Step 2 接下来针对不同的系统版本,设置方式有所不同 Step 2A 通过fstab的方式自动mount(适用于ubuntu14.04, centos6.5) 在/etc/fstab中加入下面的命令 ossfs#your_bucket_name your_mount_point fuse _netdev,url=your_url,allow_other 0 0 其中上述命令中的your_xxx信息需要根据您的bucket name等信息填入。 保存/etc/fstab文件。执行mount -a命令,如果没有报错,则说明设置正常。 到这一步,ubuntu14.04就能自动挂载了。centos6.5还需要执行下面的命令: chkconfig netfs on Step 2B 通过开机自启动脚本mount(适用于centos7.0及以上的系统) 在/etc/init.d/目录下建立文件ossfs,把模板文件中的内容拷贝到这个新文件中。并将其中的your_xxx内容改成您自己的信息。 执行命令:chmod a+x /etc/init.d/ossfs 上述命令是把新建立的ossfs脚本赋予可执行权限。您可以执行该脚本,如果脚本文件内容无误,那么此时oss中的bucket已经挂载到您指定的目录下了。 执行命令:chkconfig ossfs on 上述命令是把ossfs启动脚本作为其他服务,开机自动启动。 好了,现在ossfs就可以开机自动挂载了。总结起来,如果您是ubuntu14.04和centos6.5,您需要执行Step 1 + Step 2A;如果您是centos7.0系统,您需要执行Step 1 + Step 2B。 Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令 Q: 我需要以www用户挂载ossfs,此时如何设置开机自动挂载? 参照上面的问题的解答,Step 1照做,对Step 2B稍加修改,修改/etc/init.d/ossfs中的命令为: sudo -u www ossfs your_bucket your_mountpoint -ourl=your_url 设置自启动脚本中允许使用sudo,编辑/etc/sudoers,将其中的Defaults requiretty这行改为#Defaults requiretty(注释掉) Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令。 Q: 使用ECS挂载ossfs,如何避免因后台程序扫描文件而产生费用? 程序扫描ossfs挂载的目录,会转换成向OSS的请求,如果请求次数很多,会产生费用(1分钱/1万次)。如果是updatedb,可以通过修改/etc/updatedb.conf让它跳过。具体做法是: 在PRUNEFS =后面加上fuse.ossfs 在PRUNEPATHS =后面加上挂载的目录 如何确定是哪个进程扫了我的目录? 首先安装auditd: sudo apt-get install auditd 启动auditd: sudo service auditd start 设置监视挂载目录: auditctl -w /mnt/ossfs 在auditlog中可以查看是哪些进程访问了这个目录:ausearch -i | grep /mnt/ossfs Q: 使用ossfs上传到OSS的文件Content-Type全是”application/octet-stream”是怎么回事? ossfs通过查询/etc/mime.types中的内容来确定文件的Content-Type,请检查这个文件是否存在,如果不存在,则需要添加: 对于ubuntu可以通过sudo apt-get install mime-support来添加 对于centos可以通过sudo yum install mailcap来添加 也可以手动添加,每种格式一行,每行格式为:application/javascript js Q: 如何使用supervisor启动ossfs? 安装supervisor,在ubuntu中执行sudo apt-get install supervisor 建立一个目录,编辑ossfs的启动脚本:mkdir /root/ossfs_scripts vi /root/ossfs_scripts/start_ossfs.sh写入如下数据:# 卸载 fusermount -u /mnt/ossfs # 重新挂载,必须要增加-f参数运行ossfs,让ossfs在前台运行 exec ossfs my-bucket my-mount-point -ourl=my-oss-endpoint -f 编辑/etc/supervisor/supervisord.conf,在最后加入下面一段:[program:ossfs] command=bash /root/ossfs_scripts/start_ossfs.sh logfile=/var/log/ossfs.log log_stdout=true log_stderr=true logfile_maxbytes=1MB logfile_backups=10 运行supervisor:supervisordsupervisord 确认一切正常:ps aux | grep supervisor # 应该能看到supervisor进程 ps aux | grep ossfs # 应该能看到ossfs进程 kill -9 ossfs # 杀掉ossfs进程,supervisor应该会重启它, 不要使用killall, 因为killall发送SIGTERM,进程正常退出,supervisor不再去重新运行ossfs ps aux | grep ossfs # 应该能看到ossfs进程如果出错,请检查/var/log/supervisor/supervisord.log和/var/log/ossfs.log。 Q: 遇到”fuse: warning: library too old, some operations may not work”怎么办? 出现的原因是:ossfs编译时所使用的libfuse版本 比运行时链接到的libfuse版本高。这往往是用户自行安装了libfuse导致的。使用我们提供的rpm包安装ossfs,无需再安装libfuse。 在CentOS-5.x和CentOS-6.x上我们提供的rpm包里包含了libfuse-2.8.4,如果在运行的时候环境中有libfuse-2.8.3,并且ossfs被链接到了旧版本的fuse上,就会出现上述warning。 如何确认ossfs运行时链接的fuse版本? 运行ldd $(which ossfs) | grep fuse 例如结果是”/lib64/libfuse.so.2”,那么通过ls -l /lib64/libfuse*可以看到fuse的版本 如何让ossfs链接到正确的版本? 首先通过rpm -ql ossfs | grep fuse找到libfuse的目录 例如结果是”/usr/lib/libfuse.so.2”,则通过LD_LIBRARY_PATH=/usr/lib ossfs …运行ossfs 我能忽略这个WARNING吗? 最好不要,见这个bug Q: 为什么用ossfs看到的文件信息(例如大小)与其他工具看到的不一致? 因为ossfs默认会缓存文件的元信息(包括大小/权限等),这样就不需要每次ls的时候向OSS发送请求,加快速度。 如果用户通过其他程序(例如SDK/官网控制台/osscmd等)对文件进行了修改,那么有可能在ossfs中看到的文件信息 没有及时更新。 如果想禁止ossfs的缓存,那么可以在挂载的时候加上如下参数:-omax_stat_cache_size=0

2019-12-01 23:15:17 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 Q: ossfs适合什么样的程序? ossfs能把oss bucket挂载到本地,如果您使用的软件没有支持OSS,但您又想让数据能自动同步到OSS,那么ossfs是很好的选择。 Q: ossfs有什么局限性? 由于数据需要经过网络同步到云端,ossfs在性能和功能上可能与本地文件系统有差距。如果您想让数据库等对io要求很高的应用跑在ossfs挂载的盘上,请慎重考虑。和本地文件系统具体差异: 随机或者追加写文件会导致整个文件的重写。 元数据操作,例如list directory,性能较差,因为需要远程访问OSS服务器。 文件/文件夹的rename操作不是原子的。 多个客户端挂载同一个oss bucket时,依赖用户自行协调各个客户端的行为。例如避免多个客户端写同一个文件等等。 不支持hard link。 Q: ossfs一定要阿里云的机器才能用么? ossfs不限制一定要阿里云的内网才可以使用,外网机器依然可以使用。 Q: ossfs能不能同时挂载多个OSS bucket? 可以的,在passwd-ossfs文件中写入多个OSS配置信息即可。支持不同帐号的OSS。 Q: 我在yum/apt-get安装ossfs,遇到conflicts with file from package fuse-devel的错误,请问是怎么回事? 您的系统中存在老版本的fuse,请先使用相关的包管理器卸载,再重新安装ossfs。 Q: ossfs工作不正常,如何debug? 您可以使用在挂载时,加上-d -o f2参数,ossfs会把日志写入到系统日志中。在centos系统中,在/var/log/messages中。 您也可以在挂载时使用-f -d -o f2参数,ossfs会把日志输出到屏幕上。 Q: 为什么我在mount时遇到 ossfs: unable to access MOUNTPOINT /tmp/ossfs: Transport endpoint is not connected这样的错误? 请先umount对应的目录。 请检查您在使用ossfs挂载时,填入的url参数是否正确,是否和bucket/access key id/access key secret匹配。 特别注意:url中不包含bucket的名字。例如:您在oss控制台中看到bucket的域名是这样的:ossfs-test-1.oss-cn-hangzhou.aliyuncs.com。那么填入的url则是:http://oss-cn-hangzhou.aliyuncs.com。 Q: ossfs提示ossfs: unable to access MOUNTPOINT /tmp/odat: No such file or directory 这是您未创建该目录导致的,在挂载前需要创建对应目录。 Q: 我把bucket挂载到本地后,ls目录,却收到operation not permitted错误,这是为什么? 请检查您的bucket中,是否包含目录名含有不可见字符的OSS object。文件系统对文件/目录名有更严格的限制,因此会收到上述错误。使用其他工具对这些object重命名后,ls就能正确显示目录内容了。 Q: 我的一个目录下有非常多的文件,为什么ls该目录很慢? 假设一个目录下有n个文件,那么ls该目录至少需要n次OSS http requests。在文件非常多的时候,这可能造成严重的性能问题。 您可以采用下面两个办法优化: 通过-omax_stat_cache_size=xxx参数增大stat cache的size,这样第一次ls会较慢,但是后续的ls就快了,因为文件的元数据都在本地cache中。默认这个值是1000,大约消耗4MB内存,请根据您机器内存大小调整为合适的值。 使用ls -f命令,这个命令会消除与OSS的n次http请求。 具体参见issue 13。 Q: ossfs挂载时如何设置权限? 如果要允许其他用户访问挂载文件夹,可以在运行ossfs的时候指定allow_other参数: ossfs your_bucket your_mount_point -ourl=your_endpoint -o allow_other 为什么使用allow_other参数,仍然不能访问文件? 注意:allow_other是赋予挂载目录其他用户访问的权限,不是里面的文件!如果您要更改文件夹中的文件,请用chmod命令。 allow_other默认赋予挂载目录777权限,我想让挂载目录的权限为770,该怎么办? 可以通过umask来设置,参见这里。 Q: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user: 方法一: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user,则需要以user的身份创建挂载文件夹和使用ossfs: sudo -u user mkdir /tmp/ossfs sudo -u user ossfs bucket-name /tmp/ossfs 方法二: 首先通过id命令获得指定用户的uid/gid信息。例如获取www用户的uid/gid信息:id www;然后挂载时指定uid/gid参数: ossfs your_bucket your_mountpoint -ourl=your_url -ouid=your_uid -ogid=your_gid 注意:uid/gid都是数字。 Q: 我不是root用户,如何umount ossfs挂载的目录 fusermount -u your_mountpoint Q: 如何开机自动挂载ossfs? Step 1 首先请参考使用说明,把bucket name,access key id/secret等信息写入/etc/passwd-ossfs,并将该文件权限修改为640。 echo your_bucket_name:your_access_key_id:your_access_key_secret > /etc/passwd-ossfs chmod 640 /etc/passwd-ossfs Step 2 接下来针对不同的系统版本,设置方式有所不同 Step 2A 通过fstab的方式自动mount(适用于ubuntu14.04, centos6.5) 在/etc/fstab中加入下面的命令 ossfs#your_bucket_name your_mount_point fuse _netdev,url=your_url,allow_other 0 0 其中上述命令中的your_xxx信息需要根据您的bucket name等信息填入。 保存/etc/fstab文件。执行mount -a命令,如果没有报错,则说明设置正常。 到这一步,ubuntu14.04就能自动挂载了。centos6.5还需要执行下面的命令: chkconfig netfs on Step 2B 通过开机自启动脚本mount(适用于centos7.0及以上的系统) 在/etc/init.d/目录下建立文件ossfs,把模板文件中的内容拷贝到这个新文件中。并将其中的your_xxx内容改成您自己的信息。 执行命令:chmod a+x /etc/init.d/ossfs 上述命令是把新建立的ossfs脚本赋予可执行权限。您可以执行该脚本,如果脚本文件内容无误,那么此时oss中的bucket已经挂载到您指定的目录下了。 执行命令:chkconfig ossfs on 上述命令是把ossfs启动脚本作为其他服务,开机自动启动。 好了,现在ossfs就可以开机自动挂载了。总结起来,如果您是ubuntu14.04和centos6.5,您需要执行Step 1 + Step 2A;如果您是centos7.0系统,您需要执行Step 1 + Step 2B。 Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令 Q: 我需要以www用户挂载ossfs,此时如何设置开机自动挂载? 参照上面的问题的解答,Step 1照做,对Step 2B稍加修改,修改/etc/init.d/ossfs中的命令为: sudo -u www ossfs your_bucket your_mountpoint -ourl=your_url 设置自启动脚本中允许使用sudo,编辑/etc/sudoers,将其中的Defaults requiretty这行改为#Defaults requiretty(注释掉) Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令。 Q: 使用ECS挂载ossfs,如何避免因后台程序扫描文件而产生费用? 程序扫描ossfs挂载的目录,会转换成向OSS的请求,如果请求次数很多,会产生费用(1分钱/1万次)。如果是updatedb,可以通过修改/etc/updatedb.conf让它跳过。具体做法是: 在PRUNEFS =后面加上fuse.ossfs 在PRUNEPATHS =后面加上挂载的目录 如何确定是哪个进程扫了我的目录? 首先安装auditd: sudo apt-get install auditd 启动auditd: sudo service auditd start 设置监视挂载目录: auditctl -w /mnt/ossfs 在auditlog中可以查看是哪些进程访问了这个目录:ausearch -i | grep /mnt/ossfs Q: 使用ossfs上传到OSS的文件Content-Type全是”application/octet-stream”是怎么回事? ossfs通过查询/etc/mime.types中的内容来确定文件的Content-Type,请检查这个文件是否存在,如果不存在,则需要添加: 对于ubuntu可以通过sudo apt-get install mime-support来添加 对于centos可以通过sudo yum install mailcap来添加 也可以手动添加,每种格式一行,每行格式为:application/javascript js Q: 如何使用supervisor启动ossfs? 安装supervisor,在ubuntu中执行sudo apt-get install supervisor 建立一个目录,编辑ossfs的启动脚本:mkdir /root/ossfs_scripts vi /root/ossfs_scripts/start_ossfs.sh写入如下数据:# 卸载 fusermount -u /mnt/ossfs # 重新挂载,必须要增加-f参数运行ossfs,让ossfs在前台运行 exec ossfs my-bucket my-mount-point -ourl=my-oss-endpoint -f 编辑/etc/supervisor/supervisord.conf,在最后加入下面一段:[program:ossfs] command=bash /root/ossfs_scripts/start_ossfs.sh logfile=/var/log/ossfs.log log_stdout=true log_stderr=true logfile_maxbytes=1MB logfile_backups=10 运行supervisor:supervisordsupervisord 确认一切正常:ps aux | grep supervisor # 应该能看到supervisor进程 ps aux | grep ossfs # 应该能看到ossfs进程 kill -9 ossfs # 杀掉ossfs进程,supervisor应该会重启它, 不要使用killall, 因为killall发送SIGTERM,进程正常退出,supervisor不再去重新运行ossfs ps aux | grep ossfs # 应该能看到ossfs进程如果出错,请检查/var/log/supervisor/supervisord.log和/var/log/ossfs.log。 Q: 遇到”fuse: warning: library too old, some operations may not work”怎么办? 出现的原因是:ossfs编译时所使用的libfuse版本 比运行时链接到的libfuse版本高。这往往是用户自行安装了libfuse导致的。使用我们提供的rpm包安装ossfs,无需再安装libfuse。 在CentOS-5.x和CentOS-6.x上我们提供的rpm包里包含了libfuse-2.8.4,如果在运行的时候环境中有libfuse-2.8.3,并且ossfs被链接到了旧版本的fuse上,就会出现上述warning。 如何确认ossfs运行时链接的fuse版本? 运行ldd $(which ossfs) | grep fuse 例如结果是”/lib64/libfuse.so.2”,那么通过ls -l /lib64/libfuse*可以看到fuse的版本 如何让ossfs链接到正确的版本? 首先通过rpm -ql ossfs | grep fuse找到libfuse的目录 例如结果是”/usr/lib/libfuse.so.2”,则通过LD_LIBRARY_PATH=/usr/lib ossfs …运行ossfs 我能忽略这个WARNING吗? 最好不要,见这个bug Q: 为什么用ossfs看到的文件信息(例如大小)与其他工具看到的不一致? 因为ossfs默认会缓存文件的元信息(包括大小/权限等),这样就不需要每次ls的时候向OSS发送请求,加快速度。 如果用户通过其他程序(例如SDK/官网控制台/osscmd等)对文件进行了修改,那么有可能在ossfs中看到的文件信息 没有及时更新。 如果想禁止ossfs的缓存,那么可以在挂载的时候加上如下参数:-omax_stat_cache_size=0

2019-12-01 23:15:17 0 浏览量 回答数 0

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

回答

详细解答可以参考官方帮助文档 Q: ossfs适合什么样的程序? ossfs能把oss bucket挂载到本地,如果您使用的软件没有支持OSS,但您又想让数据能自动同步到OSS,那么ossfs是很好的选择。 Q: ossfs有什么局限性? 由于数据需要经过网络同步到云端,ossfs在性能和功能上可能与本地文件系统有差距。如果您想让数据库等对io要求很高的应用跑在ossfs挂载的盘上,请慎重考虑。和本地文件系统具体差异: 随机或者追加写文件会导致整个文件的重写。 元数据操作,例如list directory,性能较差,因为需要远程访问OSS服务器。 文件/文件夹的rename操作不是原子的。 多个客户端挂载同一个oss bucket时,依赖用户自行协调各个客户端的行为。例如避免多个客户端写同一个文件等等。 不支持hard link。 Q: ossfs一定要阿里云的机器才能用么? ossfs不限制一定要阿里云的内网才可以使用,外网机器依然可以使用。 Q: ossfs能不能同时挂载多个OSS bucket? 可以的,在passwd-ossfs文件中写入多个OSS配置信息即可。支持不同帐号的OSS。 Q: 我在yum/apt-get安装ossfs,遇到conflicts with file from package fuse-devel的错误,请问是怎么回事? 您的系统中存在老版本的fuse,请先使用相关的包管理器卸载,再重新安装ossfs。 Q: ossfs工作不正常,如何debug? 您可以使用在挂载时,加上-d -o f2参数,ossfs会把日志写入到系统日志中。在centos系统中,在/var/log/messages中。 您也可以在挂载时使用-f -d -o f2参数,ossfs会把日志输出到屏幕上。 Q: 为什么我在mount时遇到 ossfs: unable to access MOUNTPOINT /tmp/ossfs: Transport endpoint is not connected这样的错误? 请先umount对应的目录。 请检查您在使用ossfs挂载时,填入的url参数是否正确,是否和bucket/access key id/access key secret匹配。 特别注意:url中不包含bucket的名字。例如:您在oss控制台中看到bucket的域名是这样的:ossfs-test-1.oss-cn-hangzhou.aliyuncs.com。那么填入的url则是:http://oss-cn-hangzhou.aliyuncs.com。 Q: ossfs提示ossfs: unable to access MOUNTPOINT /tmp/odat: No such file or directory 这是您未创建该目录导致的,在挂载前需要创建对应目录。 Q: 我把bucket挂载到本地后,ls目录,却收到operation not permitted错误,这是为什么? 请检查您的bucket中,是否包含目录名含有不可见字符的OSS object。文件系统对文件/目录名有更严格的限制,因此会收到上述错误。使用其他工具对这些object重命名后,ls就能正确显示目录内容了。 Q: 我的一个目录下有非常多的文件,为什么ls该目录很慢? 假设一个目录下有n个文件,那么ls该目录至少需要n次OSS http requests。在文件非常多的时候,这可能造成严重的性能问题。 您可以采用下面两个办法优化: 通过-omax_stat_cache_size=xxx参数增大stat cache的size,这样第一次ls会较慢,但是后续的ls就快了,因为文件的元数据都在本地cache中。默认这个值是1000,大约消耗4MB内存,请根据您机器内存大小调整为合适的值。 使用ls -f命令,这个命令会消除与OSS的n次http请求。 具体参见issue 13。 Q: ossfs挂载时如何设置权限? 如果要允许其他用户访问挂载文件夹,可以在运行ossfs的时候指定allow_other参数: ossfs your_bucket your_mount_point -ourl=your_endpoint -o allow_other 为什么使用allow_other参数,仍然不能访问文件? 注意:allow_other是赋予挂载目录其他用户访问的权限,不是里面的文件!如果您要更改文件夹中的文件,请用chmod命令。 allow_other默认赋予挂载目录777权限,我想让挂载目录的权限为770,该怎么办? 可以通过umask来设置,参见这里。 Q: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user: 方法一: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user,则需要以user的身份创建挂载文件夹和使用ossfs: sudo -u user mkdir /tmp/ossfs sudo -u user ossfs bucket-name /tmp/ossfs 方法二: 首先通过id命令获得指定用户的uid/gid信息。例如获取www用户的uid/gid信息:id www;然后挂载时指定uid/gid参数: ossfs your_bucket your_mountpoint -ourl=your_url -ouid=your_uid -ogid=your_gid 注意:uid/gid都是数字。 Q: 我不是root用户,如何umount ossfs挂载的目录 fusermount -u your_mountpoint Q: 如何开机自动挂载ossfs? Step 1 首先请参考使用说明,把bucket name,access key id/secret等信息写入/etc/passwd-ossfs,并将该文件权限修改为640。 echo your_bucket_name:your_access_key_id:your_access_key_secret > /etc/passwd-ossfs chmod 640 /etc/passwd-ossfs Step 2 接下来针对不同的系统版本,设置方式有所不同 Step 2A 通过fstab的方式自动mount(适用于ubuntu14.04, centos6.5) 在/etc/fstab中加入下面的命令 ossfs#your_bucket_name your_mount_point fuse _netdev,url=your_url,allow_other 0 0 其中上述命令中的your_xxx信息需要根据您的bucket name等信息填入。 保存/etc/fstab文件。执行mount -a命令,如果没有报错,则说明设置正常。 到这一步,ubuntu14.04就能自动挂载了。centos6.5还需要执行下面的命令: chkconfig netfs on Step 2B 通过开机自启动脚本mount(适用于centos7.0及以上的系统) 在/etc/init.d/目录下建立文件ossfs,把模板文件中的内容拷贝到这个新文件中。并将其中的your_xxx内容改成您自己的信息。 执行命令:chmod a+x /etc/init.d/ossfs 上述命令是把新建立的ossfs脚本赋予可执行权限。您可以执行该脚本,如果脚本文件内容无误,那么此时oss中的bucket已经挂载到您指定的目录下了。 执行命令:chkconfig ossfs on 上述命令是把ossfs启动脚本作为其他服务,开机自动启动。 好了,现在ossfs就可以开机自动挂载了。总结起来,如果您是ubuntu14.04和centos6.5,您需要执行Step 1 + Step 2A;如果您是centos7.0系统,您需要执行Step 1 + Step 2B。 Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令 Q: 我需要以www用户挂载ossfs,此时如何设置开机自动挂载? 参照上面的问题的解答,Step 1照做,对Step 2B稍加修改,修改/etc/init.d/ossfs中的命令为: sudo -u www ossfs your_bucket your_mountpoint -ourl=your_url 设置自启动脚本中允许使用sudo,编辑/etc/sudoers,将其中的Defaults requiretty这行改为#Defaults requiretty(注释掉) Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令。 Q: 使用ECS挂载ossfs,如何避免因后台程序扫描文件而产生费用? 程序扫描ossfs挂载的目录,会转换成向OSS的请求,如果请求次数很多,会产生费用(1分钱/1万次)。如果是updatedb,可以通过修改/etc/updatedb.conf让它跳过。具体做法是: 在PRUNEFS =后面加上fuse.ossfs 在PRUNEPATHS =后面加上挂载的目录 如何确定是哪个进程扫了我的目录? 首先安装auditd: sudo apt-get install auditd 启动auditd: sudo service auditd start 设置监视挂载目录: auditctl -w /mnt/ossfs 在auditlog中可以查看是哪些进程访问了这个目录:ausearch -i | grep /mnt/ossfs Q: 使用ossfs上传到OSS的文件Content-Type全是”application/octet-stream”是怎么回事? ossfs通过查询/etc/mime.types中的内容来确定文件的Content-Type,请检查这个文件是否存在,如果不存在,则需要添加: 对于ubuntu可以通过sudo apt-get install mime-support来添加 对于centos可以通过sudo yum install mailcap来添加 也可以手动添加,每种格式一行,每行格式为:application/javascript js Q: 如何使用supervisor启动ossfs? 安装supervisor,在ubuntu中执行sudo apt-get install supervisor 建立一个目录,编辑ossfs的启动脚本:mkdir /root/ossfs_scripts vi /root/ossfs_scripts/start_ossfs.sh写入如下数据:# 卸载 fusermount -u /mnt/ossfs # 重新挂载,必须要增加-f参数运行ossfs,让ossfs在前台运行 exec ossfs my-bucket my-mount-point -ourl=my-oss-endpoint -f 编辑/etc/supervisor/supervisord.conf,在最后加入下面一段:[program:ossfs] command=bash /root/ossfs_scripts/start_ossfs.sh logfile=/var/log/ossfs.log log_stdout=true log_stderr=true logfile_maxbytes=1MB logfile_backups=10 运行supervisor:supervisordsupervisord 确认一切正常:ps aux | grep supervisor # 应该能看到supervisor进程 ps aux | grep ossfs # 应该能看到ossfs进程 kill -9 ossfs # 杀掉ossfs进程,supervisor应该会重启它, 不要使用killall, 因为killall发送SIGTERM,进程正常退出,supervisor不再去重新运行ossfs ps aux | grep ossfs # 应该能看到ossfs进程如果出错,请检查/var/log/supervisor/supervisord.log和/var/log/ossfs.log。 Q: 遇到”fuse: warning: library too old, some operations may not work”怎么办? 出现的原因是:ossfs编译时所使用的libfuse版本 比运行时链接到的libfuse版本高。这往往是用户自行安装了libfuse导致的。使用我们提供的rpm包安装ossfs,无需再安装libfuse。 在CentOS-5.x和CentOS-6.x上我们提供的rpm包里包含了libfuse-2.8.4,如果在运行的时候环境中有libfuse-2.8.3,并且ossfs被链接到了旧版本的fuse上,就会出现上述warning。 如何确认ossfs运行时链接的fuse版本? 运行ldd $(which ossfs) | grep fuse 例如结果是”/lib64/libfuse.so.2”,那么通过ls -l /lib64/libfuse*可以看到fuse的版本 如何让ossfs链接到正确的版本? 首先通过rpm -ql ossfs | grep fuse找到libfuse的目录 例如结果是”/usr/lib/libfuse.so.2”,则通过LD_LIBRARY_PATH=/usr/lib ossfs …运行ossfs 我能忽略这个WARNING吗? 最好不要,见这个bug Q: 为什么用ossfs看到的文件信息(例如大小)与其他工具看到的不一致? 因为ossfs默认会缓存文件的元信息(包括大小/权限等),这样就不需要每次ls的时候向OSS发送请求,加快速度。 如果用户通过其他程序(例如SDK/官网控制台/osscmd等)对文件进行了修改,那么有可能在ossfs中看到的文件信息 没有及时更新。 如果想禁止ossfs的缓存,那么可以在挂载的时候加上如下参数:-omax_stat_cache_size=0

2019-12-01 23:15:15 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 Q: ossfs适合什么样的程序? ossfs能把oss bucket挂载到本地,如果您使用的软件没有支持OSS,但您又想让数据能自动同步到OSS,那么ossfs是很好的选择。 Q: ossfs有什么局限性? 由于数据需要经过网络同步到云端,ossfs在性能和功能上可能与本地文件系统有差距。如果您想让数据库等对io要求很高的应用跑在ossfs挂载的盘上,请慎重考虑。和本地文件系统具体差异: 随机或者追加写文件会导致整个文件的重写。 元数据操作,例如list directory,性能较差,因为需要远程访问OSS服务器。 文件/文件夹的rename操作不是原子的。 多个客户端挂载同一个oss bucket时,依赖用户自行协调各个客户端的行为。例如避免多个客户端写同一个文件等等。 不支持hard link。 Q: ossfs一定要阿里云的机器才能用么? ossfs不限制一定要阿里云的内网才可以使用,外网机器依然可以使用。 Q: ossfs能不能同时挂载多个OSS bucket? 可以的,在passwd-ossfs文件中写入多个OSS配置信息即可。支持不同帐号的OSS。 Q: 我在yum/apt-get安装ossfs,遇到conflicts with file from package fuse-devel的错误,请问是怎么回事? 您的系统中存在老版本的fuse,请先使用相关的包管理器卸载,再重新安装ossfs。 Q: ossfs工作不正常,如何debug? 您可以使用在挂载时,加上-d -o f2参数,ossfs会把日志写入到系统日志中。在centos系统中,在/var/log/messages中。 您也可以在挂载时使用-f -d -o f2参数,ossfs会把日志输出到屏幕上。 Q: 为什么我在mount时遇到 ossfs: unable to access MOUNTPOINT /tmp/ossfs: Transport endpoint is not connected这样的错误? 请先umount对应的目录。 请检查您在使用ossfs挂载时,填入的url参数是否正确,是否和bucket/access key id/access key secret匹配。 特别注意:url中不包含bucket的名字。例如:您在oss控制台中看到bucket的域名是这样的:ossfs-test-1.oss-cn-hangzhou.aliyuncs.com。那么填入的url则是:http://oss-cn-hangzhou.aliyuncs.com。 Q: ossfs提示ossfs: unable to access MOUNTPOINT /tmp/odat: No such file or directory 这是您未创建该目录导致的,在挂载前需要创建对应目录。 Q: 我把bucket挂载到本地后,ls目录,却收到operation not permitted错误,这是为什么? 请检查您的bucket中,是否包含目录名含有不可见字符的OSS object。文件系统对文件/目录名有更严格的限制,因此会收到上述错误。使用其他工具对这些object重命名后,ls就能正确显示目录内容了。 Q: 我的一个目录下有非常多的文件,为什么ls该目录很慢? 假设一个目录下有n个文件,那么ls该目录至少需要n次OSS http requests。在文件非常多的时候,这可能造成严重的性能问题。 您可以采用下面两个办法优化: 通过-omax_stat_cache_size=xxx参数增大stat cache的size,这样第一次ls会较慢,但是后续的ls就快了,因为文件的元数据都在本地cache中。默认这个值是1000,大约消耗4MB内存,请根据您机器内存大小调整为合适的值。 使用ls -f命令,这个命令会消除与OSS的n次http请求。 具体参见issue 13。 Q: ossfs挂载时如何设置权限? 如果要允许其他用户访问挂载文件夹,可以在运行ossfs的时候指定allow_other参数: ossfs your_bucket your_mount_point -ourl=your_endpoint -o allow_other 为什么使用allow_other参数,仍然不能访问文件? 注意:allow_other是赋予挂载目录其他用户访问的权限,不是里面的文件!如果您要更改文件夹中的文件,请用chmod命令。 allow_other默认赋予挂载目录777权限,我想让挂载目录的权限为770,该怎么办? 可以通过umask来设置,参见这里。 Q: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user: 方法一: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user,则需要以user的身份创建挂载文件夹和使用ossfs: sudo -u user mkdir /tmp/ossfs sudo -u user ossfs bucket-name /tmp/ossfs 方法二: 首先通过id命令获得指定用户的uid/gid信息。例如获取www用户的uid/gid信息:id www;然后挂载时指定uid/gid参数: ossfs your_bucket your_mountpoint -ourl=your_url -ouid=your_uid -ogid=your_gid 注意:uid/gid都是数字。 Q: 我不是root用户,如何umount ossfs挂载的目录 fusermount -u your_mountpoint Q: 如何开机自动挂载ossfs? Step 1 首先请参考使用说明,把bucket name,access key id/secret等信息写入/etc/passwd-ossfs,并将该文件权限修改为640。 echo your_bucket_name:your_access_key_id:your_access_key_secret > /etc/passwd-ossfs chmod 640 /etc/passwd-ossfs Step 2 接下来针对不同的系统版本,设置方式有所不同 Step 2A 通过fstab的方式自动mount(适用于ubuntu14.04, centos6.5) 在/etc/fstab中加入下面的命令 ossfs#your_bucket_name your_mount_point fuse _netdev,url=your_url,allow_other 0 0 其中上述命令中的your_xxx信息需要根据您的bucket name等信息填入。 保存/etc/fstab文件。执行mount -a命令,如果没有报错,则说明设置正常。 到这一步,ubuntu14.04就能自动挂载了。centos6.5还需要执行下面的命令: chkconfig netfs on Step 2B 通过开机自启动脚本mount(适用于centos7.0及以上的系统) 在/etc/init.d/目录下建立文件ossfs,把模板文件中的内容拷贝到这个新文件中。并将其中的your_xxx内容改成您自己的信息。 执行命令:chmod a+x /etc/init.d/ossfs 上述命令是把新建立的ossfs脚本赋予可执行权限。您可以执行该脚本,如果脚本文件内容无误,那么此时oss中的bucket已经挂载到您指定的目录下了。 执行命令:chkconfig ossfs on 上述命令是把ossfs启动脚本作为其他服务,开机自动启动。 好了,现在ossfs就可以开机自动挂载了。总结起来,如果您是ubuntu14.04和centos6.5,您需要执行Step 1 + Step 2A;如果您是centos7.0系统,您需要执行Step 1 + Step 2B。 Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令 Q: 我需要以www用户挂载ossfs,此时如何设置开机自动挂载? 参照上面的问题的解答,Step 1照做,对Step 2B稍加修改,修改/etc/init.d/ossfs中的命令为: sudo -u www ossfs your_bucket your_mountpoint -ourl=your_url 设置自启动脚本中允许使用sudo,编辑/etc/sudoers,将其中的Defaults requiretty这行改为#Defaults requiretty(注释掉) Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令。 Q: 使用ECS挂载ossfs,如何避免因后台程序扫描文件而产生费用? 程序扫描ossfs挂载的目录,会转换成向OSS的请求,如果请求次数很多,会产生费用(1分钱/1万次)。如果是updatedb,可以通过修改/etc/updatedb.conf让它跳过。具体做法是: 在PRUNEFS =后面加上fuse.ossfs 在PRUNEPATHS =后面加上挂载的目录 如何确定是哪个进程扫了我的目录? 首先安装auditd: sudo apt-get install auditd 启动auditd: sudo service auditd start 设置监视挂载目录: auditctl -w /mnt/ossfs 在auditlog中可以查看是哪些进程访问了这个目录:ausearch -i | grep /mnt/ossfs Q: 使用ossfs上传到OSS的文件Content-Type全是”application/octet-stream”是怎么回事? ossfs通过查询/etc/mime.types中的内容来确定文件的Content-Type,请检查这个文件是否存在,如果不存在,则需要添加: 对于ubuntu可以通过sudo apt-get install mime-support来添加 对于centos可以通过sudo yum install mailcap来添加 也可以手动添加,每种格式一行,每行格式为:application/javascript js Q: 如何使用supervisor启动ossfs? 安装supervisor,在ubuntu中执行sudo apt-get install supervisor 建立一个目录,编辑ossfs的启动脚本:mkdir /root/ossfs_scripts vi /root/ossfs_scripts/start_ossfs.sh写入如下数据:# 卸载 fusermount -u /mnt/ossfs # 重新挂载,必须要增加-f参数运行ossfs,让ossfs在前台运行 exec ossfs my-bucket my-mount-point -ourl=my-oss-endpoint -f 编辑/etc/supervisor/supervisord.conf,在最后加入下面一段:[program:ossfs] command=bash /root/ossfs_scripts/start_ossfs.sh logfile=/var/log/ossfs.log log_stdout=true log_stderr=true logfile_maxbytes=1MB logfile_backups=10 运行supervisor:supervisordsupervisord 确认一切正常:ps aux | grep supervisor # 应该能看到supervisor进程 ps aux | grep ossfs # 应该能看到ossfs进程 kill -9 ossfs # 杀掉ossfs进程,supervisor应该会重启它, 不要使用killall, 因为killall发送SIGTERM,进程正常退出,supervisor不再去重新运行ossfs ps aux | grep ossfs # 应该能看到ossfs进程如果出错,请检查/var/log/supervisor/supervisord.log和/var/log/ossfs.log。 Q: 遇到”fuse: warning: library too old, some operations may not work”怎么办? 出现的原因是:ossfs编译时所使用的libfuse版本 比运行时链接到的libfuse版本高。这往往是用户自行安装了libfuse导致的。使用我们提供的rpm包安装ossfs,无需再安装libfuse。 在CentOS-5.x和CentOS-6.x上我们提供的rpm包里包含了libfuse-2.8.4,如果在运行的时候环境中有libfuse-2.8.3,并且ossfs被链接到了旧版本的fuse上,就会出现上述warning。 如何确认ossfs运行时链接的fuse版本? 运行ldd $(which ossfs) | grep fuse 例如结果是”/lib64/libfuse.so.2”,那么通过ls -l /lib64/libfuse*可以看到fuse的版本 如何让ossfs链接到正确的版本? 首先通过rpm -ql ossfs | grep fuse找到libfuse的目录 例如结果是”/usr/lib/libfuse.so.2”,则通过LD_LIBRARY_PATH=/usr/lib ossfs …运行ossfs 我能忽略这个WARNING吗? 最好不要,见这个bug Q: 为什么用ossfs看到的文件信息(例如大小)与其他工具看到的不一致? 因为ossfs默认会缓存文件的元信息(包括大小/权限等),这样就不需要每次ls的时候向OSS发送请求,加快速度。 如果用户通过其他程序(例如SDK/官网控制台/osscmd等)对文件进行了修改,那么有可能在ossfs中看到的文件信息 没有及时更新。 如果想禁止ossfs的缓存,那么可以在挂载的时候加上如下参数:-omax_stat_cache_size=0

2019-12-01 23:15:14 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 Q: ossfs适合什么样的程序? ossfs能把oss bucket挂载到本地,如果您使用的软件没有支持OSS,但您又想让数据能自动同步到OSS,那么ossfs是很好的选择。 Q: ossfs有什么局限性? 由于数据需要经过网络同步到云端,ossfs在性能和功能上可能与本地文件系统有差距。如果您想让数据库等对io要求很高的应用跑在ossfs挂载的盘上,请慎重考虑。和本地文件系统具体差异: 随机或者追加写文件会导致整个文件的重写。 元数据操作,例如list directory,性能较差,因为需要远程访问OSS服务器。 文件/文件夹的rename操作不是原子的。 多个客户端挂载同一个oss bucket时,依赖用户自行协调各个客户端的行为。例如避免多个客户端写同一个文件等等。 不支持hard link。 Q: ossfs一定要阿里云的机器才能用么? ossfs不限制一定要阿里云的内网才可以使用,外网机器依然可以使用。 Q: ossfs能不能同时挂载多个OSS bucket? 可以的,在passwd-ossfs文件中写入多个OSS配置信息即可。支持不同帐号的OSS。 Q: 我在yum/apt-get安装ossfs,遇到conflicts with file from package fuse-devel的错误,请问是怎么回事? 您的系统中存在老版本的fuse,请先使用相关的包管理器卸载,再重新安装ossfs。 Q: ossfs工作不正常,如何debug? 您可以使用在挂载时,加上-d -o f2参数,ossfs会把日志写入到系统日志中。在centos系统中,在/var/log/messages中。 您也可以在挂载时使用-f -d -o f2参数,ossfs会把日志输出到屏幕上。 Q: 为什么我在mount时遇到 ossfs: unable to access MOUNTPOINT /tmp/ossfs: Transport endpoint is not connected这样的错误? 请先umount对应的目录。 请检查您在使用ossfs挂载时,填入的url参数是否正确,是否和bucket/access key id/access key secret匹配。 特别注意:url中不包含bucket的名字。例如:您在oss控制台中看到bucket的域名是这样的:ossfs-test-1.oss-cn-hangzhou.aliyuncs.com。那么填入的url则是:http://oss-cn-hangzhou.aliyuncs.com。 Q: ossfs提示ossfs: unable to access MOUNTPOINT /tmp/odat: No such file or directory 这是您未创建该目录导致的,在挂载前需要创建对应目录。 Q: 我把bucket挂载到本地后,ls目录,却收到operation not permitted错误,这是为什么? 请检查您的bucket中,是否包含目录名含有不可见字符的OSS object。文件系统对文件/目录名有更严格的限制,因此会收到上述错误。使用其他工具对这些object重命名后,ls就能正确显示目录内容了。 Q: 我的一个目录下有非常多的文件,为什么ls该目录很慢? 假设一个目录下有n个文件,那么ls该目录至少需要n次OSS http requests。在文件非常多的时候,这可能造成严重的性能问题。 您可以采用下面两个办法优化: 通过-omax_stat_cache_size=xxx参数增大stat cache的size,这样第一次ls会较慢,但是后续的ls就快了,因为文件的元数据都在本地cache中。默认这个值是1000,大约消耗4MB内存,请根据您机器内存大小调整为合适的值。 使用ls -f命令,这个命令会消除与OSS的n次http请求。 具体参见issue 13。 Q: ossfs挂载时如何设置权限? 如果要允许其他用户访问挂载文件夹,可以在运行ossfs的时候指定allow_other参数: ossfs your_bucket your_mount_point -ourl=your_endpoint -o allow_other 为什么使用allow_other参数,仍然不能访问文件? 注意:allow_other是赋予挂载目录其他用户访问的权限,不是里面的文件!如果您要更改文件夹中的文件,请用chmod命令。 allow_other默认赋予挂载目录777权限,我想让挂载目录的权限为770,该怎么办? 可以通过umask来设置,参见这里。 Q: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user: 方法一: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user,则需要以user的身份创建挂载文件夹和使用ossfs: sudo -u user mkdir /tmp/ossfs sudo -u user ossfs bucket-name /tmp/ossfs 方法二: 首先通过id命令获得指定用户的uid/gid信息。例如获取www用户的uid/gid信息:id www;然后挂载时指定uid/gid参数: ossfs your_bucket your_mountpoint -ourl=your_url -ouid=your_uid -ogid=your_gid 注意:uid/gid都是数字。 Q: 我不是root用户,如何umount ossfs挂载的目录 fusermount -u your_mountpoint Q: 如何开机自动挂载ossfs? Step 1 首先请参考使用说明,把bucket name,access key id/secret等信息写入/etc/passwd-ossfs,并将该文件权限修改为640。 echo your_bucket_name:your_access_key_id:your_access_key_secret > /etc/passwd-ossfs chmod 640 /etc/passwd-ossfs Step 2 接下来针对不同的系统版本,设置方式有所不同 Step 2A 通过fstab的方式自动mount(适用于ubuntu14.04, centos6.5) 在/etc/fstab中加入下面的命令 ossfs#your_bucket_name your_mount_point fuse _netdev,url=your_url,allow_other 0 0 其中上述命令中的your_xxx信息需要根据您的bucket name等信息填入。 保存/etc/fstab文件。执行mount -a命令,如果没有报错,则说明设置正常。 到这一步,ubuntu14.04就能自动挂载了。centos6.5还需要执行下面的命令: chkconfig netfs on Step 2B 通过开机自启动脚本mount(适用于centos7.0及以上的系统) 在/etc/init.d/目录下建立文件ossfs,把模板文件中的内容拷贝到这个新文件中。并将其中的your_xxx内容改成您自己的信息。 执行命令:chmod a+x /etc/init.d/ossfs 上述命令是把新建立的ossfs脚本赋予可执行权限。您可以执行该脚本,如果脚本文件内容无误,那么此时oss中的bucket已经挂载到您指定的目录下了。 执行命令:chkconfig ossfs on 上述命令是把ossfs启动脚本作为其他服务,开机自动启动。 好了,现在ossfs就可以开机自动挂载了。总结起来,如果您是ubuntu14.04和centos6.5,您需要执行Step 1 + Step 2A;如果您是centos7.0系统,您需要执行Step 1 + Step 2B。 Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令 Q: 我需要以www用户挂载ossfs,此时如何设置开机自动挂载? 参照上面的问题的解答,Step 1照做,对Step 2B稍加修改,修改/etc/init.d/ossfs中的命令为: sudo -u www ossfs your_bucket your_mountpoint -ourl=your_url 设置自启动脚本中允许使用sudo,编辑/etc/sudoers,将其中的Defaults requiretty这行改为#Defaults requiretty(注释掉) Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令。 Q: 使用ECS挂载ossfs,如何避免因后台程序扫描文件而产生费用? 程序扫描ossfs挂载的目录,会转换成向OSS的请求,如果请求次数很多,会产生费用(1分钱/1万次)。如果是updatedb,可以通过修改/etc/updatedb.conf让它跳过。具体做法是: 在PRUNEFS =后面加上fuse.ossfs 在PRUNEPATHS =后面加上挂载的目录 如何确定是哪个进程扫了我的目录? 首先安装auditd: sudo apt-get install auditd 启动auditd: sudo service auditd start 设置监视挂载目录: auditctl -w /mnt/ossfs 在auditlog中可以查看是哪些进程访问了这个目录:ausearch -i | grep /mnt/ossfs Q: 使用ossfs上传到OSS的文件Content-Type全是”application/octet-stream”是怎么回事? ossfs通过查询/etc/mime.types中的内容来确定文件的Content-Type,请检查这个文件是否存在,如果不存在,则需要添加: 对于ubuntu可以通过sudo apt-get install mime-support来添加 对于centos可以通过sudo yum install mailcap来添加 也可以手动添加,每种格式一行,每行格式为:application/javascript js Q: 如何使用supervisor启动ossfs? 安装supervisor,在ubuntu中执行sudo apt-get install supervisor 建立一个目录,编辑ossfs的启动脚本:mkdir /root/ossfs_scripts vi /root/ossfs_scripts/start_ossfs.sh写入如下数据:# 卸载 fusermount -u /mnt/ossfs # 重新挂载,必须要增加-f参数运行ossfs,让ossfs在前台运行 exec ossfs my-bucket my-mount-point -ourl=my-oss-endpoint -f 编辑/etc/supervisor/supervisord.conf,在最后加入下面一段:[program:ossfs] command=bash /root/ossfs_scripts/start_ossfs.sh logfile=/var/log/ossfs.log log_stdout=true log_stderr=true logfile_maxbytes=1MB logfile_backups=10 运行supervisor:supervisordsupervisord 确认一切正常:ps aux | grep supervisor # 应该能看到supervisor进程 ps aux | grep ossfs # 应该能看到ossfs进程 kill -9 ossfs # 杀掉ossfs进程,supervisor应该会重启它, 不要使用killall, 因为killall发送SIGTERM,进程正常退出,supervisor不再去重新运行ossfs ps aux | grep ossfs # 应该能看到ossfs进程如果出错,请检查/var/log/supervisor/supervisord.log和/var/log/ossfs.log。 Q: 遇到”fuse: warning: library too old, some operations may not work”怎么办? 出现的原因是:ossfs编译时所使用的libfuse版本 比运行时链接到的libfuse版本高。这往往是用户自行安装了libfuse导致的。使用我们提供的rpm包安装ossfs,无需再安装libfuse。 在CentOS-5.x和CentOS-6.x上我们提供的rpm包里包含了libfuse-2.8.4,如果在运行的时候环境中有libfuse-2.8.3,并且ossfs被链接到了旧版本的fuse上,就会出现上述warning。 如何确认ossfs运行时链接的fuse版本? 运行ldd $(which ossfs) | grep fuse 例如结果是”/lib64/libfuse.so.2”,那么通过ls -l /lib64/libfuse*可以看到fuse的版本 如何让ossfs链接到正确的版本? 首先通过rpm -ql ossfs | grep fuse找到libfuse的目录 例如结果是”/usr/lib/libfuse.so.2”,则通过LD_LIBRARY_PATH=/usr/lib ossfs …运行ossfs 我能忽略这个WARNING吗? 最好不要,见这个bug Q: 为什么用ossfs看到的文件信息(例如大小)与其他工具看到的不一致? 因为ossfs默认会缓存文件的元信息(包括大小/权限等),这样就不需要每次ls的时候向OSS发送请求,加快速度。 如果用户通过其他程序(例如SDK/官网控制台/osscmd等)对文件进行了修改,那么有可能在ossfs中看到的文件信息 没有及时更新。 如果想禁止ossfs的缓存,那么可以在挂载的时候加上如下参数:-omax_stat_cache_size=0

2019-12-01 23:15:16 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 Q: ossfs适合什么样的程序? ossfs能把oss bucket挂载到本地,如果您使用的软件没有支持OSS,但您又想让数据能自动同步到OSS,那么ossfs是很好的选择。 Q: ossfs有什么局限性? 由于数据需要经过网络同步到云端,ossfs在性能和功能上可能与本地文件系统有差距。如果您想让数据库等对io要求很高的应用跑在ossfs挂载的盘上,请慎重考虑。和本地文件系统具体差异: 随机或者追加写文件会导致整个文件的重写。 元数据操作,例如list directory,性能较差,因为需要远程访问OSS服务器。 文件/文件夹的rename操作不是原子的。 多个客户端挂载同一个oss bucket时,依赖用户自行协调各个客户端的行为。例如避免多个客户端写同一个文件等等。 不支持hard link。 Q: ossfs一定要阿里云的机器才能用么? ossfs不限制一定要阿里云的内网才可以使用,外网机器依然可以使用。 Q: ossfs能不能同时挂载多个OSS bucket? 可以的,在passwd-ossfs文件中写入多个OSS配置信息即可。支持不同帐号的OSS。 Q: 我在yum/apt-get安装ossfs,遇到conflicts with file from package fuse-devel的错误,请问是怎么回事? 您的系统中存在老版本的fuse,请先使用相关的包管理器卸载,再重新安装ossfs。 Q: ossfs工作不正常,如何debug? 您可以使用在挂载时,加上-d -o f2参数,ossfs会把日志写入到系统日志中。在centos系统中,在/var/log/messages中。 您也可以在挂载时使用-f -d -o f2参数,ossfs会把日志输出到屏幕上。 Q: 为什么我在mount时遇到 ossfs: unable to access MOUNTPOINT /tmp/ossfs: Transport endpoint is not connected这样的错误? 请先umount对应的目录。 请检查您在使用ossfs挂载时,填入的url参数是否正确,是否和bucket/access key id/access key secret匹配。 特别注意:url中不包含bucket的名字。例如:您在oss控制台中看到bucket的域名是这样的:ossfs-test-1.oss-cn-hangzhou.aliyuncs.com。那么填入的url则是:http://oss-cn-hangzhou.aliyuncs.com。 Q: ossfs提示ossfs: unable to access MOUNTPOINT /tmp/odat: No such file or directory 这是您未创建该目录导致的,在挂载前需要创建对应目录。 Q: 我把bucket挂载到本地后,ls目录,却收到operation not permitted错误,这是为什么? 请检查您的bucket中,是否包含目录名含有不可见字符的OSS object。文件系统对文件/目录名有更严格的限制,因此会收到上述错误。使用其他工具对这些object重命名后,ls就能正确显示目录内容了。 Q: 我的一个目录下有非常多的文件,为什么ls该目录很慢? 假设一个目录下有n个文件,那么ls该目录至少需要n次OSS http requests。在文件非常多的时候,这可能造成严重的性能问题。 您可以采用下面两个办法优化: 通过-omax_stat_cache_size=xxx参数增大stat cache的size,这样第一次ls会较慢,但是后续的ls就快了,因为文件的元数据都在本地cache中。默认这个值是1000,大约消耗4MB内存,请根据您机器内存大小调整为合适的值。 使用ls -f命令,这个命令会消除与OSS的n次http请求。 具体参见issue 13。 Q: ossfs挂载时如何设置权限? 如果要允许其他用户访问挂载文件夹,可以在运行ossfs的时候指定allow_other参数: ossfs your_bucket your_mount_point -ourl=your_endpoint -o allow_other 为什么使用allow_other参数,仍然不能访问文件? 注意:allow_other是赋予挂载目录其他用户访问的权限,不是里面的文件!如果您要更改文件夹中的文件,请用chmod命令。 allow_other默认赋予挂载目录777权限,我想让挂载目录的权限为770,该怎么办? 可以通过umask来设置,参见这里。 Q: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user: 方法一: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user,则需要以user的身份创建挂载文件夹和使用ossfs: sudo -u user mkdir /tmp/ossfs sudo -u user ossfs bucket-name /tmp/ossfs 方法二: 首先通过id命令获得指定用户的uid/gid信息。例如获取www用户的uid/gid信息:id www;然后挂载时指定uid/gid参数: ossfs your_bucket your_mountpoint -ourl=your_url -ouid=your_uid -ogid=your_gid 注意:uid/gid都是数字。 Q: 我不是root用户,如何umount ossfs挂载的目录 fusermount -u your_mountpoint Q: 如何开机自动挂载ossfs? Step 1 首先请参考使用说明,把bucket name,access key id/secret等信息写入/etc/passwd-ossfs,并将该文件权限修改为640。 echo your_bucket_name:your_access_key_id:your_access_key_secret > /etc/passwd-ossfs chmod 640 /etc/passwd-ossfs Step 2 接下来针对不同的系统版本,设置方式有所不同 Step 2A 通过fstab的方式自动mount(适用于ubuntu14.04, centos6.5) 在/etc/fstab中加入下面的命令 ossfs#your_bucket_name your_mount_point fuse _netdev,url=your_url,allow_other 0 0 其中上述命令中的your_xxx信息需要根据您的bucket name等信息填入。 保存/etc/fstab文件。执行mount -a命令,如果没有报错,则说明设置正常。 到这一步,ubuntu14.04就能自动挂载了。centos6.5还需要执行下面的命令: chkconfig netfs on Step 2B 通过开机自启动脚本mount(适用于centos7.0及以上的系统) 在/etc/init.d/目录下建立文件ossfs,把模板文件中的内容拷贝到这个新文件中。并将其中的your_xxx内容改成您自己的信息。 执行命令:chmod a+x /etc/init.d/ossfs 上述命令是把新建立的ossfs脚本赋予可执行权限。您可以执行该脚本,如果脚本文件内容无误,那么此时oss中的bucket已经挂载到您指定的目录下了。 执行命令:chkconfig ossfs on 上述命令是把ossfs启动脚本作为其他服务,开机自动启动。 好了,现在ossfs就可以开机自动挂载了。总结起来,如果您是ubuntu14.04和centos6.5,您需要执行Step 1 + Step 2A;如果您是centos7.0系统,您需要执行Step 1 + Step 2B。 Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令 Q: 我需要以www用户挂载ossfs,此时如何设置开机自动挂载? 参照上面的问题的解答,Step 1照做,对Step 2B稍加修改,修改/etc/init.d/ossfs中的命令为: sudo -u www ossfs your_bucket your_mountpoint -ourl=your_url 设置自启动脚本中允许使用sudo,编辑/etc/sudoers,将其中的Defaults requiretty这行改为#Defaults requiretty(注释掉) Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令。 Q: 使用ECS挂载ossfs,如何避免因后台程序扫描文件而产生费用? 程序扫描ossfs挂载的目录,会转换成向OSS的请求,如果请求次数很多,会产生费用(1分钱/1万次)。如果是updatedb,可以通过修改/etc/updatedb.conf让它跳过。具体做法是: 在PRUNEFS =后面加上fuse.ossfs 在PRUNEPATHS =后面加上挂载的目录 如何确定是哪个进程扫了我的目录? 首先安装auditd: sudo apt-get install auditd 启动auditd: sudo service auditd start 设置监视挂载目录: auditctl -w /mnt/ossfs 在auditlog中可以查看是哪些进程访问了这个目录:ausearch -i | grep /mnt/ossfs Q: 使用ossfs上传到OSS的文件Content-Type全是”application/octet-stream”是怎么回事? ossfs通过查询/etc/mime.types中的内容来确定文件的Content-Type,请检查这个文件是否存在,如果不存在,则需要添加: 对于ubuntu可以通过sudo apt-get install mime-support来添加 对于centos可以通过sudo yum install mailcap来添加 也可以手动添加,每种格式一行,每行格式为:application/javascript js Q: 如何使用supervisor启动ossfs? 安装supervisor,在ubuntu中执行sudo apt-get install supervisor 建立一个目录,编辑ossfs的启动脚本:mkdir /root/ossfs_scripts vi /root/ossfs_scripts/start_ossfs.sh写入如下数据:# 卸载 fusermount -u /mnt/ossfs # 重新挂载,必须要增加-f参数运行ossfs,让ossfs在前台运行 exec ossfs my-bucket my-mount-point -ourl=my-oss-endpoint -f 编辑/etc/supervisor/supervisord.conf,在最后加入下面一段:[program:ossfs] command=bash /root/ossfs_scripts/start_ossfs.sh logfile=/var/log/ossfs.log log_stdout=true log_stderr=true logfile_maxbytes=1MB logfile_backups=10 运行supervisor:supervisordsupervisord 确认一切正常:ps aux | grep supervisor # 应该能看到supervisor进程 ps aux | grep ossfs # 应该能看到ossfs进程 kill -9 ossfs # 杀掉ossfs进程,supervisor应该会重启它, 不要使用killall, 因为killall发送SIGTERM,进程正常退出,supervisor不再去重新运行ossfs ps aux | grep ossfs # 应该能看到ossfs进程如果出错,请检查/var/log/supervisor/supervisord.log和/var/log/ossfs.log。 Q: 遇到”fuse: warning: library too old, some operations may not work”怎么办? 出现的原因是:ossfs编译时所使用的libfuse版本 比运行时链接到的libfuse版本高。这往往是用户自行安装了libfuse导致的。使用我们提供的rpm包安装ossfs,无需再安装libfuse。 在CentOS-5.x和CentOS-6.x上我们提供的rpm包里包含了libfuse-2.8.4,如果在运行的时候环境中有libfuse-2.8.3,并且ossfs被链接到了旧版本的fuse上,就会出现上述warning。 如何确认ossfs运行时链接的fuse版本? 运行ldd $(which ossfs) | grep fuse 例如结果是”/lib64/libfuse.so.2”,那么通过ls -l /lib64/libfuse*可以看到fuse的版本 如何让ossfs链接到正确的版本? 首先通过rpm -ql ossfs | grep fuse找到libfuse的目录 例如结果是”/usr/lib/libfuse.so.2”,则通过LD_LIBRARY_PATH=/usr/lib ossfs …运行ossfs 我能忽略这个WARNING吗? 最好不要,见这个bug Q: 为什么用ossfs看到的文件信息(例如大小)与其他工具看到的不一致? 因为ossfs默认会缓存文件的元信息(包括大小/权限等),这样就不需要每次ls的时候向OSS发送请求,加快速度。 如果用户通过其他程序(例如SDK/官网控制台/osscmd等)对文件进行了修改,那么有可能在ossfs中看到的文件信息 没有及时更新。 如果想禁止ossfs的缓存,那么可以在挂载的时候加上如下参数:-omax_stat_cache_size=0

2019-12-01 23:15:17 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 Q: ossfs适合什么样的程序? ossfs能把oss bucket挂载到本地,如果您使用的软件没有支持OSS,但您又想让数据能自动同步到OSS,那么ossfs是很好的选择。 Q: ossfs有什么局限性? 由于数据需要经过网络同步到云端,ossfs在性能和功能上可能与本地文件系统有差距。如果您想让数据库等对io要求很高的应用跑在ossfs挂载的盘上,请慎重考虑。和本地文件系统具体差异: 随机或者追加写文件会导致整个文件的重写。 元数据操作,例如list directory,性能较差,因为需要远程访问OSS服务器。 文件/文件夹的rename操作不是原子的。 多个客户端挂载同一个oss bucket时,依赖用户自行协调各个客户端的行为。例如避免多个客户端写同一个文件等等。 不支持hard link。 Q: ossfs一定要阿里云的机器才能用么? ossfs不限制一定要阿里云的内网才可以使用,外网机器依然可以使用。 Q: ossfs能不能同时挂载多个OSS bucket? 可以的,在passwd-ossfs文件中写入多个OSS配置信息即可。支持不同帐号的OSS。 Q: 我在yum/apt-get安装ossfs,遇到conflicts with file from package fuse-devel的错误,请问是怎么回事? 您的系统中存在老版本的fuse,请先使用相关的包管理器卸载,再重新安装ossfs。 Q: ossfs工作不正常,如何debug? 您可以使用在挂载时,加上-d -o f2参数,ossfs会把日志写入到系统日志中。在centos系统中,在/var/log/messages中。 您也可以在挂载时使用-f -d -o f2参数,ossfs会把日志输出到屏幕上。 Q: 为什么我在mount时遇到 ossfs: unable to access MOUNTPOINT /tmp/ossfs: Transport endpoint is not connected这样的错误? 请先umount对应的目录。 请检查您在使用ossfs挂载时,填入的url参数是否正确,是否和bucket/access key id/access key secret匹配。 特别注意:url中不包含bucket的名字。例如:您在oss控制台中看到bucket的域名是这样的:ossfs-test-1.oss-cn-hangzhou.aliyuncs.com。那么填入的url则是:http://oss-cn-hangzhou.aliyuncs.com。 Q: ossfs提示ossfs: unable to access MOUNTPOINT /tmp/odat: No such file or directory 这是您未创建该目录导致的,在挂载前需要创建对应目录。 Q: 我把bucket挂载到本地后,ls目录,却收到operation not permitted错误,这是为什么? 请检查您的bucket中,是否包含目录名含有不可见字符的OSS object。文件系统对文件/目录名有更严格的限制,因此会收到上述错误。使用其他工具对这些object重命名后,ls就能正确显示目录内容了。 Q: 我的一个目录下有非常多的文件,为什么ls该目录很慢? 假设一个目录下有n个文件,那么ls该目录至少需要n次OSS http requests。在文件非常多的时候,这可能造成严重的性能问题。 您可以采用下面两个办法优化: 通过-omax_stat_cache_size=xxx参数增大stat cache的size,这样第一次ls会较慢,但是后续的ls就快了,因为文件的元数据都在本地cache中。默认这个值是1000,大约消耗4MB内存,请根据您机器内存大小调整为合适的值。 使用ls -f命令,这个命令会消除与OSS的n次http请求。 具体参见issue 13。 Q: ossfs挂载时如何设置权限? 如果要允许其他用户访问挂载文件夹,可以在运行ossfs的时候指定allow_other参数: ossfs your_bucket your_mount_point -ourl=your_endpoint -o allow_other 为什么使用allow_other参数,仍然不能访问文件? 注意:allow_other是赋予挂载目录其他用户访问的权限,不是里面的文件!如果您要更改文件夹中的文件,请用chmod命令。 allow_other默认赋予挂载目录777权限,我想让挂载目录的权限为770,该怎么办? 可以通过umask来设置,参见这里。 Q: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user: 方法一: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user,则需要以user的身份创建挂载文件夹和使用ossfs: sudo -u user mkdir /tmp/ossfs sudo -u user ossfs bucket-name /tmp/ossfs 方法二: 首先通过id命令获得指定用户的uid/gid信息。例如获取www用户的uid/gid信息:id www;然后挂载时指定uid/gid参数: ossfs your_bucket your_mountpoint -ourl=your_url -ouid=your_uid -ogid=your_gid 注意:uid/gid都是数字。 Q: 我不是root用户,如何umount ossfs挂载的目录 fusermount -u your_mountpoint Q: 如何开机自动挂载ossfs? Step 1 首先请参考使用说明,把bucket name,access key id/secret等信息写入/etc/passwd-ossfs,并将该文件权限修改为640。 echo your_bucket_name:your_access_key_id:your_access_key_secret > /etc/passwd-ossfs chmod 640 /etc/passwd-ossfs Step 2 接下来针对不同的系统版本,设置方式有所不同 Step 2A 通过fstab的方式自动mount(适用于ubuntu14.04, centos6.5) 在/etc/fstab中加入下面的命令 ossfs#your_bucket_name your_mount_point fuse _netdev,url=your_url,allow_other 0 0 其中上述命令中的your_xxx信息需要根据您的bucket name等信息填入。 保存/etc/fstab文件。执行mount -a命令,如果没有报错,则说明设置正常。 到这一步,ubuntu14.04就能自动挂载了。centos6.5还需要执行下面的命令: chkconfig netfs on Step 2B 通过开机自启动脚本mount(适用于centos7.0及以上的系统) 在/etc/init.d/目录下建立文件ossfs,把模板文件中的内容拷贝到这个新文件中。并将其中的your_xxx内容改成您自己的信息。 执行命令:chmod a+x /etc/init.d/ossfs 上述命令是把新建立的ossfs脚本赋予可执行权限。您可以执行该脚本,如果脚本文件内容无误,那么此时oss中的bucket已经挂载到您指定的目录下了。 执行命令:chkconfig ossfs on 上述命令是把ossfs启动脚本作为其他服务,开机自动启动。 好了,现在ossfs就可以开机自动挂载了。总结起来,如果您是ubuntu14.04和centos6.5,您需要执行Step 1 + Step 2A;如果您是centos7.0系统,您需要执行Step 1 + Step 2B。 Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令 Q: 我需要以www用户挂载ossfs,此时如何设置开机自动挂载? 参照上面的问题的解答,Step 1照做,对Step 2B稍加修改,修改/etc/init.d/ossfs中的命令为: sudo -u www ossfs your_bucket your_mountpoint -ourl=your_url 设置自启动脚本中允许使用sudo,编辑/etc/sudoers,将其中的Defaults requiretty这行改为#Defaults requiretty(注释掉) Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令。 Q: 使用ECS挂载ossfs,如何避免因后台程序扫描文件而产生费用? 程序扫描ossfs挂载的目录,会转换成向OSS的请求,如果请求次数很多,会产生费用(1分钱/1万次)。如果是updatedb,可以通过修改/etc/updatedb.conf让它跳过。具体做法是: 在PRUNEFS =后面加上fuse.ossfs 在PRUNEPATHS =后面加上挂载的目录 如何确定是哪个进程扫了我的目录? 首先安装auditd: sudo apt-get install auditd 启动auditd: sudo service auditd start 设置监视挂载目录: auditctl -w /mnt/ossfs 在auditlog中可以查看是哪些进程访问了这个目录:ausearch -i | grep /mnt/ossfs Q: 使用ossfs上传到OSS的文件Content-Type全是”application/octet-stream”是怎么回事? ossfs通过查询/etc/mime.types中的内容来确定文件的Content-Type,请检查这个文件是否存在,如果不存在,则需要添加: 对于ubuntu可以通过sudo apt-get install mime-support来添加 对于centos可以通过sudo yum install mailcap来添加 也可以手动添加,每种格式一行,每行格式为:application/javascript js Q: 如何使用supervisor启动ossfs? 安装supervisor,在ubuntu中执行sudo apt-get install supervisor 建立一个目录,编辑ossfs的启动脚本:mkdir /root/ossfs_scripts vi /root/ossfs_scripts/start_ossfs.sh写入如下数据:# 卸载 fusermount -u /mnt/ossfs # 重新挂载,必须要增加-f参数运行ossfs,让ossfs在前台运行 exec ossfs my-bucket my-mount-point -ourl=my-oss-endpoint -f 编辑/etc/supervisor/supervisord.conf,在最后加入下面一段:[program:ossfs] command=bash /root/ossfs_scripts/start_ossfs.sh logfile=/var/log/ossfs.log log_stdout=true log_stderr=true logfile_maxbytes=1MB logfile_backups=10 运行supervisor:supervisordsupervisord 确认一切正常:ps aux | grep supervisor # 应该能看到supervisor进程 ps aux | grep ossfs # 应该能看到ossfs进程 kill -9 ossfs # 杀掉ossfs进程,supervisor应该会重启它, 不要使用killall, 因为killall发送SIGTERM,进程正常退出,supervisor不再去重新运行ossfs ps aux | grep ossfs # 应该能看到ossfs进程如果出错,请检查/var/log/supervisor/supervisord.log和/var/log/ossfs.log。 Q: 遇到”fuse: warning: library too old, some operations may not work”怎么办? 出现的原因是:ossfs编译时所使用的libfuse版本 比运行时链接到的libfuse版本高。这往往是用户自行安装了libfuse导致的。使用我们提供的rpm包安装ossfs,无需再安装libfuse。 在CentOS-5.x和CentOS-6.x上我们提供的rpm包里包含了libfuse-2.8.4,如果在运行的时候环境中有libfuse-2.8.3,并且ossfs被链接到了旧版本的fuse上,就会出现上述warning。 如何确认ossfs运行时链接的fuse版本? 运行ldd $(which ossfs) | grep fuse 例如结果是”/lib64/libfuse.so.2”,那么通过ls -l /lib64/libfuse*可以看到fuse的版本 如何让ossfs链接到正确的版本? 首先通过rpm -ql ossfs | grep fuse找到libfuse的目录 例如结果是”/usr/lib/libfuse.so.2”,则通过LD_LIBRARY_PATH=/usr/lib ossfs …运行ossfs 我能忽略这个WARNING吗? 最好不要,见这个bug Q: 为什么用ossfs看到的文件信息(例如大小)与其他工具看到的不一致? 因为ossfs默认会缓存文件的元信息(包括大小/权限等),这样就不需要每次ls的时候向OSS发送请求,加快速度。 如果用户通过其他程序(例如SDK/官网控制台/osscmd等)对文件进行了修改,那么有可能在ossfs中看到的文件信息 没有及时更新。 如果想禁止ossfs的缓存,那么可以在挂载的时候加上如下参数:-omax_stat_cache_size=0

2019-12-01 23:15:16 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 Q: ossfs适合什么样的程序? ossfs能把oss bucket挂载到本地,如果您使用的软件没有支持OSS,但您又想让数据能自动同步到OSS,那么ossfs是很好的选择。 Q: ossfs有什么局限性? 由于数据需要经过网络同步到云端,ossfs在性能和功能上可能与本地文件系统有差距。如果您想让数据库等对io要求很高的应用跑在ossfs挂载的盘上,请慎重考虑。和本地文件系统具体差异: 随机或者追加写文件会导致整个文件的重写。 元数据操作,例如list directory,性能较差,因为需要远程访问OSS服务器。 文件/文件夹的rename操作不是原子的。 多个客户端挂载同一个oss bucket时,依赖用户自行协调各个客户端的行为。例如避免多个客户端写同一个文件等等。 不支持hard link。 Q: ossfs一定要阿里云的机器才能用么? ossfs不限制一定要阿里云的内网才可以使用,外网机器依然可以使用。 Q: ossfs能不能同时挂载多个OSS bucket? 可以的,在passwd-ossfs文件中写入多个OSS配置信息即可。支持不同帐号的OSS。 Q: 我在yum/apt-get安装ossfs,遇到conflicts with file from package fuse-devel的错误,请问是怎么回事? 您的系统中存在老版本的fuse,请先使用相关的包管理器卸载,再重新安装ossfs。 Q: ossfs工作不正常,如何debug? 您可以使用在挂载时,加上-d -o f2参数,ossfs会把日志写入到系统日志中。在centos系统中,在/var/log/messages中。 您也可以在挂载时使用-f -d -o f2参数,ossfs会把日志输出到屏幕上。 Q: 为什么我在mount时遇到 ossfs: unable to access MOUNTPOINT /tmp/ossfs: Transport endpoint is not connected这样的错误? 请先umount对应的目录。 请检查您在使用ossfs挂载时,填入的url参数是否正确,是否和bucket/access key id/access key secret匹配。 特别注意:url中不包含bucket的名字。例如:您在oss控制台中看到bucket的域名是这样的:ossfs-test-1.oss-cn-hangzhou.aliyuncs.com。那么填入的url则是:http://oss-cn-hangzhou.aliyuncs.com。 Q: ossfs提示ossfs: unable to access MOUNTPOINT /tmp/odat: No such file or directory 这是您未创建该目录导致的,在挂载前需要创建对应目录。 Q: 我把bucket挂载到本地后,ls目录,却收到operation not permitted错误,这是为什么? 请检查您的bucket中,是否包含目录名含有不可见字符的OSS object。文件系统对文件/目录名有更严格的限制,因此会收到上述错误。使用其他工具对这些object重命名后,ls就能正确显示目录内容了。 Q: 我的一个目录下有非常多的文件,为什么ls该目录很慢? 假设一个目录下有n个文件,那么ls该目录至少需要n次OSS http requests。在文件非常多的时候,这可能造成严重的性能问题。 您可以采用下面两个办法优化: 通过-omax_stat_cache_size=xxx参数增大stat cache的size,这样第一次ls会较慢,但是后续的ls就快了,因为文件的元数据都在本地cache中。默认这个值是1000,大约消耗4MB内存,请根据您机器内存大小调整为合适的值。 使用ls -f命令,这个命令会消除与OSS的n次http请求。 具体参见issue 13。 Q: ossfs挂载时如何设置权限? 如果要允许其他用户访问挂载文件夹,可以在运行ossfs的时候指定allow_other参数: ossfs your_bucket your_mount_point -ourl=your_endpoint -o allow_other 为什么使用allow_other参数,仍然不能访问文件? 注意:allow_other是赋予挂载目录其他用户访问的权限,不是里面的文件!如果您要更改文件夹中的文件,请用chmod命令。 allow_other默认赋予挂载目录777权限,我想让挂载目录的权限为770,该怎么办? 可以通过umask来设置,参见这里。 Q: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user: 方法一: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user,则需要以user的身份创建挂载文件夹和使用ossfs: sudo -u user mkdir /tmp/ossfs sudo -u user ossfs bucket-name /tmp/ossfs 方法二: 首先通过id命令获得指定用户的uid/gid信息。例如获取www用户的uid/gid信息:id www;然后挂载时指定uid/gid参数: ossfs your_bucket your_mountpoint -ourl=your_url -ouid=your_uid -ogid=your_gid 注意:uid/gid都是数字。 Q: 我不是root用户,如何umount ossfs挂载的目录 fusermount -u your_mountpoint Q: 如何开机自动挂载ossfs? Step 1 首先请参考使用说明,把bucket name,access key id/secret等信息写入/etc/passwd-ossfs,并将该文件权限修改为640。 echo your_bucket_name:your_access_key_id:your_access_key_secret > /etc/passwd-ossfs chmod 640 /etc/passwd-ossfs Step 2 接下来针对不同的系统版本,设置方式有所不同 Step 2A 通过fstab的方式自动mount(适用于ubuntu14.04, centos6.5) 在/etc/fstab中加入下面的命令 ossfs#your_bucket_name your_mount_point fuse _netdev,url=your_url,allow_other 0 0 其中上述命令中的your_xxx信息需要根据您的bucket name等信息填入。 保存/etc/fstab文件。执行mount -a命令,如果没有报错,则说明设置正常。 到这一步,ubuntu14.04就能自动挂载了。centos6.5还需要执行下面的命令: chkconfig netfs on Step 2B 通过开机自启动脚本mount(适用于centos7.0及以上的系统) 在/etc/init.d/目录下建立文件ossfs,把模板文件中的内容拷贝到这个新文件中。并将其中的your_xxx内容改成您自己的信息。 执行命令:chmod a+x /etc/init.d/ossfs 上述命令是把新建立的ossfs脚本赋予可执行权限。您可以执行该脚本,如果脚本文件内容无误,那么此时oss中的bucket已经挂载到您指定的目录下了。 执行命令:chkconfig ossfs on 上述命令是把ossfs启动脚本作为其他服务,开机自动启动。 好了,现在ossfs就可以开机自动挂载了。总结起来,如果您是ubuntu14.04和centos6.5,您需要执行Step 1 + Step 2A;如果您是centos7.0系统,您需要执行Step 1 + Step 2B。 Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令 Q: 我需要以www用户挂载ossfs,此时如何设置开机自动挂载? 参照上面的问题的解答,Step 1照做,对Step 2B稍加修改,修改/etc/init.d/ossfs中的命令为: sudo -u www ossfs your_bucket your_mountpoint -ourl=your_url 设置自启动脚本中允许使用sudo,编辑/etc/sudoers,将其中的Defaults requiretty这行改为#Defaults requiretty(注释掉) Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令。 Q: 使用ECS挂载ossfs,如何避免因后台程序扫描文件而产生费用? 程序扫描ossfs挂载的目录,会转换成向OSS的请求,如果请求次数很多,会产生费用(1分钱/1万次)。如果是updatedb,可以通过修改/etc/updatedb.conf让它跳过。具体做法是: 在PRUNEFS =后面加上fuse.ossfs 在PRUNEPATHS =后面加上挂载的目录 如何确定是哪个进程扫了我的目录? 首先安装auditd: sudo apt-get install auditd 启动auditd: sudo service auditd start 设置监视挂载目录: auditctl -w /mnt/ossfs 在auditlog中可以查看是哪些进程访问了这个目录:ausearch -i | grep /mnt/ossfs Q: 使用ossfs上传到OSS的文件Content-Type全是”application/octet-stream”是怎么回事? ossfs通过查询/etc/mime.types中的内容来确定文件的Content-Type,请检查这个文件是否存在,如果不存在,则需要添加: 对于ubuntu可以通过sudo apt-get install mime-support来添加 对于centos可以通过sudo yum install mailcap来添加 也可以手动添加,每种格式一行,每行格式为:application/javascript js Q: 如何使用supervisor启动ossfs? 安装supervisor,在ubuntu中执行sudo apt-get install supervisor 建立一个目录,编辑ossfs的启动脚本:mkdir /root/ossfs_scripts vi /root/ossfs_scripts/start_ossfs.sh写入如下数据:# 卸载 fusermount -u /mnt/ossfs # 重新挂载,必须要增加-f参数运行ossfs,让ossfs在前台运行 exec ossfs my-bucket my-mount-point -ourl=my-oss-endpoint -f 编辑/etc/supervisor/supervisord.conf,在最后加入下面一段:[program:ossfs] command=bash /root/ossfs_scripts/start_ossfs.sh logfile=/var/log/ossfs.log log_stdout=true log_stderr=true logfile_maxbytes=1MB logfile_backups=10 运行supervisor:supervisordsupervisord 确认一切正常:ps aux | grep supervisor # 应该能看到supervisor进程 ps aux | grep ossfs # 应该能看到ossfs进程 kill -9 ossfs # 杀掉ossfs进程,supervisor应该会重启它, 不要使用killall, 因为killall发送SIGTERM,进程正常退出,supervisor不再去重新运行ossfs ps aux | grep ossfs # 应该能看到ossfs进程如果出错,请检查/var/log/supervisor/supervisord.log和/var/log/ossfs.log。 Q: 遇到”fuse: warning: library too old, some operations may not work”怎么办? 出现的原因是:ossfs编译时所使用的libfuse版本 比运行时链接到的libfuse版本高。这往往是用户自行安装了libfuse导致的。使用我们提供的rpm包安装ossfs,无需再安装libfuse。 在CentOS-5.x和CentOS-6.x上我们提供的rpm包里包含了libfuse-2.8.4,如果在运行的时候环境中有libfuse-2.8.3,并且ossfs被链接到了旧版本的fuse上,就会出现上述warning。 如何确认ossfs运行时链接的fuse版本? 运行ldd $(which ossfs) | grep fuse 例如结果是”/lib64/libfuse.so.2”,那么通过ls -l /lib64/libfuse*可以看到fuse的版本 如何让ossfs链接到正确的版本? 首先通过rpm -ql ossfs | grep fuse找到libfuse的目录 例如结果是”/usr/lib/libfuse.so.2”,则通过LD_LIBRARY_PATH=/usr/lib ossfs …运行ossfs 我能忽略这个WARNING吗? 最好不要,见这个bug Q: 为什么用ossfs看到的文件信息(例如大小)与其他工具看到的不一致? 因为ossfs默认会缓存文件的元信息(包括大小/权限等),这样就不需要每次ls的时候向OSS发送请求,加快速度。 如果用户通过其他程序(例如SDK/官网控制台/osscmd等)对文件进行了修改,那么有可能在ossfs中看到的文件信息 没有及时更新。 如果想禁止ossfs的缓存,那么可以在挂载的时候加上如下参数:-omax_stat_cache_size=0

2019-12-01 23:15:18 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 Q: ossfs适合什么样的程序? ossfs能把oss bucket挂载到本地,如果您使用的软件没有支持OSS,但您又想让数据能自动同步到OSS,那么ossfs是很好的选择。 Q: ossfs有什么局限性? 由于数据需要经过网络同步到云端,ossfs在性能和功能上可能与本地文件系统有差距。如果您想让数据库等对io要求很高的应用跑在ossfs挂载的盘上,请慎重考虑。和本地文件系统具体差异: 随机或者追加写文件会导致整个文件的重写。 元数据操作,例如list directory,性能较差,因为需要远程访问OSS服务器。 文件/文件夹的rename操作不是原子的。 多个客户端挂载同一个oss bucket时,依赖用户自行协调各个客户端的行为。例如避免多个客户端写同一个文件等等。 不支持hard link。 Q: ossfs一定要阿里云的机器才能用么? ossfs不限制一定要阿里云的内网才可以使用,外网机器依然可以使用。 Q: ossfs能不能同时挂载多个OSS bucket? 可以的,在passwd-ossfs文件中写入多个OSS配置信息即可。支持不同帐号的OSS。 Q: 我在yum/apt-get安装ossfs,遇到conflicts with file from package fuse-devel的错误,请问是怎么回事? 您的系统中存在老版本的fuse,请先使用相关的包管理器卸载,再重新安装ossfs。 Q: ossfs工作不正常,如何debug? 您可以使用在挂载时,加上-d -o f2参数,ossfs会把日志写入到系统日志中。在centos系统中,在/var/log/messages中。 您也可以在挂载时使用-f -d -o f2参数,ossfs会把日志输出到屏幕上。 Q: 为什么我在mount时遇到 ossfs: unable to access MOUNTPOINT /tmp/ossfs: Transport endpoint is not connected这样的错误? 请先umount对应的目录。 请检查您在使用ossfs挂载时,填入的url参数是否正确,是否和bucket/access key id/access key secret匹配。 特别注意:url中不包含bucket的名字。例如:您在oss控制台中看到bucket的域名是这样的:ossfs-test-1.oss-cn-hangzhou.aliyuncs.com。那么填入的url则是:http://oss-cn-hangzhou.aliyuncs.com。 Q: ossfs提示ossfs: unable to access MOUNTPOINT /tmp/odat: No such file or directory 这是您未创建该目录导致的,在挂载前需要创建对应目录。 Q: 我把bucket挂载到本地后,ls目录,却收到operation not permitted错误,这是为什么? 请检查您的bucket中,是否包含目录名含有不可见字符的OSS object。文件系统对文件/目录名有更严格的限制,因此会收到上述错误。使用其他工具对这些object重命名后,ls就能正确显示目录内容了。 Q: 我的一个目录下有非常多的文件,为什么ls该目录很慢? 假设一个目录下有n个文件,那么ls该目录至少需要n次OSS http requests。在文件非常多的时候,这可能造成严重的性能问题。 您可以采用下面两个办法优化: 通过-omax_stat_cache_size=xxx参数增大stat cache的size,这样第一次ls会较慢,但是后续的ls就快了,因为文件的元数据都在本地cache中。默认这个值是1000,大约消耗4MB内存,请根据您机器内存大小调整为合适的值。 使用ls -f命令,这个命令会消除与OSS的n次http请求。 具体参见issue 13。 Q: ossfs挂载时如何设置权限? 如果要允许其他用户访问挂载文件夹,可以在运行ossfs的时候指定allow_other参数: ossfs your_bucket your_mount_point -ourl=your_endpoint -o allow_other 为什么使用allow_other参数,仍然不能访问文件? 注意:allow_other是赋予挂载目录其他用户访问的权限,不是里面的文件!如果您要更改文件夹中的文件,请用chmod命令。 allow_other默认赋予挂载目录777权限,我想让挂载目录的权限为770,该怎么办? 可以通过umask来设置,参见这里。 Q: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user: 方法一: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user,则需要以user的身份创建挂载文件夹和使用ossfs: sudo -u user mkdir /tmp/ossfs sudo -u user ossfs bucket-name /tmp/ossfs 方法二: 首先通过id命令获得指定用户的uid/gid信息。例如获取www用户的uid/gid信息:id www;然后挂载时指定uid/gid参数: ossfs your_bucket your_mountpoint -ourl=your_url -ouid=your_uid -ogid=your_gid 注意:uid/gid都是数字。 Q: 我不是root用户,如何umount ossfs挂载的目录 fusermount -u your_mountpoint Q: 如何开机自动挂载ossfs? Step 1 首先请参考使用说明,把bucket name,access key id/secret等信息写入/etc/passwd-ossfs,并将该文件权限修改为640。 echo your_bucket_name:your_access_key_id:your_access_key_secret > /etc/passwd-ossfs chmod 640 /etc/passwd-ossfs Step 2 接下来针对不同的系统版本,设置方式有所不同 Step 2A 通过fstab的方式自动mount(适用于ubuntu14.04, centos6.5) 在/etc/fstab中加入下面的命令 ossfs#your_bucket_name your_mount_point fuse _netdev,url=your_url,allow_other 0 0 其中上述命令中的your_xxx信息需要根据您的bucket name等信息填入。 保存/etc/fstab文件。执行mount -a命令,如果没有报错,则说明设置正常。 到这一步,ubuntu14.04就能自动挂载了。centos6.5还需要执行下面的命令: chkconfig netfs on Step 2B 通过开机自启动脚本mount(适用于centos7.0及以上的系统) 在/etc/init.d/目录下建立文件ossfs,把模板文件中的内容拷贝到这个新文件中。并将其中的your_xxx内容改成您自己的信息。 执行命令:chmod a+x /etc/init.d/ossfs 上述命令是把新建立的ossfs脚本赋予可执行权限。您可以执行该脚本,如果脚本文件内容无误,那么此时oss中的bucket已经挂载到您指定的目录下了。 执行命令:chkconfig ossfs on 上述命令是把ossfs启动脚本作为其他服务,开机自动启动。 好了,现在ossfs就可以开机自动挂载了。总结起来,如果您是ubuntu14.04和centos6.5,您需要执行Step 1 + Step 2A;如果您是centos7.0系统,您需要执行Step 1 + Step 2B。 Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令 Q: 我需要以www用户挂载ossfs,此时如何设置开机自动挂载? 参照上面的问题的解答,Step 1照做,对Step 2B稍加修改,修改/etc/init.d/ossfs中的命令为: sudo -u www ossfs your_bucket your_mountpoint -ourl=your_url 设置自启动脚本中允许使用sudo,编辑/etc/sudoers,将其中的Defaults requiretty这行改为#Defaults requiretty(注释掉) Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令。 Q: 使用ECS挂载ossfs,如何避免因后台程序扫描文件而产生费用? 程序扫描ossfs挂载的目录,会转换成向OSS的请求,如果请求次数很多,会产生费用(1分钱/1万次)。如果是updatedb,可以通过修改/etc/updatedb.conf让它跳过。具体做法是: 在PRUNEFS =后面加上fuse.ossfs 在PRUNEPATHS =后面加上挂载的目录 如何确定是哪个进程扫了我的目录? 首先安装auditd: sudo apt-get install auditd 启动auditd: sudo service auditd start 设置监视挂载目录: auditctl -w /mnt/ossfs 在auditlog中可以查看是哪些进程访问了这个目录:ausearch -i | grep /mnt/ossfs Q: 使用ossfs上传到OSS的文件Content-Type全是”application/octet-stream”是怎么回事? ossfs通过查询/etc/mime.types中的内容来确定文件的Content-Type,请检查这个文件是否存在,如果不存在,则需要添加: 对于ubuntu可以通过sudo apt-get install mime-support来添加 对于centos可以通过sudo yum install mailcap来添加 也可以手动添加,每种格式一行,每行格式为:application/javascript js Q: 如何使用supervisor启动ossfs? 安装supervisor,在ubuntu中执行sudo apt-get install supervisor 建立一个目录,编辑ossfs的启动脚本:mkdir /root/ossfs_scripts vi /root/ossfs_scripts/start_ossfs.sh写入如下数据:# 卸载 fusermount -u /mnt/ossfs # 重新挂载,必须要增加-f参数运行ossfs,让ossfs在前台运行 exec ossfs my-bucket my-mount-point -ourl=my-oss-endpoint -f 编辑/etc/supervisor/supervisord.conf,在最后加入下面一段:[program:ossfs] command=bash /root/ossfs_scripts/start_ossfs.sh logfile=/var/log/ossfs.log log_stdout=true log_stderr=true logfile_maxbytes=1MB logfile_backups=10 运行supervisor:supervisordsupervisord 确认一切正常:ps aux | grep supervisor # 应该能看到supervisor进程 ps aux | grep ossfs # 应该能看到ossfs进程 kill -9 ossfs # 杀掉ossfs进程,supervisor应该会重启它, 不要使用killall, 因为killall发送SIGTERM,进程正常退出,supervisor不再去重新运行ossfs ps aux | grep ossfs # 应该能看到ossfs进程如果出错,请检查/var/log/supervisor/supervisord.log和/var/log/ossfs.log。 Q: 遇到”fuse: warning: library too old, some operations may not work”怎么办? 出现的原因是:ossfs编译时所使用的libfuse版本 比运行时链接到的libfuse版本高。这往往是用户自行安装了libfuse导致的。使用我们提供的rpm包安装ossfs,无需再安装libfuse。 在CentOS-5.x和CentOS-6.x上我们提供的rpm包里包含了libfuse-2.8.4,如果在运行的时候环境中有libfuse-2.8.3,并且ossfs被链接到了旧版本的fuse上,就会出现上述warning。 如何确认ossfs运行时链接的fuse版本? 运行ldd $(which ossfs) | grep fuse 例如结果是”/lib64/libfuse.so.2”,那么通过ls -l /lib64/libfuse*可以看到fuse的版本 如何让ossfs链接到正确的版本? 首先通过rpm -ql ossfs | grep fuse找到libfuse的目录 例如结果是”/usr/lib/libfuse.so.2”,则通过LD_LIBRARY_PATH=/usr/lib ossfs …运行ossfs 我能忽略这个WARNING吗? 最好不要,见这个bug Q: 为什么用ossfs看到的文件信息(例如大小)与其他工具看到的不一致? 因为ossfs默认会缓存文件的元信息(包括大小/权限等),这样就不需要每次ls的时候向OSS发送请求,加快速度。 如果用户通过其他程序(例如SDK/官网控制台/osscmd等)对文件进行了修改,那么有可能在ossfs中看到的文件信息 没有及时更新。 如果想禁止ossfs的缓存,那么可以在挂载的时候加上如下参数:-omax_stat_cache_size=0

2019-12-01 23:15:17 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 Q: ossfs适合什么样的程序? ossfs能把oss bucket挂载到本地,如果您使用的软件没有支持OSS,但您又想让数据能自动同步到OSS,那么ossfs是很好的选择。 Q: ossfs有什么局限性? 由于数据需要经过网络同步到云端,ossfs在性能和功能上可能与本地文件系统有差距。如果您想让数据库等对io要求很高的应用跑在ossfs挂载的盘上,请慎重考虑。和本地文件系统具体差异: 随机或者追加写文件会导致整个文件的重写。 元数据操作,例如list directory,性能较差,因为需要远程访问OSS服务器。 文件/文件夹的rename操作不是原子的。 多个客户端挂载同一个oss bucket时,依赖用户自行协调各个客户端的行为。例如避免多个客户端写同一个文件等等。 不支持hard link。 Q: ossfs一定要阿里云的机器才能用么? ossfs不限制一定要阿里云的内网才可以使用,外网机器依然可以使用。 Q: ossfs能不能同时挂载多个OSS bucket? 可以的,在passwd-ossfs文件中写入多个OSS配置信息即可。支持不同帐号的OSS。 Q: 我在yum/apt-get安装ossfs,遇到conflicts with file from package fuse-devel的错误,请问是怎么回事? 您的系统中存在老版本的fuse,请先使用相关的包管理器卸载,再重新安装ossfs。 Q: ossfs工作不正常,如何debug? 您可以使用在挂载时,加上-d -o f2参数,ossfs会把日志写入到系统日志中。在centos系统中,在/var/log/messages中。 您也可以在挂载时使用-f -d -o f2参数,ossfs会把日志输出到屏幕上。 Q: 为什么我在mount时遇到 ossfs: unable to access MOUNTPOINT /tmp/ossfs: Transport endpoint is not connected这样的错误? 请先umount对应的目录。 请检查您在使用ossfs挂载时,填入的url参数是否正确,是否和bucket/access key id/access key secret匹配。 特别注意:url中不包含bucket的名字。例如:您在oss控制台中看到bucket的域名是这样的:ossfs-test-1.oss-cn-hangzhou.aliyuncs.com。那么填入的url则是:http://oss-cn-hangzhou.aliyuncs.com。 Q: ossfs提示ossfs: unable to access MOUNTPOINT /tmp/odat: No such file or directory 这是您未创建该目录导致的,在挂载前需要创建对应目录。 Q: 我把bucket挂载到本地后,ls目录,却收到operation not permitted错误,这是为什么? 请检查您的bucket中,是否包含目录名含有不可见字符的OSS object。文件系统对文件/目录名有更严格的限制,因此会收到上述错误。使用其他工具对这些object重命名后,ls就能正确显示目录内容了。 Q: 我的一个目录下有非常多的文件,为什么ls该目录很慢? 假设一个目录下有n个文件,那么ls该目录至少需要n次OSS http requests。在文件非常多的时候,这可能造成严重的性能问题。 您可以采用下面两个办法优化: 通过-omax_stat_cache_size=xxx参数增大stat cache的size,这样第一次ls会较慢,但是后续的ls就快了,因为文件的元数据都在本地cache中。默认这个值是1000,大约消耗4MB内存,请根据您机器内存大小调整为合适的值。 使用ls -f命令,这个命令会消除与OSS的n次http请求。 具体参见issue 13。 Q: ossfs挂载时如何设置权限? 如果要允许其他用户访问挂载文件夹,可以在运行ossfs的时候指定allow_other参数: ossfs your_bucket your_mount_point -ourl=your_endpoint -o allow_other 为什么使用allow_other参数,仍然不能访问文件? 注意:allow_other是赋予挂载目录其他用户访问的权限,不是里面的文件!如果您要更改文件夹中的文件,请用chmod命令。 allow_other默认赋予挂载目录777权限,我想让挂载目录的权限为770,该怎么办? 可以通过umask来设置,参见这里。 Q: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user: 方法一: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user,则需要以user的身份创建挂载文件夹和使用ossfs: sudo -u user mkdir /tmp/ossfs sudo -u user ossfs bucket-name /tmp/ossfs 方法二: 首先通过id命令获得指定用户的uid/gid信息。例如获取www用户的uid/gid信息:id www;然后挂载时指定uid/gid参数: ossfs your_bucket your_mountpoint -ourl=your_url -ouid=your_uid -ogid=your_gid 注意:uid/gid都是数字。 Q: 我不是root用户,如何umount ossfs挂载的目录 fusermount -u your_mountpoint Q: 如何开机自动挂载ossfs? Step 1 首先请参考使用说明,把bucket name,access key id/secret等信息写入/etc/passwd-ossfs,并将该文件权限修改为640。 echo your_bucket_name:your_access_key_id:your_access_key_secret > /etc/passwd-ossfs chmod 640 /etc/passwd-ossfs Step 2 接下来针对不同的系统版本,设置方式有所不同 Step 2A 通过fstab的方式自动mount(适用于ubuntu14.04, centos6.5) 在/etc/fstab中加入下面的命令 ossfs#your_bucket_name your_mount_point fuse _netdev,url=your_url,allow_other 0 0 其中上述命令中的your_xxx信息需要根据您的bucket name等信息填入。 保存/etc/fstab文件。执行mount -a命令,如果没有报错,则说明设置正常。 到这一步,ubuntu14.04就能自动挂载了。centos6.5还需要执行下面的命令: chkconfig netfs on Step 2B 通过开机自启动脚本mount(适用于centos7.0及以上的系统) 在/etc/init.d/目录下建立文件ossfs,把模板文件中的内容拷贝到这个新文件中。并将其中的your_xxx内容改成您自己的信息。 执行命令:chmod a+x /etc/init.d/ossfs 上述命令是把新建立的ossfs脚本赋予可执行权限。您可以执行该脚本,如果脚本文件内容无误,那么此时oss中的bucket已经挂载到您指定的目录下了。 执行命令:chkconfig ossfs on 上述命令是把ossfs启动脚本作为其他服务,开机自动启动。 好了,现在ossfs就可以开机自动挂载了。总结起来,如果您是ubuntu14.04和centos6.5,您需要执行Step 1 + Step 2A;如果您是centos7.0系统,您需要执行Step 1 + Step 2B。 Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令 Q: 我需要以www用户挂载ossfs,此时如何设置开机自动挂载? 参照上面的问题的解答,Step 1照做,对Step 2B稍加修改,修改/etc/init.d/ossfs中的命令为: sudo -u www ossfs your_bucket your_mountpoint -ourl=your_url 设置自启动脚本中允许使用sudo,编辑/etc/sudoers,将其中的Defaults requiretty这行改为#Defaults requiretty(注释掉) Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令。 Q: 使用ECS挂载ossfs,如何避免因后台程序扫描文件而产生费用? 程序扫描ossfs挂载的目录,会转换成向OSS的请求,如果请求次数很多,会产生费用(1分钱/1万次)。如果是updatedb,可以通过修改/etc/updatedb.conf让它跳过。具体做法是: 在PRUNEFS =后面加上fuse.ossfs 在PRUNEPATHS =后面加上挂载的目录 如何确定是哪个进程扫了我的目录? 首先安装auditd: sudo apt-get install auditd 启动auditd: sudo service auditd start 设置监视挂载目录: auditctl -w /mnt/ossfs 在auditlog中可以查看是哪些进程访问了这个目录:ausearch -i | grep /mnt/ossfs Q: 使用ossfs上传到OSS的文件Content-Type全是”application/octet-stream”是怎么回事? ossfs通过查询/etc/mime.types中的内容来确定文件的Content-Type,请检查这个文件是否存在,如果不存在,则需要添加: 对于ubuntu可以通过sudo apt-get install mime-support来添加 对于centos可以通过sudo yum install mailcap来添加 也可以手动添加,每种格式一行,每行格式为:application/javascript js Q: 如何使用supervisor启动ossfs? 安装supervisor,在ubuntu中执行sudo apt-get install supervisor 建立一个目录,编辑ossfs的启动脚本:mkdir /root/ossfs_scripts vi /root/ossfs_scripts/start_ossfs.sh写入如下数据:# 卸载 fusermount -u /mnt/ossfs # 重新挂载,必须要增加-f参数运行ossfs,让ossfs在前台运行 exec ossfs my-bucket my-mount-point -ourl=my-oss-endpoint -f 编辑/etc/supervisor/supervisord.conf,在最后加入下面一段:[program:ossfs] command=bash /root/ossfs_scripts/start_ossfs.sh logfile=/var/log/ossfs.log log_stdout=true log_stderr=true logfile_maxbytes=1MB logfile_backups=10 运行supervisor:supervisordsupervisord 确认一切正常:ps aux | grep supervisor # 应该能看到supervisor进程 ps aux | grep ossfs # 应该能看到ossfs进程 kill -9 ossfs # 杀掉ossfs进程,supervisor应该会重启它, 不要使用killall, 因为killall发送SIGTERM,进程正常退出,supervisor不再去重新运行ossfs ps aux | grep ossfs # 应该能看到ossfs进程如果出错,请检查/var/log/supervisor/supervisord.log和/var/log/ossfs.log。 Q: 遇到”fuse: warning: library too old, some operations may not work”怎么办? 出现的原因是:ossfs编译时所使用的libfuse版本 比运行时链接到的libfuse版本高。这往往是用户自行安装了libfuse导致的。使用我们提供的rpm包安装ossfs,无需再安装libfuse。 在CentOS-5.x和CentOS-6.x上我们提供的rpm包里包含了libfuse-2.8.4,如果在运行的时候环境中有libfuse-2.8.3,并且ossfs被链接到了旧版本的fuse上,就会出现上述warning。 如何确认ossfs运行时链接的fuse版本? 运行ldd $(which ossfs) | grep fuse 例如结果是”/lib64/libfuse.so.2”,那么通过ls -l /lib64/libfuse*可以看到fuse的版本 如何让ossfs链接到正确的版本? 首先通过rpm -ql ossfs | grep fuse找到libfuse的目录 例如结果是”/usr/lib/libfuse.so.2”,则通过LD_LIBRARY_PATH=/usr/lib ossfs …运行ossfs 我能忽略这个WARNING吗? 最好不要,见这个bug Q: 为什么用ossfs看到的文件信息(例如大小)与其他工具看到的不一致? 因为ossfs默认会缓存文件的元信息(包括大小/权限等),这样就不需要每次ls的时候向OSS发送请求,加快速度。 如果用户通过其他程序(例如SDK/官网控制台/osscmd等)对文件进行了修改,那么有可能在ossfs中看到的文件信息 没有及时更新。 如果想禁止ossfs的缓存,那么可以在挂载的时候加上如下参数:-omax_stat_cache_size=0

2019-12-01 23:15:16 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 Q: ossfs适合什么样的程序? ossfs能把oss bucket挂载到本地,如果您使用的软件没有支持OSS,但您又想让数据能自动同步到OSS,那么ossfs是很好的选择。 Q: ossfs有什么局限性? 由于数据需要经过网络同步到云端,ossfs在性能和功能上可能与本地文件系统有差距。如果您想让数据库等对io要求很高的应用跑在ossfs挂载的盘上,请慎重考虑。和本地文件系统具体差异: 随机或者追加写文件会导致整个文件的重写。 元数据操作,例如list directory,性能较差,因为需要远程访问OSS服务器。 文件/文件夹的rename操作不是原子的。 多个客户端挂载同一个oss bucket时,依赖用户自行协调各个客户端的行为。例如避免多个客户端写同一个文件等等。 不支持hard link。 Q: ossfs一定要阿里云的机器才能用么? ossfs不限制一定要阿里云的内网才可以使用,外网机器依然可以使用。 Q: ossfs能不能同时挂载多个OSS bucket? 可以的,在passwd-ossfs文件中写入多个OSS配置信息即可。支持不同帐号的OSS。 Q: 我在yum/apt-get安装ossfs,遇到conflicts with file from package fuse-devel的错误,请问是怎么回事? 您的系统中存在老版本的fuse,请先使用相关的包管理器卸载,再重新安装ossfs。 Q: ossfs工作不正常,如何debug? 您可以使用在挂载时,加上-d -o f2参数,ossfs会把日志写入到系统日志中。在centos系统中,在/var/log/messages中。 您也可以在挂载时使用-f -d -o f2参数,ossfs会把日志输出到屏幕上。 Q: 为什么我在mount时遇到 ossfs: unable to access MOUNTPOINT /tmp/ossfs: Transport endpoint is not connected这样的错误? 请先umount对应的目录。 请检查您在使用ossfs挂载时,填入的url参数是否正确,是否和bucket/access key id/access key secret匹配。 特别注意:url中不包含bucket的名字。例如:您在oss控制台中看到bucket的域名是这样的:ossfs-test-1.oss-cn-hangzhou.aliyuncs.com。那么填入的url则是:http://oss-cn-hangzhou.aliyuncs.com。 Q: ossfs提示ossfs: unable to access MOUNTPOINT /tmp/odat: No such file or directory 这是您未创建该目录导致的,在挂载前需要创建对应目录。 Q: 我把bucket挂载到本地后,ls目录,却收到operation not permitted错误,这是为什么? 请检查您的bucket中,是否包含目录名含有不可见字符的OSS object。文件系统对文件/目录名有更严格的限制,因此会收到上述错误。使用其他工具对这些object重命名后,ls就能正确显示目录内容了。 Q: 我的一个目录下有非常多的文件,为什么ls该目录很慢? 假设一个目录下有n个文件,那么ls该目录至少需要n次OSS http requests。在文件非常多的时候,这可能造成严重的性能问题。 您可以采用下面两个办法优化: 通过-omax_stat_cache_size=xxx参数增大stat cache的size,这样第一次ls会较慢,但是后续的ls就快了,因为文件的元数据都在本地cache中。默认这个值是1000,大约消耗4MB内存,请根据您机器内存大小调整为合适的值。 使用ls -f命令,这个命令会消除与OSS的n次http请求。 具体参见issue 13。 Q: ossfs挂载时如何设置权限? 如果要允许其他用户访问挂载文件夹,可以在运行ossfs的时候指定allow_other参数: ossfs your_bucket your_mount_point -ourl=your_endpoint -o allow_other 为什么使用allow_other参数,仍然不能访问文件? 注意:allow_other是赋予挂载目录其他用户访问的权限,不是里面的文件!如果您要更改文件夹中的文件,请用chmod命令。 allow_other默认赋予挂载目录777权限,我想让挂载目录的权限为770,该怎么办? 可以通过umask来设置,参见这里。 Q: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user: 方法一: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user,则需要以user的身份创建挂载文件夹和使用ossfs: sudo -u user mkdir /tmp/ossfs sudo -u user ossfs bucket-name /tmp/ossfs 方法二: 首先通过id命令获得指定用户的uid/gid信息。例如获取www用户的uid/gid信息:id www;然后挂载时指定uid/gid参数: ossfs your_bucket your_mountpoint -ourl=your_url -ouid=your_uid -ogid=your_gid 注意:uid/gid都是数字。 Q: 我不是root用户,如何umount ossfs挂载的目录 fusermount -u your_mountpoint Q: 如何开机自动挂载ossfs? Step 1 首先请参考使用说明,把bucket name,access key id/secret等信息写入/etc/passwd-ossfs,并将该文件权限修改为640。 echo your_bucket_name:your_access_key_id:your_access_key_secret > /etc/passwd-ossfs chmod 640 /etc/passwd-ossfs Step 2 接下来针对不同的系统版本,设置方式有所不同 Step 2A 通过fstab的方式自动mount(适用于ubuntu14.04, centos6.5) 在/etc/fstab中加入下面的命令 ossfs#your_bucket_name your_mount_point fuse _netdev,url=your_url,allow_other 0 0 其中上述命令中的your_xxx信息需要根据您的bucket name等信息填入。 保存/etc/fstab文件。执行mount -a命令,如果没有报错,则说明设置正常。 到这一步,ubuntu14.04就能自动挂载了。centos6.5还需要执行下面的命令: chkconfig netfs on Step 2B 通过开机自启动脚本mount(适用于centos7.0及以上的系统) 在/etc/init.d/目录下建立文件ossfs,把模板文件中的内容拷贝到这个新文件中。并将其中的your_xxx内容改成您自己的信息。 执行命令:chmod a+x /etc/init.d/ossfs 上述命令是把新建立的ossfs脚本赋予可执行权限。您可以执行该脚本,如果脚本文件内容无误,那么此时oss中的bucket已经挂载到您指定的目录下了。 执行命令:chkconfig ossfs on 上述命令是把ossfs启动脚本作为其他服务,开机自动启动。 好了,现在ossfs就可以开机自动挂载了。总结起来,如果您是ubuntu14.04和centos6.5,您需要执行Step 1 + Step 2A;如果您是centos7.0系统,您需要执行Step 1 + Step 2B。 Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令 Q: 我需要以www用户挂载ossfs,此时如何设置开机自动挂载? 参照上面的问题的解答,Step 1照做,对Step 2B稍加修改,修改/etc/init.d/ossfs中的命令为: sudo -u www ossfs your_bucket your_mountpoint -ourl=your_url 设置自启动脚本中允许使用sudo,编辑/etc/sudoers,将其中的Defaults requiretty这行改为#Defaults requiretty(注释掉) Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令。 Q: 使用ECS挂载ossfs,如何避免因后台程序扫描文件而产生费用? 程序扫描ossfs挂载的目录,会转换成向OSS的请求,如果请求次数很多,会产生费用(1分钱/1万次)。如果是updatedb,可以通过修改/etc/updatedb.conf让它跳过。具体做法是: 在PRUNEFS =后面加上fuse.ossfs 在PRUNEPATHS =后面加上挂载的目录 如何确定是哪个进程扫了我的目录? 首先安装auditd: sudo apt-get install auditd 启动auditd: sudo service auditd start 设置监视挂载目录: auditctl -w /mnt/ossfs 在auditlog中可以查看是哪些进程访问了这个目录:ausearch -i | grep /mnt/ossfs Q: 使用ossfs上传到OSS的文件Content-Type全是”application/octet-stream”是怎么回事? ossfs通过查询/etc/mime.types中的内容来确定文件的Content-Type,请检查这个文件是否存在,如果不存在,则需要添加: 对于ubuntu可以通过sudo apt-get install mime-support来添加 对于centos可以通过sudo yum install mailcap来添加 也可以手动添加,每种格式一行,每行格式为:application/javascript js Q: 如何使用supervisor启动ossfs? 安装supervisor,在ubuntu中执行sudo apt-get install supervisor 建立一个目录,编辑ossfs的启动脚本:mkdir /root/ossfs_scripts vi /root/ossfs_scripts/start_ossfs.sh写入如下数据:# 卸载 fusermount -u /mnt/ossfs # 重新挂载,必须要增加-f参数运行ossfs,让ossfs在前台运行 exec ossfs my-bucket my-mount-point -ourl=my-oss-endpoint -f 编辑/etc/supervisor/supervisord.conf,在最后加入下面一段:[program:ossfs] command=bash /root/ossfs_scripts/start_ossfs.sh logfile=/var/log/ossfs.log log_stdout=true log_stderr=true logfile_maxbytes=1MB logfile_backups=10 运行supervisor:supervisordsupervisord 确认一切正常:ps aux | grep supervisor # 应该能看到supervisor进程 ps aux | grep ossfs # 应该能看到ossfs进程 kill -9 ossfs # 杀掉ossfs进程,supervisor应该会重启它, 不要使用killall, 因为killall发送SIGTERM,进程正常退出,supervisor不再去重新运行ossfs ps aux | grep ossfs # 应该能看到ossfs进程如果出错,请检查/var/log/supervisor/supervisord.log和/var/log/ossfs.log。 Q: 遇到”fuse: warning: library too old, some operations may not work”怎么办? 出现的原因是:ossfs编译时所使用的libfuse版本 比运行时链接到的libfuse版本高。这往往是用户自行安装了libfuse导致的。使用我们提供的rpm包安装ossfs,无需再安装libfuse。 在CentOS-5.x和CentOS-6.x上我们提供的rpm包里包含了libfuse-2.8.4,如果在运行的时候环境中有libfuse-2.8.3,并且ossfs被链接到了旧版本的fuse上,就会出现上述warning。 如何确认ossfs运行时链接的fuse版本? 运行ldd $(which ossfs) | grep fuse 例如结果是”/lib64/libfuse.so.2”,那么通过ls -l /lib64/libfuse*可以看到fuse的版本 如何让ossfs链接到正确的版本? 首先通过rpm -ql ossfs | grep fuse找到libfuse的目录 例如结果是”/usr/lib/libfuse.so.2”,则通过LD_LIBRARY_PATH=/usr/lib ossfs …运行ossfs 我能忽略这个WARNING吗? 最好不要,见这个bug Q: 为什么用ossfs看到的文件信息(例如大小)与其他工具看到的不一致? 因为ossfs默认会缓存文件的元信息(包括大小/权限等),这样就不需要每次ls的时候向OSS发送请求,加快速度。 如果用户通过其他程序(例如SDK/官网控制台/osscmd等)对文件进行了修改,那么有可能在ossfs中看到的文件信息 没有及时更新。 如果想禁止ossfs的缓存,那么可以在挂载的时候加上如下参数:-omax_stat_cache_size=0

2019-12-01 23:15:15 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 Q: ossfs适合什么样的程序? ossfs能把oss bucket挂载到本地,如果您使用的软件没有支持OSS,但您又想让数据能自动同步到OSS,那么ossfs是很好的选择。 Q: ossfs有什么局限性? 由于数据需要经过网络同步到云端,ossfs在性能和功能上可能与本地文件系统有差距。如果您想让数据库等对io要求很高的应用跑在ossfs挂载的盘上,请慎重考虑。和本地文件系统具体差异: 随机或者追加写文件会导致整个文件的重写。 元数据操作,例如list directory,性能较差,因为需要远程访问OSS服务器。 文件/文件夹的rename操作不是原子的。 多个客户端挂载同一个oss bucket时,依赖用户自行协调各个客户端的行为。例如避免多个客户端写同一个文件等等。 不支持hard link。 Q: ossfs一定要阿里云的机器才能用么? ossfs不限制一定要阿里云的内网才可以使用,外网机器依然可以使用。 Q: ossfs能不能同时挂载多个OSS bucket? 可以的,在passwd-ossfs文件中写入多个OSS配置信息即可。支持不同帐号的OSS。 Q: 我在yum/apt-get安装ossfs,遇到conflicts with file from package fuse-devel的错误,请问是怎么回事? 您的系统中存在老版本的fuse,请先使用相关的包管理器卸载,再重新安装ossfs。 Q: ossfs工作不正常,如何debug? 您可以使用在挂载时,加上-d -o f2参数,ossfs会把日志写入到系统日志中。在centos系统中,在/var/log/messages中。 您也可以在挂载时使用-f -d -o f2参数,ossfs会把日志输出到屏幕上。 Q: 为什么我在mount时遇到 ossfs: unable to access MOUNTPOINT /tmp/ossfs: Transport endpoint is not connected这样的错误? 请先umount对应的目录。 请检查您在使用ossfs挂载时,填入的url参数是否正确,是否和bucket/access key id/access key secret匹配。 特别注意:url中不包含bucket的名字。例如:您在oss控制台中看到bucket的域名是这样的:ossfs-test-1.oss-cn-hangzhou.aliyuncs.com。那么填入的url则是:http://oss-cn-hangzhou.aliyuncs.com。 Q: ossfs提示ossfs: unable to access MOUNTPOINT /tmp/odat: No such file or directory 这是您未创建该目录导致的,在挂载前需要创建对应目录。 Q: 我把bucket挂载到本地后,ls目录,却收到operation not permitted错误,这是为什么? 请检查您的bucket中,是否包含目录名含有不可见字符的OSS object。文件系统对文件/目录名有更严格的限制,因此会收到上述错误。使用其他工具对这些object重命名后,ls就能正确显示目录内容了。 Q: 我的一个目录下有非常多的文件,为什么ls该目录很慢? 假设一个目录下有n个文件,那么ls该目录至少需要n次OSS http requests。在文件非常多的时候,这可能造成严重的性能问题。 您可以采用下面两个办法优化: 通过-omax_stat_cache_size=xxx参数增大stat cache的size,这样第一次ls会较慢,但是后续的ls就快了,因为文件的元数据都在本地cache中。默认这个值是1000,大约消耗4MB内存,请根据您机器内存大小调整为合适的值。 使用ls -f命令,这个命令会消除与OSS的n次http请求。 具体参见issue 13。 Q: ossfs挂载时如何设置权限? 如果要允许其他用户访问挂载文件夹,可以在运行ossfs的时候指定allow_other参数: ossfs your_bucket your_mount_point -ourl=your_endpoint -o allow_other 为什么使用allow_other参数,仍然不能访问文件? 注意:allow_other是赋予挂载目录其他用户访问的权限,不是里面的文件!如果您要更改文件夹中的文件,请用chmod命令。 allow_other默认赋予挂载目录777权限,我想让挂载目录的权限为770,该怎么办? 可以通过umask来设置,参见这里。 Q: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user: 方法一: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user,则需要以user的身份创建挂载文件夹和使用ossfs: sudo -u user mkdir /tmp/ossfs sudo -u user ossfs bucket-name /tmp/ossfs 方法二: 首先通过id命令获得指定用户的uid/gid信息。例如获取www用户的uid/gid信息:id www;然后挂载时指定uid/gid参数: ossfs your_bucket your_mountpoint -ourl=your_url -ouid=your_uid -ogid=your_gid 注意:uid/gid都是数字。 Q: 我不是root用户,如何umount ossfs挂载的目录 fusermount -u your_mountpoint Q: 如何开机自动挂载ossfs? Step 1 首先请参考使用说明,把bucket name,access key id/secret等信息写入/etc/passwd-ossfs,并将该文件权限修改为640。 echo your_bucket_name:your_access_key_id:your_access_key_secret > /etc/passwd-ossfs chmod 640 /etc/passwd-ossfs Step 2 接下来针对不同的系统版本,设置方式有所不同 Step 2A 通过fstab的方式自动mount(适用于ubuntu14.04, centos6.5) 在/etc/fstab中加入下面的命令 ossfs#your_bucket_name your_mount_point fuse _netdev,url=your_url,allow_other 0 0 其中上述命令中的your_xxx信息需要根据您的bucket name等信息填入。 保存/etc/fstab文件。执行mount -a命令,如果没有报错,则说明设置正常。 到这一步,ubuntu14.04就能自动挂载了。centos6.5还需要执行下面的命令: chkconfig netfs on Step 2B 通过开机自启动脚本mount(适用于centos7.0及以上的系统) 在/etc/init.d/目录下建立文件ossfs,把模板文件中的内容拷贝到这个新文件中。并将其中的your_xxx内容改成您自己的信息。 执行命令:chmod a+x /etc/init.d/ossfs 上述命令是把新建立的ossfs脚本赋予可执行权限。您可以执行该脚本,如果脚本文件内容无误,那么此时oss中的bucket已经挂载到您指定的目录下了。 执行命令:chkconfig ossfs on 上述命令是把ossfs启动脚本作为其他服务,开机自动启动。 好了,现在ossfs就可以开机自动挂载了。总结起来,如果您是ubuntu14.04和centos6.5,您需要执行Step 1 + Step 2A;如果您是centos7.0系统,您需要执行Step 1 + Step 2B。 Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令 Q: 我需要以www用户挂载ossfs,此时如何设置开机自动挂载? 参照上面的问题的解答,Step 1照做,对Step 2B稍加修改,修改/etc/init.d/ossfs中的命令为: sudo -u www ossfs your_bucket your_mountpoint -ourl=your_url 设置自启动脚本中允许使用sudo,编辑/etc/sudoers,将其中的Defaults requiretty这行改为#Defaults requiretty(注释掉) Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令。 Q: 使用ECS挂载ossfs,如何避免因后台程序扫描文件而产生费用? 程序扫描ossfs挂载的目录,会转换成向OSS的请求,如果请求次数很多,会产生费用(1分钱/1万次)。如果是updatedb,可以通过修改/etc/updatedb.conf让它跳过。具体做法是: 在PRUNEFS =后面加上fuse.ossfs 在PRUNEPATHS =后面加上挂载的目录 如何确定是哪个进程扫了我的目录? 首先安装auditd: sudo apt-get install auditd 启动auditd: sudo service auditd start 设置监视挂载目录: auditctl -w /mnt/ossfs 在auditlog中可以查看是哪些进程访问了这个目录:ausearch -i | grep /mnt/ossfs Q: 使用ossfs上传到OSS的文件Content-Type全是”application/octet-stream”是怎么回事? ossfs通过查询/etc/mime.types中的内容来确定文件的Content-Type,请检查这个文件是否存在,如果不存在,则需要添加: 对于ubuntu可以通过sudo apt-get install mime-support来添加 对于centos可以通过sudo yum install mailcap来添加 也可以手动添加,每种格式一行,每行格式为:application/javascript js Q: 如何使用supervisor启动ossfs? 安装supervisor,在ubuntu中执行sudo apt-get install supervisor 建立一个目录,编辑ossfs的启动脚本:mkdir /root/ossfs_scripts vi /root/ossfs_scripts/start_ossfs.sh写入如下数据:# 卸载 fusermount -u /mnt/ossfs # 重新挂载,必须要增加-f参数运行ossfs,让ossfs在前台运行 exec ossfs my-bucket my-mount-point -ourl=my-oss-endpoint -f 编辑/etc/supervisor/supervisord.conf,在最后加入下面一段:[program:ossfs] command=bash /root/ossfs_scripts/start_ossfs.sh logfile=/var/log/ossfs.log log_stdout=true log_stderr=true logfile_maxbytes=1MB logfile_backups=10 运行supervisor:supervisordsupervisord 确认一切正常:ps aux | grep supervisor # 应该能看到supervisor进程 ps aux | grep ossfs # 应该能看到ossfs进程 kill -9 ossfs # 杀掉ossfs进程,supervisor应该会重启它, 不要使用killall, 因为killall发送SIGTERM,进程正常退出,supervisor不再去重新运行ossfs ps aux | grep ossfs # 应该能看到ossfs进程如果出错,请检查/var/log/supervisor/supervisord.log和/var/log/ossfs.log。 Q: 遇到”fuse: warning: library too old, some operations may not work”怎么办? 出现的原因是:ossfs编译时所使用的libfuse版本 比运行时链接到的libfuse版本高。这往往是用户自行安装了libfuse导致的。使用我们提供的rpm包安装ossfs,无需再安装libfuse。 在CentOS-5.x和CentOS-6.x上我们提供的rpm包里包含了libfuse-2.8.4,如果在运行的时候环境中有libfuse-2.8.3,并且ossfs被链接到了旧版本的fuse上,就会出现上述warning。 如何确认ossfs运行时链接的fuse版本? 运行ldd $(which ossfs) | grep fuse 例如结果是”/lib64/libfuse.so.2”,那么通过ls -l /lib64/libfuse*可以看到fuse的版本 如何让ossfs链接到正确的版本? 首先通过rpm -ql ossfs | grep fuse找到libfuse的目录 例如结果是”/usr/lib/libfuse.so.2”,则通过LD_LIBRARY_PATH=/usr/lib ossfs …运行ossfs 我能忽略这个WARNING吗? 最好不要,见这个bug Q: 为什么用ossfs看到的文件信息(例如大小)与其他工具看到的不一致? 因为ossfs默认会缓存文件的元信息(包括大小/权限等),这样就不需要每次ls的时候向OSS发送请求,加快速度。 如果用户通过其他程序(例如SDK/官网控制台/osscmd等)对文件进行了修改,那么有可能在ossfs中看到的文件信息 没有及时更新。 如果想禁止ossfs的缓存,那么可以在挂载的时候加上如下参数:-omax_stat_cache_size=0

2019-12-01 23:15:18 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 Q: ossfs适合什么样的程序? ossfs能把oss bucket挂载到本地,如果您使用的软件没有支持OSS,但您又想让数据能自动同步到OSS,那么ossfs是很好的选择。 Q: ossfs有什么局限性? 由于数据需要经过网络同步到云端,ossfs在性能和功能上可能与本地文件系统有差距。如果您想让数据库等对io要求很高的应用跑在ossfs挂载的盘上,请慎重考虑。和本地文件系统具体差异: 随机或者追加写文件会导致整个文件的重写。 元数据操作,例如list directory,性能较差,因为需要远程访问OSS服务器。 文件/文件夹的rename操作不是原子的。 多个客户端挂载同一个oss bucket时,依赖用户自行协调各个客户端的行为。例如避免多个客户端写同一个文件等等。 不支持hard link。 Q: ossfs一定要阿里云的机器才能用么? ossfs不限制一定要阿里云的内网才可以使用,外网机器依然可以使用。 Q: ossfs能不能同时挂载多个OSS bucket? 可以的,在passwd-ossfs文件中写入多个OSS配置信息即可。支持不同帐号的OSS。 Q: 我在yum/apt-get安装ossfs,遇到conflicts with file from package fuse-devel的错误,请问是怎么回事? 您的系统中存在老版本的fuse,请先使用相关的包管理器卸载,再重新安装ossfs。 Q: ossfs工作不正常,如何debug? 您可以使用在挂载时,加上-d -o f2参数,ossfs会把日志写入到系统日志中。在centos系统中,在/var/log/messages中。 您也可以在挂载时使用-f -d -o f2参数,ossfs会把日志输出到屏幕上。 Q: 为什么我在mount时遇到 ossfs: unable to access MOUNTPOINT /tmp/ossfs: Transport endpoint is not connected这样的错误? 请先umount对应的目录。 请检查您在使用ossfs挂载时,填入的url参数是否正确,是否和bucket/access key id/access key secret匹配。 特别注意:url中不包含bucket的名字。例如:您在oss控制台中看到bucket的域名是这样的:ossfs-test-1.oss-cn-hangzhou.aliyuncs.com。那么填入的url则是:http://oss-cn-hangzhou.aliyuncs.com。 Q: ossfs提示ossfs: unable to access MOUNTPOINT /tmp/odat: No such file or directory 这是您未创建该目录导致的,在挂载前需要创建对应目录。 Q: 我把bucket挂载到本地后,ls目录,却收到operation not permitted错误,这是为什么? 请检查您的bucket中,是否包含目录名含有不可见字符的OSS object。文件系统对文件/目录名有更严格的限制,因此会收到上述错误。使用其他工具对这些object重命名后,ls就能正确显示目录内容了。 Q: 我的一个目录下有非常多的文件,为什么ls该目录很慢? 假设一个目录下有n个文件,那么ls该目录至少需要n次OSS http requests。在文件非常多的时候,这可能造成严重的性能问题。 您可以采用下面两个办法优化: 通过-omax_stat_cache_size=xxx参数增大stat cache的size,这样第一次ls会较慢,但是后续的ls就快了,因为文件的元数据都在本地cache中。默认这个值是1000,大约消耗4MB内存,请根据您机器内存大小调整为合适的值。 使用ls -f命令,这个命令会消除与OSS的n次http请求。 具体参见issue 13。 Q: ossfs挂载时如何设置权限? 如果要允许其他用户访问挂载文件夹,可以在运行ossfs的时候指定allow_other参数: ossfs your_bucket your_mount_point -ourl=your_endpoint -o allow_other 为什么使用allow_other参数,仍然不能访问文件? 注意:allow_other是赋予挂载目录其他用户访问的权限,不是里面的文件!如果您要更改文件夹中的文件,请用chmod命令。 allow_other默认赋予挂载目录777权限,我想让挂载目录的权限为770,该怎么办? 可以通过umask来设置,参见这里。 Q: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user: 方法一: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user,则需要以user的身份创建挂载文件夹和使用ossfs: sudo -u user mkdir /tmp/ossfs sudo -u user ossfs bucket-name /tmp/ossfs 方法二: 首先通过id命令获得指定用户的uid/gid信息。例如获取www用户的uid/gid信息:id www;然后挂载时指定uid/gid参数: ossfs your_bucket your_mountpoint -ourl=your_url -ouid=your_uid -ogid=your_gid 注意:uid/gid都是数字。 Q: 我不是root用户,如何umount ossfs挂载的目录 fusermount -u your_mountpoint Q: 如何开机自动挂载ossfs? Step 1 首先请参考使用说明,把bucket name,access key id/secret等信息写入/etc/passwd-ossfs,并将该文件权限修改为640。 echo your_bucket_name:your_access_key_id:your_access_key_secret > /etc/passwd-ossfs chmod 640 /etc/passwd-ossfs Step 2 接下来针对不同的系统版本,设置方式有所不同 Step 2A 通过fstab的方式自动mount(适用于ubuntu14.04, centos6.5) 在/etc/fstab中加入下面的命令 ossfs#your_bucket_name your_mount_point fuse _netdev,url=your_url,allow_other 0 0 其中上述命令中的your_xxx信息需要根据您的bucket name等信息填入。 保存/etc/fstab文件。执行mount -a命令,如果没有报错,则说明设置正常。 到这一步,ubuntu14.04就能自动挂载了。centos6.5还需要执行下面的命令: chkconfig netfs on Step 2B 通过开机自启动脚本mount(适用于centos7.0及以上的系统) 在/etc/init.d/目录下建立文件ossfs,把模板文件中的内容拷贝到这个新文件中。并将其中的your_xxx内容改成您自己的信息。 执行命令:chmod a+x /etc/init.d/ossfs 上述命令是把新建立的ossfs脚本赋予可执行权限。您可以执行该脚本,如果脚本文件内容无误,那么此时oss中的bucket已经挂载到您指定的目录下了。 执行命令:chkconfig ossfs on 上述命令是把ossfs启动脚本作为其他服务,开机自动启动。 好了,现在ossfs就可以开机自动挂载了。总结起来,如果您是ubuntu14.04和centos6.5,您需要执行Step 1 + Step 2A;如果您是centos7.0系统,您需要执行Step 1 + Step 2B。 Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令 Q: 我需要以www用户挂载ossfs,此时如何设置开机自动挂载? 参照上面的问题的解答,Step 1照做,对Step 2B稍加修改,修改/etc/init.d/ossfs中的命令为: sudo -u www ossfs your_bucket your_mountpoint -ourl=your_url 设置自启动脚本中允许使用sudo,编辑/etc/sudoers,将其中的Defaults requiretty这行改为#Defaults requiretty(注释掉) Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令。 Q: 使用ECS挂载ossfs,如何避免因后台程序扫描文件而产生费用? 程序扫描ossfs挂载的目录,会转换成向OSS的请求,如果请求次数很多,会产生费用(1分钱/1万次)。如果是updatedb,可以通过修改/etc/updatedb.conf让它跳过。具体做法是: 在PRUNEFS =后面加上fuse.ossfs 在PRUNEPATHS =后面加上挂载的目录 如何确定是哪个进程扫了我的目录? 首先安装auditd: sudo apt-get install auditd 启动auditd: sudo service auditd start 设置监视挂载目录: auditctl -w /mnt/ossfs 在auditlog中可以查看是哪些进程访问了这个目录:ausearch -i | grep /mnt/ossfs Q: 使用ossfs上传到OSS的文件Content-Type全是”application/octet-stream”是怎么回事? ossfs通过查询/etc/mime.types中的内容来确定文件的Content-Type,请检查这个文件是否存在,如果不存在,则需要添加: 对于ubuntu可以通过sudo apt-get install mime-support来添加 对于centos可以通过sudo yum install mailcap来添加 也可以手动添加,每种格式一行,每行格式为:application/javascript js Q: 如何使用supervisor启动ossfs? 安装supervisor,在ubuntu中执行sudo apt-get install supervisor 建立一个目录,编辑ossfs的启动脚本:mkdir /root/ossfs_scripts vi /root/ossfs_scripts/start_ossfs.sh写入如下数据:# 卸载 fusermount -u /mnt/ossfs # 重新挂载,必须要增加-f参数运行ossfs,让ossfs在前台运行 exec ossfs my-bucket my-mount-point -ourl=my-oss-endpoint -f 编辑/etc/supervisor/supervisord.conf,在最后加入下面一段:[program:ossfs] command=bash /root/ossfs_scripts/start_ossfs.sh logfile=/var/log/ossfs.log log_stdout=true log_stderr=true logfile_maxbytes=1MB logfile_backups=10 运行supervisor:supervisordsupervisord 确认一切正常:ps aux | grep supervisor # 应该能看到supervisor进程 ps aux | grep ossfs # 应该能看到ossfs进程 kill -9 ossfs # 杀掉ossfs进程,supervisor应该会重启它, 不要使用killall, 因为killall发送SIGTERM,进程正常退出,supervisor不再去重新运行ossfs ps aux | grep ossfs # 应该能看到ossfs进程如果出错,请检查/var/log/supervisor/supervisord.log和/var/log/ossfs.log。 Q: 遇到”fuse: warning: library too old, some operations may not work”怎么办? 出现的原因是:ossfs编译时所使用的libfuse版本 比运行时链接到的libfuse版本高。这往往是用户自行安装了libfuse导致的。使用我们提供的rpm包安装ossfs,无需再安装libfuse。 在CentOS-5.x和CentOS-6.x上我们提供的rpm包里包含了libfuse-2.8.4,如果在运行的时候环境中有libfuse-2.8.3,并且ossfs被链接到了旧版本的fuse上,就会出现上述warning。 如何确认ossfs运行时链接的fuse版本? 运行ldd $(which ossfs) | grep fuse 例如结果是”/lib64/libfuse.so.2”,那么通过ls -l /lib64/libfuse*可以看到fuse的版本 如何让ossfs链接到正确的版本? 首先通过rpm -ql ossfs | grep fuse找到libfuse的目录 例如结果是”/usr/lib/libfuse.so.2”,则通过LD_LIBRARY_PATH=/usr/lib ossfs …运行ossfs 我能忽略这个WARNING吗? 最好不要,见这个bug Q: 为什么用ossfs看到的文件信息(例如大小)与其他工具看到的不一致? 因为ossfs默认会缓存文件的元信息(包括大小/权限等),这样就不需要每次ls的时候向OSS发送请求,加快速度。 如果用户通过其他程序(例如SDK/官网控制台/osscmd等)对文件进行了修改,那么有可能在ossfs中看到的文件信息 没有及时更新。 如果想禁止ossfs的缓存,那么可以在挂载的时候加上如下参数:-omax_stat_cache_size=0

2019-12-01 23:15:15 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 Q: ossfs适合什么样的程序? ossfs能把oss bucket挂载到本地,如果您使用的软件没有支持OSS,但您又想让数据能自动同步到OSS,那么ossfs是很好的选择。 Q: ossfs有什么局限性? 由于数据需要经过网络同步到云端,ossfs在性能和功能上可能与本地文件系统有差距。如果您想让数据库等对io要求很高的应用跑在ossfs挂载的盘上,请慎重考虑。和本地文件系统具体差异: 随机或者追加写文件会导致整个文件的重写。 元数据操作,例如list directory,性能较差,因为需要远程访问OSS服务器。 文件/文件夹的rename操作不是原子的。 多个客户端挂载同一个oss bucket时,依赖用户自行协调各个客户端的行为。例如避免多个客户端写同一个文件等等。 不支持hard link。 Q: ossfs一定要阿里云的机器才能用么? ossfs不限制一定要阿里云的内网才可以使用,外网机器依然可以使用。 Q: ossfs能不能同时挂载多个OSS bucket? 可以的,在passwd-ossfs文件中写入多个OSS配置信息即可。支持不同帐号的OSS。 Q: 我在yum/apt-get安装ossfs,遇到conflicts with file from package fuse-devel的错误,请问是怎么回事? 您的系统中存在老版本的fuse,请先使用相关的包管理器卸载,再重新安装ossfs。 Q: ossfs工作不正常,如何debug? 您可以使用在挂载时,加上-d -o f2参数,ossfs会把日志写入到系统日志中。在centos系统中,在/var/log/messages中。 您也可以在挂载时使用-f -d -o f2参数,ossfs会把日志输出到屏幕上。 Q: 为什么我在mount时遇到 ossfs: unable to access MOUNTPOINT /tmp/ossfs: Transport endpoint is not connected这样的错误? 请先umount对应的目录。 请检查您在使用ossfs挂载时,填入的url参数是否正确,是否和bucket/access key id/access key secret匹配。 特别注意:url中不包含bucket的名字。例如:您在oss控制台中看到bucket的域名是这样的:ossfs-test-1.oss-cn-hangzhou.aliyuncs.com。那么填入的url则是:http://oss-cn-hangzhou.aliyuncs.com。 Q: ossfs提示ossfs: unable to access MOUNTPOINT /tmp/odat: No such file or directory 这是您未创建该目录导致的,在挂载前需要创建对应目录。 Q: 我把bucket挂载到本地后,ls目录,却收到operation not permitted错误,这是为什么? 请检查您的bucket中,是否包含目录名含有不可见字符的OSS object。文件系统对文件/目录名有更严格的限制,因此会收到上述错误。使用其他工具对这些object重命名后,ls就能正确显示目录内容了。 Q: 我的一个目录下有非常多的文件,为什么ls该目录很慢? 假设一个目录下有n个文件,那么ls该目录至少需要n次OSS http requests。在文件非常多的时候,这可能造成严重的性能问题。 您可以采用下面两个办法优化: 通过-omax_stat_cache_size=xxx参数增大stat cache的size,这样第一次ls会较慢,但是后续的ls就快了,因为文件的元数据都在本地cache中。默认这个值是1000,大约消耗4MB内存,请根据您机器内存大小调整为合适的值。 使用ls -f命令,这个命令会消除与OSS的n次http请求。 具体参见issue 13。 Q: ossfs挂载时如何设置权限? 如果要允许其他用户访问挂载文件夹,可以在运行ossfs的时候指定allow_other参数: ossfs your_bucket your_mount_point -ourl=your_endpoint -o allow_other 为什么使用allow_other参数,仍然不能访问文件? 注意:allow_other是赋予挂载目录其他用户访问的权限,不是里面的文件!如果您要更改文件夹中的文件,请用chmod命令。 allow_other默认赋予挂载目录777权限,我想让挂载目录的权限为770,该怎么办? 可以通过umask来设置,参见这里。 Q: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user: 方法一: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user,则需要以user的身份创建挂载文件夹和使用ossfs: sudo -u user mkdir /tmp/ossfs sudo -u user ossfs bucket-name /tmp/ossfs 方法二: 首先通过id命令获得指定用户的uid/gid信息。例如获取www用户的uid/gid信息:id www;然后挂载时指定uid/gid参数: ossfs your_bucket your_mountpoint -ourl=your_url -ouid=your_uid -ogid=your_gid 注意:uid/gid都是数字。 Q: 我不是root用户,如何umount ossfs挂载的目录 fusermount -u your_mountpoint Q: 如何开机自动挂载ossfs? Step 1 首先请参考使用说明,把bucket name,access key id/secret等信息写入/etc/passwd-ossfs,并将该文件权限修改为640。 echo your_bucket_name:your_access_key_id:your_access_key_secret > /etc/passwd-ossfs chmod 640 /etc/passwd-ossfs Step 2 接下来针对不同的系统版本,设置方式有所不同 Step 2A 通过fstab的方式自动mount(适用于ubuntu14.04, centos6.5) 在/etc/fstab中加入下面的命令 ossfs#your_bucket_name your_mount_point fuse _netdev,url=your_url,allow_other 0 0 其中上述命令中的your_xxx信息需要根据您的bucket name等信息填入。 保存/etc/fstab文件。执行mount -a命令,如果没有报错,则说明设置正常。 到这一步,ubuntu14.04就能自动挂载了。centos6.5还需要执行下面的命令: chkconfig netfs on Step 2B 通过开机自启动脚本mount(适用于centos7.0及以上的系统) 在/etc/init.d/目录下建立文件ossfs,把模板文件中的内容拷贝到这个新文件中。并将其中的your_xxx内容改成您自己的信息。 执行命令:chmod a+x /etc/init.d/ossfs 上述命令是把新建立的ossfs脚本赋予可执行权限。您可以执行该脚本,如果脚本文件内容无误,那么此时oss中的bucket已经挂载到您指定的目录下了。 执行命令:chkconfig ossfs on 上述命令是把ossfs启动脚本作为其他服务,开机自动启动。 好了,现在ossfs就可以开机自动挂载了。总结起来,如果您是ubuntu14.04和centos6.5,您需要执行Step 1 + Step 2A;如果您是centos7.0系统,您需要执行Step 1 + Step 2B。 Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令 Q: 我需要以www用户挂载ossfs,此时如何设置开机自动挂载? 参照上面的问题的解答,Step 1照做,对Step 2B稍加修改,修改/etc/init.d/ossfs中的命令为: sudo -u www ossfs your_bucket your_mountpoint -ourl=your_url 设置自启动脚本中允许使用sudo,编辑/etc/sudoers,将其中的Defaults requiretty这行改为#Defaults requiretty(注释掉) Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令。 Q: 使用ECS挂载ossfs,如何避免因后台程序扫描文件而产生费用? 程序扫描ossfs挂载的目录,会转换成向OSS的请求,如果请求次数很多,会产生费用(1分钱/1万次)。如果是updatedb,可以通过修改/etc/updatedb.conf让它跳过。具体做法是: 在PRUNEFS =后面加上fuse.ossfs 在PRUNEPATHS =后面加上挂载的目录 如何确定是哪个进程扫了我的目录? 首先安装auditd: sudo apt-get install auditd 启动auditd: sudo service auditd start 设置监视挂载目录: auditctl -w /mnt/ossfs 在auditlog中可以查看是哪些进程访问了这个目录:ausearch -i | grep /mnt/ossfs Q: 使用ossfs上传到OSS的文件Content-Type全是”application/octet-stream”是怎么回事? ossfs通过查询/etc/mime.types中的内容来确定文件的Content-Type,请检查这个文件是否存在,如果不存在,则需要添加: 对于ubuntu可以通过sudo apt-get install mime-support来添加 对于centos可以通过sudo yum install mailcap来添加 也可以手动添加,每种格式一行,每行格式为:application/javascript js Q: 如何使用supervisor启动ossfs? 安装supervisor,在ubuntu中执行sudo apt-get install supervisor 建立一个目录,编辑ossfs的启动脚本:mkdir /root/ossfs_scripts vi /root/ossfs_scripts/start_ossfs.sh写入如下数据:# 卸载 fusermount -u /mnt/ossfs # 重新挂载,必须要增加-f参数运行ossfs,让ossfs在前台运行 exec ossfs my-bucket my-mount-point -ourl=my-oss-endpoint -f 编辑/etc/supervisor/supervisord.conf,在最后加入下面一段:[program:ossfs] command=bash /root/ossfs_scripts/start_ossfs.sh logfile=/var/log/ossfs.log log_stdout=true log_stderr=true logfile_maxbytes=1MB logfile_backups=10 运行supervisor:supervisordsupervisord 确认一切正常:ps aux | grep supervisor # 应该能看到supervisor进程 ps aux | grep ossfs # 应该能看到ossfs进程 kill -9 ossfs # 杀掉ossfs进程,supervisor应该会重启它, 不要使用killall, 因为killall发送SIGTERM,进程正常退出,supervisor不再去重新运行ossfs ps aux | grep ossfs # 应该能看到ossfs进程如果出错,请检查/var/log/supervisor/supervisord.log和/var/log/ossfs.log。 Q: 遇到”fuse: warning: library too old, some operations may not work”怎么办? 出现的原因是:ossfs编译时所使用的libfuse版本 比运行时链接到的libfuse版本高。这往往是用户自行安装了libfuse导致的。使用我们提供的rpm包安装ossfs,无需再安装libfuse。 在CentOS-5.x和CentOS-6.x上我们提供的rpm包里包含了libfuse-2.8.4,如果在运行的时候环境中有libfuse-2.8.3,并且ossfs被链接到了旧版本的fuse上,就会出现上述warning。 如何确认ossfs运行时链接的fuse版本? 运行ldd $(which ossfs) | grep fuse 例如结果是”/lib64/libfuse.so.2”,那么通过ls -l /lib64/libfuse*可以看到fuse的版本 如何让ossfs链接到正确的版本? 首先通过rpm -ql ossfs | grep fuse找到libfuse的目录 例如结果是”/usr/lib/libfuse.so.2”,则通过LD_LIBRARY_PATH=/usr/lib ossfs …运行ossfs 我能忽略这个WARNING吗? 最好不要,见这个bug Q: 为什么用ossfs看到的文件信息(例如大小)与其他工具看到的不一致? 因为ossfs默认会缓存文件的元信息(包括大小/权限等),这样就不需要每次ls的时候向OSS发送请求,加快速度。 如果用户通过其他程序(例如SDK/官网控制台/osscmd等)对文件进行了修改,那么有可能在ossfs中看到的文件信息 没有及时更新。 如果想禁止ossfs的缓存,那么可以在挂载的时候加上如下参数:-omax_stat_cache_size=0

2019-12-01 23:15:15 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 Q: ossfs适合什么样的程序? ossfs能把oss bucket挂载到本地,如果您使用的软件没有支持OSS,但您又想让数据能自动同步到OSS,那么ossfs是很好的选择。 Q: ossfs有什么局限性? 由于数据需要经过网络同步到云端,ossfs在性能和功能上可能与本地文件系统有差距。如果您想让数据库等对io要求很高的应用跑在ossfs挂载的盘上,请慎重考虑。和本地文件系统具体差异: 随机或者追加写文件会导致整个文件的重写。 元数据操作,例如list directory,性能较差,因为需要远程访问OSS服务器。 文件/文件夹的rename操作不是原子的。 多个客户端挂载同一个oss bucket时,依赖用户自行协调各个客户端的行为。例如避免多个客户端写同一个文件等等。 不支持hard link。 Q: ossfs一定要阿里云的机器才能用么? ossfs不限制一定要阿里云的内网才可以使用,外网机器依然可以使用。 Q: ossfs能不能同时挂载多个OSS bucket? 可以的,在passwd-ossfs文件中写入多个OSS配置信息即可。支持不同帐号的OSS。 Q: 我在yum/apt-get安装ossfs,遇到conflicts with file from package fuse-devel的错误,请问是怎么回事? 您的系统中存在老版本的fuse,请先使用相关的包管理器卸载,再重新安装ossfs。 Q: ossfs工作不正常,如何debug? 您可以使用在挂载时,加上-d -o f2参数,ossfs会把日志写入到系统日志中。在centos系统中,在/var/log/messages中。 您也可以在挂载时使用-f -d -o f2参数,ossfs会把日志输出到屏幕上。 Q: 为什么我在mount时遇到 ossfs: unable to access MOUNTPOINT /tmp/ossfs: Transport endpoint is not connected这样的错误? 请先umount对应的目录。 请检查您在使用ossfs挂载时,填入的url参数是否正确,是否和bucket/access key id/access key secret匹配。 特别注意:url中不包含bucket的名字。例如:您在oss控制台中看到bucket的域名是这样的:ossfs-test-1.oss-cn-hangzhou.aliyuncs.com。那么填入的url则是:http://oss-cn-hangzhou.aliyuncs.com。 Q: ossfs提示ossfs: unable to access MOUNTPOINT /tmp/odat: No such file or directory 这是您未创建该目录导致的,在挂载前需要创建对应目录。 Q: 我把bucket挂载到本地后,ls目录,却收到operation not permitted错误,这是为什么? 请检查您的bucket中,是否包含目录名含有不可见字符的OSS object。文件系统对文件/目录名有更严格的限制,因此会收到上述错误。使用其他工具对这些object重命名后,ls就能正确显示目录内容了。 Q: 我的一个目录下有非常多的文件,为什么ls该目录很慢? 假设一个目录下有n个文件,那么ls该目录至少需要n次OSS http requests。在文件非常多的时候,这可能造成严重的性能问题。 您可以采用下面两个办法优化: 通过-omax_stat_cache_size=xxx参数增大stat cache的size,这样第一次ls会较慢,但是后续的ls就快了,因为文件的元数据都在本地cache中。默认这个值是1000,大约消耗4MB内存,请根据您机器内存大小调整为合适的值。 使用ls -f命令,这个命令会消除与OSS的n次http请求。 具体参见issue 13。 Q: ossfs挂载时如何设置权限? 如果要允许其他用户访问挂载文件夹,可以在运行ossfs的时候指定allow_other参数: ossfs your_bucket your_mount_point -ourl=your_endpoint -o allow_other 为什么使用allow_other参数,仍然不能访问文件? 注意:allow_other是赋予挂载目录其他用户访问的权限,不是里面的文件!如果您要更改文件夹中的文件,请用chmod命令。 allow_other默认赋予挂载目录777权限,我想让挂载目录的权限为770,该怎么办? 可以通过umask来设置,参见这里。 Q: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user: 方法一: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user,则需要以user的身份创建挂载文件夹和使用ossfs: sudo -u user mkdir /tmp/ossfs sudo -u user ossfs bucket-name /tmp/ossfs 方法二: 首先通过id命令获得指定用户的uid/gid信息。例如获取www用户的uid/gid信息:id www;然后挂载时指定uid/gid参数: ossfs your_bucket your_mountpoint -ourl=your_url -ouid=your_uid -ogid=your_gid 注意:uid/gid都是数字。 Q: 我不是root用户,如何umount ossfs挂载的目录 fusermount -u your_mountpoint Q: 如何开机自动挂载ossfs? Step 1 首先请参考使用说明,把bucket name,access key id/secret等信息写入/etc/passwd-ossfs,并将该文件权限修改为640。 echo your_bucket_name:your_access_key_id:your_access_key_secret > /etc/passwd-ossfs chmod 640 /etc/passwd-ossfs Step 2 接下来针对不同的系统版本,设置方式有所不同 Step 2A 通过fstab的方式自动mount(适用于ubuntu14.04, centos6.5) 在/etc/fstab中加入下面的命令 ossfs#your_bucket_name your_mount_point fuse _netdev,url=your_url,allow_other 0 0 其中上述命令中的your_xxx信息需要根据您的bucket name等信息填入。 保存/etc/fstab文件。执行mount -a命令,如果没有报错,则说明设置正常。 到这一步,ubuntu14.04就能自动挂载了。centos6.5还需要执行下面的命令: chkconfig netfs on Step 2B 通过开机自启动脚本mount(适用于centos7.0及以上的系统) 在/etc/init.d/目录下建立文件ossfs,把模板文件中的内容拷贝到这个新文件中。并将其中的your_xxx内容改成您自己的信息。 执行命令:chmod a+x /etc/init.d/ossfs 上述命令是把新建立的ossfs脚本赋予可执行权限。您可以执行该脚本,如果脚本文件内容无误,那么此时oss中的bucket已经挂载到您指定的目录下了。 执行命令:chkconfig ossfs on 上述命令是把ossfs启动脚本作为其他服务,开机自动启动。 好了,现在ossfs就可以开机自动挂载了。总结起来,如果您是ubuntu14.04和centos6.5,您需要执行Step 1 + Step 2A;如果您是centos7.0系统,您需要执行Step 1 + Step 2B。 Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令 Q: 我需要以www用户挂载ossfs,此时如何设置开机自动挂载? 参照上面的问题的解答,Step 1照做,对Step 2B稍加修改,修改/etc/init.d/ossfs中的命令为: sudo -u www ossfs your_bucket your_mountpoint -ourl=your_url 设置自启动脚本中允许使用sudo,编辑/etc/sudoers,将其中的Defaults requiretty这行改为#Defaults requiretty(注释掉) Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令。 Q: 使用ECS挂载ossfs,如何避免因后台程序扫描文件而产生费用? 程序扫描ossfs挂载的目录,会转换成向OSS的请求,如果请求次数很多,会产生费用(1分钱/1万次)。如果是updatedb,可以通过修改/etc/updatedb.conf让它跳过。具体做法是: 在PRUNEFS =后面加上fuse.ossfs 在PRUNEPATHS =后面加上挂载的目录 如何确定是哪个进程扫了我的目录? 首先安装auditd: sudo apt-get install auditd 启动auditd: sudo service auditd start 设置监视挂载目录: auditctl -w /mnt/ossfs 在auditlog中可以查看是哪些进程访问了这个目录:ausearch -i | grep /mnt/ossfs Q: 使用ossfs上传到OSS的文件Content-Type全是”application/octet-stream”是怎么回事? ossfs通过查询/etc/mime.types中的内容来确定文件的Content-Type,请检查这个文件是否存在,如果不存在,则需要添加: 对于ubuntu可以通过sudo apt-get install mime-support来添加 对于centos可以通过sudo yum install mailcap来添加 也可以手动添加,每种格式一行,每行格式为:application/javascript js Q: 如何使用supervisor启动ossfs? 安装supervisor,在ubuntu中执行sudo apt-get install supervisor 建立一个目录,编辑ossfs的启动脚本:mkdir /root/ossfs_scripts vi /root/ossfs_scripts/start_ossfs.sh写入如下数据:# 卸载 fusermount -u /mnt/ossfs # 重新挂载,必须要增加-f参数运行ossfs,让ossfs在前台运行 exec ossfs my-bucket my-mount-point -ourl=my-oss-endpoint -f 编辑/etc/supervisor/supervisord.conf,在最后加入下面一段:[program:ossfs] command=bash /root/ossfs_scripts/start_ossfs.sh logfile=/var/log/ossfs.log log_stdout=true log_stderr=true logfile_maxbytes=1MB logfile_backups=10 运行supervisor:supervisordsupervisord 确认一切正常:ps aux | grep supervisor # 应该能看到supervisor进程 ps aux | grep ossfs # 应该能看到ossfs进程 kill -9 ossfs # 杀掉ossfs进程,supervisor应该会重启它, 不要使用killall, 因为killall发送SIGTERM,进程正常退出,supervisor不再去重新运行ossfs ps aux | grep ossfs # 应该能看到ossfs进程如果出错,请检查/var/log/supervisor/supervisord.log和/var/log/ossfs.log。 Q: 遇到”fuse: warning: library too old, some operations may not work”怎么办? 出现的原因是:ossfs编译时所使用的libfuse版本 比运行时链接到的libfuse版本高。这往往是用户自行安装了libfuse导致的。使用我们提供的rpm包安装ossfs,无需再安装libfuse。 在CentOS-5.x和CentOS-6.x上我们提供的rpm包里包含了libfuse-2.8.4,如果在运行的时候环境中有libfuse-2.8.3,并且ossfs被链接到了旧版本的fuse上,就会出现上述warning。 如何确认ossfs运行时链接的fuse版本? 运行ldd $(which ossfs) | grep fuse 例如结果是”/lib64/libfuse.so.2”,那么通过ls -l /lib64/libfuse*可以看到fuse的版本 如何让ossfs链接到正确的版本? 首先通过rpm -ql ossfs | grep fuse找到libfuse的目录 例如结果是”/usr/lib/libfuse.so.2”,则通过LD_LIBRARY_PATH=/usr/lib ossfs …运行ossfs 我能忽略这个WARNING吗? 最好不要,见这个bug Q: 为什么用ossfs看到的文件信息(例如大小)与其他工具看到的不一致? 因为ossfs默认会缓存文件的元信息(包括大小/权限等),这样就不需要每次ls的时候向OSS发送请求,加快速度。 如果用户通过其他程序(例如SDK/官网控制台/osscmd等)对文件进行了修改,那么有可能在ossfs中看到的文件信息 没有及时更新。 如果想禁止ossfs的缓存,那么可以在挂载的时候加上如下参数:-omax_stat_cache_size=0

2019-12-01 23:15:15 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 Q: ossfs适合什么样的程序? ossfs能把oss bucket挂载到本地,如果您使用的软件没有支持OSS,但您又想让数据能自动同步到OSS,那么ossfs是很好的选择。 Q: ossfs有什么局限性? 由于数据需要经过网络同步到云端,ossfs在性能和功能上可能与本地文件系统有差距。如果您想让数据库等对io要求很高的应用跑在ossfs挂载的盘上,请慎重考虑。和本地文件系统具体差异: 随机或者追加写文件会导致整个文件的重写。 元数据操作,例如list directory,性能较差,因为需要远程访问OSS服务器。 文件/文件夹的rename操作不是原子的。 多个客户端挂载同一个oss bucket时,依赖用户自行协调各个客户端的行为。例如避免多个客户端写同一个文件等等。 不支持hard link。 Q: ossfs一定要阿里云的机器才能用么? ossfs不限制一定要阿里云的内网才可以使用,外网机器依然可以使用。 Q: ossfs能不能同时挂载多个OSS bucket? 可以的,在passwd-ossfs文件中写入多个OSS配置信息即可。支持不同帐号的OSS。 Q: 我在yum/apt-get安装ossfs,遇到conflicts with file from package fuse-devel的错误,请问是怎么回事? 您的系统中存在老版本的fuse,请先使用相关的包管理器卸载,再重新安装ossfs。 Q: ossfs工作不正常,如何debug? 您可以使用在挂载时,加上-d -o f2参数,ossfs会把日志写入到系统日志中。在centos系统中,在/var/log/messages中。 您也可以在挂载时使用-f -d -o f2参数,ossfs会把日志输出到屏幕上。 Q: 为什么我在mount时遇到 ossfs: unable to access MOUNTPOINT /tmp/ossfs: Transport endpoint is not connected这样的错误? 请先umount对应的目录。 请检查您在使用ossfs挂载时,填入的url参数是否正确,是否和bucket/access key id/access key secret匹配。 特别注意:url中不包含bucket的名字。例如:您在oss控制台中看到bucket的域名是这样的:ossfs-test-1.oss-cn-hangzhou.aliyuncs.com。那么填入的url则是:http://oss-cn-hangzhou.aliyuncs.com。 Q: ossfs提示ossfs: unable to access MOUNTPOINT /tmp/odat: No such file or directory 这是您未创建该目录导致的,在挂载前需要创建对应目录。 Q: 我把bucket挂载到本地后,ls目录,却收到operation not permitted错误,这是为什么? 请检查您的bucket中,是否包含目录名含有不可见字符的OSS object。文件系统对文件/目录名有更严格的限制,因此会收到上述错误。使用其他工具对这些object重命名后,ls就能正确显示目录内容了。 Q: 我的一个目录下有非常多的文件,为什么ls该目录很慢? 假设一个目录下有n个文件,那么ls该目录至少需要n次OSS http requests。在文件非常多的时候,这可能造成严重的性能问题。 您可以采用下面两个办法优化: 通过-omax_stat_cache_size=xxx参数增大stat cache的size,这样第一次ls会较慢,但是后续的ls就快了,因为文件的元数据都在本地cache中。默认这个值是1000,大约消耗4MB内存,请根据您机器内存大小调整为合适的值。 使用ls -f命令,这个命令会消除与OSS的n次http请求。 具体参见issue 13。 Q: ossfs挂载时如何设置权限? 如果要允许其他用户访问挂载文件夹,可以在运行ossfs的时候指定allow_other参数: ossfs your_bucket your_mount_point -ourl=your_endpoint -o allow_other 为什么使用allow_other参数,仍然不能访问文件? 注意:allow_other是赋予挂载目录其他用户访问的权限,不是里面的文件!如果您要更改文件夹中的文件,请用chmod命令。 allow_other默认赋予挂载目录777权限,我想让挂载目录的权限为770,该怎么办? 可以通过umask来设置,参见这里。 Q: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user: 方法一: 如果要使挂载的文件夹(/tmp/ossfs)属于某个user,则需要以user的身份创建挂载文件夹和使用ossfs: sudo -u user mkdir /tmp/ossfs sudo -u user ossfs bucket-name /tmp/ossfs 方法二: 首先通过id命令获得指定用户的uid/gid信息。例如获取www用户的uid/gid信息:id www;然后挂载时指定uid/gid参数: ossfs your_bucket your_mountpoint -ourl=your_url -ouid=your_uid -ogid=your_gid 注意:uid/gid都是数字。 Q: 我不是root用户,如何umount ossfs挂载的目录 fusermount -u your_mountpoint Q: 如何开机自动挂载ossfs? Step 1 首先请参考使用说明,把bucket name,access key id/secret等信息写入/etc/passwd-ossfs,并将该文件权限修改为640。 echo your_bucket_name:your_access_key_id:your_access_key_secret > /etc/passwd-ossfs chmod 640 /etc/passwd-ossfs Step 2 接下来针对不同的系统版本,设置方式有所不同 Step 2A 通过fstab的方式自动mount(适用于ubuntu14.04, centos6.5) 在/etc/fstab中加入下面的命令 ossfs#your_bucket_name your_mount_point fuse _netdev,url=your_url,allow_other 0 0 其中上述命令中的your_xxx信息需要根据您的bucket name等信息填入。 保存/etc/fstab文件。执行mount -a命令,如果没有报错,则说明设置正常。 到这一步,ubuntu14.04就能自动挂载了。centos6.5还需要执行下面的命令: chkconfig netfs on Step 2B 通过开机自启动脚本mount(适用于centos7.0及以上的系统) 在/etc/init.d/目录下建立文件ossfs,把模板文件中的内容拷贝到这个新文件中。并将其中的your_xxx内容改成您自己的信息。 执行命令:chmod a+x /etc/init.d/ossfs 上述命令是把新建立的ossfs脚本赋予可执行权限。您可以执行该脚本,如果脚本文件内容无误,那么此时oss中的bucket已经挂载到您指定的目录下了。 执行命令:chkconfig ossfs on 上述命令是把ossfs启动脚本作为其他服务,开机自动启动。 好了,现在ossfs就可以开机自动挂载了。总结起来,如果您是ubuntu14.04和centos6.5,您需要执行Step 1 + Step 2A;如果您是centos7.0系统,您需要执行Step 1 + Step 2B。 Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令 Q: 我需要以www用户挂载ossfs,此时如何设置开机自动挂载? 参照上面的问题的解答,Step 1照做,对Step 2B稍加修改,修改/etc/init.d/ossfs中的命令为: sudo -u www ossfs your_bucket your_mountpoint -ourl=your_url 设置自启动脚本中允许使用sudo,编辑/etc/sudoers,将其中的Defaults requiretty这行改为#Defaults requiretty(注释掉) Q: 遇到fusermount: failed to open current directory: Permission denied错误如何解决? 这是fuse的一个bug,它要求当前用户对当前目录(非挂载目录)有读权限。解决的办法就是cd到一个有读权限的目录再运行ossfs命令。 Q: 使用ECS挂载ossfs,如何避免因后台程序扫描文件而产生费用? 程序扫描ossfs挂载的目录,会转换成向OSS的请求,如果请求次数很多,会产生费用(1分钱/1万次)。如果是updatedb,可以通过修改/etc/updatedb.conf让它跳过。具体做法是: 在PRUNEFS =后面加上fuse.ossfs 在PRUNEPATHS =后面加上挂载的目录 如何确定是哪个进程扫了我的目录? 首先安装auditd: sudo apt-get install auditd 启动auditd: sudo service auditd start 设置监视挂载目录: auditctl -w /mnt/ossfs 在auditlog中可以查看是哪些进程访问了这个目录:ausearch -i | grep /mnt/ossfs Q: 使用ossfs上传到OSS的文件Content-Type全是”application/octet-stream”是怎么回事? ossfs通过查询/etc/mime.types中的内容来确定文件的Content-Type,请检查这个文件是否存在,如果不存在,则需要添加: 对于ubuntu可以通过sudo apt-get install mime-support来添加 对于centos可以通过sudo yum install mailcap来添加 也可以手动添加,每种格式一行,每行格式为:application/javascript js Q: 如何使用supervisor启动ossfs? 安装supervisor,在ubuntu中执行sudo apt-get install supervisor 建立一个目录,编辑ossfs的启动脚本:mkdir /root/ossfs_scripts vi /root/ossfs_scripts/start_ossfs.sh写入如下数据:# 卸载 fusermount -u /mnt/ossfs # 重新挂载,必须要增加-f参数运行ossfs,让ossfs在前台运行 exec ossfs my-bucket my-mount-point -ourl=my-oss-endpoint -f 编辑/etc/supervisor/supervisord.conf,在最后加入下面一段:[program:ossfs] command=bash /root/ossfs_scripts/start_ossfs.sh logfile=/var/log/ossfs.log log_stdout=true log_stderr=true logfile_maxbytes=1MB logfile_backups=10 运行supervisor:supervisordsupervisord 确认一切正常:ps aux | grep supervisor # 应该能看到supervisor进程 ps aux | grep ossfs # 应该能看到ossfs进程 kill -9 ossfs # 杀掉ossfs进程,supervisor应该会重启它, 不要使用killall, 因为killall发送SIGTERM,进程正常退出,supervisor不再去重新运行ossfs ps aux | grep ossfs # 应该能看到ossfs进程如果出错,请检查/var/log/supervisor/supervisord.log和/var/log/ossfs.log。 Q: 遇到”fuse: warning: library too old, some operations may not work”怎么办? 出现的原因是:ossfs编译时所使用的libfuse版本 比运行时链接到的libfuse版本高。这往往是用户自行安装了libfuse导致的。使用我们提供的rpm包安装ossfs,无需再安装libfuse。 在CentOS-5.x和CentOS-6.x上我们提供的rpm包里包含了libfuse-2.8.4,如果在运行的时候环境中有libfuse-2.8.3,并且ossfs被链接到了旧版本的fuse上,就会出现上述warning。 如何确认ossfs运行时链接的fuse版本? 运行ldd $(which ossfs) | grep fuse 例如结果是”/lib64/libfuse.so.2”,那么通过ls -l /lib64/libfuse*可以看到fuse的版本 如何让ossfs链接到正确的版本? 首先通过rpm -ql ossfs | grep fuse找到libfuse的目录 例如结果是”/usr/lib/libfuse.so.2”,则通过LD_LIBRARY_PATH=/usr/lib ossfs …运行ossfs 我能忽略这个WARNING吗? 最好不要,见这个bug Q: 为什么用ossfs看到的文件信息(例如大小)与其他工具看到的不一致? 因为ossfs默认会缓存文件的元信息(包括大小/权限等),这样就不需要每次ls的时候向OSS发送请求,加快速度。 如果用户通过其他程序(例如SDK/官网控制台/osscmd等)对文件进行了修改,那么有可能在ossfs中看到的文件信息 没有及时更新。 如果想禁止ossfs的缓存,那么可以在挂载的时候加上如下参数:-omax_stat_cache_size=0

2019-12-01 23:15:16 0 浏览量 回答数 0

问题

荆门开诊断证明-scc

游客5k2abgdj3m2ti 2019-12-01 22:09:00 1 浏览量 回答数 0

问题

[精品问答]Java一百问第一期

问问小秘 2019-12-01 21:51:20 791 浏览量 回答数 1

问题

公共参数应该如何应用?

猫饭先生 2019-12-01 21:21:00 1016 浏览量 回答数 0

问题

【精品问答】Java技术1000问(1)

问问小秘 2019-12-01 21:57:43 39155 浏览量 回答数 15

问题

ossfs如何实现FAQ?

青衫无名 2019-12-01 21:59:10 1446 浏览量 回答数 0

回答

1、了解视频面试的有效交流成分 面试者可先试演盯着摄像头说话,让对方有一种面谈的感觉;增加一些无伤大雅的微动作,比如点头赞同对方;以及找到自己最适合视频说话的语调和语速,这些将会缩小与面试官的距离感。 2、熟悉面试平台的操作流程 可以使用一下自己常用的招聘APP,查找一下平台视频面试流程的详细说明 3、做好个人面试前的准备 天下大事,必作于细。除了对视频面试和面试平台的了解,个人的准备也是事关重要的。 - [1]个人的形象准备。 虽然是线上的视频面试,但还是可以看到彼此,我们都需要做好准备。比如面试官在国外的下午进行视频面试,国内刚好是晚上,如果此时一身家居服的你与面试官视频,对方难以感受到尊重。所以,无论任何时间点,符合面试的正式服装并且穿戴整齐,才能将专业度传递给面试官。 - [2]室内场所的选择。 选择一个安静的没有干扰的地方,视频区域整洁没有多余的杂物;灯光明亮,避免人像曝光,面试官可清晰看到你;确保坐的椅子舒适,利于自己在面试过程中精神保持专注。 - [3]个人设备和网络。 确认手机电量充足,对应的相机和麦克风功能可以正常使用;关闭任何会发出提示音的设备,避免面试中收到干扰;测试设备和网络是否能正常使用,减少面试中出现断网等低级错误。疫情未止,但这不会成为找工作面试的阻碍,在疫情期间做好面试的充足准备,提高线上面试的重视度,即便现场出现突发状况,镇静并且及时与对方沟通,商量解决方案,一切都能迎刃而解。总之,只要做好十足的准备,确保一切都是最佳状态,即便从未经历过视频面试的你,也能脱颖而出。 面试某技术岗位,事先练习面试题 比如Python,小编为大家精心准备了以下面试题 1.Python是如何进行内存管理的? 答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制 一、对象的引用计数机制 Python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数。 引用计数增加的情况: - 1,一个对象分配一个新名称 - 2,将其放入一个容器中(如列表、元组或字典) 引用计数减少的情况: - 1,使用del语句对对象别名显示的销毁 - 2,引用超出作用域或被重新赋值 sys.getrefcount( )函数可以获得对象的当前引用计数 多数情况下,引用计数比你猜测得要大得多。对于不可变数据(如数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存。 二、垃圾回收 - 1,当一个对象的引用计数归零时,它将被垃圾收集机制处理掉。 - 2,当两个对象a和b相互引用时,del语句可以减少a和b的引用计数,并销毁用于引用底层对象的名称。然而由于每个对象都包含一个对其他对象的应用,因此引用计数不会归零,对象也不会销毁。(从而导致内存泄露)。为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。 三、内存池机制 Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。 - 1,Pymalloc机制。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。 - 2,Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc。 - 3,对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。 2.什么是lambda函数?它有什么好处? 答:lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数 lambda函数:首要用途是指点短小的回调函数 lambda [arguments]:expression a=lambdax,y:x+y a(3,11) 3.Python里面如何实现tuple和list的转换? 答:直接使用tuple和list函数就行了,type()可以判断对象的类型 4.请写出一段Python代码实现删除一个list里面的重复元素 答: - 1,使用set函数,set(list) - 2,使用字典函数, a=[1,2,4,2,4,5,6,5,7,8,9,0] b={} b=b.fromkeys(a) c=list(b.keys()) c 5.编程用sort进行排序,然后从最后一个元素开始判断 a=[1,2,4,2,4,5,7,10,5,5,7,8,9,0,3] a.sort() last=a[-1] for i inrange(len(a)-2,-1,-1): if last==a[i]: del a[i] else:last=a[i] print(a) 6.Python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别) 答:赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。 浅拷贝:创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会修改改变){1,完全切片方法;2,工厂函数,如list();3,copy模块的copy()函数} 深拷贝:创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另外一个不会改变){copy模块的deep.deepcopy()函数} 7.介绍一下except的用法和作用? 答:try…except…except…[else…][finally…] 执行try下的语句,如果引发异常,则执行过程会跳到except语句。对每个except分支顺序尝试执行,如果引发的异常与except中的异常组匹配,执行相应的语句。如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。 try下的语句正常执行,则执行else块代码。如果发生异常,就不会执行 如果存在finally语句,最后总是会执行。 8.Python中pass语句的作用是什么? 答:pass语句不会执行任何操作,一般作为占位符或者创建占位程序,whileFalse:pass 9.介绍一下Python下range()函数的用法? 答:列出一组数据,经常用在for in range()循环中 10.如何用Python来进行查询和替换一个文本字符串? 答:可以使用re模块中的sub()函数或者subn()函数来进行查询和替换, 格式:sub(replacement, string[,count=0])(replacement是被替换成的文本,string是需要被替换的文本,count是一个可选参数,指最大被替换的数量) import re p=re.compile(‘blue|white|red’) print(p.sub(‘colour’,'blue socks and red shoes’)) colour socks and colourshoes print(p.sub(‘colour’,'blue socks and red shoes’,count=1)) colour socks and redshoes subn()方法执行的效果跟sub()一样,不过它会返回一个二维数组,包括替换后的新的字符串和总共替换的数量 11.Python里面match()和search()的区别? 答:re模块中match(pattern,string[,flags]),检查string的开头是否与pattern匹配。 re模块中research(pattern,string[,flags]),在string搜索pattern的第一个匹配值。 print(re.match(‘super’, ‘superstition’).span()) (0, 5) print(re.match(‘super’, ‘insuperable’)) None print(re.search(‘super’, ‘superstition’).span()) (0, 5) print(re.search(‘super’, ‘insuperable’).span()) (2, 7) 12.用Python匹配HTML tag的时候,<.>和<.?>有什么区别? 答:术语叫贪婪匹配( <.> )和非贪婪匹配(<.?> ) 例如: test <.> : test <.?> : 13.Python里面如何生成随机数? 答:random模块 随机整数:random.randint(a,b):返回随机整数x,a<=x<=b random.randrange(start,stop,[,step]):返回一个范围在(start,stop,step)之间的随机整数,不包括结束值。 随机实数:random.random( ):返回0到1之间的浮点数 random.uniform(a,b):返回指定范围内的浮点数。 14.有没有一个工具可以帮助查找python的bug和进行静态的代码分析? 答:PyChecker是一个python代码的静态分析工具,它可以帮助查找python代码的bug, 会对代码的复杂度和格式提出警告 Pylint是另外一个工具可以进行codingstandard检查 15.如何在一个function里面设置一个全局的变量? 答:解决方法是在function的开始插入一个global声明: def f() global x 16.单引号,双引号,三引号的区别 答:单引号和双引号是等效的,如果要换行,需要符号(),三引号则可以直接换行,并且可以包含注释 如果要表示Let’s go 这个字符串 单引号:s4 = ‘Let\’s go’ 双引号:s5 = “Let’s go” s6 = ‘I realy like“python”!’ 这就是单引号和双引号都可以表示字符串的原因了 最后小编祝福大家能在2020年找到心仪的工作哈

剑曼红尘 2020-03-12 16:06:50 0 浏览量 回答数 0

回答

简介 如果您听说过 Node,或者阅读过一些文章,宣称 Node 是多么多么的棒,那么您可能会想:“Node 究竟是什么东西?”尽管不是针对所有人的,但 Node 可能是某些人的正确选择。 为试图解释什么是 Node.js,本文探究了它能解决的问题,它如何工作,如何运行一个简单应用程序,最后,Node 何时是和何时不是一个好的解决方案。本文不涉及如何编写一个复杂的 Node 应用程序,也不是一份全面的 Node 教程。阅读本文应该有助于您决定是否应该学习 Node,以便将其用于您的业务。 Node 旨在解决什么问题? Node 公开宣称的目标是 “旨在提供一种简单的构建可伸缩网络程序的方法”。当前的服务器程序有什么问题?我们来做个数学题。在 Java™ 和 PHP 这类语言中,每个连接都会生成一个新线程,每个新线程可能需要 2 MB 配套内存。在一个拥有 8 GB RAM 的系统上,理论上最大的并发连接数量是 4,000 个用户。随着您的客户端基础的增长,您希望您的 web 应用程序支持更多用户,这样,您必须添加更多服务器。当然,这会增加业务成本,尤其是服务器成本、运输成本和人工成本。除这些成本上升外,还有一个技术问题:用户可能针对每个请求使用不同的服务器,因此,任何共享资源都必须在所有服务器之间共享。例如,在 Java 中,静态变量和缓存需要在每个服务器上的 JVMs 之间共享。这就是整个 web 应用程序架构中的瓶颈:一个服务器能够处理的并发连接的最大数量。 Node 解决这个问题的方法是:更改连接连接到服务器的方式。每个连接都创建一个进程,该进程不需要配套内存块,而不是为每个连接生成一个新的 OS 线程(并向其分配一些配套内存)。Node 声称它绝不会死锁,因为它根本不允许使用锁,它不会直接阻塞 I/O 调用。Node 还宣称,运行它的服务器能支持数万个并发连接。事实上,Node 通过将整个系统中的瓶颈从最大连接数量更改到单个系统的流量来改变服务器面貌。 现在您有了一个能处理数万条并发连接的程序,那么您能通过 Node 实际构建什么呢?如果您有一个 web 应用程序需要处理这么多连接,那将是一件很 “恐怖” 的事!那是一种 “如果您有这个问题,那么它根本不是问题” 的问题。在回答上面的问题之前,我们先看看 Node 如何工作以及它被设计的如何运行。 Node 肯定不是什么 没错,Node 是一个服务器程序。但是,它肯定不 像 Apache 或 Tomcat。那些服务器是独立服务器产品,可以立即安装并部署应用程序。通过这些产品,您可以在一分钟内启动并运行一个服务器。Node 肯定不是这种产品。Apache 能添加一个 PHP 模块来允许开发人员创建动态 web 页,使用 Tomcat 的程序员能部署 JSPs 来创建动态 web 页。Node 肯定不是这种类型。 在 Node 的早期阶段(当前是 version 0.4.6),它还不是一个 “运行就绪” 的服务器程序,您还不能安装它,向其中放置文件,拥有一个功能齐全的 web 服务器。即使是要实现 web 服务器在安装完成后启动并运行这个基本功能,也还需要做大量工作。 Node 如何工作 Node 本身运行 V8 JavaScript。等等,服务器上的 JavaScript?没错,您没有看错。服务器端 JavaScript 是一个相对较新的概念,这个概念是大约两年前在 developerWorks 上讨论 Aptana Jaxer 产品时提到的(参见 参考资料)。尽管 Jaxer 一直没有真正流行,但这个理念本身并不是遥不可及的 — 为何不能在服务器上使用客户机上使用的编程语言? 什么使 V8?V8 JavaScript 引擎是 Google 用于他们的 Chrome 浏览器的底层 JavaScript 引擎。很少有人考虑 JavaScript 在客户机上实际做了些什么?实际上,JavaScript 引擎负责解释并执行代码。使用 V8,Google 创建了一个以 C++ 编写的超快解释器,该解释器拥有另一个独特特征;您可以下载该引擎并将其嵌入任何 应用程序。它不仅限于在一个浏览器中运行。因此,Node 实际上使用 Google 编写的 V8 JavaScript 引擎并将其重建为在服务器上使用。太完美了!既然已经有一个不错的解决方案可用,为何还要创建一种新语言呢? 事件驱动编程 许多程序员接受的教育使他们认为,面向对象编程是完美的编程设计,而对其他编程方法不屑一顾。Node 使用一个所谓的事件驱动编程模型。 清单 1. 客户端上使用 jQuery 的事件驱动编程 复制代码 代码如下: // jQuery code on the client-side showing how Event-Driven programming works // When a button is pressed, an Event occurs - deal with it // directly right here in an anonymous function, where all the // necessary variables are present and can be referenced directly $("#myButton").click(function(){ if ($("#myTextField").val() != $(this).val()) alert("Field must match button text"); }); 实际上,服务器端和客户端没有任何区别。没错,这没有按钮点击操作,也没有向文本字段键入的操作,但在一个更高的层面上,事件正在 发生。一个连接被建立 — 事件!数据通过连接接收 — 事件!数据通过连接停止 — 事件! 为什么这种设置类型对 Node 很理想?JavaScript 是一种很棒的事件驱动编程语言,因为它允许匿名函数和闭包,更重要的是,任何写过代码的人都熟悉它的语法。事件发生时调用的回调函数可以在捕获事件处编写。这样,代码容易编写和维护,没有复杂的面向对象框架,没有接口,没有在上面架构任何内容的潜能。只需监听事件,编写一个回调函数,然后,事件驱动编程将照管好一切! 示例 Node 应用程序 最后,我们来看一些代码!让我们将讨论过的所有内容综合起来,创建我们的第一个 Node 应用程序。由于我们已经知道,Node 对于处理高流量应用程序很理想,我们就来创建一个非常简单的 web 应用程序 — 一个为实现最大速度而构建的应用程序。下面是 “老板” 交代的关于我们的样例应用程序的具体要求:创建一个随机数字生成器 RESTful API。这个应用程序应该接受一个输入:一个名为 “number” 的参数。然后,应用程序返回一个介于 0 和该参数之间的随机数字,并将生成的数字返回调用者。由于 “老板” 希望它成为一个广泛流行的应用程序,因此它应该能处理 50,000 个并发用户。我们来看看代码: 清单 2. Node 随机数字生成器 复制代码 代码如下: // these modules need to be imported in order to use them. // Node has several modules. They are like any #include // or import statement in other languages var http = require("http"); var url = require("url"); // The most important line in any Node file. This function // does the actual process of creating the server. Technically, // Node tells the underlying operating system that whenever a // connection is made, this particular callback function should be // executed. Since we're creating a web service with REST API, // we want an HTTP server, which requires the http variable // we created in the lines above. // Finally, you can see that the callback method receives a 'request' // and 'response' object automatically. This should be familiar // to any PHP or Java programmer. http.createServer(function(request, response) { // The response needs to handle all the headers, and the return codes // These types of things are handled automatically in server programs // like Apache and Tomcat, but Node requires everything to be done yourself response.writeHead(200, {"Content-Type": "text/plain"}); // Here is some unique-looking code. This is how Node retrives // parameters passed in from client requests. The url module // handles all these functions. The parse function // deconstructs the URL, and places the query key-values in the // query object. We can find the value for the "number" key // by referencing it directly - the beauty of JavaScript. var params = url.parse(request.url, true).query; var input = params.number; // These are the generic JavaScript methods that will create // our random number that gets passed back to the caller var numInput = new Number(input); var numOutput = new Number(Math.random() * numInput).toFixed(0); // Write the random number to response response.write(numOutput); // Node requires us to explicitly end this connection. This is because // Node allows you to keep a connection open and pass data back and forth, // though that advanced topic isn't discussed in this article. response.end(); // When we create the server, we have to explicitly connect the HTTP server to // a port. Standard HTTP port is 80, so we'll connect it to that one. }).listen(80); // Output a String to the console once the server starts up, letting us know everything // starts up correctly console.log("Random Number Generator Running..."); 将上面的代码放到一个名为 “random.js” 的文件中。现在,要启动这个应用程序并运行它(进而创建 HTTP 服务器并监听端口 80 上的连接),只需在您的命令提示中输入以下命令:% node random.js。下面是服务器已经启动并运行时它看起来的样子: 复制代码 代码如下: root@ubuntu:/home/moila/ws/mike# node random.js Random Number Generator Running... 访问应用程序 应用程序已经启动并运行。Node 正在监听任何连接,我们来测试一下。由于我们创建了一个简单的 RESTful API,我们可以使用我们的 web 浏览器来访问这个应用程序。键入以下地址(确保您完成了上面的步骤):localhost/?number=27。 您的浏览器窗口将更改到一个介于 0 到 27 之间的随机数字。单击浏览器上的 “重新载入” 按钮,将得到另一个随机数字。就是这样,这就是您的第一个 Node 应用程序! Node 对什么有好处? 到此为止,应该能够回答 “Node 是什么” 这个问题了,但您可能还不清楚什么时候应该使用它。这是一个需要提出的重要问题,因为 Node 对有一些东西有好处,但相反,对另一些东西而言,目前 Node 可能不是一个好的解决方案。您需要小心决定何时使用 Node,因为在错误的情况下使用它可能会导致一个多余编码的 LOT。 它对什么有好处? 正如您此前所看到的,Node 非常适合以下情况:您预计可能有很高的流量,而在响应客户端之前服务器端逻辑和处理所需不一定是巨大的。Node 表现出众的典型示例包括: 1.RESTful API 提供 RESTful API 的 web 服务接收几个参数,解析它们,组合一个响应,并返回一个响应(通常是较少的文本)给用户。这是适合 Node 的理想情况,因为您可以构建它来处理数万条连接。它还不需要大量逻辑;它只是从一个数据库查找一些值并组合一个响应。由于响应是少量文本,入站请求时少量文本,因此流量不高,一台机器甚至也可以处理最繁忙的公司的 API 需求。 2.Twitter 队列 想像一下像 Twitter 这样的公司,它必须接收 tweets 并将其写入一个数据库。实际上,每秒几乎有数千条 tweets 达到,数据库不可能及时处理高峰时段需要的写入数量。Node 成为这个问题的解决方案的重要一环。如您所见,Node 能处理数万条入站 tweets。它能迅速轻松地将它们写入一个内存排队机制(例如 memcached),另一个单独进程可以从那里将它们写入数据库。Node 在这里的角色是迅速收集 tweet 并将这个信息传递给另一个负责写入的进程。想象一下另一种设计 — 一个常规 PHP 服务器自己试图处理对数据库的写入 — 每个 tweet 将在写入数据库时导致一个短暂的延迟,这是因为数据库调用正在阻塞通道。由于数据库延迟,一台这样设计的机器每秒可能只能处理 2000 条入站 tweets。每秒 100 万条 tweets 需要 500 个服务器。相反,Node 能处理每个连接而不会阻塞通道,从而能捕获尽可能多的 tweets。一个能处理 50,000 条 tweets 的 Node 机器只需要 20 个服务器。 3.映像文件服务器 一个拥有大型分布式网站的公司(比如 Facebook 或 Flickr)可能会决定将所有机器只用于服务映像。Node 将是这个问题的一个不错的解决方案,因为该公司能使用它编写一个简单的文件检索器,然后处理数万条连接。Node 将查找映像文件,返回文件或一个 404 错误,然后什么也不用做。这种设置将允许这类分布式网站减少它们服务映像、.js 和 .css 文件等静态文件所需的服务器数量。 它对什么有坏处? 当然,在某些情况下,Node 并非理想选择。下面是 Node 不擅长的领域: 1.动态创建的页 目前,Node 没有提供一种默认方法来创建动态页。例如,使用 JavaServer Pages (JSP) 技术时,可以创建一个在这样的 JSP 代码段中包含循环的 index.jsp 页。Node 不支持这类动态的、HTML 驱动的页面。同样,Node 不太适合作为 Apache 和 Tomcat 这样的网页服务器。因此,如果您想在 Node 中提供这样一个服务器端解决方案,必须自己编写整个解决方案。PHP 程序员不想在每次部署 web 应用程序时都编写一个针对 Apache 的 PHP 转换器,当目前为止,这正是 Node 要求您做的。 2. 关系数据库重型应用程序 Node 的目的是快速、异步和非阻塞。数据库并不一定分享这些目标。它们是同步和阻塞的,因为读写时对数据库的调用在结果生成之前将一直阻塞通道。因此,一个每个请求都需要大量数据库调用、大量读取、大量写入的 web 应用程序非常不适合 Node,这是因为关系数据库本身就能抵销 Node 的众多优势。(新的 NoSQL 数据库更适合 Node,不过那完全是另一个主题了。) 结束语 问题是 “什么是 Node.js?” 应该已经得到解答。阅读本文之后,您应该能通过几个清晰简洁的句子回答这个问题。如果这样,那么您已经走到了许多编码员和程序员的前面。我和许多人都谈论过 Node,但它们对 Node 究竟是什么一直很迷惑。可以理解,他们具有的是 Apache 的思维方式 — 服务器是一个应用程序,将 HTML 文件放入其中,一切就会正常运转。而 Node 是目的驱动的。它是一个软件程序,使用 JavaScript 来允许程序员轻松快速地创建快速、可伸缩的 web 服务器。Apache 是运行就绪的,而 Node 是编码就绪的。 Node 完成了它提供高度可伸缩服务器的目标。它并不分配一个 “每个连接一个线程” 模型,而是使用一个 “每个连接一个流程” 模型,只创建每个连接需要的内存。它使用 Google 的一个非常快速的 JavaScript 引擎:V8 引擎。它使用一个事件驱动设计来保持代码最小且易于阅读。所有这些因素促成了 Node 的理想目标 — 编写一个高度可伸缩的解决方案变得比较容易。 与理解 Node 是 什么同样重要的是,理解它不是 什么。Node 并不是 Apache 的一个替代品,后者旨在使 PHP web 应用程序更容易伸缩。事实确实如此。在 Node 的这个初始阶段,大量程序员使用它的可能性不大,但在它能发挥作用的场景中,它的表现非常好。 将来应该期望从 Node 得到什么呢?这也许是本文引出的最重要的问题。既然您知道了它现在的作用,您应该会想知道它下一步将做什么。在接下来的一年中,我期待着 Node 提供与现有的第三方支持库更好地集成。现在,许多第三方程序员已经研发了用于 Node 的插件,包括添加文件服务器支持和 MySQL 支持。希望 Node 开始将它们集成到其核心功能中。最后,我还希望 Node 支持某种动态页面模块,这样,您就可以在 HTML 文件中执行在 PHP 和 JSP(也许是一个 NSP,一个 Node 服务器页)中所做的操作。最后,希望有一天会出现一个 “部署就绪” 的 Node 服务器,可以下载和安装,只需将您的 HTML 文件放到其中,就像使用 Apache 或 Tomcat 那样。Node 现在还处于初始阶段,但它发展得很快,可能不久就会出现在您的视野中。 答案来源于网络

养狐狸的猫 2019-12-02 02:17:03 0 浏览量 回答数 0

回答

当日志采集发生异常时,您可以通过Logtail自助检测工具查看客户端是否存在异常情况,根据工具提示快速定位并解决问题。 说明 本工具目前仅支持Linux系统的服务器。 准备工作 下载检测工具脚本。 wget http://logtail-release.oss-cn-hangzhou.aliyuncs.com/linux64/checkingtool.sh -O checkingtool.sh 说明 如果无法正常下载,请通过以下备用地址重试。 wget http://logtail-corp.oss-cn-hangzhou-zmf.aliyuncs.com/linux64/checkingtool.sh -O checkingtool.sh 安装curl工具。 检查工具需要使用curl进行网络连通性检查,请确保机器已安装curl工具。 运行诊断工具 执行以下命令运行诊断工具: chmod 744 ./checkingtool.sh ./checkingtool.sh sh checkingtool.sh 回显信息: [Info]: Logtail checking tool version : 0.3.0 [Input]: please choose which item you want to check : 1. MachineGroup heartbeat fail. 2. MachineGroup heartbeat is ok, but log files have not been collected. Item : 请根据提示输入1或2,脚本会根据您的选择执行不同检查流程。 其中: 1表示执行机器组心跳检查,机器组心跳失败时请选择此项。 2表示执行日志采集检查,机器组心跳成功,但日志文件没有被采集时,请选择此项。 选择检查项目后,诊断工具会自动执行对应检查流程。 诊断流程 机器组心跳检查 选择机器组心跳检查流程后会进行下述一系列的检查: 基础环境检查。 是否安装Logtail。 是否运行Logtail。 SSL状态是否正常。 与日志服务之间是否有网络联通。 [Info]: Logtail checking tool version : 0.3.0 [Input]: please choose which item you want to check : 1. MachineGroup heartbeat fail. 2. MachineGroup heartbeat is ok, but log files have not been collected. Item :1 [Info]: Check logtail install files [Info]: Install file: ilogtail_config.json exists. [ OK ] [Info]: Install file: /etc/init.d/ilogtaild exists. [ OK ] [Info]: Install file: ilogtail exists. [ OK ] [Info]: Bin file: /usr/local/ilogtail/ilogtail_0.14.2 exists. [ OK ] [Info]: Logtail version : [ OK ] [Info]: Check logtail running status [Info]: Logtail is runnings. [ OK ] [Info]: Check network status [Info]: Logtail is using ip: 11.XX.XX.187 [Info]: Logtail is using UUID: 0DF18E97-0F2D-486F-B77F-XXXXXXXXXXXX [Info]: Check SSL status [Info]: SSL status OK. [ OK ] [Info]: Check logtail config server [Info]: config server address: http://config.sls.aliyun-inc.com [Info]: Logtail config server OK 若其中检查出现Error信息,请参考提示进行处理。 确认是否非本人ECS。 基础环境检查通过后,请确认您的服务器是否为ECS、是否由本账号购买。 若此服务器不是ECS或者ECS购买账号和日志服务账号不同,输入y,否则输入N。 [Input]: Is your server non-Alibaba Cloud ECS or not belong to the same account with the current Project of Log Service ? (y/N) 当输入y后,检查工具会输出本地配置的AliUid信息,请确认其中是否包含了您的AliUid,若未包含请参考文档创建AliUid标识。 [Input]: Is your server non-Alibaba Cloud ECS or not belong to the same account with the current Project of Log Service ? (y/N)y [Info]: Check aliyun user id(s) [Info]: aliyun user id : 126XXXXXXXXXX79 . [ OK ] [Info]: aliyun user id : 165XXXXXXXXXX50 . [ OK ] [Info]: aliyun user id : 189XXXXXXXXXX57 . [ OK ] [Input]: Is your project owner account ID is the above IDs ? (y/N) 检查Region。 请确认您的Project所在区域是否和Logtail安装时所选区域一致,若不一致请重新安装Logtail。 [Input]: please make sure your project is in this region : { cn-hangzhou } (y/N) : 检查IP配置。 请确认您机器组配置的IP和Logtail工作IP一致,若不一致请参考IP地址机器组修改。 若您配置的是自定义标识机器组,请确认本地配置的标识与服务端配置一致,若不一致请参考自定义标识机器组修改。 [Input]: please make sure your machine group's ip is same with : { 11.XX.XX.187 } or your machine group's userdefined-id is in : { XX-XXXXX } (y/N) : 日志采集检查 选择日志未采集检查流程后会进行下述一系列的检查: 确认IP配置。 请确认您机器组配置的ip和Logtail工作ip一致且心跳正常,若不一致请修改机器组。 [Input]: please make sure your machine group's ip is same with : { 11.XX.XX.187 } (y/N) : 确认采集配置应用。 请确认您的采集配置已经成功应用到该机器组中,如何查看机器组应用配置参见管理机器组。 [Input]: please make sure you have applied collection config to the machine group (y/N) :Y 检查日志文件。 检查时请输入您需要检查的日志文件全路径,若未找到匹配项,请确认配置的路径信息可以匹配给定的日志文件。 若配置错误请重新修改采集配置并保存,1分钟后再次执行此脚本重新检查。 [Input]: please input your log file's full path (eg. /var/log/nginx/access.log) :/disk2/logs/access.log [Info]: Check specific log file [Info]: Check if specific log file [ /disk2/logs/access.log ] is included by user config. [Warning]: Specific log file doesnt exist. [ Warning ] [Info]: Matched config found: [ OK ] [Info]: [Project] -> sls-zc-xxxxxx [Info]: [Logstore] -> release-xxxxxxx [Info]: [LogPath] -> /disk2/logs [Info]: [FilePattern] -> *.log 检查通过但采集依然异常 若所有的检查全部通过,但采集依然出现异常,请在脚本最后的选择中输入y并回车确认。 请您将检查脚本输出的信息作为附件,提交工单给我们的售后工程师。 [Input]: please make sure all the check items above have passed. If the problem persists, please copy all the outputs and submit a ticket in the ticket system. : (y/N)y 快速检查 快速检查运行时无需确认,可用于二次封装自定义检查脚本。 说明 快速检查运行时会输出客户端配置的阿里云ID和动态机器组/自定义标识,不存在时并不会给出告警,如果客户端需要阿里云ID或动态机器组/自定义标识的配置,请查看工具的输出和您配置的是否一致,不一致时按照以下方法重新配置:创建AliUid标识、自定义标识机器组。 操作步骤 请运行脚本./checkingtool.sh --logFile [LogFileFullPath]进行检查。 检测脚本发现异常时,请根据脚本提示进行处理。 说明 若指定日志文件检查通过且Logtail运行环境正常,建议进入阿里云控制台中查看该日志服务配置项的异常日志,参见诊断采集错误。 Logtail采集异常的常见问题 运行Logtail快速诊断工具后,可以诊断出Logtail采集异常的原因,您可以根据具体原因查找对应的解决方案。常见Logtail采集问题原因及解决方案如下。 常见问题 解决方法 安装文件丢失 重装Logtail。 Logtail未运行 使用命令/etc/init.d/ilogtaild start开启Logtail。 多个Logtail进程 使用命令/etc/init.d/ilogtaild stop关闭Logtail,然后执行命令/etc/init.d/ilogtaild start开启。 443端口被禁用 防火墙开放443端口。 无法找到配置服务器 确认是否已正确安装 Linux Logtail,若安装错误,重新执行安装命令。 不存在用户配置 确认是否已执行以下操作: 控制台已经创建好Logtail配置。 机器组中包含该服务器。 已经将配置应用到机器组。 没有匹配指定日志文件 确认是否正确配置了Logtail。 指定日志文件匹配多次 匹配多次时Logtail会随机选择一个配置,建议去重。 检测工具常用参数 常用参数 说明 --help 查看帮助文档。 --logFile [LogFileFullPath] 检测Logtail是否收集路径为LogFileFullPath的日志,同时检查基本的Logtail运行环境(安装文件完整性、运行状态、阿里云userID、网络连通性等)。 --logFileOnly [LogFileFullPath] 只检测Logtail是否收集路径为LogFileFullPath的日志。 --envOnly 只检测Logtail运行环境。

保持可爱mmm 2020-03-26 23:03:12 0 浏览量 回答数 0

问题

【精品问答】python技术1000问(1)

问问小秘 2019-12-01 21:57:48 455812 浏览量 回答数 21

回答

HTTPS基本原理 一、http为什么不安全。 http协议没有任何的加密以及身份验证的机制,非常容易遭遇窃听、劫持、篡改,因此会造成个人隐私泄露,恶意的流量劫持等严重的安全问题。 国外很多网站都支持了全站https,国内方面目前百度已经在年初完成了搜索的全站https,其他大型的网站也在跟进中,百度最先完成全站https的最大原因就是百度作为国内最大的流量入口,劫持也必然是首当其冲的,造成的有形的和无形的损失也就越大。关于流量劫持问题,我在另一篇文章中也有提到,基本上是互联网企业的共同难题,https也是目前公认的比较好的解决方法。但是https也会带来很多性能以及访问速度上的牺牲,很多互联网公司在做大的时候都会遇到这个问题:https成本高,速度又慢,规模小的时候在涉及到登录和交易用上就够了,做大以后遇到信息泄露和劫持,想整体换,代价又很高。 2、https如何保证安全 要解决上面的问题,就要引入加密以及身份验证的机制。 这时我们引入了非对称加密的概念,我们知道非对称加密如果是公钥加密的数据私钥才能解密,所以我只要把公钥发给你,你就可以用这个公钥来加密未来我们进行数据交换的秘钥,发给我时,即使中间的人截取了信息,也无法解密,因为私钥在我这里,只有我才能解密,我拿到你的信息后用私钥解密后拿到加密数据用的对称秘钥,通过这个对称密钥来进行后续的数据加密。除此之外,非对称加密可以很好的管理秘钥,保证每次数据加密的对称密钥都是不相同的。 但是这样似乎还不够,如果中间人在收到我的给你公钥后并没有发给你,而是自己伪造了一个公钥发给你,这是你把对称密钥用这个公钥加密发回经过中间人,他可以用私钥解密并拿到对称密钥,此时他在把此对称密钥用我的公钥加密发回给我,这样中间人就拿到了对称密钥,可以解密传输的数据了。为了解决此问题,我们引入了数字证书的概念。我首先生成公私钥,将公钥提供给相关机构(CA),CA将公钥放入数字证书并将数字证书颁布给我,此时我就不是简单的把公钥给你,而是给你一个数字证书,数字证书中加入了一些数字签名的机制,保证了数字证书一定是我给你的。 所以综合以上三点: 非对称加密算法(公钥和私钥)交换秘钥 + 数字证书验证身份(验证公钥是否是伪造的) + 利用秘钥对称加密算法加密数据 = 安全 3、https协议简介 为什么是协议简介呢。因为https涉及的东西实在太多了,尤其是一些加密算法,非常的复杂,对于这些算法面的东西就不去深入研究了,这部分仅仅是梳理一下一些关于https最基本的原理,为后面分解https的连接建立以及https优化等内容打下理论基础。 3.1 对称加密算法 对称加密是指加密和解密使用相同密钥的加密算法。它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信至关重要。 对称加密又分为两种模式:流加密和分组加密。 流加密是将消息作为位流对待,并且使用数学函数分别作用在每一个位上,使用流加密时,每加密一次,相同的明文位会转换成不同的密文位。流加密使用了密钥流生成器,它生成的位流与明文位进行异或,从而生成密文。现在常用的就是RC4,不过RC4已经不再安全,微软也建议网络尽量不要使用RC4流加密。 分组加密是将消息划分为若干位分组,这些分组随后会通过数学函数进行处理,每次一个分组。假设需要加密发生给对端的消息,并且使用的是64位的分组密码,此时如果消息长度为640位,就会被划分成10个64位的分组,每个分组都用一系列数学公式公式进行处理,最后得到10个加密文本分组。然后,将这条密文消息发送给对端。对端必须拥有相同的分组密码,以相反的顺序对10个密文分组使用前面的算法解密,最终得到明文的消息。比较常用的分组加密算法有DES、3DES、AES。其中DES是比较老的加密算法,现在已经被证明不安全。而3DES是一个过渡的加密算法,相当于在DES基础上进行三重运算来提高安全性,但其本质上还是和DES算法一致。而AES是DES算法的替代算法,是现在最安全的对称加密算法之一。分组加密算法除了算法本身外还存在很多种不同的运算方式,比如ECB、CBC、CFB、OFB、CTR等,这些不同的模式可能只针对特定功能的环境中有效,所以要了解各种不同的模式以及每种模式的用途。这个部分后面的文章中会详细讲。 对称加密算法的优、缺点: 优点:算法公开、计算量小、加密速度快、加密效率高。 缺点:(1)交易双方都使用同样钥匙,安全性得不到保证; (2)每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量呈几何级数增长,密钥管理成为用户的负担。 (3)能提供机密性,但是不能提供验证和不可否认性。 3.2 非对称加密算法 在非对称密钥交换算法出现以前,对称加密一个很大的问题就是不知道如何安全生成和保管密钥。非对称密钥交换过程主要就是为了解决这个问题,使得对称密钥的生成和使用更加安全。 密钥交换算法本身非常复杂,密钥交换过程涉及到随机数生成,模指数运算,空白补齐,加密,签名等操作。 常见的密钥交换算法有RSA,ECDHE,DH,DHE等算法。涉及到比较复杂的数学问题,下面就简单介绍下最经典的RSA算法。RSA:算法实现简单,诞生于1977年,历史悠久,经过了长时间的破解测试,安全性高。缺点就是需要比较大的素数也就是质数(目前常用的是2048位)来保证安全强度,很消耗CPU运算资源。RSA是目前唯一一个既能用于密钥交换又能用于证书签名的算法。我觉得RSA可以算是最经典的非对称加密算法了,虽然算法本身都是数学的东西,但是作为最经典的算法,我自己也花了点时间对算法进行了研究,后面会详细介绍。 非对称加密相比对称加密更加安全,但也存在两个明显缺点: 1,CPU计算资源消耗非常大。一次完全TLS握手,密钥交换时的非对称解密计算量占整个握手过程的90%以上。而对称加密的计算量只相当于非对称加密的0.1%,如果应用层数据也使用非对称加解密,性能开销太大,无法承受。 2,非对称加密算法对加密内容的长度有限制,不能超过公钥长度。比如现在常用的公钥长度是2048位,意味着待加密内容不能超过256个字节。 所以公钥加密(极端消耗CPU资源)目前只能用来作密钥交换或者内容签名,不适合用来做应用层传输内容的加解密。 3.3 身份认证 https协议中身份认证的部分是由数字证书来完成的,证书由公钥、证书主体、数字签名等内容组成,在客户端发起SSL请求后,服务端会将数字证书发给客户端,客户端会对证书进行验证(验证查看这张证书是否是伪造的。也就是公钥是否是伪造的),并获取用于秘钥交换的非对称密钥(获取公钥)。 数字证书有两个作用: 1,身份授权。确保浏览器访问的网站是经过CA验证的可信任的网站。 2,分发公钥。每个数字证书都包含了注册者生成的公钥(验证确保是合法的,非伪造的公钥)。在SSL握手时会通过certificate消息传输给客户端。 申请一个受信任的数字证书通常有如下流程: 1,终端实体(可以是一个终端硬件或者网站)生成公私钥和证书请求。 2,RA(证书注册及审核机构)检查实体的合法性。如果个人或者小网站,这一步不是必须的。 3,CA(证书签发机构)签发证书,发送给申请者。 4,证书更新到repository(负责数字证书及CRL内容存储和分发),终端后续从repository更新证书,查询证书状态等。 数字证书验证: 申请者拿到CA的证书并部署在网站服务器端,那浏览器发起握手接收到证书后,如何确认这个证书就是CA签发的呢。怎样避免第三方伪造这个证书。答案就是数字签名(digital signature)。数字签名是证书的防伪标签,目前使用最广泛的SHA-RSA(SHA用于哈希算法,RSA用于非对称加密算法)数字签名的制作和验证过程如下: 1,数字签名的签发。首先是使用哈希函数对待签名内容进行安全哈希,生成消息摘要,然后使用CA自己的私钥对消息摘要进行加密。 2,数字签名的校验。使用CA的公钥解密签名,然后使用相同的签名函数对待签名证书内容进行签名并和服务端数字签名里的签名内容进行比较,如果相同就认为校验成功。 需要注意的是: 1)数字签名签发和校验使用的密钥对是CA自己的公私密钥,跟证书申请者提交的公钥没有关系。 2)数字签名的签发过程跟公钥加密的过程刚好相反,即是用私钥加密,公钥解密。 3)现在大的CA都会有证书链,证书链的好处一是安全,保持根CA的私钥离线使用。第二个好处是方便部署和撤销,即如果证书出现问题,只需要撤销相应级别的证书,根证书依然安全。 4)根CA证书都是自签名,即用自己的公钥和私钥完成了签名的制作和验证。而证书链上的证书签名都是使用上一级证书的密钥对完成签名和验证的。 5)怎样获取根CA和多级CA的密钥对。它们是否可信。当然可信,因为这些厂商跟浏览器和操作系统都有合作,它们的公钥都默认装到了浏览器或者操作系统环境里。 3.4 数据完整性验证 数据传输过程中的完整性使用MAC算法来保证。为了避免网络中传输的数据被非法篡改,SSL利用基于MD5或SHA的MAC算法来保证消息的完整性。 MAC算法是在密钥参与下的数据摘要算法,能将密钥和任意长度的数据转换为固定长度的数据。发送者在密钥的参与下,利用MAC算法计算出消息的MAC值,并将其加在消息之后发送给接收者。接收者利用同样的密钥和MAC算法计算出消息的MAC值,并与接收到的MAC值比较。如果二者相同,则报文没有改变;否则,报文在传输过程中被修改,接收者将丢弃该报文。 由于MD5在实际应用中存在冲突的可能性比较大,所以尽量别采用MD5来验证内容一致性。SHA也不能使用SHA0和SHA1,中国山东大学的王小云教授在2005年就宣布破解了 SHA-1完整版算法。微软和google都已经宣布16年及17年之后不再支持sha1签名证书。MAC算法涉及到很多复杂的数学问题,这里就不多讲细节了。 专题二--【实际抓包分析】 抓包结果: fiddler: wireshark: 可以看到,百度和我们公司一样,也采用以下策略: (1)对于高版本浏览器,如果支持 https,且加解密算法在TLS1.0 以上的,都将所有 http请求重定向到 https请求 (2)对于https请求,则不变。 【以下只解读https请求】 1、TCP三次握手 可以看到,我们访问的是 http://www.baidu.com/ , 在初次建立 三次握手的时候, 用户是去 连接 8080端口的(因为公司办公网做了代理,因此,我们实际和代理机做的三次握手,公司代理机再帮我们去连接百度服务器的80端口) 2、CONNECT 建立 由于公司办公网访问非腾讯域名,会做代理,因此,在进行https访问的时候,我们的电脑需要和公司代理机做 " CONNECT " 连接(关于 " CONNECT " 连接, 可以理解为虽然后续的https请求都是公司代理机和百度服务器进行公私钥连接和对称秘钥通信,但是,有了 " CONNECT " 连接之后,可以认为我们也在直接和百度服务器进行公私钥连接和对称秘钥通信。 ) fiddler抓包结果: CONNECT之后, 后面所有的通信过程,可以看做是我们的机器和百度服务器在直接通信 3、 client hello 整个 Secure Socket Layer只包含了: TLS1.2 Record Layer内容 (1)随机数 在客户端问候中,有四个字节以Unix时间格式记录了客户端的协调世界时间(UTC)。协调世界时间是从1970年1月1日开始到当前时刻所经历的秒数。在这个例子中,0x2516b84b就是协调世界时间。在他后面有28字节的随机数( random_C ),在后面的过程中我们会用到这个随机数。 (2)SID(Session ID) 如果出于某种原因,对话中断,就需要重新握手。为了避免重新握手而造成的访问效率低下,这时候引入了session ID的概念, session ID的思想很简单,就是每一次对话都有一个编号(session ID)。如果对话中断,下次重连的时候,只要客户端给出这个编号,且服务器有这个编号的记录,双方就可以重新使用已有的"对话密钥",而不必重新生成一把。 因为我们抓包的时候,是几个小时内第一次访问 https://www.baodu.com 首页,因此,这里并没有 Session ID. (稍会儿我们会看到隔了半分钟,第二次抓包就有这个Session ID) session ID是目前所有浏览器都支持的方法,但是它的缺点在于session ID往往只保留在一台服务器上。所以,如果客户端的请求发到另一台服务器,就无法恢复对话。session ticket就是为了解决这个问题而诞生的,目前只有Firefox和Chrome浏览器支持。 (3) 密文族(Cipher Suites): RFC2246中建议了很多中组合,一般写法是"密钥交换算法-对称加密算法-哈希算法,以“TLS_RSA_WITH_AES_256_CBC_SHA”为例: (a) TLS为协议,RSA为密钥交换的算法; (b) AES_256_CBC是对称加密算法(其中256是密钥长度,CBC是分组方式); (c) SHA是哈希的算法。 浏览器支持的加密算法一般会比较多,而服务端会根据自身的业务情况选择比较适合的加密组合发给客户端。(比如综合安全性以及速度、性能等因素) (4) Server_name扩展:( 一般浏览器也支持 SNI(Server Name Indication)) 当我们去访问一个站点时,一定是先通过DNS解析出站点对应的ip地址,通过ip地址来访问站点,由于很多时候一个ip地址是给很多的站点公用,因此如果没有server_name这个字段,server是无法给与客户端相应的数字证书的,Server_name扩展则允许服务器对浏览器的请求授予相对应的证书。 还有一个很好的功能: SNI(Server Name Indication)。这个的功能比较好,为了解决一个服务器使用多个域名和证书的SSL/TLS扩展。一句话简述它的工作原理就是,在连接到服务器建立SSL连接之前先发送要访问站点的域名(Hostname),这样服务器根据这个域名返回一个合适的CA证书。目前,大多数操作系统和浏览器都已经很好地支持SNI扩展,OpenSSL 0.9.8已经内置这一功能,据说新版的nginx也支持SNI。) 4、 服务器回复(包括 Server Hello, Certificate, Certificate Status) 服务器在收到client hello后,会回复三个数据包,下面分别看一下: 1)Server Hello 1、我们得到了服务器的以Unix时间格式记录的UTC和28字节的随机数 (random_S)。 2、Seesion ID,服务端对于session ID一般会有三种选择 (稍会儿我们会看到隔了半分钟,第二次抓包就有这个Session ID) : 1)恢复的session ID:我们之前在client hello里面已经提到,如果client hello里面的session ID在服务端有缓存,服务端会尝试恢复这个session; 2)新的session ID:这里又分两种情况,第一种是client hello里面的session ID是空值,此时服务端会给客户端一个新的session ID,第二种是client hello里面的session ID此服务器并没有找到对应的缓存,此时也会回一个新的session ID给客户端; 3)NULL:服务端不希望此session被恢复,因此session ID为空。 3、我们记得在client hello里面,客户端给出了21种加密族,而在我们所提供的21个加密族中,服务端挑选了“TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256”。 (a) TLS为协议,RSA为密钥交换的算法; (b) AES_256_CBC是对称加密算法(其中256是密钥长度,CBC是分组方式); (c) SHA是哈希的算法。 这就意味着服务端会使用ECDHE-RSA算法进行密钥交换,通过AES_128_GCM对称加密算法来加密数据,利用SHA256哈希算法来确保数据完整性。这是百度综合了安全、性能、访问速度等多方面后选取的加密组合。 2)Certificate 在前面的https原理研究中,我们知道为了安全的将公钥发给客户端,服务端会把公钥放入数字证书中并发给客户端(数字证书可以自签发,但是一般为了保证安全会有一个专门的CA机构签发),所以这个报文就是数字证书,4097 bytes就是证书的长度。 我们打开这个证书,可以看到证书的具体信息,这个具体信息通过抓包报文的方式不是太直观,可以在浏览器上直接看。 (点击 chrome 浏览器 左上方的 绿色 锁型按钮) 3)Server Hello Done 我们抓的包是将 Server Hello Done 和 server key exchage 合并的包: 4)客户端验证证书真伪性 客户端验证证书的合法性,如果验证通过才会进行后续通信,否则根据错误情况不同做出提示和操作,合法性验证包括如下: 证书链的可信性trusted certificate path,方法如前文所述; 证书是否吊销revocation,有两类方式离线CRL与在线OCSP,不同的客户端行为会不同; 有效期expiry date,证书是否在有效时间范围; 域名domain,核查证书域名是否与当前的访问域名匹配,匹配规则后续分析; 5)秘钥交换 这个过程非常复杂,大概总结一下: (1)首先,其利用非对称加密实现身份认证和密钥协商,利用非对称加密,协商好加解密数据的 对称秘钥(外加CA认证,防止中间人窃取 对称秘钥) (2)然后,对称加密算法采用协商的密钥对数据加密,客户端和服务器利用 对称秘钥 进行通信; (3)最后,基于散列函数验证信息的完整性,确保通信数据不会被中间人恶意篡改。 此时客户端已经获取全部的计算协商密钥需要的信息:两个明文随机数random_C和random_S与自己计算产生的Pre-master(由客户端和服务器的 pubkey生成的一串随机数),计算得到协商对称密钥; enc_key=Fuc(random_C, random_S, Pre-Master) 6)生成 session ticket 如果出于某种原因,对话中断,就需要重新握手。为了避免重新握手而造成的访问效率低下,这时候引入了session ID的概念, session ID的思想很简单,就是每一次对话都有一个编号(session ID)。如果对话中断,下次重连的时候,只要客户端给出这个编号,且服务器有这个编号的记录,双方就可以重新使用已有的"对话密钥",而不必重新生成一把。 因为我们抓包的时候,是几个小时内第一次访问 https://www.baodu.com 首页,因此,这里并没有 Session ID. (稍会儿我们会看到隔了半分钟,第二次抓包就有这个Session ID) session ID是目前所有浏览器都支持的方法,但是它的缺点在于session ID往往只保留在一台服务器上。所以,如果客户端的请求发到另一台服务器,就无法恢复对话。session ticket就是为了解决这个问题而诞生的,目前只有Firefox和Chrome浏览器支持。 后续建立新的https会话,就可以利用 session ID 或者 session Tickets , 对称秘钥可以再次使用,从而免去了 https 公私钥交换、CA认证等等过程,极大地缩短 https 会话连接时间。 7) 利用对称秘钥传输数据 【半分钟后,再次访问百度】: 有这些大的不同: 由于服务器和浏览器缓存了 Session ID 和 Session Tickets,不需要再进行 公钥证书传递,CA认证,生成 对称秘钥等过程,直接利用半分钟前的 对称秘钥 加解密数据进行会话。 1)Client Hello 2)Server Hello

玄学酱 2019-12-02 01:27:08 0 浏览量 回答数 0

回答

您可以通过阿里云RDS管理控制台或API创建RDS实例。本文介绍如何通过控制台创建RDS MySQL实例。 其他引擎创建实例请参见: 创建RDS SQL Server实例 创建RDS PostgreSQL实例 创建RDS PPAS实例 创建RDS MariaDB实例 除了新版本的创建实例页面,您也可以切换回旧版创建实例页面。操作详情请参见: 创建RDS实例(新版) 创建RDS实例(旧版) 优惠活动 首购折扣价:首次购买RDS MySQL享受折扣价。详情请参见优惠活动。 计费说明 关于实例计费说明,请参见计费方式。 前提条件 已注册阿里云账号。具体操作请参见注册阿里云账号。 若您要创建按量付费的实例,请确保您的阿里云账号的余额大于等于100元。 注意事项 包年包月实例无法转为按量付费实例。 按量付费实例可以转为包年包月实例,请参见按量付费转包年包月。 同一个主账号,最多可以创建30个按量付费的RDS实例。如需提高此限额,请提交工单申请。 创建RDS实例(新版) 进入RDS实例创建页面。 说明 您也可以在当前创建RDS实例页面上方单击返回旧版切换到旧版创建RDS实例页面。 设置以下参数。 类别 说明 计费方式 包年包月:属于预付费,即在新建实例时需要支付费用。适合长期需求,价格比按量付费更实惠,且购买时长越长,折扣越多。 按量付费:属于后付费,即按小时扣费。适合短期需求,用完可立即释放实例,节省费用。 地域 实例所在的地域,即实例所在的地理位置。 购买后无法更换地域。 请根据目标用户所在的地理位置就近选择地域,提升用户访问速度。 请确保RDS实例与需要连接的ECS实例创建于同一个地域,否则它们无法通过内网互通,只能通过外网互通,无法发挥最佳性能。 类型 数据库引擎的类型和版本,这里选择MySQL。 当前支持MySQL 5.5、5.6、5.7、8.0。 说明 不同地域支持的数据库类型不同,请以实际界面为准。 系列 基础版:单节点,计算与存储分离,性价比高。 高可用版:一个主节点和一个备节点,经典高可用架构。 三节点企业版(原金融版):一个主节点和两个备节点,位于同一地域的三个不同的可用区,提供金融级可靠性。 说明 不同地域和数据库版本支持的系列不同,请以实际界面为准。关于各个系列的详细介绍,请参见产品系列概述。 存储类型 本地SSD盘:与数据库引擎位于同一节点的SSD盘。将数据存储于本地SSD盘,可以降低I/O延时。 ESSD云盘:增强型(Enhanced)SSD云盘,是阿里云全新推出的超高性能云盘产品。ESSD云盘基于新一代分布式块存储架构,结合25GE网络和RDMA技术,为您提供单盘高达100万的随机读写能力和更低的单路时延。ESSD云盘分为如下三类: ESSD云盘:PL1性能级别的ESSD云盘。 ESSD PL2云盘:相比PL1,PL2性能级别的ESSD云盘大约可提升2倍IOPS和吞吐量。 ESSD PL3云盘:相比PL1,PL3性能级别的ESSD云盘最高可提升20倍IOPS、11倍吞吐量,适合对极限并发I/O性能要求极高、读写时延极稳定的业务场景。 SSD云盘:基于分布式存储架构的弹性块存储设备。将数据存储于SSD云盘,即实现了计算与存储分离。 更多信息,请参见存储类型。 可用区 可用区是地域中的一个独立物理区域,主节点可用区指主实例所在可用区,备节点可用区指备实例所在可用区。 您可以设置实例为单可用区部署或多可用区部署: 单可用区部署指主节点可用区和备节点可用区都处于相同可用区。 多可用区部署指主节点可用区和备节点可用区处于不同可用区,此时您只需要选择主节点可用区,系统会自动选择备节点可用区。 相比单可用区部署,多可用区部署能提供可用区级别的容灾,建议您使用多可用区部署。 可用区 实例规格 入门级:通用型的实例规格,独享被分配的内存和I/O资源,与同一服务器上的其他通用型实例共享CPU和存储资源。 企业级:独享或独占型的实例规格。独享型指独享被分配的CPU、内存、存储和I/O资源。独占型是独享型的顶配,独占整台服务器的CPU、内存、存储和I/O资源。 说明 每种规格都有对应的CPU核数、内存、最大连接数和最大IOPS。详情请参见主实例规格列表。 存储空间 存储空间包括数据空间、系统文件空间、Binlog文件空间和事务文件空间。调整存储空间时最小单位为5GB。 说明 部分本地SSD盘的存储空间大小与实例规格绑定,ESSD/SSD云盘不受此限制。详情请参见主实例规格列表。 单击下一步:网络和资源组。 设置以下参数。 类别 说明 网络类型 经典网络:传统的网络类型。 专有网络:也称为VPC(Virtual Private Cloud)。VPC是一种隔离的网络环境,安全性和性能均高于传统的经典网络。选择专有网络时您需要选择对应的VPC和主节点交换机。 说明 请确保RDS实例与需要连接的ECS实例网络类型一致(如果选择专有网络,还需要保证VPC一致),否则它们无法通过内网互通。 存储引擎 设置实例的默认存储引擎。当前仅MySQL 8.0高可用版(本地SSD盘)实例支持此选项。 关于阿里自研的X-Engine引擎详情请参见X-Engine简介。 说明 X-Engine兼容InnoDB,而且拥有更好的性能表现,建议您使用X-Engine作为默认存储引擎。 参数模板 设置实例参数模板。当前仅高可用版(本地SSD盘)实例支持此选项。 说明 您可以选择系统参数模板或自定义参数模板,详情请参见使用参数模板。 时区 设置实例时区。当前仅本地SSD盘实例支持此选项。 表名大小写 设置实例表名是否区分大小写。当本地数据库区分大小时,您可以选择区分大小写,便于您迁移数据。当前仅本地SSD盘实例支持此选项。 资源组 实例所属的资源组。 单击下一步:确认订单。 确认参数配置,选择购买量和购买时长(仅包年包月实例),勾选服务协议,单击去支付完成支付。 创建RDS实例(旧版) 进入旧版RDS实例创建页面。 选择计费方式。 按量付费:属于后付费,即按小时扣费。适合短期需求,用完可立即释放实例,节省费用。 包年包月:属于预付费,即在新建实例时需要支付费用。适合长期需求,价格比按量付费更实惠,且购买时长越长,折扣越多。 设置以下参数。 参数 说明 地域 实例所在的地理位置。购买后无法更换地域。 请根据目标用户所在的地理位置就近选择地域,提升用户访问速度。 请确保RDS实例与需要连接的ECS实例创建于同一个地域,否则它们无法通过内网互通,只能通过外网互通,无法发挥最佳性能。 资源组 实例所属的资源组。 数据库类型 即数据库引擎的类型,这里选择MySQL。 说明 不同地域支持的数据库类型不同,请以实际界面为准。 版本 指MySQL的版本。当前支持MySQL 5.5、5.6、5.7、8.0。 说明 不同地域所支持的版本不同,请以实际界面为准。 系列 基础版:单节点,计算与存储分离,性价比高。 高可用版:一个主节点和一个备节点,经典高可用架构。 三节点企业版(原金融版):一个主节点和两个备节点,位于同一地域的三个不同的可用区,提供金融级可靠性。仅4个地域提供三节点企业版实例:华东1、华东2、华南1、华北2。 说明 不同数据库版本支持的系列不同,请以实际界面为准。关于各个系列的详细介绍,请参见产品系列概述。 存储类型 本地SSD盘:与数据库引擎位于同一节点的SSD盘。将数据存储于本地SSD盘,可以降低I/O延时。 SSD云盘:基于分布式存储架构的弹性块存储设备。将数据存储于SSD云盘,即实现了计算与存储分离。 说明 SSD云盘支持云盘加密,能够最大限度保护您的数据安全,您的业务和应用程序无需做额外的改动。详情请参见云盘加密。 ESSD云盘:增强型(Enhanced)SSD云盘,是阿里云全新推出的超高性能云盘产品。ESSD云盘基于新一代分布式块存储架构,结合25GE网络和RDMA技术,为您提供单盘高达100万的随机读写能力和更低的单路时延。 更多信息,请参见存储类型。 密钥 云盘加密所使用的的密钥。密钥的创建请参见管理密钥。 可用区 可用区是地域中的一个独立物理区域,不同可用区之间没有实质性区别。您可以选择将RDS实例的主备节点创建在同一可用区或不同可用区。 相比单可用区,多可用区能提供可用区级别的容灾。 网络类型 经典网络:传统的网络类型。 专有网络(推荐):也称为VPC(Virtual Private Cloud)。VPC是一种隔离的网络环境,安全性和性能均高于传统的经典网络。 说明 请确保RDS实例与需要连接的ECS实例网络类型一致,否则它们无法通过内网互通。 规格 每种规格都有对应的CPU核数、内存、最大连接数和最大IOPS。详情请参见主实例规格列表。 RDS实例有以下规格族: 通用型:独享被分配的内存和I/O资源,与同一服务器上的其他通用型实例共享CPU和存储资源。 独享型:独享被分配的CPU、内存、存储和I/O资源。 独占物理机型:是独享型的顶配,独占整台服务器的CPU、内存、存储和I/O资源。 例如,8核32GB是通用型实例规格,8核32GB(独享套餐)是独享型实例规格,30核220GB(独占主机)是独占物理机型实例规格。 存储空间 该存储空间包括数据空间、系统文件空间、Binlog文件空间和事务文件空间。 设置购买时长(仅针对包年包月实例)和实例数量,然后单击右侧的立即购买。 说明 购买包年包月实例时,可以勾选自动续费,系统将根据您的购买时长进行自动续费。例如,您购买3个月的实例并勾选自动续费,则每次自动续费时会缴纳3个月的费用。 对于包年包月实例,您也可以单击加入购物车将实例加入到购物车中,最后单击购物车进行结算。 在订单确认页面,勾选相关协议,根据提示完成支付。 下一步 在控制台左上角,选择实例所在的地域即可查看到刚刚创建的实例。选择地域 创建实例后,您需要设置白名单和创建账号,如果是通过外网连接,还需要申请外网地址。然后就可以连接实例。 如果连接实例失败,请参见解决无法连接实例问题。 常见问题 为什么创建实例后无反应,实例列表也看不到创建中的实例? 看不到创建中的实例可能有如下两个原因: 地域错误 可能您所在地域和您创建实例时选择的地域不一致。您可以在页面左上角切换地域。 选择地域 可用区内资源不足 由于可用区资源是动态分配的,可能您下单后可用区内资源不足,所以会创建失败,建议您更换可用区重试。创建失败您可以在订单列表里看到退款。 如何授权子账号管理RDS实例? 答:请参见云数据库 RDS 授权。 相关API API 描述 CreateDBInstance 创建RDS实例。 操作视频 RDS实例创建

游客yl2rjx5yxwcam 2020-03-09 10:46:09 0 浏览量 回答数 0

回答

Hbase 是一个always-available的服务,在机器故障的时候保持可用性,集群中的机器都运行regionserver daemons。但一个regionserver出现故障,或者机器掉线,那么保存在上面的regions也同样掉线。Hbase中MTTR的能够检测异常,尽可能早的恢复对掉线region的访问。 文章解释了hbase如何管理MTTR,并且介绍了一些hbase和hdfs的设置。 Hbase是一致性时对故障的如何保持弹性 Hbase通过让一个单独的server负责数据的子集,也就是说,一个region在同一时刻只能被一个region server进行管理。 Hbase对失败的弹性,归功于hdfs,因为在写数据的时候,数据会被复制到到不通的节点。 Hbase将数据写入到hfiles中,hfile保存在hdfs上面,hdfs完成对hfiles的block的副本(replica)。默认情况下是副本数是3. Hbase使用commit log(或者称之为Write-Ahead-log,WAL),提交日志也同样写在HDFS上面,默认副本数为3. Hbase在故障检测以及访问恢复的步骤: 识别宕机的节点(Identifying that a node is down):由于过载或者直接死掉,节点会不再响应。 在write操作进行中的时候进行恢复(Recovering the writes in progress):通过读取commit log,恢复还没有被flush的edit。 重新分配region:失败的regionserver之前在正在处理一些region,这些region需要被重新分配给其他的RS(regionSever),这个分配过程要根据每台RS不通的workload的情况 那上面三个过程中哪一个步骤最痛苦?在检测以及恢复步骤发生的时候,客户端会被阻塞。MTTR的作用就是加速这个处理过程,让客户端对数据downtime的感知时间尽可能的短。 检测失败节点: 一个RS的失败原因很多:正常的情况下,可能是由于clean stop,比如管理员关闭了某个节点,这就允许RS能安全适当的关闭region,然后告诉HMaster,正在关闭。这种情况下,commit log会被清除,然后HMaster会立刻安排region的重新分配。 另外的regionserver关闭的的情况:比如运行RS的计算机静默死亡(silent death),比如网络原因。导致region server不能够发出告警,这种情况有Zookeeper进行处理。 每一个RS都会连接到Zookeeper上面,而Master监测这些连接,Zookeeper自己管理heartbeat。所以timeout出现的时候,Hmaster会申明region server 已经死亡,启动一个恢复处理过程 恢复正在进行中的写操作。 当一个RS 出现了宕机,那么commit logs的恢复工作就发生了。这个恢复工作是并行开始的。 第一步:随机的RS会提取commit logs(从设置好的commit log 目录中),并且按照region来分割日志成多个文件,保存在HDFS上面,然后region会被重新分配给其他任意的RS, 然后每一个被分配的RS的都会去读取已经前面分割好的对应的region 日志文件,并且进行将该region恢复到正确状态。 当出问题的是一个node 失败了,而不是一个进程崩溃了,那么问题就会出现了。 出现进程崩溃的的regionserver,会将数据写入到处于同一台机上面的datanode上面。假设副本因素为3,那么当一个node丢失的时候,你丢失的不仅仅是一个region server,并且还有这个数据的一个副本。 进行split,就意味着要读取block,而1/3的副本已经死了,那么对于每一个block,你会有三分之一的几率被引导到错误的副本上面。还有,split操作需要创建新的文件。每一个文件都会有3个副本,这些副本可能会被指派给已经丢失的datanode,而这个write数据的过程由于datanode已经死亡,会在经过一个timeout之后失败,而重新回转到另外一个datanode上面,这就延缓了数据的恢复的过程。 重新分配region 分配region的工作会进行的很快,这依赖于Zookeeper,需要通过Zookeeper完成master和region server的异步工作。 MTTR带来的提升(The MTTR improvements) 检测失败节点: 首先,可以减小默认的timeout时间。Hbase 被配置成3分钟的Zookeepertimeout时间,这就保证了GC不会介入进来(GC parse会导致ZK的timeout,会导致错误的failure检测。) 对于生产系统,关注MTTR的话,设置timeout时间为1分钟,或者30秒,是很有必要的。 一个合理的最小设置时20秒。所以你可以设置hbase.zookeeper.timeout=60000 你同样设置你GC(incremental, generational GC with good figures for the young and old generations, etc., this is a topic by itself) ,这样使GC的暂停时间不要超过ZK timeout。 恢复正在进行中的写操作。 在正常情况下,会有足够的活跃的RS来并行的完成commit log files的split工作,所以问题的就转到能否直接找到HDFS上面仅存的副本。该问题的解决方案是,配置HDFS,是hdfs对于故障的检测快于hbase的检测。那就是说,如果hbase的timeout为60s,HDFS应该设置成20s(就是设置成20s之后就认为node已经死亡)。在这里我们要描述一下HDFS是如何处理dead node。HDFS的故障检测也同样是依赖于heartbeat和timeout,在HDFS中,如果一个node被申明为dead,那么保存在该datanode上面的replicas将会被复制到其他活跃的datanode上面去,而这个是一个消耗很大的过程,并且,如果多个datanode同事死亡,那么这就会引发“replication storms”,replication storms指所有的副本被重新拷贝,这会加剧系统负载,从而导致某些节点不响应,进而导致这些节点被NN视为已经死亡,而这些节点上面block又要重新被复制,周而复始,这样的replication storms实在是可怕了。 因此,HDFS在开始恢复过程之前会等待一段时间,会比10分钟长一点。而这一点,对于低延时系统来说就是一个问题:访问dead datanode就会促发timeout。在HDFS versions 1.0.4 or 1.2, and branches 2 and 3中,引入一个新的状态:stale。当一个datanode不再发送hearbeat,并且这个时间持续到一个指定的时间,那么datanode处于stale状态。 处于stale状态的节点就是在读写过程中最后一个选择(a last resort for reads),所以启用这种性质,会是恢复更加快。 设置启用stale的方法:修改hdfs-site.xml dfs.namenode.avoid.read.stale.datanodetruedfs.namenode.avoid.write.stale.datanodetrue dfs.namenode.write.stale.datanode.ratio1.0fdfs.namenode.check.stale.datanodetrue注:我在cloudera cdh-4.1.2 提供的doc的配置项目文档中没有找到该参数,看了源码才找到这些参数。 具体参考HDFS-3912, HDFS-4350: 重新分配region Region分配的是纯粹hbase的内部实现,在Hbase 0.94+的版本中,region 分配过程的处理被优化了,允许在很短的时间异步分贝更多的region。 具体可以参考[example - Apache jira HBASE-7247]. 结论。 在Hbase中没有global failure,如果一个region server 失败了,其他的region server 仍然可用,对于给定的一个数据集,MTTR 通常是 10分钟左右。 该经验数值是从是从比较普遍的情况是中得到的,因为需要使用dead datanode的节点上面副本数,恢复就需要时间。HDFS需要花费10分钟的时间来申明datanode死亡了。 当引入了stale状态的时候,这就不再是一个问题了。这个时候恢复时间就变成Hbase本身的问题,如果你需要考虑MTTR,那么你采用这里的设置,从节点真的出现失败,到数据在其他RS上面又重新变得可用,这个过程只需要2分钟,或者更少。

hiekay 2019-12-02 01:42:58 0 浏览量 回答数 0

回答

在primary-secondary 类型的协议中,副本被分为两大类,其中有且仅有一个副本作为primary 副本, 除primary 以外的副本都作为secondary 副本。维护primary 副本的节点作为中心节点,中心节点负 责维护数据的更新、并发控制、协调副本的一致性。 Primary-secondary 类型的协议一般要解决四大类问题:数据更新流程、数据读取方式、Primary 副本的确定和切换、数据同步(reconcile)。 数据更新基本流程 1. 数据更新都由primary 节点协调完成。 2. 外部节点将更新操作发给primary 节点 3. primary 节点进行并发控制即确定并发更新操作的先后顺序 4. primary 节点将更新操作发送给secondary 节点 5. primary 根据secondary 节点的完成情况决定更新是否成功并将结果返回外部节点 在工程实践中,如果由primary 直接同时发送给其他N 个副本发送数据,则每个 secondary 的更新吞吐受限于primary 总的出口网络带宽,最大为primary 网络出口带宽的1/N。为了 解决这个问题,有些系统(例如,GFS),使用接力的方式同步数据,即primary 将更新发送给第一 个secondary 副本,第一个secondary 副本发送给第二secondary 副本,依次类推。 数据读取方式 数据读取方式也与一致性高度相关。如果只需要最终一致性,则读取任何副本都可以满足需求。如果需要会 话一致性,则可以为副本设置版本号,每次更新后递增版本号,用户读取副本时验证版本号,从而 保证用户读到的数据在会话范围内单调递增。使用primary-secondary 比较困难的是实现强一致性。 由于数据的更新流程都是由primary 控制的,primary 副本上的数据一定是最新的,所以 如果始终只读primary 副本的数据,可以实现强一致性。如果只读primary 副本,则secondary 副本 将不提供读服务。实践中,如果副本不与机器绑定,而是按照数据段为单位维护副本,仅有primary 副本提供读服务在很多场景下并不会造出机器资源浪费。 将副本分散到集群中个,假设primary 也是随机的确定的,那么每台机器 上都有一些数据的primary 副本,也有另一些数据段的secondary 副本。从而某台服务器实际都提供 读写服务。 - 由primary 控制节点secondary 节点的可用性。当primary 更新某个secondary 副本不成功 时,primary 将该secondary 副本标记为不可用,从而用户不再读取该不可用的副本。不可用的 secondary 副本可以继续尝试与primary 同步数据,当与primary 完成数据同步后,primary 可以副本 标记为可用。这种方式使得所有的可用的副本,无论是primary 还是secondary 都是可读的,且在一 个确定的时间内,某secondary 副本要么更新到与primary 一致的最新状态,要么被标记为不可用, 从而符合较高的一致性要求。这种方式依赖于一个中心元数据管理系统,用于记录哪些副本可用, 哪些副本不可用。某种意义上,该方式通过降低系统的可用性来提高系统的一致性。 primary 副本的确定与切换 在primary-secondary 类型的协议中,另一个核心的问题是如何确定primary 副本,尤其是在原 primary 副本所在机器出现宕机等异常时,需要有某种机制切换primary 副本,使得某个secondary 副本成为新的primary 副本。 通常的,在primary-secondary 类型的分布式系统中,哪个副本是primary 这一信息都属于元信 息,由专门的元数据服务器维护。执行更新操作时,首先查询元数据服务器获取副本的primary 信 息,从而进一步执行数据更新流程。 由于分布式系统中可靠的发现节点异常是需要一定的探测时间的,这样的探测时间通常是10 秒级别,这也意味着一旦primary 异常,最多需要10 秒级别的 发现时间,系统才能开始primary 的切换,在这10 秒时间内,由于没有primary,系统不能提供更 新服务,如果系统只能读primary 副本,则这段时间内甚至不能提供读服务。从这里可以看到, primary-backup 类副本协议的最大缺点就是由于primary 切换带来的一定的停服务时间。 数据同步 不一致的secondary 副本需要与primary 进行同步(reconcile)。 通常不一致的形式有三种:一、由于网络分化等异常,secondary 上的数据落后于primary 上的 数据。二、在某些协议下,secondary 上的数据有可能是脏数据,需要被丢弃。所谓脏数据是由于 primary 副本没有进行某一更新操作,而secondary 副本上反而进行的多余的修改操作,从而造成 secondary 副本数据错误。三、secondary 是一个新增加的副本,完全没有数据,需要从其他副本上 拷贝数据。 对于第一种secondary 数据落后的情况,常见的同步方式是回放primary 上的操作日志(通常是 redo 日志),从而追上primary 的更新进度。对于脏数据的情况, 较好的做法是设计的分布式协议不产生脏数据。如果协议一定有产生脏数据的可能,则也应该使得 产生脏数据的概率降到非常低得情况,从而一旦发生脏数据的情况可以简单的直接丢弃有脏数据的 副本,这样相当于副本没有数据。另外,也可以设计一些基于undo 日志的方式从而可以删除脏数据。 如果secondary 副本完全没有数据,则常见的做法是直接拷贝primary 副本的数据,这种方法往往比 回放日志追更新进度的方法快很多。但拷贝数据时primary 副本需要能够继续提供更新服务,这就 要求primary 副本支持快照(snapshot)功能。即对某一刻的副本数据形成快照,然后拷贝快照,拷贝 完成后使用回放日志的方式追快照形成后的更新操作。

kun坤 2020-04-24 15:30:53 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 阿里云双十一主会场 阿里云双十一新人会场 1024程序员加油包 阿里云双十一拼团会场 场景化解决方案 阿里云双十一直播大厅