Redis安装及集群搭建(主从/哨兵模式)

1,162 阅读16分钟

环境

操作系统 	CentOS 7
Redis 	   6.0.8
机器数量    master * 1
		   slave * 2

安装Redis

下载地址

https://redis.io/download

安装

cd /opt
mkdir redis
cd /redis
wget https://download.redis.io/releases/redis-6.0.8.tar.gz
tar xzf redis-6.0.8.tar.gz
cd redis-6.0.8/
make

我这里make的时候报了俩错

我们需要更新gcc版本

1.安装scl源
yum install centos-release-scl scl-utils-build

2.列出scl可用源
yum list all --enablerepo='centos-sclo-rh'

3.安装8版本的gcc、gcc-c++、gdb工具链(toolchian)
yum install -y devtoolset-8-toolchain
scl enable devtoolset-8 bash

4.给make增加参数
make MALLOC=libc

重新make并指定目录,我这里指定在了安装目录下

make install PREFIX=/opt/redis/redis-6.0.8

建一个日志文件夹

mkdir logs

配置

在bin目录下新建一个redis.conf(这个位置无要求,建在自己习惯的位置就好,也可修改它自身的redis.conf)

cd bin
vim redis.conf

配置文件详解

请关注这三个参数 masterauth、requirepass、slave-priority

masterauth:这个密码是指mastre节点的requirepass的值,而我们这里是配置master,那么,masterauth和 requirepass的值相同。

requirepass:这个是redis的密码。

slave-priority:这个参数,下面有详细的解释

这是master的配置,slave的配置稍微有改动,在配置最后三行,下面有详解

# 当master服务设置了密码保护时,slav服务连接master的密码
masterauth "123456"
# 密码验证# 警告:因为Redis太快了,所以外面的人可以尝试每秒150k的密码来试图破解密码。这意味着你需要# 一个高强度的密码,否则破解太容易了
requirepass 123456
# slave的优先级是一个整数展示在Redis的Info输出中。如果master不再正常工作了,哨兵将用它来# 选择一个slave提升=升为master。# 优先级数字小的salve会优先考虑提升为master,所以例如有三个slave优先级分别为10,100,25,# 哨兵将挑选优先级最小数字为10的slave。# 0作为一个特殊的优先级,标识这个slave不能作为master,所以一个优先级为0的slave永远不会被# 哨兵挑选提升为master
slave-priority 1
# 守护进程模式
daemonize yes 
# pid file 修改pidfile指向路径,pidfile 是我们启动redis 的时候,linux 为我们分配的一个pid 进程号,如果这里不作修改,会影响后面redis服务的启动
pidfile /usr/local/redis-5.0.8/redis_master.pid
# 监听端口 默认6379 我这3个分别是6380 6381 6382
port 6379
# TCP接收队列长度,受/proc/sys/net/core/somaxconn和tcp_max_syn_backlog这两个内核参数的影响#tcp-backlog 511
# 一个客户端空闲多少秒后关闭连接(0代表禁用,永不关闭)
timeout 0
# 如果非零,则设置SO_KEEPALIVE选项来向空闲连接的客户端发送ACK
tcp-keepalive 60
# 指定服务器调试等级# 可能值:# debug (大量信息,对开发/测试有用)# verbose (很多精简的有用信息,但是不像debug等级那么多)# notice (适量的信息,基本上是你生产环境中需要的)# warning (只有很重要/严重的信息会记录下来)
loglevel notice
# 指明日志文件名 logs这个目录之前是没有的,注意添加
logfile "/opt/redis/redis-6.0.8/logs/redis6379.log"
# 设置数据库个数
databases 16
# 会在指定秒数和数据变化次数之后把数据库写到磁盘上# 900秒(15分钟)之后,且至少1次变更# 300秒(5分钟)之后,且至少10次变更# 60秒之后,且至少10000次变更
save 900 1
save 300 10
save 60 10000

# 默认如果开启RDB快照(至少一条save指令)并且最新的后台保存失败,Redis将会停止接受写操作# 这将使用户知道数据没有正确的持久化到硬盘,否则可能没人注意到并且造成一些灾难
stop-writes-on-bgsave-error yes
# 当导出到 .rdb 数据库时是否用LZF压缩字符串对象
rdbcompression yes
# 版本5的RDB有一个CRC64算法的校验和放在了文件的最后。这将使文件格式更加可靠。
rdbchecksum yes
# 持久化数据库的文件名
dbfilename dump-master.rdb
# 工作目录
dir /opt/redis/redis-6.0.8/logs/

