部署配置
部署配置
配置
bind 127.0.0.1
# 限制访问;注释后,取消访问限制
# 127.0.0.1 本地连接
# 修改为其他IP
protected-mode no
# 默认yes,如果设置为yes,则只允许在本机的回环连接,其他机器无法连接。
daemonize no
# 默认no 为不守护进程模式,docker部署不需要改为yes,docker run -d本身就是后台启动,不然会冲突
requirepass 123456
# 设置密码
appendonly yes
# 持久化
Docker
定义数据目录
/path/data
定义配置目录
/path/conf
docker redis-7.2
docker run -v /path/data:/data -v /path/conf:/usr/local/etc/redis --name myredis redis:7.2 redis-server /usr/local/etc/redis/redis.conf
部署
单机启动
redis-server file.conf
高可用
主从
Redis : 复制(replication)功能
- 当一台 redis 数据库中的数据发生了变化,这个变化会被自动的同步到其他的 redis 机器上去。
一主多从
从节点 配置
# 主节点信息 IP Port
slaveof 192.168.1.66 6379
# 从节点设置只读;从redis2.6开始,默认是只读的
slave-read-only yes
# 主节点 密码
masterauth 123456
也可通过启动命令指定 主节点
redis-server --slaveof 192.168.1.66 6379
也可通过redis-cli 指定 master
slaveof 192.168.1.66 6379
主节点挂掉
- redis-cli 执行命令
- 在某个从节点上执行
slaveof no one
(关闭从服务器的复制功能) 使其成为主节点 192.168.1.88 - 在其他从节点上执行
slaveof 192.168.1.88 6379
指向新的master
优缺点
主从复制,自动复制,读写分离
不具备自动容错和恢复功能,手动切换
- 宕机及手动切换,会造成数据不一致问题,降低了系统的可用性
当多个从节点需要重启,不能同时重启,可能会造成master IO 压力增加
Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂
redis 的主节点和从节点中的数据是一样的,降低的内存的可用性
哨兵
哨兵命令redis-sentinel
主从模式下,主节点宕机,需要手动切换节点
哨兵模式下,主节点宕机,会自主选择主节点,并将其他的 slave 指向新的 master
哨兵可以有多个,一般为了便于决策选举,使用奇数个哨兵
- 哨兵直接也会相互通信,检查哨兵是否正常运行,同时发现 master 宕机哨兵之间会进行决策选举新的 master
哨兵配置
# 禁止保护模式
protected-mode no
# 配置监听的主服务器 IP Port,这里sentinel monitor代表监控,
# mymaster代表服务器的名称,可以自定义,
# 2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。
sentinel monitor mymaster 192.168.1.10 6379 2
# sentinel author-pass 定义服务的密码,mymaster是服务名称,123456是Redis服务器密码
sentinel auth-pass mymaster 123456
优缺点
主从模式
主从自动切换,可用性更高,系统更健壮
与主从模式一样
- 内存的可用性较低,每台机器上的数据是一样的
- 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。
集群
slots 插槽
redis3.0 Cluster 集群模式
实现了 Redis 的分布式存储,对数据进行分片,也就是说每台 Redis 节点上存储不同的内容;
每个节点都会通过集群总线(cluster bus),与其他的节点进行通信。
- 通讯时使用特殊的端口号,即对外服务端口号加 10000。例如如果某个 node 的端口号是 6379,那么它与其它 nodes 通信的端口号是 16379。nodes 之间的通信采用特殊的二进制协议。
对客户端来说,整个 cluster 被看做是一个整体
- 客户端可以连接任意一个 node 进行操作,就像操作单一 Redis 实例一样,当客户端操作的 key 没有分配到该 node 上时,Redis 会返回转向指令,指向正确的 node,这有点儿像浏览器页面的 302 redirect 跳转。
根据官方推荐,集群部署至少要 3 台以上的 master 节点,最好使用 3 主 3 从六个节点的模式
配置
# 开启redis的集群模式
cluster-enabled yes
# 配置集群模式下的配置文件名称和位置,redis-cluster.conf这个文件是集群启动后自动生成的,不需要手动配置。
cluster-config-file redis-cluster.conf
借助 redis-tri.rb 工具可以快速的部署集群
redis-trib.rb create --replicas 1 ip:port ....
集群方式连接redis:
redis-cli -c
CLUSTER INFO
集群状态CLUSTER NODES
集群节点
运行机制
- 插槽(slot):取值范围是:0-16383
- 分布在三个 master 上
- cluster:集群管理的插件
- 插槽(slot):取值范围是:0-16383
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
- 为了保证高可用,redis-cluster 集群引入了主从模式
- 一个主节点对应一个或者多个从节点
- 当其它主节点 ping 主节点 master 1 时,如果半数以上的主节点与 master 1 通信超时,那么认为 master 1 宕机了,就会启用 master 1 的从节点 slave 1,将 slave 1 变成主节点继续提供服务。
- 如果 master 1 和它的从节点 slave 1 都宕机了
- 整个集群就会进入 fail 状态,因为集群的 slot 映射不完整。
- 如果集群超过半数以上的 master 挂掉,无论是否有 slave,集群都会进入 fail 状态。
扩缩容
- 集群管理工具 redis-tri.rb
- 扩容
- add-node 将新的机器加到集群中
- 但是没有分配 slots,依然是不起做用的。
- reshard 进行分片重哈希(数据迁移)
- 将旧节点上的 slots 分配到新节点上后,新节点才能起作用。
- add-node 将新的机器加到集群中
- 缩容
- reshard移除的机器上的 slots
- add-del移除机器
- 扩容
优缺点
采用去中心化思想,数据按照 slot 存储分布在多个节点,节点间数据共享,可动态调整数据分布
可扩展性:可线性扩展到 1000 多个节点,节点可动态添加或删除
高可用性:部分节点不可用时,集群仍可用
降低运维成本
Redis Cluster 是无中心节点的集群架构,依靠 Goss 协议(谣言传播)协同自动化修复集群的状态
- GosSIp 有消息延时和消息冗余的问题,在集群节点数量过多的时候,节点之间需要不断进行 PING/PANG 通讯,不必须要的流量占用了大量的网络资源。虽然 Reds4.0 对此进行了优化,但这个问题仍然存在。
数据迁移问题
- 动态扩容缩容,半自动化,需要人工介入
- 在扩缩容的时候,需要进行数据迁移。
- 而 Redis 为了保证迁移的一致性,迁移所有操作都是同步操作,执行迁移时,两端的 Redis 均会进入时长不等的阻塞状态,对于小 Key,该时间可以忽略不计,但如果一旦 Key 的内存使用过大,严重的时候会接触发集群内的故障转移,造成不必要的切换。
- 动态扩容缩容,半自动化,需要人工介入
参考
- 作者:诸葛小猿 redis 系列之——高可用(主从、哨兵、集群)