zoukankan      html  css  js  c++  java
  • Redis主从复制原理与优化

    一 什么是主从复制

    机器故障;容量瓶颈;QPS瓶颈

    一主一从,一主多从

    做读写分离

    做数据副本

    扩展数据性能

    一个master可以有多个slave

    一个slave只能有一个master

    数据流向是单向的,从master到slave

    二 一主一从搭建

    2.1 slave 命令

    slaveof 0.0.0.0 6379 # 成为6379的从库 也可以在6378的客户端连入以后执行这句话,就跟在主配置文件一样,只不过挂掉要重新执行。
    
    slaveof no one  # 配置文件配入此句话或客户端连入直接执行此命令   取消主从复制的关系,不会把之前的数据清除,从库就可以写入了。
    slave-read-only yes  # 从节点只读,因为可读可写,数据会乱      在从的配置文件添加   
    
    # 注意:在设置了主从复制(slaveof 0.0.0.0 6379),从库就不能写入只能读,和mysql的主从有点区别,mysql在从库也能写,同步到主库和其他从库。
    

    2.2 主从的配置文件 (机器安装redis实现主从)

    # 我的服务都放在一个独立的文件夹 把redis下载解压编译安装在/soft/redis中了
    # 1.主redis 6379端口的配置文件
    cp redis.conf redis.conf_back  # 做了备份,我们修改备份配置,并在6379端口启动主redis
    # -------------------------------------------
    daemonize yes 
    pidfile /var/run/redis.pid
    port 6379    
    dir "/opt/soft/redis/data"   # “6379.log”(aof)  dump.rdb
    logfile “6379.log”
    bind 0.0.0.0  # 任何ip都能访问,也可以写自己服务器的公网IP
    protected-mode no  # 取消保护模式,不然外界访问不到。
    appendonly yes
    appendfilename "appendonly.aof"
    appendfsync everysec
    no-appendfsync-on-rewrite yes  
    # ----------------------------------------------
    mkdir -p /opt/soft/redis/data  # 将redis持久化文件放在 /opt/soft/redis/data
    
    
    # 2. 从redis 6378端口的配置文件
    cp redis.conf re_slave1.conf  
    # -------------------------------------------------------
    # copy的内容只保留以下内容:
    daemonize yes 
    pidfile /var/run/redis.pid
    port 6378    
    dir "/opt/soft/redis/slave1_data"   # “6378.log”(aof)  dump.rdb
    logfile “6378.log”
    bind 0.0.0.0
    protected-mode no
    slaveof 47.92.167.108 6379  # 主从同步,在主redis增删数据,从库同步
    slave-read-only yes  # 从库只读
    # -------------------------------------------------------
    mkdir -p /opt/soft/redis/slave1_data  # 将从redis持久化文件放在 /opt/soft/redis/slave1_data文件夹内
    
    # 3.启动主从redis  在redis当前文件夹下启动
    redis-server ./redis.conf_back  # 启动主redis
    redis-server ./re_slave1.conf  # 启动从redis
    
    # 4.客户端分别连入6379,6378 端口
    redis-cli -p 6379
    redis-cli -p 6378
    
    # 5. 在主redis客户端写入数据,从库此时就能收到了
    127.0.0.1:6379> set sex '男'
    OK
    127.0.0.1:6379> set talk hello
    OK
    # ---------------------------------
    127.0.0.1:6378> keys *
    1) "age"
    2) "name"
    3) "sex"
    127.0.0.1:6378> keys *
    1) "age"
    2) "name"
    3) "talk"
    4) "sex"
    
    '''
    只要做了从库配置启动从库的服务端,持久化文件就会生成。
    如果要做一主多从的主从复制,就只需要将我们的re_slave1.conf文件复制一份修改端口,创建一个配置文件指定的dir再次启动就行了.
    
    cp re_slave1.conf re_slave2.conf 
    vim re_slave2.conf 
    ------------------------------------------
    daemonize yes
    pidfile /var/run/redis.pid
    port 6377
    dir "/opt/soft/redis/slave2_data"
    logfile “6377.log”
    bind 0.0.0.0
    protected-mode no
    slaveof 47.92.167.108 6379
    slave-read-only yes
    --------------------------------------------
    redis-server ./re_slave2.conf 
    [root@sahala redis]# ps -ef |grep redis
    root      4298     1  0 00:39 ?        00:00:03 redis-server 0.0.0.0:6379
    root     18666     1  0 01:59 ?        00:00:00 redis-server 0.0.0.0:6378
    root     21100     1  0 02:21 ?        00:00:00 redis-server 0.0.0.0:6377
    root     21617 20669  0 02:21 pts/0    00:00:00 grep --color=auto redis
    
    127.0.0.1:6377> redis-cli -p 6377
    127.0.0.1:6377> keys *
    1) "talk"
    2) "name"
    3) "age"
    4) "sex"
    
    '''
    
    

    2.3 主从的配置文件 (机器安装docker拉去redis镜像实现主从)

    # 创建主从redis配置(conf)文件夹和持久化(6379.log[类似mysql的binlog日志])文件夹data
    mkdir -p redis1/conf redis1/data redis2/conf redis2/data redis3/conf redis3/data
    
    
    # 启动三个redis 做端口映射 目录挂载 使用redis镜像 加要执行的命令 redis-server /etc/redis/redis.conf
    docker run -p 6379:6379 --name redis_6379 -v /home/redis1/conf/redis.conf:/etc/redis/redis.conf -v /home/redis1/data:/data -d redis redis-server /etc/redis/redis.conf
    
    docker run -di -p 6378:6379 --name redis_6378 -v /home/redis2/conf/redis.conf:/etc/redis/redis.conf -v /home/redis2/data:/data redis redis-server /etc/redis/redis.conf
    
    docker run -di -p 6377:6379 --name redis_6377 -v /home/redis3/conf/redis.conf:/etc/redis/redis.conf -v /home/redis3/data:/data redis redis-server /etc/redis/redis.conf    
    

    四 故障处理

    slave故障

    master故障

    五 复制常见问题

    1 读写分离

    读流量分摊到从节点

    可能遇到问题:复制数据延迟,读到过期数据,从节点故障

    2 主从配置不一致

    maxmemory不一致:丢失数据

    数据结构优化参数:主节点做了优化,从节点没有设置优化,会出现一些问题

    3 规避全量复制

    第一次全量复制,不可避免:小主节点,低峰(夜间)

    节点运行id不匹配:主节点重启(运行id变化)

    复制挤压缓冲区不足:增大复制缓冲区大小,rel_backlog_size

    4 规避复制风暴

    单主节点复制风暴,主节点重启,所有从节点复制

  • 相关阅读:
    QFramework 使用指南 2020(二):下载与版本介绍
    QFramework 使用指南 2020 (一): 概述
    Unity 游戏框架搭建 2018 (二) 单例的模板与最佳实践
    Unity 游戏框架搭建 2018 (一) 架构、框架与 QFramework 简介
    Unity 游戏框架搭建 2017 (二十三) 重构小工具 Platform
    Unity 游戏框架搭建 2017 (二十二) 简易引用计数器
    Unity 游戏框架搭建 2017 (二十一) 使用对象池时的一些细节
    你确定你会写 Dockerfile 吗?
    小白学 Python 爬虫(8):网页基础
    老司机大型车祸现场
  • 原文地址:https://www.cnblogs.com/zhangchaocoming/p/13051168.html
Copyright © 2011-2022 走看看