密码保护:不慎

这是一篇受密码保护的文章。您需要提供访问密码:

Infobright的数据类型以及优化相关

在前面的章节中,我们已经简单介绍了数据库仓库Infobright的安装和启动,数据导入导出的介绍,在本章节中我们着重介绍下Infobright的数据类型,尽管Infobright里面支持所有的MySQL原有的数据类型。但是Integer类型比其他数据类型更加高效,所以在建表的时候要尽可能使用以下的数据类型:

TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT
DECIMAL(尽量减少小数点位数)
DATE ,TIME

效率比较低的、不推荐使用的数据类型有:
BINARY VARBINARY
FLOAT
DOUBLE
VARCHAR
TINYTEXT TEXT
针对这几个字段,在Infobright数据类型使用的时候,总结出一些经验和注意点:

(1)Infobright的数值类型的范围和MySQL有点不一样,比如Infobright的Int的最小值是-2147483647,而MySQl的Int最小值应该是-2147483648。其他的数值类型都存在这样的问题。

(2)能够使用小数据类型就使用小数据类型,比如能够使用SMALLINT就不适用INT,这一点上Infobright和MySQL保持一致。

(3)避免效率低的数据类型,像TEXT之类能不用就不用,像FLOAT尽量用DECIMAL代替,但是需要权衡毕竟DECIMAL会损失精度。

(4)尽量少用VARCHAR,在MySQL里面动态的Varchar性能就不强,所以尽量避免VARCHAR。如果适合的话可以选择把VARCHAR改成CHAR存储甚至专程INTEGER类型。VARCHAR的优势在于分配空间的长度可变,既然Infobright具有那么优秀的压缩性能,个人认为完全可以把VARCHAR转成CHAR。CHAR会具有更好的查询和压缩性能。

(5)能够使用INT的情况尽量使用INT,很多时候甚至可以把一些CHAR类型的数据往整型转化。比如搜索日志里面的客户永久id、客户id等等数据就可以用BIGINT存储而不用CHAR存储。其实把时间分割成year、month、day三列存储也是很好的选择。在我能见到的系统里面时间基本上是使用频率最高的字段,提高时间字段的查询性能显然是非常重要的。当然这个还是要根据系统的具体情况,做数据分析时有时候很需要MySQL的那些时间函数。

