linux下tokyocabinet存储引擎java接口的配置

作者 : admin 于 2011年08月12日, 15:01:47
2011
08-12

tokyocabinet是一个性能极高的存储引擎,除支持传统的keyvalue存储外,还支持table表的存储,具体可以看这里 http://fallabs.com/tokyocabinet/spex-en.html#tctdbapi

使用tc常用的工具就是作者另外写的一个api:tt http://fallabs.com/tokyotyrant/ 兼容memcached协议,非常好用和高效。

但这里我期望使用的是table表,它提供了C的接口,但没有php方便调用的的方式,所以张宴同学做了一个很方便的tcsql http://blog.s135.com/tcsql/

因为我C的水平问题,一直没有写出稳定的操作接口,并且张宴同学tcsql的设计理念非常好,支持分布式的结构。

因此我改变了设计思路,并且使用我想对熟悉的java接口来做这个事情。

linux下配置过程:

环境装备:标准JDK环境

1、下载java api http://fallabs.com/tokyocabinet/javapkg/

2、解压后进入 tokyocabinet-java-1.24 目录

3、运行 ./configure –prefix=/opt/tcjava && make && make install

4、环境变量配置:
这里是包含JDK的全部配置

export JAVA_HOME=/opt/jdk
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:/opt/tcjava/lib/tokyocabinet.jar:/opt/tcjava/lib/libjtokyocabinet.so:/opt/tcjava/lib/
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/tcjava/lib/
export PATH=$PATH:$JAVA_HOME/bin
export JRE_HOME=$JAVA_HOME/jrei
JAVA_OPTS="-server"
JAVA_OPTS="$JAVA_OPTS -Xms64m -Xmx128m"
JAVA_OPTS="$JAVA_OPTS -D64 -Djava.library.path=/usr/local/lib/"

把以上代码增加到 /etc/profile 文件尾部,而后 source /etc/profile

配置完成,开始测试:

进入 tokyocabinet-java-1.24/example 执行 make

然后运行 java TCTDBEX 如果看到跟代码中预期的结果,则tc的javaapi在此服务器上安装成功。

2011
08-6

mysql_udf_tc 未测试发布版

作者 : admin 于 2011年03月18日, 11:11:39
2011
03-18

受伤了,没时间折腾,先发布未测试版,欢迎各种bug提交,康复后继续

mysql数据同步到tc的table表,直接写文件,php读文件查询。

看手册,不解释。

