浅浅的记录下Redis安装、主从、哨兵、集群。搭建笔记

一.Redis下载安装

系统环境

  • redis版本:7.0.11
  • linux版本:CentOS Linux release 8.2.2004 (Core)
  • 官网下载地址:https://redis.io/download/

一些安装命令,按照步骤执行

cd /usr/local –redis相关文件将会安装到此目录下

mkdir redis7–创建redis文件目录

wget wget https://download.redis.io/redis-stable.tar.gz–下载最新稳定版本redis,这里下载版本为7.0.11

tar -zxvf redis-stable.tar.gz–解压下载好的redis压缩包

cd redis-stable –进入到安装包目录里

make PREFIX=/usr/local/redis7/redis-stable install –使用make命令进行编译操作

备注:这里多了一个关键字 PREFIX= 这个关键字的作用是编译的时候用于指定程序存放的路径。比如我们现在就是指定了redis必须存放在/usr/local/redis7目录。假设不添加该关键字Linux会将可执行文件存放在/usr/local/bin目录,
库文件会存放在/usr/local/lib目录。配置文件会存放在/usr/local/etc目录。其他的资源文件会存放在usr/local/share目录。这里指定号目录也方便后续的卸载,后续直接rm -rf/usr/local/redis7 即可删除redis。

设置环境变量

sudo cp /usr/local/redis7/redis-stable/bin/redis-cli /usr/local/bin

sudo cp /usr/local/redis7/redis-stable/bin/redis-server /usr/local/bin

sudo cp /usr/local/redis7/redis-stable/bin/redis-sentinel/usr/local/bin

至此下载安装完毕,启动redis

redis-server& /usr/local/redis7/redis-stable/redis.conf –这里加入& 符号,进行后台启动

二.redis.conf文件的一些基本配置

daemonize –表示启用守护进程,默认是no,开启时redis将以后台服务的形式运行。

requirepass –认证密码

port –监听端口,默认为6379

database –设置数据库的db数量

bind –绑定的主机,bind=127.0.0.1只能接受本机的访问请求,不写的情况下,无限制接受任何ip地址的访问

protected-mode –保护模式:可选项值yes或者no。该模式控制外部网是否可以连接redis服务,默认是yes,所以默认我们外网是无法访问的,如需外网连接rendis服务则需要将此属性改为no。

maxclient –设置同一时间最大客户端连接数,默认无限制,Redis 可以同时打开的客户端连接数为 Redis 进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis 会关闭新的连接并向客户端返回 max number of clients reached 错误信息。

dir –数据库rdb文件存放路径,默认为./ ,即和当前redis.config文件同一目录下

dbfilename –指定数据库文件名

删除默认注释行后的redis.config 文件

使用命令sed -i -e ‘/#/d;/^$/d’ redis.conf

