Redis主從復制和主從切換

jopen 9年前發布 | 17K 次閱讀 Redis NoSQL數據庫

Redis的主從復制功能可以實現讀寫分離,一個主可以掛載多個從.從服務器只能實現讀不可寫.當主服務器掛掉之后,無法切換到從服務器寫.通過Redis的Sentinel可以實現主從切換:當主服務器掛掉之后,自動將其中一個從服務器升級為主服務器


  1. 配置主從復制

    1. 建立從文件夾,譬如 /usr/local/slaves/下建立 6380 6381 兩個文件夾(兩個從服務器)

    2. 復制redis.conf到剛建立的兩個文件夾中

    3. 修改redis.conf 中的

      1. port 6380

      2. slaveof 127.0.0.1 6379  ------ip表示主服務器的ip  端口表示主服務器端口

      3. 保存退出,另一個從服務器做同樣修改,如果端口不是6380,修改斷開即可,此處修改為6381

    4. 啟動主服務器 redis-server redis.conf

    5. 進入從服務器文件夾,啟動從服務器

    6. 查看主服務器信息:redis-cli -p 6379 info Replication,可以看到有兩個從服務器

    7. redis-cli -p 6379 進去主服務器,存儲數據 set key val

    8. 進入從服務器,redis-cli -p 6380 查看數據 get key  查看是否能取出數據

  2. 配置主從切換

    1. 新建文件 sentinel.conf

    2. 編輯文件

    3. ####master  sentinel.conf
      ##sentinel實例之間的通訊端口
      port 26379
      ####sentinel需要監控的master信息:<mastername> <masterIP> <masterPort> <quorum>.
      ####<quorum>應該小于集群中slave的個數,只有當至少<quorum>個sentinel實例提交"master失效" 才會認為master為ODWON("客觀"失效) .
      sentinel monitor mymaster 127.0.0.1 6381 1
      sentinel down-after-milliseconds mymaster 1000
      sentinel failover-timeout mymaster 180000
      sentinel parallel-syncs mymaster 1
    4. 其他兩個文件只需要修改端口即可

    5. 啟動redis-sentinel sentinel.conf &

  3. 通過java讀寫主從服務器

    1. 需要添加Spring配置和其他兩個jar包

    2. <properties>
          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
          <springVersion>3.2.9.RELEASE</springVersion>
      </properties>
      
      <dependencies>
          <dependency>
              <groupId>org.apache.commons</groupId>
              <artifactId>commons-pool2</artifactId>
              <version>2.4.2</version>
          </dependency>
      
      
          <dependency>
              <groupId>org.springframework.data</groupId>
              <artifactId>spring-data-redis</artifactId>
              <version>1.6.0.RELEASE</version>
          </dependency>
      
          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-context</artifactId>
              <version>${springVersion}</version>
          </dependency>
          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-tx</artifactId>
              <version>${springVersion}</version>
          </dependency>
          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-context-support</artifactId>
              <version>${springVersion}</version>
          </dependency>
          <dependency>
              <groupId>cglib</groupId>
              <artifactId>cglib-nodep</artifactId>
              <version>3.1</version>
          </dependency>
      
      
          <dependency>
              <groupId>org.apache.commons</groupId>
              <artifactId>commons-lang3</artifactId>
              <version>3.1</version>
          </dependency>
          <dependency>
              <groupId>com.alibaba</groupId>
              <artifactId>fastjson</artifactId>
              <version>1.2.5</version>
          </dependency>
          <dependency>
              <groupId>org.aspectj</groupId>
              <artifactId>aspectjweaver</artifactId>
              <version>1.8.2</version>
          </dependency>
      
          <dependency>
              <groupId>junit</groupId>
              <artifactId>junit</artifactId>
              <version>4.8</version>
              <scope>test</scope>
          </dependency>
          <dependency>
              <groupId>net.sf.ehcache</groupId>
              <artifactId>ehcache</artifactId>
              <version>2.7.5</version>
          </dependency>
          <dependency>
              <groupId>org.slf4j</groupId>
              <artifactId>slf4j-api</artifactId>
              <version>1.6.6</version>
          </dependency>
          <dependency>
              <groupId>redis.clients</groupId>
              <artifactId>jedis</artifactId>
              <version>2.4.2</version>
          </dependency>
          <dependency>
              <groupId>commons-pool</groupId>
              <artifactId>commons-pool</artifactId>
              <version>1.6</version>
          </dependency>
          <dependency>
              <groupId>commons-logging</groupId>
              <artifactId>commons-logging</artifactId>
              <version>1.1.1</version>
          </dependency>
          <dependency>
              <groupId>org.slf4j</groupId>
              <artifactId>slf4j-log4j12</artifactId>
              <version>1.7.10</version>
              <scope>test</scope>
          </dependency>
      </dependencies>
    3. Spring配置

      1. <bean id="redisSentinelConfiguration" class="org.springframework.data.redis.connection.RedisSentinelConfiguration">
            <property name="master">
                <bean class="org.springframework.data.redis.connection.RedisNode">
                    <property name="name" value="mymaster"/>
                </bean>
            </property>
            <property name="sentinels">
                <set>
                    <bean class="org.springframework.data.redis.connection.RedisNode">
                        <constructor-arg name="host" value="127.0.0.1"></constructor-arg>
        
                        <constructor-arg name="port" value="26479"></constructor-arg>
                    </bean>
                    <bean class="org.springframework.data.redis.connection.RedisNode">
                        <constructor-arg name="host" value="127.0.0.1"></constructor-arg>
        
                        <constructor-arg name="port" value="26579"></constructor-arg>
                    </bean>
                </set>
            </property>
        </bean>
        
        <bean id="jeidsConnectionFactory"
        
              class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        
            <constructor-arg ref="redisSentinelConfiguration"/>
        
        </bean>
        
        
        <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
            <property name="connectionFactory" ref="jeidsConnectionFactory"/>
        </bean>
    4. java測試

      1. import org.junit.Before;
        import org.junit.Test;
        import org.springframework.context.ApplicationContext;
        import org.springframework.context.support.ClassPathXmlApplicationContext;
        import org.springframework.dao.DataAccessException;
        import org.springframework.data.redis.connection.RedisConnection;
        import org.springframework.data.redis.core.RedisCallback;
        import org.springframework.data.redis.core.RedisTemplate;
        
        /**
         * Created by vincent on 15-10-13.
         */
        public class CommonTest {
        
            private ApplicationContext context ;
        
            private RedisTemplate redisTemplate;
            final String key ="key7";
        
            @Before
            public void init(){
                context = new ClassPathXmlApplicationContext("applicationContext.xml");
                redisTemplate= context.getBean("redisTemplate",RedisTemplate.class);
            }
        
            @Test
            public void test1(){
                redisTemplate.execute(new RedisCallback() {
                    @Override
                    public Long doInRedis(RedisConnection redisConnection) throws DataAccessException {
                         redisConnection.set(key.getBytes(),(System.currentTimeMillis()+"").getBytes());
                        return 1L;
                    }
                });
            }
        
            @Test
            public void  test2(){
                Object execute = redisTemplate.execute(new RedisCallback() {
                    @Override
                    public Object doInRedis(RedisConnection redisConnection) throws DataAccessException {
                        return redisConnection.get(key.getBytes());
                    }
                });
        
                System.out.println(new String((byte[])execute));
        
            }
        }


參考文檔:

    http://redis.readthedocs.org/en/latest/topic/sentinel.html



來自:http://my.oschina.net/vincentzhao/blog/516245

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!