一 Linux上安裝Redis1.1 安裝redis
配置清單克隆一臺linux主機 修改ip地址 hostname 重啟安裝gcc-c++ : yum -y install gcc-c++在home下建立一個redis的資料夾: mkdir /home/redis移動到這個資料夾下: cd /home/redis下載redis : wget https://download.redis.io/releases/redis-5.0.9.tar.gz解壓redis: tar -zxvf redis-5.0.9.tar.gz進入到redis解壓目錄: cd redis-5.0.9編譯並執行:make && make install PREFIX=/usr/local/redis
1.2 啟動執行移動到redis的安裝目錄: cd /usr/local/redis啟動redis : ./bin/redis-server當我們直接這樣啟動的時候 此時我們當前xshell視窗已經被redis佔用,我們使用ctrl+z 此時會停止redis。 修改守護執行緒(相當於讓redis服務啟動的時候 能在後臺執行)將配置檔案複製到bin目錄下:cp /home/redis/redis-5.0.9/redis.conf /usr/local/redis/bin修改bin下的配置檔案: vim /usr/local/redis/bin/redis.conf 將136行改為 yes 開啟守護程序 底行模式 :136 確定再次啟動redis的時候 需要我們用配置檔案啟動執行redis: ./bin/redis-server ./bin/redis.conf客戶端連線: ./bin/redis-cli在連線上redis之後 如果想關閉redis 服務: shutdownshutdown savectrl+c 退出連線ps -ef | grep redis 找到程序號 kill -9 程序號
二 Redis主從1.1 搭建叢集並配置主從
IP地址 服務 角色
192.168.239.160:8001 redis 主 master
192.168.239.161:8003 redis 從 slave
配置清單
克隆一臺有redis的linux系統 修改ip地址 修改hostname 重啟 xshell連線 修改主redis配置檔案: vim /usr/local/redis/bin/redis.conf :69 bind 192.168.239.160 讓redis開啟遠端訪問 :92 port 8001 埠 :136 daemonize yes 守護程序 修改從redis配置檔案: vim /usr/local/redis/bin/redis.conf :69 bind 192.168.239.161 :92 port 8003 :136 daemonize yes :70 slaveof 192.168.239.160 8001 啟動兩臺redis服務 連線redis: ./redis-cli -h 192.168.239.160 -p 8001 -c 連線redis: ./redis-cli -h 192.168.239.161 -p 8003 -c 測試主從 在主redis中新增資料 set aaa bbb set bbb cccc 在從redis中獲取資料 get aaa get bbb 測試讀寫 在從redis中新增資料 192.168.239.161:8003> set hahahaha hehehehe (error) READONLY You can't write against a read only replica. 得到結論 從redis 不允許寫操作
1.2 redis的主從原理實現主從複製(Master-Slave Replication)的工作原理:
Slave從節點服務啟動並連線到Master之後,它將主動傳送一個SYNC命令。
Master服務主節點收到同步命令後將啟動後臺存檔程序,同時收集所有接收到的用於修改資料集的命令,在後臺程序執行完畢後,Master將傳送整個資料庫檔案到Slave,以完成一次完全同步。而Slave從節點服務在接收到資料庫檔案資料之後將其存檔並載入到記憶體中。
此後,Master主節點繼續將所有已經收集到的修改命令,和新的修改命令依次傳送給Slaves,Slave將在本次執行這些資料修改命令,從而達到最終的資料同步。
如果Master和Slave之間的連結出現斷連現象,Slave可以自動重連Master,但是在連線成功之後,一次完全同步將被自動執行
主從複製配置:
找到redis的配置檔案第一步:修改從節點的配置檔案:slaveof 主節點ip第二步:如果設定了密碼,就要設定:masterauth
1.3 redis主從特點
讀寫分離,提高效率
資料熱備份,提供多個副本
Redis的Replication的特點和缺點:
主節點故障,叢集則無法進行工作,可用性比較低,從節點升主節點需要人工手動干預
單點容易造成效能低下
主節點的儲存能力受到限制
主節點的寫受到限制(只有一個主節點)
全量同步可能會造成毫秒或者秒級的卡頓現象
單點問題壓力大,故障之後無法主動切換需要人為操作。即使再加redis也是 一主多從, 主節點一旦掛掉,此時無法正常寫操作。
哨兵就是一個監控平臺,redis中自帶哨兵機制。能實現主從切換。例如 一主兩從, 如果主節點宕機,哨兵會重新選舉新的主節點。
三 Redis中哨兵機制3.1 什麼是哨兵哨兵模式是一種特殊的模式,首先Redis提供了哨兵的命令,哨兵是一個獨立的程序,作為程序,它會獨立執行。其原理是哨兵透過傳送命令,等待Redis伺服器響應,從而監控執行的多個Redis例項
3.2 哨兵的作用A Master狀態檢測 B 如果Master異常,則會進行Master-Slave切換,將其中一個Slave作為Master,將之前的Master作為Slave。 C Master-Slave切換後,masterredis.conf、slaveredis.conf和sentinel.conf的內容都會發生改變,即master_redis.conf中會多一行slaveof的配置,sentinel.conf的監控目標會隨之調換。
3.3 哨兵的流程1)每個Sentinel(哨兵也可以搭建叢集)以每秒鐘一次的頻率向它所知的Master,Slave以及其他 Sentinel 例項傳送一個PING命令。2)如果一個例項(instance)距離最後一次有效回覆PING命令的時間超過 own-after-milliseconds 選項所指定的值,則這個例項會被Sentinel標記為主觀下線。 3)如果一個Master被標記為主觀下線,則正在監視這個Master的所有 Sentinel 要以每秒一次的頻率確認Master的確進入了主觀下線狀態。 4)當有足夠數量的Sentinel(大於等於配置檔案指定的值)在指定的時間範圍內確認Master的確進入了主觀下線狀態,則Master會被標記為客觀下線。5)在一般情況下,每個Sentinel 會以每10秒一次的頻率向它已知的所有Master,Slave傳送 INFO 命令。6)當Master被Sentinel標記為客觀下線時,Sentinel 向下線的 Master 的所有Slave傳送 INFO命令的頻率會從10秒一次改為每秒一次。 7)若沒有足夠數量的Sentinel同意Master已經下線,Master的客觀下線狀態就會被移除。 若 Master重新向Sentinel 的PING命令返回有效回覆,Master的主觀下線狀態就會被移除。
簡單地說\故障切換(failover)*的過程。假設主伺服器宕機,哨兵1先檢測到這個結果,系統並不會馬上進行failover過程,僅僅是哨兵1主觀地認為主伺服器不可用,這個現象成為*主觀下線*。當後面的哨兵也檢測到主伺服器不可用,並且數量達到一定值時,那麼哨兵之間就會進行一次投票,投票的結果由一個哨兵發起,進行failover操作。切換成功後,就會透過釋出訂閱模式,讓各個哨兵把自己監控的從伺服器實現切換主機,這個過程稱為*客觀下線**。這樣對於客戶端而言,一切都是透明的。
https://www.cnblogs.com/kevingrace/p/9004460.html
3.4 redis哨兵搭建克隆一臺redis 搭建一主雙從 192.168.239.160:8001 主192.168.239.161:8003 從192.168.239.162:8005 從修改162的redis配置資訊: vim /usr/local/redis/bin/redis.conf:69 bind 192.168.239.162:92 port 8005搭建一臺sentinel哨兵程序找到160下的sentinel檔案複製到bin目錄下cp /home/redis/redis-5.0.9/sentinel.conf /usr/local/redis/bin/ 修改我們的sentinel配置檔案 :vim /usr/local/redis/bin/sentinel.conf:17 protected-mode no 預設為yes 不能進行遠端連線所以改為no:26 daemonize yes 開啟守護:84 sentinel monitor mymaster 192.168.239.160 8001 1:103 sentinel auth-pass mymaster 123啟動redis一主雙從叢集啟動哨兵:./redis-sentinel sentinel.conf透過命令連線每一臺redis:./redis-cli -h 192.168.239.161 -p 8003 -c 輸入info檢視當前主從資訊 # Replicationrole:masterconnected_slaves:2slave0:ip=192.168.239.161,port=8003,state=online,offset=14269,lag=0slave1:ip=192.168.239.162,port=8005,state=online,offset=14269,lag=0測試:幹掉主節點shutdown save 透過info 檢視新的主節點# Replicationrole:masterconnected_slaves:2slave0:ip=192.168.239.161,port=8003,state=online,offset=32341,lag=0slave1:ip=192.168.239.160,port=8001,state=online,offset=32341,lag=0
3.5 redis的進化史redis最開始使用主從模式做叢集,若master宕機需要手動配置slave轉為master;後來為了高可用提出來\哨兵**模式,該模式下有一個哨兵監視master和slave,若master宕機可自動將slave轉為master,但它也有一個問題,就是不能動態擴充;所以在3.x提出cluster叢集模式。
在哨兵模式下,還是一主多從,好處是主掛掉了之後不需要手動配置 哨兵會自動主從切換。但是依然存單 單主壓力過大問題。
四 Redis的cluster叢集模式4.1 redis叢集設計Redis-Cluster採用無中心結構,每個節點儲存資料和整個叢集狀態,每個節點都和其他所有節點連線。
其結構特點:1、所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議最佳化傳輸速度和頻寬。2、節點的fail是透過叢集中超過半數的節點檢測失效時才生效。3、客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可。4、redis-cluster把所有的物理節點對映到[0-16383]slot上(不一定是平均分配),cluster 負責維護node<->slot<->value。5、Redis叢集預分好16384個桶,當需要在 Redis 叢集中放置一個 key-value 時,根據 CRC16(key) mod 16384的值,決定將一個key放到哪個桶中。
\主機名稱\ IP地址 \redis版本和角色說明**
redis160 192.168.239.160:8001 redis 5.0.9(?)
redis161 192.168.239.161:8003 redis 5.0.9(?)
redis162 192.168.239.162:8005 redis 5.0.9(?)
redis160 192.168.239.160:8002 redis 5.0.9(?)
redis161 192.168.239.161:8004 redis 5.0.9(?)
redis162 192.168.239.162:8006 redis 5.0.9(?)
搭建三主三從 (一臺電腦啟動兩個redis)
Redis160操作:在redis目錄下建立一個資料夾: mkdir /usr/local/redis/conf在conf中建立8001 8002兩個資料夾分別存放不同埠的配置檔案將配置檔案複製到conf資料夾下: cp /home/redis/redis-5.0.9/redis.conf /usr/local/redis/conf/8001/進入到8001修改配置檔案:vim /usr/local/redis/conf/8001/redis.conf:69 bind 192.168.239.160 修改ip地址為當前主機的ip地址:92 port 8001 修改埠號:136 daemonize yes 守護程序:158 pidfile /var/run/redis_8001.pid 當前redis執行的進行id:699 appendonly yes aof日誌開啟:832 cluster-enabled yes 開啟叢集模式:840 cluster-config-file nodes-8001.conf 叢集配置檔案:846 cluster-node-timeout 15000 超時時間將當前配置檔案複製到6388資料夾下:cp /usr/local/redis/conf/8001/redis.conf /usr/local/redis/conf/8002/redis.conf修改8002配置檔案 底行模式 : :%s/8001/8002/gRedis161操作:在redis目錄下建立一個資料夾: mkdir /usr/local/redis/conf在conf中建立8003 8004兩個資料夾分別存放不同埠的配置檔案[root@redis161 conf]# scp 192.168.239.160:/usr/local/redis/conf/8001/redis.conf /usr/local/redis/conf/8003 修改配置檔案注意 此時要修改ip地址Redis162操作:同reids161 scp 192.168.239.160:/usr/local/redis/conf/8001/redis.conf /usr/local/redis/conf/8005 啟動所有的redis 我們統一進入到redis目錄: cd /usr/local/redis/./bin/redis-server conf/8001/redis.conf[root@redis- redis]# ./bin/redis-server conf/8001/redis.conf 1727:C 29 Dec 2020 17:15:01.438 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo1727:C 29 Dec 2020 17:15:01.438 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=1727, just started1727:C 29 Dec 2020 17:15:01.438 # Configuration loaded[root@redis- redis]# ./bin/redis-server conf/8002/redis.conf 1732:C 29 Dec 2020 17:15:08.104 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo1732:C 29 Dec 2020 17:15:08.104 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=1732, just started1732:C 29 Dec 2020 17:15:08.104 # Configuration loaded啟動redis叢集配置,在任意機器中輸入./bin/redis-cli --cluster create 192.168.239.160:8001 192.168.239.160:8002 192.168.239.161:8003 192.168.239.161:8004 192.168.239.162:8005 192.168.239.162:8006 --cluster-replicas 1注意 -cluster-replicas 1 代表副本的數量 1 六臺機器 每個人有一個副本 就是三主三從 如果六臺機器 每個人有兩個副本 就是 兩主四從>>> Performing hash slots allocation on 6 nodes...Master[0] -> Slots 0 - 5460Master[1] -> Slots 5461 - 10922Master[2] -> Slots 10923 - 16383Adding replica 192.168.239.161:8004 to 192.168.239.160:8001Adding replica 192.168.239.162:8006 to 192.168.239.161:8003Adding replica 192.168.239.160:8002 to 192.168.239.162:8005M: 6a79309d782c21aa06adfc9bf374462b090ae13f 192.168.239.160:8001slots:[0-5460] (5461 slots) masterS: 69bce9ba42c959847cf864e69c088cc557fe0a96 192.168.239.160:8002replicates ddfd8fe75b195a3508e76ffebd9a39ab8e597b13M: 3de6074a2f5f512b22be96dfc59b6efcfd184107 192.168.239.161:8003slots:[5461-10922] (5462 slots) masterS: 39cd007836652c2b8f816f4dcfd146336082e56a 192.168.239.161:8004replicates 6a79309d782c21aa06adfc9bf374462b090ae13fM: ddfd8fe75b195a3508e76ffebd9a39ab8e597b13 192.168.239.162:8005slots:[10923-16383] (5461 slots) masterS: ece09c5682cf47edd28315f6bafb99b9f26df4d4 192.168.239.162:8006replicates 3de6074a2f5f512b22be96dfc59b6efcfd184107Can I set the above configuration? (type 'yes' to accept): yes>>> Nodes configuration updated>>> Assign a different config epoch to each node>>> Sending CLUSTER MEET messages to join the clusterWaiting for the cluster to join....>>> Performing Cluster Check (using node 192.168.239.160:8001)M: 6a79309d782c21aa06adfc9bf374462b090ae13f 192.168.239.160:8001slots:[0-5460] (5461 slots) master1 additional replica(s)M: ddfd8fe75b195a3508e76ffebd9a39ab8e597b13 192.168.239.162:8005slots:[10923-16383] (5461 slots) master1 additional replica(s)S: 69bce9ba42c959847cf864e69c088cc557fe0a96 192.168.239.160:8002slots: (0 slots) slavereplicates ddfd8fe75b195a3508e76ffebd9a39ab8e597b13M: 3de6074a2f5f512b22be96dfc59b6efcfd184107 192.168.239.161:8003slots:[5461-10922] (5462 slots) master1 additional replica(s)S: ece09c5682cf47edd28315f6bafb99b9f26df4d4 192.168.239.162:8006slots: (0 slots) slavereplicates 3de6074a2f5f512b22be96dfc59b6efcfd184107S: 39cd007836652c2b8f816f4dcfd146336082e56a 192.168.239.161:8004slots: (0 slots) slavereplicates 6a79309d782c21aa06adfc9bf374462b090ae13f[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.連線其中一個節點:./bin/redis-cli -h 192.168.239.160 -p 8001 -c檢視節點資訊:CLUSTER NODES檢視節點執行資訊:CLUSTER INFO