跳至主要內容

部署配置

酷风大约 6 分钟

部署配置

配置

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:集群管理的插件
>>> 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 分配到新节点上后,新节点才能起作用。
    • 缩容
      • reshard移除的机器上的 slots
      • add-del移除机器
优缺点
  • 采用去中心化思想,数据按照 slot 存储分布在多个节点,节点间数据共享,可动态调整数据分布

  • 可扩展性:可线性扩展到 1000 多个节点,节点可动态添加或删除

  • 高可用性:部分节点不可用时,集群仍可用

  • 降低运维成本

  • Redis Cluster 是无中心节点的集群架构,依靠 Goss 协议(谣言传播)协同自动化修复集群的状态

    • GosSIp 有消息延时和消息冗余的问题,在集群节点数量过多的时候,节点之间需要不断进行 PING/PANG 通讯,不必须要的流量占用了大量的网络资源。虽然 Reds4.0 对此进行了优化,但这个问题仍然存在。
  • 数据迁移问题

    • 动态扩容缩容,半自动化,需要人工介入
      • 在扩缩容的时候,需要进行数据迁移。
    • 而 Redis 为了保证迁移的一致性,迁移所有操作都是同步操作,执行迁移时,两端的 Redis 均会进入时长不等的阻塞状态,对于小 Key,该时间可以忽略不计,但如果一旦 Key 的内存使用过大,严重的时候会接触发集群内的故障转移,造成不必要的切换。

参考