2007년 12월 30일 일요일

sphinx test

sphinx.conf 파일(한글도 물론 잘된다!)

source src1
{
    type                    = mysql
    sql_host                = localhost
    sql_user                = user
    sql_pass                = password
    sql_db                  = database
    sql_port                = 3306
    sql_sock                = /var/run/mysqld/mysqld.sock
    sql_query_pre           = SET NAMES utf8
    sql_query_range         = SELECT MIN(idx),MAX(idx) FROM test
    sql_range_step          = 1024
    sql_query   = \
    SELECT idx, type, search \
    FROM test \
    WHERE idx >= $start AND idx <= $end
    sql_attr_uint           = type
    sql_ranged_throttle     = 0
}

source src1throttled : src1
{
    sql_ranged_throttle     = 100
}

index test1
{
    source          = src1
    path            = /usr/local/sphinx/var/data/test1
    docinfo         = extern
    mlock           = 0
    morphology      = none
    min_word_len    = 1
    charset_type    = utf-8
    charset_table   = 
    min_prefix_len  = 0
    min_infix_len   = 2
    enable_star     = 1
    ngram_len       = 1
    html_strip      = 0
}

index test1stemmed : test1
{
    path            = /usr/local/sphinx/var/data/test1stemmed
    morphology      = stem_en
}

index dist1
{
    type                = distributed
    local               = test1
    local               = test1stemmed
    agent               = localhost:3313:remote1
    agent               = localhost:3314:remote2,remote3
    agent_connect_timeout   = 1000
    agent_query_timeout     = 3000
}

indexer
{
    mem_limit           = 256M
}

searchd
{
    address             = 127.0.0.1
    port                = 3312
    log                 = /usr/local/sphinx/var/log/searchd.log
    query_log           = /usr/local/sphinx/var/log/query.log
    read_timeout        = 5
    max_children        = 2048
    pid_file            = /usr/local/sphinx/var/log/searchd.pid
    max_matches         = 10000
    seamless_rotate     = 1
    preopen_indexes     = 0
    unlink_old          = 1
}

2007년 12월 23일 일요일

sphinxSE install

오늘 드디어 미뤄 왔던 mysql에 sphinx-engine을 패치해서 소스 컴파일을 하는 작업을 했다.(이놈의 귀차니즘...)

우선 sphinx를 압축해제 후에 mysqlse/sphinx-version.diff 에 맞는 파일을 mysql 소스 디렉토리에 복사한다.

# patch -p1 < sphinx-version.diff
# BUILD/autorun.sh
# mkdir sql/sphinx
sphinx 소스파일을 sql/sphinx로 복사
# CC=gcc
# CFLAGS="-O3 -march=i686 -fomit-frame-pointer -pipe -felide-constructors -fno-exceptions -fno-rtti"
# CXXFLAGS="-O3 -march=i686 -felide -constructors -fno-execptions -fno-rtti"
# CXXLDFLAGS=""
# ./configure --prefix=/usr/local/mysql \
--enable-assembler \
--with-extra-charsets=complex \
--enable-thread-safe-client \
--with-big-tables \
--enable-local-infile \
--with-sphinx-storage-engine \
--with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock \
--localstatedir=/usr/local/mysql/data \
--with-user=mysql \
--with-charset=utf8 \
--with-extra-charsets=complex \
--with-mysqld-ldflags=-all-static \
--with-client-ldflags=-all-static

(--with-plugins=sphinx in 5.1)

# make; make install


