RitoLabo

【Redis入門編】CentOSにRedis(NoSQL)をインストールして初期設定&デーモン化までを行う

  • 公開:
  • 更新:
  • カテゴリ: Database NoSQL Redis
  • タグ: CentOS,Redis,NoSQL,AmazonElastiCache

今回は、NoSQLの中でも人気の高いRedisをインストールします。

アジェンダ
  1. Redis
    1. Redisのデータ型
      1. 文字列(String)型
      2. リスト(List)型
      3. セット(Set)型
      4. ソート済みセット(SortedSet)型
      5. ハッシュ(Hash)型
    2. AWSでRedisを使う
  2. 検証環境
  3. インストール
  4. ユーザ作成
  5. 設定ファイルの編集とログファイルの作成
  6. バックグラウンドで起動
  7. 動作確認

Redis

Redis(=REmote DIctionary Server)とは、NoSQL(=Not only SQL)に分類されるキー・バリュー型のインメモリデータベースです。メモリ上のみで動作するので非常に高速であり、永続化(スナップショット/AOF (=append-only file) )が可能です。

処理自体はシングルスレッドですが、リスト・マップ・ソート済みセット・ハッシュテーブルといったリッチなデータ構造を持てることも特徴であり、レプリケーションやクラスタリングにも対応している非常に高機能なNoSQLです。

使用用途としてはキャッシュ・セッション管理からリアルタイムデータのストア、各種分析まで幅広く使われており、RDBMSにはない特徴がいかんなく発揮されています。

やはり超高速というのは強いです。MySQLなどのRDBMSみたいに複雑な事は出来ませんが、使用用途さえ見極められれば最強クラスの友達になります。(色々と大規模なほど高速という要素やキャッシュに助けられている今日このごろ)

RedisはBSDライセンスとして提供されており、Githubでソースコードが公開されています。
[Github]antirez/redis
https://github.com/antirez/redis

[公式]Redis
https://redis.io/

Redisのデータ型

Redisのデータ型は以下の5つです。

文字列(String)型

基本型です。Key-Valueの形でストアされます。

"key1" => "value1"
"key2" => "value2"
"key3" => "value3"

バイナリセーフで、value値も最大1GBまで格納できます。

リスト(List)型

値は順番に格納され、登録順でデータが管理されます。そのため、Keyの重複が認められます。

"key1" => "value1"
"key1" => "value2"
"key2" => "value3"
"key1" => "value4"
"key3" => "value5"
"key2" => "value6"

セット(Set)型

基本的な格納型はリスト型と同じです。ただしこっちは登録順番は管理されません。その代わり、Key同志の処理(集合の和・差・積)が行えます。

"key_01" => "AAA",
"key_01" => "BBB",
"key_02" => "AAA",
"key_01" => "CCC",
"key_03" => "DDD",
"key_02" => "EEE",

// key_0102の
=> array("AAA", "BBB", "CCC", "EEE");

// key_0102の差
=> array("BBB", "CCC", "EEE");

// key_0102の積
=> array("AAA");

ソート済みセット(SortedSet)型

Key」「Value」ともう一つ「Score」をセットする事で、セットされたスコアに基づいてソートされデータがストアされていきます。

// 初期データ
"key_01", 100, "AAA"
"key_01", 200, "BBB"
"key_01", 300, "AAA"
"key_01", 400, "CCC"
"key_01", 500, "DDD"
"key_01", 600, "EEE"


// 以下のデータを挿入
=> "key_01", 350, "FFF"

// 結果
"key_01", 100, "AAA"
"key_01", 200, "BBB"
"key_01", 300, "AAA"
"key_01", 350, "FFF" // ← ココ
"key_01", 400, "CCC"
"key_01", 500, "DDD"
"key_01", 600, "EEE"

// スコアを基にデータが並び変えられる

ハッシュ(Hash)型

Key(親)Key(子)Valueの形でストアされるデータ型です。

"key_01", "aa", "AAA"
"key_01", "bb", "BBB"
"key_02", "aa", "AAA"
"key_01", "cc", "CCC"
"key_02", "dd", "DDD"
"key_03", "ee", "EEE"

