redis的認識node
redis是一個key-value存儲系統。和Memcached相似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)和zset(有序集合)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操做,並且這些操做都是原子性的。在此基礎上,redis支持各類不一樣方式的排序。與memcached同樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,而且在此基礎上實現了master-slave(主從)同步。c++
redis集羣原理:
redis集羣好處: 容錯,可解決單節點redis問題;可擴展性,多節點部署;性能提高。
1)全部的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬。
2)節點的fail是經過集羣中超過半數節點檢測失效才生效。
3)客戶端與redis節點直連,不須要中間proxy層,客戶端不須要鏈接集羣全部節點,鏈接集羣中任何一個節點便可。
4)redis-cluster把全部的物理節點映射到[0-16383]個槽slot上,cluster負責維護node<->slot<->value Redis cluster中內置了16384個哈希槽,當須要在redis集羣中放置一個key-value時,redis先對key使用crc16算法算出一個結果,而後把結果對16384求餘數,這樣就保證每一個key都會對應到0-16383之間的哈希槽,redis會根據節點的數量大體均等的將哈希槽映射到不一樣的節點。redis
redis主從複製+sentinel故障轉移算法
環境:
OS:centos
redis版本:Redis3.0以上
節點:
master 192.168.10.78 (redis+sentinel)
slave01 192.168.10.80 (redis+sentinel)
slave01 192.168.10.81 (redis+sentinel)vim
1.redis安裝yum install -y make gcc gcc-c++ zlib-devel openssl openssl-devel pcre-devel kernel keyutils patch perl
centos
192.168.10.78主緩存
cd/usr/local/redis-3.0.7/redis-master/ make make install make test(test可不操做)
192.168.10.80和192.168.10.80同理。服務器
2.redis配置
以主機192.168.10.78主爲例。架構
echo vm.overcommit_memory=1 >> /etc/sysctl.conf sysctl vm.overcommit_memory=1
其中, "0:表示內核將檢查是否有足夠的可用內存供應用進程使用,1:表示內核容許分配全部的物理內存,而無論當前的內存狀態如何"。socket
vim /usr/local/redis-3.0.7/redis-master/src/redis.conf
修改以下幾行
daemonize yes //後臺運行 port 6379 logfile "/var/log/redis.log" tcp-backlog 65535 # 提升tcp backlog的數量 maxclients 20000 #此值不可設置的過大,覺得每一個socket鏈接會以「文件描述符」方式被系統打開, 因此受Linux系統「文件描述符」限制。若是超過系統設置,server會拒絕鏈接。 maxmemory 6gb #最好是物理內存的3/4,與maxmemory-policy配合使用 maxmemory-policy allkeys-lru # Redis內存回收策略,內存不足時,數據清除策略。 lru = last recent updated,建議採用allkeys-lru內存回收策略。 maxmemory-samples 3 #內存回收策略lru和ttl策略並不是嚴禁策略,採用估算方式, 所以選擇取樣方式以便檢查。選擇3個key,從中淘汰不常常用的。 slave-serve-stale-data yes # 讓Redis slave能夠回覆客戶請求,及時它沒有被徹底同步(sync)。即若是當前server爲slave, 當 slave 與 master 失去通信,是否繼續爲客戶提供服務。 slave-read-only yes # 禁止Slave有被不當心直接寫入的可能,salve爲只讀方式。 #關閉Redis往磁盤寫入,提升性能 #save 900 1 #save 300 10 #save 60 10000 min-slaves-to-write 1 # 這裏保障,redis master至少要有1個鏈接得上的slave纔可被寫入,用來減小replication丟數據的機會 min-slaves-max-lag 10 # 這裏保障,redis master會中止寫入,若是在10秒內收不到從slave的replication確認回饋
192.168.10.80 和 192.168.10.81 配置同上,修改相應端口便可。
80: slaveof 192.168.10.78 6379
81: slaveof 192.168.10.78 6379
3.sentinel 配置
Redis Sentinel 是一個分佈式系統,可監控(Monitoring)、提醒(Notification)和 自動故障遷移(Automatic failover)。
能夠在一個架構中運行多個 Sentinel 進程(progress), 這些進程使用流言協議(gossip protocols)來接收關於主服務器是否下線的信息, 並使用投票協議(agreement protocols)來決定是否執行自動故障遷移, 以及選擇哪一個從服務器做爲新的主服務器。
192.168.10.78主要配置項說明:
vim /etc/sentinel.conf
port 26379 #指定sentinel的偵聽端口(即與redis server或client創建tcp鏈接的端口) dir /usr/local/redis-3.0.7/redis-master/src sentinel monitor mymaster 127.0.0.1 6379 2 #指定sentinel要monitor的redis實例,包括一個redis實例的別名(alias)及redis實例的ip+port,該行最後的數字2表示至少2個setinel實例同時檢測到redis server異常時,纔將redis server的狀態判決爲real fail。 sentinel down-after-milliseconds mymaster 20000 #指定sentinel監控到redis實例持續異常多長時間後(20s),會判決其狀態爲down。 sentinel failover-timeout mymaster 60000 #若sentinel在該配置值內(60s)未能完成failover操做(即故障時master/slave自動切換),則認爲本次failover失敗。 sentinel parallel-syncs mymaster 1 #指定failover過程當中,同時被sentinel reconfigure的最大slave實例數。因爲reconfigure過程當中,對應的slave會中斷響應客戶端請求,故爲避免全部的slave同時不可用,該值需適當配小。
192.168.10.80從主要配置:
port 26380 dir /usr/local/redis-3.0.7/src sentinel monitor mymaster 192.168.10.78 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 60000 sentinel parallel-syncs mymaster 1
192.168.10.81從主要配置:
port 26381 dir /usr/local/redis-3.0.7/src sentinel monitor mymaster 192.168.10.78 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 60000 sentinel parallel-syncs mymaster 1
4.啓動
redis
192.168.10.78:
cd /usr/local/redis-3.0.7/redis-master ./src/redis-server ./redis-6379.conf &
192.168.10.80:
cd /usr/local/redis-3.0.7 ./src/redis-server ./redis-6380.conf &
192.168.10.81:
cd /usr/local/redis-3.0.7 ./src/redis-server ./redis-6381.conf &
sentinel
192.168.10.78:
cd /usr/local/redis-3.0.7/redis-master ./src/redis-server ./sentinel-26379.conf --sentinel &
192.168.10.80:
cd /usr/local/redis-3.0.7/ ./src/redis-server ./sentinel-26380.conf --sentinel &
192.168.10.81:
cd /usr/local/redis-3.0.7 ./src/redis-server ./sentinel-26381.conf --sentinel &
5.測試
鏈接redis端口
./redis-cli -h 127.0.0.1 -p 6379 info replication
./src/redis-cli -h 127.0.0.1 -p 6379 info replication ./src/redis-cli -h 127.0.0.1 -p 26379 info Sentinel
內存使用狀況查看:
redis-cli -h 127.0.0.1 info | grep memory
鏈接sentinel監控端口測試:
./redis-cli -h 127.0.0.1 -p 26379
SENTINEL get-master-addr-by-name mymaster
注意:一、主從切換後,redis.conf、sentinel.conf內容都會改變reconfiguration,主要還想要原來的主從架構,要再修改配置文件;二、master掛掉,sentinel已經選擇了新的master,可是尚未將其改爲master,可是已經將old master改爲了slave。那麼這時候若是重啓old master,就會處於無主狀態。因此一方面要等sentinel穩定後再啓動old master,或者從新人工修改配置文件,從新啓動集羣。三、再把服務已關閉的redis(old master)恢復服務狀態,redis sentinel 集羣服務,會把上次主redis從新加入服務中,可是他再以不是主的redis了,變成從的reids。四、若是此後想再次讓redis-0加入集羣,你須要首先經過"INFO"指令找到當前的masterip + port,並在啓動指令中明確指明slaveof參數:./redis-server --include /etc/redis.conf --slaveof 192.168.10.80 6380