ToB企服应用市场:ToB评测及商务社交产业平台

标题: Redis安装,主从复制、哨兵模式、集群 [打印本页]

作者: 麻花痒    时间: 2023-5-22 13:43
标题: Redis安装,主从复制、哨兵模式、集群
浅浅的记录下Redis安装、主从、哨兵、集群。搭建笔记
一.Redis下载安装
系统环境
一些安装命令,按照步骤执行
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
  1. #绑定的主机,bind=127.0.0.1只能接受本机的访问请求,不写的情况下,无限制接受任何ip地址的访问
  2. bind *   
  3. #保护模式:可选项值yes或者no。该模式控制外部网是否可以连接redis服务,默认是yes,所以默认我们外网是无法访问的,如需外网连接rendis服务则需要将此属性改为no。
  4. protected-mode yes
  5. #指定 Redis 监听端口,默认端口为 6379
  6. port 6379  
  7. #设置tcp的backlog,backlog其实是一个连接队列,backlog队列总和=未完成三次握手队列 + 已经完成三次握手队列。默认为511
  8. tcp-backlog 511
  9. #一个空闲的客户端维持多少秒关闭。0表示永不关闭
  10. timeout 0
  11. #对访问客户端的心跳检测,每n秒检测一次,默认为300
  12. tcp-keepalive 300
  13. #表示启用守护进程,默认是no,开启yes时redis将以后台服务的形式运行。
  14. daemonize yes
  15. #当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
  16. pidfile "/var/run/redis_6379.pid"
  17. #日志等级,Redis总共支持四个级别:debug、verbose、notice、warning,默认为notice
  18. loglevel notice
  19. #日志名称,指定日志文件目录,默认是logfile"",表示只在标准控制台输出
  20. logfile ""
  21. #数据库db数量数量,默认为16
  22. databases 16
  23. #是否显示logo
  24. always-show-logo no
  25. #默认情况下,Redis 会修改进程标题(如“top”和“ps”所示)以提供一些运行时信息。 可以通过将以下设置为 no 来禁用它并使进程名称保持为已执行状态。
  26. set-proc-title yes
  27. #在更改进程标题时,Redis 使用以下模板来构造修改后的标题。
  28. #模板变量在大括号中指定。 支持以下变量:
  29. #{title} 父进程执行的进程名称,或子进程的类型。
  30. #{listen-addr} 绑定地址或 ‘*’ 后跟 TCP 或 TLS 端口侦听,或 Unix 套接字(如果可用)。
  31. #{server-mode} 特殊模式,即“[sentinel]”或“[cluster]”。
  32. #{port} TCP 端口监听,或 0。
  33. #{tls-port} TLS 端口监听,或 0。
  34. #{unixsocket} 监听的 Unix 域套接字,或 “”。
  35. #{config-file} 使用的配置文件的名称。
  36. proc-title-template "{title} {listen-addr} {server-mode}"
  37. #持久化是出错了,是否继续工作
  38. stop-writes-on-bgsave-error yes
  39. #是否压缩rdb文件
  40. rdbcompression yes
  41. #保存rdb文件时,是否进行错误的校验
  42. rdbchecksum yes
  43. #存的rdb文件名称
  44. dbfilename "dump.rdb"
  45. #Redis主从全量同步时,通过RDB文件传输实现。如果没有开启持久化,同步完成后,是否要移除主从同步的RDB文件,默认为no。
  46. rdb-del-sync-files no<br>
  47. #存的rdb文件位置
  48. dir "/usr/local/redis7/redis-stable"
  49. #当一个slave失去和master的连接,或者同步正在进行中,slave的行为有两种可能:
  50. #1) 如果 replica-serve-stale-data 设置为 "yes" (默认值),slave会继续响应客户端请求,可能是正常数据,也可能是还没获得值的空数据
  51. #2) 如果 replica-serve-stale-data 设置为 "no",slave会回复"正在从master同步(SYNC with master in progress)"来处理各种请求,除了 INFO 和 SLAVEOF 命令
  52. replica-serve-stale-data yes
  53. #你可以配置salve实例是否接受写操作。可写的slave实例可能对存储临时数据比较有用(因为写入salve# 的数据在同master同步之后将很容被删除),但是如果客户端由于配置错误在写入时也可能产生一些问题。
  54. #从Redis2.6默认所有的slave为只读
  55. #注意:只读的slave不是为了暴露给互联网上不可信的客户端而设计的。它只是一个防止实例误用的保护层
  56. #一个只读的slave支持所有的管理命令比如config,debug等。为了限制你可以用'rename-command'来隐藏所有的管理和危险命令来增强只读slave的安全性
  57. replica-read-only yes
  58. #同步策略: 磁盘或socket,默认yes磁盘方式
  59. repl-diskless-sync yes
  60. #如果非磁盘同步方式开启,可以配置同步延迟时间,以等待master产生子进程通过socket传输RDB数据给slave
  61. #默认为5秒,如果配置为0,表示同步无延迟
  62. repl-diskless-sync-delay 5
  63. #非磁盘复制时,可以设置延迟
  64. #当启用无磁在达到最大延迟之前开始复制期望已连接的副本数。默认值为0表示等待最大延迟
  65. repl-diskless-sync-max-replicas 0
  66. #不使用无磁盘加载
  67. repl-diskless-load disabled
  68. #在slave和master同步后(发送psync/sync),后续的同步是否设置成TCP_NODELAY
  69. #假如设置成yes,则redis会合并小的TCP包从而节省带宽,但会增加同步延迟(40ms),造成master与slave数据不一致
  70. #假如设置成no,则redis master会立即发送同步数据,没有延迟
  71. repl-disable-tcp-nodelay no
  72. #主从复制下,优先级,哨兵模式:主机宕机,从机优先级数低的优先级低的,更适合升级为主机,默认为100
  73. replica-priority 100
  74. #acl日志,用于记录失败或者阻塞的命令,定义acl最大表项长度
  75. acllog-max-len 128
  76. #采用UNLINK命令,删除key时,提供异步延时释放,key内存的功能
  77. lazyfree-lazy-eviction no
  78. #针对设置有TTL的键,达到过期后,被redis清理删除时是否采用lazy free机制
  79. lazyfree-lazy-expire no
  80. #针对有些指令在处理已存在的键时,会带有一个隐式的DEL键的操作。如rename命令,当目标键已存在,redis会先删除目标键,如果这些目标键是一个big key,那就会引入阻塞删除的性能问题。 此参数设置就是解决这类问题,建议可开启。
  81. lazyfree-lazy-server-del no
  82. #针对slave进行全量数据同步,slave在加载master的RDB文件前,会运行flushall来清理自己的数据场景,
  83. #参数设置决定是否采用异常flush机制。如果内存变动不大,建议可开启。可减少全量同步耗时,从而减少主库因输出缓冲区爆涨引起的内存使用增长。
  84. replica-lazy-flush no
  85. #修改用户的del行为操作,像unlink命令一样
  86. lazyfree-lazy-user-del no
  87. #FLUSHDB, FLUSHALL, SCRIPT FLUSH和FUNCTION FLUSH支持异步和同步,删除时,delete 将[SYNC|ASYNC]标志传递到相应命令,如果命令都未通过,开启此命令,用于异步删除
  88. lazyfree-lazy-user-flush no
  89. #oom-score-adj参数指定Linux内核在内存不足时OOM杀死哪些进程,可选值有:yes、no,absolute。 默认值为 no 不更改oom-score-adj的值。
  90. #yes 值是由服务器启动时oom-score-agj的初始值定义的,取值范围为-1000到1000,通常是0。
  91. #absolute 值将oom-score-adj-values参数值写入到linux内核中,也就是按oom-score-adj-values参数值设定
  92. oom-score-adj no
  93. #三个数值分别代表主进程、副本进程、子进程,数值越高代表被杀死的优先级更高
  94. oom-score-adj-values 0 200 800
  95. #disable-thp参数指定是否禁用透明大页,默认值为yes,表示禁用透明大页。
  96. #通常透明大页默认会被设置为“madvise”或“never”,在这种情况下该参数不会起任何作用。只有当透明大页设置为“always”时,redis默认会禁用透明大页,以避免透明大页带来的延迟问题。
  97. disable-thp yes
  98. #是否开启aof持久化,如果开启,在redis启动时,将加载aof文件
  99. appendonly no
  100. #aof持久化后,存储的文件名称
  101. appendfilename "appendonly.aof"
  102. #aof持久化后,存储的文件路径
  103. appenddirname "appendonlydir"
  104. #appendfsync参数指定将数据写入(fsync)到磁盘的方式,取值有以下三种:
  105. #no 不同步,让操作系统在需要时才刷新数据,非常快。
  106. #always 每次写入AOF日志后同步,缓慢但是安全。
  107. #everysec 每秒同步一次。
  108. appendfsync everysec
  109. #no-appendfsync-on-rewrite参数指定是否在BGSAVE或BGREWRITEAOF阶段时调用fsync,默认值为“no”。
  110. #在appendfsync参数设定成“always”或“everysec”,并且后台保存进程(后台保存进程和AOF日志重写)正在对磁盘执行大量I/O时,redis可能会阻塞很长时间的fsync。
  111. #目前redis是没有解决此问题的方法的。因此,在遇到延迟问题时,可以将该值设置为“yes”,但这就意味着在最坏的情况下可能会丢失超过30秒的日志。
  112. no-appendfsync-on-rewrite no
  113. #auto-aof-rewrite-percentage参数指定自动重写AOF文件触发的百分比,指定百分比为0,则表示禁用自动重写AOF文件。
  114. #redis能够在AOF日志文件增加到指定的百分比时,自动重写调用BGREWRITEAOF的日志文件。它的工作原理是这样:redis会记录最后一次重写后AOF文件的大小(如果重启后没有发生重写,则使用启用时AOF的大小),
  115. #此大小与当前的大小比较,如果当前大小大于指定的百分比的话,则触发重写。
  116. auto-aof-rewrite-percentage 100
  117. #参数指定触发重写AOF文件的最小大小
  118. auto-aof-rewrite-min-size 64mb
  119. #aof-load-truncated参数指定redis启动遇到AOF文件被截断时是否继续加载。取值可能为:
  120. #yes reids启动时加载截断的AOF文件,并会打印日志通知用户该事件。
  121. #no redis启动时因错误拒绝启动,此时就需要用户手动使用“redis-check-aof”修复AOF文件。
  122. aof-load-truncated yes
  123. #参数指定在重写AOF文件时,是否使用RDB前导码,以便更快的进行重写和恢复。启用后,重写的AOF文件由两个不同的部分组成:[RDB 文件] [AOF 尾部]。在加载时,redis会先识别AOF文件以“redis”字符串开头并加载前缀RDB文件,然后继续加载AOF尾部。
  124. aof-use-rdb-preamble yes
  125. #是否在aof日志中记录时间戳
  126. aof-timestamp-enabled no
  127. #参数指定命令执行多久会记录到慢日志中,以微秒为单位。设置为负数表示禁用慢日志记录,设置为0会强制记录所有命令
  128. slowlog-log-slower-than 10000
  129. #参数指定慢日志的最大长度,需要注意的是,它会消耗内存
  130. slowlog-max-len 128
  131. #参数指定是否开启延迟监控子系统,默认情况下是禁用的
  132. #通常情况下不需要开启,只有遇到有延迟问题时,才建议开启,开启后会对性能有较小的影响
  133. latency-monitor-threshold 0
  134. notify-keyspace-events ""
  135. #指定哈希以内存高效的数据结构编码的最大数量,超过该值就不会再以高效的数据结构进行编码。
  136. hash-max-listpack-entries 512
  137. #指定以哈希以内存高效的数据结构编码的最大哈希大小,超过该值就不会再以高效的数据结构进行编码。
  138. hash-max-listpack-value 64
  139. #指定列表以一种特殊的方式编码,以节省大量空间。该参数可选以下值:
  140. #-5 最大大小:64Kb,不推荐用于正常工作负载中
  141. #-4 最大大小:32Kb,不推荐
  142. #-3 最大大小:16Kb,可能不推荐
  143. #-2 最大大小:8Kb,好
  144. #-1 最大大小:4Kb,好
  145. list-max-listpack-size -2
  146. #参数指定列表压缩的深度,该参数可选以下值:
  147. #0 禁用列表压缩
  148. #1 列表不压缩头和尾,压缩中间部分。例如有这样一个列表:[head] -> node -> node -> … -> node -> [tail],不会压缩列表的head和tail,只会压缩中间node部分。
  149. #2 列表不压缩头、下一个、尾和尾的上一个。例如有这样一个列表:[head] -> [next] -> node -> node -> … ->[prev] -> [tail],不会压缩head、next、prev和tail,只会压缩中间node部分。
  150. #3 列表不压缩头和尾开始的三个值,例如这样的列表:[head] -> [next] -> [next] -> node -> node -> … ->[prev] -> [prev] -> [tail]
  151. #3 列表不压缩头和尾开始的三个值,例如这样的列表:[head] -> [next] -> [next] -> node -> node -> … ->[prev] -> [prev] -> [tail]
  152. list-compress-depth 0
  153. set-max-intset-entries 512
  154. zset-max-listpack-entries 128
  155. zset-max-listpack-value 64
  156. hll-sparse-max-bytes 3000
  157. stream-node-max-bytes 4kb
  158. stream-node-max-entries 100
  159. activerehashing yes
  160. client-output-buffer-limit normal 0 0 0
  161. client-output-buffer-limit replica 256mb 64mb 60
  162. client-output-buffer-limit pubsub 32mb 8mb 60
  163. hz 10
  164. dynamic-hz yes
  165. aof-rewrite-incremental-fsync yes
  166. rdb-save-incremental-fsync yes
  167. jemalloc-bg-thread yes
  168. #认证密码
  169. 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和端口
  1. #监听端口<br>port 6378
  2. <br>#redis认证密码
  3. requirepass "lin789."
  4. <br>#主机认证密码
  5. masterauth "lin789."
  6. <br>#工作目录
  7. dir "/usr/local/redis7/redis-stable"
  8. <br>#rdb文件名称
  9. dbfilename "slave_1.rdb"
  10. <br>#pidfile文件名称
  11. 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
