zoukankan      html  css  js  c++  java
  • Redis 主从架构搭建

    引言

    准备搭建的是主从架构( Master/Slave )中的一主两从模式;其中 Master 为 Redis 的主服务器,主要负责写操作,两个 Slave 为 Redis 的从服务器,主要负责读操作,该架构最终可以实现主从复制和读写分离,架构图如下:

    搭建步骤

    这里采用在一台虚拟机上启动多个 Redis 服务,模拟多个 Redis 服务器环境(与实际生产环境中相比,基本配置几乎相同,仅 IP 地址和端口号不同)

    第一步:修改 redis.conf 配置文件
    1. 将 redis.conf 配置文件复制三份,通过修改端口分别模拟三台 Redis 服务器

      [root@dtinone2 redis-5.0.9]# cp redis.conf 6379redis.conf
      [root@dtinone2 redis-5.0.9]# cp redis.conf 6380redis.conf
      [root@dtinone2 redis-5.0.9]# cp redis.conf 6381redis.conf
      
    2. 分别对 6379redis.conf、6380redis.conf 和 6381redis.conf 三份配置文件进行修改

      注:以下以 6379redis.conf 配置修改为例,其他两个配置文件修改方式相似(唯一区别是端口号不同)

      1)将默认的 daemonize no 修改为 daemonize yes,表示指定 Redis 以守护进程的方式启动(后台启动)

      daemonize yes
      

      2) 配置 pidfile 文件路径, 表示当 Redis 作为守护进程运行的时候,它会把 pid 进程号默认写到 pidfile 文件里面

      pidfile /var/run/redis_6379.pid
      

      3) 配置 port 端口号(其他两个配置文件的端口号分别为 6380 和 6381)

      port 6379
      

      4)配置 log 文件名

      logfile "6379.log"
      

      5) 配置rdb文件名

      dbfilename dump_6379.rdb
      

      注:再依次修改 6380redis.conf 、6381redis.conf 两个配置文件,则配置完毕。

    第二步:分别启动三个 Redis 服务

    启动时一定要分别加载三个 Redis 配置文件,如下:

    [root@dtinone2 redis-5.0.9]# ./redis-server ../6379redis.conf 
    [root@dtinone2 redis-5.0.9]# ./redis-server ../6380redis.conf 
    [root@dtinone2 redis-5.0.9]# ./redis-server ../6381redis.conf 
    

    通过命令查看三个 Redis 后台服务是否启动,如下:

    [root@dtinone2 redis-5.0.9]# ps -ef | grep redis              
    root       1991      1  0 04:46 ?        00:00:05 ./redis-server *:6379           
    root       1996      1  0 04:46 ?        00:00:04 ./redis-server *:6380           
    root       2001      1  0 04:46 ?        00:00:04 ./redis-server *:6381           
    root       2559   1819  0 05:28 pts/0    00:00:00 grep redis
    

    以上显示三个 Redis 服务已全部启动成功

    第三步:启动 Redis 客户端

    -p 选项:表示设置客户端连接的 Redis 服务器的端口号

    [root@dtinone2 redis-5.0.9]# ./redis-cli -p 6379
    

    注:以上命令表示启动客户端连接监听端口为 6379 的 Redis 服务器(如需连接其他两个 Redis 服务器,只需要修改 -p 选项后面的端口号即可)

    第四步:查看 Redis 服务器的主从关系
    • info replication 命令:用于查看 Redis 服务器主从关系
    127.0.0.1:6379> info replication
    # Replication
    role:master   #表示该 Redis 服务器是主服务器
    connected_slaves:0 #表示有0个从服务器连接到主服务器
    slave0:ip=127.0.0.1,port=6381,state=online,offset=3875,lag=0
    slave1:ip=127.0.0.1,port=6380,state=online,offset=3875,lag=1
    master_replid:01db272d607cc12eb5717104bae4bcf53490856c
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:3875
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:3875
    

    继续查看端口号为 6380和 6381 的 Redis 服务器,结果显示三个 Redis 服务器的 role 都是 Master,也就是都是主服务器。

    第五步:设置端口号 6380 和 6381 两个服务器为从服务器
    • 通过客户端连接端口号为 6380 的 Redis 服务器
    [root@dtinone2 redis-5.0.9]# ./redis-cli -p 6380
    
    • 设置端口号为 6380 的 Redis 服务器为端口号 6379 的 Redis 服务器的从服务器

      命令:saveof master_ip master_port

      把当前服务器设置为从服务器,master_ip 表示其主服务器的IP地址,master_port 表示其主服务器的端口号

    127.0.0.1:6380> slaveof 127.0.0.1 6379 
    OK
    
    • 再通过客户端连接端口号为 6381 的 Redis 服务器
    [root@dtinone2 redis-5.0.9]# ./redis-cli -p 6381
    
    • 再设置端口号为 6381 的 Redis 服务器为 端口号 6379 的 Redis 服务器的从服务器
    127.0.0.1:6381> slaveof 127.0.0.1 6379 
    OK
    
    第六步:查看主从关系是否设置成功
    • 使用 info replication 命令查看端口号为 6379 的 Redis 服务器,如下:
    127.0.0.1:6379> info replication
    # Replication
    role:master #表示端口 6379 的 Redis 服务器是一个主服务器
    connected_slaves:2 #表示该主服务器拥有 2个从服务器
    #从服务器列表信息
    slave0:ip=127.0.0.1,port=6381,state=online,offset=4701,lag=0 
    slave1:ip=127.0.0.1,port=6380,state=online,offset=4701,lag=0
    master_replid:01db272d607cc12eb5717104bae4bcf53490856c
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:4701
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:4701
    

    role:master
    connected_slaves:2
    slave0:ip=127.0.0.1,port=6381,state=online,offset=4701,lag=0
    slave1:ip=127.0.0.1,port=6380,state=online,offset=4701,lag=0

    以上信息表示当前服务器角色为主服务器,而且有两个从服务器连接,分别是 slave0 和 slave1

    • 使用 info replication 命令查看端口号为 6380 的 Redis 服务器,如下:
    127.0.0.1:6380> info replication
    # Replication
    role:slave # 表示端口 6380 的 Redis 服务器是一个从服务器
    master_host:127.0.0.1 # 表示连接的主服务器的 IP 地址
    master_port:6379 # 表示连接的主服务器的端口号
    master_link_status:up
    master_last_io_seconds_ago:7
    master_sync_in_progress:0
    slave_repl_offset:4925
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:01db272d607cc12eb5717104bae4bcf53490856c
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:4925
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:29
    repl_backlog_histlen:4897
    

    role:slave
    master_host:127.0.0.1
    master_port:6379

    以上信息表示当前服务器角色为从服务器,它的主服务器端口为 6379

    同样,使用 info replication 命令再查看端口号为 6381 的 Redis 服务器,显示结果应该和端口号为 6380 的 Redis 服务器相同。

    至此,我们通过命令完成了设置主从架构的搭建。

    由于设置命令修改的是内存配置,所以一旦 Redis 服务重启,那么服务器之间的角色关系将不复存在,实际生产环境中可以通过 redis.conf 文件来配置,如下:

    replicaof 127.0.0.1 6379
    
    第七步:测试主从复制
    • 在 Redis 主服务器执行一个写操作
    127.0.0.1:6379> set myname zhangsan
    OK
    
    • 在 Redis 从服务器读取
    127.0.0.1:6380> get myname
    "zhangsan"
    
    127.0.0.1:6381> get myname
    "zhangsan"
    
    第八步:测试主从读写分离
    • 在 Redis 主服务器执行一个写操作和读操作
    127.0.0.1:6379> set myname zhansan
    OK
    127.0.0.1:6379> get myname
    "zhansan"
    
    • 分别在 Redis 从服务器可以执行一个写操作和读操作
    127.0.0.1:6380> get myname
    "zhansan"
    127.0.0.1:6380> set myname lisi
    (error) READONLY You can't write against a read only replica.
    
    127.0.0.1:6381> get myname
    "zhansan"
    127.0.0.1:6381> set myname lisi
    (error) READONLY You can't write against a read only replica.
    

    可以看到,主服务器有读写操作,两个从服务器只有读操作,主从读写分离测试成功。

    如果想让从服务器也能执行写操作,只需要修改配置文件 redis.conf 中如下配置项:

    replica-read-only yes  # 表示从服务器仅支持只读操作
    

    注意:从服务器即使支持写操作,其写入的数据是无法同步到主服务器和其他从服务器

    第九步:测试主服务器宕机
    • 将 Master 主服务关掉模拟服务器宕机,也就是关闭端口号 为 6379 的 Redis 服务器,然后观察从服务器是否发生变化
    127.0.0.1:6379> shutdown
    
    • 查看 Slave 从服务器
    127.0.0.1:6380> info replication
    # Replication
    role:slave # 表示该服务器为从服务器
    master_host:127.0.0.1
    master_port:6379
    master_link_status:down
    master_last_io_seconds_ago:-1
    master_sync_in_progress:0
    slave_repl_offset:322
    master_link_down_since_seconds:10
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:18bb9d5dc7016635dd09f21c2fcdcfb5b9b619ba
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:322
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:322
    

    以上查看结果为 Master 主服务器挂掉后,Slave 从服务器没有任何改变。

    作者:Binge
    本文版权归作者和博客园共有,转载必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    [ZJOI2010]基站选址
    [SDOI2008]Sue的小球
    访问计划
    奥义商店
    codeforces 809E Surprise me!
    codeforces 888G Xor-MST
    [HAOI2015]数字串拆分
    小奇分糖果
    小奇的花园
    BZOJ4711 小奇挖矿
  • 原文地址:https://www.cnblogs.com/binbingg/p/14541004.html
Copyright © 2011-2022 走看看