<dfn id="xn28i"><i id="xn28i"><track id="xn28i"></track></i></dfn>
    1. <u id="xn28i"></u>
    2. <span id="xn28i"><u id="xn28i"></u></span>

    3. <s id="xn28i"><noscript id="xn28i"></noscript></s>
      溫馨提示×

      redis的主從復制是什么?怎么用?

      發布時間:2020-05-21 10:22:29 來源:億速云 閱讀:246 作者:Leah 欄目:系統運維

      這篇文章主要為大家詳細介紹了redis主從復制的含義和使用方法,圖文詳解容易學習,配合代碼閱讀理解效果更佳,非常適合初學者入門,感興趣的小伙伴們可以參考一下。

      1,主從復制概述

      redis的復制功能是支持多個服務器之間的數據同步。被復制的服務器稱為主服務器(master),對服務器進行復制操作的為從服務器(slave),主服務器master可以進行讀寫操作,當發生寫操作的時候自動將數據同步到從服務器,而從服務器一般是只讀的,并接收master同步過來的數據,一個master可以有多個slave,而一個slave只能由一個master。
      主從復制的過程:

      1,從節點執行slaveof命令;
      2,從節點只是保存了slavef命令中主節點的信息,并沒有立即發起復制;
      3,從節點內部的定時任務發現由主節點的信息,開始使用socket連接主節點;
      4,連接建立成功后,發送ping命令,希望得到pong命令響應,否則會進行重連;
      5,如果主節點設置了權限,那么就需要進行權限驗證;如果驗證失敗,復制終止;
      6,權限驗證通過后,進行數據同步,這是耗時最長的操作,主節點將把所有的數據全部發送給從節點;
      7,當主節點把當前的數據同步給從節點后,便完成了復制的建立流程,主節點就會持續的把寫命令發送給從主節點,保證主從數據一致性;

      主從復制的作用:

      • 數據冗余。實現數據的熱備份;
      • 故障恢復。避免單點故障帶來的服務不可用;
      • 讀寫分離,負載均衡。主節點負責讀寫,從節點負責讀,提高服務器并發量;
      • 高可用基礎。是哨兵和集群實現的基礎;

      2,主從部署

      環境描述:

      主機地址端口操作系統
      主redis172.16.1.1006379CentOS 7.3
      從redis172.16.1.1106379CentOS 7.3

      1,部署主節點
      1)安裝redis
      官網下載地址:http://download.redis.io/releases/
      [root@redis-master ~]# tar zxf redis-4.0.14.tar.gz
      [root@redis-master ~]# cd redis-4.0.14
      [root@redis-master redis-4.0.14]# make && make install
      redis的主從復制是什么?怎么用?
      redis的主從復制是什么?怎么用?
      通過上圖,我們可以很容易的看出,redis安裝到/usr/local,/usr/local/bin,/usr/local/share,/usr/local/include,/usr/local/lib,/usr/local/share/man目錄下。

      然后再切換到utisl目錄下,執行redis初始化腳本install_server.sh,如下:

      [root@redis-master redis-4.0.14]# cd utils/
      [root@redis-master utils]# ./install_server.sh 
      Welcome to the redis service installer
      This script will help you easily set up a running redis server
      
      Please select the redis port for this instance: [6379] 
      Selecting default: 6379
      Please select the redis config file name [/etc/redis/6379.conf] 
      Selected default - /etc/redis/6379.conf
      Please select the redis log file name [/var/log/redis_6379.log] 
      Selected default - /var/log/redis_6379.log
      Please select the data directory for this instance [/var/lib/redis/6379] 
      Selected default - /var/lib/redis/6379
      Please select the redis executable path [/usr/local/bin/redis-server] 
      Selected config:
      Port           : 6379
      Config file    : /etc/redis/6379.conf
      Log file       : /var/log/redis_6379.log
      Data dir       : /var/lib/redis/6379
      Executable     : /usr/local/bin/redis-server
      Cli Executable : /usr/local/bin/redis-cli
      Is this ok? Then press ENTER to go on or Ctrl-C to abort.
      Copied /tmp/6379.conf => /etc/init.d/redis_6379
      Installing service...
      Successfully added to chkconfig!
      Successfully added to runlevels 345!
      Starting Redis server...
      Installation successful!
      #上面全部默認回車就好

      過上面的安裝過程,我們可以看出redis初始化后redis配置文件為/etc/redis/6379.conf,日志文件為/var/log/redis_6379.log,數據文件dump.rdb存放到/var/lib/redis/6379目錄下,啟動腳本為/etc/init.d/redis_6379。

      #初始化完成后,默認已經啟動redis服務了(默認監聽端口6379):

      [root@redis-master ~]# /etc/init.d/redis_6379 status
      Redis is running (5693)
      [root@redis-master ~]# ss -anput | grep redis
      tcp    LISTEN     0      128    127.0.0.1:6379                  *:*                   users:(("redis-server",pid=5693,fd=6))

      #防火墻規則設置:

      [root@redis-master ~]# firewall-cmd --add-port=6379/tcp --permanent
      success
      [root@redis-master ~]# firewall-cmd --reload
      success

      2),配置redis

      [root@redis-master ~]# vim /etc/redis/6379.conf 
      #修改內容如下(去掉注釋并修改):
        70 bind 172.16.1.100   #將redis的監聽地址修改為redis主機的ip
       501 requirepass pwd@123   #考慮到安全性,需要啟動redis的密碼驗證功能requirepass參數。
       137 daemonize yes  #以守護進程運行redis實例

      #修改完成后,重啟redis:

      [root@redis-master ~]# /etc/init.d/redis_6379 restart
      Stopping ...
      Waiting for Redis to shutdown ...
      Redis stopped
      Starting Redis server...
      [root@redis-master ~]# ss -anput | grep redis
      tcp    LISTEN     0      128    172.16.1.100:6379                  *:*                   users:(("redis-server",pid=5739,fd=6))

      #遠程連接redis:
      要在redis服務上執行命令需要一個redis客戶端,Redis 客戶端在我們之前下載的的redis 的安裝包中。

      [root@redis-master ~]# redis-cli --version
      redis-cli 4.0.14
      [root@redis-master ~]# redis-cli -h 172.16.1.100 -p 6379 -a pwd@123
      Warning: Using a password with '-a' option on the command line interface may not be safe.
      172.16.1.100:6379> ping   #該命令用于檢測redis服務是否啟動
      PONG

      2,部署從節點
      1)安裝redis的過程與上邊相同,這里不再重復。
      2)配置redis

      [root@redis-slave ~]# vim /etc/redis/6379.conf 
      70 bind 172.16.1.110   #修改為redis主機的ip
      137 daemonize yes  #后臺運行
      501 requirepass pwd@123  #設置redis的驗證密碼
      282 slaveof 172.16.1.100 6379   #這個配置項是主從復制的關鍵,指向master節點的地址和端口
      289 masterauth pwd@123 #配置master的授權密碼(如果master沒有設置requirepass選項,從服務器則無需配置)

      實際上配置主從復制有三種方法:

      ① 配置文件中加 slaveof  [masterHost] [masterPort]  
      ② redis-server 啟動時加--slaveof [masterHost] [masterPort]
      ③ 登錄redis直接使用命令 slaveof [masterHost] [masterPort]
      #重啟redis服務:
      [root@redis-slave ~]# /etc/init.d/redis_6379 restart
      Stopping ...
      Redis stopped
      Starting Redis server...
      [root@redis-slave ~]# ss -anput | grep redis
      tcp    LISTEN     0      128    172.16.1.110:6379                  *:*                   users:(("redis-server",pid=4886,fd=6))
      tcp    ESTAB      0      0      172.16.1.110:34105              172.16.1.100:6379                users:(("redis-server",pid=4886,fd=7))
      #可以看到多了一個主從復制的進程
      #配置防火墻:
      [root@redis-slave ~]# firewall-cmd --add-port=6379/tcp --permanent
      success
      [root@redis-slave ~]# firewall-cmd --reload
      success

      3,測試數據同步

      主redis:
      [root@redis-master ~]# redis-cli -h 172.16.1.100 -p 6379 -a pwd@123
      Warning: Using a password with '-a' option on the command line interface may not be safe.
      172.16.1.100:6379> set name abc   #設置一個key/value
      OK
      172.16.1.100:6379> get name
      "abc"
      從redis:
      [root@redis-slave ~]# redis-cli  -h 172.16.1.110 -p 6379 -a pwd@123
      Warning: Using a password with '-a' option on the command line interface may not be safe.
      172.16.1.110:6379> get name   #數據成功同步
      "abc"

      4,測試讀寫分離(redis默認就是讀寫分離)

      #在從redis上測試:
      172.16.1.110:6379> set age 20
      (error) READONLY You can't write against a read only slave. 

      3,主從切換

      1,停止主redis,模擬故障

      [root@redis-master ~]# redis-cli  -h 172.16.1.100 -p 6379 -a pwd@123 shutdown
      [root@redis-master ~]# ss -anput | grep redis
      [root@redis-master ~]# 

      2,將從redis設置成主redis(關閉復制功能)

      [root@redis-slave ~]# redis-cli -h 172.16.1.110 -p 6379 -a pwd@123 slaveof no one  
      Warning: Using a password with '-a' option on the command line interface may not be safe.
      OK

      3,測試從redis是否切換成主redis
      #查看當前主機的角色:

      [root@redis-slave ~]# redis-cli -h 172.16.1.110 -p 6379 -a pwd@123 info replication
      Warning: Using a password with '-a' option on the command line interface may not be safe.
      # Replication
      role:master            //角色為master
      connected_slaves:0
      master_replid:51ca62c64f31a7adedfb942a95d01c922f42124b
      master_replid2:e5a32a89b7806f0fa7954cb0c422172ea889fff0
      master_repl_offset:5583
      second_repl_offset:5584
      repl_backlog_active:1
      repl_backlog_size:1048576
      repl_backlog_first_byte_offset:4607
      repl_backlog_histlen:977

      #測試讀寫數據:

      [root@redis-slave ~]# redis-cli -h 172.16.1.110 -p 6379 -a pwd@123 
      Warning: Using a password with '-a' option on the command line interface may not be safe.
      172.16.1.110:6379> keys *
      1) "age"
      2) "name"
      172.16.1.110:6379> get name
      "abc"
      172.16.1.110:6379> set name zhangsan
      OK
      172.16.1.110:6379> get name
      "zhangsan"

      4,原來的主redis恢復正常了,要重新切換回去
      1)將現在的主redis的數據進行保存

      172.16.1.110:6379> keys *
      1) "age"
      2) "name"
      172.16.1.110:6379> save
      OK
      172.16.1.110:6379> get name
      "zhangsan"

      2)將現在的主redis根目錄下dump.rdb文件拷貝覆蓋到原來主redis的根目錄 (確保重新運行的master獲得redis中最新的數據):
      [root@redis-slave ~]# scp /var/lib/redis/6379/dump.rdb root@172.16.1.100:/var/lib/redis/6379/
      3)啟動原來的主redis:

      [root@redis-master ~]# /etc/init.d/redis_6379 start
      Starting Redis server...
      [root@redis-master ~]# ss -anput | grep redis
      tcp    LISTEN     0      128    172.16.1.100:6379                  *:*                   users:(("redis-server",pid=19649,fd=6))

      4)在現在的主redis中切換:

      [root@redis-slave ~]# redis-cli -h 172.16.1.110 -p 6379 -a pwd@123 slaveof 172.16.1.100 6379
      Warning: Using a password with '-a' option on the command line interface may not be safe.
      OK

      #查看狀態:
      redis的主從復制是什么?怎么用?
      可以看到現在主redis狀態已經變成了slave

      #查看主redis的狀態:
      redis的主從復制是什么?怎么用?
      可以看到狀態已經變成了master,并且數據也是最新的數據,但是這種人工操作的方法在生產環境中,肯定是稍顯不足,所以接下來介紹redis哨兵機制。

      4,Redis哨兵

      redis的主從復制模式下,一旦主節點由于故障不能提供服務,需要人工將從節點晉升為主節點,同時還要通知應用方更新節點地址,對于很多應用場景這種故障處理的方式是無法接受的;可喜的是redis從2.8開始開始正式提供了Redis Sentinel(哨兵)機制來解決這個問題。
      哨兵機制概述
      redis的哨兵(sentinel)系統用于管理多個redis服務器,該系統執行以下三個任務:
      1,監控(Monitoring):哨兵會不斷的檢查你的master和slave是否運行正常。
      2,提醒(Notification):當被監控的某個redis出現問題時,哨兵可以通過API向管理員或這其他應用程序發送通知;
      3,自動故障遷移(Automatic failover):當一個master不能正常工作時,哨兵會開始依次自動故行遷移操作,它會將失效master的其中一個slave升級為新的master,并讓失效master的其他slave改為復制新的master,當客戶端連接失效的master時,集群也會向客戶端返回新master的地址,使得集群可以使用新的master代替失效的master。

      哨兵本質也是一個redis服務,只是跟普通的redis服務提供了不一樣的功能,哨兵是一個分布式架構,因為你要保證redis高可用,首先要保證自己高可用,所以我們需要搭建哨兵的話,至少需要部署三個實例,最好是奇數個,因為在后續的故障轉移中會涉及到投票。
      部署sentinel 對redis主從架構進行監控管理
      上面我們的主從架構環境是一主一從,根據哨兵的投票機制,至少要三個實例,所以在原有的環境中添加一臺slave從節點(172.16.1.120)。
      步驟省略,參照上面部署從節點的方式進行安裝配置,最終確保能夠同步master上面的數據。

      2,配置sentinel(三臺主機操作相同)
      配置3個哨兵,每個哨兵的配置都是一樣的。在redis安裝目錄下有一個sentinel.conf文件,copy一份進行修改:

      [root@redis-master ~]# cp redis-4.0.14/sentinel.conf  /etc/redis/
      [root@redis-master ~]# ls /etc/redis/
      6379.conf  sentinel.conf
      [root@redis-master ~]# vim /etc/redis/sentinel.conf 
      修改內容如下:
      #綁定redis主機的ip地址,注意:這里其他兩臺slave從節點需要指向自己本機地址
      bind 172.16.1.100
      #端口號,默認是redis實例+20000,所以我們沿用這個規則就好了
      port 26379  
      #添加守護進程運行
      daemonize yes
      #添加日志存放的位置,這個非常重要,通過日志可以查看故障轉移的過程
      logfile "26379.log"
      #工作目錄(sentinel的相關信息文件都會保存在這,包括日志文件),這里保持默認(當然你也可以自定義路徑)
      dir /tmp
      #指定sentinel要監控的redis實例:監視一個名為mymaster(名字可自定義)的redis服務器,這個地址為master ip地址 ,
      #最后面的2代表著至少有兩個哨兵認為主服務器出現故障才會進行故障轉移,否則認定主服務未失效,一般設置為N/2+1(N為哨兵總數)。
      sentinel monitor mymaster 172.16.1.100 6379 2
      #定義服務的密碼,mymaster是服務的名稱,后面是redis服務器的密碼,如果你的redis沒有設置密碼,則需要關閉保護模式(protected-mode no)
      sentinel auth-pass mymaster pwd@123
      #sentinel判斷服務器失效的響應時間,超過這個時間未接收到服務器的響應,就認為該服務器失效了
      sentinel down-after-milliseconds mymaster 3000
      /#完成故障轉移之后,最多多少個從服務器可以同時發起數據復制(并發數),
      #數字越小,說明完成全部從服務數據復制的時間越長,數字越大,對主服務器的壓力就變大了
      sentinel parallel-syncs mymaster 1
      /#故障轉移超時時間,若sentinel在該配置值內未能完成failover操作(即故障時master/slave自動切換),則認為本次failover失敗。
      sentinel failover-timeout mymaster 180000

      3,依次啟動哨兵:(兩種方法)

      方法1:
      [root@redis-master ~]# redis-sentinel /etc/redis/sentinel.conf 
      方法2:
      [root@redis-master ~]# redis-server  /etc/redis/sentinel.conf --sentinel

      查看端口是否正常:
      redis的主從復制是什么?怎么用?
      其他兩個slave從節點依次啟動。

      注意啟動順序:如果redis和sentinel同時啟動的情況下,要先啟動redis服務,然后再啟動sentinel。

      #配置防火墻:(需要在各節點上開啟哨兵的監聽端口)
      [root@redis-slave2 ~]# firewall-cmd --add-port=26379/tcp --permanent
      success
      [root@redis-slave2 ~]# firewall-cmd --reload
      fisuccess

      #因為哨兵也是redis實例,所以我們通過以下命令查看當前的哨兵監控的信息:

      [root@redis-master ~]# redis-cli  -p 26379 -h 172.16.1.100
      172.16.1.100:26379> info sentinel
      # Sentinel
      sentinel_masters:1
      sentinel_tilt:0
      sentinel_running_scripts:0
      sentinel_scripts_queue_length:0
      sentinel_simulate_failure_flags:0
      master0:name=mymaster,status=ok,address=172.16.1.100:6379,slaves=2,sentinels=3
      #可以看到當前狀態為ok,并且監聽的主機是當前master節點,2個從節點,3個哨兵

      4,模擬主redis服務器故障,是否正常自動遷移至其他從服務器,并且從服務器自動提升為主服務器

      #關閉redis服務或者殺掉進程
      [root@redis-master ~]# redis-cli -p 6379 -h 172.16.1.100 -a pwd@123 shutdown
      Warning: Using a password with '-a' option on the command line interface may not be safe.
      [root@redis-master ~]# ps -ef | grep redis
      root      19687      1  0 04:35 ?        00:00:00 redis-sentinel 172.16.1.100:26379 [sentinel]
      root      19700   2242  0 04:39 pts/0    00:00:00 grep --color=auto redis

      #查看哨兵的監控信息:

      [root@redis-master ~]# redis-cli -h 172.16.1.100 -p 26379 info sentinel
      # Sentinel
      sentinel_masters:1
      sentinel_tilt:0
      sentinel_running_scripts:0
      sentinel_scripts_queue_length:0
      sentinel_simulate_failure_flags:0
      master0:name=mymaster,status=ok,address=172.16.1.110:6379,slaves=2,sentinels=3
      #可以發現當前哨兵監聽的master節點不是原來的了,而是從節點(172.16.1.110)了。

      #查看sentinel的日志信息:
      redis的主從復制是什么?怎么用?
      通過日志信息的可以知道,原來的master主機已經掛掉了,并且通過sentinel哨兵機制,已經自動切換master到了172.16.1.110從節點了。

      #驗證原來從節點是否切換成功:
      redis的主從復制是什么?怎么用?
      可以看到自己從原來的slave狀態切換成了master,并且172.16.1.20是作為自己的slave節點。

      172.16.1.110:6379> keys *
      1) "addr"
      2) "age"
      3) "name"
      172.16.1.110:6379> set linux redis
      OK
      172.16.1.110:6379> get linux
      "redis"
      //并且可以正常進行讀寫操作

      5,那么當掛掉的master主節點恢復正常,sentine是否會重新推選為master呢? 讓我們來驗證一下:

      #重新啟動redis服務:
      [root@redis-master ~]# /etc/init.d/redis_6379 start
      Starting Redis server...
      [root@redis-master ~]# ps -ef | grep redis
      root      19687      1  0 04:35 ?        00:00:02 redis-sentinel 172.16.1.100:26379 [sentinel]
      root      19713      1  0 04:57 ?        00:00:00 /usr/local/bin/redis-server 172.16.1.100:6379
      root      19718   2242  0 04:57 pts/0    00:00:00 grep --color=auto redis

      #查看自己狀態:
      redis的主從復制是什么?怎么用?
      可以得知,重新恢復掛掉的mater后,無法成為master,只能作為當前master的slave從節點。但需要注意的是,當掛掉的主機恢復后,哨兵機制并不會幫你還原這段時間丟失的數據,所以,還需將其他節點的dump.rdb文件做好備份工作,以再恢復后能夠導入丟失的數據。

      看完上述內容,你們對redis的主從復制大概了解了嗎?如果想了解更多相關文章內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

      推薦閱讀:redis主從復制

      免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

      主題地圖

      欧美日韩中文字幕日韩欧美一区二区三区久久国产欧美日韩精品国产在线欧美日韩精品一区亚洲欧美中文日韩v在线观看亚洲中文欧美日韩在线不卡欧美日韩亚洲国内综合网国产精品v日韩精品v欧美精品欧美v亚洲v日韩v最新在线日韩欧美中文字幕亚洲国产欧美日韩另类欧美日韩精品一区二区在线,国产精品v欧美精品v日韩精品日韩欧美一中文字暮专区亚洲欧美日韩中文无线码亚洲欧美中文日韩v在线亚洲欧美日韩在线一区国产亚洲欧美日韩在线一区2020亚洲欧美国产日韩亚洲欧美日韩精品专区欧美日韩亚洲国产精品亚洲欧美日韩综合影院日韩欧美毛片免费观看日韩欧美一中文字暮,日韩欧美亚洲欧美中文日韩在线v日本欧美日韩视费观看视频亚洲欧美日韩精品久久亚洲欧美中文日韩视频亚洲欧美偷国产日韩欧美日韩亚洲在线欧美日韩亚洲中字国产亚洲欧美日韩精品自拍欧美国产日韩中文字幕欧美日韩亚洲第一区在线欧美日韩国产在线一区二区,欧美精品v国产精品v日韩精品国产日韩精品欧美一区喷水欧美日韩免费观看在线影片欧美日韩国产在线人成久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区日韩二区欧美三区国产日韩欧美高清免费视频国产亚洲欧美日韩一区欧美日韩不卡高清在线看亚洲欧美日韩综合在线一区米奇1014超碰欧美日韩亚洲,亚洲欧美日韩一区二区国产日韩欧美无限制视频中文亚洲欧美日韩无线码亚洲一日韩欧美中文字幕在线亚洲欧美中文日韩在线视频欧美日韩国产码高清亚洲欧美日韩一区日韩精品视频欧美国产国产欧美日韩在线在线播放综合精品欧美日韩国产在线欧美日韩免费一区高清欧美日韩中文国产一区,欧美日韩在线视频国产欧美日韩中文久久欧美日韩视频高清一区日韩欧美亚洲每日更新在线日韩欧美中文字幕在线日韩欧美国产精品亚洲二区日韩欧美亚洲综合久久欧美日韩免费一区二区三区播放国产日韩欧美不卡在线二区手机看片日韩国产欧美日韩欧美中文字幕在线二视频天堂av亚洲欧美日韩国产综合