最近公司项目中单机的redis总是出现各种宕机的问题,导致系统部分瘫痪,为了解决这个问题,打算搭建一套主从+哨兵模式的Redis形式的集群,废话不多说,上干货!!!
目录:
一:Redis主从模式搭建过程
二:Redis主从模式搭建过程
三:Springboot整合集群相关配置
一:Redis主从模式搭建过程
2.文件上传到对应服务器文件夹中
/usr/local/soft
3.解压安装
tar -zxvf redis-stable.tar.gz
4.进入解压目录并运行编译
cd redis-stable
make && make install
5.进入Redis默认安装路径
cd /usr/local/bin
6.新建Redis主从需要的文件以及文件夹
cd /usr/local
mkdir redis-7.0
cd redis-7.0
mkdir bin
mkdir conf
bin下面放启动文件 conf下面放配置文件
7.复制相关文件到以上两个文件夹中
由于编译安装后的 src 下文件非常多,我们可以将几个常用的命令和 conf 配置文件复制出来进行统一管理:
cd /usr/local/soft/redis-stable/src
cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel /usr/local/redis-7.0/bin
cd /usr/local/soft/redis-stable
cp redis.conf /usr/local/redis-7.0/conf
cp sentinel.conf /usr/local/redis-7.0/conf
8.修改配置文件
cd /usr/local/redis-7.0/conf
vi redis.conf
# 保护模式关闭
protected-mode no
# 端口号
port 6479
# redis进程是否以守护进程的方式运行,yes为是(后台运行),no为否(不以守护进程的方式运行会占用一个终端)。
daemonize yes
# 指定redis进程的PID文件存放位置
pidfile "/var/run/redis_6479.pid"
# log日志输出位置
logfile "./redis.log"
# 设置数据库数量
databases 16
# 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
save 900 1
save 300 10
save 60 10000
# 指定本地数据库文件名
dbfilename "dump.rdb"
# 指定本地数据库存放目录(默认当前redis安装目录)
dir "/usr/local/redis-7.0/bin"
# 当master设置了密码保护时,slave服务连接master的密码
masterauth "123456"
# 是否只读
replica-read-only no
# 设置redis连接密码,如果配置了连接密码,客户端在连接redis是需要通过AUTH<password>命令提供密码,默认关闭
requirepass "123456"
##########其他配置默认即可,如有特殊需要自行查找修#############
9.配置从节点配置文件
cp redis.conf redis01.conf
cp redis.conf redis02.conf
vi redis01.conf
vi redis02.conf
redis01(6480) 和 redis02(6481)端口号不同,其它都一样即可
# 保护模式关闭
protected-mode no
# 端口号
port 6480
# redis进程是否以守护进程的方式运行,yes为是(后台运行),no为否(不以守护进程的方式运行会占用一个终端)。
daemonize yes
# 指定redis进程的PID文件存放位置
pidfile "/var/run/redis_6480.pid"
# log日志输出位置
logfile "./redis.log"
# 设置数据库数量
databases 16
# 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
save 900 1
save 300 10
save 60 10000
# 指定本地数据库文件名
dbfilename "dump01.rdb"
# 指定本地数据库存放目录(默认当前redis安装目录)
dir "/usr/local/redis-7.0/bin"
# 当master设置了密码保护时,slave服务连接master的密码
masterauth "123456"
# 是否只读
replica-read-only yes
# 设置redis连接密码,如果配置了连接密码,客户端在连接redis是需要通过AUTH<password>命令提供密码,默认关闭
requirepass "123456"
# 设置主机的 ip+ 端口,来指明主机的redis
replicaof 192.x.x.x 6479
##########其他配置默认即可,如有特殊需要自行查找修改########
二:哨兵搭建过程
1.修改哨兵配置文件
cd /usr/local/conf
vi sentinel.conf
# 关闭保护模式可以外部访问
protected-mode no
# 端口号
port 26479
# 支持后台启动
daemonize yes
# 守护进程pid存储文件(默认位置 /var/run/redis-sentinel.pid)
pidfile "/var/run/redis-sentinel_26479.pid"
# 日志文件存放地址
logfile "/usr/local/redis-7.0/bin/sentinel-work-26479/sentinel-26479.log"
# sentinel工作目录(默认/tmp)
dir "/usr/local/redis-7.0/bin/sentinel-work-26479"
# 指定主机IP地址和端口,并且指定当有2台哨兵认为主机挂了,则对主机进行容灾切换
sentinel monitor mymaster 192.*.*.* 6479 2
# 当在Redis实例中开启了requirepass,这里就需要提供密码
sentinel auth-pass mymaster 123456
# 故障转移的超时时间,这里设置为三分钟
sentinel failover-timeout mymaster 180000
# 主备切换时,最多有多少个slave同时对新的master进行同步,这里设置为默认的1
sentinel parallel-syncs mymaster 1
# 这里设置了主机多少秒无响应,则认为挂了
sentinel down-after-milliseconds mymaster 3000
2.剩余两个哨兵修改端口号以及日志文件名称,工作目录即可
cd /usr/local/redis-7.0/conf
cp sentinel.conf sentinel01.conf
----端口26480(配置文件的26479全部替换为26480即可)
cp sentinel.conf sentinel02.conf
----端口26481(配置文件的26479全部替换为26481即可)
三:开放端口
1.开启防火墙
systemctl start firewalld
2.开放端口
firewall-cmd --zone=public --add-port=6479/tcp --permanent
firewall-cmd --zone=public --add-port=6480/tcp --permanent
firewall-cmd --zone=public --add-port=6481/tcp --permanent、
rewall-cmd --zone=public --add-port=26479/tcp --permanent
firewall-cmd --zone=public --add-port=26480/tcp --permanent
firewall-cmd --zone=public --add-port=26481/tcp --permanent、
3.重启防火墙
firewall-cmd --reload
四:启动redis服务以及哨兵
1.启动哨兵
cd /usr/local/redis-7.0/bin
./redis-sentinel /usr/local/redis-7.0/conf/sentinel.conf
./redis-sentinel /usr/local/redis-7.0/conf/sentinel01.conf
./redis-sentinel /usr/local/redis-7.0/conf/sentinel02.conf
2.查看哨兵信息
cd /usr/local/redis-7.0/bin
./redis-cli -p 26479
info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_tilt_since_seconds:-1
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.*.*.*:6479,slaves=2,sentinels=3
从上面可以看到主节点为6479,这个时候就要优先启动节点为6479的redis服务,保证主节点优先启动,遵从哨兵的选举
3.启动redis主节点服务
cd /usr/local/redis-7.0/bin
./redis-server /usr/local/redis-7.0/conf/redis.conf
4.启动从节点
cd /usr/local/redis-7.0/bin
./redis-server /usr/local/redis-7.0/conf/redis01.conf
./redis-server /usr/local/redis-7.0/conf/redis02.conf
5.查看各个节点信息
cd /usr/local/redis-7.0/bin
./redis-cli -p 6479
127.0.0.1:6479> auth "123456"
OK
127.0.0.1:6479> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.*.*.*,port=6480,state=online,offset=85926153,lag=1
slave1:ip=192.*.*.*,port=6481,state=online,offset=85926292,lag=0
master_failover_state:no-failover
master_replid:f67c98e3e0250987d0843002f016b45595939524
master_replid2:d1a1ee80c29746668605b2df22e8cddf1e7f007f
master_repl_offset:85926292
second_repl_offset:32549101
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:84875501
repl_backlog_histlen:1050792
以上信息可以看出redis服务已正常启动,之后可以自行测试,kill掉端口为6479的redis服务,哨兵将会在其它两个redis节点中重新选举一个为新的主节点。
五:Spring配置文件-yml
spring:
redis:
#----------redis 一主二从哨兵模式 start--------------#
sentinel:
master: mymaster
#哨兵ip地址和端口
nodes: 192.*.*.*:26479,192.*.*.*:26480,192.*.*.*:26481
#哨兵密码
password: 123456
#redis认证密码
password: 123456
#连接超时时间ms
timeout: 6000
#数据库分片
database: 1
lettuce:
pool:
max-active: 10 # 连接池最大连接数(使用负值表示没有限制),如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)
max-idle: 8 # 连接池中的最大空闲连接 ,默认值也是8
max-wait: 100 # # 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException
min-idle: 2 # 连接池中的最小空闲连接 ,默认值也是0
shutdown-timeout: 100ms