(6)varchar和char字段还可以使用comment lookup,comment lookup能够显著地提高压缩比率和查询性能。
Infobright执行查询语句的时候,大部分的时间都是花在优化阶段。Infobright优化器虽然已经很强大,但是编写查询语句的时候很多的细节问题还是需要程序员注意。这里涉及的内容比较多了,总结如下:

  • 尽量不适用or,可以采用in或者union取而代之。
  • 减少IO操作,原因是infobright里面数据是压缩的,解压缩的过程要消耗很多的时间。
  • 查询的时候尽量条件选择差异化更明显的语句
  • Select中尽量使用where中出现的字段。原因是Infobright按照列处理的,每一列都是单独处理的。所以避免使用where中未出现的字段可以得到较好的性能。所以select count(*) from table的速度要比select count(*) from table where condition的速度要快,同时查询数据时尽量使用 select count(game_code) from game_log where game_code=’qjp’,而不是 select count(uid) from game_log where game_code=’qjp’,前者使用同一列而后者要用两列计算,解压缩
  • 限制在结果中的表的数量,也就是限制select中出现表的数量。
  • 尽量使用独立的子查询和join操作代替非独立的子查询
  • 尽量不在where里面使用MySQL函数和类型转换符
  • 尽量避免会使用MySQL优化器的查询操作
  • 使用跨越Infobright表和MySQL表的查询操作
  • 尽量不在group by 里或者子查询里面使用数学操作,如sum(a*b)。
  • select里面尽量剔除不要的字段。尽可能少用select *
  • 有关varchar和char的区别,以及怎么选择,可以参考这篇文章

    5.28野外采摘

    老婆一直念叨着呼吸下新鲜空气,于是周末在保养完爱车后,直接去了传说中的“第五大队”,就在通州台湖,距离到时不远,除了价格小贵外,其他的整体上还算可以,园子里鸟语花香,还有琳琅满目的樱桃,看了真的是垂涎欲滴啊,不过真的吃起来貌似也没吃掉多少,有点小酸,不过建议还是去丛林深处,越往里面走,果实越大,后来我们摘了不少又大又紫的,那样的樱桃在市场上从来没卖的,估计真拿出来卖,也得30块钱了吧,其实去采摘的乐趣,就是到田园中呼吸下新鲜空气,对于我们这些农村长大的孩子,只是一种久违了的感觉,常年呆在钢筋混凝土的高楼大厦里,趁着周末出去走走,真的很不错。
    记录下价格:
    樱桃,50一斤,价格小贵,涨了,原来是30一斤来着,搞得摘得时候没舍得放开了摘;
    甜瓜,15一斤。还不让吃,这个真是“很贵”,合下来15块钱一个,昨天摘了5个就走了,还不会挑;
    西红柿,5块一斤,很不错,在棚子里就吃掉好几个,纯天然的,绵绵沙沙的,晚上试下糖拌,估计口感会很好;
    黄瓜,5块一斤,大的基本上被摘没了,象征性的摘了6根就撤退了;
    草莓,10块一斤,在黄瓜的下面,算是立体种植,没买,偷偷摘吃了几个大点的还可以,用口袋装回来7~8个。
    门票一人20,也水涨船高了。

    晚上接到电话,项目暂时搁置了,小郁闷,嘿嘿,你懂得。

    老婆

    老婆

    正在发育中的李子

    正在发育中的李子

    成熟的樱桃压弯了枝头

    成熟的樱桃压弯了枝头

    MySQL Infobright-数据仓库笔记

    由于项目中的登录log一直比较大,目前是每周切分一张表,每次做月季度数据分析的时候就很痛苦,今天特定请教了一下公司DBA的同学,学到了两个解决方法。一个是把每天的登录按照位运算的形式保存,查询的时候使用bit_count(field)来计算,速度会大大提升,这个以后在项目中实践了再来分享;另一个就是使用Infobright引擎,Infobright是一个列存数据仓库软件,可以与MySQL集成,作为MySQL的一个存储引擎来使用。详细的框架结构可以参考官方的白皮书,国内也有介绍的,比如这一篇文章

    Infobright是一个与MySQL集成的开源数据仓库(Data Warehouse)软件,可作为MySQL的一个存储引擎来使用,SELECT查询与普通MySQL无区别。

    一、Infobright的基本特征:
    优点:
    查询性能高:百万、千万、亿级记录数条件下,同等的SELECT查询语句,速度比MyISAM、InnoDB等普通的MySQL存储引擎快5~60倍
    存储数据量大:TB级数据大小,几十亿条记录
    高压缩比:在我们的项目中为23:1,极大地节省了数据存储空间
    基于列存储:无需建索引,无需分区
    适合复杂的分析性SQL查询:SUM, COUNT, AVG, GROUP BY

    限制:
    不支持数据更新:社区版Infobright只能使用“LOAD DATA INFILE”的方式导入数据,不支持INSERT、UPDATE、DELETE
    不支持高并发:只能支持10多个并发查询。

    安装可以参考这篇文章 MySQL Infobright 数据仓库快速安装笔记[原创]。不过最新版已经没有64位的源码,我们可以直接下载rpm或者deb版本进行安装。

    1. Download the install package (e.g. infobright-3.4-x86_64.rpm) to the server where you are installing Infobright

    2. Obtain root user access

    3. To install the RPM package, run:

    rpm -ivh infobright_version_name.rpm [optional: --prefix=path]

    To install the DEB package, run:

    dpkg -i infobright_version_name.deb

    Note: Please do not install ICE in the root or home directories due to possible MySQL permission checking issues during install, start up, and/or load. [需要注意会有mysql的权限问题,所以安装的目录需要chown mysql:mysql授予访问权限]

    4. To change the default install options, after installation run:

    /usr/local/infobright/postconfig.sh

    You can run this script at any time after installation to change the datadir, CacheFolder, socket, and port. The script must be run as root and ICE must not be running. 【需要在infobright停止运行的时候再修改目录相关,该脚本需要在安装目录下运行,所以需要承 cd /usr/local/infobright/

    5. The installation determines the optimum memory settings based on the physical memory of the system. You may change these settings by editing the file brighthouse.ini within the data directory.

    Important: The memory settings assume that there are no other services on the machine consuming significant memory. If this is not the case, please lower the memory settings for Infobright.

    6. To start or stop ICE, run:

    /etc/init.d/mysqld-ib start
    /etc/init.d/mysqld-ib stop

    7. To connect to ICE, use the script mysql-ib:

    /usr/bin/mysql-ib [optional:db_name]

    8. To uninstall ICE, run either:

    rpm -e infobright
    dpkg -r infobright

    9. 示例:从普通的MySQL数据库(假设MySQL安装路径为/usr/local/webserver/mysql)导出数据到csv文件:

    /usr/local/webserver/mysql/bin/mysql  -S /tmp/mysql3306.sock -D tongji_logs -e "select * from  log_visits_2010_05_10 into outfile '/data0/test.csv' FIELDS TERMINATED  BY ',' ENCLOSED BY '"'  ESCAPED BY '\' LINES TERMINATED BY 'n';"

    10.示例:普通MySQL和Infobright建表对比

    ①、普通MySQL的InnoDB存储引擎建表:
    CREATE TABLE IF NOT EXISTS `log_visits_2010_05_12` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `cate_id` int(11) NOT NULL,
    `site_id` int(11) unsigned NOT NULL,
    `visitor_localtime` char(8) NOT NULL,
    `visitor_idcookie` varchar(255) NOT NULL,
    PRIMARY KEY (`id`),
    KEY `cate_site_id` (`cate_id`,`site_id`),
    KEY `visitor_localtime` (`visitor_localtime`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    ②、Infobright的BRIGHTHOUSE存储引擎建表:
    CREATE TABLE IF NOT EXISTS `log_visits` (
    `id` int(11) NOT NULL,
    `cate_id` int(11) NOT NULL,
    `site_id` int(11) NOT NULL,
    `visitor_localtime` char(8) NOT NULL,
    `visitor_idcookie` varchar(255) NOT NULL,
    ) ENGINE=BRIGHTHOUSE DEFAULT CHARSET=utf8;

    注:BRIGHTHOUSE存储引擎建表时不能有AUTO_INCREMENT自增、unsigned无符号、unique唯一、主键PRIMARY KEY、索引KEY。
    11、示例:从csv文件导入数据到Infobright数据仓库:

    /usr/local/infobright/bin/mysql  -S /tmp/mysql3307.sock -D dw --skip-column-names -e "LOAD DATA INFILE  '/data0/test.csv' INTO TABLE log_visits_2010_04_13 FIELDS TERMINATED BY  ',' ESCAPED BY '\' LINES TERMINATED BY 'n';"

    12、更改目录后不能启动mysqld的种种解答

    1.配置文件在/etc/my-ib.cnf ;2. 启动脚本/etc/init.d/mysqld-ib可以知道配置文件中设置了mysql的sock,必须得让mysql对mysql.sock存放路径有访问权限

    遥想当年

    现在的互联网,真不知道是快的要泡沫了还是真的世界变化太快,总之每天都有各种各样的新生事物冒出来,然后大家一窝蜂的蜂拥而上,tumblr刚流行,然后国内就出来的点点宽途宽岛之类的。或者quora活了,国内也跟着出来了知乎 者也 之类,真的国内没法创新,有创新的也很快被其他大互联网公司抄袭走,只能抄袭了,更甚者,看看国内数以千计的团购网站,就更知道国内copy之风的盛行了。其实新事物多了也不错,我记得某位大仙曾经整理过,2011年新出来的好玩的网站,去体验了有几个真的也不错,不过小众们玩玩可以,要想火起来我估计不太容易。
    曾经一个部门的同事,现在已经被瓜分的七零八落了,想想也挺有意思的,一个网站的注册都能整出来一个大部门出来,产品加技术也有近20人吧,不过自己在开发的过程中,也为怎么挖掘新用户积累了不少经验,说不定哪天还能拿来一用,或者哪位想咨询一下啊,可以私底下交流。以前的几个同事,涛哥自己出去创业了,切入点还不错,webgame真的目前是很有前景的;牛蛙xboss去了点点,点点的技术基本上都是人人网过去的,可以说轻车熟路,大家基本上不用磨合啥的,就是创业型公司太累;阿泰貌似也动摇了,老高去了UGC部门,我也开始做游戏相关的了,觉得自己还是适合走技术路线,尽管码农处在社会最底层,也最被人鄙视,哈哈。

    收了几个小弟

    从头开始培养,好累啊,现在的年轻人都眼高手低的,貌似干活也不怎么让人省心,真麻烦,有问题也不问,一直憋着,真不喜欢这样子的。总得给人个好求上进的印象吧。

    document.getElementById为null

    调试一个简单的页面,引用了杂七杂八的js,于是原有的静态页面的功能就失效了,于是开始debug。
    最后发现最简单的document.getElementById 都alert不出来东西,一番google之后,于是有了这篇文章,记录一下。
    原因: var titab=document.getElementById(“titletab”);没有取到对象
    解决办法:
    1.在错误语句的下面加上alert(titab);调试语句,看看是否有消息框弹出
    2.如果没有弹出,检查HTML代码中的是否存在”id=titletab”的
    标签(要仔细哦,一个字母都不能错的)
    3.如果标签存在,那么考虑<script>代码段的位置问题,切记包含有类似getElement代码<script>代码段必须出现在HTML的Element之后也就是说你把<script>代码段放到标签之后然后尝试。
    于是把js移到footer中执行,问题解决。

    此间的少年电影版-此情可待成追忆

    此间的少年,以此祭奠我们那似水年华,有多少人,夜深人静的时候还能梦回到那可爱的大学生活,有多少春暖花开,还曾回忆起一起欢笑的日子,多少年过去了,还有人会念叨那些琐碎但可爱的大小事呢。
    这是电影版的此间的少年,花了2个小时,居然看完了,还能小有感慨,admire一下我自己。

    Resin服务相关-日志统计SocketServer

    在前面的章节中,我们讲述了Resin本地部署服务脚本Resin更新服务脚本,本章中,我们重点讲述下对log的收集,在日常工作中我们对一些不重要的数据往往不会保存到数据库,而是直接打印到文件的方式,具体到应用的时候在对log文件进行分析,但是线上运行的机器往往都是多台,每台分析相同的事情或者对所有数据做合并处理的时候就显得很不方便,于是我们可以采用一种集中管理的方式,log4j的包为我们提供了丰富的功能,不用再自己实现,远程log用的是SocketServer。

    假设10.2.1.100,10.2.1.200是客户端机器,10.2.1.500是log server.

    在客户端log4j的配置文件中,设置远程记录log,并设置好端口

            
                    
                    
                    
                    
                    
            
    

    100和200做同样的设置,对于服务器端500 server需要进行区分。
    服务器端默认的配置文件记录在lcf文件夹中,每个文件代表一个客户端机器,目录如下:

    [root@SJSWT45-26 lcf]# ls -l
    总计 36
    -rw-r--r-- 1 root root  893 2010-08-03 10.2.1.100.lcf
    -rw-r--r-- 1 root root  895 2010-08-03 10.2.1.200.lcf

    打开看一下,具体的配置文件,以100.lcf为例子

    log4j.logger.promotion=DEBUG,FILELOGER2
    log4j.additivity.promotion=false
    log4j.appender.FILELOGER2=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.FILELOGER2.DatePattern='.'yyyy-MM-dd-HH
    log4j.appender.FILELOGER2.encoding=UTF-8
    log4j.appender.FILELOGER2.File=/data/remote-log-server/log/promition1.log      
    log4j.appender.FILELOGER2.layout=org.apache.log4j.PatternLayout  
    log4j.appender.FILELOGER2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss},%m %n

    大功告成,现在我们把服务器500服务器的log服务启动起来,需要activation-1.1.jar 和log4j-1.2.16.jar两个包,如果加入自动发邮件的功能话,还需要引入mail-1.4.1.jar 。启动脚本如下:

    /opt/j2sdk/bin/java -Xmx1G -cp /data/remote-log-server/lib/activation-1.1.jar:/data/remote-log-server/lib/mail-1.4.1.jar:/data/remote-log-server/lib/log4j-1.2.16.jar org.apache.log4j.net.SocketServer 9123 /data/remote-log-server/logserver.properties /data/remote-log-server/lcf

    为了方便改动后,重启服务生效,我们可以写个shell脚本:

    #!/bin/sh
    
    ulimit -n 1000000 -s unlimited -u unlimited
    export LIB_DIR=/data/remote-log-server/lib
    #set -x
    /opt/j2sdk/bin/java -Xmx1G -cp $LIB_DIR/activation-1.1.jar:$LIB_DIR/mail-1.4.1.jar:$LIB_DIR/log4j-1.2.16.jar org.apache.log4j.net.SocketServer "$@" &
    SPID=$!
    sleep 1
    echo $SPID > /var/run/log4j.pid

    其中,”$@”代表shell脚本传入的参数,在该实例中,需要传入三个参数,分别对应端口port服务器日志配置客户端收集log的配置信息目录lcf.

    然后写个脚本来检测我们的服务端口9123就行了。

    #!/bin/sh
    
    out=`/bin/netstat -nlt | grep :9123`
    if [ -n "$out" ]; then
            echo 'PORT 9123 OK !!! '`date`
    else
            echo 'PORT 9123 HAS DOWN...... RESTART...... '`date`
            /sbin/service log4j start
    fi
    

    配置log服务的重启脚本如下,放在/ect/init.d/目录下,这儿我们命名为remote_log4j, vim /etc/init.d/remote_log4j

    #!/bin/bash
    #
    # Startup script for Log4J Socket Server
    #
    # chkconfig: - 86 15
    # description: Log4J Socket Server
    # processname: log4j
    
    ulimit -n 1000000 -s unlimited -u unlimited
    
    JAVA_HOME=/opt/j2sdk
    export JAVA_HOME
    start_log4j="/data/remote-log-server/bin/startSockerServer.sh  9123 /data/remote-log-server/logserver.properties /data/remote-log-server/lcf "
    stop_log4j="kill -9 `cat /var/run/log4j.pid`"
    
    start() {
            echo -n "Starting log4j Socket Server:"
            ${start_log4j}
            echo "done."
    }
    stop() {
            echo -n "Shutting down log4j: "
            ${stop_log4j}
            echo "done."
    }
    
    # See how we were called
    case "$1" in
      start)
            start
            ;;
      stop)
            stop
            ;;
      restart)
            stop
            sleep 1
            start
            ;;
      *)
            echo "Usage: $0 {start|stop|restart}"
    esac
    
    exit 0
    

    520表白日的晚餐

    520:我爱你老婆!蓝色港湾吃晚餐,做个简单的记录,爱老婆一辈子。