#绑定的主机,bind=127.0.0.1只能接受本机的访问请求,不写的情况下,无限制接受任何ip地址的访问bind *   #保护模式:可选项值yes或者no。该模式控制外部网是否可以连接redis服务,默认是yes,所以默认我们外网是无法访问的,如需外网连接rendis服务则需要将此属性改为no。protected-mode yes#指定 Redis 监听端口,默认端口为 6379port 6379  #设置tcp的backlog,backlog其实是一个连接队列,backlog队列总和=未完成三次握手队列 + 已经完成三次握手队列。默认为511tcp-backlog 511#一个空闲的客户端维持多少秒关闭。0表示永不关闭timeout 0#对访问客户端的心跳检测,每n秒检测一次,默认为300tcp-keepalive 300#表示启用守护进程,默认是no,开启yes时redis将以后台服务的形式运行。daemonize yes#当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定pidfile "/var/run/redis_6379.pid"#日志等级,Redis总共支持四个级别:debug、verbose、notice、warning,默认为noticeloglevel notice#日志名称,指定日志文件目录,默认是logfile"",表示只在标准控制台输出logfile ""#数据库db数量数量,默认为16databases 16#是否显示logoalways-show-logo no#默认情况下,Redis 会修改进程标题(如“top”和“ps”所示)以提供一些运行时信息。 可以通过将以下设置为 no 来禁用它并使进程名称保持为已执行状态。set-proc-title yes#在更改进程标题时,Redis 使用以下模板来构造修改后的标题。#模板变量在大括号中指定。 支持以下变量:#{title} 父进程执行的进程名称,或子进程的类型。#{listen-addr} 绑定地址或 ‘*’ 后跟 TCP 或 TLS 端口侦听,或 Unix 套接字(如果可用)。#{server-mode} 特殊模式,即“[sentinel]”或“[cluster]”。#{port} TCP 端口监听,或 0。#{tls-port} TLS 端口监听,或 0。#{unixsocket} 监听的 Unix 域套接字,或 “”。#{config-file} 使用的配置文件的名称。proc-title-template "{title} {listen-addr} {server-mode}"#持久化是出错了,是否继续工作stop-writes-on-bgsave-error yes#是否压缩rdb文件rdbcompression yes#保存rdb文件时,是否进行错误的校验rdbchecksum yes#存的rdb文件名称dbfilename "dump.rdb"#Redis主从全量同步时,通过RDB文件传输实现。如果没有开启持久化,同步完成后,是否要移除主从同步的RDB文件,默认为no。rdb-del-sync-files no
#存的rdb文件位置dir "/usr/local/redis7/redis-stable"#当一个slave失去和master的连接,或者同步正在进行中,slave的行为有两种可能:#1) 如果 replica-serve-stale-data 设置为 "yes" (默认值),slave会继续响应客户端请求,可能是正常数据,也可能是还没获得值的空数据#2) 如果 replica-serve-stale-data 设置为 "no",slave会回复"正在从master同步(SYNC with master in progress)"来处理各种请求,除了 INFO 和 SLAVEOF 命令replica-serve-stale-data yes#你可以配置salve实例是否接受写操作。可写的slave实例可能对存储临时数据比较有用(因为写入salve# 的数据在同master同步之后将很容被删除),但是如果客户端由于配置错误在写入时也可能产生一些问题。#从Redis2.6默认所有的slave为只读#注意:只读的slave不是为了暴露给互联网上不可信的客户端而设计的。它只是一个防止实例误用的保护层#一个只读的slave支持所有的管理命令比如config,debug等。为了限制你可以用'rename-command'来隐藏所有的管理和危险命令来增强只读slave的安全性replica-read-only yes#同步策略: 磁盘或socket,默认yes磁盘方式repl-diskless-sync yes#如果非磁盘同步方式开启,可以配置同步延迟时间,以等待master产生子进程通过socket传输RDB数据给slave#默认为5秒,如果配置为0,表示同步无延迟repl-diskless-sync-delay 5#非磁盘复制时,可以设置延迟#当启用无磁在达到最大延迟之前开始复制期望已连接的副本数。默认值为0表示等待最大延迟repl-diskless-sync-max-replicas 0#不使用无磁盘加载repl-diskless-load disabled#在slave和master同步后(发送psync/sync),后续的同步是否设置成TCP_NODELAY#假如设置成yes,则redis会合并小的TCP包从而节省带宽,但会增加同步延迟(40ms),造成master与slave数据不一致#假如设置成no,则redis master会立即发送同步数据,没有延迟repl-disable-tcp-nodelay no#主从复制下,优先级,哨兵模式:主机宕机,从机优先级数低的优先级低的,更适合升级为主机,默认为100replica-priority 100#acl日志,用于记录失败或者阻塞的命令,定义acl最大表项长度acllog-max-len 128#采用UNLINK命令,删除key时,提供异步延时释放,key内存的功能lazyfree-lazy-eviction no#针对设置有TTL的键,达到过期后,被redis清理删除时是否采用lazy free机制lazyfree-lazy-expire no#针对有些指令在处理已存在的键时,会带有一个隐式的DEL键的操作。如rename命令,当目标键已存在,redis会先删除目标键,如果这些目标键是一个big key,那就会引入阻塞删除的性能问题。 此参数设置就是解决这类问题,建议可开启。lazyfree-lazy-server-del no#针对slave进行全量数据同步,slave在加载master的RDB文件前,会运行flushall来清理自己的数据场景,#参数设置决定是否采用异常flush机制。如果内存变动不大,建议可开启。可减少全量同步耗时,从而减少主库因输出缓冲区爆涨引起的内存使用增长。replica-lazy-flush no#修改用户的del行为操作,像unlink命令一样lazyfree-lazy-user-del no#FLUSHDB, FLUSHALL, SCRIPT FLUSH和FUNCTION FLUSH支持异步和同步,删除时,delete 将[SYNC|ASYNC]标志传递到相应命令,如果命令都未通过,开启此命令,用于异步删除lazyfree-lazy-user-flush no#oom-score-adj参数指定Linux内核在内存不足时OOM杀死哪些进程,可选值有:yes、no,absolute。 默认值为 no 不更改oom-score-adj的值。#yes 值是由服务器启动时oom-score-agj的初始值定义的,取值范围为-1000到1000,通常是0。#absolute 值将oom-score-adj-values参数值写入到linux内核中,也就是按oom-score-adj-values参数值设定oom-score-adj no#三个数值分别代表主进程、副本进程、子进程,数值越高代表被杀死的优先级更高oom-score-adj-values 0 200 800#disable-thp参数指定是否禁用透明大页,默认值为yes,表示禁用透明大页。#通常透明大页默认会被设置为“madvise”或“never”,在这种情况下该参数不会起任何作用。只有当透明大页设置为“always”时,redis默认会禁用透明大页,以避免透明大页带来的延迟问题。disable-thp yes#是否开启aof持久化,如果开启,在redis启动时,将加载aof文件appendonly no #aof持久化后,存储的文件名称appendfilename "appendonly.aof"#aof持久化后,存储的文件路径appenddirname "appendonlydir"#appendfsync参数指定将数据写入(fsync)到磁盘的方式,取值有以下三种:#no 不同步,让操作系统在需要时才刷新数据,非常快。#always 每次写入AOF日志后同步,缓慢但是安全。 #everysec 每秒同步一次。appendfsync everysec#no-appendfsync-on-rewrite参数指定是否在BGSAVE或BGREWRITEAOF阶段时调用fsync,默认值为“no”。#在appendfsync参数设定成“always”或“everysec”,并且后台保存进程(后台保存进程和AOF日志重写)正在对磁盘执行大量I/O时,redis可能会阻塞很长时间的fsync。#目前redis是没有解决此问题的方法的。因此,在遇到延迟问题时,可以将该值设置为“yes”,但这就意味着在最坏的情况下可能会丢失超过30秒的日志。no-appendfsync-on-rewrite no#auto-aof-rewrite-percentage参数指定自动重写AOF文件触发的百分比,指定百分比为0,则表示禁用自动重写AOF文件。#redis能够在AOF日志文件增加到指定的百分比时,自动重写调用BGREWRITEAOF的日志文件。它的工作原理是这样:redis会记录最后一次重写后AOF文件的大小(如果重启后没有发生重写,则使用启用时AOF的大小),#此大小与当前的大小比较,如果当前大小大于指定的百分比的话,则触发重写。auto-aof-rewrite-percentage 100#参数指定触发重写AOF文件的最小大小auto-aof-rewrite-min-size 64mb#aof-load-truncated参数指定redis启动遇到AOF文件被截断时是否继续加载。取值可能为:#yes reids启动时加载截断的AOF文件,并会打印日志通知用户该事件。#no redis启动时因错误拒绝启动,此时就需要用户手动使用“redis-check-aof”修复AOF文件。aof-load-truncated yes#参数指定在重写AOF文件时,是否使用RDB前导码,以便更快的进行重写和恢复。启用后,重写的AOF文件由两个不同的部分组成:[RDB 文件] [AOF 尾部]。在加载时,redis会先识别AOF文件以“redis”字符串开头并加载前缀RDB文件,然后继续加载AOF尾部。aof-use-rdb-preamble yes#是否在aof日志中记录时间戳aof-timestamp-enabled no#参数指定命令执行多久会记录到慢日志中,以微秒为单位。设置为负数表示禁用慢日志记录,设置为0会强制记录所有命令slowlog-log-slower-than 10000#参数指定慢日志的最大长度,需要注意的是,它会消耗内存slowlog-max-len 128#参数指定是否开启延迟监控子系统,默认情况下是禁用的#通常情况下不需要开启,只有遇到有延迟问题时,才建议开启,开启后会对性能有较小的影响latency-monitor-threshold 0notify-keyspace-events ""#指定哈希以内存高效的数据结构编码的最大数量,超过该值就不会再以高效的数据结构进行编码。hash-max-listpack-entries 512#指定以哈希以内存高效的数据结构编码的最大哈希大小,超过该值就不会再以高效的数据结构进行编码。hash-max-listpack-value 64#指定列表以一种特殊的方式编码,以节省大量空间。该参数可选以下值:#-5 最大大小:64Kb,不推荐用于正常工作负载中#-4 最大大小:32Kb,不推荐#-3 最大大小:16Kb,可能不推荐#-2 最大大小:8Kb,好#-1 最大大小:4Kb,好list-max-listpack-size -2#参数指定列表压缩的深度,该参数可选以下值:#0 禁用列表压缩#1 列表不压缩头和尾,压缩中间部分。例如有这样一个列表:[head] -> node -> node -> … -> node -> [tail],不会压缩列表的head和tail,只会压缩中间node部分。#2 列表不压缩头、下一个、尾和尾的上一个。例如有这样一个列表:[head] -> [next] -> node -> node -> … ->[prev] -> [tail],不会压缩head、next、prev和tail,只会压缩中间node部分。#3 列表不压缩头和尾开始的三个值,例如这样的列表:[head] -> [next] -> [next] -> node -> node -> … ->[prev] -> [prev] -> [tail]#3 列表不压缩头和尾开始的三个值,例如这样的列表:[head] -> [next] -> [next] -> node -> node -> … ->[prev] -> [prev] -> [tail]list-compress-depth 0set-max-intset-entries 512zset-max-listpack-entries 128zset-max-listpack-value 64hll-sparse-max-bytes 3000stream-node-max-bytes 4kbstream-node-max-entries 100activerehashing yesclient-output-buffer-limit normal 0 0 0client-output-buffer-limit replica 256mb 64mb 60client-output-buffer-limit pubsub 32mb 8mb 60hz 10dynamic-hz yesaof-rewrite-incremental-fsync yesrdb-save-incremental-fsync yesjemalloc-bg-thread yes#认证密码requirepass "lin789."

