redis主从、哨兵、cluster集群、持久化

一 redis官网

英文:https://redis.io/
中文:http://www.redis.cn/

二 关系型数据库与非关系型数据库

关系型数据库

1、简介:关系型数据库最典型的数据结构是表
2、种类:MySQL、Orcale、DB2
3、优点:

  • 易于维护:都是表结构存储的。
  • 易于管理:sql都是通用的。
  • 复杂操作:支持多个表联合查询。

4、缺点:

  • 读写性能较差,尤其是大量数据的读写。
  • 磁盘IO瓶颈较大。

非关系型数据库

1、简介:非关系型数据库是一种数据结构化存储方法的集合,可以是文档或者键值对等。
2、种类:redis、mongoDB
3、优点:

  • 性能:NoSQL数据库将数据存储于缓存之中,关系型数据库将数据存储在硬盘中,自然查询速度远不及nosql数据库。
  • 存储类型多样化:可以是键值对形式,也可以是图片、文档等。

4、缺点:

  • 对比关系型数据库没有固定的sql,学习成本较大。
  • 数据结构相对复杂,复杂查询方面稍欠。

三 数据结构

1.字符串(strings)
2.字符串列表(lists)
3.字符串集合(sets)
4.有序字符串集合(sorted sets)
5.哈希(hashes)

四 redis单点部署

安装redis

cd /home/finance/package
wget https://download.redis.io/releases/redis-5.0.14.tar.gz
tar xvf redis-5.0.14.tar.gz -C /home/finance/software
cd /home/finance/software/redis-5.0.14/
make MALLOC=libc && make install PREFIX=/home/finance/APP/redis

命令讲解

ll /home/finance/APP/redis/bin
#redis-benchmark					redis性能测试工具启动,测试redis在你的系统及你的配置下的读写性能
#redis-check-aof					更新aof日志检查
#redis-check-rdb					本地数据库检查
#redis-cli							命令行操作工具(即客户端)
#redis-sentinel -> redis-server
#redis-server						redis服务器的daemon启动程序

拷贝配置文件

mkdir -p /home/finance/APP/redis/conf
cd /home/finance/software/redis-5.0.14/
cat redis.conf | grep -v '#' |grep -v '^$' > /home/finance/APP/redis/conf/redis.conf
#日志路径
mkdir -p /home/finance/Logs/redis

优化启动

在这里插入图片描述

翻译

#警告:
#128太小了
#您的内核中启用了透明的大页面(THP)支持,
#这将创建与ReDIS的延迟和内存使用问题,
#若要修复此问题,请运行命令“EngEng/mS/mL/mM/ExpListNo.HugPoIP/启用”为root,
#并将其添加到您的/etc/rc.local,以便在重新启动后保留设置。在禁用THP之后,必须重新启动redis。

解决

echo -e "net.core.somaxconn=1024" >> /etc/sysctl.conf
sysctl -p
echo never > /sys/kernel/mm/transparent_hugepage/enabled

环境变量

echo 'export PATH=$PATH:/home/finance/APP/redis/bin' >> /etc/profile.d/redis.sh
source /etc/profile.d/redis.sh

开机自启

vim /lib/systemd/system/redis1.service
[Unit]
Description=redis-server
After=network.target

[Service]
Type=forking
#启动命令及配置文件路径,伪集群这里更改
ExecStart=/home/financer/APP/redis/bin/redis-server /home/financer/APP/redis/conf/redis.conf
PrivateTmp=true

[Install]
WantedBy=multi-user.target

#添加开机启动
systemctl enable redis1.service

启动redis

#redis后台运行
vim /home/finance/APP/redis/conf/redis.conf
#改为yes
daemonize yes
#指定日志路径
logfile "/home/finance/Logs/redis/redis.log"
#指定配置文件路径启动
redis-server /home/finance/App/redis/conf/redis.conf
#确认端口
netstat -anput |grep 6379

五 redis配置文件讲解

基础配置

  • daemonize no
    默认情况下,redis 不是在后台运行的,如果需要在后台运行,把该项的值更改为yes。

  • pidfile /var/run/redis.pid
    当Redis 在后台运行的时候,Redis 默认会把pid 文件放在/var/run/redis.pid,你可以配置到其他地址。当运行多个redis 服务时,需要指定不同的pid 文件和端口

  • port
    监听端口,默认为6379

  • bind 127.0.0.1
    绑定redis服务器网卡IP,默认为127.0.0.1,即本地回环地址。这样的话,访问redis服务只能通过本机的客户端连接,而无法通过远程连接。如果bind选项为空的话,那会接受所有来自于可用网络接口的连接。

  • timeout 0
    设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接

  • loglevel notice
    log 等级分为4 级,debug(很多信息,方便开发、测试),verbose(许多有用的信息,
    但是没有debug级别信息多),notice(适当的日志级别,适合生产环境),warn(只有非常重要的信息)

  • logfile stdout
    配置log 文件地址,默认使用标准输出,即打印在命令行终端的窗口上,修改为日志文件目录

  • databases 16
    设置数据库的个数,可以使用SELECT 命令来切换数据库。默认使用的数据库是0号库。默认16个库

