基本介绍
本文基于redis-2.8.10和jedis2.4.2版本。
redis 2.8之后的版本 开始支持Sentinel监听客户端功能。使用1个或多个的Sentinel作为一个监听的集群。
后端N个(master+slave)组成一个redis集群。
Sentinel通过检测Redis的master实例是否存活,并在Redis master实例发生故障时,将Redis master的slave提升为master,
并在老的master重新加入到redis sentinel的群集之后,会被重新配置,作为新master的slave。
这意味着基于redis sentinel的HA群集是能够自我管理的!
应用通过sentinel可以动态的得到当前master的连接,而不是直接在应该中配置写死的master的IP和端口。
这样就避免了master,slave切换后应用配置的连接不可用的情况。
安装配置
http://download.redis.io/releases/redis-2.8.17.tar.gz
1.安装redis:
tar zxvf redis-2.8.17.tar.gz (要先安装tcl)
cd redis-2.8.8
(查看Liunx版本方式:getconf LONG_BIT)
如果是32位:
make CFLAGS=”-march=i686″
如果是64位:
make
要是编译失败(make clean)
cd src
make test
make install
mkdir -p /opt/portal/redis/bin
mkdir -p /opt/portal/redis/conf
mkdir -p /opt/portal/redis/logs
cd /opt/portal/redis/redis-2.8.8
cp redis.conf sentinel.conf /opt/portal/redis/conf
cd /opt/portal/redis/redis-2.8.8/src
cp redis-server redis-cli redis-sentinel redis-benchmark mkreleasehdr.sh redis-check-aof redis-check-dump /opt/portal/redis/bin
设置别名
vi /etc/profile
alias redis-server=’/opt/portal/redis/bin/redis-server /opt/portal/redis/conf/redis.conf’
alias redis-cli=’/opt/portal/redis/bin/redis-cli’
使配置文件生效
. /etc/profile
slave 的 redis 的redis.conf需要配置master的IP和端口# slaveof
Sentinel官方文档:官网:http://redis.io/topics/sentinel
sentinel.conf主要有6个配置项
port 26329
sentinel monitor mymaster 192.168.14.191 6379 2
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
sentinel notification-script
port:
指定sentinel的侦听端口(即与redis server或client建立tcp连接的端口)
monitor:
指定sentinel要monitor的redis实例,包括一个redis实例的别名(alias)及redis实例的ip+port,该行最后的数字2表示至少2个setinel实例同时检测到redis server异常时,才将redis server的状态判决为real fail。也即,若这里配置为2,但实际部署中sentinel只部署了1套,则即使redis实例已经挂掉,sentinel也不会给出任何警告。这一点需要特别引起注意。
down-after-milliseconds:
指定sentinel监控到redis实例持续异常多长时间后,会判决其状态为down。若实际业务需要sentinel尽快判决出redis实例异常,则可适当配小。
failover-timeout:
若sentinel在该配置值内未能完成failover操作(即故障时master/slave自动切换),则认为本次failover失败。该配置有4个用途,具体可参考sentinel.conf中的说明,限于篇幅,此处不再赘述。
parallel-syncs:
指定failover过程中,同时被sentinel reconfigure的最大slave实例数。由于reconfigure过程中,对应的slave会中断响应客户端请求,故为避免所有的slave同时不可用,该值需适当配小。
notification-script:
指定sentinel检测到master-name指向的实例异常时,调用的报警脚本。该配置项可选,但线上系统建议配置。
测试
191,192上面各部署一个Sentinel监控同一个master。
192部署master,191部署slave(redis.conf 中配置master的地址 slave of 192.168.11.190 6379)
启动redis,Sentinel
nohup ./bin/redis-sentinel ./conf/sentinel.conf> ./logs/redis-sentinel.log 2>&1&
redis-cli info 可以查看当前redis实例的基本信息
redis-cli -p 26379 连接redis-sentinel客户端 info 查看master地址,有几个slave,有几个监控
动态添加需要监控的master
192.168.14.192:26381> sentinel monitor mymaster 192.168.14.193 6379 2
查看一个指定的master有那些slaves:
192.168.14.192:26379> sentinel slaves mymaster
192关闭master: redis-cli下shutdown
在redis-sentinel.log中
+sdown master mymaster 192.168.14.192 6379 监控到192down了
+vote-for-leader bccb0d2d048a9a8497f87137a856add2ff57bceb 1 选举新的master
+switch-master mymaster 192.168.14.192 6379 192.168.14.191 6379 将原来的master192 换成191
+slave slave 192.168.14.192:6379 192.168.14.192 6379 @ mymaster 192.168.14.191 6379 192变成了191的slave
redis-cli info Replication 191 变成role:master
重新开启 192
redis-cli info Replication 192 role:slave
再把191 shutdown 192 又变回master了
Spring配置文件&代码
配置文件要懒加载,java-dao 要用getBean获取redisTemplate,getBean之前还要用Jedis jedis = new Jedis(ip, port);测试,不然redis连接不上,Sentinel会死循环的不断连接。
sentinelConfiguration配置监听的列表
connectionFactory:从监听中获取当前的master
redisTemplate:到connectionFactory获取连接
Long listFormRedis=redisTemplate.opsForList().size(“login_record_list”);
String hostName=connectionFactory.getSentinelConnection().masters().iterator().next().getHost();
System.out.println(listFormRedis);
System.out.println(hostName);
master切换的时候应用的日志:
It seems like server has closed the connection.; nested exception
2014-11-10 16:57:46 redis.clients.jedis.JedisSentinelPool initPool
信息: Created JedisPool to master at 192.168.14.191:6379
来源:http://blog.csdn.net/gaogaoshan/article/details/41043685
分类目录
- arch/management (17)
- computer (38)
- java/j2ee (305)
- lnmpa (237)
- mac/iphone/ipad/android (11)
- mysql/oracle/postgresql (126)
- os/software (74)
- other (518)
- python (6)
- redis/memcached/mongo (31)
- sitebuild (143)
随便看看
标签云
程序员 创业 人生箴言 eclipse 快捷键 术语 索引 unix命令 vim wordpress java学习笔记 环境变量 oracle内置函数 index 人生 数据类型 nohup tuxedo mysql学习笔记 MS-DOS命令 servlet spring 职场进阶 职业进阶 服务器选购 服务器选型 apache JPA MongoDB 注解 tomcat 子女教育 jquery maven JVM aix命令 网络营销 java异常 seo 人生规划 关键字 css 网络推广 struts 系统优化 成长 frame iframe bluehost jdbc select 我的信仰 oracle函数 cookie HashMap 站长工具 乱码 ArrayList secureCRT jsp session tail find halt 事务 oracle单记录函数 算法 URL window table javascript操作表单元素 String 字符串处理 健康 http 域名 情感 more google A记录 域名解析 netstat 弹出对话框 弹出窗口 框架集 框架 excel 字符串 javascript函数 showModalDialog nginx number 数组 sql frameset 开源程序 java数组 软件 oracle服务友情链接
收藏链接