• 分布式--Redis持久化策略、主从复制、集群


    一、持久化策略

    上篇提到Redis和memcached对比,还具有持久化功能,Redis支持两种持久化策略:

    策略描述优点缺点
    rdb默认模式,可以在指定间隔时间内生成数据快照,默认保存到dump.rdb文件中,每次重启会从该文件中读取数据保存在子进程中,对主进程影响小;rdb是紧凑型文件,恢复数据效率高于aof保存点之间redis崩溃,可能会丢失数据;子进程fork时,数据量过大导致的性能低下
    aof执行修改数据的操作,直接同步到数据库文件中数据安全性高文件大小大于rdb,效率较慢

    开启aof需要修改配置文件:

    1. # 开启aof
    2. appendonly yes
    3. # 保存的文件名
    4. appendfilename "appendonly.aof"

    二、主从复制

    Redis支持一主多从,保证节点的高可用,节点有多个复制品(replica)构成,其中一个为主(master),其余的为从(slave)
    主从复制可以对主节点数据备份,提升容灾能力。在Redis中,主节点一般用作写数据,从节点只具备读数据功能,因而实现读写分离,提高集群性能

    1. 主从环境搭建

    我们需要使用多个redis来模拟多台服务器,在redis安装目录/usr/local/redis新建一个replica目录,并在其中创建masterslave1slave2目录

    1. mkdir replica
    2. cd replica
    3. mkdir master
    4. mkdir slave1
    5. mkdir slave2

    将redis下的bin目录分别复制到三个目录中

    1. cp -r bin ./replica/master
    2. cp -r bin ./replica/slave1
    3. cp -r bin ./replica/slave2

    2. 修改主从配置

    目前主机的端口为:6379

    修改两个从机的配置,一个设置为6380,一个设置为6381

    1. # 端口
    2. port 6380
    3. # 主机ip和端口
    4. replicaof 192.168.42.4 6379

    3. 启动三个redis

    编写shell脚本:

    vi start.sh

    内容为:

    1. cd /usr/local/redis/replica/master/bin
    2. ./redis-server redis.conf
    3. cd /usr/local/redis/replica/slave1/bin
    4. ./redis-server redis.conf
    5. cd /usr/local/redis/replica/slave2/bin
    6. ./redis-server redis.conf

    赋予权限并执行:

    1. chmod 777 start.sh
    2. ./start.sh

    查看进程:

    三个redis都正常启动完成了

    4. 测试主从

    4.1 主机写数据

    我们通过主机写数据,进入主机的客户端:

    1. cd /usr/local/redis/replica/master/bin/
    2. ./redis-cli

    写入数据:

    set info hello

    还可以使用info命令查看主机的状态:

    可以看到两个从机已经确立了主从关系

    4.2 从机读数据

    进入从机的客户端,使用-p指定6380端口:

    1. cd /usr/local/redis/replica/slave1/bin
    2. ./redis-cli -p 6380

    读取数据:

    get info

    结果:

    4.3 主机宕机

    将主机关闭,客户端中使用shutdown

    shutdown

    进程查看,已经关闭了:

    此时使用从机获取刚刚的数据依然有效:

    三、哨兵

    主从复制可以实现主机节点宕机后,依然可以获取从节点的数据,可用性确实提高了,但是从节点只能读不能写,这也是一个致命的问题。哨兵就是为了解决从机不可写而产生的,一旦发现主机宕机,那么哨兵将通过检举,提升一台从机为主机,因而使之拥有写能力,哨兵可以配置多台

    1. 配置文件

    将redis解压完的目录下的sentinel.conf文件复制三份到上面三个redis中

    1. cp ./sentinel.conf /usr/local/redis/replica/master/bin/
    2. cp ./sentinel.conf /usr/local/redis/replica/slave1/bin/
    3. cp ./sentinel.conf /usr/local/redis/replica/slave2/bin/

    修改内容为:

    1. # 改端口 ,推荐使用2+对应redis的端口
    2. port 26379
    3. # 后台进程
    4. daemonize yes
    5. # 出错日志存放路径
    6. logfile “/usr/local/redis/replica/master/26379.log”
    7. # 哨兵监听的主机ip和端口 后面2是表示2台哨兵发现后才触发从机升级
    8. sentinel monitor mymaster 192.168.93.10 6379 2
    1. # 改端口 ,推荐使用2+对应redis的端口
    2. port 26380
    3. # 后台进程
    4. daemonize yes
    5. # 出错日志存放路径
    6. logfile “/usr/local/redis/replica/slave1/26380.log”
    7. # 哨兵监听的主机ip和端口 后面2是表示2台哨兵发现后才触发从机升级
    8. sentinel monitor mymaster 192.168.93.10 6379 2
    1. # 改端口 ,推荐使用2+对应redis的端口
    2. port 26381
    3. # 后台进程
    4. daemonize yes
    5. # 出错日志存放路径
    6. logfile “/usr/local/redis/replica/slave2/26381.log”
    7. # 哨兵监听的主机ip和端口 后面2是表示2台哨兵发现后才触发从机升级
    8. sentinel monitor mymaster 192.168.93.10 6379 2

    2. 启动哨兵

    在启动哨兵之前,记得先把redis启动

    ./redis-sentinel ./sentinel.conf

    3. 测试

    接着把主机关闭:

    在从机中查看状态,可以看到上升为主机了:

    接着测试下写功能:

    四、集群

    哨兵解决了从节点不可写的问题,但没能解决负载均衡,集群解决了写操作的负载均衡,并可以水平扩展,在Redis中,超过1/2的节点不可用,那么整个集群就不可用了,所以我们都是搭建奇数台Redis服务器

    1. 环境搭建

    复制三份redis的bin目录到三个文件夹下:

    1. cd /usr/local/redis
    2. mkdir cluster
    3. cp -r bin cluster/cluster-7001
    4. cp -r bin cluster/cluster-7002
    5. cp -r bin cluster/cluster-7003
    6. cp -r bin cluster/cluster-7004
    7. cp -r bin cluster/cluster-7005
    8. cp -r bin cluster/cluster-7006

    2. 修改配置文件

    redis.conf配置文件修改以下内容:

    1. port 7001
    2. # 取消注释,开启集群功能
    3. cluster-enabled yes
    4. cluster-config-file nodes-7001.conf
    5. cluster-node-timeout 15000
    6. daemonize yes
    7. protected-mode no
    8. pidfile /var/run/redis_7001.pid
    1. port 7002
    2. # 取消注释,开启集群功能
    3. cluster-enabled yes
    4. cluster-config-file nodes-7002.conf
    5. cluster-node-timeout 15000
    6. daemonize yes
    7. protected-mode no
    8. pidfile /var/run/redis_7002.pid
    1. port 7003
    2. # 取消注释,开启集群功能
    3. cluster-enabled yes
    4. cluster-config-file nodes-7003.conf
    5. cluster-node-timeout 15000
    6. daemonize yes
    7. protected-mode no
    8. pidfile /var/run/redis_7003.pid

    剩余的4-6也进行配置

    3. 启动Redis

    1. -bash-4.2# pwd
    2. /usr/local/redis/cluster
    3. vi start-cluster.sh

    内容为:

    1. ./cluster-7001/redis-server ./cluster-7001/redis.conf
    2. ./cluster-7002/redis-server ./cluster-7002/redis.conf
    3. ./cluster-7003/redis-server ./cluster-7003/redis.conf
    4. ./cluster-7004/redis-server ./cluster-7004/redis.conf
    5. ./cluster-7005/redis-server ./cluster-7005/redis.conf
    6. ./cluster-7006/redis-server ./cluster-7006/redis.conf

    修改执行权限:

    chmod 777 ./start-cluster.sh

    启动Redis:

    ./start-cluster.sh

    进程查询:

    4. 启动集群

    上面只是启动了Redis,但想让多个Redis建立集群关系,还需使用下面命令(Redis5以上):

    ./redis-cli --cluster create 192.168.42.4:7001 192.168.42.4:7002 192.168.42.4:7003 192.168.42.4:7004 192.168.42.4:7005 192.168.42.4:7006 --cluster-replicas 1

    --cluster-replicas 2 表示1台主机对应1台从机

    执行后,输入yes

    5. 测试

    进入客户端,注意加上-c

    ./redis-cli -p 7001 -c

    结果:

    以上就是Redis的基本使用和配置

  • 相关阅读:
    深入解析HTTP(web开发详细理解原理)【JavaWeb】
    GUI 应用:socket 网络聊天室
    前端blob数据
    ASE docker related research
    作业2 计算文件长度和行数
    60. UE5 RPG 使用场景查询系统(EQS,Environment Query System)实现远程敌人寻找攻击位置
    第十一章 目标检测中的NMS(工具)
    合工大-人工智能原理实验报告
    [英雄星球七月集训LeetCode解题日报] 第5日 双指针
    【算法笔记】单源最短路问题——Dijkstra算法(无优化/优先队列/set优化)
  • 原文地址:https://blog.csdn.net/qq_24000367/article/details/125480359