redis主从复制--哨兵--集群

redis 主从复制配置架构

--https://www.cnblogs.com/pyyu/p/9718679.html

redis主从复制

  1. 通过redis.conf 支持多实例的数据库功能

    • 创建多个配置文件 一主两从 架构

    • redis-6379.conf (主库)

      port 6379   # 指定启动端口
      daemonize yes  # 后台运行
    • redis-6380.conf (从库)

      port 6380   # 指定启动端口
      daemonize yes  # 后台运行
      slaveof 127.0.0.1 6379  # 指定主库ip端口
    • redis-6381.conf (从库)

      port 6381   # 指定启动端口
      daemonize yes  # 后台运行
      slaveof 127.0.0.1 6379  # 指定主库ip端口
  2. 查看状态

    • 主库
    • 127.0.0.1:6379> INFO replication
    • [root@mrcarzy-pc redisconf]# redis-cli -p 6379 info replication
    [root@mrcarzy-pc redisconf]# redis-cli -p 6379 info replication
    # Replication
    role:master
    connected_slaves:2
    slave0:ip=127.0.0.1,port=6380,state=online,offset=2242,lag=0
    slave1:ip=127.0.0.1,port=6381,state=online,offset=2242,lag=0
    master_replid:d59da86065ab4cbb450b12ca0e17eca09b3aa486
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:2242
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:2242
    
    • 从库
    [root@mrcarzy-pc redisconf]# redis-cli -p 6380 info replication
    # Replication
    role:slave
    master_host:127.0.0.1
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:1
    master_sync_in_progress:0
    slave_repl_offset:2368
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:d59da86065ab4cbb450b12ca0e17eca09b3aa486
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:2368
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:2368
    

如果主从复制架构故障,master宕机

手动切换故障

  • 命令杀死主库 kill -9
  1. 2个从库功能都还尚好,数据也在,第一步应该数据持久化,防止数据丢失

  2. 6380 6381 两个从库还活着,登录某一个数据,进行持久化,建立6380是主库,6381是新的从库

##### 更改 6380 库为主库

save

SLAVEOF no one

[root@mrcarzy-pc redisconf]# redis-cli -p 6380
127.0.0.1:6380> save
OK
127.0.0.1:6380> SLAVEOF no one
OK
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_replid:48199a8324b6bc6a6645e86601e140221d44cf71
master_replid2:d59da86065ab4cbb450b12ca0e17eca09b3aa486
master_repl_offset:2872
second_repl_offset:2873
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2872
  1. 更改 6381 库为新的从库

    SLAVEOF 127.0.0.1 6380

    127.0.0.1:6381> SLAVEOF 127.0.0.1 6380
    OK
    127.0.0.1:6381> info replication
    # Replication
    role:slave
    master_host:127.0.0.1
    master_port:6380
    master_link_status:up
    master_last_io_seconds_ago:3
    master_sync_in_progress:0
    slave_repl_offset:2886
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:48199a8324b6bc6a6645e86601e140221d44cf71
    master_replid2:d59da86065ab4cbb450b12ca0e17eca09b3aa486
    master_repl_offset:2886
    second_repl_offset:2873
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:2886
    

自动切换故障 sentinel ( 哨兵 )

Redis-Sentinel是redis官方推荐的高可用性解决方案,
当用redis作master-slave的高可用时,如果master本身宕机,redis本身或者客户端都没有实现主从切换的功能。

