くりーむわーかー

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

Redis

CentOS8をVirtualBoxでインスト、ついでにMariaDBとRedis

CentOS8が出てたので、VirtualBoxでとりあえずインスト。

centos8のisoをDL

現時点で「CentOS-8-x86_64-1905-dvd1.iso」

VirtualBoxで適当に作成。

新規作成で枠を作ってから、設定でストレージ⇒コントローラ:IDE⇒CDマーク押してDLしたISOを選択してから起動。

インストールの流れはCentOS7と変わらずかな?

ソフトの選択でサーバGUI選ぶのかワークステーション選ぶのか迷うくらい?

そーいえば、.netCoreの開発みたいなアドオンが出てた。あとで試してみよ。

そしたら色々更新。

dnf -y update
dnf -y install epel-release
dnf -y groupinstall "Development Tools"
dnf -y install dkms bzip2 gcc make kernel-devel kernel-headers

CentOS8からyum ⇒ dnfに変わったらしい。

「yum install」でも動くんだけど、dnfへのリンクになってるだけなんだってさ。

で、GuestAddtionのインストールをするのですが、

前はデバイス⇒GustAddtion選んでたと思うのですが、やってみるとエラー。

何でかなと思ったらどうも既にCDが入ってる事になってるらしい。

なので、アクティビティ⇒ファイルでVBox_Guest~~みたいなのがあるので選択してソフトウェアの実行すればOK。

割とハマらずにウィンドのリサイズとかクリップボードの共有とかできるようになってる。

よかたよかた。

ほいで、CentOS8はPython3がデフォになってるそうで。

でもコマンドが「python3」みたいなので、うーん。

いつも通り仮想環境作るか。。。

そしたら色々触ってみましょかね。。。

ひとまず、MariaDBとRedisをインストする。

MariaDB

MariaDBなんだけど普通にやるとまだCentOS8に対応してないよーって出る。

なので↓。

# dnf localinstallで必要なrpmをもってくる
curl -O https://downloads.mariadb.com/MariaDB/mariadb-10.4.8/yum/centos/mariadb-10.4.8-rhel-8-x86_64-rpms.tar

# 解凍
tar xvf mariadb-10.4.8-rhel-8-x86_64-rpms.tar

# 解凍先に移動
cd mariadb-10.4.8-rhel-8-x86_64-rpms

# インストール
sudo dnf localinstall -y galera-4-26.4.2-1.rhel8.0.el8.x86_64.rpm MariaDB-client-10.4.8-1.el8.x86_64.rpm MariaDB-common-10.4.8-1.el8.x86_64.rpm MariaDB-server-10.4.8-1.el8.x86_64.rpm MariaDB-shared-10.4.8-1.el8.x86_64.rpm

# サービスの有効化と起動
sudo systemctl enable mariadb
sudo systemctl start mariadb

# rootのパスワードとかの設定(最初にパスワード聞かれるけど、空のままエンター)
sudo mysql_secure_installation

#いちを再起動
sudo systemctl restart mariadb

MariaDBは10.4.8じゃないとCentOS8で動かせない様子。

新しい分には別に良いか。。。

Redis

Redisは何か楽になった。

Redis5.0っぽい(2019/11/2)

# インストはこれだけでイケた
sudo dnf install -y redis

# サービスの有効化と起動
sudo systemctl enable redis
sudo systemctl start redis

# 動作確認
redis-cli

# ↑のクライアント上で↓打って PONGって出てくればOK
ping

# いったん抜ける
exit

# ちょろっと設定
sudo vi /etc/redis.conf 

bind 127.0.0.1
↓
bind 0.0.0.0

requirepass  <パスワードを入れる>

# 再起動
sudo systemctl restart redis

# もう一回クライアント
redis-cli

# pingでこんどは「(error) NOAUTH Authentication required.」って出ればOK
ping

# そしたらログイン
auth <上で指定したpassword>

# もっかいpingで、PONGって出ればOK
ping

両方ともインストールはなんか楽になりましたね。。。

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」みたいな感じでやると見れる。

参考

問合せ