三.主从复制

复制redis.conf,分别取名slave_1.conf、slave_2.conf

cp /usr/local/redis7/redis-stable/redis.conf/usr/local/redis7/redis-stable/slave_1.conf

cp /usr/local/redis7/redis-stable/redis.conf/usr/local/redis7/redis-stable/slave_2.conf

修改slave_1.conf文件,除涉及端口外属性,其他保持一致。最后一步需要加上同步的主机的ip和端口

#监听端口
port 6378
#redis认证密码requirepass "lin789."
#主机认证密码masterauth "lin789."
#工作目录dir "/usr/local/redis7/redis-stable"
#rdb文件名称dbfilename "slave_1.rdb"
#pidfile文件名称pidfile "/var/run/redis_6378.pid"

#需要同步的主机ip、端口
replicaof

修改slave_2.conf文件,操作步骤同上

分别以配置文件redis.conf、slave_1.conf、slave_2.conf 启动redis服务

cd /usr/local/redis7/redis-stable

redis-server redis.conf

redis-server slave_1.conf

redis-server slave_2.conf

进入到端口为6379的redis服务里

使用命令 redis-cli -p 6379 -a lin789.

使用命令查看集群状态 info replicaion

四、哨兵模式

备注:这里哨兵服务只启用了一个,所以选举是1