// key_01を取得
=> array(
"aa" => "AAA",
"bb" => "BBB",
"cc" => "CCC",
);

要するに連想配列のような形です。

AWSでRedisを使う

AWSでは、ElastiCacheというサービスでRedisを使う事ができます。RedisとMemcachedを選択できます。

Amazon ElastiCache
https://aws.amazon.com/jp/redis/
https://aws.amazon.com/jp/elasticache/what-is-redis/

検証環境

  • Linux CentOS 7.2

yumのアップデートとvimのインストールは行いましたが、基本的には空っぽの状態です。

インストール

それではここから実際にインストールを行っていきます。今回は、最新版をインストールします。

まずは公式から最新版をチェックします。
http://download.redis.io/releases/

2018年2月時点で最新版はRedis 4.0.8だったのでこれをインストールします。

Redisのソースをダウンロードします。

# Redisのソースをダウンロードする
wget http://download.redis.io/releases/redis-4.0.8.tar.gz

# 実行結果
[root@localhost ~]# wget http://download.redis.io/releases/redis-4.0.8.tar.gz
--2018-02-08 22:44:58-- http://download.redis.io/releases/redis-4.0.8.tar.gz
Resolving download.redis.io (download.redis.io)... 109.74.203.151
Connecting to download.redis.io (download.redis.io)|109.74.203.151|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1729973 (1.6M) [application/x-gzip]
Saving to: ‘redis-4.0.8.tar.gz.1’

100%[========================================>] 1,729,973 655KB/s in 2.6s

2018-02-08 22:45:02 (655 KB/s) - ‘redis-4.0.8.tar.gz.1’ saved [1729973/1729973]

ダウンロードしたソースを解凍します。

# ダウンロードしたソースを解凍する
tar xzf redis-4.0.8.tar.gz

# 実行結果
[root@localhost ~]# tar xzf redis-4.0.8.tar.gz
[root@localhost ~]# ll

total 3392
drwxrwxr-x. 6 root root 4096 Feb 3 01:39 redis-4.0.8 // ← 解凍後
-rw-r--r--. 1 root root 1729973 Feb 3 01:40 redis-4.0.8.tar.gz // ← ダウンロードしたソース

解凍したディレクトリへ移動します。

# 解凍したディレクトリへ移動する
cd redis-4.0.8/

makeコマンドでコンパイルします。

# makeコマンドでコンパイルする
make

# 実行結果
[root@localhost redis-4.0.8]# make
cd src && make all

make[1]: Entering directory
`/root/redis-4.0.8/src'
CC Makefile.dep
.
.
省略
.
.

Hint: It's a good idea to run 'make test' ;)

make[1]: Leaving directory
`/root/redis-4.0.8/src'

もし以下のようなエラーが出た場合は、make distcleanして古い情報を削除してから改めてコンパイルします。

# エラー
fatal error: jemalloc/jemalloc.h: No such file or directory

# 古い情報を削除する
make distclean

# 改めてコンパイル
make

コンパイルが完了したら、Redisをインストールします。

# Redisをインストールする
make install

# 実行結果
[root@localhost redis-4.0.8]# make install
cd src && make install
make[1]: Entering directory `/root/redis-4.0.8/src'
CC Makefile.dep
make[1]: Leaving directory `/root/redis-4.0.8/src'
make[1]: Entering directory `/root/redis-4.0.8/src'

Hint: It's a good idea to run 'make test' ;)

INSTALL install
INSTALL install
INSTALL install
INSTALL install
INSTALL install

make[1]: Leaving directory `/root/redis-4.0.8/src'

インストールが完了したら、起動します。

# Redisを起動する
src/redis-server

# 実行結果
[root@localhost redis-4.0.8]# src/redis-server
11626:C 08 Feb 23:18:18.897 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
11626:C 08 Feb 23:18:18.897 # Redis version=4.0.8, bits=64, commit=00000000, modified=0, pid=11626, just started
11626:M 08 Feb 23:18:18.898 * Increased maximum number of open files to 10032 (it was originally set to 1024).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 4.0.8 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 11626
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'

ユーザ作成

Redis実行用にユーザを作成していきます。

グループを作成します。

