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

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

リリース: 2019-11-26 17:11:58
転載
1954 人が閲覧しました

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

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 --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

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 --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 がクラスターに接続します最初にファイアウォールを構成します

1

2

3

4

5

6

7

8

[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

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

<!-- 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>

ログイン後にコピー
を統合します

単体テスト

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 &#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
说明:新增的主机必须要是启动状态。

添加从节点

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 --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. 若该节点有值,则需要把槽分配出去

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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:cnblogs.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート