Redisの高可用性のためのセンチネルモード

1.1概要

マスタースレーブ切り替え技術の方法は次のとおりです。マスターサーバーがダウンした場合、スレーブサーバーをマスターサーバーに手動で切り替える必要があります。これには手動による介入が必要であり、時間と労力がかかります。サービスが一定期間利用できなくなります。これは推奨される方法ではなく、多くの場合、センチネルモードを優先します。

1.2センチネルモード

センチネルモードは、Redisセンチネルのコマンドを最初に提供する特別なモードです。センチネルは独立したプロセスであり、プロセスとして、独立して実行されます。原則として、Sentinelは、コマンドを送信してサーバーが応答するのを待つことにより、実行中の複数のインスタンスをRedis監視します。ここでの歩哨は2つの目的を果たします。Redis
ここに画像の説明を挿入

  • コマンドを送信すると、Redisサーバーはマスターサーバーとスレーブサーバーを含む実行ステータスの監視に戻ります。
  • センチネルはmasterダウンタイムを検出すると、自動的にダウンタイムにslave切り替わりmaster、パブリッシュ/サブスクライブモードを介して他のスレーブサーバーに通知し、構成ファイルを変更して、ホストを切り替えさせます。

ただし、番兵プロセスRedisがサーバーを監視する場合、問題が発生する可能性があります。このため、監視に複数の番兵を使用できます。各歩哨間でも監視が行われるため、マルチ歩哨モードが形成されます。

フェイルオーバー(failover)プロセスを言葉で説明します。メインサーバーがダウンしていると仮定すると、センチネル1は最初に結果を検出し、システムはすぐには続行しません。failoverセンチネル1がメインサーバーが利用できないと主観的に信じているだけで、この現象は主観的なオフラインになります。次の番兵もメインサーバーが利用できないことを検出し、その数が一定の値に達すると、番兵の間で投票が行われ、投票の結果が番兵によって開始されてfailover動作します。切り替えが成功すると、各センチネルは、パブリッシュ/サブスクライブモデルを介して、監視しているサーバーからホストを切り替えます。このプロセスは、客観的オフラインと呼ばれます。このようにして、すべてがクライアントに対して透過的になります。

1.3Redisセンチネルモードの構成

3このプロセスを示すために、番兵と1マスター/2スレーブRedisサーバーを構成します。

サービスの種類 マスターサーバーですか IPアドレス
もう一度言ってください はい 192.168.11.128 6379
もう一度言ってください いいえ 192.168.11.129 6379
もう一度言ってください いいえ 192.168.11.130 6379
センチネル - 192.168.11.128 26379
センチネル - 192.168.11.129 26379
センチネル - 192.168.11.130 26379

ここに画像の説明を挿入
まず、Redisのマスタースレーブサーバーを構成し、redis.confファイルを次のように変更します

# 使得Redis服务器可以跨网络访问
bind 0.0.0.0
# 设置密码
requirepass "123456"
# 指定主服务器,注意:有关slaveof的配置只是配置从服务器,主服务器不需要配置
slaveof 192.168.11.128 6379
# 主服务器密码,注意:有关slaveof的配置只是配置从服务器,主服务器不需要配置
masterauth 123456

上記の内容は主にRedisサーバーを構成するためのものであり、スレーブサーバーにはマスターサーバーよりも1つslaveof多い構成とパスワードがあります。

番兵を構成3します。各番兵の構成は同じです。インストールディレクトリに変更用のファイルRedisありますsentinel.confcopy

# 禁止保护模式
protected-mode no
# 配置监听的主服务器,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义,192.168.11.128代表监控的主服务器,6379代表端口,2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。
sentinel monitor mymaster 192.168.11.128 6379 2
# sentinel author-pass定义服务的密码,mymaster是服务名称,123456是Redis服务器密码
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster 123456

上記は、テストを容易にするために保護モードをオフにします。

上記の変更によりRedis、インストールディレクトリのディレクトリに入りsrc、次のコマンドでサーバーとセンチネルを起動できます。

# 启动Redis服务器进程
./redis-server ../redis.conf
# 启动哨兵进程
./redis-sentinel ../sentinel.conf

起動の順序に注意してください。最初はホスト(192.168.11.128)のサービスプロセスでRedisあり、次にスレーブのサービスプロセスが開始され、最後3にセンチネルのサービスプロセスが開始されます。

1.4Javaで使用されるセンチネルモード

/**
 * 测试Redis哨兵模式
 * @author liu
 */
