redis哨兵模式的配置及其在springboot中的应用
一.从0构建redis哨兵模式1,下载redis 3358 download.redis.io/releases /此处使用的6.0.4版
下载并上传到服务器
这里准备三台服务器: 192.168.200.135 (主) 192.168.200.136 (从) 192.168.200.137 (从)
然后,准备服务器,检查是否有gcc:rpm -q gcc
如果没有安装,则安装(依次执行) :
yuminstallgcc-cyum-yinstallcentos-release-SCL yum-yinstalldevtoolset-9-gccdevtoolset-9-gcccc-cdev toolset-9 bbbbbid (我的目录是/home/soft/redis/redis-6.0.4 ) )
编译: make
安装: (make install PREFIX=安装路径)
例如makeinstallprefix=/home/soft/redis/redis-6.0.4
他会在redis-6.0.4文件夹中生成谨慎的狗文件夹。 这就是安装的redis目录。 当然,您可以指定其他目录来轻松标识,例如makeinstallprefix=/home/soft/redis/redis 1
3、是要放置conf文件的安装目录(/home/soft/redis/redis-6.0.4 )下的redis.conf、sentinel.conf文件
复制到刚生成的小心翼翼的狗的目录中。
修改redis.conf :
3.1、持续化AOF
将appendonly no更改为appendonly always/everysec/no是通过使用AOF持久化模式,always始终运行,everysec每秒运行一次。 (默认)不执行no
RDB
是注释掉save 900 1、save 300 10、save 60 10000,关闭打开还是打开
4、构建主从模式(哨兵模式基于主从模式构建) 4.1、手工创建data目录/home/soft/redis/redis-6.0.4/data保存数据
主节点(192.168.200.135 )的redis.conf文件配置:
# redis进程是否作为守护进程运行? 是是,否是。 如果不作为守护程序运行,终端将被占用。 daemonize yes#指定redis进程的PID文件的存储位置pidfile '/var/run/redis.PID ' # redis进程的端口号port 6379#是否打开保护模式如果没有为配置指定谨慎的狗d和密码。 如果选中此参数,redis将仅在本地访问并拒绝外部访问。 打开密码和小心的狗d后,就可以打开了。 否则,最好关掉它,不要。 在protected-mode no#中绑定的具有谨慎主机地址的狗d 0.0.0.0#客户端空闲和关闭连接之间的时间。 默认情况下,此参数为0,表示关闭此功能的timeout 300# redis日志级别。 可用级别包含debug.verbose.notice.warningloglevelverbose # log文件的输出位置。 如果进程作为守护进程运行,并将输出文件设置为stdout,则/dev/null将打印日志信息,缺省值为0。 使用select dbid命令指定连接上的数据库iddatabases 16#,以确定在多长时间内更新达到多长时间以及要将数据同步到数据文件save 900 1save 300 10save 60 10000# 默认情况下,yes是存储rdbcompression yes#的本地数据库文件名dbfilename 'dump.db'# redis数据文件的目录dir '/home/soft/redis # replica of 192.168.200.1356379 #如果Master设置了密码保护,slave服务将连接到Master密码#Masterauth420119。如果设置了连接密码,则为默认情况下,关闭requirepass 420188#,同时设置最大客户连接数。 默认情况下没有限制。 redis可以同时连接的客户端数量是redis程序可以打开的最大文件描述符,如果设置了maxclients #0,则没有限制。 当客户端连接数达到限制时,Redis将关闭新连接,并向客户端返回max number of clients reached错误消息maxclients 128# #以指定最大Redis值
内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key。当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可#以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区#maxmemory<bytes># #指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,#所以有的数据会在一段时间内只存在于内存中。默认为no。appendonly yes# 指定跟新日志文件名默认为appendonly.aofappendfilename "appendonly.aof"# 指定更新日志的条件,有三个可选参数 - no:表示等操作系统进行数据缓存同步到磁盘(快),always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全), #everysec:表示每秒同步一次(折衷,默认值);appendfsync everysec# 开启集群# cluster-enabled yes从节点配置(192.168.200.136/192.168.200.137):
跟上面一样,只是放开两行:
因为daemonize yes所以它一定会挂在后台运行
这样的话就组成了一主二从的主从模式。
测试,在135机器上连接客户端 :(另开一个窗口)
执行
登录:auth 420188
查看redis节点信息:info replication
显示:
role:master #当前节点是主节点
connected_slaves:2 #它还有两个从节点
还有很多其他信息…………
设置一个信息试试:set name llcc
在136/137的客户端连接上,执行get name 就可以看到主节点刚才保存的数据了
主从模式只是解决了数据的备份但是主节点挂了,没法自动选举从节点,所以要使用哨兵模式。
在上面主从模式基础上开始搭建:
6.1、手动创建目录sentinel:/home/soft/redis/redis-6.0.4/data/sentinel
6.2、修改谨慎的狗下的sentinel.conf文件(几台服务器的sentinel.conf都配置一样,哨兵本身也形成了集群)
这里重点是:
sentinel monitor mymaster 192.168.200.135 6379 1
sentinel auth-pass mymaster 420188
这里的哨兵都监控master,而不是分别监听自己的redis,所以三台服务器这里配置都是一样:
sentinel monitor mymaster 192.168.200.135 6379 1
在谨慎的狗目录下执行:
./redis-sentinel ./sentinel.conf这是135是master ,136、137是slave
现在手动关闭135的redis,再去136、137查看info replication会发现136已经成了master
这就实现了自动切换主从,故障转移(注:如果重启主节点发现它没有加入新的哨兵主从,那要检查一下它密码有没有被注释,就是这个 masterauth,我之前就遇到这个这个问题了)
这里用的是springboot2.2.5.RELEASE
1、导包 <!--集成redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <!-- 排除lettuce包,使用jedis代替--> <exclusions> <exclusion> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> 2、配置yml文件 spring: redis: cluster: nodes: 192.168.200.135:6379,192.168.200.136:6379,192.168.200.137:6379 password: 420188 timeout: 6000 database: 0 jedis: pool: max-active: 8 max-wait: -1 max-idle: 8 min-idle: 0 sentinel: master: mymaster nodes: 192.168.200.135:26379,192.168.200.136:26379,192.168.200.137:26379 3、写一个配置类(自定义redis序列化) @Configurationpublic class RedisConfig{ @Bean public RedisTemplate<String,Object> redisTemplate(JedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); //自定义序列化方式 寂寞的飞鸟2JsonRedisSerializer<Object> qsdzp2JsonRedisSerializer = new 寂寞的飞鸟2JsonRedisSerializer<Object>(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); //objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.WRAPPER_ARRAY); qsdzp2JsonRedisSerializer.setObjectMapper(objectMapper); redisTemplate.setKeySerializer(qsdzp2JsonRedisSerializer); redisTemplate.setValueSerializer(qsdzp2JsonRedisSerializer); redisTemplate.setHashKeySerializer(qsdzp2JsonRedisSerializer); redisTemplate.setHashValueSerializer(qsdzp2JsonRedisSerializer); redisTemplate.afterPropertiesSet(); return redisTemplate; } 4、代码中使用 @Autowired private RedisTemplate redisTemplate;版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。