有问题加qq 176300676

  1. #ifdef STANDARD
  2. #include <stdlib .h>
  3. #include <stdio .h>
  4. #include <string .h>
  5. #ifdef __WIN__
  6. typedef unsigned __int64 ulonglong; /* Microsofts 64 bit types */
  7. typedef __int64 longlong;
  8. #else
  9. typedef unsigned long long ulonglong;
  10. typedef long long longlong;
  11. #endif /*__WIN__*/
  12. #else
  13. #include <my_global .h>
  14. #include <my_sys .h>
  15. #include <m_string .h>
  16. #endif
  17. #include <mysql .h>
  18. #include <ctype .h>
  19.  
  20. #include <float .h>
  21.  
  22.  
  23. #include <tcutil .h>
  24. #include <tctdb .h>
  25. #include <stdlib .h>
  26. #include <stdbool .h>
  27. #include <stdint .h>
  28.  
  29.  
  30.  
  31. #ifdef HAVE_DLOPEN
  32.  
  33. /*   TC_CREATE    */
  34. my_bool tc_create_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
  35. {
  36. return 0;
  37. }
  38.  
  39. void tc_create_deinit(UDF_INIT *initid)
  40. {
  41. }
  42.  
  43. char * tc_create(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
  44. {
  45. TCTDB *tdb;
  46. int ecode;
  47.     char *errormsg;
  48. char *tcfile;
  49. tdb = tctdbnew();
  50.  
  51. tcfile = args->args[0];
  52.  
  53.     /* open the database */
  54.     if(!tctdbopen(tdb, tcfile, TDBOWRITER | TDBOCREAT))
  55. {
  56.         ecode = tctdbecode(tdb);
  57.         sprintf(errormsg, "error: %s\n", tctdberrmsg(ecode));
  58.  
  59.     }
  60. else
  61. {
  62. sprintf(errormsg, "OK");
  63. }
  64. *length = strlen(errormsg);
  65. return errormsg;
  66. }
  67.  
  68. /*   TC_SET    */
  69. my_bool tc_set_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
  70. {
  71.   if (args->arg_count < 3)
  72.   {
  73.     strcpy(message,"Wrong arguments to metaphon;  Use the source");
  74.     return 1;
  75.   }
  76.   return 0;
  77. }
  78.  
  79.  
  80. void tc_set_deinit(UDF_INIT *initid)
  81. {
  82. }
  83.  
  84.  
  85. char *tc_set(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
  86. {
  87. char *dbfile,*errormsg,pkbuf[200];
  88. TCTDB *tdb;
  89. TCMAP *cols;
  90. int i = 0;
  91. int ecode,pksiz;
  92.     memcpy(result, "result string", 13);
  93.     *length = 13;
  94.  
  95. dbfile = args->args[0];
  96.  
  97. tdb = tctdbnew();
  98.  
  99.     if(!tctdbopen(tdb, dbfile, TDBOWRITER | TDBOCREAT)){
  100.         ecode = tctdbecode(tdb);
  101.         sprintf(errormsg, "open error: %s\n", tctdberrmsg(ecode));
  102.     }
  103.  
  104. cols = tcmapnew();
  105.  
  106. for(i = 2;i<args ->arg_count;i++)
  107. {
  108. tcmapput2(cols, args->attributes[i], args->args[i]);
  109. }
  110. pksiz = sprintf(pkbuf,"%s",args->attributes[1]);
  111. if(!tctdbput(tdb, pkbuf, pksiz, cols)){
  112.         ecode = tctdbecode(tdb);
  113.         sprintf(errormsg,"put error: %s\n", tctdberrmsg(ecode));
  114.  
  115.     }
  116. else
  117. {
  118. errormsg = "OK";
  119.  
  120. }
  121.     tcmapdel(cols);
  122.  
  123. if(!tctdbclose(tdb)){
  124.         ecode = tctdbecode(tdb);
  125.         sprintf(errormsg, "close error: %s\n", tctdberrmsg(ecode));
  126.     }
  127. *length = strlen(errormsg);
  128. return errormsg;
  129. }
  130.  
  131. /*   TC_DEL    */
  132. my_bool tc_del_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
  133. {
  134.   if (args->arg_count < 2)
  135.   {
  136.     strcpy(message,"Wrong arguments to metaphon;  Use the source");
  137.     return 1;
  138.   }
  139.   return 0;
  140. }
  141. void tc_del_deinit(UDF_INIT *initid)
  142. {
  143. }
  144. char * tc_del(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
  145. {
  146. TCTDB *tdb;
  147. char *dbfile,*errormsg,*pkbuf;
  148. int ecode;
  149.  
  150. dbfile = args->args[0];
  151. pkbuf = args->args[1];
  152.  
  153. tdb = tctdbnew();
  154.  
  155.     if(!tctdbopen(tdb, dbfile, TDBOWRITER | TDBOCREAT)){
  156.         ecode = tctdbecode(tdb);
  157.         sprintf(errormsg, "open error: %s\n", tctdberrmsg(ecode));
  158.     }
  159. if(!tctdbout2(tdb,pkbuf))
  160. {
  161. ecode = tctdbecode(tdb);
  162.         sprintf(errormsg,"delete error: %s\n", tctdberrmsg(ecode));
  163. }
  164. else
  165. {
  166. errormsg = "OK";
  167. }
  168. if(!tctdbclose(tdb)){
  169.         ecode = tctdbecode(tdb);
  170.         sprintf(errormsg, "close error: %s\n", tctdberrmsg(ecode));
  171.     }
  172. *length = strlen(errormsg);
  173. return errormsg;
  174.  
  175. }
  176. /*   TC_SETINDEX    */
  177. my_bool tc_sexindex_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
  178. {
  179.   if (args->arg_count < 2)
  180.   {
  181.     strcpy(message,"Wrong arguments to metaphon;  Use the source");
  182.     return 1;
  183.   }
  184.   return 0;
  185. }
  186. void tc_sexindex_deinit(UDF_INIT *initid)
  187. {
  188. }
  189. char * tc_sexindex(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
  190. {
  191. TCTDB *tdb;
  192. char *dbfile,*errormsg,*pkname[200];
  193. int ecode,indextype;
  194.  
  195. dbfile = args->args[0];
  196. *pkname = args->attributes[1];
  197.  
  198. tdb = tctdbnew();
  199.  
  200.     if(!tctdbopen(tdb, dbfile, TDBOWRITER | TDBOCREAT)){
  201.         ecode = tctdbecode(tdb);
  202.         sprintf(errormsg, "open error: %s\n", tctdberrmsg(ecode));
  203.     }
  204.     if(args->args[2]=="string")
  205. {
  206. indextype = TDBITLEXICAL;
  207. }
  208. else if(args->args[2]=="int")
  209. {
  210. indextype = TDBITDECIMAL;
  211. }
  212. if(!tctdbsetindex(tdb,*pkname,indextype))
  213. {
  214. ecode = tctdbecode(tdb);
  215.         sprintf(errormsg, "setindex error: %s\n", tctdberrmsg(ecode));
  216. }
  217.  
  218. if(!tctdbclose(tdb)){
  219.         ecode = tctdbecode(tdb);
  220.         sprintf(errormsg, "close error: %s\n", tctdberrmsg(ecode));
  221.     }
  222. *length = strlen(errormsg);
  223. return errormsg;
  224. }
  225. #endif /* HAVE_DLOPEN */
  226. </args></stdint></stdbool></stdlib></tctdb></tcutil></float></ctype></mysql></m_string></my_sys></my_global></string></stdio></stdlib>

编译安装脚本,自理

  1. #!/bin/sh
  2. gcc -Wall -I/opt/mysql-5.0.22/include/mysql -I/opt/tokyocabinet-1.4.46/include -I. -shared -L/usr/lib -ltokyocabinet -lz -lbz2 -lrt -lpthread -lm -lc  udf_tt.c -o lib_mysqludf_tt.so
  3. #gcc -Wall -I/opt/mysql-5.0.22/include/mysql -I. -static udf_tt.c -o lib_mysqludf_tt.so
  4. cp -f ./lib_mysqludf_tt.so /usr/lib/lib_mysqludf_tt.so
  5. service mysqld restart

使用:

  1. drop function tc_create;
  2. create function tc_create returns string soname 'lib_mysqludf_tt.so';
  3.  
  4. drop function tc_set;
  5. create function tc_set returns string soname 'lib_mysqludf_tt.so';
  6.  
  7. select tc_set("/home/sunboyu/test",`User`,`Host`) FROM user limit 1

linux挂载ntfs分区

作者 : admin 于 2010年12月22日, 21:54:06
2010
12-22

最近有点数据需要在linux环境下处理,我用的是centos,最简方式安装,默认不支持ntfs格式。

查资料后,有两种方式可以使centos支持ntfs:1、重新编译内核 2、增加一个插件

重新编译内核成本有点高,而且风险比较大,尝试以下插件后,很好用:

http://tuxera.com/opensource/ntfs-3g-2010.10.2.tgz

下载后,解压,进入目录 ./configure && make && make install 即可

然后查看硬盘分区信息:fdisk -l

我的移动硬盘可以显示如下信息:

  1. Device Boot      Start         End      Blocks   Id  System
  2. /dev/sda1               2       19457   156280320    f  W95 Ext'd (LBA)
  3. /dev/sda5               2        1306    10482381    7  HPFS/NTFS
  4. /dev/sda6            1307        5222    31455238+   7  HPFS/NTFS
  5. /dev/sda7            5223       19457   114342606    7  HPFS/NTFS

挂载命令 mount -t ntfs-3g /dev/sda7 /data1

访问 /data1 即可访问/dev/sda7 分区

使用awstats对nginx的日志进行分析

作者 : admin 于 2010年12月10日, 16:13:31
2010
12-10

抛弃apache很长时间了,一直在用nginx,基于第三方的统计系统很多,故很久没有分析过web服务器的日志。最近日志突然暴增,从站长统计无法看出具体暴增的原因,故配置awstats进行分析。

awstats在nginx上运行,这个配置我没做过,所以,我依然使用apache作为awstats的服务器使用。只不过换一个端口而已。

apache配置:安装请看之前的日志,配置文件增加一行配置,具体为

  1. <directory "/opt/httpd-2.2.9/cgi-bin">
  2.     AddHandler cgi-script .pl .cgi  #这行即可
  3.     AllowOverride None
  4.     Options None
  5.     Order allow,deny
  6.     Allow from all
  7. </directory>

配置好,基本就可以启动了。注意端口号,别跟nginx重复了。

下载awstats:http://downloads.sourceforge.net/project/awstats/AWStats/7.0/awstats-7.0.tar.gz?r=http%3A%2F%2Fawstats.sourceforge.net%2F&ts=1291968393&use_mirror=cdnetworks-kr-1

解压后,找到 cgi-bin classes css icon js 这几个文件夹。其中cgi-bin里的文件放到apache的 cgi-bin目录下,其他放到apache的网站根目录。

然后访问 hostname:8080/cgi-bin/awstats.pl 看是不是有结果。

配置站点:

复制 cgi-bin目录下 awstats.model.conf 文件 为 awstats.hostname.conf

修改如下几个关键点

  1. LogFile="/home/www/log/www.google.com.log" #nginx的日志
  2. SiteDomain="www.google.com"
  3. HostAliases="localhost google.com 127.0.0.1 REGEX[myserver\.com$]"

配置完这些, 基本就可以使用了。

另外,还要生成报表:命令为

/opt/httpd-2.2.9/cgi-bin/awstats.pl -update -config=hostname 为了方便,可以加到crontab里。到这里就配置完了。

iostat安装

作者 : admin 于 2010年05月10日, 10:42:30
2010
05-10

原来一直以为iostat跟iftop一样是独立的安装包,后google发现是一个工具包中的工具,叫systat。

下载地址:http://pagesperso-orange.fr/sebastien.godard/download.html

使用说明书 http://pagesperso-orange.fr/sebastien.godard/man_iostat.html

samba配置小结

作者 : admin 于 2010年05月06日, 13:18:07
2010
05-6

最近想把本本彻底改成linux,前期准备就是要适应一切能想到的应用。跟台式的文件交互,ftp、ssh都可以,但还是觉得共享会方便,于是配置了一下samba。

本子上的系统用的是centos5.4 X64,samba软件是使用命令 yum install samba 进行安装。

首先,启动关闭samba命令

  1. service smb start
  2. service smb restart
  3. service smb stop

首先配置一个公共的读写目录

  1. mv /etc/samba/smb.conf /etc/samba/smb.conf.bak
  2. touch /etc/samba/smb.conf
  3. #smb.conf 内容为
  4. [global]
  5. workgroup = home
  6. netbios name = notebook
  7. server string = Samba Server
  8. security = share
  9. [public]
  10. path = /home/public
  11. browseable = yes
  12. writeable = yes
  13. guest ok = yes
  14. public = yes
  15. force user = nobody
  16. force group = nobody

重启samba后,在windows中运行(局域网互联) 敲入 \\ip 则可以看到public共享目录

如果增加权限验证,则需要增加用户信息:samba用以下两个命令来增加用户信息

  1. smbadduser   //增加用户
  2. mbpasswd     //增加密码

配置文件如下

  1. [global]
  2. workgroup = ksgdfa
  3. netbios name = ksgfdsa
  4. server string = Samba Server
  5. security = share
  6. encrypt passwords = yes
  7. smb passwd file = /etc/samba/smbpasswd
  8.  
  9.  
  10. [public]
  11. path = /home/public
  12. browseable = yes
  13. writeable = yes
  14. guest ok = yes
  15. public = yes
  16. force user = nobody
  17. force group = nobody
  18.  
  19. [sunboyu]
  20. path = /opt/samba/sunboyu
  21. browseable = yes
  22. writeable = yes

补充:其中,公共目录的权限,用配置成 nobody:nobody 777
而 sunboyu 目录的权限,则配置成 sunboyu:sunboyu 777

tips:如果配置成功后,一直无法写入文件,则检查是否关闭selinux,如果没关闭,关闭即可。

rsync使用小结

作者 : admin 于 2010年04月17日, 22:28:51
2010
04-17

多台服务器使用,难免用到同步,工作中大量接触的是rsync,简单测试了一下其命令和应用。

rsync官方主页: http://samba.anu.edu.au/rsync/ 下载地址为:http://samba.anu.edu.au/ftp/rsync/rsync-3.0.7.tar.gz

安装:

  1. ./configure --prefix=/opt/rsync-3.0.7
  2. make
  3. make install

默认好像没有生成配置文件,创建

  1. vi /etc/rsync.conf
  2. //填入以下内容
  3. uid=nobody
  4. gid=nobody
  5. max connections=3
  6. use chroot=no
  7. log file=/var/log/rsyncd.log
  8. pid file=/var/run/rsyncd.pid
  9. lock file=/var/run/rsyncd.lock

测试的两台主机:192.168.0.20 192.168.0.30

在192.168.0.30的/etc/rsync.conf下增加以下代码

  1. [test]       //定义一个域
  2. path=/root/test
  3. comment=test folder
  4. uid=root
  5. ignore errors
  6. read only=no
  7. list=no

然后测试两个命令
1、把192.168.0.20上的 /root/source 目录同步到 192.168.0.30 的 /root/test上
/opt/rsync-3.0.7/bin/rsync -vazu –progress /root/source 192.168.0.30::test
2、从192.168.0.30 的 /root/test 同步到 192.168.0.20上的/root/test
/opt/rsync-3.0.7/bin/rsync -vzrtopg –progress 192.168.0.30::test /root/test

配置权限:
在192.168.0.30上vi /etc/rsycnpass 然后 echo test:123456 >> /etc/rsycnpass
配置文件修改为

  1. secrets file = /etc/rsyncpass
  2. [test]       //定义一个域
  3. path=/root/test
  4. comment=test folder
  5. uid=root
  6. ignore errors
  7. read only=no
  8. list=no
  9. auth users=test

则上边命令1修改为 /opt/rsync-3.0.7/bin/rsync -vazu –progress /root/source test@192.168.0.30::test
命令2改为 /opt/rsync-3.0.7/bin/rsync -vzrtopg –progress test@192.168.0.30::test /root/test

在nginx下配置自动虚拟主机

作者 : admin 于 2010年01月09日, 00:33:37
2010
01-9

以前用apache,很多虚拟主机的时候,用 mod_vhost_alias 模块去解决。nginx似乎没有这样的功能。

原来为了做这个功能,我用python写了一堆脚本,去自动管理nginx的配置文件,结果还是不理想。频繁重写配置文件,频繁重启,总会出现点问题。

在nginx的0.8.*下,发现了这样的功能:http://wiki.nginx.org/NginxHttpCoreModule

Since nginx 0.8.25 named captures can be used in server_name:
server {
server_name ~^(www\.)?(?.+)$;
location / {
root /sites/$domain;
}
}

大喜,于是乎做出如下配置,实现了nginx下自动虚拟主机的功能:

  1. server {
  2.      listen       80;
  3.      server_name  ~^(?P<domainname>.+)\.autovhost\.sunboyu\.cn$;
  4.      location / {
  5.          #autoindex  on;
  6.          root   /home/vhost/$domainname;
  7.          index  index.html index.htm;
  8.      }
  9.      access_log /home/autovhost.sunboyu.cn.log main;
  10. }
  11. </domainname>

测试通过。

我的开源虚拟主机管理系统nginx版本指日可待。

改变exec的阻塞模式

作者 : admin 于 2009年12月25日, 10:19:41
2009
12-25

很多操作时间会很长,不能让用户在页面上执行PHP脚本,否则页面会被拖死。

一个不错的方案,就是提交到后台去执行。

linux有个命令 nohup command & 这样就会提交到后台,而终端的用户体会不到程序执行的过程。

原来我使用这种方式 shell_exec( “nohuo php file.php &” ) 进行后台提交,后来发现速度依然不快, 还是被挂起了。查看手册,exec函数有如下提示:

Note: 如果用本函数启动一个程序并希望保持在后台运行,必须确保该程序的输出被重定向到一个文件或者其它输出流去,否则 PHP 会在程序执行结束前挂起。

因此,这样修改就达到了目的:

exec( “nohuo php file.php >> /dev/null &” )

 Page 1 of 8  1  2  3  4  5 » ...  Last »