RDB快照配置

  • save 900 1

  • save 300 10

  • save 60 10000
    RDB核心规则配置 save <指定时间间隔> <执行指定次数更新操作>,满足条件就将内存中的数据同步到硬盘中。官方出厂配置默认是 900秒内有1个更改,300秒内有10个更改以及60秒内有10000个更改,则将内存中的数据快照写入磁盘。
    若不想用RDB方案,可以把 save “” 的注释打开,下面三个注释

  • stop-writes-on-bgsave-error yes
    当RDB持久化出现错误后,是否依然进行继续进行工作,yes:不能进行工作,no:可以继续进行工作,可以通过info中的rdb_last_bgsave_status了解RDB持久化是否有错误

  • rdbcompression yes
    在进行数据镜像备份时,是否启用rdb文件压缩手段,默认为yes。压缩可能需要额外的cpu开支,不过这能够有效的减小rdb文件的大,有利于存储/备份/传输/数据恢复

  • rdbchecksum yes
    是否校验rdb文件;从rdb格式的第五个版本开始,在rdb文件的末尾会带上CRC64的校验和。这跟有利于文件的容错性,但是在保存rdb文件的时候,会有大概10%的性能损耗,所以如果你追求高性能,可以关闭该配置

  • dbfilename dump.rdb
    指定本地数据库文件名,一般采用默认的 dump.rdb

  • dir
    数据目录,数据库的写入会在这个目录。rdb、aof文件也会写在这个目录

副本配置

  • replicaof
    此项为设置master地址,一般为slave需要配置。

  • masterauth
    此项为设置master密码。

  • slave-serve-stale-data
    默认值为yes。当一个 slave 与 master 失去联系,或者复制正在进行的时候,slave 可能会有两种表现:

1) 如果为 yes ,slave 仍然会应答客户端请求,但返回的数据可能是过时,或者数据可能是空的在第一次同步的时候

2) 如果为 no ,在你执行除了 info he salveof 之外的其他命令时,slave 都将返回一个 “SYNC with master in progress” 的错误

  • slave-read-only
    配置Redis的Slave实例是否接受写操作,即Slave是否为只读Redis。默认值为yes。(不建议改为no)
  • repl-diskless-sync
    主从数据复制是否使用无硬盘复制功能。默认值为no
  • repl-diskless-sync-delay
    当启用无硬盘备份,服务器等待一段时间后才会通过套接字向从站传送RDB文件,这个等待时间是可配置的。 这一点很重要,因为一旦传送开始,就不可能再为一个新到达的从站服务。从站则要排队等待下一次RDB传送。因此服务器等待一段 时间以期更多的从站到达。延迟时间以秒为单位,默认为5秒。要关掉这一功能,只需将它设置为0秒,传送会立即启动。默认值为5。
  • repl-disable-tcp-nodelay
    同步之后是否禁用从站上的TCP_NODELAY 如果你选择yes,redis会使用较少量的TCP包和带宽向从站发送数据。但这会导致在从站增加一点数据的延时。 Linux内核默认配置情况下最多40毫秒的延时。如果选择no,从站的数据延时不会那么多,但备份需要的带宽相对较多。默认情况下我们将潜在因素优化,但在高负载情况下或者在主从站都跳的情况下,把它切换为yes是个好主意。默认值为no。

安全配置

  • requirepass
    设置redis密码

客户端配置

  • maxclients

设置客户端最大并发连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件。 描述符数-32(redis server自身会使用一些),如果设置 maxclients为0 。表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息

内存管理

  • maxmemory
    设置Redis的最大内存,如果设置为0 。表示不作限制。通常是配合下面介绍的maxmemory-policy参数一起使用。
  • maxmemory-policy
    当内存使用达到maxmemory设置的最大值时,redis使用的内存清除策略。有以下几种可以选择
    1)volatile-lru 利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used )
    2)allkeys-lru 利用LRU算法移除任何key
    3)volatile-random 移除设置过过期时间的随机key
    4)allkeys-random 移除随机ke
    5)volatile-ttl 移除即将过期的key(minor TTL)
    6)noeviction noeviction 不移除任何key,只是返回一个写错误 ,默认选项

