カテゴリーアーカイブ: mysql

苦労して色々試してみた結果、さっくりyumでインストールできる方法を見つけたのでやってみる。

yumかわいいよ。

RPMでやっても同じなんだけどね。

epelとremiのrepoを設定。

wget http://ftp.iij.ad.jp/pub/linux/fedora/epel/5/x86_64/epel-release-5-3.noarch.rpm
rpm -Uvh epel-release-5-3.noarch.rpm
wget http://rpms.famillecollet.com/el5.x86_64/remi-release-5-7.el5.remi.noarch.rpm
rpm -Uvh remi-release-5-7.el5.remi.noarch.rpm

インストール。

yum install mysql-server mysql-cluster

=================================================================================================================================================================================================================
 Package                                               Arch                                         Version                                                 Repository                                      Size
=================================================================================================================================================================================================================
Installing:
 mysql-cluster                                         x86_64                                       5.1.34-1.el5.remi                                       remi                                            14 M
 mysql-server                                          x86_64                                       5.1.34-1.el5.remi                                       remi                                            10 M
Installing for dependencies:
 mysql                                                 x86_64                                       5.1.34-1.el5.remi                                       remi                                           3.7 M
 mysql-libs                                            x86_64                                       5.1.34-1.el5.remi                                       remi                                           2.1 M
 mysqlclient15                                         x86_64                                       5.0.67-1.el5.remi                                       remi                                           1.3 M
 perl-DBD-mysql                                        x86_64                                       4.010-1.el5.rf                                          rpmforge                                       225 k
 perl-DBI                                              x86_64                                       1.607-1.el5.rf                                          rpmforge                                       871 k
 perl-Net-Daemon                                       noarch                                       0.43-1.el5.rf                                           rpmforge                                        44 k
 perl-PlRPC                                            noarch                                       0.2020-1.el5.rf                                         rpmforge                                        33 k

Transaction Summary
=================================================================================================================================================================================================================
Install      9 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

remiだけだったぽい。

ここにある、mysqlとmysql-serverは普通にmysqlをインストールする時のパッケージ。mysqldとmysqlクライアント。
MySQL Clusterには、管理ノード、データノード、SQLノードとあるのですが、そのうちSQLノードがmysqldとかです。

管理ノードは所謂管理ツール。クラスタ状態だとかmysqldだとかを管理してる。

データノードがデータを保存する場所。メモリ上に保存している模様。ファイル保存しないのかな?

SQLノードがmysqld。データノードからデータを取得したりSQLを解析したり、それをプログラムに渡してあげたり。
いつもだとテーブルのエンジンはMyISAMやInnoDBですが、これをNDBCLUSTERにするだけでいいのです。

さくっとインストールを終えて簡単に設定。

vi /etc/my.cnf

[mysqld]
ndbcluster
ndb-connectstring="127.0.0.1"

default-character-set=utf8

[ndbd]
ndb-connectstring=127.0.0.1

[mysql_cluster]
ndb-connectstring=127.0.0.1

[mysql]
default-character-set=utf8

vi /var/lib/mysql-cluster/config.ini

[NDBD DEFAULT]
NoOfReplicas: 1
IndexMemory=30M

[MGM DEFAULT]
PortNumber: 1186

[NDB_MGMD]
Id: 1
HostName: 127.0.0.1
ArbitrationRank: 1
DataDir: /var/lib/mysql-cluster

[NDBD]
Id: 21
HostName: 127.0.0.1
DataDir: /var/lib/ndb/data

[NDBD]
#Id: 22
#HostName: 192.168.0.12
#DataDir: /var/lib/ndb/data

[MYSQLD]
Id: 31
HostName: 127.0.0.1

[MYSQLD]
[MYSQLD]
[MYSQLD]

必要なディレクトリを作っておく。

mkdir -p /var/lib/ndb/data
chown -R mysql:mysql /var/lib/ndb

