くりーむわーかー

プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。

CentOS

CentOS + VirtualBoxでブラックスクリーン

VirtualBoxでCentOS動かしてる時に、

OSの起動ステータスが終わってGUIに切り替わる瞬間に

たまにブラックスクリーンになる。

電源落として何回か上げなおしてみても治らない時の対処。

この症状の場合はOSの起動までは出来てて、GUIの起動でこけてる時。

なので、ブラックスクリーンになったら、

「ctrl + alt + F2」を押す。

それでコンソールになるので、コンソールでログインする。

ログインしたら、「startx」。

で、GUIが起動すると思うので、起動したら再起動する。

※デスクトップのディレクトリ名を英語にするか?みたいなのが出るけどしないにしておく。

これでだいたい治る。何かに引っかかってるんだろうか。

いまいち原因が分からない。

いちを、「/var/log/Xorg.0.log」にGUI起動時のログは出てるんだけど

正常時となんか変わってないような気がする。

そもそも、毎回「vboxvideo」みたいなモジュールがねーってエラーが出てるっぽいんだけど、

ちょっと良く分からないですね。。。

Python3.6+CentOSでMeCabを使う

CentOS上でPythonからMeCabを使いたくなった。Pythonは3.6

で、一筋縄ではいかなかったので記録。

mecab本体のインストール

まず、git と Cのコンパイラ入ってない場合は入れる。

yum -y install git gcc-c++

そしたら、githubからソースを取得。作業用のディレクトリを決めてから。

cd sandbox
git clone https://github.com/taku910/mecab.git

ビルドする。

#本体のビルド
cd mecab/mecab
./configure  --enable-utf8-only
make
make check
sudo make install

#辞書のビルド
cd ../mecab-ipadic
./configure --with-charset=utf8
make
sudo make install

↑の内容はcloneした下記のhtmlファイルに記載されてるインストール手順。

firefox ~/sandbox/mecab/index.html &

そしたら動作確認。mecabでインタラクティブな実行になるので解析したい文字列を適当に入れてみる。

mecab
すもももももももものうち

ただ、この状態だと、「libmecab.so.2」っていうのがリンクしてもらえてなくて、リンクしてもらえるように下記の設定を行う。

#ファイル名は適当だけど拡張子だけは.conf
sudo vi /etc/ld.so.conf.d/mecab.conf
###############↓の一行だけ
/usr/local/lib
###############

sudo ldconfig

本体のインストールは以上。

Pythonから呼べるようにする

※ここから先は仮想環境に切り替えてからやる。

source ~/pyenv/bin/activate

swigのインストール

sudo yum install -y swig

Python用のビルドなんだけど、そのままやると動かないので、setup.pyの一部を書き換える。

cd ~/sandbox/mecab/mecab/python
vi setup.py
######################
#return string.split (cmd1(str))ってなっているところを
#return cmd1(str).split()にする。
######################

python setup.py build
python setup.py install

pip install mecab-python3

mecab-python3のPyPiのページ的にはUbuntuだとapt-getだけでイケルっぽいけど、CentOS用のは用意されてないんですかね。。。

しゃーなし。

ここまででPythonからimportして動くはず。

python
import MeCab
m = MeCab.Tagger ("-Ochasen")
print(m.parse("すもももももももものうち"))

長かった。。。

もうちょっと楽に行けるかと思ってたんだけども。。。

出来るまでに見たエラーは↓

pip install mecab-python3 で。

「unable to execute 'swig': No such file or directory」

import MeCab で。

「ImportError: libmecab.so.2: cannot open shared object file: No such file or directory」

CentOS7+MariaDB+GaleraCluster+MaxScale+Python