进入到目录下

cd /usr/local/redis7/redis-stable

编辑sentinel.conf文件

vim sentienl.conf

如下:

protected-mode noport 26379daemonize yespidfile "/var/run/redis-sentinel.pid"logfile "/usr/local/redis7/redis-stable/sentinel.log"# 主节点的ipsentinel announce-ip "127.0.0.1"# 哨兵的端口sentinel announce-port 23679# 哨兵的工作目录dir "/usr/local/redis7/redis-stable"# 哨兵监听的master数据库,1表示选举数,这里master ip 为主机外网ip地址sentinel monitor mymaster  6379 1# 配置master的登录密码sentinel auth-pass mymaster lin789.# 10s内无响应,则认为master挂掉sentinel down-after-milliseconds mymaster 10000acllog-max-len 128#保持默认配置sentinel deny-scripts-reconfig yessentinel resolve-hostnames nosentinel announce-hostnames no

编辑完毕后保存退出,使用命令:wq

使用命令开启哨兵模式

redis-sentinel sentinel.conf

截止目前开启 redis 开启的相关服务

ps -aux|grep redis

根据配置文件的端口号,进入哨兵服务

redis-cli -p 26379 –登录哨兵

sentinel master mymaster–哨兵监听的master信息

sentinel replicas mymaster –查看master下的slave 信息

五、集群模式

cd/usr/local/redis7–进入到redis7目录

mkdir cluster –新建cluster文件夹

cd cluster –进入到cluster 文件下,创建如下6个文件夹,用于存放redis集群配置文件

回到redis7目录下,创建redis.sh命令文件,用于复制redis.conf、redis-cli 、redis-server 文件到刚才创建目录中。内容如下:

for i in {1..6}docp /usr/local/redis7/redis-stable/redis.conf /usr/local/redis7/cluster/redis600$icp /usr/local/redis7/redis-stable/bin/redis-cli  /usr/local/redis7/redis-stable/bin/redis-server /usr/local/redis7/cluster/redis600$idone

