ToB企服应用市场:ToB评测及商务社交产业平台
标题:
Redis安装,主从复制、哨兵模式、集群
[打印本页]
作者:
麻花痒
时间:
2023-5-22 13:43
标题:
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<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 --哈希槽分配异常
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4