当前位置: 首页 > news >正文

redis 主从复制方案

redis

  • 一、安装
  • 二、创建服务
  • 三、开启 redis 持久化
  • 四、开启主从配置
    • 修改 master 的主配置文件
    • 修改 slave1 和 slave2 的主配置文件
  • 五、测试

环境准备

  • 准备三台系统为CentOS7的主机
    • master:192.168.152.71
    • slave1:192.168.152.72
    • slave2:192.168.152.73

一、安装

Redis软件包仓库

  1. 安装开发工具包

    yum groupinstall "Development Tools" -y
    
  2. 获取 redis 源码包

    wget http://download.redis.io/releases/redis-4.0.9.tar.gz
    
  3. 解压

    tar xf ./redis-4.0.9.tar.gz -C /opt/
    
  4. 进入源码包进行 cd /opt/redis-4.0.9 编译安装,执行下面命令

    make && make install
    

二、创建服务

创建redis服务以便用system命令管理

  1. 复制 redis_init_script 文件,到 /etc/init.d/下面,并改名为redis

    cp /opt/redis-4.0.9/utils/redis_init_script /etc/init.d/redis
    
  2. 编辑 /etc/init.d/redis 文件

    再文件第 5 行添加下面内容,以便 system 命令识别

    ##NEW###
    # chkconfig: 2345 10 90
    # description: Start and Stop redis
    ##NEW###
    

    查看下面几行信息

    EXEC=/usr/local/bin/redis-server       # 按照第 7 行指定的目录,查看文件是否存在,一般是存在的
    CLIEXEC=/usr/local/bin/redis-cli       # 按照第 8 行指定的目录,查看文件是否存在,一般是存在的
    CONF="/etc/redis/${REDISPORT}.conf"    # 按照第 11行指定的目录,查看文件是否存在,一般是没有的,${REDISPORT} 的值为 6379,再文件第 6 行 或者 9、10行显示,这也是服务的端口号
    $EXEC $CONF $						   # 更改第 20 行,再行尾加上 & 符号
    

    如果 7、8 行指定的路径不存在,更改路径

    EXEC=/opt/redis-4.0.9/src/redis-server
    CLIEXEC=/opt/redis-4.0.9/src/redis-cli
    

    第 11 行指定的路径一般不存在,执行下面两个命令,该文件为主配置文件

    mkdir /etc/redis
    cp /opt/redis-4.0.9/redis.conf /etc/redis/6379.conf
    
  3. 重新加载 systemd 配置

    systemctl daemon-reload
    
  4. 启动redis

    systemctl start redis
    
  5. 进入 redis 客户端进行测试

    redis-cli 
    

三、开启 redis 持久化

  • 开启持久化功能后,重启redis后,数据会自动通过持久化文件恢复!!
    • 两种方式
    • RDB(Redis DataBase)
    • AOF(Append Only File)

因RDB数据不实时,但同时使用两者时服务器只会找AOF文件,所以RDB留作万一的手段。

RDB 开启状态,RDB 默认已经开启

vim /redis-4.0.9/redis.conf #dbfilename:持久化数据存储在本地的文件
dbfilename dump.rdb#dir:持久化数据存储在本地的路径,如果是在/redis/redis-3.0.6/src下启动的redis-cli,则数据会存储在当前src目录下
dir ./##snapshot触发的时机,save <seconds> <changes>  
##如下为900秒后,至少有一个变更操作,才会snapshot  
##对于此值的设置,需要谨慎,评估系统的变更操作密集程度  
##可以通过“save “””来关闭snapshot功能  
#save时间,以下分别表示更改了1个key时间隔900s进行持久化存储;更改了10个key300s进行存储;更改10000个key60s进行存储。
save 900 1
save 300 10
save 60 10000##当snapshot时出现错误无法继续时,是否阻塞客户端“变更操作”,“错误”可能因为磁盘已满/磁盘故障/OS级别异常等  
stop-writes-on-bgsave-error yes  ##是否启用rdb文件压缩,默认为“yes”,压缩往	往意味着“额外的cpu消耗”,同时也意味这较小的文件尺寸以及较短的网络传输时间  
rdbcompression yes  

开启AOF,配置文件

vim /redis-4.0.9/redis.conf#此选项为aof功能的开关,默认为“no”,可以通过“yes”来开启aof功能  
##只有在“yes”下,aof重写/文件同步等特性才会生效  
appendonly yes  #指定aof文件名称  
appendfilename appendonly.aof  #指定aof操作中文件同步策略,有三个合法值:always everysec no,默认为everysec  
appendfsync everysec  #在aof-rewrite期间,appendfsync是否暂缓文件同步,"no"表示“不暂缓”,“yes”表示“暂缓”,默认为“no”  
no-appendfsync-on-rewrite no  #触发aof rewrite的最小文件尺寸
auto-aof-rewrite-min-size 64mb#当Aof log增长超过指定比例时,重写log file, 设置为0表示不自动重写Aof 日志,重写是为了使aof体积保持最小,而确保保存最完整的数据。
auto-aof-rewrite-percentage 100

将appendonly no改为appendonly yes 即可

  • 重启
systemctl restart redis

四、开启主从配置

修改 master 的主配置文件

vim /etc/redis/6379.conf 

改第 69 行 bind 127.0.0.1 为,监听所有地址。

bind 0.0.0.0

如果只监听特定的可以这样写 bind 127.0.0.1 192.168.1.100 将同时监听 127.0.0.1192.168.1.100 这两个 IP 地址。你也可以根据需要添加更多的 IP 地址。

改第 88 行 protected-mode yes 为,关闭保护模式。

protected-mode no

重启服务 systemctl restart redis