而redis-sentinel就是一个独立运行的进程,用于监控多个master-slave集群,
自动发现master宕机,进行自动切换slave > master。
  • sentinel主要功能如下:
    • 不时的监控redis是否良好运行,如果节点不可达就会对节点进行下线标识
    • 如果被标识的是主节点,sentinel就会和其他的sentinel节点“协商”,如果其他节点也人为主节点不可达,就会选举一个sentinel节点来完成自动故障转义
    • 在master-slave进行切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换
  • 环境准备,三个redis哨兵(保安)配置文件 ,3个redis数据库配置文件
    三个redis数据库之间是端口的区分,和slaveof参数的区分 
    [root@mrcarzy-pc redisconf]# ll
    -rw-r--r-- 1 root root 28 Apr 20 19:52 redis-6379.conf   
    -rw-r--r-- 1 root root 50 Apr 20 19:53 redis-6380.conf
    -rw-r--r-- 1 root root 51 Apr 20 19:54 redis-6381.conf
    
    三个哨兵配置一模一样,仅仅是端口的区分 
    -rw-r--r-- 1 root root  0 Apr 20 19:51 redis-sentinel-26379.conf
    -rw-r--r-- 1 root root  0 Apr 20 19:51 redis-sentinel-26380.conf
    -rw-r--r-- 1 root root  0 Apr 20 19:51 redis-sentinel-26381.conf
    写入配置文件
    • redis-6379.conf (主库)
      port 6379  
      daemonize yes 
      redis-6380.conf (从库)
      port 6380  
      daemonize yes 
      slaveof 127.0.0.1 6379 
      redis-6381.conf (从库)
      • 使用全局替换

      [root@mrcarzy-pc redisconf]# sed "s/6380/6381/g" redis-6380.conf > redis-6381.conf

      port 6381   
      daemonize yes  
      slaveof 127.0.0.1 6379  
    • redis-sentinel-26379.conf配置文件写入如下信息

      手动创建 数据文件夹 mkdir -p /var/redis/data/

      // Sentinel节点的端口
      port 26379  
      dir /var/redis/data/
      logfile "26379.log"
      daemonize yes  # 后台运行
      
      // 当前Sentinel节点监控 192.168.119.10:6379 这个主节点
      // 2代表判断主节点失败至少需要2个Sentinel节点节点同意
      // mymaster是主节点的别名
      sentinel monitor mymaster 127.0.0.1 6379 2
      
      //每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒30s且没有回复,则判定不可达
      sentinel down-after-milliseconds mymaster 30000
      
      //当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,
      原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1
      sentinel parallel-syncs mymaster 1
      
      //故障转移超时时间为180000毫秒
      sentinel failover-timeout mymaster 180000
    • redis-sentinel-26380.conf 配置文件
      sed "s/26379/26380/g"  redis-sentinel-26379.conf  > redis-sentinel-26380.conf 
    • redis-sentinel-26381.conf 配置文件
      sed "s/26379/26381/g"  redis-sentinel-26379.conf  > redis-sentinel-26381.conf 
      
      [root@mrcarzy-pc redisconf]# cat redis-sentinel-26381.conf 
      rt 26381  
      dir /var/redis/data/
      logfile "26381.log"
      daemonize yes 
      
      sentinel monitor mymaster 127.0.0.1 6379 2
      
      sentinel down-after-milliseconds mymaster 30000
      
      sentinel parallel-syncs mymaster 1
      
      sentinel failover-timeout mymaster 180000
      

      运行三个 哨兵

      [root@mrcarzy-pc redisconf]# redis-sentinel redis-sentinel-26379.conf 
      [root@mrcarzy-pc redisconf]# redis-sentinel redis-sentinel-26380.conf 
      [root@mrcarzy-pc redisconf]# redis-sentinel redis-sentinel-26381.conf 

      此时查看配置文件 是否成功

      [root@mrcarzy-pc redisconf]# cat redis-sentinel-26379.conf 
      port 26379
      dir "/var/redis/data"
      logfile "26379.log"
      
      sentinel myid 53ac9e9a246c54c11d6c92aa862c58a5c9f5dcd8
      
      sentinel monitor mymaster 127.0.0.1 6379 2
      
      sentinel config-epoch mymaster 0
      
      sentinel leader-epoch mymaster 0
      daemonize yes
      # Generated by CONFIG REWRITE
      sentinel known-slave mymaster 127.0.0.1 6380
      sentinel known-slave mymaster 127.0.0.1 6381
      sentinel known-sentinel mymaster 127.0.0.1 26380 618de2b19912ba8e444ad6e587885c73c440b826
      sentinel known-sentinel mymaster 127.0.0.1 26381 5d36281121910c88cc87f67719e0c75e6ef515d0
      sentinel current-epoch 0    
      测试
      • 演示故障 杀死主库 kill -9 主库PID 30秒后自动变化
      
      [root@mrcarzy-pc redisconf]# cat redis-6381.conf 
      port 6381
      
      daemonize yes
      
      # Generated by CONFIG REWRITE
      dir "/opt/redisconf"
      
      • 重新启动 6379 后
      [root@mrcarzy-pc redisconf]# redis-cli -p 6381 info replication
      # Replication
      role:master
      connected_slaves:2
      slave0:ip=127.0.0.1,port=6380,state=online,offset=138576,lag=0
      slave1:ip=127.0.0.1,port=6379,state=online,offset=138310,lag=0
      master_replid:96f2514d0e655f7121a4d58428e82c80b677672c
      master_replid2:1c92f73ca5eebf54f7a08a827d5370f88b99b120
      master_repl_offset:138576
      second_repl_offset:91379
      repl_backlog_active:1
      repl_backlog_size:1048576
      repl_backlog_first_byte_offset:1
      repl_backlog_histlen:138576

redis 集群