AOF持久化配置

  • appendonly
    默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了。但是redis如果中途宕机,会导致可能有几分钟的数据丢失,根据save来策略进行持久化,Append Only File是另一种持久化方式, 可以提供更好的持久化特性。Redis会把每次写入的数据在接收后都写入appendonly.aof文件,每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。默认值为no。

  • appendfilename
    aof文件名,默认是"appendonly.aof"

  • appendfsync
    aof持久化策略的配置;no表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快;always表示每次写入都执行fsync,以保证数据同步到磁盘;everysec表示每秒执行一次fsync,可能会导致丢失这1s数据

  • no-appendfsync-on-rewrite
    在aof重写或者写入rdb文件的时候,会执行大量IO,此时对于everysec和always的aof模式来说,执行fsync会造成阻塞过长时间,no-appendfsync-on-rewrite字段设置为默认设置为no。如果对延迟要求很高的应用,这个字段可以设置为yes,否则还是设置为no,这样对持久化特性来说这是更安全的选择。 设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入,默认为no,建议yes。Linux的默认fsync策略是30秒。可能丢失30秒数据。默认值为no。

  • auto-aof-rewrite-percentage
    默认值为100。aof自动重写配置,当目前aof文件大小超过上一次重写的aof文件大小的百分之多少进行重写,即当aof文件增长到一定大小的时候,Redis能够调用bgrewriteaof对日志文件进行重写。当前AOF文件大小是上次日志重写得到AOF文件大小的二倍(设置为100)时,自动启动新的日志重写过程。

  • auto-aof-rewrite-min-size:64
    设置允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写。

redis cluster配置

  • cluster-enabled
    集群开关,默认是不开启集群模式。

  • cluster-config-file
    集群配置文件的名称,每个节点都有一个集群相关的配置文件,持久化保存集群的信息。 这个文件并不需要手动配置,这个配置文件有Redis生成并更新,每个Redis集群节点需要一个单独的配置文件。请确保与实例运行的系统中配置文件名称不冲突。默认配置为nodes-6379.conf。

  • cluster-node-timeout
    可以配置值为15000。节点互连超时的阀值,集群节点超时毫秒数

  • cluster-slave-validity-factor
    可以配置值为10。在进行故障转移的时候,全部slave都会请求申请为master,但是有些slave可能与master断开连接一段时间了, 导致数据过于陈旧,这样的slave不应该被提升为master。该参数就是用来判断slave节点与master断线的时间是否过长。判断方法是:比较slave断开连接的时间和(node-timeout * slave-validity-factor) + repl-ping-slave-period 如果节点超时时间为三十秒, 并且slave-validity-factor为10,假设默认的repl-ping-slave-period是10秒,即如果超过310秒slave将不会尝试进行故障转移

  • cluster-migration-barrier
    可以配置值为1。master的slave数量大于该值,slave才能迁移到其他孤立master上,如这个参数若被设为2,那么只有当一个主节点拥有2 个可工作的从节点时,它的一个从节点会尝试迁移。

  • cluster-require-full-coverage
    默认情况下,集群全部的slot有节点负责,集群状态才为ok,才能提供服务。 设置为no,可以在slot没有全部分配的时候提供服务。不建议打开该配置,这样会造成分区的时候,小分区的master一直在接受写请求,而造成很长时间数据不一致。

六 redis基本命令操作

客户端登录命令

redis-cli [OPTIONS]

常用选项:

  • -h
    指定主机登录,默认登录127.0.0.1
  • -p
    指定端口,默认6379
  • -a
    指定密码
  • -n
    指定库,默认0库

常用key操作

  • set key value
    添加key value键值对

  • get key
    查看这个key的value

  • keys *
    查看所有的key,非常危险的命令

  • dbsize
    查看一共有多少个key

  • select number
    切换库

  • flushdb
    清空当前库的key

  • flushall
    清空所有库

七 持久化

Redis对数据的操作都是基于内存的,当遇到了进程退出、服务器宕机等意外情况,如果没有持久化机制,那么Redis中的数据将会丢失无法恢复。有了持久化机制,Redis在下次重启时可以利用之前持久化的文件进行数据恢复。

  • RDB:把当前数据生成快照保存在硬盘上。
  • AOF:记录每次对数据的操作到硬盘上。

RDB持久化

手动触发

savebgsave命令都可以手动触发RDB持久化。

  • save
    执行save会触发持久化,但是当有大量数据的时候,会阻塞redis服务,直到持久化完成,会持续较长时间,不建议使用
127.0.0.1:6379> save
OK

同时dump.rdb也会写入

  • bgsave
    bgsave也会以RDB持久化的方式写入到磁盘中,在执行的过程中会fork一个子进程来进行磁盘的写入操作,这样不会阻塞到redis服务
127.0.0.1:6379> bgsave
Background saving started

同时dump.rdb也会写入

