zoukankan      html  css  js  c++  java
  • Redis--主从同步

    前戏

    redis集群中的数据库复制是通过主从同步来实现的,主节点(master)把数据分发给从节点(slave),主从同步的好处在于高可用。

    redis主从同步的原理:

    1.从服务器向主服务器发送SYNC命令。

    2.接到SYNC的主服务器会调用BGSAVE命令,创建一个RDB文件,并使用缓冲区记录接下来执行的所有命令。

    3.当主服务器执行完BGSAVE命令时,它会向从服务器发送RDB文件,而从服务器则会接收并载入这个文件。

    4.主服务器将缓冲区存储的所有写命令发送给从服务器执行。

    环境准备

    1.关掉所有redis服务,使用ps查看

    [root@HH redis-5.0.6]# ps -ef |grep  redis
    root      4388  8523  0 18:44 pts/1    00:00:00 grep --color=auto redis

    2.准备6380,6381,6382三个文件夹,后面会用到,创建到data目录下

    [root@HH redis-5.0.6]# mkdir /data/{6380,6381,6382}
    [root@HH redis-5.0.6]# ls /data/
    6380  6381  6382 

    3.准备三个redis的配置文件,放到redis的目录下,这里分别命名为redis-6380.conf,redis-6381.conf,redis-6382.conf

    redis-6380.conf

    port 6380
    daemonize yes
    pidfile /data/6380/redis.pid
    loglevel notice
    logfile "/data/6380/redis.log"
    dbfilename dump.rdb
    dir /data/6380
    protected-mode no

    redis-6381.conf

    port 6381
    daemonize yes
    pidfile /data/6381/redis.pid
    loglevel notice
    logfile "/data/6381/redis.log"
    dbfilename dump.rdb
    dir /data/6381
    protected-mode no

    redis-6382.conf

    port 6382 
    daemonize yes
    pidfile /data/6382/redis.pid
    loglevel notice
    logfile "/data/6382/redis.log"
    dbfilename dump.rdb
    dir /data/6382
    protected-mode no

    到此为止我们的准备工作就做好了

    主从同步

    1.启动三个redis实例

    [root@HH redis-5.0.6]# redis-server redis-6380.conf 
    [root@HH redis-5.0.6]# redis-server redis-6381.conf 
    [root@HH redis-5.0.6]# redis-server redis-6382.conf 

    2.此时可以查看redis身份信息,通过info参数(此时还未配置主从,因此都是master身份)

    [root@HH redis-5.0.6]# redis-cli -p 6380 info Replication
    # Replication
    role:master   # 角色是master
    connected_slaves:0  # 连接的slave数
    master_repl_offset:0
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    [root@HH redis-5.0.6]# redis-cli -p 6381 info Replication
    # Replication
    role:master  # master
    connected_slaves:0
    master_repl_offset:0
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    [root@HH redis-5.0.6]# redis-cli -p 6382 info Replication
    # Replication
    role:master  # 也是master
    connected_slaves:0
    master_repl_offset:0
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0

    3.配置从节点的身份(6380为主,6381,6382为从),通过命令指明master节点信息即可

    [root@HH conf]# redis-cli -p 6381
    127.0.0.1:6381> slaveof 127.0.0.1 6380
    OK
    [root@HH conf]# redis-cli -p 6382
    127.0.0.1:6382> slaveof 127.0.0.1 6380
    OK
    127.0.0.1:6382> exit  # 退出

    也可以直接执行命令行同步

    redis-cli -p 6381 SLAVEOF 127.0.0.1 6380  #指明主的地址
    
    redis-cli -p 6382 SLAVEOF 127.0.0.1 6380  #指明主的地址

    4.查看各个各个节点的身份信息

    [root@HH redis-5.0.6]# redis-cli -p 6380 info Replication
    # Replication
    role:master  # 6380还是master
    connected_slaves:2
    slave0:ip=127.0.0.1,port=6381,state=online,offset=141,lag=1
    slave1:ip=127.0.0.1,port=6382,state=online,offset=141,lag=1
    master_repl_offset:141
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:2
    repl_backlog_histlen:140
    [root@HH redis-5.0.6]# redis-cli -p 6381 info Replication
    # Replication
    role:slave  # 6381是slave
    master_host:127.0.0.1
    master_port:6380
    master_link_status:up
    master_last_io_seconds_ago:8
    master_sync_in_progress:0
    slave_repl_offset:155
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_repl_offset:0
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    

    [root@HH redis-5.0.6]# redis-cli -p 6382 info Replication # Replication role:slave # 6382是slave了 master_host:127.0.0.1 master_port:6380 master_link_status:up master_last_io_seconds_ago:7 ...

    5.检查,在主的里面写如数据,从的里面查看

    [root@HH redis-5.0.6]# redis-cli -p 6380
    127.0.0.1:6380> keys *
    (empty list or set)
    127.0.0.1:6380> set name zouzou
    OK
    [root@HH conf]# redis-cli -p 6381
    127.0.0.1:6381> keys *
    1) "name"
    [root@HH conf]# redis-cli -p 6382
    127.0.0.1:6382> keys *
    1) "name"

    注意:这样设置好之后,从服务器是不能写入的,只能读

    127.0.0.1:6382> set name2 lala
    (error) READONLY You can't write against a read only slave.

    主从切换

    上面我们已经配置好了主从同步,并且测试之后没有问题,假设有一天我们的主服务器挂了,我们可以手动切换到从服务器。

    1.关闭主服务器,模拟主服务器挂掉了

    [root@HH redis-5.0.6]# ps -ef | grep redis
    root      5545     1  0 18:54 ?        00:00:00 redis-server *:6380
    root      5555     1  0 18:54 ?        00:00:00 redis-server *:6381
    root      5566     1  0 18:54 ?        00:00:00 redis-server *:6382
    root      7092 18093  0 19:07 pts/0    00:00:00 redis-cli -p 6382
    root      7540  8523  0 19:11 pts/1    00:00:00 grep --color=auto redis

    [root@HH redis
    -5.0.6]# kill -9 5545 # 杀掉主服务器的进程 [root@HH redis-5.0.6]# ps -ef | grep redis root 5555 1 0 18:54 ? 00:00:00 redis-server *:6381 root 5566 1 0 18:54 ? 00:00:00 redis-server *:6382 root 7092 18093 0 19:07 pts/0 00:00:00 redis-cli -p 6382 root 7608 8523 0 19:11 pts/1 00:00:00 grep --color=auto redis

    2.检查从库主从信息,此时master_link_status:down

    [root@HH redis-5.0.6]# redis-cli -p 6381 info replication
    # Replication
    role:slave
    master_host:127.0.0.1
    master_port:6380
    master_link_status:down   # 主服务器是挂了的
    master_last_io_seconds_ago:-1
    master_sync_in_progress:0
    slave_repl_offset:1095
    master_link_down_since_seconds:125
    slave_priority:100
    slave_read_only:1
    connected_slaves:0

    3.既然现在没有从库了,那我们选择6382作为主服务器

    将6382去掉slave的身份

    [root@HH redis-5.0.6]# redis-cli -p 6382 slaveof no one 
    OK

    设置完之后将6381的主服务器设置为6382

    [root@HH redis-5.0.6]# redis-cli -p 6381 slaveof 127.0.0.1 6382 
    OK

    4.检查6381和6382的主从信息

    [root@HH redis-5.0.6]# redis-cli -p 6382 info Replication
    # Replication
    role:master  # 6382为主服务器
    connected_slaves:1  
    slave0:ip=127.0.0.1,port=6381,state=online,offset=155,lag=1
    master_repl_offset:155
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:2
    repl_backlog_histlen:154
    

    [root@HH redis-5.0.6]# redis-cli -p 6381 info Replication # Replication role:slave # 6381为从服务器 master_host:127.0.0.1 master_port:6382 master_link_status:up master_last_io_seconds_ago:6 master_sync_in_progress:0 slave_repl_offset:155 slave_priority:100 ...

    通过配置文件决定主从身份

    上面我们是使用命令行的方式来设置主从身份的,还有一种方式是直接在配置文件里决定主从身份

    在配置文件中,添加一条参数即可(主节点不做配置,从节点指明主人的ip端口信息即可)

    6380还是主,6381和6382是从

    redis-6381.conf

    port 6381
    daemonize yes
    pidfile /data/6381/redis.pid
    loglevel notice
    logfile "/data/6381/redis.log"
    dbfilename dump.rdb
    dir /data/6381
    protected-mode no
    slaveof 127.0.0.1 6380  # 指明主服务器的地址和ip

    redis-6382.conf

    port 6382
    daemonize yes
    pidfile /data/6382/redis.pid
    loglevel notice
    logfile "/data/6382/redis.log"
    dbfilename dump.rdb
    dir /data/6382
    protected-mode no
    slaveof 127.0.0.1 6380  # 指明主服务器的地址和ip

    这样就可以了

  • 相关阅读:
    java相关知识集锦
    adb相关基础知识集锦
    我所理解的OOP——UML六种关系
    据说每个大牛、小牛都应该有自己的库——DOM处理续
    据说每个大牛、小牛都应该有自己的库——DOM处理
    JavaScript 继承
    据说每个大牛、小牛都应该有自己的库——Event处理
    据说每个大牛、小牛都应该有自己的库——框架篇
    可拖动的DIV续
    CSS hack前传——背景图片全屏
  • 原文地址:https://www.cnblogs.com/zouzou-busy/p/11625492.html
Copyright © 2011-2022 走看看