RDB传输时 被传端需要关闭redis
未设置systemctl时的message
redis 是一个开源 用c语言编写的 支持网络交互 可基于内存也可持久化的key-value数据库
特点 丰富的数据结构 支持持久化 支持事务 支持主从
redis官网 redis.io 特点 支持持久化 支持事务 支持主从 数据结构丰富(list set hash)
redis启动命令 需要启动启动文件和配置文件 如 ./redis-server ../redis.conf &
配置redis为systemctl启动
[Unit]
Description=Redis
After=network.target
[Service]
ExecStart=/data/application/redis/src/redis-server /data/application/redis/redis.conf --daemonize no
ExecStop=/data/application/redis/src/redis-cli -h 127.0.0.1 -p 6379 shutdown
[Install]
WantedBy=multi-user.target
参数详解
[Unit] 表示基础信息
Description 描述
After 在那个服务后面启动 一般是网络服务启动后启动
[Service] 服务信息
ExecStart 启动命令
ExecStop 停止服务的指令
[Install] 表示安装相关信息
WentedBy 以那种方式启动 multi-user.target 表示当前系统以多用户启动时 这个服务需要被自动运行
systemctl daemon-reload 重新加载systemctl
redis持久化两种方式
RDB 快照 周期性 不影响数据写入 高效 完整性差 写入速度慢
AOF 记录命令 实时性 完整性很好 体积大 写入速度快
开启RDB vim redis.conf
dbfilename dump.rdb 持久化数据存储在本地文件
dir /data/application/redis/data 持久化数据存储在本地路径
save 每多少秒有多少个key更改进行持久化存储
stop-writes-on-bgsave-error yes 持久化出错时 停止 rdb 快照
rdbcompression yes 开启rdb文件压缩
开启持久化功能后 重启redis后 数据会自动通过持久化文件恢复
Redis主从配置
主从架构中 可以考虑关闭主服务器数据持久化功能 只让从服务器进行持久化 只有可以提高主服务器的处理性能
主从原理
从服务器会向主服务器发出sync指令 当主服务器接到后 会调用bgsave指令构建一个子进程进行数据持久化工作 在持久化期间主服务器将执行的写指令都缓存在内存中
在bgsave指令执行完成后 主服务器会将rdb包文件发送给从服务器 从服务器接到文件后将其存储到磁盘上 然后再读取到内存里 这个动作完成后 主服务器会将这段时间缓存的写指令再以redis协议格式发送到从服务器 即使多个从服务器同时发送sync 主服务器也只会执行一次bgsave 然后把 持久化好的rdb文件发给多个从服务器
主从配置
protected-mode no 此时外部网络可以直接访问
protected-mode yes 保护模式 需要配置bind ip 或者设置访问密码
从配置里写 replicaof 后跟主ip 跟端口号
在 > 上面 输入info replication查看主从关系和状态
redis sentinel(森ten 脑)哨兵模式
./src/redis-sentinel sentinel.conf & 启动命令
sentinel 哨兵模式是用于监控redis集群中master状态的工具
如果master状态异常 则会进行主从切换
工作模式 每个sentinel每秒会向所知的master发送ping命令 如果回复超时则会被判为主管下线 这时其他哨兵也会对其发送ping请求 超过设置一定量的主管下线会被定为客观下线 然后进行主从切换
配置
修改sentinel.conf配置文件
sentinel monitor mymaster 被监控的ip 被监控的端口 当集群有指定数量sentinel认为master死了时进行转换
sentinel down-after-milliseconds mymaster 单位毫秒
sentinel failover-timeout mymaster 指定毫秒 若sentinel在指定时间内未能完成转换 怎分配给其他哨兵
protected-mode no 关闭加密模式
redis cluster(克拉斯特)去中心化集群
为什么要做去中心化集群 单点redis容量有限 流量压力大 并发问题
redis cluster 特点 所有redis节点彼此互联 内部使用二进制协议优化传输速度和带宽
客户端不需要连接所有节点 连接集群中任意一个节点都可以读取到数据
节点的fail是通过集群中超过半数的节点检测失效时才生效的
redis-cluster集群有16384个哈希槽 每个redis负责一部分槽位 一个槽位里可以存储多个数据
集群通过哈希槽和二进制协议进行互通互联
redis cluster主从模式
一个主节点可以对应多个或者一个从节点 主节点down掉之后 从节点会进行替补 保证数据的高可用以及集群不会崩掉
主从切换机制 半数以上的master与主节点通信超时 则会触发主从切换
当一个主节点没有从节点 并且挂掉的时候 整个服务会崩掉
配置
vim redis.conf
port 监听端口 运行多个实例
daemonize yes redis后台运行
pidfile 运行多个实例时需要指定不同pid
logfile 日志文件 需要修改不同
dir 存放数据的目录
appendonly yes 开启aof持久化 当redis开机时 会从该文件恢复到之前的状态
appendfilename aof文件名称
appendfsync everysec 对写操作进行累积 每秒同步一次
cluster-enabled yes 启用集群
cluster-config-file 集群配置文件
cluster-node-timeout 单位毫秒 集群超时时间 主从替换
cluster-replica-validity-factor 10 判断主从节点是否超时
cluster-migration-barrier 1 一个主机将保持连接的最小数量的从机,以便另一个从机迁移到不再被任何从机覆盖的主机
cluster-require-full-coverage yes 集群中的所有slot(16384个)全部覆盖,才能提供服务
首先启动各个节点
启动集群./redis-cli --cluster create --cluster-replicas 后跟ip端口
cluster info 查看集群信息 cluster_state:ok #集群状态
添加节点 加节点 加槽 加从机
./redis-cli --cluster add-node 要添加的 随便一个集群主节点ip
cluster nodes 查看集群信息
runid: 该行描述的节点的id。
ip:prot: 该行描述的节点的ip和port
flags: 逗号分隔的标记位,可能的值有:
1.master: 该行描述的节点是master
2.slave: 该行描述的节点是slave
3.fail?:该行描述的节点可能不可用
4.fail:该行描述的节点不可用(故障)
master_runid: 该行描述的节点的master的id,如果本身是master则显示-
ping-sent: 最近一次发送ping的Unix时间戳,0表示未发送过
pong-recv:最近一次收到pong的Unix时间戳,0表示未收到过
config-epoch: 主从切换的次数
link-state: 连接状态,connnected 和 disconnected
hash slot: 该行描述的master中存储的key的hash的范围
分槽 ./redis-cli --cluster reshard 跟添加节点ip
后续会出现三次选项 可以选择
添加从节点 ./redis-cli --cluster add-node 主ip 从ip --cluster-slave --cluster-master-id 主id
平衡各个节点的槽
./redis-cli --cluster rebalance --cluster-threshold 1 (只要不均衡的槽超过一个 就会运行平衡) 跟随便一个集群主节点ip
删除节点 下线从节点 去槽 下线
退出所有链接的客户端,然后在任意一台机器执行
./redis-cli --cluster del-node 跟从节点ip id
删除槽
./redis-cli --cluster info 跟主节点ip 查看各个节点槽数
删除槽 ./redis-cli --cluster reshard 要删除的ip --cluster-from 删除节点的id --cluster-to 接受槽的id --cluster-slots 移除槽的数量 --cluster-yes
删除节点
./redis-cli --cluster del-node 跟ip 跟id