# 当一个slave失去和master的连接,或者同步正在进行中,slave的行为可以有两种:## 1) 如果 slave-serve-stale-data 设置为 "yes" (默认值),slave会继续响应客户端请求,# 可能是正常数据,或者是过时了的数据,也可能是还没获得值的空数据。# 2) 如果 slave-serve-stale-data 设置为 "no",slave会回复"正在从master同步# (SYNC with master in progress)"来处理各种请求,除了 INFO 和 SLAVEOF 命令。
slave-serve-stale-data yes
# 你可以配置salve实例是否接受写操作。可写的slave实例可能对存储临时数据比较有用(因为写入salve# 的数据在同master同步之后将很容易被删除
slave-read-only yes
# 是否在slave套接字发送SYNC之后禁用 TCP_NODELAY?# 如果你选择“yes”Redis将使用更少的TCP包和带宽来向slaves发送数据。但是这将使数据传输到slave# 上有延迟,Linux内核的默认配置会达到40毫秒# 如果你选择了 "no" 数据传输到salve的延迟将会减少但要使用更多的带宽
repl-disable-tcp-nodelay no
# redis实例最大占用内存,不要用比设置的上限更多的内存。一旦内存使用达到上限,Redis会根据选定的回收策略(参见:# maxmemmory-policy)删除key
maxmemory 15gb
# 最大内存策略:如果达到内存限制了,Redis如何选择删除key。你可以在下面五个行为里选:# volatile-lru -> 根据LRU算法删除带有过期时间的key。# allkeys-lru -> 根据LRU算法删除任何key。# volatile-random -> 根据过期设置来随机删除key, 具备过期时间的key。 # allkeys->random -> 无差别随机删, 任何一个key。 # volatile-ttl -> 根据最近过期时间来删除(辅以TTL), 这是对于有过期时间的key # noeviction -> 谁也不删,直接在写操作时返回错误。
maxmemory-policy volatile-lru
# 默认情况下,Redis是异步的把数据导出到磁盘上。这种模式在很多应用里已经足够好,但Redis进程# 出问题或断电时可能造成一段时间的写操作丢失(这取决于配置的save指令)。## AOF是一种提供了更可靠的替代持久化模式,例如使用默认的数据写入文件策略(参见后面的配置)# 在遇到像服务器断电或单写情况下Redis自身进程出问题但操作系统仍正常运行等突发事件时,Redis# 能只丢失1秒的写操作。## AOF和RDB持久化能同时启动并且不会有问题。# 如果AOF开启,那么在启动时Redis将加载AOF文件,它更能保证数据的可靠性。
appendonly yes
# aof文件名
appendfilename "appendonly.aof"
# fsync() 系统调用告诉操作系统把数据写到磁盘上,而不是等更多的数据进入输出缓冲区。# 有些操作系统会真的把数据马上刷到磁盘上;有些则会尽快去尝试这么做。## Redis支持三种不同的模式:## no:不要立刻刷,只有在操作系统需要刷的时候再刷。比较快。# always:每次写操作都立刻写入到aof文件。慢,但是最安全。# everysec:每秒写一次。折中方案。 
appendfsync everysec
# 如果AOF的同步策略设置成 "always" 或者 "everysec",并且后台的存储进程(后台存储或写入AOF# 日志)会产生很多磁盘I/O开销。某些Linux的配置下会使Redis因为 fsync()系统调用而阻塞很久。# 注意,目前对这个情况还没有完美修正,甚至不同线程的 fsync() 会阻塞我们同步的write(2)调用。## 为了缓解这个问题,可以用下面这个选项。它可以在 BGSAVE 或 BGREWRITEAOF 处理时阻止主进程进行fsync()。# # 这就意味着如果有子进程在进行保存操作,那么Redis就处于"不可同步"的状态。# 这实际上是说,在最差的情况下可能会丢掉30秒钟的日志数据。(默认Linux设定)# # 如果你有延时问题把这个设置成"yes",否则就保持"no",这是保存持久数据的最安全的方式。
no-appendfsync-on-rewrite yes
# 自动重写AOF文件
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# AOF文件可能在尾部是不完整的(这跟system关闭有问题,尤其是mount ext4文件系统时# 没有加上data=ordered选项。只会发生在os死时,redis自己死不会不完整)。# 那redis重启时load进内存的时候就有问题了。# 发生的时候,可以选择redis启动报错,并且通知用户和写日志,或者load尽量多正常的数据。# 如果aof-load-truncated是yes,会自动发布一个log给客户端然后load(默认)。# 如果是no,用户必须手动redis-check-aof修复AOF文件才可以。# 注意,如果在读取的过程中,发现这个aof是损坏的,服务器也是会退出的,# 这个选项仅仅用于当服务器尝试读取更多的数据但又找不到相应的数据时。
aof-load-truncated yes
# Lua 脚本的最大执行时间,毫秒为单位
lua-time-limit 5000
# Redis慢查询日志可以记录超过指定时间的查询
slowlog-log-slower-than 10000
# 这个长度没有限制。只是要主要会消耗内存。你可以通过 SLOWLOG RESET 来回收内存。
slowlog-max-len 128
# redis延时监控系统在运行时会采样一些操作,以便收集可能导致延时的数据根源。# 通过 LATENCY命令 可以打印一些图样和获取一些报告,方便监控# 这个系统仅仅记录那个执行时间大于或等于预定时间(毫秒)的操作, # 这个预定时间是通过latency-monitor-threshold配置来指定的,# 当设置为0时,这个监控系统处于停止状态
latency-monitor-threshold 0
# Redis能通知 Pub/Sub 客户端关于键空间发生的事件,默认关闭
notify-keyspace-events ""
# hash只有少量的entry时,并且最大的entry所占空间没有超过指定的限制时,会用一种节省内存的# 数据结构来编码。可以通过下面的指令来设定限制
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
# hash似,数据元素较少的list,可以用另一种方式来编码从而节省大量空间。# 这种特殊的方式只有在符合下面限制时才可以用
list-max-ziplist-entries 512
list-max-ziplist-value 64
# set有一种特殊编码的情况:当set数据全是十进制64位有符号整型数字构成的字符串时。# 下面这个配置项就是用来设置set使用这种编码来节省内存的最大长度。set-max-intset-entries 512
# hash和list相似,有序集合也可以用一种特别的编码方式来节省大量空间。# 这种编码只适合长度和元素都小于下面限制的有序集合
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
# HyperLogLog稀疏结构表示字节的限制。该限制包括# 16个字节的头。当HyperLogLog使用稀疏结构表示# 这些限制,它会被转换成密度表示。# 值大于16000是完全没用的,因为在该点# 密集的表示是更多的内存效率。# 建议值是3000左右,以便具有的内存好处, 减少内存的消耗
hll-sparse-max-bytes 3000
# 启用哈希刷新,每100个CPU毫秒会拿出1个毫秒来刷新Redis的主哈希表(顶级键值映射表)
activerehashing yes
# 客户端的输出缓冲区的限制,可用于强制断开那些因为某种原因从服务器读取数据的速度不够快的客户端
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
# 默认情况下,“hz”的被设定为10。提高该值将在Redis空闲时使用更多的CPU时,但同时当有多个key# 同时到期会使Redis的反应更灵敏,以及超时可以更精确地处理
hz 10
# 当一个子进程重写AOF文件时,如果启用下面的选项,则文件每生成32M数据会被同步
aof-rewrite-incremental-fsync yes
# 这个配置是master中没有的,需要在slave中新增
# 这里的IP是master的IP地址,端口是master 6379.conf配置文件中port的值,默认值是6379
# slaveof 1.1.1.1 6379