public class TestSentinels {
    
    
    @SuppressWarnings("resource")
    @Test
    public void testSentinel() {
    
    
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(10);
        jedisPoolConfig.setMaxIdle(5);
        jedisPoolConfig.setMinIdle(5);
        // 哨兵信息
        Set<String> sentinels = new HashSet<>(Arrays.asList("192.168.11.128:26379",
                "192.168.11.129:26379","192.168.11.130:26379"));
        // 创建连接池
        JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels,jedisPoolConfig,"123456");
        // 获取客户端
        Jedis jedis = pool.getResource();
        // 执行两个命令
        jedis.set("mykey", "myvalue");
        String value = jedis.get("mykey");
        System.out.println(value);
    }
}

上記は使用目的であり、構成Jedisにも使用できますSpringRedisTemplate

        <bean id = "poolConfig" class="redis.clients.jedis.JedisPoolConfig">
            <!-- 最大空闲数 -->
            <property name="maxIdle" value="50"></property>
            <!-- 最大连接数 -->
            <property name="maxTotal" value="100"></property>
            <!-- 最大等待时间 -->
            <property name="maxWaitMillis" value="20000"></property>
        </bean>
        
        <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
            <constructor-arg name="poolConfig" ref="poolConfig"></constructor-arg>
            <constructor-arg name="sentinelConfig" ref="sentinelConfig"></constructor-arg>
            <property name="password" value="123456"></property>
        </bean>
        
        <!-- JDK序列化器 -->
        <bean id="jdkSerializationRedisSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"></bean>
        
        <!-- String序列化器 -->
        <bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"></bean>
        
        <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
            <property name="connectionFactory" ref="connectionFactory"></property>
            <property name="keySerializer" ref="stringRedisSerializer"></property>
            <property name="defaultSerializer" ref="stringRedisSerializer"></property>
            <property name="valueSerializer" ref="jdkSerializationRedisSerializer"></property>
        </bean>
        
        <!-- 哨兵配置 -->
        <bean id="sentinelConfig" class="org.springframework.data.redis.connection.RedisSentinelConfiguration">
            <!-- 服务名称 -->
            <property name="master">
                <bean class="org.springframework.data.redis.connection.RedisNode">
                    <property name="name" value="mymaster"></property>
                </bean>
            </property>
            <!-- 哨兵服务IP和端口 -->
            <property name="sentinels">
                <set>
                    <bean class="org.springframework.data.redis.connection.RedisNode">
                        <constructor-arg name="host" value="192.168.11.128"></constructor-arg>
                        <constructor-arg name="port" value="26379"></constructor-arg>
                    </bean>
                    <bean class="org.springframework.data.redis.connection.RedisNode">
                        <constructor-arg name="host" value="192.168.11.129"></constructor-arg>
                        <constructor-arg name="port" value="26379"></constructor-arg>
                    </bean>
                    <bean class="org.springframework.data.redis.connection.RedisNode">
                        <constructor-arg name="host" value="192.168.11.130"></constructor-arg>
                        <constructor-arg name="port" value="26379"></constructor-arg>
                    </bean>
                </set>
            </property>
        </bean>

1.5センチネルモードのその他の構成項目

構成項目 パラメータタイプ 効果
port 整数 センチネルプロセスポートを開始します
dir フォルダディレクトリ Sentinelプロセスサービスの一時フォルダ。デフォルトでは、/tmp書き込み可能な権限があることを確認します。
sentinel down-after-milliseconds <サービス名><ミリ秒(整数)> 番兵がサービスを監視しているRedisとき、Redisサービスがデフォルトのミリ秒数以内に応答できないとき、単一の番兵によって考慮される主観的なオフライン時間、デフォルトは30000(30秒)
sentinel parallel-syncs <サービス名><サーバー数(整数)> 新しいホストを同期できるサービスの数を指定しRedisます。一般的に、数値が小さいほど同期時間が長くなり、数値が大きいほどネットワークリソース要件が高くなります。
sentinel failover-timeout <サービス名><ミリ秒(整数)> フェイルオーバーに許可されるミリ秒数を指定します。この時間以降、フェイルオーバーは失敗したと見なされます。デフォルトは3分です。
sentinel notification-script <サービス名><スクリプトパス> 監視対象インスタンスが指すインスタンスが異常であることがsentinel検出されたときに呼び出されるアラームスクリプトを指定します。redisこの構成アイテムはオプションであり、より一般的に使用されます

sentinel down-after-milliseconds構成アイテムは、センチネルが指定された時間後に応答を受け取らなかった後でもホストが利用できないと考えるセンチネルです。他のセンチネルはそうではありません。センチネルはこのメッセージを記録します。主観的なオフラインを持つセンチネルがsentinel monitor設定された数に達すると、投票を開始して続行しますfailover。このとき、センチネルRedisは新しいシーンのニーズに合わせてセンチネル設定ファイルを書き換えます。

おすすめ

転載: blog.csdn.net/weixin_42039228/article/details/123653696