ホームページ  >  記事  >  データベース  >  Redis 高可用性クラスターの詳細な紹介

Redis 高可用性クラスターの詳細な紹介

尚
転載
2019-11-26 17:11:581883ブラウズ

Redis 高可用性クラスターの詳細な紹介

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 &#39;all&#39; to use all the nodes as source nodes for the hash slots.
  Type &#39;done&#39; 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 サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。