• 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 规避复制风暴

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

  • 相关阅读:
    JQuery -- this 和 $(this) 的区别
    js动态生成表格
    Sublime 3 如何使用列编辑模式
    新版Sublime text3注册码被移除的解决办法
    Sublime text 3 格式化HTML/css/js/json代码 插件
    mingw64 构建 Geos
    C++调用Python浅析
    linux下挂载VHD等虚拟磁盘文件
    linux 下Qt WebEngine 程序打包简单记录
    C++ UTF8和UTF16互转代码
  • 原文地址:https://www.cnblogs.com/zhangchaocoming/p/13051168.html
Copyright © 2020-2023  润新知