大数据-redis
分布式缓存数据库
单节点安装
-
-
cd /opt/sxt/redis-3.2.9
-
yum -y install gcc tcl (依赖安装)
-
make (在/opt/sxt/redis-3.2.9目录下)
-
make install (目录同上)
-
修改配置文件:vim redis.conf
daemonize:yes(后台运行)
bind 127.0.0.1 192.168.163.201 (配置本机ip)
-
启动并指定配置:redis-server /opt/sxt/redis-3.2.9/redis.conf
-
本地启动客户端 redis-cli
-
关闭进程方法
ps -ef | grep redis 查找redis的进程号
kill -9 xxx 杀死进程
命令行
库与key操作
String操作
List操作
Set操作
Sorted set操作
hash操作
主从节点操作
用于从节点的临时操作,使用在程序运行期
-
外部节点临时成为从节点命令:slaveof 192.168.163.201 6379
连接到主节点后,原有数据清空,再同步主节点数据
-
从节点临时解除从属命令:slaveof no one (不会清理掉同步到的数据)
持久化
RDB
-
对内存保存快照到硬盘 dump.rdb(默认存放在配置文件的目录下)
-
触发:60s内1w条数据;300s内10条数据;900s内1条数据(配置文件中的save属性)
-
正常关机会触发rdb,开机时再将快照恢复到内存中
-
关闭rdb
临时关闭rdb: 命令 config set save ""
永久关闭edb:配置文件 save "" ,其他save配置注释
-
单次触发
命令sava ,手动触发rdb,阻塞执行
bgsave,手动触发rdb,后台执行,不触发rdb
-
可能导致数据丢失
AOF
-
保存操作日志(aof文件 appendonly.aof),默认存放在配置文件的目录下
-
redis优先使用aof恢复数据,也就是重写执行日志文件(rdb优先级在后)
-
日志重写时,存在数据丢失的风险
-
redis.conf的参数配置
-
设置aof启动:appendonly yes
优先使用aof持久化(rdb优先级在后)
-
appendfsync 策略
-
always:实时保存,数据不会丢失,效率差(日志持久化后响应数据存储完成)
-
everysec:1s保存一次日志,默认 (不需要等待日志持久化)
-
no: 将日志数据交给操作系统来处理,数据不安全,速度最快
-
-
rewrite 机制
合并日志文件,对日志文件解析压缩(去除无效数据)
配置参数
重写时不支持插入数据:no-appendfsync-on-rewrite no
扩展倍数:auto-aof-rewrite-percentage 默认100(增加一倍)(到达基准存储大小后扩展日志文件的最大空间,避免重复空间扩展)
日志基准大小:auto-aof-rewrite-min-size 默认64M (日志文件的初始大小上限,日志文件大小达到基准大小,则启动日志重写)
-
-
清空数据 flushall 。若需要恢复数据只能修改aof文件后才能实现
主从复制
主节点执行客户端读写操作,再将数据同步到从节点。从节点一般只执行读操作。
主从复制实现读写分离。
数据后台同步:非阻塞异步复制,1s执行一次 (同步时故障,少量写入的数据丢失)
集群:从节点也能创建其自身的从节点
配置主从节点
-
复制项目与命令目录
cd /opt/sxt
scp -r redis-3.2.9 node2:`pwd`
scp -r redis-3.2.9 node3:`pwd`
cd /usr/local/bin
scp * node2:`pwd`
scp * node3:`pwd` -
修改配置文件
-
配置本地ip
bind 127.0.0.1 192.168.163.202
-
从节点中配置主节点ip和端口(默认端口是6379)
slaveof 192.168.163.201 6379
-
-
redis账号密码
-
主节点配置 requirepass <password>
-
从节点配置 masterauth <password>
-
-
主节点生效条件,满足条件主节点才执行写操作
最少从节点数 min-slaves-to-write <number of slaves>
最大延迟 min-slaves-max-lag <number of seconds>
-
启动主从节点(3节点同时执行)
redis-server redis.conf
redis-cli
哨兵sentinel
实时监控主从节点,故障提示,自动故障迁移。
哨兵自动故障迁移时切换的主从关系是永久性的,修改了各节点的配置文件中的主从配置信息
原主机掉线后,重新上线哨兵会修改这个节点的从属配置,其成为一个从节点
哨兵是一个集群,通过投票判断节点离线。
配置哨兵
-
进入配置文件
vim /opt/sxt/redis-3.2.9/sentinel.conf
-
修改:主从集群名;当前主节点ip和端口 ;断线投票数 (可以配置多个小集群)
sentinel monitor mymaster 192.168.78.101 6379 2
通过主节点,哨兵获取从节点与其他哨兵
-
修改掉线判断时间,默认30s哨兵确认掉线
-
sentinel down-after-milliseconds mymaster 30000
-
故障迁移时间,超时认为迁移失败
sentinel failover-timeout mymaster 180000
-
故障迁移时,几个节点多新的主节点进行数据同步
sentinel parallel-syncs mymaster 1
-
关闭保护模式
protected-mode no
本次使用自己的配置文件,不是用修改的配置文件
sentinel monitor mymaster 192.168.163.201 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
protected-mode no -
-
将配置文件复制到其他节点中
scp sentinel.conf node2:/opt/sxt/redis-3.2.9
scp sentinel.conf node3:/opt/sxt/redis-3.2.9
-
启动redis与哨兵(redis目录下)
redis-server redis.conf
redis-sentinel sentinel.conf
在哨兵日志中能够看到哨兵节点与redis节点的连接信息
分布式集群
从3版本开始支持。
原理:根据key计算hash,hash值对指定值(16384)类型取余运算,得到16384个哈希槽,数据进入不同的哈希槽。哈希槽分布在分布式集群的各节点上。
哈希槽的数据能够在后台,在节点之间迁移,不会导致节点阻塞。
哈希槽的迁移能够实现控制节点上下线,自动分配数据。
分布式也支持主从节点复制。
数据一致性问题
-
同步丢失,主从节点进行数据同步,采用非阻塞复制,1s执行一次 (若同步时故障,少量写入的数据丢失)
-
集群分裂,且一个客户端与至少包括一个主节点在内的少数(minority)实例被孤立。
重新连接后,分裂出去的节点同步后失去部分数据。
集群分裂解决方案:自检发现自己为节点少数方,自动下线,减少数据的丢失
搭建分布式
配置6个配置文件,通过配置文件启动6个节点
配置不同的端口使得有个机器上运行若干redis节点
-
配置文件 redis.conf
-
开启的端口:port 7000
-
集群可用:cluster-enabled yes
-
集群配置:cluster-config-file nodes.conf
-
节点超时:cluster-node-timeout 5000
-
aof持久化:appendonly yes
-
后台进程:daemonize yes
-
保护模式关闭protected-mode no
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
protected-mode no -
-
将不同的配置文件置入不同文件夹中,使得持久化数据进入不同的目录
例如:在redis目录下建立cluster文件夹,其中创建7000文件夹与7001文件夹
7000目录放置7000端口的配置文件;7001目录放置7001端口的配置文件
本次配置中,3台机器,每台机器上各设置7000端口与7001端口两个redis节点
-
启动redis各节点
-
安装ruby相关依赖(单节点执行)
yum install ruby
yum install rubygems
gem install redis-3.2.1.gem 使用本地安装redis-3.2.1.gem,在这个文件的路径下执行gem命令
-
集群构建
replicas参数:
表示主节点分配一个从节点,也就是说6个节点中(3主3从)
表示主节点分配二个从节点,也就是说6个节点中(2主4从)
最后接上各节点的ip与端口
cd /opt/sxt/redis-3.2.9/src
./redis-trib.rb create --replicas 1 192.168.163.201:7000 192.168.163.201:7001 192.168.163.202:7000 192.168.163.202:7001 192.168.163.203:7000 192.168.163.203:7001 -
连接集群
redis-cli -p 7000 -c (指定7000端口连接,允许自动节点切换)
redis-cli -h node1 -p 7000 -c (指定主机+ip,允许自动节点切换)
-
关闭集群
客户端执行命令shutdown
或者liunx命令执行节点关闭:redis-cli -p 7001 shutdown
redis的API