文章目录
前言
Redis 是C语言开发的一个开源高性能键值对的内存数据库,可以用来做数据库、缓存、消息中间件等场景,是一种NoSQL(not-only sql,非关系型数据库)的数据库。最近项目使用的Redis版本需要升级到最新版本,以修补安全漏洞,搭建了一套主从+哨兵模式的Redis集群,今天就记录一下Redis哨兵模式搭建的过程。
一、Redis主从模式搭建
1.安装包下载
下载地址:
https://redis.io/download/#redis-downloads
当前最新稳定版为:redis-7.0.8,下载下来是一个tar.gz压缩包。
2.安装包路径
/data/hnisi/local/redis-7.0.8
3.解压安装:
tar -zxvf redis-stable.tar.gz
4.进入解压后的目录运行编译命令
cd redis-stable
make && make install
5.进入redis默认安装路径
cd /usr/local/bin
6.新建redis安装目录
mkdir redis-7.0
cd redis-7.0
mkdir bin
mkdir config
在 redis-7.0目录下分别建bin和config两个目录,bin目录存放redis的启动文件,工作区,以及日志信息,config目录专门存放各种配置文件;
7.复制启动文件和配置文件
由于编译安装后的 src 下文件非常多,我们可以将几个常用的命令和 conf 配置文件复制出来进行统一管理,如下:
cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel /usr/local/redis-7.0/bin
cp redis.config /usr/local/redis-7.0/bin/config
cp sentinel.config /usr/local/redis-7.0/bin/config
8.配置conf文件
cd /usr/local/redis-7.0/config
vim redis.config
修改主节点配置文件:
# 绑定的主机地址(填redis安装服务器的业务私网地址)
bind:127.0.0.1
# redis进程的端口号
port:6479
#是否开启保护模式,默认开启。要是配置里没有指定bind和密码,开启该参数后,redis只会本地进行访问,拒绝外部访问。要是开启了密码和bind,可以开启;否则最好关闭设置为no。
protected-mode yes
# redis进程是否以守护进程的方式运行,yes为是(后台运行),no为否(不以守护进程的方式运行会占用一个终端)。
daemonize yes
# log文件输出位置
logfile ./redis.log
# 设置redis连接密码,如果配置了连接密码,客户端在连接redis是需要通过AUTH<password>命令提供密码,默认关闭
requirepass 230216
# 当master设置了密码保护时,slave服务连接master的密码
masterauth 230216
# 指定redis进程的PID文件存放位置
pidfile /var/run/redis_6479.pid
# 指定本地数据库存放目录(默认当前redis安装目录)
dir ./
# 指定本地数据库文件名
dbfilename dump.rdb
# 设置数据库的数量,默认为0可以使用select <dbid>命令在连接上指定数据库id
databases 16
# 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
save 9001
save 30010
save 6010000
(分别表示 900 秒(15 分钟)内有 1 个更改,300 秒(5 分钟)内有 10 个更改以及 60 秒内有 10000 个更改。)
#replica-read-only支持参数[yes,no],no 支持读写操作
replica-read-only no(主节点可读可写)
9.先开启防火墙,开放指定端口6479:
systemctl start firewalld
firewall-cmd --zone=public --add-port=6479/tcp --permanent
10.重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
11.启动主节点redis服务
进入bin目录启动服务:
./redis-server /usr/local/redis-7.0/config/redis.conf
12.查看6479节点信息
./redis-cli -h 173.x.x.x -p 6479
(注意需要输入密码auth password,否则提示NOAUTH Authentication required.)
输入密码:
auth 230216
查看节点信息:
info replication
exit退出
13.配置从节点
(1)修改从节点配置文件redis01.conf:
# 绑定的主机地址(ip换成自己机器的地址)
bind:127.0.0.1
# redis进程的端口号
port 6480
#是否开启保护模式,默认开启。要是配置里没有指定bind和密码,开启该参数后,redis只会本地进行访问,拒绝外部访问。要是开启了密码和bind,可以开启;否则最好关闭设置为no。
protected-mode yes
# redis进程是否以守护进程的方式运行,yes为是(后台运行),no为否(不以守护进程的方式运行会占用一个终端)。
daemonize yes
# log文件输出位置
logfile ./redis.log
# 设置redis连接密码,如果配置了连接密码,客户端在连接redis是需要通过AUTH<password>命令提供密码,默认关闭
requirepass 230216
# 当master设置了密码保护时,slave服务连接master的密码
masterauth 230216
# 指定redis进程的PID文件存放位置
pidfile /var/run/redis_6480.pid
# 指定本地数据库存放目录(默认当前redis安装目录)
dir ./
# 指定本地数据库文件名
dbfilename dump01.rdb
# 设置数据库的数量,默认为0可以使用select <dbid>命令在连接上指定数据库id
databases 16
# 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
save 9001
save 30010
save 6010000
(分别表示 900 秒(15 分钟)内有 1 个更改,300 秒(5 分钟)内有 10 个更改以及 60 秒内有 10000 个更改。)
#replica-read-only支持参数[yes,no],no 支持读写操作
replica-read-only yes
#设置主机的 ip+ 端口,来指明主机的redis
replicaof 173.x.x.x 6479 (从节点需要额外设置的参数)
(2)修改从节点配置文件redis02.conf:
参考redis01.conf配置文件,修改端口号信息即可:
# 绑定的主机地址(ip换成自己机器的地址)
bind:127.0.0.1
# redis进程的端口号
port 6481
#是否开启保护模式,默认开启。要是配置里没有指定bind和密码,开启该参数后,redis只会本地进行访问,拒绝外部访问。要是开启了密码和bind,可以开启;否则最好关闭设置为no。
protected-mode yes
# redis进程是否以守护进程的方式运行,yes为是(后台运行),no为否(不以守护进程的方式运行会占用一个终端)。
daemonize yes
# log文件输出位置
logfile ./redis.log
# 设置redis连接密码,如果配置了连接密码,客户端在连接redis是需要通过AUTH<password>命令提供密码,默认关闭
requirepass 230216
# 当master设置了密码保护时,slave服务连接master的密码
masterauth 230216
# 指定redis进程的PID文件存放位置
pidfile /var/run/redis_6481.pid
# 指定本地数据库存放目录(默认当前redis安装目录)
dir ./
# 指定本地数据库文件名
dbfilename dump02.rdb
# 设置数据库的数量,默认为0可以使用select <dbid>命令在连接上指定数据库id
databases 16
# 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
save 9001
save 30010
save 6010000
(分别表示 900 秒(15 分钟)内有 1 个更改,300 秒(5 分钟)内有 10 个更改以及 60 秒内有 10000 个更改。)
#replica-read-only支持参数[yes,no],no 支持读写操作
replica-read-only yes
#设置主机的 ip+ 端口,来指明主机的redis
replicaof 127.0.0.16479 (从节点需要额外设置的参数,ip换成自己机器的地址)
(3)开放指定端口号
firewall-cmd --zone=public --add-port=6480/tcp --permanent
firewall-cmd --zone=public --add-port=6481/tcp --permanent
(4)重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
(5)启动两个从节点
./redis-server /usr/local/redis-7.0/config/redis01.conf
./redis-server /usr/local/redis-7.0/config/redis02.conf
ps:这里我是一台服务器起一主两从三个节点,所以用了三个端口号来区分服务,如果三台机器来做主从搭建,配置文件就可以用同一个端口号。
14.查看三个redis节点信息
可以看到一个master节点,两个slave节点。
15、主从数据同步验证
接下来我们在主机(master)添加几条数据,看从机(slave)是否可以获取到,如果能获取,说明数据已经同步到了从机,主机添加数据,如下:
16.关闭redis服务
进入6479节点redis客户端:
./redis-cli -h 173.x.x.x -p 6479
shutdown
二、Redis哨兵集群搭建
1.进入到config目录下:
cd /usr/local/redis-7.0/config/
2.修改第一个哨兵节点的配置文件:
vim sentinel.conf
#端口默认为26379。
port:26479
#关闭保护模式,可以外部访问
protected-mode:no
#设置为后台启动
daemonize:yes
#日志文件
logfile:./sentinel-26479.log
#指定主机IP地址和端口,并且指定当有2台哨兵认为主机挂了,则对主机进行容灾切换
sentinel monitor mymaster 173.x.x.x 64792
#当在Redis实例中开启了requirepass,这里就需要提供密码
sentinel auth-pass mymaster 230216
#这里设置了主机多少秒无响应,则认为挂了
sentinel down-after-milliseconds mymaster 3000
#主备切换时,最多有多少个slave同时对新的master进行同步,这里设置为默认的1
sentinel parallel-syncs mymaster 1
#故障转移的超时时间,这里设置为三分钟
sentinel failover-timeout mymaster 180000
#sentinel工作目录(默认/tmp)
dir ./sentinel-work-26479
#守护进程pid存储文件(默认位置 /var/run/redis-sentinel.pid)
pidfile /var/run/redis-sentinel_26479.pid
# 当在Redis实例中开启了requirepass,所有连接Redis实例的客户端都要提供密码
# sentinel auth-pass <master-name><password>
sentinel auth-pass mymaster 230216
剩下两个sentinel节点配置改改端口号,日志文件名称,工作目录名称就好了,其他和上边第一个节点配置一样,不在赘述。
ps:
如果是三台机器分布式部署三个sentinel节点,就直接复制sentinel.conf文件在另外两台机器启动服务就好了,不用修改端口号,也无需区分工作目录和日志文件。我这里是在一台机器启动三个节点,所以做了端口号的区分!!!
3.防火墙设置
#开放端口
firewall-cmd --add-port=26479/tcp --permanent --zone=public
firewall-cmd --add-port=26480/tcp --permanent --zone=public
firewall-cmd --add-port=26481/tcp --permanent --zone=public
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
4.创建sentinel工作空间目录
cd /usr/local/redis-7.0/bin
创建三个工作目录:
mkdir sentinel-work-26479
mkdir sentinel-work-26480
mkdir sentinel-work-26481
5.启动三个哨兵
./redis-sentinel /usr/local/redis-7.0/config/sentinel.conf
./redis-sentinel /usr/local/redis-7.0/config/sentinel01.conf
./redis-sentinel /usr/local/redis-7.0/config/sentinel02.conf
6.查看三个哨兵节点信息
./redis-cli -p 26479
info sentinel
可以看到一个master主节点,两个salve节点状态,三个哨兵节点都正常。
7.容灾切换验证
先模拟主机宕机,将主机 redis 服务关闭,进入6479节点redis客户端:
./redis-cli -h 173.x.x.x -p 6479
auth 230216
shutdown
或者使用命令: redis-cli -h host -p port -a password #redis-cli –h IP地址 –p 端口 –a 密码
可以看到6479节点已下线,服务无法连接到;同时连接6480节点redis客户端,发现6480从节点已成为新的主节点,6481是主节点6480的从节点,主从切换成功。
再次启动6479节点,发现该节点已成为节点6480的从节点:
三.springBoot整合Redis哨兵模式
1.引入redis依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
2.yml配置文件
spring:
redis:
#----------redis 一主二从哨兵模式 start--------------#
sentinel:
master: mymaster
#哨兵ip地址和端口
nodes:173.xx.xx.xx:26479,173.xx.xx.xx:26480,173.xx.xx.xx:26481
#哨兵密码
password:230216
#redis认证密码
password:230216
#连接超时时间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
总结
可以看到,当主机6479挂了的时候,一直连接主机被拒绝,当哨兵选举6480为新的主机后,它成功执行重写了配置文件,并且连接了其他从机。至此,主从+哨兵的集群架构搭建完毕。
版权归原作者 通道已损坏 所有, 如有侵权,请联系我们删除。