目录
- 一、哨兵集群架构介绍
- 二、下载安装Redis
- 2.1、选择需要安装的Redis版本
- 2.2、下载并解压Redis
- 2.3、编译安装Redis
- 三、搭建Redis一主两从集群
- 3.1、准备配置文件
- 3.1.1、准备主节点6379配置文件
- 3.1.2、准备从节点6380配置文件
- 3.1.3、准备从节点6381配置文件
- 3.2、启动Redis主从复制集群
- 3.3、查看Redis集群信息和主从复制效果
- 3.4、关闭Redis
- 四、搭建Redis三哨兵集群
- 4.1、准备配置文件
- 4.1.1、准备节点26379配置文件
- 4.1.2、准备节点26380配置文件
- 4.1.3、准备节点26381配置文件
- 4.2、启动sentinel集群
- 4.3、查看三个哨兵节点信息
- 4.4、测试哨兵容灾切换效果
- 4.5、关闭Redis哨兵
- 五、注意事项
- 5.1、远程连接问题
- 5.2、Redis节点注册到哨兵的IP问题
- 六、SpringBoot集成Redis主从架构实现读写分离(哨兵模式)
一、哨兵集群架构介绍
Redis-Sentinel是redis官方推荐的高可用性解决方案,sentinel哨兵是特殊的redis服务,不提供读写服务,主要用来监控redis实例节点,当用redis作master-slave的高可用时,如果master本身宕机,redis本身或者客户端都没有实现主从切换的功能,而redis-sentinel就是一个独立运行的进程,用于监控多个master-slave集群, 自动发现master宕机,进行自动切换slave > master,类似Java这类客户端会通过sentinel发现redis主节点并与其建立连接,也可以实现读写分离。
PS:本文使用一台主机部署,会使用不同端口区分。
二、下载安装Redis
2.1、选择需要安装的Redis版本
在官网发行版中选择一个自己需要的版本,我这里使用Redis6.2.0,小版本区别不大。
Redis发行版本列表:https://download.redis.io/releases
2.2、下载并解压Redis
- 下载redis到/usr/local/redis目录中
wget -P /usr/local/redis http://download.redis.io/releases/redis-6.2.0.tar.gz
- 进入/usr/local/redis目录解压redis
cd /usr/local/redis
tar -xzf redis-6.2.0.tar.gz
2.3、编译安装Redis
- 安装gcc
# redis是c语言编写的,编译Redis需要gcc环境
yum -y install gcc
# 安装好后查看gcc信息
gcc -v
- 编译
# 进入redis-6.2.0目录
cd redis-6.2.0
# 执行make开始编译 因为我们下载的是源码需要编译成可执行文件
make
- 安装
# 编译成功后,执行make PREFIX=/usr/local/redis/redis-6.2.0 install 安装redis
# 这里指定目录之后,方便后续卸载,直接rm -rf /usr/local/redis/redis-6.2.0 即可删除redis
make PREFIX=/usr/local/redis/redis-6.2.0 install
PREFIX 这个关键字的作用是安装的时候用于指定程序存放的路径,假设不添加该关键字Linux会将:可执行文件存放在/usr/local/bin目录;库文件会存放在/usr/local/lib目录;配置文件会存放在/usr/local/etc目录;其他的资源文件会存放在usr/local/share目录
三、搭建Redis一主两从集群
本文使用一台主机部署,会使用不同端口区分,主节点6379、从节点分别使用6380和6381。
3.1、准备配置文件
先进入Redis解压目录,后续都在该目录下操作
cd /usr/local/redis/redis-6.2.0
3.1.1、准备主节点6379配置文件
- 创建一个目录用来存放节点配置和其它信息
mkdir -p /usr/local/redis/redis-6.2.0/node/6379
- 拷贝一份redis.conf到./node/6379目录中作为主节点配置文件。
cp redis.conf ./node/6379/redis.conf
- 修改几个配置
# 编辑拷贝的配置文件,,修改几个配置信息
vi ./node/6379/redis.conf
# 绑定的主机地址,建议填redis安装服务器的业务私网地址
# 这里为了方便直接找到这个配置注释了
#bind 127.0.0.1 -::1# redis进程的端口号 默认是6379
port 6379# 是否开启保护模式,默认开启。要是配置里没有指定bind和密码,开启该参数后,redis只会本地进行访问,拒绝外部访问,这里关闭保护模式设置为no。
protected-mode no# redis进程是否以守护进程的方式运行,yes为是(后台运行),no为否(不以守护进程的方式运行会占用一个终端,终端关闭redis服务也会关闭)。
daemonize yes# 指定redis进程的PID文件存放位置
pidfile /var/run/redis_6379.pid# log文件输出位置
logfile /usr/local/redis/redis-6.2.0/node/6379/redis.log# 指定持久化存放目录(默认当前启动时所在目录),因为我这里是一台机器部署的要区分开每个节点持久化文件存放的目录
dir /usr/local/redis/redis-6.2.0/node/6379# 设置redis连接密码,如果配置了连接密码,客户端在连接redis是需要通过AUTH<password>命令提供密码,默认关闭
requirepass 123456# 当master设置了密码保护时,slave服务连接master的密码
# 主节点中也要配置,如果不配置在主节点宕机后,哨兵选择了其它从节点作为主节点,如果不配置主节点授权密码,那么在这个节点重新加入集群时无法同步新的主节点数据,因为没有主节点授权密码
masterauth 123456
3.1.2、准备从节点6380配置文件
- 创建一个目录用来存放节点配置和其它信息
mkdir -p /usr/local/redis/redis-6.2.0/node/6380
- 拷贝一份redis.conf到./node/6380目录中作为主节点配置文件。
cp redis.conf ./node/6380/redis.conf
- 修改几个配置
# 编辑拷贝的配置文件,,修改几个配置信息
vi ./node/6380/redis.conf
# 绑定的主机地址,建议填redis安装服务器的业务私网地址
# 这里为了方便直接找到这个配置注释了
#bind 127.0.0.1 -::1# redis进程的端口号 默认是6379
port 6380# 是否开启保护模式,默认开启。要是配置里没有指定bind和密码,开启该参数后,redis只会本地进行访问,拒绝外部访问,这里关闭保护模式设置为no。
protected-mode no# redis进程是否以守护进程的方式运行,yes为是(后台运行),no为否(不以守护进程的方式运行会占用一个终端,终端关闭redis服务也会关闭)。
daemonize yes# 指定redis进程的PID文件存放位置
pidfile /var/run/redis_6380.pid# log文件输出位置
logfile /usr/local/redis/redis-6.2.0/node/6380/redis.log# 指定持久化存放目录(默认当前启动时所在目录),因为我这里是一台机器部署的要区分开每个节点持久化文件存放的目录
dir /usr/local/redis/redis-6.2.0/node/6380# 设置redis连接密码,如果配置了连接密码,客户端在连接redis是需要通过AUTH<password>命令提供密码,默认关闭
requirepass 123456# 当master设置了密码保护时,slave服务连接master的密码
masterauth 123456# 设置主机的 ip+ 端口,来指明主机的redis
replicaof 10.0.20.13 6379# 配置从节点读写权限,支持参数[yes,no],yes:只读 no:支持读写操作,从节点默认yes
replica-read-only yes
3.1.3、准备从节点6381配置文件
- 创建一个目录用来存放节点配置和其它信息
mkdir -p /usr/local/redis/redis-6.2.0/node/6381
- 拷贝一份redis.conf到./node/6381目录中作为主节点配置文件。
cp redis.conf ./node/6381/redis.conf
- 修改几个配置
# 编辑拷贝的配置文件,,修改几个配置信息
vi ./node/6381/redis.conf
# 绑定的主机地址,建议填redis安装服务器的业务私网地址
# 这里为了方便直接找到这个配置注释了
#bind 127.0.0.1 -::1# redis进程的端口号 默认是6379
port 6381# 是否开启保护模式,默认开启。要是配置里没有指定bind和密码,开启该参数后,redis只会本地进行访问,拒绝外部访问,这里关闭保护模式设置为no。
protected-mode no# redis进程是否以守护进程的方式运行,yes为是(后台运行),no为否(不以守护进程的方式运行会占用一个终端,终端关闭redis服务也会关闭)。
daemonize yes# 指定redis进程的PID文件存放位置
pidfile /var/run/redis_6381.pid# log文件输出位置
logfile /usr/local/redis/redis-6.2.0/node/6381/redis.log# 指定持久化存放目录(默认当前启动时所在目录),因为我这里是一台机器部署的要区分开每个节点持久化文件存放的目录
dir /usr/local/redis/redis-6.2.0/node/6381# 设置redis连接密码,如果配置了连接密码,客户端在连接redis是需要通过AUTH<password>命令提供密码,默认关闭
requirepass 123456# 当master设置了密码保护时,slave服务连接master的密码
masterauth 123456# 设置主机的 ip+ 端口,来指明主机的redis
replicaof 10.0.20.13 6379# 配置从节点读写权限,支持参数[yes,no],yes:只读 no:支持读写操作,从节点默认yes
replica-read-only yes
3.2、启动Redis主从复制集群
- 启动Redis
# 携带配置启动主节点6379
./bin/redis-server ./node/6379/redis.conf# 携带配置启动从节点6380
./bin/redis-server ./node/6380/redis.conf
# 携带配置启动从节点6381
./bin/redis-server ./node/6381/redis.conf
- 查看各节点启动状态
# 查看redis进程,这里可以看到启动了三个进程
# 如果有进程没有启动成功可以去每个节点信息存储目录查看日志,分析异常原因
ps -aux | grep redis
3.3、查看Redis集群信息和主从复制效果
- 1、使用Redis自带redis-cli工具连接主节点查看集群信息
# 使用密码连接本机端口号为6379的redis
./bin/redis-cli -p 6379 -a 123456# 查看集群信息
127.0.0.1:6379> info replication
- 2、在主节点写入数据
127.0.0.1:6379> set names kerwin
127.0.0.1:6379> get names
- 3、登录从节点查看集群信息和主节点写入的数据
# 使用密码连接本机端口号为6379的redis
./bin/redis-cli -p 6380 -a 123456# 查看集群信息
127.0.0.1:6380> info replication
# 获取key为names的数据
127.0.0.1:6380> get names
3.4、关闭Redis
# 普通关闭,通过redis-cli的shutdown关闭
./bin/redis-cli -p 6379 -a 123456 shutdown# 强制关闭
## 查看redis的进程pid,通过kill -9强制关闭
ps -aux | grep redis
kill -9 pid
四、搭建Redis三哨兵集群
本文使用一台主机部署,会使用不同端口区分哨兵,分别使用26379、26380、26381。
4.1、准备配置文件
先进入Redis解压目录,后续都在该目录下操作
cd /usr/local/redis/redis-6.2.0
4.1.1、准备节点26379配置文件
- 1、创建一个目录用来存放节点配置和其它信息
mkdir -p /usr/local/redis/redis-6.2.0/sentinel/26379
- 2、拷贝一份sentinel.conf到./sentinel/26379中
cp sentinel.conf ./sentinel/26379/sentinel.conf
- 3、修改几个配置
vi ./sentinel/26379/sentinel.conf
#端口默认为26379。
port 26379# 是否开启保护模式,默认开启。要是配置里没有指定bind和密码,开启该参数后,redis只会本地进行访问,拒绝外部访问,这里关闭保护模式设置为no。
protected-mode no# redis进程是否以守护进程的方式运行,yes为是(后台运行),no为否(不以守护进程的方式运行会占用一个终端,终端关闭redis服务也会关闭)。
daemonize yes#守护进程pid存储文件(默认位置 /var/run/redis-sentinel.pid)
pidfile /var/run/redis-sentinel_26379.pid#日志文件
logfile /usr/local/redis/redis-6.2.0/sentinel/26379/sentinel.log#sentinel工作目录(默认/tmp)
dir /usr/local/redis/redis-6.2.0/sentinel/26379# 指定Redis主节点主机IP地址和端口,ip根据实际情况调整,mymaster这个名称随便取,下面配置时也需要指定这个名称,客户端连接时也会使用
# 最后的2是指需要有2个以上sentinel节点认为redis主节点失效,才是真的失效,一般为(sentinel总数/2+1)
sentinel monitor mymaster 10.0.20.13 6379 2# 配置连接密码,此处的密码需要与 redis.conf里面配置的连接密码一致
sentinel auth-pass mymaster 123456# 这里设置了主机多少毫秒无响应,则认为挂了,,默认:30000毫秒
sentinel down-after-milliseconds mymaster 30000# 主备切换时,最多有多少个slave同时对新的master进行同步,这里设置为默认的1
sentinel parallel-syncs mymaster 1#故障转移的超时时间毫秒,默认:180000毫秒
sentinel failover-timeout mymaster 180000
4.1.2、准备节点26380配置文件
- 1、创建一个目录用来存放节点配置和其它信息
mkdir -p /usr/local/redis/redis-6.2.0/sentinel/26380
- 2、拷贝一份26379的sentinel.conf到./sentinel/26380中,方便修改
cp ./sentinel/26379/sentinel.conf ./sentinel/26380/sentinel.conf
- 3、修改几个配置,这里因为是从26379拷贝过来的只需要修改端口和一些文件存储地址即可
vi ./sentinel/26380/sentinel.conf
#端口默认为26379。
port 26380#守护进程pid存储文件(默认位置 /var/run/redis-sentinel.pid)
pidfile /var/run/redis-sentinel_26380.pid#日志文件
logfile /usr/local/redis/redis-6.2.0/sentinel/26380/sentinel.log#sentinel工作目录(默认/tmp)
dir /usr/local/redis/redis-6.2.0/sentinel/26380
4.1.3、准备节点26381配置文件
- 1、创建一个目录用来存放节点配置和其它信息
mkdir -p /usr/local/redis/redis-6.2.0/sentinel/26381
- 2、拷贝一份26379的sentinel.conf到./sentinel/26381中,方便修改
cp ./sentinel/26379/sentinel.conf ./sentinel/26381/sentinel.conf
- 3、修改几个配置,这里因为是从26379拷贝过来的只需要修改端口和一些文件存储地址即可
vi ./sentinel/26381/sentinel.conf
#端口默认为26379。
port 26381#守护进程pid存储文件(默认位置 /var/run/redis-sentinel.pid)
pidfile /var/run/redis-sentinel_26381.pid#日志文件
logfile /usr/local/redis/redis-6.2.0/sentinel/26381/sentinel.log#sentinel工作目录(默认/tmp)
dir /usr/local/redis/redis-6.2.0/sentinel/26381
4.2、启动sentinel集群
- 启动sentinel
# 携带配置启动哨兵26379节点
./bin/redis-sentinel ./sentinel/26379/sentinel.conf
# 携带配置启动哨兵26380节点
./bin/redis-sentinel ./sentinel/26380/sentinel.conf
# 携带配置启动哨兵26381节点
./bin/redis-sentinel ./sentinel/26381/sentinel.conf
- 查看各节点启动状态
# 查看redis-sentinel进程,这里可以看到启动了三个进程
# 如果有进程没有启动成功可以去每个节点信息存储目录查看日志,分析异常原因
ps -aux | grep redis-sentinel
4.3、查看三个哨兵节点信息
# 使用redis-cli连接哨兵
./bin/redis-cli -p 端口
# 连接上后查看哨兵节点信息
127.0.0.1:26379> info sentinel
可以看到一个master主节点,两个salve节点状态,三个哨兵节点都正常
sentinel集群都启动完毕后,会将哨兵集群的元数据信息写入所有sentinel的配置文件里去(追加在文件的
最下面),可以打开一个查看一下。
vi ./sentinel/26379/sentinel.conf
4.4、测试哨兵容灾切换效果
- 1、模拟主节点宕机
# 通过redis-cli的shutdown关闭Redis主节点
./bin/redis-cli -p 6379 -a 123456 shutdown
# 确认主节点6379进程已经下线
ps -aux | grep redis-server
- 2、查看是否将从节点切换成主节点
# 查看6380和6381主从复制信息
./bin/redis-cli -p 6380 -a 123456 info replication
./bin/redis-cli -p 6381 -a 123456 info replication
这里可以看到主节点6379下线后,哨兵将6381切换成了主节点。
4.5、关闭Redis哨兵
# 普通关闭,通过redis-cli的shutdown关闭
./bin/redis-cli -p 端口号 shutdown# 强制关闭
## 查看redis的进程pid,通过kill -9强制关闭
ps -aux | grep redis-sentinel
kill -9 pid
五、注意事项
5.1、远程连接问题
虽然Redis的配置中都开启了远程连接,但是服务器的端口可能没有开放远程连接,需要将Redis服务和哨兵的端口打开外部才能连接上,或者将防火墙关闭,这里是本地操作,如果是云服务器则需要设置对应安全组。
# 开放指定端口号
firewall-cmd --zone=public --add-port=端口号/tcp --permanent
# 重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
或
#检测防火墙状态 active (running),就是运行状态
systemctl status firewalld
# 停止防火墙
systemctl stop firewalld
# 永久关闭
systemctl disable firewalld
5.2、Redis节点注册到哨兵的IP问题
我们可以查看哨兵中Redis节点的IP,我这里使用的云服务器,哨兵中注册的Redis会使用到内网IP,可以自己ip addr
查看一下,就是我们的内网卡,内网通过这个IP连接是没有问题的,但是外网肯定不能使用这个IP,会使用一个云服务给我们提供的外网IP,如果我们直接连接Redis服务,通过外网加6379端口肯定是没有问题的,但是我们外网别的应用中会通过连接到哨兵,然后通过哨兵获取Redis集群信息,也就是说我们通过哨兵获取到的Redis服务IP是服务器的内网IP,例如我这里获取到master节点IP就会是10.0.20.13
这样一个内网地址,在外部网络是无法访问的。
六、SpringBoot集成Redis主从架构实现读写分离(哨兵模式)
跳转:https://blog.csdn.net/weixin_44606481/article/details/134017117