剑指架构师系列-Redis集群部署
初步搭建Redis集群
克隆已经安装Redis的虚拟机,我们使用这两个虚拟机中的Redis来搭建集群。
master:192.168.2.129 端口:7001 slave:192.168.2.132 端口:7002 sentinel:192.168.2.129 端口:26379
来说一下这个sentinel,sentinel是一个管理redis实例的工具,它可以实现对redis的监控、通知、自动故障转移。sentinel不断的检测redis实例是否可以正常工作,通过API向其他程序报告redis的状态,如果redis master不能工作,则会自动启动故障转移进程,将其中的一个slave提升为master,其他的slave重新设置新的master服务器。
来配置一下sentinel.conf,内容如下:
port 26379 daemonize yes logfile "/var/log/redis/sentinel.log" sentinel monitor master1 192.168.1.129 7001 1 sentinel down-after-milliseconds master1 1000 sentinel failover-timeout master1 5000
做为master的redis不需要修改redis.conf配置,但需要修改一下slave的redis配置,将端口修改为7002,并且添加如下的配置:
slaveof 192.168.1.129 7001
执行如下的命令所在的目录为:redis-stable/src
./redis-server ../redis.conf // 启动master与slave ./redis-sentinel ../sentinel.conf // 启动sentinel
使用客户端来查看:
./redis-cli -p 26379 -h 192.168.2.129
内容如下图:

