主従モード
Redisの主従モードは、主サーバーと従サーバーの関係を構築するシンプルな方法です。一対一の主従関係や一対多の主従関係を設定可能です。
主従モードの設定は非常に簡単です。従サーバーの設定ファイルに以下を追加します。
slaveof <master-ip> <master-port>
# 例えば
# slaveof 192.168.1.197 6379
メリット:
- 設定が簡単で、柔軟性があります。
- データの安全性が高いです。
デメリット:
- 故障切り替えが自動化されていません。
- 主サーバーがダウンした場合、従サーバーが自動的に主サーバーとして機能しません。
サentinエルモード
サentinエルモードの設定ファイルは、通常のRedis設定ファイルと同様です。以下の例を参考にして設定します。
// vim sentinel.conf
protected-mode yes
bind 10.10.10.137
daemonize yes
port 26380
sentinel monitor mymaster 127.0.0.1 6379 1
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 1800
Redisサーバーとサentinエルサーバーをそれぞれ起動します。
./redis-server redis.conf
./redis-server sentinel.conf
高可用性クラスタ分片モード
Redisの公式クラスタインストール方法を説明します。
必要なソフトウェア:
- redis-4.0.9.tar.gzダウンロード
- ruby-2.5.7.tar.gzダウンロード
- redis-4.0.0.gemダウンロード
- zlib-1.2.11.tar.gzダウンロード
- openssl-1.1.1a.tar.gzダウンロード
使用するポート:7001、7002、7003、7004、7005、7006
設定ファイルの場所:/app/redis/redis-cluster
本記事では、Linux上に6つのRedisノードを構築します(本番環境では、3台のLinuxサーバーに3つのMasterノードを配置します)。
インストール手順
第一步:gcc環境のインストール
[root@localhost ~]# gcc -v
yum -y install gcc gcc-c++
第二步:Redisの展開とコンパイル
cd /app/redis/
tar -xvf redis-4.0.9.tar.gz
cd redis-4.0.9/
make
make install
第三步:Rubyの展開とコンパイル
cd /app/redis
tar -xvf ruby-2.5.1.tar.gz
cd ruby-2.5.1/
./configure --prefix=/usr/local/ruby
make && make install
環境変数の設定:
vi /etc/profile
export PATH=$PATH:/usr/local/ruby/bin
:wq
source /etc/profile
Rubyのバージョン確認:
[root@localhost ~]# ruby -v
ruby 2.5.7p206 (2019-10-01 revision 67816) [x86_64-linux]
第四步:クラスタ管理ツールの準備
cd /app/redis
mkdir redis-cluster
cp redis-4.0.0.gem redis-cluster/
cp redis-trib.rb /app/redis/redis-cluster/
Gemのインストール:
cd /app/redis/redis-cluster
gem install redis-4.0.0.gem
もしzlibまたはopensslのエラーが発生したら、以下を実行します。
cd /app/redis/ruby-2.5.1/ext/zlib
ruby extconf.rb
vi Makefile
# すべての$(top_srcdir)を../../に置き換えます
make
make install
cd /app/redis/ruby-2.5.1/ext/openssl
ruby extconf.rb
vi Makefile
# すべての$(top_srcdir)を../../に置き換えます
make
make install
クラスタの作成
6つのポート(7001~7006)に対応する6つのディレクトリを作成します。
cd /app/redis/redis-cluster/
mkdir 700{1,2,3,4,5,6}
各ディレクトリに設定ファイルをコピーします。
cp redis.conf /app/redis/redis-cluster/7001/
cp redis.conf /app/redis/redis-cluster/7002/
cp redis.conf /app/redis/redis-cluster/7003/
cp redis.conf /app/redis/redis-cluster/7004/
cp redis.conf /app/redis/redis-cluster/7005/
cp redis.conf /app/redis/redis-cluster/7006/
各ディレクトリの設定ファイルを編集します。
bind 192.168.5.104
port 700X
daemonize yes
pidfile /app/redis/redis-cluster/700X/redis_700X.pid
cluster-enabled yes
クラスタを起動するスクリプトを作成します。
vim start-all.sh
cd 7001
./redis-server redis.conf
cd ..
cd 7002
./redis-server redis.conf
cd ..
cd 7003
./redis-server redis.conf
cd ..
cd 7004
./redis-server redis.conf
cd ..
cd 7005
./redis-server redis.conf
cd ..
cd 7006
./redis-server redis.conf
cd ..
スクリプトの実行許可を設定します。
chmod +x start-all.sh
クラスタを起動します。
./start-all.sh
クラスタの設定を行います。
./redis-trib.rb create --replicas 1 192.168.5.104:7001 192.168.5.104:7002 192.168.5.104:7003 192.168.5.104:7004 192.168.5.104:7005 192.168.5.104:7006
クラスタのテスト
主従高可用性テスト
主サーバーを停止し、従サーバーの状態を確認します。
cd /app/redis/redis-cluster/7001
./redis-cli -c -h 192.168.5.104 -p 7001 shutdown
主サーバーが復帰した場合、従サーバーが自動的に主サーバーとして機能します。
クラスタ分片性テスト
Javaコードを使用してクラスタの分片性をテストします。
Set<HostAndPort> nodes = new LinkedHashSet<HostAndPort>();
nodes.add(new HostAndPort("192.168.5.104", 7001));
nodes.add(new HostAndPort("192.168.5.104", 7002));
nodes.add(new HostAndPort("192.168.5.104", 7003));
nodes.add(new HostAndPort("192.168.5.104", 7004));
nodes.add(new HostAndPort("192.168.5.104", 7005));
nodes.add(new HostAndPort("192.168.5.104", 7006));
JedisCluster cluster = new JedisCluster(nodes, poolConfig);
for(int i=0; i<1000; i++){
try {
Thread.sleep(500);
System.out.println(i+"-------"+cluster.set("wc_"+i, "xinxin"+i));
} catch (Exception e) {
e.printStackTrace();
continue;
}
}