设置开机启动

systemctl 配置redis操作

vim /etc/systemd/system/redis.service

复制粘贴以下内容,注意ExecStart配置成自己的路径

[Unit]
Description=redis-server
After=network.target

[Service]
Type=forking
ExecStart=/opt/redis/redis-6.0.8/bin/redis-server /opt/redis/redis-6.0.8/bin/redis.conf
PrivateTmp=true

[Install]
WantedBy=multi-user.target

参数详情

[Unit] 表示这是基础信息 
Description 是描述 
After 是在那个服务后面启动,一般是网络服务启动后启动 
[Service] 表示这里是服务信息 
ExecStart 是启动服务的命令 
ExecStop 是停止服务的指令 
[Install] 表示这是是安装相关信息 
WantedBy 是以哪种方式启动:multi-user.target表明当系统以多用户方式(默认的运行级别)启动时,这个服务需要被自动运行。

开机启动

systemctl daemon-reload
systemctl start redis
systemctl enable redis

相关命令

systemctl start redis 		启动redis
systemctl restart redis 	重启redis
systemctl stop redis		停止redis
systemctl enable redis		开机启动
systemctl disable redis		禁止开机启动
systemctl status redis		查看状态
systemctl daemon-reload		重新加载配置文件

至此单机的redis就安装好了

如果想要主从集群,把从服务器上的redis.conf最后一行的注解去掉然后重启就好了

哨兵集群

配置