aclocal: configure.in: 486: macro `AM_PROG_AS' not found in library
Can't execute aclocal
위와같이 build시 에러가 난다면 automake를 1.9이상으로 업데이트하고 (apt-get install automake1.9) 아래와 같이 automake를 변경한다.
update-alternatives --set automake /usr/bin/automake-1.9
yacc.sql 관련 에러가 나면 bison package를 설치하면된다. 이 package는 A parser generator that is compatible with Y 요거란다. :) sphinx/ha_sphinx.cc:273: error: extra qualification ‘CSphSEFilter::’ on member ‘CSphSEFilter’ 이 에러는 확인해본결과 0.9.7 버전에 있는 sphinx 64bit 관련된 버그란다. o.9.7 이상을 사용하던가 아니면 patch를 하면된다. (패치는 못찾았다. --; 아니 귀찮아서 안찾았다.) 이제 문제는 현재 서버에는 ubuntu package로 mysql-server가 설치되어있다. 이미 설치되어있는걸 지우지 않고 mysql server를 하나 더 사용할려고 한다. 대충 찾아본 결과 my.cnf만 실행할때 설정해주면 된다고 한다. 우선 기본적으로 행할 것은
# groupadd mysql
# useradd -g mysql -d /dev/null -s /usr/sbin/nologin mysql
# /usr/local/mysql/bin/mysql_install_db 로 databases를 생성한다.

# mkdir /var/run/mysql
# mkdir /data/mysql
# mkdir /var/log/mysql

# chgrp mysql /var/run/mysql
# chmod g+rw /var/run/mysql
# chgrp mysql /var/log/mysql
# chmod g+rw /var/log/mysql

# chown -R root .
# chown -R mysql /data/mysql
# chgrp -R mysql .
# chgrp -R mysql /data/mysql

# chown -R root /usr/local/mysql
# chown -R mysql /usr/local/mysql/data
# chgrp -R mysql /usr/local/mysql
이번에 sock 디렉토리를 /usr/local/mysql/tmp로 설정했다.
# mkdir /usr/local/mysql/tmp
# chown -R mysql.mysql /usr/local/mysql/tmp
my.cnf파일은 /usr/local/mysql/share/mysql/my-large.cnf 를 my.cnf로 복사해서 사용했다. my.cnf에 추가한 사항은
[client]
port = 3307
socket = /usr/local/mysql/tmp/mysql.sock

[mysqld]
user = mysql
port = 3307
pid-file = /usr/local/mysql/tmp/mysql.pid
socket = /usr/local/mysql/tmp/mysql.sock
default-character-set = utf8
스크립트 등록
cp /usr/local/mysql/share/mysql/mysql.server /etc/init.d/mysql
라이브러리 등록
echo /usr/local/mysql/lib/mysql >> /etc/ld.so.conf && ldconfig 
정도 추가했다. 기타 에러가 발생할경우 /usr/local/mysql/data/hostname.err파일을 살펴보면 된다. 실행방법은 mysql -hlocalhost -u사용자 -p -P(설정한포트)로 실행 하면된다. 현재 에러 없이 가장 잘되는 버전은 mysql-5.0.22.tar.gz와 sphinx-0.9.8-svn-r985.tar.gz 이버전 두개를 사용했을때 설치가 잘되었다. mysql-5.1 버전을 사용했을때는 innodb engine이 설치가 되지 않았었다. configure할때 옵션을 추가해야 가능하다.
mysql> show engines;
+------------+---------+----------------------------------------------------------------+
Engine Support Comment
+------------+---------+----------------------------------------------------------------+
MyISAM DEFAULT Default engine as of MySQL 3.23 with great performance
MEMORY YES Hash based, stored in memory, useful for temporary tables
InnoDB YES Supports transactions, row-level locking, and foreign keys
BerkeleyDB NO Supports transactions and page-level locking
BLACKHOLE NO /dev/null storage engine (anything you write to it disappears)
EXAMPLE NO Example storage engine
ARCHIVE NO Archive storage engine
CSV NO CSV storage engine
SPHINX YES Sphinx storage engine 0.9.8
ndbcluster NO Clustered, fault-tolerant, memory-based tables
FEDERATED NO Federated MySQL storage engine
MRG_MYISAM YES Collection of identical MyISAM tables
ISAM NO Obsolete storage engine
+------------+---------+----------------------------------------------------------------+