将MySQL的作为文件系统使用

来源:Asp之家 时间:2011-12-14 18:34:26 

利用MySQLfs这个工具,我么可以在MySQL关系数据库中存储文件系统。MySQLfs将文件系统中文件的字节内容分解成数据库中的元组,而数据库并不需要支持BLOB超大字段类型。利用MySQLfs,我们可以将一个文件系统直接扔到MySQL数据库中,并可以利用数据库的备份,集群和复制等功能来保护MySQLfs文件系统。
  MySQLfs似乎并不为Fedora, openSUSE, 或Ubuntu等系统提供二进制包,所以你必须编译它的源文件。为了编译MySQLfs,我们必须先安装mysql-devel和fuse-devel包(FUSE可以让任何应用程序通过LINUX内核访问文件系统,这意味着你可以立即用任意的应用程序来使用FUSE文件系统)。如果你丢失了一些devel包,配置时将会遇到一些比较麻烦的问题。举例来说,在我的Fedora 8 64位机上,刚开始因为找不到FUSE开发包,我无法通过mysqlclient_r链接;找不到FUSE开发包这个错误将在链接标签中生成一个单独的 –L,从而导致链接mysql客户端测试程序失败。另外,编译将默认使用-Wall,-Werror,在开始产生警告时也会导致编译失败。因此,我们可以不使用-Werror,并确保需要的所有包都已经安装等方式来解决编译问题。一但成功编译source,make install命令将把MySQLfs默认安装到目录/usr/local/bin下。
  下面的命令可以通过MySQLfs来创建一个MySQL数据库。
  注意:make install命令在默认情况下并没有将schema.sql安装到你的计算机上,你必须将schema复制到某个位置,以方便以后建立其他的MySQLfs数据库。
  # mysql -p
  mysql> CREATE DATABASE mysqlfs;
  mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON mysqlfs.* TO mysqlfs@"%" IDENTIFIED BY 'foobar';
  mysql> FLUSH PRIVILEGES;
  mysql> Bye
  # mysql -uroot -p mysqlfs < /tmp/mysqlfs-0.4.0-rc1/schema.sql
  该数据库模式包含3个表:tree、inodes和data_blocks。tree表将一个节点inode映射到其父节点,下图将显示部分表的内容。
  在下面显示的模式中,我通过路径guten/alice13a.txt导入了一个文件。文件系统的命名层次结构是在树表中表示的,the alice13a.txt这个文件被存放到guten目录下,guten目录是在MySQLfs文件系统根目录下创建的。inode表包含了所有的信息,这些信息可以被start(2)调用。Data_blocks表用来村存储实际的文件字节内容。
  mysql> select * from tree;
  +-------+--------+----------------------+
  | inode | parent | name |
  +-------+--------+----------------------+
  | 1 | NULL | / |
  | 2 | 1 | guten |
  | 3 | 2 | alice13a.txt |
  ...
  mysql> select * from inodes;
  +-------+-------+---------+-------+-----+-----+------------+------------+------------+----------+
  | inode | inuse | deleted | mode | uid | gid | atime | mtime | ctime | size |
  +-------+-------+---------+-------+-----+-----+------------+------------+------------+----------+
  | 1 | 0 | 0 | 16877 | 0 | 0 | 1201155861 | 1201155861 | 1201155861 | 0 |
  | 2 | 0 | 0 | 16888 | 500 | 500 | 1200108244 | 1200108244 | 1201156234 | 0 |
  | 3 | 0 | 0 | 33184 | 500 | 500 | 1200108239 | 1200108239 | 1201156234 | 153477 |
  ...
  mysql> describe data_blocks;
  +-------+------------------+------+-----+---------+-------+
  | Field | Type | Null | Key | Default | Extra |
  +-------+------------------+------+-----+---------+-------+
  | inode | bigint(20) | NO | PRI | | |
  | seq | int(10) unsigned | NO | PRI | | |
  | data | blob | YES | | NULL | |
  +-------+------------------+------+-----+---------+-------+

