您的位置:首页 > 数据库 > Redis

Redis主从复制和主从切换

2016-06-30 18:41 525 查看

Redis主从复制和主从切换

参考:

+ Redis Sentinel机制与用法(一)

+ Redis主从复制和主从切换

摘要

Redis的主从复制功能可以实现读写分离,一个主可以挂载多个从.从服务器只能实现读不可写.当主服务器挂掉之后,无法切换到从服务器写. 通过Redis的Sentinel可以实现主从切换:当主服务器挂掉之后,自动将其中一个从服务器升级为主服务器

一:配置主从复制

当前的机器分布

redis1:192.168.25.128
redis2:192.168.25.129


期望实现结果:在redis1中set的值可以在redis2中取出

配置:

在redis2的reids配置文件中加入
slaveof 192.168.25.128 6379
重启redis即可。


注意:redis.conf中的bind 127.0.0.1最好注释掉,否则可能在别的电脑上通过ip访问不到

测试结果:redis1中改变 redis2中也改变了

[root@bogon etc]# redis-cli -h 192.168.25.128
192.168.25.128:6379> get name
"xiaoguo"
192.168.25.128:6379> set name xiaowang
OK
192.168.25.128:6379>

[root@bogon etc]# redis-cli -h 192.168.25.129
192.168.25.129:6379> get name
"xiaowang"
192.168.25.129:6379>


二:配置自动切换

我的redis的目录结构

redis/
bin  dump.rdb  etc  redis.log  temp-1467161779.33597.rdb  temp-1467278541.2161.rdb
配置文件在etc中,执行脚本在bin中


在etc中添加sentinel.conf文件,文件内容如下(配置详细讲解见博客顶部参考的文章)

sentinel monitor mymaster 192.168.25.128 6379 1
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1


保存后,执行redis-sentinel sentinel.conf &(如果不加&则不是后台运行)

通过以上配置就可以自动切换了

以上配置我在192.168.25.129中也配置了一份,放哪股指sentinel的单点故障

三:项目中的测试

我的项目是maven springmvc配置如下

<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>

<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="30" />
<property name="maxIdle" value="200" />
<property name="maxWaitMillis" value="3000" />
<property name="testOnBorrow" value="true"/>
</bean>
<!-- spring data redis -->
<bean id="jedisConnectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="poolConfig" >
<ref bean="jedisPoolConfig"/>
</property>
<constructor-arg name="sentinelConfig" ref="redisSentinelConfiguration"/>
<property name="timeout" value="100000"/>
</bean>

<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="192.168.25.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.25.129"></constructor-arg>
<constructor-arg name="port" value="26379"></constructor-arg>
</bean>
</set>
</property>
</bean>

<!-- Redis Template -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory" />

</bean>


pom文件(请自行增删):

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>com.favccxx.favsoft</groupId>
<artifactId>favspringmvcrestful</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>favspringmvcrestful Maven Webapp</name>
<url>http://maven.apache.org</url>

<properties>
<spring.version>4.1.1.RELEASE</spring.version>
</properties>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</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-tx</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
&
4000
lt;/dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</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>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.5.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>
<build>
<finalName>favspringmvcrestful</finalName>
</build>
</project>


HelloWordController:

package com.xiaoli.nginx.controller;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* Created by xiaoli on 2016/6/30.
*/
@Controller
public class HelloWordController {
@Resource
private RedisTemplate<String, Object> redisTemplate;

@RequestMapping("/")
public String sayHello(HttpServletRequest request, HttpServletResponse response, Model model) {
//        redisTemplate.opsForValue().set("name","xiaoguo");
String value = (String) redisTemplate.opsForValue().get("name");
model.addAttribute("name", value);
return "hello";
}
}


hello.jsp:

<%--
Created by IntelliJ IDEA.
User: xiaoli
Date: 2016/6/30
Time: 16:08
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
hello,i'm ${name}
</body>
</html>


启动项目:杀掉redis1 刷新界面 已让可以访问,redis2顶上去了,如果你去看redis2,你会发现方才你添加的 slaveof 192.168.25.128 6379不见了,没错,他变成了主了,哥们!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息