浅浅的记录下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<br>
- #存的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和端口- #监听端口<br>port 6378
- <br>#redis认证密码
- requirepass "lin789."
- <br>#主机认证密码
- masterauth "lin789."
- <br>#工作目录
- dir "/usr/local/redis7/redis-stable"
- <br>#rdb文件名称
- dbfilename "slave_1.rdb"
- <br>#pidfile文件名称
- pidfile "/var/run/redis_6378.pid"<br><br>#需要同步的主机ip、端口<br>replicaof <主机ip> <端口><br><br>
复制代码 修改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 :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 --哈希槽分配异常
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |