栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Redis cluster搭建三主三从+哨兵模式+整合spring boot+整合Redisson

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Redis cluster搭建三主三从+哨兵模式+整合spring boot+整合Redisson

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录
  • 搭建环境
  • 一、Redis cluster三主三从
    • 1.下载解压安装
    • 2.环境变量
    • 3.搭建节点
      • ①创建文件夹
      • ②创建配置文件
    • 4、设置开机启动
    • 5、启动各个节点,创建集群,检查状态
  • 二、哨兵模式
    • 1.创建sentinel相关的文件夹
    • 2.创建配置文件
  • 三、整合spring boot
  • 四、整合Redisson
  • 五、常见错误踩坑
    • 一、Waiting for the cluster to join.........
    • 二、Not all slots covered!
    • 三、Redis集群配置的公网,redisson 却连的内网
    • 四、No more cluster attempts left.
  • 总结


搭建环境

提示:环境可供参考:

#系统版本
[root@iZ2ze44d9k2nxfqo6q098gZ data]# cat /etc/redhat-release
CentOS Linux release 8.5.2111
[root@iZ2ze44d9k2nxfqo6q098gZ data]# cat /proc/version
Linux version 4.18.0-348.2.1.el8_5.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 8.5.0 20210514 (Red Hat 8.5.0-4) (GCC)) #1 SMP Tue Nov 16 14:42:35 UTC 2021

#Redis版本
wget -P /usr/local/src -c  http://download.redis.io/releases/redis-6.2.6.tar.gz

#spring boot版本
:: Spring Boot ::       (v2.3.12.RELEASE)

#Redisson版本
org.redisson.Version - Redisson 3.16.8

提示:以下是本篇文章正文内容,下面案例可供参考

一、Redis cluster三主三从 1.下载解压安装
wget -P /usr/local/src -c  http://download.redis.io/releases/redis-6.2.6.tar.gz
cd /usr/local/src
tar -zxvf redis-6.2.6.tar.gz
cd redis-6.2.6
make && make PREFIX=/usr/local/redis install
#返回0代表成功
echo $? 
2.环境变量

vim /etc/profile

export REDIS_HOME=/usr/local/redis
export PATH=$PATH:$REDIS_HOME/bin

执行 source /etc/profile 使修改立即生效

3.搭建节点

以一台为例子,其他可以节点一样,重复操作即可。建议在三台机器上搭建,一台机器一主一从

①创建文件夹
mkdir -p /usr/local/redis/redis_cluster/6380/conf/
mkdir -p /usr/local/redis/redis_cluster/6380/logs/
mkdir -p /usr/local/redis/redis_cluster/6380/data/

mkdir -p /usr/local/redis/redis_cluster/6381/conf/
mkdir -p /usr/local/redis/redis_cluster/6381/logs/
mkdir -p /usr/local/redis/redis_cluster/6381/data/
②创建配置文件

6380节点
vim /usr/local/redis/redis_cluster/6380/conf/redis.conf

# 绑定服务器域名或IP地址,注意这个bind是绑定节点的IP,而不是允许访问的IP,填写内网地址
bind 192.168.0.10
# 设置端口,区分集群中Redis的实例
port 6380
# 后台运行
daemonize yes
# pid进程文件名,以端口号命名
pidfile /var/run/redis-6380.pid
# 日志文件名称,以端口号为目录来区分
logfile /usr/local/redis/redis_cluster/6380/logs/redis.log
# 数据文件存放地址,以端口号为目录名来区分
dir /usr/local/redis/redis_cluster/6380/data
# 启用集群
cluster-enabled yes
# 配置每个节点的配置文件,同样以端口号为名称
cluster-config-file nodes_6380.conf
# 配置集群节点的超时时间
cluster-node-timeout 15000
# 启动AOF增量持久化策略
appendonly yes
# 发生改变,则记录日志
appendfsync always

#900 秒内至少有 1 个 key 被改变
save 900 1
#300 秒内至少有 300 个 key 被改变
save 300 10
#60 秒内至少有 10000 个 key 被改变
save 60 10000
#  后台存储错误停止写。
stop-writes-on-bgsave-error yes
#  存储至本地数据库时(持久化到 rdb 文件)是否压缩数据,默认为 yes
rdbcompression yes
# RDB 文件的是否直接偶像 chcksum
rdbchecksum yes
#  本地持久化数据库文件名,默认值为 dump.rdb
dbfilename dump.rdb
# 密码,注意集群各节点密码要保持一致
requirepass 123456789

6381节点
vim /usr/local/redis/redis_cluster/6381/conf/redis.conf

# 绑定服务器域名或IP地址,注意这个bind是绑定节点的IP,而不是允许访问的IP,填写内网地址
bind 192.168.0.11
# 设置端口,区分集群中Redis的实例
port 6381
# 后台运行
daemonize yes
# pid进程文件名,以端口号命名
pidfile /var/run/redis-6381.pid
# 日志文件名称,以端口号为目录来区分
logfile /usr/local/redis/redis_cluster/6381/logs/redis.log
# 数据文件存放地址,以端口号为目录名来区分
dir /usr/local/redis/redis_cluster/6381/data
# 启用集群
cluster-enabled yes
# 配置每个节点的配置文件,同样以端口号为名称
cluster-config-file nodes_6381.conf
# 配置集群节点的超时时间
cluster-node-timeout 15000
# 启动AOF增量持久化策略
appendonly yes
# 发生改变,则记录日志
appendfsync always

