spring集成redis——主从配置以及哨兵监控
Redis主从模式配置:
Redis的主从模式配置是非常简单的,首先我们需要有2个可运行的redis环境:
master node : 192.168.56.101 8887
slave node: 192.168.56.102 7777
我们只要在slave 节点的配置文件中,找到 slaveof开头
然后修改为:(master的ip与端口)
slaveof 192.168.56.101
这样就可以了,下面我们来验证一下,首先启用master和slave的redis服务,然后登录redis-cli,输入info
然后看下192.168.56.101:8887的信息,红色的地方,表示当前节点为master节点,有几个从节点和从节点的信息
192.168.56.101:8887> info
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.56.102,port=7777,state=online,offset=568,lag=1
master_repl_offset:
repl_backlog_active:
repl_backlog_size:
repl_backlog_first_byte_offset:
repl_backlog_histlen:
在看192.168.56.102:7777的信息
192.168.56.102:7777> info
# Replication
role:slave
master_host:192.168.56.101
master_port:8887
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_repl_offset:
slave_priority:
slave_read_only:
connected_slaves:
master_repl_offset:
repl_backlog_active:
repl_backlog_size:
repl_backlog_first_byte_offset:
repl_backlog_histlen:
在master,创建一个key-value:
192.168.56.101:> set aa aa
OK
在slave节点
192.168.56.102:> get aa
"aa"
因为默认的设置从节点是不能写只能读的,所以如果要在从节点写东西是报错的,如下:
192.168.56.102:> set aa 2a
(error) READONLY You can't write against a read only slave.
这样一来主从模式就好了,如果要有多个从节点,只要改变他们的slaveof的配置就行了。
当然如果只这样配置,在生产上面是没有多大用处的,因为如果无论master节点还是slave节点挂了,我们都要手动启动来让他继续恢复工作,那么能不能让他自动恢复呢?比如master挂掉了,在slave节点中选一个节点自动更换成master。根据这个需求,redis在2.4之后出现了sentinel,其目的就是监控主从节点的健壮性,然后自动选举master节点下面就来看看如何配置sentinel。
Redis 的 Sentinel配置
一、Sentinel介绍
Sentinel是Redis的高可用性(HA)解决方案,由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进行下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。Redis提供的sentinel(哨兵)机制,通过sentinel模式启动redis后,自动监控master/slave的运行状态,基本原理是:心跳机制+投票裁决
- 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
- 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
- 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器
二、Sentinel的主从原理


