Redis単機構築主従(1)

20862 ワード

Redisスタンドアロンマスタースイッチ導入説明
準備作業
  • redis.ioダウンロード導入パッケージeg:redis-3.2.8.tar.gz
  • 新規マスターディレクトリ
  • mkdir -p /usr/local/redis/master/
    mkdir -p /usr/local/redis/slave/
  • は、それぞれ2つのディレクトリの下にredis
  • をインストールする.
    tar –zxf redis-3.2.8.tar.gz
    cd redis-3.2.8
    make **#  **
    make test    **#        **
  • ==問題が発生する可能性があります:gccまたはtclコンポーネントが不足し、コマンドyum install gccまたはyum install tcl==
  • を使用します.
    構成パラメータの変更
    マスター_の変更redis構成
    cd /usr/local/redis/master/redis-3.2.8/
    vi redis.conf
    bind 127.0.0.1  ----> bind   IP(    )
    daemonize no   ----> daemonize yes(       ,      ,    )
    protected-mode yes ---> protected-mode no(      ,        )

    slave_の変更redis構成
    cd /usr/local/redis/slave/redis-3.2.8/
    vi redis.conf
    bind 127.0.0.1  ----> bind   IP(    )
    daemonize no   ----> daemonize yes(       ,      ,    )
    protected-mode yes ---> protected-mode no(      ,        )
    port 6379  ---> port 6380(    )
    slaveof master_redis    IP 6379
    pidfile /var/run/redis_ 6379.pid ----> pidfile /var/run/redis_ 6380.pid

    redisがデーモン方式で実行する場合、システムはデフォルトでpidを/var/run/redisに書き込む.pid、pidfileでpidファイルを指定できます
    起動master_redisとslave_redisとクライアント接続の使用
    cd /usr/local/redis/master/redis-3.2.8/src/
    ./redis-server  /usr/local/redis/master/redis-3.2.8/redis.conf(      )
    ./redis-cli -h IP -p 6379 (     master_redis)
    cd /usr/local/redis/slave/redis-3.2.8/src/
    ./redis-server  /usr/local/redis/slave/redis-3.2.8/redis.conf`(      )
    ./redis-cli -h IP -p 6380` (     slave_redis)

    infoコマンドを使用してredisマスター情報を表示する
  • master_redisクライアント接続の下で実行:
  • 172.20.1.47:6379> info replication
    # Replication
    role:master
    connected_slaves:1
    slave0:ip=172.20.1.47,port=6380,state=online,offset=38335325,lag=0
    master_repl_offset:38335461
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:37286886
    repl_backlog_histlen:1048576
  • slave_redisクライアント接続の下で実行:
  • 172.20.1.47:6380> info replication
    # Replicatio
    role:slave
    master_host:172.20.1.47
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:0
    master_sync_in_progress:0
    slave_repl_offset:38343419
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_repl_offset:0
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0

    テストマスターコピー、読み書き分離
  • master_redisクライアント接続の下で実行:set name zhangsan
  • master_redisクライアント接続で実行:get name結果:zhangsan
  • slave_redisクライアント接続で実行:get name結果:zhangsan
  • slave_redisクライアント接続の下で実行:set name lisi(error)READONLY You can`t write against a read only slave.(slave_redis読み取り専用)
  • マスター・スレーブ・スイッチの構成
    準備するconfプロファイル
    #    ,    ,     session
    daemonize yes  
    
    #      ,         
    protected-mode no   
    
    #sentinel     26379
    port  
    
    #      redis  IP    ,      slave
    #sentinel monitor    
    #  sentinel      ip:port   master,quorum     ,       sentinel    master   ,master               
    sentinel monitor master1 IP 6379 1
    
    #master   sentinel     “  ”     .
    #sentinel down-after-milliseconds    
    #    sentinel master      (       ,     ),                  ,    sentinel   master    
    sentinel down-after-milliseconds master1 5000
    
    # failover(    )   ,             failover  ,  sentinel      failover  
    sentinel failover-timeout master1 15000
    
    #  master   ,      slaveof  master   “SYNC”(  ) slave  。(       1)
    # salve  salveof    ,         。    ,   “  ”               .
    #    ,   “  ”       ,  salve                .
    sentinel parallel-syncs master1 1

    マスター・スレーブ・スイッチの構成
  • kill現在のすべてのredisプロセス
  • を削除
    ps -ef | grep redis
    kill -9 pid
    rm -f /usr/local/redis/master/redis-3.2.8/sentinel.conf 
    rm -f /usr/local/redis/slave/redis-3.2.8/sentinel.conf 
  • 準備するsentinel.confは、削除するばかりの2つのconfファイルを置換する対応するディレクトリの下にそれぞれ配置される
  • .
    cd /usr/local/redis/slave/redis-3.2.8/ 
    vi sentinel.conf     port 26379 ---> port 26380
  • 再起動マスタスレーブredis
  • cd /usr/local/redis/master/redis-3.2.8/src/ 
    ./redis-server /usr/local/redis/master/redis-3.2.8/redis.conf 
    cd /usr/local/redis/slave/redis-3.2.8/src/ 
    ./redis-server /usr/local/redis/slave/redis-3.2.8/redis.conf 
  • 主従redisのsentinel(哨兵)
  • を起動
    cd /usr/local/redis/master/redis-3.2.8/src/ 
    ./redis-sentinel /usr/local/redis/master/redis-3.2.8/sentinel.conf
    cd /usr/local/redis/slave/redis-3.2.8/src/
    ./redis-sentinel /usr/local/redis/slave/redis-3.2.8/sentienl.conf
    ps -ef | grep redis  #         (redis   +     )

    クライアントを使用して哨兵監視状況を表示
  • クライアントを使用して2つのsentinel
  • に接続
    cd /usr/local/redis/master/redis-3.2.8/src/
    ./redis-cli -h IP 26379
    cd /usr/local/redis/slave/redis-3.2.8/src/
    ./redis-cli -h IP 26380
       `info sentinel `        ,  name=master1,status=ok,address=IP:6379(        master_redis)

    試験主従自動切替(具体的な操作は上のコマンドを参照)
  • kill落としmaster_redisサービス
  • クライアントを使用してslave_に接続redis
  • info replicationを使用してslave_を表示redis接続情報、発見、slave_redisはmasterにアップグレードされましたredis
  • クライアントを使用してsentinelに再接続し、info sentinelコマンドを使用して2つの哨兵監視情報を表示すると、監視アドレスがaddress=IP:6380
  • になったことがわかります.
  • killが落ちたmasterを再起動redisサービス、起動後のクライアント接続、info replicationコマンドを使用して表示すると、role:slave(再起動後に自動的にslave_redisになる)
  • が表示されます.
    Javaコード実装redis主従
    public class JedisUtil {
    
         private final static String REDIS_HOST = "172.20.1.47";
         private final static Integer REDIS_PORT = 6379;
         private final static Integer REDIS_MaxActive = 200;
         private final static Integer REDIS_MaxIdle = 1000;
         private final static Integer REDIS_MaxWait = 512;
         private final static Integer REDIS_ConnTimeout = 2000;
         private final static Integer REDIS_RetryNum = 3;
         private final static String SENTINEL_HOST_1 = "172.20.1.47:26381";
         private final static String SENTINEL_HOST_2 = "172.20.1.47:26380";
         private final static String CLUSTER_NAME = "master1";
    
        /**
         *      .
         */
        private JedisUtil() {
    
        }
    
        private static Map maps = new HashMap();
    
        /**
         *      .
         * 
         * @return      
         */
        private static JedisSentinelPool getPool() {
            String key = REDIS_HOST + ":" + REDIS_PORT;
            Set sentinels = new HashSet();
            String hostAndPort1 = SENTINEL_HOST_1;
            String hostAndPort2 = SENTINEL_HOST_2;
            sentinels.add(hostAndPort1);
            sentinels.add(hostAndPort2);
            String clusterName = CLUSTER_NAME;
    
            JedisSentinelPool redisSentinelJedisPool = null;
            if (!maps.containsKey(key)) {
                JedisPoolConfig config = new JedisPoolConfig();
                config.setMaxTotal(REDIS_MaxActive);
                config.setMaxIdle(REDIS_MaxIdle);
                config.setMaxWaitMillis(REDIS_MaxWait);
                config.setTestOnBorrow(true);
                config.setTestOnReturn(true);
                try {
                    /**
                     *       java.net.SocketTimeoutException: Read timed out exception            JedisPool           . JedisPool        2 (    )
                     */
                    redisSentinelJedisPool = new JedisSentinelPool(clusterName, sentinels, config, REDIS_ConnTimeout);
    
                    maps.put(key, redisSentinelJedisPool);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
                redisSentinelJedisPool = maps.get(key);
            }
            return redisSentinelJedisPool;
        }
    
        /**
         *       ,            ,                     ,             ,         。
         */
        private static class RedisUtilHolder {
            /**
             *       , JVM       
             */
            private static JedisUtil instance = new JedisUtil();
        }
    
        /**
         *  getInstance           ,       RedisUtilHolder.instance,  RedisUtilHolder      ;               ,       
         *   ,    RedisUtil   ,       ,                   ,               。          ,getInstance        ,            ,                  。
         */
        public static JedisUtil getInstance() {
            return RedisUtilHolder.instance;
        }
    
        /**
         *   Redis  .
         * 
         * @return Redis     
         */
        public Jedis getJedis() {
            Jedis jedis = null;
            int count = 0;
            do {
                try {
                    jedis = getPool().getResource();
                } catch (Exception e) {
                    e.printStackTrace();
                    //     
                    if (jedis != null) {
    
                        jedis.close();
                    }
                }
                count++;
            } while (jedis == null && count < REDIS_RetryNum);
            return jedis;
        }
    
        /**
         *   redis      .
         * 
         * @param jedis redis  
         */
        public void closeJedis(Jedis jedis) {
            if (jedis != null) {
                jedis.close();
            }
        }
    
    }