bgsave命令的具体流程:

  1. 执行bgsave命令,Redis进程先判断当前是否存在正在执行的RDB或AOF子线程,如果存在就是直接结束。

  2. Redis进程执行fork操作创建子线程,在fork操作的过程中Redis进程会被阻塞。

  3. Redis进程fork完成后,bgsave命令就结束了,自此Redis进程不会被阻塞,可以响应其他命令。

  4. 子进程根据Redis进程的内存生成快照文件,并替换原有的RDB文件。 子进程通过信号量通知Redis进程已完成

自动触发

  1. 在配置文件中设置了save的相关配置,如sava m n,它表示在m秒内数据被修改过n次时,自动触发bgsave操作。
  2. 当从节点做全量复制时,主节点会自动执行bgsave操作,并且把生成的RDB文件发送给从节点。
  3. 执行shutdown命令时,如果没有开启AOF持久化也会自动触发bgsave操作。

优点

  1. 数据恢复很快,非常适合备份、全量复制、灾难恢复等场景。

缺点

  1. 每次执行bgsave的时候都会fork一个子进程,成本太大。
  2. 无法做到秒级的持久化

AOF持久化

AOF持久化就是吧所有写操作保存到持久化的日志里,然后需要恢复的时候重新执行AOF文件即可,这样解决了数据持久化的实时性,也是目前redis主流的持久化。

  1. 命令追加(append):所有写命令都会被追加到AOF缓存区(aof_buf)中。
  2. 文件同步(sync):根据不同策略将AOF缓存区同步到AOF文件中。
  3. 文件重写(rewrite):定期对AOF文件进行重写,以达到压缩的目的。
  4. 数据加载(load):当需要恢复数据时,重新执行AOF文件中的命令

文件同步策略

  1. always:每次写入缓存区都要同步到AOF文件中,硬盘的操作比较慢,限制了Redis高并发,不建议配置。
  2. no:每次写入缓存区后不进行同步,同步到AOF文件的操作由操作系统负责,每次同步AOF文件的周期不可控,而且增大了每次同步的硬盘的数据量。
  3. eversec:每次写入缓存区后,由专门的线程每秒钟同步一次,做到了兼顾性能和数据安全。是建议的同步策略,也是默认的策略。

触发方式

  1. 手动触发:使用bgrewriteaof命令。
  2. 自动触发:根据auto-aof-rewrite-min-size和auto-aof-rewrite-percentage配置确定自动触发的时机。auto-aof-rewrite-min-size表示运行AOF重写时文件大小的最小值,默认为64MB;auto-aof-rewrite-percentage表示当前AOF文件大小和上一次重写后AOF文件大小的比值的最小值,默认为100。只用前两者同时超过时才会自动触发文件重写。

AOF持久化配置

# appendonly改为yes,开启AOF
appendonly yes
# AOF文件的名字
appendfilename "appendonly.aof"
# AOF文件的写入方式
# everysec 每个一秒将缓存区内容写入文件 默认开启的写入方式
appendfsync everysec
# 运行AOF重写时AOF文件大小的增长率的最小值
auto-aof-rewrite-percentage 100
# 运行AOF重写时文件大小的最小值
auto-aof-rewrite-min-size 64mb

数据恢复优先级

  1. 如果只配置了RDB持久化,启动redis时就会自动恢复RDB数据,AOF同理
  2. 如果配置了AOF与RDB持久化,启动redis时会自动恢复AOF数据。

持久化总结

  1. RDB持久化是将当前数据保存在硬盘中。
  2. AOF是将写操作保存到硬盘当中,对于数据完整性更高的可以采用这种方式。
  3. 如果redis只是作为缓存使用,就没有必要开启持久化功能。
  4. AOF根据持久化策略,每秒写入,最多就丢失一秒的数据。
  5. 因为RDB只作为备用持久化功能,建议在slave上做。

八 主从复制

概念

主从复制是将一台数据复制到另一台上,前者称为master,主要负责写,后者成为slave,主要负责读,数据的复制都是单向的,只能由主节点复制到从节点
且一个master可以有多个slave,一个slave只能有一个master。

作用

  1. 数据备份
    主从复制是持久化之外的另一种热备份方式。

  2. 故障修复
    当主节点出现了问题以后,从节点可以代替工作。

  3. 读写分离
    在主从复制的基础上,可以由主节点负责写操作,从负责读操作,分担服务器压力。

  4. 高可用
    在主从复制的基础上,加上烧饼即可实现高可用

原理

  1. slave启动成功后会像master发送一个sync同步命令
  2. master收到命令后会将整个数据全量复制到slave
  3. slave收到后会将数据存入磁盘并写入到内存当中。
  4. master后续的数据会以增量复制的形式同步到slave中。
  5. 后续如果有新的slave节点加入,master将全量复制到slave中