如下:
  1. protected-mode no
  2. port 26379
  3. daemonize yes
  4. pidfile "/var/run/redis-sentinel.pid"
  5. logfile "/usr/local/redis7/redis-stable/sentinel.log"
  6. # 主节点的ip
  7. sentinel announce-ip "127.0.0.1"
  8. # 哨兵的端口
  9. sentinel announce-port 23679
  10. # 哨兵的工作目录
  11. dir "/usr/local/redis7/redis-stable"
  12. # 哨兵监听的master数据库,1表示选举数,这里master ip 为主机外网ip地址
  13. sentinel monitor mymaster <master ip> 6379 1
  14. # 配置master的登录密码
  15. sentinel auth-pass mymaster lin789.
  16. # 10s内无响应,则认为master挂掉
  17. sentinel down-after-milliseconds mymaster 10000
  18. acllog-max-len 128
  19. #保持默认配置
  20. sentinel deny-scripts-reconfig yes
  21. sentinel resolve-hostnames no
  22. 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 文件到刚才创建目录中。内容如下:
  1. for i in {1..6}
  2. do
  3. cp /usr/local/redis7/redis-stable/redis.conf /usr/local/redis7/cluster/redis600$i
  4. cp /usr/local/redis7/redis-stable/bin/redis-cli  /usr/local/redis7/redis-stable/bin/redis-server /usr/local/redis7/cluster/redis600$i
  5. 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服务。内容如下:
  1. for d in {1..6}
  2. do
  3. cd /usr/local/redis7/cluster/redis600$d
  4. redis-server redis.conf
  5. 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