因为FUSE可以让你以任何奇怪的方式安装文件系统,理所当然地,用户安装FUSE客户端文件系统的能力也必须受到用户所在组权限的限制。下面是一个例子,在一开始,用户没有安装文件系统的权限,被拒绝安装。然后,我将自己加入到相应的用户组后重新登录,初始的MySQLfs文件系统和数据库都是空的,使用df命令可以显示内核已经知道被安装的文件系统。在例子的结尾,fusermount命令将用户创建的FUSE文件系统卸载了。
  $ mkdir ~/mysqlfs
  $ mysqlfs -ohost=localhost -odatabase=mysqlfs ~/mysqlfs
  * Opening logfile 'mysqlfs.log': OK
  fuse: failed to open /dev/fuse: Permission denied
  $ su -l
  root# usermod -a -G fuse ben
  root# exit
  $ exit
  ...
  $ id
  uid=500(ben) gid=500(ben) groups=492(fuse), ...
  $ mysqlfs -ohost=localhost -odatabase=mysqlfs ~/mysqlfs
  * Opening logfile 'mysqlfs.log': OK
  $ ls -ld mysqlfs
  drwxr-xr-x 1 root root 0 2008-01-24 16:24 mysqlfs
  $ df -h mysqlfs .
  Filesystem Size Used Avail Use% Mounted on
  mysqlfs 0 0 0 - /home/ben/mysqlfs
  /dev/sdc3 16G 4.4G 11G 31% /home
  $ ls -l mysqlfs
  total 0
  $ fusermount -u mysqlfs
  既然我们已经拥有权限,可以将MySQL安装为FUSE文件系统,接下来,让我们复制一些文件到MySQL数据库中,使之与文件系统相结合。在下面的例子中,我将项目Gutenberg的一些文本文件复制到MySQLfs并验证它们在读取的时候,与原始文件有同样的MD5返回值。然后,我将Linux文件tarbar复制到MySQLfs,想看看MySQLfs是如何处理一个44M文件的。
  通过冷磁盘高速缓存将内核从/tmp目录备份到/tmp目录需要花2秒,而将之复制到MySQLfs将花费20秒,为了利用磁盘中的缓存,马上将上述操作再次执行,/tmp目录下的备份花费0.3秒,而复制到MySQLfs中依旧花费20秒。这说明,写操作是MySQLfs的主要瓶颈。当读取内核的时候,MySQLfs似乎缓存了一些数据,这使得响应时间大大快于其他测试。如果你的文件系统经常用到读操作,则MySQLfs将是一个有意思的选择,因为MySQLfs的缓存可以派上用场。
