Redis のクラスター マスター/スレーブ モデルは、可用性の高いクラスター アーキテクチャです。この章の主な内容には、高可用性クラスターのセットアップ、Jedis のクラスターへの接続、クラスター ノードの追加、クラスター ノードの削除、および追加の構成手順が含まれます。 (推奨事項: redis ビデオ チュートリアル )
高可用性クラスターの構築
クラスター (クラスター) テクノロジーは、比較的新しいテクノロジは、クラスタ テクノロジを通じて、低コストで比較的高いパフォーマンス、信頼性、および柔軟性を得ることができます。タスク スケジューリングはクラスタ システムの中核テクノロジです。
Redis は 3.0 以降のクラスタリングをサポートします。 Redis クラスターには 16384 個のハッシュ スロットが組み込まれています。 Redis は、ノードの数に基づいて、ハッシュ スロットをさまざまなノードにほぼ均等にマッピングします。
すべてのノードは相互に接続されています (PING-PONG メカニズム)。ホストの半数以上が特定のホストがダウンしていると考えた場合、そのホストは実際にダウンしており、クラスター全体が使用できなくなります。
複数のスレーブ マシンがクラスター内の各ホストに割り当てられている場合。マスター マシンがハングアップしても、スレーブ マシンは引き続き正常に動作します。ただし、クラスター内のホストの半分以上がダウンしている場合、スレーブ マシンがあるかどうかに関係なく、クラスターは使用できなくなります。
ビルド前の準備
ruby環境の構築
Redisクラスター管理ツールredis-trib.rbはruby環境に依存しています。
[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 ディレクトリ。前のステップの実行が失敗した可能性があります。
[root@itdragon ~]# ruby --version 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
[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」と入力して推奨構成を受け入れます
[root@itdragon bin]# ./redis-trib.rb create --replicas 1 112.74.83.71:6000 112.74.83.71:6001 112.74.83.71:6002 112.74.83.71:6003 112.74.83.71:6004 112.74.83.71:6005 >>> 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 がクラスターに接続します最初にファイアウォールを構成します
[root@itdragon ~]# vim /etc/sysconfig/iptables -A INPUT -p tcp -m tcp --dport 6000 -j ACCEPT -A INPUT -p tcp -m tcp --dport 6001 -j ACCEPT -A INPUT -p tcp -m tcp --dport 6002 -j ACCEPT -A INPUT -p tcp -m tcp --dport 6003 -j ACCEPT -A INPUT -p tcp -m tcp --dport 6004 -j ACCEPT -A INPUT -p tcp -m tcp --dport 6005 -j ACCEPT [root@itdragon ~]# service iptables restart
最後に Spring
<!-- jedis集群版配置 --> <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>を統合します
単体テスト
/** * 集群版测试 * 若提示以下类似的错误: * 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クラスター ノードの操作 マスター ノードを追加します
[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
说明:新增的主机必须要是启动状态。
添加从节点
[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 --slave --master-id 916d26e9638dc51e168f32969da11e19c875f48f 112.74.83.71:6007 112.74.83.71:6006 [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. 若该节点有值,则需要把槽分配出去
./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 3b8f36e8511915bce7c9b299b6ebb319 740e73133ae348627555b474d9c495f6
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 e6ea25fe04e706feb596307d341ecaa0
7 指定是否启用虚拟内存机制:vm-enabled no
8 指定虚拟内存文件路径:vm-swap-file /tmp/redis.swap
9 指定包含其它的配置文件:include /path/to/local.conf
更多redis知识请关注redis数据库教程栏目。
以上がRedis 高可用性クラスターの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。