三、Redis Sentinel配置
这里采用了一个master 一个slave 一个sentinel
master 的redis.conf配置,找到下面的并修改:
port
bind 192.168.56.101
slave 的redis.conf配置,找到下面的并修改,如果master节点设置了密码,下面红色部分要加上
port
bind 192.168.56.102
slaveof 192.168.56.101 8887
masterauth master的密码
sentinel的sentinel.conf 配置
port
protected-mode yes
bind 192.168.56.101
dir /tmp
sentinel monitor mymaster 192.168.56.101
sentinel down-after-milliseconds mymaster
sentinel parallel-syncs mymaster
sentinel failover-timeout mymaster
tips:
如果停掉master 后,sentinel 显示足够数量的 sdown 后,没有出现odown或try-failover,则检查密码等配置是否正确
如果停掉master后,试图切换的时候出现 failover-abort-not-elected
1)如果redis实例没有配置
protected-mode yes
bind 192.168.56.101
则在sentinel 配置文件加上
protected-mode no
2)如果redis实例有配置
protected-mode yes
bind 192.168.56.101
则在sentinel 配置文件加上
protected-mode yes
bind 192.168.56.101
上面的配置都弄好之后,分别启动master、slave、sentinel(前面2个是redis-service 启动,后面是redis-sentinel)服务,然后我们可以redis-cli查看对于的info信息(跟上面主从操作是一样的)
master节点
[root@localhost ]# ./redis-cli -h 192.168.56.101 -p
192.168.56.101:> info
……
# Replication
role:master
connected_slaves:
slave0:ip=192.168.56.102,port=,state=online,offset=,lag=
master_repl_offset:
repl_backlog_active:
repl_backlog_size:
repl_backlog_first_byte_offset:
repl_backlog_histlen:
……
slave节点
[root@localhost ]# ./redis-cli -h 192.168.56.102 -p
192.168.56.102:> info
……
# Replication
role:slave
master_host:192.168.56.101
master_port:
master_link_status:up
master_last_io_seconds_ago:
master_sync_in_progress:
slave_repl_offset:
slave_priority:
slave_read_only:
connected_slaves:
master_repl_offset:
repl_backlog_active:
repl_backlog_size:
repl_backlog_first_byte_offset:
repl_backlog_histlen:
……
sentinel节点信息
[root@localhost ]# ./redis-cli -h 192.168.56.101 -p
192.168.56.101:> info
……
# Sentinel
sentinel_masters:
sentinel_tilt:
sentinel_running_scripts:
sentinel_scripts_queue_length:
sentinel_simulate_failure_flags:
master0:name=mymaster,status=ok,address=192.168.56.101:,slaves=,sentinels=
……
下面我们把master节点给干掉,
192.168.56.101:> SHUTDOWN
not connected>
这个时候,在sentinel界面会输出下面的信息:
:X Jun ::27.313 # +sdown master mymaster 192.168.56.101
:X Jun ::27.313 # +odown master mymaster 192.168.56.101 #quorum /
:X Jun ::27.313 # +new-epoch
:X Jun ::27.313 # +try-failover master mymaster 192.168.56.101
:X Jun ::27.317 # +vote-for-leader 9354edabc95f19b3d99991f0877d0e66ada04e5b
:X Jun ::27.317 # +elected-leader master mymaster 192.168.56.101
:X Jun ::27.317 # +failover-state-select-slave master mymaster 192.168.56.101
:X Jun ::27.384 # +selected-slave slave 192.168.56.102: 192.168.56.102 @ mymaster 192.168.56.101
:X Jun ::27.384 * +failover-state-send-slaveof-noone slave 192.168.56.102: 192.168.56.102 @ mymaster 192.168.56.101
:X Jun ::27.450 * +failover-state-wait-promotion slave 192.168.56.102: 192.168.56.102 @ mymaster 192.168.56.101
:X Jun ::28.255 # +promoted-slave slave 192.168.56.102: 192.168.56.102 @ mymaster 192.168.56.101
:X Jun ::28.255 # +failover-state-reconf-slaves master mymaster 192.168.56.101
:X Jun ::28.317 # +failover-end master mymaster 192.168.56.101
:X Jun ::28.317 # +switch-master mymaster 192.168.56.101 192.168.56.102
:X Jun ::28.318 * +slave slave 192.168.56.101: 192.168.56.101 @ mymaster 192.168.56.102
现在我们在查看以前的slave节点:
192.168.56.102:> info
……
# Replication
role:master
connected_slaves:
master_repl_offset:
repl_backlog_active:
repl_backlog_size:
repl_backlog_first_byte_offset:
repl_backlog_histlen:
……
这个时候以前的slave变成了master,所以现在没有从节点了,所以 connected_slaves:0 ,下面我们把干掉的192.168.56.101 8887服务给启用,然后在查看现在的master,
192.168.56.102:> info
……
# Replication
role:master
connected_slaves:
slave0:ip=192.168.56.101,port=,state=online,offset=,lag=
master_repl_offset:
repl_backlog_active:
repl_backlog_size:
repl_backlog_first_byte_offset:
repl_backlog_histlen:
……
这个时候可以看到,多出了一个slave,即以前的master变成了从节点,我们再看以前的master节点信息:
192.168.56.101:> info
……
# Replication
role:slave
master_host:192.168.56.102
master_port:
master_link_status:up
master_last_io_seconds_ago:
master_sync_in_progress:
slave_repl_offset:
slave_priority:
slave_read_only:
connected_slaves:
master_repl_offset:
repl_backlog_active:
repl_backlog_size:
repl_backlog_first_byte_offset:
repl_backlog_histlen:
……
上面就是sentinel自动的对redis的主从切换的配置,以及信息的变化,下面来看在Spring中如何配置。
四、Spring中 Sentinel配置
pom.xml文件中添加依赖包
<!--redis 支持java的语言 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency> <!-- spring data redis -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.8.1.RELEASE</version>
</dependency>
spring-redis.xml的配置:
<!--redis哨兵 -->
<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.56.101"/>
<constructor-arg name="port" value="9999"/>
</bean>
</set>
</property>
</bean> <bean id="jedisConnFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<!--<property name="hostName" value="${redis.host}"/>-->
<!--<property name="port" value="${redis.port}"/>-->
<!--<property name="password" value="${redis.password}"/>-->
<!--<property name="usePool" value="false"/>-->
<!--<property name="poolConfig" ref="poolConfig"/>-->
<constructor-arg name="sentinelConfig" ref="redisSentinelConfiguration"/>
</bean> <bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
<property name="connectionFactory" ref="jedisConnFactory"/>
</bean>
tips:
第25行如果我们不配poolConfig的话,也不要把第24行的usePool改成false,如果把usePool改成false,那么上面的哨兵配置好像就无效了。
Sentinel模式下的几个事件
- +reset-master :主服务器已被重置。
- +slave :一个新的从服务器已经被 Sentinel 识别并关联。
- +failover-state-reconf-slaves :故障转移状态切换到了 reconf-slaves 状态。
- +failover-detected :另一个 Sentinel 开始了一次故障转移操作,或者一个从服务器转换成了主服务器。
- +slave-reconf-sent :领头(leader)的 Sentinel 向实例发送了 [SLAVEOF](/commands/slaveof.html) 命令,为实例设置新的主服务器。
- +slave-reconf-inprog :实例正在将自己设置为指定主服务器的从服务器,但相应的同步过程仍未完成。
- +slave-reconf-done :从服务器已经成功完成对新主服务器的同步。
- -dup-sentinel :对给定主服务器进行监视的一个或多个 Sentinel 已经因为重复出现而被移除 —— 当 Sentinel 实例重启的时候,就会出现这种情况。
- +sentinel :一个监视给定主服务器的新 Sentinel 已经被识别并添加。
- +sdown :给定的实例现在处于主观下线状态。
- -sdown :给定的实例已经不再处于主观下线状态。
- +odown :给定的实例现在处于客观下线状态。
- -odown :给定的实例已经不再处于客观下线状态。
- +new-epoch :当前的纪元(epoch)已经被更新。
- +try-failover :一个新的故障迁移操作正在执行中,等待被大多数 Sentinel 选中(waiting to be elected by the majority)。
- +elected-leader :赢得指定纪元的选举,可以进行故障迁移操作了。
- +failover-state-select-slave :故障转移操作现在处于 select-slave 状态 —— Sentinel 正在寻找可以升级为主服务器的从服务器。
- no-good-slave :Sentinel 操作未能找到适合进行升级的从服务器。Sentinel 会在一段时间之后再次尝试寻找合适的从服务器来进行升级,又或者直接放弃执行故障转移操作。
- selected-slave :Sentinel 顺利找到适合进行升级的从服务器。
- failover-state-send-slaveof-noone :Sentinel 正在将指定的从服务器升级为主服务器,等待升级功能完成。
- failover-end-for-timeout :故障转移因为超时而中止,不过最终所有从服务器都会开始复制新的主服务器(slaves will eventually be configured to replicate with the new master anyway)。
- failover-end :故障转移操作顺利完成。所有从服务器都开始复制新的主服务器了。
- +switch-master :配置变更,主服务器的 IP 和地址已经改变。 这是绝大多数外部用户都关心的信息。
- +tilt :进入 tilt 模式。
- -tilt :退出 tilt 模式。
以上就是redis的主从及哨兵的配置,如果有错,谢谢指出。
参考:http://wosyingjun.iteye.com/blog/2289593
http://www.cnblogs.com/yjmyzz/p/redis-sentinel-sample.html
http://blog.csdn.net/yypzye/article/details/52281282
本实项目下载:https://github.com/eoooxy/anhoo
spring集成redis——主从配置以及哨兵监控的更多相关文章
- Redis主从配置和哨兵监控配置——服务器端环境搭建
一:介绍 公司用到的redis框架,主要分为cluster的缓存集群和sentinel中的哨兵主从.这种的选用方式一般需要更具业务场景来做区分,两种框架的配置图为:右图为哨兵主从框架和cliuster ...
- redis主从配置+sentinel哨兵
redis主从配置+sentinel哨兵 1:编译环境准备 1.1环境确认 Redis是一个开源.支持网络.基于内存.键值对存储数据库,使用ANSI C编写.所以在搭建Redis服务器时需要C语言的编 ...
- Redis主从配置,哨兵,集群的设计原理
一 前言 谈到Redis服务器的高可用,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制. 哨兵(Sentinel):可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转 ...
- Redis主从配置以及哨兵模式
Redis主从模式,应用写master,读slave,减轻master的压力. 配置主结点: daemonize yes port 6379bind 0.0.0.0 pidfile /opt/redi ...
- 通过哨兵机制实现Redis主从配置以及java调用
Redis版本:3.0.7 操作环境:Linux 一.redis 主从配置的作用是什么 redis主从配置,配置master 只能为写,slave只能为读,在客户端对poolconnect请求时候,, ...
- Redis 主从配置密码以及哨兵
目录: Redis 主从介绍 哨兵机制 Redis 主从配置 环境 安装 启动服务 检查主从状态 测试数据同步 默认是读写分离的 Redis Sentinel 配置 主Redis宕机测试 配置多个哨兵 ...
- csredis-in-asp.net core理论实战-主从配置、哨兵模式
csredis GitHub https://github.com/2881099/csredis 看了github上的开源项目,上面真的只是单纯的使用文档,可能对于我这种人(菜鸟)就不太友好, 我知 ...
- Redis实战——redis主从备份和哨兵模式实践
借鉴:http://redis.majunwei.com/topics/sentinel.html https://blog.csdn.net/u011784767/article/detai ...
- spring集成redis
redis是一种非关系型数据库,与mongoDB不同的是redis是内存数据库,所以访问速度很快.常用作缓存和发布-订阅式的消息队列.redis官方没有提供windows版本的软件.windows版本 ...
随机推荐
- IntelliJ IDEA 设置代码提示或自动补全的快捷键(Alt+/)
点击 文件菜单(File) –> 点击 设置(Settings… Ctrl+Alt+S), –> 打开设置对话框.在左侧的导航框中点击 KeyMap. 接着在右边的树型框中选择 Main ...
- linux中C语言发送广播报文
2. 指令的解决方法: oute add -net 255.255.255.255 netmask 255.255.255.255 dev eth0 metric 1 或者 route add -ho ...
- 并发队列ConcurrentLinkedQueue、阻塞队列AraayBlockingQueue、阻塞队列LinkedBlockingQueue 区别和使用场景总结
三者区别与联系: 联系,三者 都是线程安全的.区别,就是 并发 和 阻塞,前者为并发队列,因为采用cas算法,所以能够高并发的处理:后2者采用锁机制,所以是阻塞的.注意点就是前者由于采用cas算 ...
- UVa 1605 联合国大楼
https://vjudge.net/problem/UVA-1605 题意:有n个国家,要求设计一栋楼并为这n个国家划分房间,要求国家的房间必须连通,且每两个国家之间必须有一间房间是相邻的. 思路: ...
- 指数循环节 求A的B次方模C
phi(c)为欧拉函数, 欧拉定理 : 对于互质的正整数 a 和 n ,有 aφ(n) ≡ 1 mod n . A^x = A^(x % Phi(C) + Phi(C)) (mod C) (x & ...
- Codeforces Beta Round #17 A.素数相关
A. Noldbach problem Nick is interested in prime numbers. Once he read about Goldbach problem. It sta ...
- Contiguous Array with Equal Number of 0 & 1
2018-07-08 13:24:31 问题描述: 问题求解: 问题规模已经给出是50000量级,显然只能是O(n),至多O(nlogn)的复杂度.本题使用DP和滑动数组都比较棘手,这里给出的方案是p ...
- Android ListView常见配置说明
ListView是我们经常使用的控件,但是使用中却因为各种原因无法设置出我们需要的效果,现将常用的设置记录下来方便以后查询. 1.拖动时背景变黑 android:cacheColorHint=&quo ...
- C# DataTable列名不区分大小写
一直很纠结的就是DataTable的列名如何才能规范,从Oracle取出的DataTable都是大写,最后尝试了一下,原来C#的DataTable列名并不区分大小写,具体例子如下: DataTable ...
- windows7 asp.net发布IIS 拒绝访问 解决方法
在windows7中打开DNN网站有以下问题: CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP ...