Redis安装,主从复制、哨兵模式、集群

浅浅的记录下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 监听端口,默认端口为 6379
port 6379  

#设置tcp的backlog,backlog其实是一个连接队列,backlog队列总和=未完成三次握手队列 + 已经完成三次握手队列。默认为511
tcp-backlog 511

#一个空闲的客户端维持多少秒关闭。0表示永不关闭
timeout 0

#对访问客户端的心跳检测,每n秒检测一次,默认为300
tcp-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,默认为notice
loglevel notice

#日志名称,指定日志文件目录,默认是logfile"",表示只在标准控制台输出
logfile ""

#数据库db数量数量,默认为16
databases 16

#是否显示logo
always-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 #主从复制下,优先级,哨兵模式:主机宕机,从机优先级数低的优先级低的,更适合升级为主机,默认为100 replica-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 0 notify-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 0 set-max-intset-entries 512 zset-max-listpack-entries 128 zset-max-listpack-value 64 hll-sparse-max-bytes 3000 stream-node-max-bytes 4kb stream-node-max-entries 100 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit replica 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 dynamic-hz yes aof-rewrite-incremental-fsync yes rdb-save-incremental-fsync yes jemalloc-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 <主机ip> <端口>

修改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 no
port 26379
daemonize yes
pidfile "/var/run/redis-sentinel.pid"
logfile "/usr/local/redis7/redis-stable/sentinel.log"

# 主节点的ip
sentinel announce-ip "127.0.0.1"

# 哨兵的端口
sentinel announce-port 23679

# 哨兵的工作目录
dir "/usr/local/redis7/redis-stable"

# 哨兵监听的master数据库,1表示选举数,这里master ip 为主机外网ip地址
sentinel monitor mymaster <master ip> 6379 1

# 配置master的登录密码
sentinel auth-pass mymaster lin789.

# 10s内无响应,则认为master挂掉
sentinel down-after-milliseconds mymaster 10000
acllog-max-len 128

#保持默认配置
sentinel deny-scripts-reconfig yes
sentinel resolve-hostnames no
sentinel 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}
do
cp /usr/local/redis7/redis-stable/redis.conf /usr/local/redis7/cluster/redis600$i
cp /usr/local/redis7/redis-stable/bin/redis-cli  /usr/local/redis7/redis-stable/bin/redis-server /usr/local/redis7/cluster/redis600$i
done

修改/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}
do
cd /usr/local/redis7/cluster/redis600$d
redis-server redis.conf
done

回到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  <外网ip>:6001 <外网ip>:6002 <外网ip>:6003 <外网ip>:6004 <外网ip>:6005 <外网ip>: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 --哈希槽分配异常

 

热门相关:首席的独宠新娘   豪门重生盛世闲女   法医王妃不好当!   法医娇宠,扑倒傲娇王爷   无限杀路