部署主从

架构图

在这里插入图片描述

主机规划

IP角色端口
192.168.100.101master6379
192.168.100.102slave6380
192.168.100.103slave6381
配置文件日志持久化路径
/home/finance/APP/redis/conf/redis.conf/home/finance/Logs/redis/redis.log/home/finance/data/redis

#所有配置文件修改如下参数
port 
pidfile
logfile
dbfilename或dir修改任意一个即可,我这里修改dir
bind

#从节点需要修改
#master的IP端口
replicaof 192.168.100.101 8000

#8000端口的配置文件
vim /home/finance/App/redis/8000/conf/redis.conf
port 8000
pidfile /var/run/redis_8000.pid
logfile "/home/finance/Logs/redis/8000/redis.log"
dir /home/finance/data/redis/8000/
bind 0.0.0.0

#8001端口的配置文件
vim /home/finance/App/redis/8001/conf/redis.conf
port 8001
pidfile /var/run/redis_8001.pid
logfile "/home/finance/Logs/redis/8001/redis.log"
dir /home/finance/data/redis/8001/
bind 0.0.0.0
replicaof 192.168.100.101 8000

#8002端口的配置文件
vim /home/finance/App/redis/8002/conf/redis.conf
port 8002
pidfile /var/run/redis_8002.pid
logfile "/home/finance/Logs/redis/8002/redis.log"
dir /home/finance/data/redis/8002/
bind 0.0.0.0
replicaof 192.168.100.101 8000

#启动所有服务
redis-server /home/finance/App/redis/8000/conf/redis.conf
redis-server /home/finance/App/redis/8001/conf/redis.conf
redis-server /home/finance/App/redis/8002/conf/redis.conf

#分别登录客户端
redis-cli -p 8000
redis-cli -p 8001
redis-cli -p 8002

#master
127.0.0.1:8000> info replication
# Replication
#角色
role:master
#从节点数量
connected_slaves:2
#从节点信息
slave0:ip=127.0.0.1,port=8001,state=online,offset=210,lag=0
#从节点信息
slave1:ip=127.0.0.1,port=8002,state=online,offset=210,lag=1


#slave1
127.0.0.1:8001> info replication
# Replication
#角色
role:slave
#master信息
master_host:192.168.100.101
master_port:8000
#master状态
master_link_status:up

#slave2
# Replication
role:slave
master_host:192.168.100.101
master_port:8000
master_link_status:up

验证主从同步

#master设置key
127.0.0.1:8000> set 1 1
OK

#slave1查看是否同步
127.0.0.1:8001> keys *
1) "1"
127.0.0.1:8001> get 1
"1"

#slave2查看是否同步
127.0.0.1:8002> keys *
1) "1"
127.0.0.1:8002> get 1
"1"

主从配置的两种方式

  • 从节点命令行加入
    这种方式是短暂的,重启即失效
 slaveof masterIP 端口
  • 从节点配置文件配置
    永久配置
replicaof masterIP 端口
masterauth master密码

从开启读

#默认情况下从不支持写操作
127.0.0.1:8002> set 6 6
(error) READONLY You can't write against a read only replica.


#修改配置文件即可支持写操作,具体请查看第五节“redis配置文件讲解”,但是不支持使用这种方式。
replica-read-only no

补充

  1. 如果slave处于查看master的状态是处于down的状态。
  • 查看master的bind是否为0.0.0.0。
  • 查看master是否设置密码,如果设置则需要slave修改上述参数
  1. master如果挂了,数据将在slave进行读取,等master修复以后将自动加入集群且还是master身份。

九 哨兵

概念

哨兵就是自动故障切换,当主节点出现了问题以后,slave会自动成为主进行工作,从而实现自动切换,使用烧饼模式,服务器数量一定要是 3 5 7 9这类的奇数,因为当master挂了以后,slave节点会镜像leader投票选举,

原理

  1. 每个Sentinel(哨兵)进程以每秒钟一次的频率向整个集群中的Master主服务器,Slave从服务器以及其他Sentinel(哨兵)进程发送一个
    PING 命令。
  2. 如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds
    选项所指定的值,则这个实例会被 Sentinel(哨兵)进程标记为主观下线(SDOWN)。
  3. 如果一个Master主服务器被标记为主观下线(SDOWN),则正在监视这个Master主服务器的所有
    Sentinel(哨兵)进程要以每秒一次的频率确认Master主服务器的确进入了主观下线状态。
  4. 当有足够数量的
    Sentinel(哨兵)进程(大于等于配置文件指定的值)在指定的时间范围内确认Master主服务器进入了主观下线状态(SDOWN),
    则Master主服务器会被标记为客观下线(ODOWN)。 在一般情况下, 每个Sentinel(哨兵)进程会以每 10
    秒一次的频率向集群中的所有Master主服务器、Slave从服务器发送 INFO 命令。
  5. 当Master主服务器被 Sentinel(哨兵)进程标记为客观下线(ODOWN)时,Sentinel(哨兵)进程向下线的
    Master主服务器的所有 Slave从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。 若没有足够数量的
    Sentinel(哨兵)进程同意 Master主服务器下线, Master主服务器的客观下线状态就会被移除。若
    Master主服务器重新向 Sentinel(哨兵)进程发送 PING 命令返回有效回复,Master主服务器的主观下线状态就会被移除。