环境准备

  • 至少需要六个 redis 节点 六个配置文件

  • 配置 在 /opt/rediscluster/ 目录下
    [root@mrcarzy-pc rediscluster]# ll
    total 28
    -rw-r--r--. 1 root root 181 May 10 22:30 redis-7000.conf
    -rw-r--r--. 1 root root 181 May 10 22:31 redis-7001.conf
    -rw-r--r--. 1 root root 181 May 10 22:31 redis-7002.conf
    -rw-r--r--. 1 root root 181 May 10 22:32 redis-7003.conf
    -rw-r--r--. 1 root root 181 May 10 22:32 redis-7004.conf
    -rw-r--r--. 1 root root 181 May 10 22:32 redis-7005.conf
    
    配置如下 需要根据文件名更改对应的端口号
    • 确保文件路径 mkdir -p /opt/redis/data
    port 7000
    daemonize yes
    dir "/opt/redis/data"
    logfile "7000.log"
    dbfilename "dump-7000.rdb"
    cluster-enabled yes   #开启集群模式
    cluster-config-file nodes-7000.conf  #集群内部的配置文件
    cluster-require-full-coverage no  #redis cluster需要16384个slot都正常的时候才能对外提供服务,换句话说,只要任何一个slot异常那么整个cluster不对外提供服务。 因此生产环境一般为no

    使用 sed "s/7000/7005/g" redis-7000.conf > redis-7005.conf 命令快速创建文件

  • 启动 六个 redis 节点

    [root@mrcarzy-pc rediscluster]# redis-server redis-7000.conf 
    [root@mrcarzy-pc rediscluster]# redis-server redis-7001.conf 
    [root@mrcarzy-pc rediscluster]# redis-server redis-7002.conf 
    [root@mrcarzy-pc rediscluster]# redis-server redis-7003.conf 
    [root@mrcarzy-pc rediscluster]# redis-server redis-7004.conf 
    [root@mrcarzy-pc rediscluster]# redis-server redis-7005.conf 

准备 ruby 环境

  • 安装ruby

    wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz
    
    #安装ruby
    tar -xvf ruby-2.3.1.tar.gz
    ./configure --prefix=/opt/ruby231/
    make && make install
    
    # 配置环境变量  
    vim /etc/profile  
    source /etc/profile
  • 安装ruby gem 包管理工具

    wget http://rubygems.org/downloads/redis-3.3.0.gem
    
    [root@mrcarzy-pc opt]# gem install -l redis-3.3.0.gem
    
    #查看gem有哪些包
    gem list -- check redis gem
    
  • 安装 redis-trib.rb 脚本

    [root@mrcarzy-pc opt]# find /opt/ -name redis-trib.rb
    /opt/redis-4.0.10/src/redis-trib.rb
    
  • 开启集群

    [root@mrcarzy-pc opt]# /opt/redis-4.0.10/src/redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
    
    >>> Creating cluster
    >>> Performing hash slots allocation on 6 nodes...
    Using 3 masters:
    127.0.0.1:7000
    127.0.0.1:7001
    127.0.0.1:7002
    Adding replica 127.0.0.1:7004 to 127.0.0.1:7000
    Adding replica 127.0.0.1:7005 to 127.0.0.1:7001
    Adding replica 127.0.0.1:7003 to 127.0.0.1:7002
    >>> Trying to optimize slaves allocation for anti-affinity
    [WARNING] Some slaves are in the same host as their master
    M: fc017020a99e6af623b3c0718e2d402794b93a61 127.0.0.1:7000
       slots:0-5460 (5461 slots) master
    M: 83bea3b50fd3308ef80c33f132b9cd4331e7dbbe 127.0.0.1:7001
       slots:5461-10922 (5462 slots) master
    M: 1cb509c18550215502cac929de166d5949acd2e0 127.0.0.1:7002
       slots:10923-16383 (5461 slots) master
    S: ebb04c8a8cb8a04369da0292ef151160d3ad37d2 127.0.0.1:7003
       replicates 83bea3b50fd3308ef80c33f132b9cd4331e7dbbe
    S: c90340015d1f2e53097ae35b7e40e54080767f85 127.0.0.1:7004
       replicates 1cb509c18550215502cac929de166d5949acd2e0
    S: 23436a5e09055815a08430ae22500c7474b5ddd8 127.0.0.1:7005
       replicates fc017020a99e6af623b3c0718e2d402794b93a61
    Can I set the above configuration? (type 'yes' to accept): 
    

    输入 yes

  • 使用 (自动切换 -c 参数)
    • 测试写入集群数据,登录集群必须使用redis-cli -c -p 7000必须加上-c参数
    [root@mrcarzy-pc opt]# redis-cli -p 7000 -c
    127.0.0.1:7000> set name zhangfei
    -> Redirected to slot [5798] located at 127.0.0.1:7001
    OK
    127.0.0.1:7001> 
    
  • 查看集群状态

    [root@mrcarzy-pc opt]# redis-cli -p 7000 cluster info
    cluster_state:ok
    cluster_slots_assigned:16384
    cluster_slots_ok:16384
    cluster_slots_pfail:0
    cluster_slots_fail:0
    cluster_known_nodes:6
    cluster_size:3
    cluster_current_epoch:6
    cluster_my_epoch:1
    cluster_stats_messages_ping_sent:569
    cluster_stats_messages_pong_sent:551
    cluster_stats_messages_sent:1120
    cluster_stats_messages_ping_received:546
    cluster_stats_messages_pong_received:569
    cluster_stats_messages_meet_received:5
    cluster_stats_messages_received:1120

工作原理:

  • redis客户端任意访问一个redis实例,如果数据不在该实例中,通过重定向引导客户端访问所需要的redis实例

猜你喜欢

转载自www.cnblogs.com/zhang-zi-yi/p/10848082.html