redis主従と哨兵アーキテクチャおよびクライアントアクセス

20576 ワード

redis主従と哨兵アーキテクチャおよびクライアントアクセス
redis主従アーキテクチャ構築##
Redisプライマリ・スレーブ・レプリケーションの機能は非常に強力で、次のメリットがあります.
  • Redis単点故障を避ける
  • 読み書き分離アーキテクチャを構築し、読み書きが少ないアプリケーションシーン
  • を満たす.
    ノード構成の例(プライマリノードは変更されません)
    1.redis関連構成の変更(rediss.conf)
    port 6380  # redis   
    pidfile /var/run/redis_6380.pid  # redis  id    
    logfile "6380.log" #       
    dir /usr/local/redis‐5.0.3/data/6380 redis      
    

    3、主従レプリケーションの構成
    replicaof xxx.xxx.xx.xx 6379 #           redis      
    replica‐read‐only yes  #        
    

    4、スレーブノードの起動
    redis‐server redis.conf #     ,      
    

    5、接続スレーブノード
    redis‐cli ‐p 6380 (   )
    

    6、主ノードインスタンスにデータを書くことをテストして、ノードインスタンスから直ちに同期して新しい修正データができるかどうか
    JAvaアクセス
    Jedisアクセスとspringbootアクセスredisプライマリ・スレーブの方法javaクライアントアクセスredisを表示するには、シングル・マシン・アクセスと同様に、特定のコードを使用します.https://blog.csdn.net/weixin_38414968/article/details/103246518
    哨兵アーキテクチャ構築
    sentinel哨兵は特殊なredisサービスであり、読み書きサービスは提供されず、主にredisインスタンスノードを監視するために使用される.哨兵アーキテクチャの下でclient端は初めて哨兵からredisの主ノードを探し出し、その後redisの主ノードに直接アクセスし、毎回sentinelエージェントを通じてredisの主ノードにアクセスすることはなく、redisの主ノードが変化すると、哨兵は最初に感知し、新しいredisの主ノードをclient端に通知する(この中でredisのclient端は一般的に購読機能を実現し、sentinelが発表したノード変動メッセージを購読する)
    哨兵アーキテクチャ構築手順
    1、redis関連構成の変更(sentinel.conf)
    port 26379  #    
    daemonize yes  #     
    pidfile "/var/run/redis‐sentinel‐26379.pid"  #   id  
    logfile "26379.log" #     
    dir "/usr/local/redis‐5.0.3/data" #       
    # sentinel monitor      # quorum     ,       sentinel    master   (    :sentinel  /2 + 1),master      
    sentinel monitor mymaster(           ) xxx.xxx.xx.xx(      ip) 6379(      ) 2
    

    2、sentinel哨兵の起動例
    src/redis‐sentinel sentinel.conf(            )
    

    3、sentinelのinfo情報を表示する
    src/redis‐cli ‐p 26379
    127.0.0.1:26379>info
        Sentinel info       redis   
    

    4、複数の歩哨を配置し、この手順に従えばよい
    Jedisは哨兵をつなぐ
    1.jedisの依存パッケージのインポート
    <dependency>
    	<groupId>redis.clients</groupId>
    	<artifactId>jedis</artifactId>
    	<version>2.9.0</version>
    </dependency>
    

    2、jedis接続コード
    import redis.clients.jedis.HostAndPort;
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPoolConfig;
    import redis.clients.jedis.JedisSentinelPool;
    
    import java.util.HashSet;
    import java.util.Set;
    
    /**
     * @auther jedis    
     * @create xxxx/xx/xx
     */
    
    public class JedisSentine {
    
        public static void main(String[] args) {
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxTotal(20); //     ,   8 
            config.setMaxIdle(10); //       ,   8 
            config.setMinIdle(5); //       ,   0
    
            //              
            String masterName = "mymaster";
            //        (             )
            Set<String> sentinels = new HashSet<String>();
            sentinels.add(new HostAndPort("xxx.xxx.xx.xx",26379).toString());
            //             :
    //        sentinels.add(new HostAndPort("xxx.xxx.xx.xx",26380).toString());
    //        sentinels.add(new HostAndPort("xxx.xxx.xx.xx",26381).toString());
    
             /**
              * JedisSentinelPool     JedisPool  ,   redis         
              * JedisSentinelPool     sentinel      ,    sentinel  redis           
              *
              * masterName : redis            
              * sentinels :        
              * config : poolConfig  
              * timeout(3000) :       
              * password(null) :     (  redis          null)
             **/
            JedisSentinelPool jedisSentinelPool = new JedisSentinelPool(masterName, sentinels,config, 3000, null);
    
            Jedis jedis = null;
            try {
                jedis = jedisSentinelPool.getResource();
                jedis.set("sentine","ok");
                jedis.get("sentine");
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                //          , JedisPool   ,Jedis        。
                if (null != jedis){
                    jedis.close();
                }
            }
        }
    }
    

    Springboot統合redis接続哨兵
    1、依存パッケージのインポート
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
    </dependency>
    

    2、application.yml構成
    server:
      port: 8080
    
    spring:
      redis:
        database: 0
        redis.timeout: 3000
        lettuce:
          pool:
            max-idle: 50 #           
            min-idle: 10 #           
            max-active: 100 #        (          )
            pool.max-wait: 1000 #           (          )
        sentinel:
          master: mymaster #           
          nodes: xxx.xxx.xx.xx:26379,xxx.xxx.xx.xx:26380,xxx.xxx.xx.xx:26381 #        
    

    3、StringRedisTemplate接続歩哨
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @auther SentineConn
     * @create xxxx/xx/xx
     */
    @RestController
    public class SentineConn {
    
        @Autowired
        StringRedisTemplate stringRedisTemplate;
    
        /**
         *                master  ,           
         *     master     ,          ,                  ,
         *        master       ,          master   ,         maste
         */
        @RequestMapping("sentine_conn")
        public void mastConn(){
            stringRedisTemplate.opsForValue().set("sentine","ok");
            stringRedisTemplate.opsForValue().get("sentine");
        }
    }