主观下线 客观下线

  • sdown

是主观下线,当有一个哨兵认为imaster挂了,那么就是主观下线

  • odwon
    是客观下线,当哨兵配置文件参数sentinel monitor mymaster 127.0.0.1 8000 2,这个2为几的时候,就说明多少台哨兵判断master挂了为客观下线。

达成条件

  • sdown

如果一个哨兵ping master超过了sentinel down-after-milliseconds mymaster 15000设置的时间,此单位为毫秒,就主观认为master已经下线

  • odwon
    如果一个哨兵在指定的时间内,收到了sentinel monitor mymaster 127.0.0.1 8000 2数量的其他哨兵认为master已经主观下线了,那么将采取客观下线。

配置文件

  • port 26379
    哨兵端口

  • daemonize
    是否以守护进程启动

  • pidfile
    PID路径

  • logfile
    日志路径

  • sentinel monitor <master-name> <ip> <redis-port> <quorum>
    告诉sentinel去监听地址为ip:port的一个master,这里的master-name可以自定义,quorum是一个数字,指明当有多少个sentinel认为一个master失效时,master才算真正失效。master-name只能包含英文字母,数字,和“.-_”这三个字符需要注意的是master-ip 要写真实的ip地址而不要用回环地址(127.0.0.1)。

  • sentinel auth-pass <master-name> <password>
    设置连接master和slave时的密码,注意的是sentinel不能分别为master和slave设置不同的密码,因此master和slave的密码应该设置相同。

  • sentinel down-after-milliseconds <master-name> <milliseconds>
    这个配置项指定了需要多少失效时间,一个master才会被这个sentinel主观地认为是不可用的。 单位是毫秒,默认为30秒

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

哨兵部署

  • 前言
    基于一主两从的基础上部署哨兵。

架构图

在这里插入图片描述

主机规划

角色IP端口
master192.168.100.1016379
slave192.168.100.1026379
slave192.168.100.1036379

主从部署

#安装
mkdir -p {software,app/redis,logs/redis,data/redis,packages}
cd packages/
wget https://download.redis.io/releases/redis-5.0.14.tar.gz
tar xvf redis-5.0.14.tar.gz -C ../software/
cd ../software/redis-5.0.14
make MALLOC=libc && make install PREFIX=/home/finance/app/redis/

#配置文件拷贝
mkdir /home/finance/app/redis/conf
cp -p redis.conf sentinel.conf /home/finance/app/redis/conf/

#master修改配置文件
vim /home/finance/app/redis/conf/redis.conf
bind 0.0.0.0
daemonize yes
pidfile /home/finance/app/redis/conf/redis_6379.pid
logfile "/home/finance/logs/redis/reids.logs"
dir /home/finance/data/redis/
requirepass rensiyu						#设置redis密码
masterauth rensiyu						#这里master也要设置,不然故障修复以后加入不了到集群中

#slave配置
/home/finance/app/redis/conf/
bind 0.0.0.0
daemonize yes
pidfile /home/finance/app/redis/conf/redis_6379.pid
logfile "/home/finance/app/redis/logs/redis/reids.logs"
dir /home/finance/data/redis/
requirepass rensiyu
replicaof 192.168.100.101 6379			#连接master地址
masterauth rensiyu						#master密码

#环境变量
echo 'export PATH=$PATH:/home/finance/app/redis/bin' >> /etc/profile.d/redis.sh
source /etc/profile.d/redis.sh

#redis启动脚本
vim /lib/systemd/system/redis.service
[Unit]
Description=redis-server
After=network.target

[Service]
Type=forking
#启动命令及配置文件路径,伪集群这里更改
ExecStart=/home/financer/app/redis/bin/redis-server /home/financer/app/redis/conf/redis.conf
PrivateTmp=true

[Install]
WantedBy=multi-user.target

#启动
systemctl daemon-reload
systemctl start redis
systemctl status redis

主从数据同步测试

#master查看主从信息
redis-cli -a rensiyu

127.0.0.1:6379> info replication
role:master
connected_slaves:2
slave0:ip=192.168.100.103,port=6379,state=online,offset=28,lag=1
slave1:ip=192.168.100.102,port=6379,state=online,offset=28,lag=1