#900 秒内至少有 1 个 key 被改变
save 900 1
#300 秒内至少有 300 个 key 被改变
save 300 10
#60 秒内至少有 10000 个 key 被改变
save 60 10000
#  后台存储错误停止写。
stop-writes-on-bgsave-error yes
#  存储至本地数据库时(持久化到 rdb 文件)是否压缩数据,默认为 yes
rdbcompression yes
# RDB 文件的是否直接偶像 chcksum
rdbchecksum yes
#  本地持久化数据库文件名,默认值为 dump.rdb
dbfilename dump.rdb
# 密码,注意集群各节点密码要保持一致
requirepass 123456789
4、设置开机启动

每台机器设置开机启动
vim /etc/rc.local

/usr/local/redis/bin/redis-server /usr/local/redis/redis_cluster/6380/conf/redis.conf
/usr/local/redis/bin/redis-server /usr/local/redis/redis_cluster/6381/conf/redis.conf

如果开机启动不生效,可以执行 chmod +x /etc/rc.d/rc.local

5、启动各个节点,创建集群,检查状态
redis-server /usr/local/redis/redis_cluster/6380/conf/redis.conf
redis-server /usr/local/redis/redis_cluster/6381/conf/redis.conf

查看启动情况

[root@iZ2ze3pdypz126y1bxp4xfZ data]# ps -ef|grep redis
root     1535085       1  0 18:05 ?        00:00:32 redis-server 172.26.67.38:6380 [cluster]
root     1535625       1  2 18:08 ?        00:01:22 redis-server 172.26.67.38:6381 [cluster]
root     1546480   19893  0 19:10 pts/0    00:00:00 grep --color=auto redis

创建集群,这里的IP是外网IP,-a后面是密码,2>/dev/null 是将标准错误忽略。要确保加入的节点是empty。如果不为空,连接节点执行flushall flushdb cluster reset

redis-cli --cluster create 192.168.0.11:6380 192.168.0.11:6381 192.168.0.12:6380 192.168.0.12:6381 192.168.0.13:6380 192.168.0.13:6381 --cluster-replicas 1 -a 123456789  2>/dev/null

检查状态

redis-cli --cluster check 192.168.0.11:6380 -a 123456789  2>/dev/null

xxx.xxx.xxx.xxx:6379 (3a81002e...) -> 0 keys | 5461 slots | 1 slaves.
xxx.xxx.xxx.xxx:6380 (dfe7994a...) -> 0 keys | 5461 slots | 1 slaves.
xxx.xxx.xxx.xxx:6380 (c4e9009c...) -> 0 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node xxx.xxx.xxx.xxx:6379)
M: 3a81002e6a20133d44895f3f0e72e0ee16028ccf xxx.xxx.xxx.xxx:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 57bfa604ff4c27de83a5c37540078d4262b293fc xxx.xxx.xxx.xxx:6381
   slots: (0 slots) slave
   replicates 3a81002e6a20133d44895f3f0e72e0ee16028ccf
S: baabb58a937192d87dbc83518da94f990c9533a6 xxx.xxx.xxx.xxx:6381
   slots: (0 slots) slave
   replicates c4e9009cbe6ea4c2a439777d16021fecd754a2ba
M: dfe7994a2457a87fec7409064358d750d48e8e39 xxx.xxx.xxx.xxx:6380
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: c4e9009cbe6ea4c2a439777d16021fecd754a2ba xxx.xxx.xxx.xxx:6380
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 7ba2ab130e5c6917635888ee8577fa5cf3ea2838 xxx.xxx.xxx.xxx:6382
   slots: (0 slots) slave
   replicates dfe7994a2457a87fec7409064358d750d48e8e39
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

状态OK,集群搭建完成

二、哨兵模式 1.创建sentinel相关的文件夹
mkdir -p /usr/local/redis/redis_cluster/27001/conf/
mkdir -p /usr/local/redis/redis_cluster/27001/logs/
mkdir -p /usr/local/redis/redis_cluster/27001/data/
2.创建配置文件

cd /usr/local/redis/redis_cluster/27001/conf/
vim sentinel.conf
根据集群状态中的主节点来配置,即 M:开头的

bind 0.0.0.0
port 27001
daemonize yes
pidfile /var/run/redis-sentinel.pid
logfile  /usr/local/redis/redis_cluster/27001/logs/redis-sentinel.log
dir /usr/local/redis/redis_cluster/27001/data

sentinel monitor mymaster1 xxx.xxx.xxx.xxx 6379 2
sentinel monitor mymaster2 xxx.xxx.xxx.xxx 6380 2
sentinel monitor mymaster3 xxx.xxx.xxx.xxx 6380 2

