redis主從複製--哨兵--集羣

redis 主從複製配置架構

--http://www.javashuo.com/article/p-edvbrwii-u.htmlhtml

redis主從複製

  1. 經過redis.conf 支持多實例的數據庫功能node

    • 建立多個配置文件 一主兩從 架構redis

    • redis-6379.conf (主庫)shell

      port 6379   # 指定啓動端口
      daemonize yes  # 後臺運行
    • redis-6380.conf (從庫)數據庫

      port 6380   # 指定啓動端口
      daemonize yes  # 後臺運行
      slaveof 127.0.0.1 6379  # 指定主庫ip端口
    • redis-6381.conf (從庫)vim

      port 6381   # 指定啓動端口
      daemonize yes  # 後臺運行
      slaveof 127.0.0.1 6379  # 指定主庫ip端口
  2. 查看狀態ruby

    • 主庫
    • 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實例
相關文章
相關標籤/搜索