# redisグループを作成する
groupadd redis

次にユーザを作成します。

# redisユーザを作成する
useradd -s /sbin/nologin -M -g redis redis

Redis のワークディレクトリを作成します。

# Redisのワークディレクトリを作成する
mkdir /etc/redis /var/run/redis /var/log/redis

ワークディレクトリの権限を変更します。

# ワークディレクトリの権限を変更する
chmod 755 /etc/redis /var/run/redis /var/log/redis

ワークディレクトリの所有者を変更します。

# ワークディレクトリの所有者を変更する
chown redis:redis /etc/redis /var/run/redis /var/log/redis

設定ファイルの編集とログファイルの作成

Redisの設定ファイルをコピーします。

# Redisの設定ファイルをコピーする
cp -p /root/redis-4.0.8/redis.conf /etc/redis/redis.conf

コピーした設定ファイルを編集します。デーモン化してバックグラウンドで稼働させるために「daemonize」を有効にし、ログファイルを設定します。

# Redisの設定ファイルを編集する
vim /etc/redis/redis.conf

[redis.conf]
---------------------------

## daemonize を有効にする
#daemonize no

daemonize yes

## ログファイルを設定する
#logfile ""

logfile /var/log/redis.log
---------------------------

Redisへのアクセスにパスワードを使用する場合はrequirepassとして設定します。

[redis.conf]
---------------------------

## パスワードを設定する
requirepass pssword
---------------------------

接続元の限定などを設定する場合はbindとして設定します。

[redis.conf]
---------------------------

## 接続元の制御
# 自サーバからの接続のみ
bind 127.0.0.1

# 任意の外部サーバからの接続をListenする
bind 192.168.99.99

# 全てのIPからの接続をListenする
bind 0.0.0.0
---------------------------

Redisのログファイルを作成します。中は空っぽでOKです。

# Redisのログファイルを作成する
vim /var/log/redis.log

ログファイルの所有者を変更します。

# ログファイルの所有者を変更する
chown redis:redis /var/log/redis.log

バックグラウンドで起動

デーモン化する設定を行ったので、バックグラウンドでRedisを起動します。

# Redisを起動する
cd /root/redis-4.0.8

sudo -u redis sh -c "src/redis-server /etc/redis/redis.conf --daemonize yes --dir /var/run/redis"

もしテストでVagrantなど仮想環境で構築している場合、特別に設定を行っていない場合は再起動した時点で/var/run/redisが失われている場合があるので、その場合は起動に失敗します。改めて作成してから起動を行ってください。

mkdir /var/run/redis
chmod 755 /var/run/redis
chown redis:redis /var/run/redis

動作確認

動作確認を行います。redis-cliでredis serverに接続し、対話的にコマンドを実行してみます。

# redis-cliredis serverに接続する
redis-cli -p 6379

# 実行結果
[root@localhost redis-4.0.8]# redis-cli -p 6379
127.0.0.1:6379> ping
PONG

接続できたら「ping」と打ってみると、「PONG」と返ってきました。

対話は「Ctrll + C」で終了できます。

Redisサーバを停止させる場合はredis-cliでshutdownを叩きます。

# redis serverを停止する
redis-cli shutdown

また、稼働中・停止などの状態はpsコマンドやnetstatコマンドで確認する事が確認できます。

# psコマンドで確認
ps -ef | grep [r]edis

# 実行結果
[root@localhost redis-4.0.8]# ps -ef | grep [r]edis
redis 11681 1 0 23:47 ? 00:00:00 src/redis-server 127.0.0.1:6379

# netstatで確認
netstat -tln | grep 63*

# 実行結果
[root@localhost redis-4.0.8]# netstat -tln | grep 63*
tcp 0 0 127.0.0.1:
6379 0.0.0.0:* LISTEN

まとめ

以上で作業は完了です。これでWebアプリケーション側のサーバから接続してあれこれ出来るようになりました。

もちろん、現段階では永続化は行っていないのでRedisサーバを落としたり再起動を行えばストアされたデータは消失します。

カスタマイズや設定など、まだまだやれることは多いですが、まずは入門はじめの一歩ということで、是非試してみてください。