sentinel down-after-milliseconds mymaster1 10000
sentinel down-after-milliseconds mymaster2 10000
sentinel down-after-milliseconds mymaster3 10000

sentinel parallel-syncs mymaster1 1
sentinel parallel-syncs mymaster2 1
sentinel parallel-syncs mymaster3 1

sentinel failover-timeout mymaster1 15000
sentinel failover-timeout mymaster2 15000
sentinel failover-timeout mymaster3 15000

启动哨兵
redis-sentinel /usr/local/redis/redis_cluster/27001/conf/sentinel.conf
查看redis-sentinel进程
ps -ef|grep sentinel

三、整合spring boot

修改配置文件

spring:
  redis:
    port: 6379 # Redis服务器连接端口
    password: xxxxxxxxx # Redis服务器连接密码(默认为空)
    timeout: 3000 # 连接超时时间(毫秒)
    cluster:
      max-redirects: 3
      nodes:
        - xxx.xxx.xxx.xxx:6379
        - xxx.xxx.xxx.xxx:6380
        - xxx.xxx.xxx.xxx:6381
        - xxx.xxx.xxx.xxx:6382
        - xxx.xxx.xxx.xxx:6380
        - xxx.xxx.xxx.xxx:6381
    jedis:
      pool:
        min-idle: 10
        max-idle: 20
        max-wait: -1ms
        max-active: 200
四、整合Redisson
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.ClusterServersConfig;
import org.redisson.config.Config;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;


@Configuration
public class RedissonConfig {
    @Resource
    private RedisProperties redisProperties;
    public static final String PREFIX = "LOCK:";

//    
//    @Bean
//    public RedissonClient redissonClient() {
//        String node1 = String.format("redis://%s:%s", redisProperties.getHost(), redisProperties.getPort());
//        Config config = new Config();
//        config.useSingleServer().setAddress(node1).setPassword(redisProperties.getPassword()).setPingConnectionInterval(1000);
//
//        return Redisson.create(config);
//    }

    
    @Bean
    public RedissonClient clusterRedissonClient() {
        List clusterNodes = new ArrayList<>();
        for (int i = 0; i < redisProperties.getCluster().getNodes().size(); i++) {
            clusterNodes.add("redis://" + redisProperties.getCluster().getNodes().get(i));
        }
        Config config = new Config();
        String[] a = new String[clusterNodes.size()];
        ClusterServersConfig clusterServersConfig = config.useClusterServers()
                .addNodeAddress(clusterNodes.toArray(a));
        clusterServersConfig.setPassword(redisProperties.getPassword());//设置密码,如果没有密码,则注释这一行,否则启动会报错
        return Redisson.create(config);
    }

}
五、常见错误踩坑 一、Waiting for the cluster to join…

检查redis.conf 里面bind 的 IP,执行 redis-cli --cluster create 的时候要为外网IP,打开防火墙的与节点端口相关的端口,以及Redis集成总线的端口 Redis端口+10000 例如16379

二、Not all slots covered!

利用telnet ip port 检查各个节点的连接,如果有连接不上的就会出现该错误

三、Redis集群配置的公网,redisson 却连的内网

根据提示,检查 node 配置文件,例如 nodes_6381.conf ,修改里面的IP为可以连接到的IP

四、No more cluster attempts left.

检查节点的redis.conf 里面的bind,注意要为内网地址,修改节点配置文件里面的myself的IP ,例如nodes_6381.conf

c4e9009cbe6ea4c2a439777d16021fecd754a2ba xxx.xxx.xxx.xxx:6380@16380 master - 0 1653040382693 5 connected 5461-10922
3a81002e6a20133d44895f3f0e72e0ee16028ccf xxx.xxx.xxx.xxx:6379@16379 master - 0 1653040379000 1 connected 0-5460
57bfa604ff4c27de83a5c37540078d4262b293fc xxx.xxx.xxx.xxx:6381@16381 myself,slave 3a81002e6a20133d44895f3f0e72e0ee16028ccf 0 1653040380000 1 connected
baabb58a937192d87dbc83518da94f990c9533a6 xxx.xxx.xxx.xxx:6381@16381 slave c4e9009cbe6ea4c2a439777d16021fecd754a2ba 0 1653040381000 5 connected
dfe7994a2457a87fec7409064358d750d48e8e39 xxx.xxx.xxx.xxx:6380@16380 master - 0 1653040381689 2 connected 10923-16383
7ba2ab130e5c6917635888ee8577fa5cf3ea2838 xxx.xxx.xxx.xxx:6382@16382 slave dfe7994a2457a87fec7409064358d750d48e8e39 0 1653040382000 2 connected
vars currentEpoch 6 lastVoteEpoch 0


总结

诗歌赏析

七律·人民解放军占领南京
作者:毛泽东

钟山风雨起苍黄,百万雄师过大江。 
虎踞龙盘今胜昔,天翻地覆慨而慷。 
宜将剩勇追穷寇,不可沽名学霸王。 
天若有情天亦老,人间正道是沧桑。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/918844.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号