centos6.3配置MFS服务器
一、简介
MooseFS(Moose File
System,mfs)是一种分布式文件系统,它将数据分布在网络中的不同服务器上,支持FUSE(用户空间文件系统Filesystem in
Userspace,简称FUSE),客户端挂载后可以作为一个 普通的Unix 文件系统使用MooseFS。
MooseFS中共有四种角色:主控服务器master server、主控备份服务器metalogger server、存储块服务器chunkserver、客户端主机client。
主控服务器负责各个存储服务器的管理、文件读写调度、文件空间回收以及恢复、多节点拷贝。
主控备份服务器负责备份主控服务器的元数据、变化日志文件,文件类型为changelog_ml.*.mfs,以便在主控服务器出问题的时候可以恢复。
存储块服务器负责提供存储空间,并为客户提供数据传输。
客户端则通过fuse挂接主控服务器上所管理的存储块服务器,可以像操作本地文件一样操作MooseFS文件系统中的文件。
二、NFS和MFS比较
1、NFS的缺陷
NFS虽然使用简单,但当NFS客户端访问量大时,通过NFS方式共享一个服务器的存储空间,使得NFS服务器不堪重负,并且执行读写都比较频繁的操作会出现意外的错误,对于高可靠的集群部署是有挑战的。
这种架构除了性能问题外还存在单点故障,一旦这个NFS服务器发生故障,所有靠共享提供数据的应用就不再可用,尽管用rsync方式同步数据到另外一个服务器上做nfs服务的备份,但这对提高整个系统的性能毫无帮助。
2、MFS
分布式文件系统服务器之间的数据访问不再是一对多的关系(1个NFS服务器,多个NFS客户端),而是多对多的关系,这样一来,性能大幅提升毫无问题。
moosefs分布式文件系统,实施起来简单、不停止服务扩容、恢复服务容易,因为作为共享存储服务器是个不错的选择。
MooseFS读写流程图:
MFS的官方网站:http://www.moosefs.org/download.html。
上面有详细的MFS简介和MooseFS分布式文件系统安装向导以及MFS。
三、详解
1、获得二进制包
先将mfs-1.6.25-1.tar.gz重命名为mfs-1.6.25.tar.gz
#yum install fuse-devel pkgconfig zlib-devel //build源码包需要的依赖
#rpmbuild -ta mfs-1.6.25.tar.gz
会生成6个rpm二进制安装包(其中debuginfo调试时使用):
也可以通过tar zxvf mfs-1.6.25-1.tar.gz解压,使用./configure、make、make install安装(具体参考安装向导)。
2、主控服务器master server
(1)安装
#rpm -ivh mfs-master-1.6.25-1.x86_64.rpm //安装
#rpm -ql mfs-master //查询安装的文件路径,可以查看所有的安装文件,便于修改
- /etc/mfsexports.cfg.dist
- /etc/mfsmaster.cfg.dist
- /etc/mfstopology.cfg.dist
- /usr/sbin/mfsmaster
- /usr/sbin/mfsmetadump
- /usr/sbin/mfsmetarestore
- /usr/share/doc/mfs-master-1.6.25
- /usr/share/doc/mfs-master-1.6.25/NEWS
- /usr/share/doc/mfs-master-1.6.25/README
- /usr/share/doc/mfs-master-1.6.25/UPGRADE
- /usr/share/man/man5/mfsexports.cfg.5.gz
- /usr/share/man/man5/mfsmaster.cfg.5.gz
- /usr/share/man/man5/mfstopology.cfg.5.gz
- /usr/share/man/man7/mfs.7.gz
- /usr/share/man/man7/moosefs.7.gz
- /usr/share/man/man8/mfsmaster.8.gz
- /usr/share/man/man8/mfsmetarestore.8.gz
- /var/lib/mfs
- /var/lib/mfs/metadata.mfs.empty
(2)复制样例文件,以得到 master 所需的配置文件
#cp mfsmaster.cfg.dist mfsmaster.cfg
#cp mfstopology.cfg.dist mfstopology.cfg
#cp mfsexports.cfg.dist mfsexports.cfg
如果我们打算更改这些配置文件中的某些项目的值,则需要打开特定配置文件相关文本行前的注释,然后修改跟随其后的值。因为被注释掉的行,即是
MooseFS 内置的缺省值。
Mfsmaster.cfg 配置文件包含主控服务器 master 相关的设置,想查看该配置文件更多信息使用命令
man mfsmaster.cfg。
mfsexports.cfg
指定那些客户端主机可以远程挂接 MooseFS 文件系统,以及授予挂接客户端什么样的访问权限。例如指定只有 192.168.40.x 网段的主机可以以读写模式访问 MooseFS 的整个共享结构资源(/),在配置文件 mfsexports.cfg
文件的第二行改为或添加:
(注:可以挂在根/目录下的子目录,配置文件加上192.168.40.0/24 /test rw,alldirs,maproot=0,password=test,注意test目录是在根目录已经创建好的子目录,并且挂载时使用 mfsmount
/mnt/client -H mfsmaster -o mfssubfolder=/test -p,否则会出现mfsmaster register error: Permission denied的错误。)
- # Allow everything but "meta".
- #* / rw,alldirs,maproot=0
- 192.168.40.0/24 / rw,alldirs,maproot=0
- 192.168.40.0/24 . rw
二进制文件 metadata 和文本文件 changelog 将被保存在目录/var/lib/mfs,安
装 master 时,会自动生成一个名为 metadata.mfs.empty 的元数据文件 metadata,该文件是空的。MooseFS
master 运必须有文件 metadata.mfs,这个文件是从 metadata.mfs.empty 改名而来,运行mfsmaster时该文件会被命名为metadata.mfs.back。只要保证日志文件和元数据文件的安全,即使元数据服务器遭到致命的破坏,也可以通过备份的元数据文件重新部署一套元数据服务器。
#cd /var/lib/mfs
#cp metadata.mfs.empty metadata.mfs //MooseFS master 运行以后,metadata.mfs 文件大小将发生变,不会为空文件。
(3)绑定主机名 mfsmaster 与 ip (每个节点都需绑定)修改/etc/hosts
文件,以绑定主机名 mfsmaster 与 ip 地址:
- 192.168.40.125 mfsmaster
(4)安装CGI
为了监控 MooseFS 当前运行状态,可以安装运行 CGI 监控服务用浏览器查看整个MooseFS 的运行情况。
#rpm -ivh mfs-cgi-1.6.25-1.x86_64.rpm
#rpm -ql mfs-cgi
(5)启动
#/usr/sbin/mfsmaster start
会出现问题:
- working directory: /var/lib/mfs
- can't create lockfile in working directory: EACCES (Permission denied)
主要是没有设置运行用户和运行组,添加用户(安装完成后配置文件没有改动),也可以使用nobody:nobody。
#groupadd mfs //添加
mfs 组
#useradd
-g mfs mfs //新增系统用户mfs
#chown
-R mfs.mfs /var/lib/mfs //设置文件所属用户和组(也可以直接指定用户和组,不需要重新创建)
#vim /etc/mfsmaster.cfg
- WORKING_USER = mfs
- WORKING_GROUP = mfs
- # SYSLOG_IDENT = mfsmaster
- # LOCK_MEMORY = 0
然后正常启动!
#/usr/sbin/mfscgiserv
start
会打不开网页,这是因为cgi文件没有可执行权限
#chmod +x /usr/share/mfscgi/*.cgi
然后启动,在浏览器地址栏输入 http://192.168.40.125:9425 即可查看 master 的运行情况(这时不能看见 chunk server 的数据)。
3、备份服务器Backup server(metalogger)
(1)安装
安装备份服务器metalogger的主机在性能上应该比 master
强大(至少有更多的内存),一旦主控服务器 master 失效,只要导入 changelogs 到元数据文件,备份服务器 metalogger
将能接替发生故障的 master,行使管理服务器的职能。
若备份服务器单独安装,需要安装fuse-devel和修改vim
/etc/hosts添加192.168.40.125 mfsmaster。添加mfs用户和组,也可指定到其他用户,或使用nobody:nobody。
#rpm -ivh mfs-metalogger-1.6.25-1.x86_64.rpm
#rpm -ql mfs-metalogger
#cp mfsmetalogger.cfg.dist mfsmetalogger.cfg
#vimmfsmetalogger.cfg(不修改会出现Permission
denied)
- WORKING_USER = mfs
- WORKING_GROUP = mfs
接着运行备份服务 mfsmetaloger:
#usr/sbin/mfsmetalogger start
在生产环境里应当设置自动启动脚本,以便操作系统重新启动时MooseFSmfsmetalogger 服务也能自动运行。
4、存储块服务器chunk server
(1)安装
若在其他主机上单独安装chunkserver需要安装fuse-devel,并添加mfs用户和组(可指定到其他用户)
#rpm -ivh mfs-chunkserver-1.6.25-1.x86_64.rpm //安装
#rpm -ql mfs-chunkserver
//查询安装的文件路径,可以查看所有的安装文件,便于修改
(2)准备 chunk server 服务所需的配置文件
#cp mfschunkserver.cfg.dist mfschunkserver.cfg
#cp mfshdd.cfg.dist mfshdd.cfg
#vim /etc/mfschunkserver.cfg
(想了解配置文件mfschunkserver.cfg更详细的信息,请查看手册页manmfschunkserver.cfg)
- WORKING_USER = mfs
- WORKING_GROUP = mfs
(3)建立共享点
在配置文件 mfshdd.cfg 中,给出了用于客户端挂接 MooseFS 分布式文件系统根分区所使用的共享空间位置。建议在 chunk server 上划分单独的空间新建一个设备挂载点作为储存点专门给 MooseFS 使用,这样做的好处是便于管理剩余空间。
此处假定要使用两个共享点/mnt/mfschunks1 和/mnt/mfschunks2,在 mfshdd.cfg 加入下面的文本行:
- # mount points of HDD drives
- #
- #/mnt/hd1
- #/mnt/hd2
- #etc.
- /mnt/mfschunks1
- /mnt/mfschunks2
在启动 chunk server 前,需确保用户 mfs 有权限读写将要被挂接的分区(因为 chunk server 运行时要在此创建一个.lock 的文件)。否则出现以下错误:
- hdd space manager: can't create lock file '/mnt/mfschunks1/.lock': EACCES (Permission denied)
- init: hdd space manager failed !!!
#chown -R mfs:mfs /mnt/mfschunks1
#chown -R mfs:mfs /mnt/mfschunks2
(注:若是单独与master的机器,还需执行chown
-R mfs:mfs /var/lib/mfs和修改/etc/hosts添加192.168.40.125mfsmaster。)
(4)开始启动 chunk server
#/usr/sbin/mfschunkserver start
再通过浏览器访问 http://192.168.40.125:9425就可以看到 MooseFS 系统的全部信息,包括主控 master 和存储服务 chunkserver 。
(5)MooseFS chunk 以独占方式使用专门磁盘分区
在上述操作过程中不需要这部分的内容,此部分是在实际应用环境下,将chunk server用专门磁盘分区作为设备挂载点,这样做是不要的,便于管理剩余空间,因为MooseFS
并不考虑其剩余空间能被另作他用。
如果没有单独创建文件系统的条件,可以在文件中创建一个文件系统,在此准备两个 2GB 的文件(文件位于目录/var/lib/mfs/下,也可以放在其他目录下),并在其上创建文件系统,把他们格式化为
ext3,分别挂接在/mnt/mfschunks1 和/mnt/mfschunks2。
操作步骤:挂接第一个文件系统
1、创建镜像文件mfschunks1
#dd if=/dev/zero of=/var/lib/mfs/mfschunks1
bs=1024 count=1 seek=$((2*1024*1024-1))
2、创建文件系统
##mkfs -t ext3 /var/lib/mfs/mfschunks1
3、创建挂接点
#mkdir -p /mnt/mfschunks1
4、挂接文件系统
#mount -t ext3 -o loop
/var/lib/mfs/mfschunks1
/mnt/mfschunks1
挂接第二个文件系统的步骤与上面相同,#mount
-t ext3 -o loop /var/lib/mfs/mfschunks2
/mnt/mfschunks2
在启动
chunk server 前,需确保用户 mfs 有权限读写将要被挂接的分区(因为 chunk server 运行时要在此创建一个.lock 的文件):
#chown
-R mfs:mfs /mnt/mfschunks1
#chown
-R mfs:mfs /mnt/mfschunks2
5、客户端主机client
为了挂接基于 MooseFS 分布式文件,客户端主机必须安装 FUSE 软件包( fuse 版本号至少
2.6,推荐使用版本号大于 2.7.2 的 fuse),#yum install fuse。
安装客户端软件 mfsmount:
#rpm -ivh mfs-client-1.6.25-1.x86_64.rpm
(客户端若单独安装,需要安装fuse-devel和修改vim /etc/hosts添加192.168.40.125 mfsmaster。)
#cp /etc/mfsmount.cfg.dist /etc/mfsmount.cfg
假定客户端的挂接点是/mnt/mfs,将以下面的指令来使用 MooseFS 分布式共享文件系统:
1、 创建挂接点
#mkdir -p /mnt/mfs
2、开始挂接操作
#/usr/bin/mfsmount /mnt/mfs -H mfsmaster
有时会出现mfsmaster register error: Permission denied:
是因为mfsmaster的配置文件和挂载目录 不一致的原因,vim /etc/mfsexports.cfg
- # Allow everything but "meta".
- #* / rw,alldirs,maproot=0
- 192.168.40.0/24 /test rw,alldirs,maproot=0
master的挂载配置文件中允许挂载的目录是/test,若用户#mfsmount/mnt
-H mfsmaster(不加-o
mfssubfolder-子文件夹,默认是挂载/)挂载根/目录会挂载不上,可以修改mfsexports.cfg配置文件为/,再进行挂在就没问题了。
- 192.168.40.0/24 / rw,alldirs,maproot=0
# /usr/sbin/mfsmaster
restart
有时挂载目录有内容,提示error in fuse_mount,可以使用 -o nonempty选项挂载。
# mfsmount /mnt/mfs -H mfsmaster -o nonempty
3、挂载meta文件系统
首先保证mfsexports.cfg文件中加入:
- # Allow "meta".
- * . rw
然后执行:
#mfsmount -m /mnt/mfs -H mfsmaster
可以不挂载MFS META文件系统,挂载该系统主要是为了恢复被误删除的文件。
4、查看分区
执行命令 df -h | grep mfs 检查分区情况(或使用mount):
- mfsmaster:9421 102G 256K 102G 1% /mnt/mfs
6、使用
(1)备份
#cd /mnt/mfs
#mkdir dir1
#mkdir dir2
默认mfs将储存的文件只储存在一个节点上(master选取的)。
设置储存在储存块dir2上的文件储存在两个节点上,做一个备份,系统会自动将数据同步到选定的节点上,这样达到里备份的效果。
因master和trunk服务器在同一台机器上,即便设定了 goal=2 来到达保存两个副本但看到的只是一个副本而已,尽管有两个trunk挂在点,但它只是一个
chunk server。
设置文件副本数量,一般以3份为佳。
(2)设置删除文件的空间回收时间
#mfsgettrashtime dir2/passwd
dir2/passwd: 86400
#mfssettrashtime 300 /mnt/mfs
获取删除dir2/passwd后在回收站中保存的时间,防止用户误删,这个数字不能设置的太高也不能太低,一般设置为300(5分钟)。
(3)查看目录信息
#mfsdirinfo -H /mnt/mfs
(4)数据恢复
二进制文件 metadata 和文本文件 changelog 将被保存在目录/var/lib/mfs
执行数据恢复操作,其命令为:mfsmetarestore -m metadata.mfs.back -o metadata.mfs changelog_ml.*.mfs 恢复成功后再执行启动新的master服务操作。可参看数据恢复的例子:http://blog.ztrix.me/blog/2012/05/13/restore-mfs-metadata/
(5)停止 MooseFS
为了安全停止 MooseFS 集群,建议执行如下的步骤:
在所有客户端用 unmount 命令先卸载文件系统(本例将是: umount /mnt/mfs)
停止 chunk server 进程: /usr/sbin/mfschunkserver stop
停止 metalogger 进程: /usr/sbin/mfsmetalogger stop
停止主控 master server 进程: /usr/sbin/mfsmaster stop
(6)简单使用脚本(配置启动)
使用者可根据具体使用环境进行修改调试:
- #!/bin/bash
- if [ $# -ne 1 ] ; then
- echo "please input:./moosefs.sh mfsmaster"
- exit 1
- fi
- if [ "$UID" -ne 0 ]; then
- echo "you are not root"
- exit 2
- fi
- ALLOW_IP_RANGE="192.168.40.0/24"
- MASTERIP="192.168.40.125"
- start_mfsmaster()
- {
- echo "------start_mfsmaster------"
- cd /etc
- cp mfsmaster.cfg.dist mfsmaster.cfg
- cp mfstopology.cfg.dist mfstopology.cfg
- cp mfsexports.cfg.dist mfsexports.cfg
- chown -R nobody:nobody /var/lib/mfs
- cd /var/lib/mfs
- cp metadata.mfs.empty metadata.mfs
- cat >> /etc/mfsexports.cfg << EOF
- $ALLOW_IP_RANGE / rw,alldirs,maproot=0
- $ALLOW_IP_RANGE . rw
- EOF
- echo "$MASTERIP mfsmaster" >> /etc/hosts
- #sed -i '$a\192.168.40.125 mfsmaster' /etc/hosts
- /usr/sbin/mfsmaster start
- /usr/sbin/mfsmaster test &>> start.log
- }
- start_mfsmetalogger()
- {
- echo "------mfsmetalogger------"
- cd /etc
- cp mfsmetalogger.cfg.dist mfsmetalogger.cfg
- chown -R nobody:nobody /var/lib/mfs
- grep "mfsmaster" /etc/hosts &> /dev/null
- if [ $? -eq 0 ]; then
- echo "$MASTERIP mfsmaster" >> /etc/hosts
- fi
- usr/sbin/mfsmetalogger start
- /usr/sbin/mfsmetalogger test &>> start.log
- }
- start_mfschunkserver()
- {
- echo "------mfschunkserver------"
- cd /etc
- cp mfschunkserver.cfg.dist mfschunkserver.cfg
- cp mfshdd.cfg.dist mfshdd.cfg
- chown -R nobody:nobody /var/lib/mfs
- cat >> /etc/mfsexports.cfg << EOF
- /mnt/mfschunks1
- /mnt/mfschunks2
- EOF
- chown -R nobody:nobody /mnt/mfschunks1
- chown -R nobody:nobody /mnt/mfschunks2
- grep "mfsmaster" /etc/hosts &> /dev/null
- if [ $? -eq 0 ]; then
- echo "$MASTERIP mfsmaster" >> /etc/hosts
- fi
- /usr/sbin/mfschunkserver test &>> start.log
- }
- start_mfsclient()
- {
- echo "------mfsclient------"
- cd /etc
- cp /etc/mfsmount.cfg.dist /etc/mfsmount.cfg
- grep "mfsmaster" /etc/hosts &> /dev/null
- if [ $? -eq 0 ]; then
- echo "$MASTERIP mfsmaster" >> /etc/hosts
- fi
- mkdir -p /mnt/mfs
- /usr/bin/mfsmount /mnt/mfs -H mfsmaster
- /usr/bin/mfsmount -m /mnt/mfs -H mfsmaster
- mkdir /mnt/mfs/sharedata
- mkdir /mnt/mfs/sharefile
- /usr/bin/mfssetgoal -r 3 /mnt/mfs
- /usr/bin/mfssettrashtime 300 /mnt/mfs
- }
- stop_mfs()
- {
- result=`df -h | grep mfsmaster | awk -F" " '{print $6}'`
- OLD_IFS="$IFS"
- IFS="\n"
- array=($result)
- IFS="$OLD_IFS"
- for element in ${arr[@]}
- do
- umount $element
- done
- /usr/sbin/mfschunkserver stop
- /usr/sbin/mfsmetalogger stop
- /usr/sbin/mfsmaster stop
- }
- main()
- {
- case "$1" in
- mfsmaster)
- start_mfsmaster;;
- mfsmetalogger)
- start_mfsmetalogger;;
- mfschunkserver)
- start_mfschunkserver;;
- start_mfsclient)
- start_mfsclient;;
- *)
- echo "please input:./moosefs.sh mfsmaster or mfsmetalogger or mfschunkserver or mfsclient"
- esac
- }
- main $1
四、总结
(1)使用configre、make、make install的方式可以参考官方文档,具体参数和配置都给的很详细,官方网站http://www.moosefs.org/download.html。
(2)集群部署还需要进一步强化,数据恢复及其他关于MooseFS的内容以后会更新。
(3)MooseFS 命令的使用方法:http://www.moosefs.org/reference-guide.html#using-moosefs。
(4)上述的安装包和参考文档已上传到csdn上,需要下载的可以点击http://download.csdn.net/detail/taiyang1987912/8229595。
(5)MooseFS使用还有很多的细节,本人也不能面面俱全,若有更好的思路请与本人练习,邮箱aoyang888@qq.com,在此先感谢。
centos6.3配置MFS服务器的更多相关文章
- CentOS6.4 配置DNS服务器
1.安装bind yum install -y bind bind-chroot bind-utis 2.配置named.conf [root@dns /]# vi /etc/named.conf 注 ...
- CentOS6.4 配置mysql服务器启动多个端口,同步单表数据
============================================================ ====多端口启动==== ========================= ...
- centos6.7配置git服务器
1.yum install -y git 2.adduser git 3.cd /data/git 没有则创建该目录 git init --bare test.git;创建一个裸仓库,没有工作区,不需 ...
- centos6.4安装配置vpn服务器步骤详解
centos6.4安装配置vpn服务器步骤详解,从安装VPN到配置VPN服务器.配置VPN服务器的路由转发功能,每一步都很详细 一.VPN服务器环境说明 操作系统:CentOS release ...
- 大数据项目之_15_帮助文档_NTP 配置时间服务器+Linux 集群服务群起脚本+CentOS6.8 升级到 python 到 2.7
一.NTP 配置时间服务器1.1.检查当前系统时区1.2.同步时间1.3.检查软件包1.4.修改 ntp 配置文件1.5.重启 ntp 服务1.6.设置定时同步任务二.Linux 集群服务群起脚本2. ...
- centos6.8下配置https服务器
centos6.8下配置https服务器 1.1 环境 l 系统环境:内核环境为2.6.32版本 64位的CentOS release 6.8 (Final) [root@localhost ~] ...
- Centos6.5 nginx+nginx-rtmp配置流媒体服务器
之前使用命令方式安装nginx并配置了反向代理,由于想做一个视频直播的小项目,查了流媒体服务器的方案,发现nginx有相关模块,于是开始搞起. nginx-rtmp模块需要在nginx编译时,以模块方 ...
- CentOS6.4下Samba服务器的安装与配置
一.先恶狠狠地吐槽一下: 这篇随笔真是让我折腾了2天2夜才敢下笔写!!!为什么呢?之前是通过去Samba的官网下载的源码包,也就是.tar.gz来进行安装配置,不过这个让我折腾来折腾去就是没折腾出结果 ...
- Centos6.5下Samba服务器的安装和配置
1.安装samba服务 # yum install samba samba-client samba-swat 2.安装包说明 samba-3.6.23-43.el6_9.x86_64----> ...
随机推荐
- ruby 元编程
一 对象模型 kernel Module Kernel.private_instance_methods.grep(/^pr/) private method 1 如果一个方法接收者不是你自己,一 ...
- 802.1x协议&eap类型
EAP: 0,扩展认证协议 1,一个灵活的传输协议,用来承载任意的认证信息(不包括认证方式) 2,直接运行在数据链路层,如ppp或以太网 3,支持多种类型认证 注:EAP 客户端---服务器之间一个协 ...
- C语言 百炼成钢18
//题目52:用递归打印以下图形 //* //*.*. //*..*..*.. //*...*...*...*... //*....*....*....*....*.... #include<s ...
- php基础23:数值与数值函数
<?php //1.自动转换 $a = 5; $b = "5a"; $c = $a + $b; echo $c; echo "<br>"; $ ...
- php基础03:数据类型
<?php // day01:数据类型 //01.字符串 $x = "hello world"; echo $x; echo "<br>"; ...
- MVC 服务器文件下载
文件上传到服务器后下载 window.open 与window.location.href 对txt 或是pdf文件执行的操作是打开,而非下载 mvc controller 自带有如下方法 p ...
- Chrome 消息传递机制
Chrome插件开发入门(二)——消息传递机制 Blog | Qiushi Chen 2014-03-31 9538 阅读 Chrome 插件 由于插件的js运行环境有区别,所以消息传递机制是一个重要 ...
- 北京联想招聘-Android高级工程师(5-7年) 加入qq 群:220486180 或者直接在此 留言咨询
Job ID #: 47979 Position Title: 高级Android开发工程师 Location: CHN-Beijing Functional Area: Research/Devel ...
- [CareerCup] 9.5 Permutations 全排列
9.5 Write a method to compute all permutations of a string. LeetCode上的原题,请参加我之前的博客Permutations 全排列和P ...
- sass,compass让开发效率飞起
最近开始学习并且使用,发现使用它写起css来真的是各种爽 安装sass,compass sass是依赖于ruby的,必须先安装Ruby,点击下载 下载完ruby之后,使用命令行安装sass ...