一 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
主从数据复制是否使用无硬盘复制功能。默认值为norepl-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持久化
手动触发
save
和bgsave
命令都可以手动触发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命令的具体流程:
-
执行bgsave命令,Redis进程先判断当前是否存在正在执行的RDB或AOF子线程,如果存在就是直接结束。
-
Redis进程执行fork操作创建子线程,在fork操作的过程中Redis进程会被阻塞。
-
Redis进程fork完成后,bgsave命令就结束了,自此Redis进程不会被阻塞,可以响应其他命令。
-
子进程根据Redis进程的内存生成快照文件,并替换原有的RDB文件。 子进程通过信号量通知Redis进程已完成
自动触发
- 在配置文件中设置了save的相关配置,如sava m n,它表示在m秒内数据被修改过n次时,自动触发bgsave操作。
- 当从节点做全量复制时,主节点会自动执行bgsave操作,并且把生成的RDB文件发送给从节点。
- 执行shutdown命令时,如果没有开启AOF持久化也会自动触发bgsave操作。
优点
- 数据恢复很快,非常适合备份、全量复制、灾难恢复等场景。
缺点
- 每次执行
bgsave
的时候都会fork一个子进程,成本太大。 - 无法做到秒级的持久化
AOF持久化
AOF持久化就是吧所有写操作保存到持久化的日志里,然后需要恢复的时候重新执行AOF文件即可,这样解决了数据持久化的实时性,也是目前redis主流的持久化。
- 命令追加(append):所有写命令都会被追加到AOF缓存区(aof_buf)中。
- 文件同步(sync):根据不同策略将AOF缓存区同步到AOF文件中。
- 文件重写(rewrite):定期对AOF文件进行重写,以达到压缩的目的。
- 数据加载(load):当需要恢复数据时,重新执行AOF文件中的命令
文件同步策略
- always:每次写入缓存区都要同步到AOF文件中,硬盘的操作比较慢,限制了Redis高并发,不建议配置。
- no:每次写入缓存区后不进行同步,同步到AOF文件的操作由操作系统负责,每次同步AOF文件的周期不可控,而且增大了每次同步的硬盘的数据量。
- eversec:每次写入缓存区后,由专门的线程每秒钟同步一次,做到了兼顾性能和数据安全。是建议的同步策略,也是默认的策略。
触发方式
- 手动触发:使用bgrewriteaof命令。
- 自动触发:根据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
数据恢复优先级
- 如果只配置了RDB持久化,启动redis时就会自动恢复RDB数据,AOF同理
- 如果配置了AOF与RDB持久化,启动redis时会自动恢复AOF数据。
持久化总结
- RDB持久化是将当前数据保存在硬盘中。
- AOF是将写操作保存到硬盘当中,对于数据完整性更高的可以采用这种方式。
- 如果redis只是作为缓存使用,就没有必要开启持久化功能。
- AOF根据持久化策略,每秒写入,最多就丢失一秒的数据。
- 因为RDB只作为备用持久化功能,建议在slave上做。
八 主从复制
概念
主从复制是将一台数据复制到另一台上,前者称为master,主要负责写,后者成为slave,主要负责读,数据的复制都是单向的,只能由主节点复制到从节点
且一个master可以有多个slave,一个slave只能有一个master。
作用
-
数据备份
主从复制是持久化之外的另一种热备份方式。 -
故障修复
当主节点出现了问题以后,从节点可以代替工作。 -
读写分离
在主从复制的基础上,可以由主节点负责写操作,从负责读操作,分担服务器压力。 -
高可用
在主从复制的基础上,加上烧饼即可实现高可用
原理
- slave启动成功后会像master发送一个sync同步命令
- master收到命令后会将整个数据
全量复制
到slave - slave收到后会将数据存入磁盘并写入到内存当中。
- master后续的数据会以
增量复制
的形式同步到slave中。 - 后续如果有新的slave节点加入,master将
全量复制
到slave中
部署主从
架构图
主机规划
IP | 角色 | 端口 |
---|---|---|
192.168.100.101 | master | 6379 |
192.168.100.102 | slave | 6380 |
192.168.100.103 | slave | 6381 |
配置文件 | 日志 | 持久化路径 |
---|---|---|
/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
补充
- 如果slave处于查看master的状态是处于
down
的状态。
- 查看master的bind是否为0.0.0.0。
- 查看master是否设置密码,如果设置则需要slave修改上述参数
- master如果挂了,数据将在slave进行读取,等master修复以后将自动加入集群且还是master身份。
九 哨兵
概念
哨兵就是自动故障切换,当主节点出现了问题以后,slave会自动成为主进行工作,从而实现自动切换,使用烧饼模式,服务器数量一定要是 3 5 7 9这类的奇数,因为当master挂了以后,slave节点会镜像leader
投票选举,
原理
- 每个Sentinel(哨兵)进程以每秒钟一次的频率向整个集群中的Master主服务器,Slave从服务器以及其他Sentinel(哨兵)进程发送一个
PING 命令。 - 如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds
选项所指定的值,则这个实例会被 Sentinel(哨兵)进程标记为主观下线(SDOWN)。 - 如果一个Master主服务器被标记为主观下线(SDOWN),则正在监视这个Master主服务器的所有
Sentinel(哨兵)进程要以每秒一次的频率确认Master主服务器的确进入了主观下线状态。 - 当有足够数量的
Sentinel(哨兵)进程(大于等于配置文件指定的值)在指定的时间范围内确认Master主服务器进入了主观下线状态(SDOWN),
则Master主服务器会被标记为客观下线(ODOWN)。 在一般情况下, 每个Sentinel(哨兵)进程会以每 10
秒一次的频率向集群中的所有Master主服务器、Slave从服务器发送 INFO 命令。 - 当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 | 端口 |
---|---|---|
master | 192.168.100.101 | 6379 |
slave | 192.168.100.102 | 6379 |
slave | 192.168.100.103 | 6379 |
主从部署
#安装
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 | 端口 |
---|---|---|
master | 192.168.100.101 | 6379 |
master | 192.168.100.102 | 6379 |
master | 192.168.100.103 | 6379 |
slave | 192.168.100.101 | 6380 |
slave | 192.168.100.102 | 6380 |
slave | 192.168.100.103 | 6380 |
三主三从部署
配置文件
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