~]$ cp -av /.../guten ./mysqlfs/
`/.../guten' -> `./mysqlfs/guten'
`/.../guten/alice13a.txt' -> `./mysqlfs/guten/alice13a.txt'
`/.../guten/boysw10.txt' -> `./mysqlfs/guten/boysw10.txt'
`/.../guten/dmoro11.txt' -> `./mysqlfs/guten/dmoro11.txt'
~]$ cd ~/mysqlfs/guten
guten]$ ls -l
-rw-r----- 1 ben ben 153477 2008-01-12 13:23 alice13a.txt
-rw-rw---- 1 ben ben   48923 2008-01-12 13:23 boysw10.txt
-rw-rw---- 1 ben ben 259214 2008-01-12 13:23 dmoro11.txt
guten]$ md5sum *
135e06ad31b169065bccbf03ec7236f2   alice13a.txt
7dd30f1b37e32cdb5d21fe992bbf248d   boysw10.txt
87c05f11193c0e05b3d0dec0808a0450   dmoro11.txt
guten]$ md5sum /.../guten/*
135e06ad31b169065bccbf03ec7236f2   /.../guten/alice13a.txt
7dd30f1b37e32cdb5d21fe992bbf248d   /.../guten/boysw10.txt
87c05f11193c0e05b3d0dec0808a0450   /.../guten/dmoro11.txt
guten]$ cd ..
mysqlfs]$ time cp /tmp/linux-2.6.23.tar.bz2 .
real     0m16.278s
user     0m0.006s
sys      0m0.531s
mysqlfs]$ time cat linux-2.6.23.tar.bz2   >/dev/null
real     0m0.502s
user     0m0.004s
sys      0m0.035s
mysqlfs]$ time dd if=linux-2.6.23.tar.bz2 of=/tmp/junk bs=1024 count=1024
1048576 bytes (1.0 MB) copied, 0.0200973 s, 52.2 MB/s
 
real     0m0.058s
user     0m0.003s
sys      0m0.013s
mysqlfs]$ time dd if=linux-2.6.23.tar.bz2 of=/tmp/junk bs=1024 count=1024 skip=9000
1048576 bytes (1.0 MB) copied, 0.0214207 s, 49.0 MB/s
 
real     0m0.031s
user     0m0.001s
sys      0m0.011s
  虽然被很多人所不齿,但我还是决定在Bonnie++文件系统下使用MySQLfs。我通过虚拟机进行了这些测试,由于是在虚拟机中,性能可能会呈线性下降,但由于MySQL数据库和/tmp目录存储于同一虚拟硬盘上,其性能比还是有效的。
  在如下的结果中,你能看到,在运行Bonnie++ (version 1.03a-7)时,MySQLfs的速度是/tmp/bonnie (ext3)的十分之一。这说明,我们并不太想使用MySQLfs来直接存储邮件目录。Bonnie++被设计成适合在本地内核文件系统上工作而非FUSE,这种定位非常适用于大行文件的读写。
$ /usr/sbin/bonnie++ -d /tmp/bonnie 
        
        
       Version
           1.03
                ------Sequential Output------ --Sequential Input- --Random-
         
       
               
                      -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
         
       Machine
                 Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP
           /sec %CP
         
       v8tsrv
                    2G 18155
           31 16726
            5 13338
            6 26207
           46 74527
           24
           9840 144
         
       
                             ------Sequential Create------ --------Random Create--------
         
       
                             -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
         
       
                       files
           /sec %CP
           /sec %CP
           /sec %CP
           /sec %CP
           /sec %CP
           /sec %CP
         
       
                          16 24878
           94 +++++ +++ +++++ +++ 29018
           99 +++++ +++ +++++ +++
         
       
        
       $ /usr/sbin/bonnie++ -d ~/mysqlfs/bonnie
         
       
        
       Version
           1.03
                ------Sequential Output------ --Sequential Input- --Random-
         
       
                             -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
         
       Machine
             
            Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP
           /sec %CP
         
       v8tsrv
                    2G
           2615
            5
           1207
            1
           1323
            1
           2143
            2
           2363
            0 138.1
            0
         
       
                             ------Sequential Create------ --------Random Create--------
         
       
                             -Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
         
       
                       files
           /sec %CP
           /sec %CP
           /sec %CP
           /sec %CP
           /sec %CP
           /sec %CP
         

        
                          16
            186
            2
            505
            1
            296
            2
            209
            2
            441
            1
            282
            2
        


标签:mysql,文件
0
投稿

猜你喜欢

  • SQL语句删除2条重复数据一条保留一条

    2012-07-11 15:51:44
  • 只有mdf文件的数据库附加失败的修复方法分享(置疑、只读)

    2012-02-12 15:55:17
  • N年前的JAVASCRIPT笔记

    2009-01-07 12:40:00
  • Oracle 管道 解决Exp/Imp大量数据处理问题

    2009-07-12 18:31:00
  • 理解绝对定位和相对定位布局

    2009-03-19 13:53:00
  • xmlhttp 乱码 比较完整的解决方法 (UTF8,GB2312)

    2008-05-02 21:02:00
  • 解析arp病毒背后利用的Javascript技术

    2007-08-08 09:55:00
  • 利用ASP输出excel文件一例

    2008-06-06 13:18:00
  • 网站程序员如何应对web标准

    2007-05-11 16:52:00
  • 网站508规范(译)

    2008-04-03 13:26:00
  • 网站导航设计的6大分类

    2010-07-12 18:46:00
  • asp 快钱网关接口 支付宝接口 财付通接口代码

    2011-03-08 10:55:00
  • Oracle 异构服务实践

    2007-08-17 10:00:00
  • SQL Server 数据库备份和还原认识和总结(二)

    2012-10-07 10:52:52
  • 优化MySQL数据库性能的八大“妙手”

    2007-11-18 14:49:00
  • 在FLASH中调用ASP的方法

    2009-03-09 18:32:00
  • 文本框textarea限制输入文字个数的方法

    2008-01-28 13:02:00
  • 自定义404错误页面实现自动跳转

    2007-12-10 18:25:00
  • 比较规范的验证Email地址是否正确的正则表达式

    2009-07-28 17:55:00
  • IE8 在元素尺寸大于(2048px/4096px)时 alpha滤镜渲染失败

    2010-01-05 16:39:00
  • asp之家 网络编程 m.aspxhome.com