これじゃあまりMySQL Clusterの実感ないけどとりあえず起動。

service ndb_mgmd start
service ndbd start
service mysqld start

状態を見てみる。

ndb_mgm
> show
Connected to Management Server at: 127.0.0.1:1186
Cluster Configuration
---------------------
[ndbd(NDB)]	1 node(s)
id=21	@127.0.0.1  (Version: 5.1.34, Nodegroup: 0, Master)

[ndb_mgmd(MGM)]	1 node(s)
id=1	@127.0.0.1  (Version: 5.1.34)

[mysqld(API)]	4 node(s)
id=31	@127.0.0.1  (Version: 5.1.34)
id=32 (not connected, accepting connect from any host)
id=33 (not connected, accepting connect from any host)
id=34 (not connected, accepting connect from any host)

おー

次回は複数のサーバーで複数のノードを設定してみよう。

まだまだ調べることいっぱいあるね。

apache2、mysqlはyumでインストール済みの前提で。

http://www.outoforder.cc/projects/apache/mod_log_sql/

ソースファイルをダウンロードして、インストールします。

# wget http://www.outoforder.cc/downloads/mod_log_sql/mod_log_sql-1.101.tar.bz2
# tar jxvf mod_log_sql-1.101.tar.bz2
# cd mod_log_sql-1.101
# ./configure
# make
# make install

設定を追加します。

# vi /etc/httpd/conf.d/mod_log_sql.conf
LoadModule      log_sql_module          modules/mod_log_sql.so
LoadModule      log_sql_mysql_module    modules/mod_log_sql_mysql.so

VirtualHostに記述できるようです。

# vi /etc/httpd/vhost.conf

  # DBアクセス情報
  LogSQLLoginInfo mysql://ユーザ名:パスワード@localhost/apache2_log
  # テーブルをつくります
  LogSQLCreateTables on
  # MySQLのソケット指定
  LogSQLDBParam socketfile /var/lib/mysql/mysql.sock
  # 記録するテーブル名
  LogSQLTransferLogTable access_logs

アクセスログを記録するデータベースをつくります。

mysql> create database apache2_log default character set utf8;

ブラウザからアクセスしてデータベースを確認します。

mysql> select count(*) from access_logs;
mysql> desc access_logs;
+------------------+----------------------+------+-----+---------+-------+
| Field            | Type                 | Null | Key | Default | Extra |
+------------------+----------------------+------+-----+---------+-------+
| id               | char(19)             | YES  |     | NULL    |       |
| agent            | varchar(255)         | YES  |     | NULL    |       |
| bytes_sent       | int(10) unsigned     | YES  |     | NULL    |       |
| child_pid        | smallint(5) unsigned | YES  |     | NULL    |       |
| cookie           | varchar(255)         | YES  |     | NULL    |       |
| machine_id       | varchar(25)          | YES  |     | NULL    |       |
| request_file     | varchar(255)         | YES  |     | NULL    |       |
| referer          | varchar(255)         | YES  |     | NULL    |       |
| remote_host      | varchar(50)          | YES  |     | NULL    |       |
| remote_logname   | varchar(50)          | YES  |     | NULL    |       |
| remote_user      | varchar(50)          | YES  |     | NULL    |       |
| request_duration | smallint(5) unsigned | YES  |     | NULL    |       |
| request_line     | varchar(255)         | YES  |     | NULL    |       |
| request_method   | varchar(10)          | YES  |     | NULL    |       |
| request_protocol | varchar(10)          | YES  |     | NULL    |       |
| request_time     | char(28)             | YES  |     | NULL    |       |
| request_uri      | varchar(255)         | YES  |     | NULL    |       |
| request_args     | varchar(255)         | YES  |     | NULL    |       |
| server_port      | smallint(5) unsigned | YES  |     | NULL    |       |
| ssl_cipher       | varchar(25)          | YES  |     | NULL    |       |
| ssl_keysize      | smallint(5) unsigned | YES  |     | NULL    |       |
| ssl_maxkeysize   | smallint(5) unsigned | YES  |     | NULL    |       |
| status           | smallint(5) unsigned | YES  |     | NULL    |       |
| time_stamp       | int(10) unsigned     | YES  |     | NULL    |       |
| virtual_host     | varchar(255)         | YES  |     | NULL    |       |
| bytes_in         | int(10) unsigned     | YES  |     | NULL    |       |
| bytes_out        | int(10) unsigned     | YES  |     | NULL    |       |
+------------------+----------------------+------+-----+---------+-------+

