Redis のクラスター マスター/スレーブ モデルは、可用性の高いクラスター アーキテクチャです。この章の主な内容には、高可用性クラスターのセットアップ、Jedis のクラスターへの接続、クラスター ノードの追加、クラスター ノードの削除、および追加の構成手順が含まれます。 (推奨事項: redis ビデオ チュートリアル )
高可用性クラスターの構築
クラスター (クラスター) テクノロジーは、比較的新しいテクノロジは、クラスタ テクノロジを通じて、低コストで比較的高いパフォーマンス、信頼性、および柔軟性を得ることができます。タスク スケジューリングはクラスタ システムの中核テクノロジです。
Redis は 3.0 以降のクラスタリングをサポートします。 Redis クラスターには 16384 個のハッシュ スロットが組み込まれています。 Redis は、ノードの数に基づいて、ハッシュ スロットをさまざまなノードにほぼ均等にマッピングします。
すべてのノードは相互に接続されています (PING-PONG メカニズム)。ホストの半数以上が特定のホストがダウンしていると考えた場合、そのホストは実際にダウンしており、クラスター全体が使用できなくなります。
複数のスレーブ マシンがクラスター内の各ホストに割り当てられている場合。マスター マシンがハングアップしても、スレーブ マシンは引き続き正常に動作します。ただし、クラスター内のホストの半分以上がダウンしている場合、スレーブ マシンがあるかどうかに関係なく、クラスターは使用できなくなります。
ビルド前の準備
ruby環境の構築
Redisクラスター管理ツールredis-trib.rbはruby環境に依存しています。
1 2 3 4 5 | [root@itdragon ~]# yum install ruby
[root@itdragon ~]# yum install rubygems
[root@itdragon ~]# gem install redis
[root@itdragon ~]# cd redis-4.0.2/src/
[root@itdragon src]# cp redis-trib.rb /usr/ local /redis-4/bin/
|
ログイン後にコピー
ステップ 1: Ruby 環境をインストールする
ステップ 2: gem パッケージをインストールします (gem は Ruby アプリケーションの拡張または変更に使用されます)。
ステップ 3: redis 解凍ディレクトリで redis-trib.rb ファイルを見つけ、管理を容易にするために、redis サービスが開始されているディレクトリにコピーします。
考えられる問題
1 redis には Ruby バージョン >= 2.2.2 が必要です。解決策は次のとおりです。
2 /usr/local/rvm/scripts/ がありません。 rvm ディレクトリ。前のステップの実行が失敗した可能性があります。
1 2 3 4 5 6 7 8 9 | [root@itdragon ~]# ruby
ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]
[root@itdragon ~]# yum install curl
[root@itdragon ~]# curl -L get.rvm.io | bash -s stable
[root@itdragon ~]# source /usr/ local /rvm/scripts/rvm
[root@itdragon ~]# rvm list known
[root@itdragon ~]# rvm install 2.3.3
[root@itdragon ~]# rvm use 2.3.3
[root@itdragon ~]# gem install redis
|
ログイン後にコピー
6 台の Redis サーバーを準備します
マスター/スレーブ レプリケーション ロジックと同様に、Redis をコピーします.conf ファイルを 6 回作成し、ポートは 6000~6005
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | [root@itdragon bin]# cp redis.conf redis6000.conf
[root@itdragon bin]# vim redis6000.conf
port xxxx #修改端口
cluster-enabled yes #打开注释,开启集群模式
cluster-config-file nodes-xxxx.conf #集群的配置文件
pidfile /var/run/redis_xxxx.pid #pidfile文件
logfile "xxxx.log" #日志文件
dbfilename dump_xxxx.rdb #rdb持久化文件
cluster-node-timeout 5000 #请求超时,单位毫秒
appendonly yes #开启aof持久化方式
[root@itdragon bin]# vim start- all .sh
./redis-server redis6000.conf
./redis-server redis6001.conf
./redis-server redis6002.conf
./redis-server redis6003.conf
./redis-server redis6004.conf
./redis-server redis6005.conf
[root@itdragon bin]# chmod u+x start- all .sh
[root@itdragon bin]# ./start- all .sh
[root@itdragon bin]# ps aux | grep redis
root 28001 0.0 0.9 145964 9696 ? Ssl 17:45 0:00 ./redis-server 112.74.83.71:6000 [cluster]
root 28003 0.0 0.9 145964 9696 ? Ssl 17:45 0:00 ./redis-server 112.74.83.71:6001 [cluster]
root 28008 0.0 0.9 145964 9656 ? Ssl 17:45 0:00 ./redis-server 112.74.83.71:6002 [cluster]
root 28013 0.0 0.9 145964 9656 ? Ssl 17:45 0:00 ./redis-server 112.74.83.71:6003 [cluster]
root 28018 0.1 0.9 145964 9652 ? Ssl 17:45 0:00 ./redis-server 112.74.83.71:6004 [cluster]
root 28023 0.0 0.9 145964 9656 ? Ssl 17:45 0:00 ./redis-server 112.74.83.71:6005 [cluster]
|
ログイン後にコピー
ステップ 1: 6 つの redis.conf をコピーし、関連する構成を変更します。面倒であれば、私が構成したファイルを使用できます: https ://github.com/ITDragonBlog/daydayup/tree/master /Redis/reids.conf
ステップ 2: 新しいバッチを追加して Redis サービス プログラムを開き、実行権限を増やす
ステップ 3: 確認6 つの Redis サービスが正常に開始されるかどうか
マスター/スレーブ クラスターの構築
クラスター作成コマンド: ./redis-trib.rb create createクラスター、 --replicas 1 は各ホストにスレーブを割り当て、その後に他のパラメーターは Redis サービスの ip:port です。最後に「yes」と入力して推奨構成を受け入れます
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | [root@itdragon bin]# ./redis-trib.rb create
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
112.74.83.71:6000
112.74.83.71:6001
112.74.83.71:6002
Adding replica 112.74.83.71:6003 to 112.74.83.71:6000
Adding replica 112.74.83.71:6004 to 112.74.83.71:6001
Adding replica 112.74.83.71:6005 to 112.74.83.71:6002
...... #省略
Can I set the above configuration? (type 'yes' to accept): yes
...... #省略
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered. #有16384个可用的插槽提供服务说明搭建成功
[root@itdragon bin]# ./redis-cli -h 112.74.83.71 -p 6002 -c
112.74.83.71:6002> set testKey value
-> Redirected to slot [5203] located at 112.74.83.71:6000
OK
112.74.83.71:6000> cluster info
cluster_state:ok
......
112.74.83.71:6000> cluster nodes
0968ef8f5ca96681da4abaaf4ca556c2e6dd0242 112.74.83.71:6002@16002 master - 0 1512035804722 3 connected 10923-16383
13ddd4c1b8c00926f61aa6daaa7fd8d87ee97830 112.74.83.71:6005@16005 slave 0968ef8f5ca96681da4abaaf4ca556c2e6dd0242 0 1512035803720 6 connected
a3bb22e04deec2fca653c606edf5b02b819f924f 112.74.83.71:6003@16003 slave 1d4779469053930f30162e89b6711d27a112b601 0 1512035802000 4 connected
1d4779469053930f30162e89b6711d27a112b601 112.74.83.71:6000@16000 myself,master - 0 1512035802000 1 connected 0-5460
a3b99cb5d22f5cbd293179e262f5eda931733c88 112.74.83.71:6001@16001 master - 0 1512035802719 2 connected 5461-10922
915a47afc4f9b94389676b4e14f78cba66be9e5d 112.74.83.71:6004@16004 slave a3b99cb5d22f5cbd293179e262f5eda931733c88 0 1512035801717 5 connected
|
ログイン後にコピー
ステップ 1: クラスターを構築します。/redis-trib.rb create、「はい」を選択して推奨構成を受け入れます
ステップ 2: クラスター クライアントを入力します./redis-cli -h 任意のホスト host -p 任意のホスト ポート -c、-c はクラスター モードで Redis に接続することを意味します
ステップ 3: データを保存します
ステップ 4: クラスター情報のクエリクラスター ステータス情報
ステップ 5: クラスター ノードクラスター ノード情報をクエリします。ここに落とし穴があります。考えられる問題については後ほど紹介します。
申し訳ありませんが、クラスター構成ファイルのnodes.conf はすでに使用されています。別の Redis クラスター ノード。別のノードが別のクラスター構成ファイルを使用していることを確認してください。
これは非常に明確です。名前の重複を避けるために、cluster-config-file のnodes.conf ファイルを変更するか、ファイルを削除して、クラスターを再作成します。
クラスター ノード クラスター ノード情報のクエリ
これは非常に重要なコマンドです。注意する必要がある情報は次のとおりです:
最初のパラメーター: ノード ID
2 番目のパラメータ: IP:PORT@TCP ここに落とし穴があります。jedis-2.9.0 より前のバージョンでは @error
3 番目のパラメータ: Flag (Master、Slave、Myself、Fail...)
4 番目のパラメータ: スレーブの場合、ホストのノード ID です。
最後の 2 つのパラメータ: 接続ステータスとスロットの位置。
Jedis がクラスターに接続します最初にファイアウォールを構成します
1 2 3 4 5 6 7 8 | [root@itdragon ~]# vim /etc/sysconfig/iptables
-A INPUT -p tcp -m tcp
-A INPUT -p tcp -m tcp
-A INPUT -p tcp -m tcp
-A INPUT -p tcp -m tcp
-A INPUT -p tcp -m tcp
-A INPUT -p tcp -m tcp
[root@itdragon ~]# service iptables restart
|
ログイン後にコピー
最後に Spring
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <!
<bean id= "redisClient" class= "redis.clients.jedis.JedisCluster" >
<constructor-arg name = "nodes" >
< set >
<bean class= "redis.clients.jedis.HostAndPort" >
<constructor-arg name = "host" value= "${redis.host}" ></constructor-arg>
<constructor-arg name = "port" value= "6000" />
</bean>
<bean class= "redis.clients.jedis.HostAndPort" >
<constructor-arg name = "host" value= "${redis.host}" ></constructor-arg>
<constructor-arg name = "port" value= "6001" />
</bean>
<bean class= "redis.clients.jedis.HostAndPort" >
<constructor-arg name = "host" value= "${redis.host}" ></constructor-arg>
<constructor-arg name = "port" value= "6002" />
</bean>
<bean class= "redis.clients.jedis.HostAndPort" >
<constructor-arg name = "host" value= "${redis.host}" ></constructor-arg>
<constructor-arg name = "port" value= "6003" />
</bean>
<bean class= "redis.clients.jedis.HostAndPort" >
<constructor-arg name = "host" value= "${redis.host}" ></constructor-arg>
<constructor-arg name = "port" value= "6004" />
</bean>
<bean class= "redis.clients.jedis.HostAndPort" >
<constructor-arg name = "host" value= "${redis.host}" ></constructor-arg>
<constructor-arg name = "port" value= "6005" />
</bean>
</ set >
</constructor-arg>
<constructor-arg name = "poolConfig" ref= "jedisPoolConfig" />
</bean>
<bean id= "jedisClientCluster" class= "com.itdragon.service.impl.JedisClientCluster" ></bean>
|
ログイン後にコピー
を統合します
単体テスト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | /**
* 集群版测试
* 若提示以下类似的错误:
* java.lang.NumberFormatException: For input string: "6002@16002"
* 若安装的redis 版本大于4,则可能是jedis 的版本低了。选择 2.9.0
* 因为 cluster nodes 打印的信息中,4版本之前的是没有 @16002 tcp端口信息
* 0968ef8f5ca96681da4abaaf4ca556c2e6dd0242 112.74.83.71:6002@16002 master - 0 1512035804722 3 connected 10923-16383
*/
@Test
public void testJedisCluster() throws IOException {
HashSet<HostAndPort> nodes = new HashSet<>();
nodes. add (new HostAndPort(HOST, 6000));
nodes. add (new HostAndPort(HOST, 6001));
nodes. add (new HostAndPort(HOST, 6002));
nodes. add (new HostAndPort(HOST, 6003));
nodes. add (new HostAndPort(HOST, 6004));
nodes. add (new HostAndPort(HOST, 6005));
JedisCluster cluster = new JedisCluster(nodes);
cluster. set ( "cluster-key" , "cluster-value" );
System. out .println( "集群测试 : " + cluster.get( "cluster-key" ));
cluster. close ();
}
|
ログイン後にコピー
考えられる問題
java.lang.NumberFormatException: 入力文字列の場合: "6002@16002"
Redis バージョンが 4.0.0 以降の場合, jedis-2.9.0以降を使用することを推奨します。
ソース コード:
https://github.com/ITDragonBlog/daydayup/tree/master/Redis/ssm-redis
クラスター ノードの操作 マスター ノードを追加します
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [root@itdragon bin]# cp redis6005.conf redis6006.conf
[root@itdragon bin]# ./redis-server redis6006.conf
[root@itdragon bin]# ./redis-trib.rb add -node 112.74.83.71:6006 112.74.83.71:6000
[root@itdragon bin]# ./redis-cli -h 112.74.83.71 -p 6000 cluster nodes
916d26e9638dc51e168f32969da11e19c875f48f 112.74.83.71:6006@16006 master - 0 1512115612162 0 connected # 没有分配槽
[root@itdragon bin]# ./redis-trib.rb reshard 112.74.83.71:6000
How many slots do you want to move ( from 1 to 16384)? 500
What is the receiving node ID? 916d26e9638dc51e168f32969da11e19c875f48f
Please enter all the source node IDs.
Type ' all ' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1: all
Do you want to proceed with the proposed reshard plan (yes/ no )? yes
[root@itdragon bin]# ./redis-cli -h 112.74.83.71 -p 6000 cluster nodes
916d26e9638dc51e168f32969da11e19c875f48f 112.74.83.71:6006@16006 master - 0 1512116047897 7 connected 0-165 5461-5627 10923-11088
|
ログイン後にコピー
最初のステップ: redis6006.conf の新しいホストを作成し、Redis サービスを開始します
2 番目のステップ: 新しいホストを追加しますホスト ノードで、「[OK] 新しいノードが正しく追加されました。」と出力されたら、追加が成功したことを意味します。
ステップ 3: クラスター ノード情報をクエリし、ポート 6006 のホストが追加されていることを確認します。 、接続ステータスの後にコンテンツはありません、つまり、スロットは割り当てられていません。
第四步:给6006端口主机分配槽,
第一个参数:需要移动槽的个数,
第二个参数:接受槽的节点ID,
第三个参数:输入"all"表示从所有原节点中获取槽,
第四个参数:输入"yes"开始移动槽到目标结点id
第五步:查询集群节点信息,发现6006端口的主机已经分配了槽
核心命令:
./redis-trib.rb add-node 新增主机ip:port 集群任意节点ip:port
./redis-trib.rb reshard 集群任意节点ip:port
可能存在的问题
[ERR] Sorry, can't connect to node 112.74.83.71:6006
说明:新增的主机必须要是启动状态。
添加从节点
1 2 3 4 5 6 | [root@itdragon bin]# cp redis6006.conf redis6007.conf
[root@itdragon bin]# vim redis6007.conf
[root@itdragon bin]# ./redis-server redis6007.conf
[root@itdragon bin]# ./redis-trib.rb add -node
[root@itdragon bin]# ./redis-cli -h 112.74.83.71 -p 6000 cluster nodes
80315a4dee2d0fa46b8ac722962567fc903e797a 112.74.83.71:6007@16007 slave 916d26e9638dc51e168f32969da11e19c875f48f 0 1512117377000 7 connected
|
ログイン後にコピー
第一步:创建 redis6007.conf 的新主机,并启动Redis服务
第二步:新增从机节点,在原来的命令上多了 --slave --master-id 主节点ID
第三步:查询集群节点信息
删除结点
删除节点前,要确保该节点没有值,否则提示:is not empty! Reshard data away and try again. 若该节点有值,则需要把槽分配出去
1 | ./redis-trib.rb del-node 112.74.83.71:6006 916d26e9638dc51e168f32969da11e19c875f48f
|
ログイン後にコピー
配置文件补充
前几章Redis教程中介绍了以下配置
1 开启Redis 的守护进程 :daemonize yes
2 指定pid文件写入文件名 :pidfile /var/run/redis.pid
3 指定Redis 端口:port 6379
4 绑定的主机地址 :bind 127.0.0.1
5 Redis持久化默认开启压缩数据:rdbcompression yes
6 指定rdb文件名:dbfilename dump.rdb
7 指定rdb文件位置:dir ./
8 从机启动时,它会自动从master进行数据同步:slaveof < masterip> < masterport>
9 开启aof持久化方式:appendonly yes
10 指定aof文件名:appendfilename appendonly.aof
11 触发aof快照机制:appendfsync everysec (no/always)
本章节是Redis教程中的最后一章,把剩下的配置也一起说了吧
1 设置客户端连接超时时间,0表示关闭 :timeout 300
2 设置Redis日志级别,debug、verbose(默认)、notice、warning:loglevel verbose
3 设置数据库的数量:databases 1
4 设置Redis连接密码:requirepass foobared
5 设置同一时间最大客户端连接数,默认无限制:maxclients 128
6 指定Redis最大内存限制:maxmemory < bytes>
7 指定是否启用虚拟内存机制:vm-enabled no
8 指定虚拟内存文件路径:vm-swap-file /tmp/redis.swap
9 指定包含其它的配置文件:include /path/to/local.conf
更多redis知识请关注redis数据库教程栏目。
以上がRedis 高可用性クラスターの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。