新建一个sentinel.conf(跟上面的redis.conf一样位置无要求,建在自己习惯的位置就好,也可修改它自身的sentinel.conf))

vim bin/sentinel.conf

加入以下内容

dir "/opt/redis/redis-6.0.8/logs/"
logfile "/opt/redis/redis-6.0.8/logs/sentinel.log"
daemonize yes
# 本机ip
bind x.x.x.x 127.0.0.1
port 26379
# 主节点ip
sentinel monitor mymaster x.x.x.x 6379 2
# 这里的密码是指 Redis-1 的 requirepass
sentinel auth-pass mymaster 密码
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1

配置文件详解

# Example sentinel.conf  

# 哨兵sentinel实例运行的端口 默认26379  
port 26379  

# 哨兵sentinel的工作目录  
dir /tmp  

# 哨兵sentinel监控的redis主节点的 ip port   
# master-name  可以自己命名的主节点名字 只能由字母A-z、数字0-9 、这三个字符".-_"组成。  
# quorum 当这些quorum个数sentinel哨兵认为master主节点失联 那么这时 客观上认为主节点失联了  
# sentinel monitor <master-name> <ip> <redis-port> <quorum>  
  sentinel monitor mymaster 127.0.0.1 6379 2  

# 当在Redis实例中开启了requirepass foobared 授权密码 这样所有连接Redis实例的客户端都要提供密码  
# 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码  
# sentinel auth-pass <master-name> <password>  
sentinel auth-pass mymaster MySUPER--secret-0123passw0rd  


# 指定多少毫秒之后 主节点没有应答哨兵sentinel 此时 哨兵主观上认为主节点下线 默认30秒  
# sentinel down-after-milliseconds <master-name> <milliseconds>  
sentinel down-after-milliseconds mymaster 30000  

# 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,  
这个数字越小,完成failover所需的时间就越长,  
但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。  
可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。  
# sentinel parallel-syncs <master-name> <numslaves>  
sentinel parallel-syncs mymaster 1  



# 故障转移的超时时间 failover-timeout 可以用在以下这些方面:   
#1. 同一个sentinel对同一个master两次failover之间的间隔时间。  
#2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。  
#3.当想要取消一个正在进行的failover所需要的时间。    
#4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了  
# 默认三分钟  
# sentinel failover-timeout <master-name> <milliseconds>  
sentinel failover-timeout mymaster 180000  

# SCRIPTS EXECUTION  

#配置当某一事件发生时所需要执行的脚本,可以通过脚本来通知管理员,例如当系统运行不正常时发邮件通知相关人员。  
#对于脚本的运行结果有以下规则:  
#若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10  
#若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行。  
#如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为1时的行为相同。  
#一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKILL信号终止,之后重新执行。  

#通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本,  
这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,  
一个是事件的类型,  
一个是事件的描述。  
如果sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentinel无法正常启动成功。  
#通知脚本  
# sentinel notification-script <master-name> <script-path>  
  sentinel notification-script mymaster /var/redis/notify.sh  

# 客户端重新配置主节点参数脚本  
# 当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息。  
# 以下参数将会在调用脚本时传给脚本:  
# <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>  
# 目前<state>总是“failover”,  
# <role>是“leader”或者“observer”中的一个。   
# 参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通信的  
# 这个脚本应该是通用的,能被多次调用,不是针对性的。  
# sentinel client-reconfig-script <master-name> <script-path>  
 sentinel client-reconfig-script mymaster /var/redis/reconfig.sh

设置开机启动

systemctl 配置sentinel操作

vim /etc/systemd/system/sentinel.service

复制粘贴以下内容,注意ExecStart配置成自己的路径

[Unit]
Description=redis-sentinel
After=network.target

[Service]
Type=forking
ExecStart=/opt/redis/redis-6.0.8/bin/redis-sentinel /opt/redis/redis-6.0.8/bin/sentinel.conf
PrivateTmp=true

[Install]
WantedBy=multi-user.target

开机启动

systemctl daemon-reload
systemctl start sentinel
systemctl enable sentinel

至此哨兵集群就搭建完毕了,客户端输入info replication就能看到角色的变化了

结语

由于环境不一样,网上找了好多教程,谢谢各位前辈了:

redis的三种集群方式			https://www.cnblogs.com/51life/p/10233340.html

Redis集群搭建(哨兵)			https://www.cnblogs.com/x-j-p/p/12961387.html

Centos7.6安装redis-6.0.8版本		https://blog.csdn.net/roc_wl/article/details/108662719

redis哨兵机制--配置文件sentinel.conf详解	https://blog.csdn.net/u012441222/article/details/80751390