修改/usr/local/redis7/cluster/redis6001目录下 redis.conf 文件,如下

#注释掉bind项或不修改默认监听所有网卡
bind 10.0.8.12

#修改,关闭保护模式
protected-mode no

#监听端口
port 6001

#开启守护进程,以独立进程启动
daemonize yes

#开启集群模式
cluster-enabled yes

#取消注释,群集名称文件设置
cluster-config-file nodes-6001.conf

#群集超时时间设置
cluster-node-timeout 15000

#数据库名称
dbfilename “dump6001.rdb”

#工作目录
dir “/usr/local/redis7/cluster/redis6001”

#访问密码
requirepass lin789.

#访问的主机密码
masterauth lin789.

#声明的外网ip,这里注意是外网地址,否则连接集群时拒绝
cluster-announce-ip 外网ip地址

依次修改6002~6006文件夹下的redis.conf文件配置。(除端口属性外,其他属性配置相同)

回到redis7目录下,创建redis.start命令文件,用于启动 6001~6006 端口的6个redis服务。内容如下:

for d in {1..6}docd /usr/local/redis7/cluster/redis600$dredis-server redis.confdone

回到redis7目录下, 使用shell命令,启动redis集群

sh -x redis_start.sh

启动后服务如下:

使用命令创建集群

redis-cli –cluster create –cluster-replicas 1 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006-a lin789.

备注:这里127.0.0.1 实际部署时需要换成外网ip,cluster-replicas 1表示主机器最少需要1从,这里6个redis服务,3主3从

firewall-cmd –add-port=6001/tcp –add-port=6002/tcp –add-port=6003/tcp –add-port=6004/tcp –add-port=6005/tcp –add-port=6006/tcp –开启防火墙端口

firewall-cmd –add-port=16001/tcp –add-port=16002/tcp –add-port=16003/tcp –add-port=16004/tcp –add-port=16005/tcp –add-port=16006/tcp –开启redis总线端口

redis-cli -h 10.0.8.12 -p 6001 -c -a lin789. –进入到端口为6001服务里

cluster info –查看集群信息

cluster nodes –查看集群节点信息

六、一些问题记录

1.哨兵模式开启,后模拟主机服务宕机,主从无法切换问题,报错:Next failover delay: I will not start a failover before

解决方案两种情况:a.如果是单机下搭建的主从模式,可以修改从机conf配置文件,replicaof 127.0.0.1 + 主机端口

b.开放防火墙端口,以及云服务器防火墙端口

2.单机搭建的集群模式下,进入redis后台模式,操作redis命令没有问题,外网连接集群时,访问拒绝或超时

解决方案:创建集群时直接用外网ip:redis-cli –cluster create –cluster-replicas 1 :6001 :6002 :6003 :6004 :6005 :6006-a lin789.

依次打开redis防火墙总线端口号16001(6001+10000)

依次修改对应redis节点下的,redis.confg文件中cluster-announce-ip 属性为外网ip

七、参考的一些博客链接

redis基本安装和一些配置
https://www.cnblogs.com/AllWjw/p/15771097.html –redis 安装
https://www.cnblogs.com/AllWjw/p/15771097.html –redis 安装
https://blog.csdn.net/weixin_45522528/article/details/126636808 –redis.conf一些说明
https://bxbdba.com/archives/redisredisconf%E8%AF%A6%E8%A7%A3 –redis.config 说明
https://blog.csdn.net/weixin_52270081/article/details/120564024 –linux 命令删除配置行

主从复制
https://blog.csdn.net/weixin_40980639/article/details/125569460 –主从模式

哨兵模式
https://blog.csdn.net/ycx987/article/details/128517285
https://blog.csdn.net/FlyLikeButterfly/article/details/120780277
https://blog.csdn.net/MssGuo/article/details/127163216 –哨兵模式
https://blog.csdn.net/m0_51426055/article/details/129224592 –哨兵模式的启动与关闭

集群模式
https://www.cnblogs.com/cjsblog/p/9048545.html — 集群模式
https://www.cnblogs.com/wzh2010/p/15886799.html –集群模式的一些概念原理
https://www.lmlphp.com/user/58834/article/item/815649/
https://blog.csdn.net/m0_59092234/article/details/126596703 –redis集群一些增容和缩容方法,springboot整合redis集群
https://cloud.tencent.com/developer/article/1919678 –哈希槽分配异常