テーブルはどうなっているのだろう。

mysql> show table status\G
           Name: access_logs
         Engine: MyISAM
        Version: 10
     Row_format: Dynamic
           Rows: 11
 Avg_row_length: 176
    Data_length: 1940
Max_data_length: 281474976710655
   Index_length: 1024
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2009-06-01 20:22:14
    Update_time: 2009-06-01 20:26:17
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options:
        Comment:

ほうほう。自動で作られるとMyISAMになるようだ。

他にも設定できる。

これを設定しないと日毎うん百万リクエストのサーバはレコードがうん百万できちゃいます。

LogSQLRequestAccept .html .jpg .gif .png
LogSQLRequestIgnore .exe .ico .php

SetEnvIf、SetEnvIfNoCaseと同じような動きになります。正規表現使えないのかな?

LogFormatみたいなことをやりたい場合は、

LogSQLTransferLogFormat StUR

この場合は、unixtime・いつもの日付・リクエスト部分のみ・リファラ、がレコードに記録されます。

スキーマ情報みたらフィールドはすべて持っていて、設定したフィールドだけ記録されている。ほかのフィールドはNULLで記録。

LogSQLTransferLogFormatの内容。

この内容は公式のドキュメントにもあります。

A User agent agent varchar(255) Mozilla/4.0 (compat; MSIE 6.0; Windows)
a CGI request arguments request_args varchar(255) user=Smith&cart=1231&item=532
b Bytes transfered bytes_sent int unsigned 32561
c Text of cookie $^{\textrm{1}}$ cookie varchar(255) Apache=sdyn.fooonline.net.1300102700823
H HTTP request protocol request_protocol varchar(10) HTTP/1.1
h Name of remote host remote_host varchar(50) blah.foobar.com
I Request ID (from mod_unique_id) id char(19) POlFcUBRH30AAALdBG8
l Ident user info remote_logname varchar(50) bobby
M Machine ID $^{\textrm{2}}$ machine_id varchar(25) web01
m HTTP request method request_method varchar(6) GET
P httpd child PID child_pid smallint unsigned 3215
p httpd port server_port smallint unsigned 80
R Referer referer varchar(255) http://www.biglinks4u.com/linkpage.html
r Request in full form request_line varchar(255) GET /books-cycroad.html HTTP/1.1
S Time of request in UNIX format time_stamp int unsigned 1005598029
s HTTP status of request status smallint unsigned 404
T Seconds to service request request_duration smallint unsigned 2
t Time of request in human format request_time char(28) [02/Dec/2001:15:01:26 -0800]
U Request in simple form request_uri varchar(255) /books-cycroad.html
u User info from HTTP auth remote_user varchar(50) bobby
v Virtual host servicing the request virtual_host varchar(50) www.foobar.com

あとはパフォーマンスが気になるところ。

これでもしapacheが捌けるリクエストが1/10とかなったらorz

実用に耐えられるかちゃんと計測しておこう。

wget http://nchc.dl.sourceforge.net/sourceforge/mysql-python/MySQL-python-1.2.2.tar.gz
tar zxvf MySQL-python-1.2.2.tar.gz
vi site.cfg
mysql_config = /usr/bin/mysql_config

python setup.py build
python setup.py install