2、Spring Session Date Redis访问Redis Sentinel
使用上次新建的模块mazhi-redis进行测试。pom.xml文件不需要改变。但是redis.properties的配置需要改变,如下:
spring.redis.database=0 spring.redis.host=192.168.2.129 # Login password of the redis server. spring.redis.password= spring.redis.pool.max-active=8 spring.redis.pool.max-idle=8 spring.redis.pool.max-wait=-1 spring.redis.pool.min-idle=0 spring.redis.port=7001 # Name of Redis server. spring.redis.sentinel.master=master1 # Comma-separated list of host:port pairs. spring.redis.sentinel.nodes=192.168.2.129:26379 spring.redis.timeout=0
注意必须是redis.properties这个名称,而且必须要放到src/main/resources目录下,这是一种约定。
spring.redis.sentinel.master必须与sentinel.conf文件中指定的值一致,如下:
sentinel monitor master1 192.168.1.129 7001 1
spring.redis.sentinel.nodes值为sentinel的ip:端口,可以有多个。
在org.mazhi.redis.config目录下新建RedisSentinalConfig.java文件,内容如下:
@Configuration
@PropertySource(value = "classpath:/redis.properties")
@EnableCaching
public class RedisSentinalConfig extends CachingConfigurerSupport{
@Bean
public KeyGenerator wiselyKeyGenerator(){ // 配置key的生成规则
return new KeyGenerator() {
public Object generate(Object target, Method method, Object... params) {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
}
};
}
@Bean
public CacheManager cacheManager(@SuppressWarnings("rawtypes") RedisTemplate redisTemplate) {
return new RedisCacheManager(redisTemplate);
}
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
StringRedisTemplate template = new StringRedisTemplate(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
新建一个User的实体对象,如下:
package org.mazhi.redis.bean;
public class User {
private Long id;
private String name;
private String address;
public User(Long id,String name, String address) {
this.id = id ;
this.name = name;
this.address = address;
}
public User() {
}
...
}
在org.mazhi.redis.service目录下新建DemoService.java文件,内容如下:
@Service
public class DemoService {
@Cacheable(value = "usercache",keyGenerator = "wiselyKeyGenerator")
public User findUser(Long id,String firstName,String lastName){
System.out.println("======当Redis中不存在这条数据时会执行这里=========");
return new User(id,firstName,lastName);
}
}
在org.mazhi.redis.web目录下新建RedisSentinelController.java文件,内容如下:
@Autowired
DemoService demoService;
@RequestMapping("/addToRedis")
@ResponseBody
public void putCache() {
demoService.findUser(1l, "mazhi", "ordos");
System.out.println("添加成功!");
}
@RequestMapping("/findFromRedis")
@ResponseBody
public void testCache() {
User user = demoService.findUser(1l, "mazhi", "ordos");
System.out.println("user:" + "/" + user.getName() + "/" + user.getAddress());
}
}
启动Spring Boot后,在浏览器中输入如下地址:
http://localhost:8081/redis-sentinel/addToRedis
Eclipse的控制台打印如下信息:
======当Redis中不存在这条数据时会执行这里========= 添加成功! 添加成功!
接着输入如下地址进行访问:
http://localhost:8081/redis-sentinel/getFromRedis
打印结果如下:
user:/mazhi/ordos user:/mazhi/ordos
来看一下Redis的数据库,如下图所示。

看Key的生成形式,这就是调用我们在RedisSentinalConfig.java文件中指定的方法wiselyKeyGenerator()生成的。
看一下192.168.2.132上的redis,可以看到两个Redis的信息是同步的。
使用如下的命令来封闭192.168.2.129上的7001端口到达任何地方的路由,即人为造成了一次master服务的“宕机”。
/sbin/iptables -I INPUT -p tcp --dport 7001 -j DROP
Eclipse的控制台输出如下信息:
2016-04-01 09:02:35.188 INFO 6980 --- [ Thread-2] redis.clients.jedis.JedisSentinelPool : Created JedisPool to master at 192.168.2.132:7002
master变为了192.168.2.132机器。或者我们可以在sentinel客户端查看,如下:

address已经变成了192.168.2.132了。
恢复192.168.2.129上的7001端口,输入如下的命令:
/sbin/iptables -I INPUT -p tcp --dport 7001 -j ACCEPT
在192.168.2.129上输入如下命令查看:
./redis-cli -h 192.168.2.129 -p 7001
可以看到如下信息:

角色由以前的master变为slave了,而现在的master是192.168.2.132主机。
剑指架构师系列-Redis集群部署的更多相关文章
- 剑指架构师系列-Redis安装与使用
1.安装Redis 我们在VMware中安装CentOS 64位系统后,在用户目录下下载安装Redis. 下载redis目前最稳定版本也是功能最完善,集群支持最好并加入了sentinel(哨兵-高可用 ...
- 剑指架构师系列-Hibernate需要掌握的Annotation
1.一对多的关系配置 @Entity @Table(name = "t_order") public class Order { @Id @GeneratedValue priva ...
- 剑指架构师系列-MySQL调优
介绍MySQL的调优手段,主要包括慢日志查询分析与Explain查询分析SQL执行计划 1.MySQL优化 1.慢日志查询分析 首先需要对慢日志进行一些设置,如下: SHOW VARIABLES LI ...
- 剑指架构师系列-Logstash分布式系统的日志监控
Logstash主要做由三部署组成: Collect:数据输入 Enrich:数据加工,如过滤,改写等 Transport:数据输出 下面来安装一下: wget https://download.el ...
- 剑指架构师系列-spring boot的logback日志记录
Spring Boot集成了Logback日志系统. Logback的核心对象主要有3个:Logger.Appender.Layout 1.Logback Logger:日志的记录器 主要用于存放日志 ...
- 剑指架构师系列-持续集成之Maven+Nexus+Jenkins+git+Spring boot
1.Nexus与Maven 先说一下这个Maven是什么呢?大家都知道,Java社区发展的非常强大,封装各种功能的Jar包满天飞,那么如何才能方便的引入我们项目,为我所用呢?答案就是Maven,只需要 ...
- 剑指架构师系列-tomcat6通过IO复用实现connector
由于tomcat6的配置文件如下: <Connector port="80" protocol="org.apache.coyote.http11.Http11Ni ...
- 剑指架构师系列-Struts2构造函数的循环依赖注入
Struts2可以完成构造函数的循环依赖注入,来看看Struts2的大师们是怎么做到的吧! 首先定义IBlood与BloodImpl类: public interface IBlood { } pub ...
- 剑指架构师系列-tomcat6通过伪异步实现connector
首先在StandardService中start接收请求的线程,如下: synchronized (connectors) { for (int i = 0; i < connectors.le ...
随机推荐
- Python学习之输入输出、数据类型
#coding=utf-8 # 输入 print'100+200=',100+200 # 输入 # name = raw_input('tell me your name:') # print'hel ...
- idea的spring boot项目,运行时不要显示在dashboard中
将对应项目的上图配置,取消勾选即可.
- css常见属性
css常见属性 1.颜色属性 1.1 color属性定义文本的颜色 1.2 color:green 1.3 color:#ff6600 可简写为#f60 1.4 color:rgb(255,255,2 ...
- html标记语言 --图像标记
html标记语言 --图像标记 三.图像标记 1.使用方法 <img src="路径/文件名.格式" width="属性值" height="属 ...
- C#之不安全代码
MSDN:"尽管实际上对 C 或 C++ 中的每种指针类型构造,C# 都设置了与之对应的引用类型,但仍然会有一些场合需要访问指针类型.例如,当需要与基础操作系统进行交互.访问内存映射设备,或 ...
- 创建类似于Oracle中decode的函数
-- 创建类似于Oracle中decode的函数create or replace function decode(variadic p_decode_list text[])returns text ...
- springMvc配置xml使ResponseBody返回Json
@ResponseBody 在返回的数据不是html标签的页面,而是其他某种格式的数据时(如json.xml等)使用: 不在springMvc中配置json的处理的话,我们通常会在Controller ...
- 解决将/etc/passwd文件中1000改为0后只能guest进入系统的问题 ||ubuntu下将普通用户权限升级为root用户权限的方法;
其实我现在才知道linux系统对于用户权限管理比较严,在ubuntu下系统不允许root权限的用户进入图像界面系统.由于之前没弄过权限这个东西瞬间掉坑了了. 我是想修改一下root下的nginx.co ...
- [ZJOI2010]基站选址
题目描述 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为Ci.如果在距离第i个村庄不超过Si的范 ...
- 51 nod 1421 最大MOD值
1421 最大MOD值 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 有一个a数组,里面有n个整数.现在要从中找到两个数字(可以 ...