#master设置一个key,查看主从是否同步
127.0.0.1:6379> set k 1
OK

#slave查看
redis-cli -a rensiyu
127.0.0.1:6379> get k
"1"

#主从数据可以同步

修改哨兵配置文件

#修改哨兵配置文件,从节点直接scp过去即可
vim /home/finance/app/redis/conf/sentinel.conf
bind 0.0.0.0
daemonize yes
pidfile /home/finance/app/redis/conf/redis-sentinel.pid
logfile "/home/finance/logs/redis/sentinel.log"
sentinel monitor mymaster 192.168.100.101 6379 2			#master地址
sentinel auth-pass mymaster rensiyu							#master密码


#启动所有节点哨兵
redis-sentinel /home/finance/app/redis/conf/sentinel.conf 

已经加载到master及slave,并且发现其他两个哨兵
已

测试哨兵故障转移

#关闭master——101服务器
systemctl stop redis

#master已经选举到102服务器上
redis-cli -a rensiyu
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.100.103,port=6379,state=online,offset=23564,lag=1

#验证数据同步
127.0.0.1:6379> set k3 3
OK

#slave查看
127.0.0.1:6379> get k3
"3"

#重新启动101,再次查看已经以slave身份加入进来了
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.100.103,port=6379,state=online,offset=146068,lag=1
slave1:ip=192.168.100.101,port=6379,state=online,offset=146213,lag=1

测试哨兵集群

#关闭master哨兵——102服务器
ps -aux |grep sen
finance   13130  0.2  0.0 144008  2220 ?        Rsl  02:19   0:02 redis-sentinel *:26379 [sentinel]
kill -9 13130

#关闭master redis——102服务器
systemctl stop redis

#已经选举到101服务器上了。
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.100.103,port=6379,state=online,offset=185507,lag=1


#redis故障节点恢复以后,自动以从节点身份加入
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.100.103,port=6379,state=online,offset=196213,lag=0
slave1:ip=192.168.100.102,port=6379,state=online,offset=196213,lag=1
master_replid:80b0393d70a77a7d57c07e550ee96c586a6eb457
master_replid2:69cddc3291c1780d36cc59d1d17521021e7cc232

redis cluster

概念

redis使用hash槽算法,默认分配16384个hash槽位,然后将槽位均匀分配到不同的redis实例中去,找数据的时候通过crc16(key) % 16384找到对应的槽位,再看槽位在哪台实例上,最后去实例上取数据,使用槽位将具体的数据与redis实例解耦,当新增或者减少redis实例的时候自动将槽位均匀迁移到其他可用的redis实例上去
也就是说,当一个key要写入到redis中时,会将这个key进行分片切分,几台master就分成几片,然后写入到master中。

架构图

这个架构中,不需要部署哨兵,当master挂了以后,会根据raft协议进行slavet生master
在这里插入图片描述

主机规划

  • 此次只部署三主三从
角色IP端口
master192.168.100.1016379
master192.168.100.1026379
master192.168.100.1036379
slave192.168.100.1016380
slave192.168.100.1026380
slave192.168.100.1036380

三主三从部署

配置文件

  • master redis-6379.conf
  • slave redis-6380.conf

修改master配置文件

#修改master配置文件
bind 0.0.0.0
daemonize yes
pidfile /home/finance/app/redis/conf/redis_6379.pid
logfile "/home/finance/logs/redis/redis_6379.log"
dbfilename 6379-dump.rdb
dir  /home/finance/data/redis/
cluster-enabled yes							#是否开启集群
cluster-config-file /home/finance/app/redis/conf/node-6379.conf	#见下方注释说明
cluster-node-timeout 15000	
#cluster-config-file <filename>:请注意,尽管有此选项的名称,但这不是用户可编辑的配置文件,而是Redis群集节点每次发生更改时自动保留群集配置(基本上为状态)的文件,以便能够 在启动时重新读取它。 该文件列出了群集中其他节点,它们的状态,持久变量等等。 由于某些消息的接收,通常会将此文件重写并刷新到磁盘上。

修改slave配置文件

bind 0.0.0.0
port 6380
daemonize yes
pidfile /home/finance/app/redis/conf/redis_6380.pid
logfile "/home/finance/logs/redis/redis_6380.log"
dbfilename 6380-dump.rdb
dir /home/finance/data/redis/
cluster-enabled yes
cluster-config-file /home/finance/app/redis/conf/node-6380.conf
cluster-node-timeout 15000

其他两台scp过去即可

启动三台redis

redis-server /home/finance/app/redis/conf/redis-6379.conf 
redis-server /home/finance/app/redis/conf/redis-6380.conf 