AWS上のCentOS7でMariaDBをGaleraClusterでクラスタ構成して、MaxScaleを使ってPythonから呼ぶ。(って書いてて、俺何語だ書いてんだって感じになった。

クラスタ構成のDBを使う必要が出てきたので、今まで話半分に聞いてたクラスタを真面目に調べた。クラスタ構成で、自分みたいなしがないSEには一個だけ腑に落ちない点があったんだけど、この点を明確に書いてるのってあんまないのよね。当たり前だろって話なんだろうけど。なので先にそれについて。

クラスタ構成のDBって、ノードが何個かあって、それぞれレプリケーション(複製?同期?)みたいな事してるイメージ。ほいで、マスタ落ちたらスレーブが昇格して~みたいな感じ。

でだ、ノードが複数あるってことはサービスがそれぞれいるって事。じゃーどのノードにアプリ側からアクセスすればいいの?ノード落ちたら、設定ファイル手で書きかえるの?アホなの?って感じだった。まー自分がアホなんですけど。

結論から言うと、クラスタ構成のDBを使う場合はアプリ側で何かしらの仕込み(orそれに代わるもの)が絶対に必要になる。具体的には下の感じの機能を持ったDBアクセスするためのモジュールが必要になる。

  • クライアント(アプリ)からの接続先(呼び出し先)は一か所
  • その一か所で登録されているノードにランダムにアクセス
  • 別途、各ノードが生きてるかどうかの死活監視をする
  • 死んでたら登録リスト的何かから除外
  • 復活したら登録リスト的何かに復活させる
  • マスタとかスレーブを切り替えてるならその辺も

クラスタ構成の何かを使う場合は必ず上記の様なものが必要。Webサーバで考えればロードバランサみたいなやつ。クラスタとかHA構成の話ってだいたい、クラスタそのものの機能ばっかりの話で、実際、具体的にどう使うか的な話があまり無いので、いっつも腑に落ちなかった。プロキシみたいな機能はどれなのって事かな。

Djangoのアプリでやろうとして、きっとそういうモジュールがあるんだろうなと思ってたら公式にこんな問答があった。アプリ側で上述の機能を実装しとけって事らしい。マジか・・・。

って思ったら、MariaDBの場合、上述のプロキシみたいな機能をMaxScaleというの使ってやれる。MariaDBはなかなかいい感じですね。使ってみて、機能的にも割とよかった。

という事で、CentOS7でMariaDBをGaleraClusterでクラスタ構成にして、MaxScaleのサービスを通してPythonから呼んで、アプリ側には変更を加えずにクラスタを使えるようにする。公式にもチュートリアルあるし、色々記事もあるんだけど、古かったりやり方書かれ過ぎてパニックなので、まとめ的にも。あと、実際にどう繋げばいいの?ってとこも。

まず、AWSで3つインスタンスを作る。マーケットプレイスの「CentOS 7 (x86_64) - with Updates HVM」で作った。同じVPCのサブネット内にインスタンス作って、プライベートIPでPING通るようにする。とりあえず、セキュリティで全てトラフィックを例えば「10.0.0.0/16」とかにしとけば行けると思う。

そしたら前準備。これは全インスタンスでやっておく。

#全体的に更新
sudo yum -y update

#時刻を日本の時間にしておく(これはやらなくてもいいかな)
sudo vi /etc/sysconfig/clock
#中身は↓#################
ZONE="Japan"
#中身は↑#################

sudo ln -sf /usr/share/zoneinfo/Japan /etc/localtime
sudo reboot

そしたら、最初のノードを作る。MariaDBは10.3。

#MariaDB レポジトリ設定
#https://mariadb.com/kb/en/library/mariadb-package-repository-setup-and-usage/

curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash

#MariaDB Serverのインストール(↓でMariaDB-client,galeraも入るらし)
sudo yum -y install MariaDB-server

#設定ファイル
sudo vi /etc/my.cnf.d/server.cnf
#中身は↓#################
[galera]
# Mandatory settings
wsrep_on=ON
wsrep_provider='/usr/lib64/galera/libgalera_smm.so'
wsrep_cluster_address=gcomm://10.0.0.90,10.0.0.91,10.0.0.92 #ノードのリスト
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
wsrep_cluster_name="cluster_test"
wsrep_node_address="10.0.0.90"###ここは自分のIP
bind-address=0.0.0.0
#中身は↑#################

#SELinuxを止める(これやらないとエラーでる)
sudo setenforce 0

#一つ目のノードを起動
galera_new_cluster

これでとりあえず最初のノードが起動する。で、最初のノードは必ず最後の「galera_new_cluster」で上げないとダメっぽ。2個目以降は「sudo systemctl start mariadb」。 ここまでの状態で、「mysql」って打てば自分につながる。で、あとはmysqlのrootのパスワードとかの設定。やらなくても動くだろうけどとりあえず。

#Rootのパスワードとかの設定
#ちなみにこれは、最初の一個だけやれば他のノードは同期されてた。
sudo '/usr/bin/mysql_secure_installation'

#いちをmariadbにつないで「show status like 'wsrep_%';」でクラスタの設定が見れる。
#これの結果で wsrep_local_state_commentがSynced、
#wsrep_incoming_addressesに自分のアドレスが乗ってれば大丈夫らし。

#設定終わったらとりあえず一回止める(別にいらないかも)
sudo systemctl stop mariadb

後は、他のノードも同様に↓の感じでセットアップ。今回は他の2台。

#MariaDB レポジトリ設定
#https://mariadb.com/kb/en/library/mariadb-package-repository-setup-and-usage/

curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash

#MariaDB Serverのインストール(↓でMariaDB-client,galeraも入るらし)
sudo yum -y install MariaDB-server

#設定ファイル
sudo vi /etc/my.cnf.d/server.cnf
#中身は↓#################
[galera]
# Mandatory settings
wsrep_on=ON
wsrep_provider='/usr/lib64/galera/libgalera_smm.so'
wsrep_cluster_address=gcomm://10.0.0.90,10.0.0.91,10.0.0.92 #ノードのリスト
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
wsrep_cluster_name="cluster_test"
wsrep_node_address="10.0.0.91"###ここは自分のIP
bind-address=0.0.0.0
#中身は↑#################

#SELinuxを止める(これやらないとエラーでる)
sudo setenforce 0

そしたら、最初に書いた通り、1個目のノードは「galera_new_cluster」、2個目以降のノードは「sudo systemctl start mariadb」でサービスを上げる。

ここまでで、クラスタ構成になる。適当なノードで「mysql -u root -p」でローカルのMariaDBにつなげて、「show status like 'wsrep_%';」すれば「wsrep_incoming_addresses」に3つIPが表示されてるはず。

次はMaxScaleのセットアップ。一か所で動かすけど、適当なノード(MariaDBが入ってるインスタンスとは別でもいい)で↓の感じ。

#インスト
curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
sudo yum -y install maxscale

で、次にMariaDBにつないで、MaxSclae用のユーザを作る。

mysql -u root -p

#maxscaleというユーザでパスワードもmaxscaleにする
CREATE USER 'maxscale'@'%' IDENTIFIED BY 'maxscale';
GRANT SELECT ON mysql.user TO 'maxscale'@'%';
GRANT SELECT ON mysql.db TO 'maxscale'@'%';
GRANT SELECT ON mysql.tables_priv TO 'maxscale'@'%';
GRANT SELECT ON mysql.roles_mapping TO 'maxscale'@'%';
GRANT SHOW DATABASES ON *.* TO 'maxscale'@'%';

#何か権限が↑じゃ足りないらしい。面倒なのでとりあえず丸ごとつける
GRANT ALL ON *.* to 'maxscale'@'%';

そしたら次は設定ファイル。

sudo vi /etc/maxscale.cnf

#中身は↓#################
[maxscale]
threads=auto

[server1]
type=server
address=10.0.0.90
port=3306
protocol=MariaDBBackend

[server2]
type=server
address=10.0.0.91
port=3306
protocol=MariaDBBackend

[server3]
type=server
address=10.0.0.92
port=3306
protocol=MariaDBBackend

[Galera Service]
type=service
router=readconnroute
router_options=synced
servers=server1, server2, server3
user=maxscale
passwd=maxscale

[Galera Listener]
type=listener
service=Galera Service
protocol=MariaDBClient
port=4306

[Galera Monitor]
type=monitor
module=galeramon
servers=server1, server2, server3
user=maxscale
passwd=maxscale

[CLI]
type=service
router=cli
[CLI Listener]
type=listener
service=CLI
protocol=maxscaled
socket=default
#中身は↑#################

Splitなんちゃらみたいなサービスとかリスナでやってるサンプルが多いですが、とりえず動かすなら↑で充分なのと、公式が上で書いてあるからそうした。で、アプリからつなぐときはリスナの「port=4306」につなげる必要あり。

そしたら、MaxScaleのサービスを上げて確認する。

#起動
sudo systemctl start maxscale
#確認用⇒ノードが3つ出て、マスタとかスレーブとか確認できればOK。
sudo maxadmin list services
sudo maxadmin list servers
sudo maxadmin list listeners

そしらた、mysqlのクライアントが入ってるインスタンス(mysqlってコマンド打って動くインスタンス)で↓のコマンド。

#maxscaleが動いてるホストの4306ポートに対してmaxsclaeというユーザで繋げる
mysql -h 10.0.0.90 --port 4306 -u maxscale

これで繋がれば、maxsclaeを通して各ノードにアクセス出来てる。

次はPythonから呼ぶ。っていっても↑のmaxscaleにつなげるやり方が分かってれば問題ないはず。

#とりあえずクライントはこれで
pip install mysql-connector-python

#インタプリタで試す
python

#下の感じ
import mysql.connector
conn = mysql.connector.connect(user='maxscale', password='maxscale', host='10.0.0.90', database='testhogedb')
cur = conn.cursor()
cur.execute("select * from hoge;")
for row in cur.fetchall():
    print(row[0])
cur.close
conn.close

これだけだと、あまり違いが分からないけど、マスタのサービス落としたり、他のノードでテーブル作ってインサートしてみたいなことしてもちゃんと動いてる事がわかると思う。

そいで、今一つ分かってない事が1個ある。色々見てるとクラスタは3ノードが最少構成で、3ノードの場合、ノードが残り1個になるとクエリを受け付け無くなるという習性がある。と色んな所で見る。でも、普通に動くんだよね。ノード1個でも。なんだろね。。。

謎。

VirtualBox ホストOS側からゲストOS側のサイトにアクセス

タイトル通り。通常のままだとできない。やり方は色々ある模様。

今回はNAT構成でポートフォワードの設定を作ってやる。ゲストOS側のサイトはDockerでnginxをリバースプロキシ(localhost:80/myfront ⇒ nuxt)にしてnuxtにつなぐ構成のサイト。

VirtualBoxの仮想マシン⇒設定からネットワーク開いて、NAT選択と高度⇒ポートフォワーディング。

sample01

そしたらルールの追加押して、ホスト側が送るIPとポート、ゲスト側が受けるIPとポートを指定。

sample02

これで、ホスト側のブラウザで「http://127.0.0.1:9999」みたいにしてやればつながる。

Pythonで共有ライブラリ(hoge.so)を呼ぶ

CentoOS。Pythonから***.soみたいな共有ライブラリを呼ぶ必要があったのでちょっと調べた。Python3.6。

呼び方は↓。

import ctypes

LIB_PATH = '/hoge/fuga/libmodule.so'
lib = ctypes.cdll.LoadLibrary(LIB_PATH )

res = lib.hogefunc()

#intの引数とるやつ
arg_int= ctypes.c_int(10)
res = lib.fugefunc(arg_int)

関数呼ぶのは上で行けるんだけど、引数が結構ややこしい。基本的には公式のctype見ればいいんだけども。やっかいなのが「char *」。ポインタの場合は↓の感じ。

str="some args str"
strb=bytes(str , encoding='utf-8', errors='replace')
strp=ctypes.c_char_p(strb )

res = lib.mogefunc(strp)

一回バイト配列に変換してからポインタに変換しないとダメみたいですよ。

CentOS Yum / Git / Curl プロキシの設定

プロキシ環境でやる場合。ユーザ認証付きで。他にもあるので今度足す。

■Yum
vi /etc/yum.conf

proxy = http://000.000.000.000:8080
proxy_username = hogeuser
proxy_password = fugapass

■Git
git config --global http.proxy http://hogeuser:fugapass@000.000.000.000:8080
git config --global https.proxy http://hogeuser:fugapass@000.000.000.000:8080
git config --global url."https://".insteadOf git://

確認
git config --list

■Wget
vi /etc/wgetrc

http_proxy=http.proxy http://hogeuser:fugapass@000.000.000.000:8080
https_proxy=http.proxy http://hogeuser:fugapass@000.000.000.000:8080
ftp_proxy=http.proxy http://hogeuser:fugapass@000.000.000.000:8080

■Curl
curl -U hogeuser:fugapass -x 000.000.000.000:8080 -L http://mirrorlist.centos.org

loadtestで性能確認

性能系の確認をしたい場合に使うやつ。nodeで動くので、node必須。公式?はココ

インストール。CentOS7。nodeとnpm入れてから。入ってない場合はコッチ参照

npm install -g loadtest

で、色々オプションがあるんだけど、とりあえずの使用は↓

loadtest [-n requests] [-c concurrency] URL

ex.
loadtest -n 200 -c 10 http://localhost/hoge

使いそうなオプションは↓

-n requests 送るリクエストの数。-c指定してる場合にリクエストの総数がパラメータよりも大きくなる可能性があるとのこと。その場合は最初のn個だけレポートするらし。
-c concurrency 擬似的にクライアントをここで指定した個数分作って、並列処理するらし。 プロセス的に分けて並列してるわけではない模様。応答が返ってくる前に2個目のリクエストが送信される場合もあるってさ。
-t timelimit リクエスト送り続ける秒数。応答が返ってきてなくても終わらせるってさ。
-C cookie-name=value cookie付けたい場合。複数ある場合は繰り返して書けって事らし。
-H header:value ヘッダーつけたい場合。jwtのテストとかで使えそう?「-h ”Authorization: JWT token-value"」的に。複数ある場合は繰り返して書けってさ。
-P POST-body ポストの中身。「-P '{"key": "a9acf03f"}'」みたいな。
-m method メソッドの指定。デフォはGET。POSTにしたい時⇒「-m POST」
-T content-type content-typeですね。デフォはtext/plain。
--data POST some variables フォーム送信的な事やるときはこれかな?⇒の感じで使えってさ。「--data '{"username": "test", "password": "test"}' -T 'application/x-www-form-urlencoded' -m POST」。これやるときは「-m POST」 と -Tは必須っぽ。
--rps requestsPerSecond これ使いそー。1秒間あたりに何個リクエスト出すかを指定する。「--rps 0.5」は2秒毎に1リクエストらし。-cと合わせる場合、並列の個数毎に効くんじゃなくて、全体としての扱いになる模様。-c 10とかやって場合に一つ一つ毎にrpsが効くわけではないと。で、あまりに並列度低いとrps満たせなくなるからそれなりに考えてねってことらしい。

他にもいろいろあるので詳しくは公式参照

例えば、10個のクライアントで1秒間にトータル100リクエスト(1クライアント10リクエスト/秒想定)出す状態で10秒間動かす場合は↓の感じ。

loadtest -t 10 -c 10 --rps 100 http://localhost/hoge

で、動かすと色々出てくるんだけど見るのは↓あたりかな。

#1秒間に送信できたリクエスト数
Requests per second: 10
#平均待ち時間
Mean latency:        6.4 ms
#待ち時間の分布割合。↓だと50%は5msで帰ってきてるってことかしら?
Percentage of the requests served within a certain time
  50%      5 ms
  90%      10 ms
  95%      12 ms
  99%      23 ms
 100%      23 ms (longest request)

あと↓の感じで(公式サンプル)、javascriptとして普通に組み込めるからテスト用にモジュール化しておけば、自動実行とか組み込めそうですね。。。

const loadtest = require('loadtest');
const options = {
    url: 'http://localhost:8000',
    maxRequests: 1000,
};
loadtest.loadTest(options, function(error, result)
{
    if (error)
    {
        return console.error('Got an error: %s', error);
    }
    console.log('Tests run successfully');
});

CentOS7にNode.jsをインスト

やり方まとめ。公式はここ

yumでインストールする場合。楽にやりたい場合はEPELのリポジトリを使わないとダメそう。

sudo yum -y install epel-release
or
sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

sudo yum install nodejs npm --enablerepo=epel

これでインストールされるバージョンは結構古い。現状だと↓。

node -v
⇒v6.14.3
npm -v
⇒3.10.10

nodeのバージョン管理ツール的なnvm使うやり方がよさそう。やり方はココ見た方が早い。

CentOS7 Redis4 Python3で性能確認

VirtualBox上のCentOS7にRedis4入れてPtyhonから呼んでみたときの性能回り。

VirtualBoxはRAM4GB、CPU:1コア,2.9G。

まず、接続。コネクションプール使うのがあるので比較。

import time
import redis

#コネクションプール使用で1万回接続⇒0.05472540855407715
t1 = time.time()
pool = redis.ConnectionPool(host='127.0.0.1', port=6379, password='hogepass')
for i in range(10000):
    r = redis.Redis(connection_pool=pool)
print(time.time() - t1)

#普通に1万回接続⇒0.2304081916809082
t1 = time.time()
for i in range(10000):
    r = redis.Redis(host='127.0.0.1', port=6379, password='hogepass')
print(time.time() - t1)

#4.5倍くらいプールの方が早い?

で、なんでか普通に接続の方を先にやるとプールの方が遅くなる。なんじゃらほい。

キーバリュの更新。ランダム文字の10万文字をバリューにして10000回更新

import time
import redis
import string
import random

def randomCharacter(n):
    c = string.ascii_lowercase + string.ascii_uppercase + string.digits
    return ''.join([random.choice(c) for i in range(n)])

databody = randomCharacter(100000)


t1 = time.time()
pool = redis.ConnectionPool(host='127.0.0.1', port=6379, password='hogepass')
r = redis.Redis(connection_pool=pool)
for i in range(10000):
    r.set(i,databody)
print(time.time() - t1)

#1回目:3.6718790531158447
#2回目:3.044043779373169
#3回目:2.0042741298675537
#4回目:2.015092134475708

初回(追加)ベースで考えると、10万文字のデータ更新で1件0.3msってところ。

索引。1万文字のバリューで1万件のデータをを1000回1件索引

t1 = time.time()
for i in range(1000):
    r.get(i)
print(time.time() - t1)

# 0.10848879814147949

1回あたり、0.1msと言った感じ。

おまけ

コネクションプールと普通の接続でmonitorの結果

import redis

pool = redis.ConnectionPool(host='127.0.0.1', port=6379, password='hogepass')
#プール1回目
r = redis.Redis(connection_pool=pool)
r.set('pool1','hoge1')#プールの場合はここでAuthのコマンド送ってる
r.get('pool1')
#プール2回目
r = redis.Redis(connection_pool=pool)
r.set('pool2','hoge2')
r.get('pool2')
#普通の1回目
r = redis.Redis(host='127.0.0.1', port=6379, password='hogepass')
r.set('not pool1','fuga1')
r.get('not pool1')
#普通の2回目
r = redis.Redis(host='127.0.0.1', port=6379, password='hogepass')
r.set('not pool2','fuga2')
r.get('not pool2')

上のmonitor結果

[0 127.0.0.1:58564] "AUTH" "hogepass"
[0 127.0.0.1:58564] "SET" "pool1" "hoge1"
[0 127.0.0.1:58564] "GET" "pool1"
[0 127.0.0.1:58564] "SET" "pool2" "hoge2"
[0 127.0.0.1:58564] "GET" "pool2"
[0 127.0.0.1:58566] "AUTH" "hogepass"
[0 127.0.0.1:58566] "SET" "not pool1" "fuga1"
[0 127.0.0.1:58566] "GET" "not pool1"
[0 127.0.0.1:58568] "AUTH" "hogepass"
[0 127.0.0.1:58568] "SET" "not pool2" "fuga2"
[0 127.0.0.1:58568] "GET" "not pool2"

コネクションプール使ってる方はやっぱ、つなぎ直しはしてませんね。つか繋ぎっぱなしになるんだろか。接続解除的な何かあったかな。あと、プールの場合は最初のSetの時にAuthコマンドはいてるっぽいですね。。。

CentOS7 + Redis

CentOS7でRedis4インストール。ググるとCentOS6だったりRedis3だったり色々なのでまとめ。

公式に載ってる通りにまずインストール。

#作業はRootで
#適当なディレクト内で実行
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
tar xzf redis-4.0.10.tar.gz
cd redis-4.0.10
make

#起動確認
src/redis-server

#インストール先はデフォで⇒ /usr/local/bin
make install

redisのユーザとグループを作る。

groupadd redis
useradd -s /sbin/nologin -M -g redis redis

設定・ログとかとか用のディレクトリとパーミッション

mkdir /etc/redis
mkdir /var/log/redis

chmod 755 /etc/redis
chmod 755 /var/log/redis

chown redis:redis /etc/redis 
chown redis:redis /var/log/redis

設定ファイルの雛形コピーして修正。

#最初に展開したredis-4.0.10の中
cp redis.conf /etc/redis/redis.conf_org #元ファイルをなんとなく
cp redis.conf /etc/redis/redis6379.conf

#編集
vi /etc/redis/redis6379.conf

#修正内容は↓
daemonize no
supervised auto
logfile /var/log/redis/redis6379.log
dir /var/log/redis
requirepass hogepass
maxclients 1024 

起動確認。

/usr/local/bin/redis-server /etc/redis/redis6379.conf

#別のターミナルで
redis-cli
auth hogepass
ping
quit

自動起動の設定。

#Unitの設定ファイル
vi /etc/systemd/system/redis6379.service
#中身
[Unit]
Description=Redis

[Service]
Type=simple
ExecStart=/usr/local/bin/redis-server /etc/redis/redis6379.conf
ExecStop=/usr/local/bin/redis-cli -p 6379 -a hogepass shutdown
User=redis
Group=redis

[Install]
WantedBy=multi-user.target


#起動確認
systemctl daemon-reload
systemctl start redis6379
systemctl stop redis6379

#サービス化の設定
systemctl enable redis6379

で、自動起動にして再起動すると上手くいかない場合がある。rootで色々起動確認しながらやると、DBのダンプファイルとかログファイルがrootで作成されてしまうので、自動起動時のredisユーザだと触れなくて落ちてる模様。その場合は、上記の設定で言うと「/var/log/redis」の中のファイル丸ごと消して再起動すればOK。

systemctlで起動したときのログは「 journalctl -f -u redis6379」みたいな感じでやると見れる。

参考

問合せ