springboot集群架构,springboot nginx

2023-05-06 21:29:17 阅读:159301 作者: 2733

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):
跟上面一样,只是放开两行:

replicaof 192.168.200.135 6379masterauth "420188" 5、启动redis ./redis-server ./redis.conf

因为daemonize yes所以它一定会挂在后台运行

这样的话就组成了一主二从的主从模式。
测试,在135机器上连接客户端 :(另开一个窗口)

./redis-cli

执行
登录:auth 420188
查看redis节点信息:info replication
显示:
role:master #当前节点是主节点
connected_slaves:2 #它还有两个从节点
还有很多其他信息…………
设置一个信息试试:set name llcc
在136/137的客户端连接上,执行get name 就可以看到主节点刚才保存的数据了

6、搭建哨兵模式

主从模式只是解决了数据的备份但是主节点挂了,没法自动选举从节点,所以要使用哨兵模式。
在上面主从模式基础上开始搭建:
6.1、手动创建目录sentinel:/home/soft/redis/redis-6.0.4/data/sentinel
6.2、修改谨慎的狗下的sentinel.conf文件(几台服务器的sentinel.conf都配置一样,哨兵本身也形成了集群)

port 26379daemonize yespidfile "/var/run/redis-sentinel.pid"logfile "/home/soft/redis/redis-6.0.4/data/sentinel"dir /home/soft/redis/redis-6.0.4/data/sentinel# 设定监控地址,为对应的主redis库的内网地址, 行尾最后的一个1代表当master挂掉时,集群中1个sentine(哨兵)都认为master挂了才能认为master 不可用,sentinel集群中各个sentinel通过gossip协议进行通讯(这里的哨兵都监控master,而不是分别监听自己的redis)sentinel monitor mymaster 192.168.200.135 6379 1# 设定sentinel myid 每个都不一样,使用yum安装的时候,直接就生成了sentinel myid 8136d69cca59e0918a73a7af97eb59c77742d352# 主数据库密码,需要将配置放在sentinel monitor master 127.0.0.1 6379 1下面sentinel auth-pass mymaster 420188sentinel down-after-milliseconds mymaster 3000sentinel deny-scripts-reconfig yes# 表示如果master重新选出来后,其它slave节点能同时并行从新master同步缓存的台数有多少个,显然该值越大,所有slave节点完成同步切换的整体速度越快,但如果此时正好有人在访问这些slave,可能造成读取失败,影响面会更广。最保定的设置为1,只同一时间,只能有一台干这件事,这样其它slave还能继续服务,但是所有slave全部完成缓存更新同步的进程将变慢。sentinel parallel-syncs mymaster 1# 设定10秒内master没有活起来,就重新选举主sentinel failover-timeout mymaster 10000sentinel config-epoch mymaster 0sentinel leader-epoch mymaster 0# 保护模式修改为否,允许远程连接protected-mode no

这里重点是:
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

注意:一主二从的配置 sentinel monitor mymaster 192.168.200.135 6379 1 7、启动哨兵

在谨慎的狗目录下执行:

./redis-sentinel ./sentinel.conf

这是135是master ,136、137是slave
现在手动关闭135的redis,再去136、137查看info replication会发现136已经成了master
这就实现了自动切换主从,故障转移(注:如果重启主节点发现它没有加入新的哨兵主从,那要检查一下它密码有没有被注释,就是这个 masterauth,我之前就遇到这个这个问题了)

二、springboot集成redis哨兵

这里用的是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 举报,一经查实,本站将立刻删除。

标签: 集群   架构

Copyright © 2022 恩蓝号 Inc. 保留所有权利。 Powered by 恩蓝号

页面耗时0.0205秒, 内存占用107.28 KB, 访问数据库2次