修改 slave1 和 slave2 的主配置文件

vim /etc/redis/6379.conf 

改第 69 行 bind 127.0.0.1 为,监听所有地址。

bind 0.0.0.0

如果只监听特定的可以这样写 bind 127.0.0.1 192.168.1.100 将同时监听 127.0.0.1192.168.1.100 这两个 IP 地址。你也可以根据需要添加更多的 IP 地址。

改第 88 行 protected-mode yes 为,关闭保护模式。

protected-mode no

改第 281 行 # slaveof <masterip> <masterport> 为,解除注释,并指定master主机IP地址和端口号

slaveof 192.168.152.71 6379    # 端口号再没有修改的情况下,默认 6379

重启服务 systemctl restart redis

五、测试

输入 redis-cli 进入redis 的客户端输入 info replication 查看主从状态

master 显示的状态

# Replication
role:master                # 当前节点是主节点
connected_slaves:2         # 连接的从节点数量
slave0:ip=192.168.152.73,port=6379,state=online,offset=42,lag=1  # 从节点 1 信息
slave1:ip=192.168.152.72,port=6379,state=online,offset=42,lag=1  # 从节点 2 信息
master_replid:cb46ab0a79974e3f32ceb1e25a79c3578f6a3ee4  # 主节点复制 ID
master_replid2:0000000000000000000000000000000000000000  # 第二个主节点复制 ID (全零表示未用)
master_repl_offset:42     # 主节点复制偏移量
second_repl_offset:-1     # 第二主节点复制偏移量 (未用)
repl_backlog_active:1     # 复制积压缓冲区启用状态
repl_backlog_size:1048576 # 复制积压缓冲区大小 (1 MB)
repl_backlog_first_byte_offset:1  # 缓冲区第一个字节偏移量
repl_backlog_histlen:42    # 缓冲区有效数据长度

slave 显示的状态

# Replication
role:slave                # 当前节点是从节点
master_host:192.168.152.71 # 主节点 IP 地址
master_port:6379          # 主节点端口
master_link_status:up     # 主节点连接状态 (up 表示连接正常)
master_last_io_seconds_ago:1 # 距离上次 IO 操作的秒数
master_sync_in_progress:0 # 主节点同步是否正在进行 (0 表示未进行)
slave_repl_offset:42      # 从节点复制偏移量
slave_priority:100        # 从节点优先级 (数字越小优先级越高)
slave_read_only:1         # 从节点是否只读 (1 表示只读)
connected_slaves:0        # 当前从节点连接的从节点数量
master_replid:cb46ab0a79974e3f32ceb1e25a79c3578f6a3ee4 # 主节点复制 ID
master_replid2:0000000000000000000000000000000000000000 # 第二个主节点复制 ID (全零表示未用)
master_repl_offset:42     # 主节点复制偏移量
second_repl_offset:-1     # 第二主节点复制偏移量 (未用)
repl_backlog_active:1     # 复制积压缓冲区启用状态
repl_backlog_size:1048576 # 复制积压缓冲区大小 (1 MB)
repl_backlog_first_byte_offset:1  # 缓冲区第一个字节偏移量
repl_backlog_histlen:42    # 缓冲区有效数据长度

可以使用 set 添加数据,get 获取数据来进行测试,如:

set name lty  # name 为索引,lty为值
gte name      # get 获取该索引的值

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ThreadLoad如何防止内存溢出
  • 【BUU】[NewStarCTF 2023 公开赛道]Final -CP读取文件内容
  • 【C++】实现日期类相关接口
  • 第131天:内网安全-横向移动Kerberos 攻击SPN扫描WinRMWinRSRDP
  • 【Python学习-UI界面】PyQt5 小部件1-Label
  • 一款专为IntelliJ IDEA用户设计的插件,极大简化Spring项目中的API调试过程,功能强大(附源码)
  • Unity Dots学习 (一)
  • 多媒体技术及应用课程思政网站
  • 为何用新版本的Supra软件,FPGA引脚输出不正常
  • 深入探索 MyBatis
  • 【车载开发系列】常见单片机烧录与调试设备
  • RTT学习
  • Python密码生成器
  • [C#]OpenCvSharp 实现Bitmap和Mat的格式相互转换
  • 分享一个基于微信小程序的宠物服务中心的设计与实现(源码、调试、LW、开题、PPT)
  • 【刷算法】从上往下打印二叉树
  • ESLint简单操作
  • Javascript基础之Array数组API
  • java概述
  • leetcode讲解--894. All Possible Full Binary Trees
  • magento 货币换算
  • Rancher如何对接Ceph-RBD块存储
  • Yeoman_Bower_Grunt
  • 从setTimeout-setInterval看JS线程
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 普通函数和构造函数的区别
  • 前端设计模式
  • 首页查询功能的一次实现过程
  • 详解移动APP与web APP的区别
  • 整理一些计算机基础知识!
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • (12)Linux 常见的三种进程状态
  • (C语言)二分查找 超详细
  • (二)Eureka服务搭建,服务注册,服务发现
  • (回溯) LeetCode 40. 组合总和II
  • (力扣)循环队列的实现与详解(C语言)
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (四)图像的%2线性拉伸
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .a文件和.so文件
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET Remoting学习笔记(三)信道
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • @Autowired标签与 @Resource标签 的区别
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • [1]从概念到实践:电商智能助手在AI Agent技术驱动下的落地实战案例深度剖析(AI Agent技术打造个性化、智能化的用户助手)
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息
  • [BT]BUUCTF刷题第9天(3.27)
  • [C++11 多线程同步] --- 条件变量的那些坑【条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)】
  • [FT]chatglm2微调
  • [hdu2196]Computer树的直径