创建redis cluster

  • redis5.0以上可以不使用ruby创建集群,5.0以下需要使用
  • 启动顺序:主-主-主-从-从-从,redis会自动把从节点与主节点不分在同一台服务器上
redis-cli --cluster create --cluster-replicas 1 \
192.168.100.101:6379 \
192.168.100.102:6379 \
192.168.100.103:6379 \
192.168.100.101:6380 \
192.168.100.102:6380 \
192.168.100.103:6380

查看集群

redis-cli -p 6379 cluster nodes
#b4ba175aac10a3c46f0226ab317f4f48b51b5a74 192.168.100.103:6379@16379 master - 0 1642145605000 3 connected 10923-16383
#342726a5040b569385ea6d1c42b91fda4dba82b1 192.168.100.102:6380@16380 slave d8d0c9a6d3206a479f8d4c01bc14d34017b22c85 0 1642145605385 5 connected
#da332eaef2c475149cf7cc83dc792f5c6dbe433f 192.168.100.101:6380@16380 slave b4ba175aac10a3c46f0226ab317f4f48b51b5a74 0 1642145606406 4 connected
#735dc2ff36a9ef469cc1c439a011a9796cc2c7ee 192.168.100.102:6379@16379 master - 0 1642145606000 2 connected 5461-10922
#22fd4a6b8156b979842b82355b0b603ed381038d 192.168.100.103:6380@16380 slave 735dc2ff36a9ef469cc1c439a011a9796cc2c7ee 0 1642145607422 6 connected
#d8d0c9a6d3206a479f8d4c01bc14d34017b22c85 192.168.100.101:6379@16379 myself,master - 0 1642145605000 1 connected 0-5460

#查看redis从节点信息,发现并没有分配在同一台服务器上
redis-cli -p 6379 info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.100.102,port=6380,state=online,offset=392,lag=0
master_replid:c96725473dbdf452888de2157acc9aef27785f37
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:392
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:392

验证集群可用性

  • -c 集群模式
#创建key
edis-cli -p 6379 -c
127.0.0.1:6379> set k 1
-> Redirected to slot [7629] located at 192.168.100.102:6379
OK

#其他节点查看key
redis-cli -p 6379 -c
127.0.0.1:6379> get k 
"1"

验证集群故障转移

#kill掉master
kill -9 13576

#再次查看集群信息
redis-cli -p 6380 -c cluster nodes
d8d0c9a6d3206a479f8d4c01bc14d34017b22c85 192.168.100.101:6379@16379 master - 0 1642146768000 1 connected 0-5460
22fd4a6b8156b979842b82355b0b603ed381038d 192.168.100.103:6380@16380 myself,slave 735dc2ff36a9ef469cc1c439a011a9796cc2c7ee 0 1642146766000 6 connected
342726a5040b569385ea6d1c42b91fda4dba82b1 192.168.100.102:6380@16380 slave d8d0c9a6d3206a479f8d4c01bc14d34017b22c85 0 1642146768057 5 connected
b4ba175aac10a3c46f0226ab317f4f48b51b5a74 192.168.100.103:6379@16379 master,fail - 1642146727242 1642146725200 3 disconnected
da332eaef2c475149cf7cc83dc792f5c6dbe433f 192.168.100.101:6380@16380 master - 0 1642146765000 7 connected 10923-16383
735dc2ff36a9ef469cc1c439a011a9796cc2c7ee 192.168.100.102:6379@16379 master - 0 1642146769080 2 connected 5461-10922

#恢复
192.168.100.102:6379> CLUSTER nodes
b4ba175aac10a3c46f0226ab317f4f48b51b5a74 192.168.100.103:6379@16379 slave,fail da332eaef2c475149cf7cc83dc792f5c6dbe433f 1642147108342 1642147108034 7 disconnected
22fd4a6b8156b979842b82355b0b603ed381038d 192.168.100.103:6380@16380 slave 735dc2ff36a9ef469cc1c439a011a9796cc2c7ee 0 1642148115787 6 connected
342726a5040b569385ea6d1c42b91fda4dba82b1 192.168.100.102:6380@16380 slave d8d0c9a6d3206a479f8d4c01bc14d34017b22c85 0 1642148116804 5 connected
d8d0c9a6d3206a479f8d4c01bc14d34017b22c85 192.168.100.101:6379@16379 master - 0 1642148115000 1 connected 0-5460
735dc2ff36a9ef469cc1c439a011a9796cc2c7ee 192.168.100.102:6379@16379 myself,master - 0 1642148117000 2 connected 5461-10922
da332eaef2c475149cf7cc83dc792f5c6dbe433f 192.168.100.101:6380@16380 master - 0 1642148117827 7 connected 10923-16383
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值