Redis是一個開源的,使用ANSI C 編寫,高性能的Key-Value的NoSQL數據庫。node
(1)基於內存redis
(2)可持久化數據shell
(3)具備豐富的數據結構類型,適應非關係型數據的存儲需求數據庫
(4)支持絕大多數主流開發語言,如C、C++、Java、Python、R、JavaScript等。vim
(5)支持集羣模式,高效、穩定。緩存
(1)鍵值對形式。bash
(2)Redis的數據結構類型,指的就是Redis值的結構類型。服務器
Redis能靈活處理非關係型數據的讀、寫問題,是對MySQL等關係型數據庫的補充。網絡
新浪微博就是使用Redis集羣作數據庫。數據結構
所謂緩存,就是將數據加載到內存中後直接使用,而不是每次都經過IO流從磁盤上讀取。好處:讀寫效率高。
而Redis則是將數據直接存儲在內存中,只有當內存空間不足時,將部分數據持久化到磁盤上。
Redis官方只提供了源碼,並無提供通過編譯以後的安裝包。
所以,安裝Redis,要先編譯、後安裝。(即源碼安裝方式)
# 安裝步驟 cd /usr/local/src wget http://download.redis.io/releases/redis-5.0.4.tar.gz tar -zxv -f redis-5.0.4.tar.gz cd /usr/local/src/redis-5.0.4/ make MALLOC=libc (或者直接make,不用./configure) make install (安裝到指定目錄:make PREFIX=/usr/local/redis install,不指定的話默認安裝到/usr/local/bin目錄下,也能夠執行該步驟,也就是安裝) # 不安裝的話命令執行文件路徑是:/usr/local/src/redis-5.0.4/src # 配置文件:/usr/local/src/redis-5.0.4/redis.conf # 優化配置,使用root帳號操做 # vim /etc/sysctl.conf vm.overcommit_memory = 1 net.core.somaxconn = 2048 # sysctl -p # echo never > /sys/kernel/mm/transparent_hugepage/enabled # vim /etc/rc.d/rc.local if test -f /sys/kernel/mm/transparent_hugepage/enabled; then echo never > /sys/kernel/mm/transparent_hugepage/enabled fi if test -f /sys/kernel/mm/transparent_hugepage/defrag; then echo never > /sys/kernel/mm/transparent_hugepage/defrag fi # chmod +x /etc/rc.d/rc.local # vim /etc/security/limits.conf * soft nofile 65535 * hard nofile 65535 # 啓動 [sandu@bogon ~]# ./src/redis-server ./redis.conf 1270:C 02 Aug 2019 16:27:19.274 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 1270:C 02 Aug 2019 16:27:19.275 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=1270, just started 1270:C 02 Aug 2019 16:27:19.275 # Configuration loaded _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 5.0.4 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in standalone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 1270 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 1270:M 02 Aug 2019 16:27:19.277 # Server initialized 1270:M 02 Aug 2019 16:27:19.277 * Ready to accept connections # 使用自帶的客戶端鏈接,默認沒有密碼直接鏈接 [sandu@bogon ~]# ./src/redis-cli 127.0.0.1:6379> ping # 檢測redis服務是否啓動 PONG 127.0.0.1:6379> set a 1111 OK 127.0.0.1:6379> get a "1111" 127.0.0.1:6379> quit # 退出 # 密碼鏈接 # redis-cli -h host -p port -a password [sandu@bogon ~]# ./src/redis-cli 127.0.0.1:6379> auth foobar2000 OK 127.0.0.1:6379> set b 222222 OK 127.0.0.1:6379> get b "222222" 127.0.0.1:6379> exit
bind:容許訪問該redis的主機
protected-mode:保護模式,默認開啓。若設置外部網絡鏈接redis服務,設置方式以下:
一、關閉protected-mode模式,此時外部網絡能夠直接訪問
二、開啓protected-mode保護模式,需配置bind ip或者設置訪問密碼,或者bind ip和密碼都設置
requirepass:設置密碼
databases:Redis默認有16個數據庫,尋址角標從0開始。默認鏈接db0。客戶端使用select命令,切換數據庫
port :指定redis的服務端口,默認6379.
daemonize:Redis默認關閉後臺進程模式,改爲yes,redis服務在後臺啓動。
loglevel :日誌等級
logfile:Redis日誌輸出目錄,默認不輸出日誌到文件。
dbfilename:指定數據持久化的文件名
dir :指定數據持久化的文件存放目錄,也是集羣node.con文件存放目錄
cluster-enabled:是否啓用集羣
cluster-config-file:集羣文件
進入redis根目錄,執行命令,加上‘&’號使redis之後臺程序方式運行
./src/redis-server &
./src/redis-server /etc/redis/6379.conf
進入redis根目錄,輸入命令,若是更改了端口,使用redis-cli
客戶端鏈接時,也須要指定端口,例如:
redis-cli -p 6380 # redis-cli -h host -p port -a password
啓動腳本 redis_init_script 位於位於Redis的 /utils/ 目錄下,redis_init_script腳本代碼以下:
#!/bin/sh # # Simple Redis init.d script conceived to work on Linux systems # as it does use of the /proc filesystem. # chkconfig: 2345 90 10 ### BEGIN INIT INFO # Provides: redis_6379 # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Redis data structure server # Description: Redis data structure server. See https://redis.io ### END INIT INFO #redis服務器監聽的端口 REDISPORT=6379 #服務端所處位置 EXEC=/usr/local/bin/redis-server #客戶端位置 CLIEXEC=/usr/local/bin/redis-cli #redis的PID文件位置,根據實際狀況修改 PIDFILE=/var/run/redis_${REDISPORT}.pid #redis的配置文件位置,需將${REDISPORT}修改成文件名 CONF="/etc/redis/${REDISPORT}.conf" case "$1" in start) if [ -f $PIDFILE ] then echo "$PIDFILE exists, process is already running or crashed" else echo "Starting Redis server..." $EXEC $CONF fi ;; stop) if [ ! -f $PIDFILE ] then echo "$PIDFILE does not exist, process is not running" else PID=$(cat $PIDFILE) echo "Stopping ..." $CLIEXEC -p $REDISPORT shutdown while [ -x /proc/${PID} ] do echo "Waiting for Redis to shutdown ..." sleep 1 done echo "Redis stopped" fi ;; *) echo "Please use start or stop as first argument" ;; esac
將啓動腳本複製到/etc/init.d目錄下,本例將啓動腳本命名爲redisd(一般都以d結尾表示是後臺自啓動服務)
cd cp redis_init_script /etc/init.d/redisd chkconfig redisd on service redisd start|stop
# 斷電,非正常關閉,容易致使數據丟失 ps -ef | grep redis kill -9 PID
# 正常關閉,數據保存 redis-cli shutdown # 關閉redis服務,經過客戶端進行shutdown # 若是redis設置了密碼,則須要先用客戶端登陸,而後再進行shutdown redis-cli -a password 127.0.0.1:6379> shutdown # 從新啓動redis服務,使用客戶端鏈接,會發現數據還在
Redis持久化,就是將內存中的數據,永久保存到磁盤上。
Redis持久化有兩種方式:RDB(Redis DB)、AOF(AppendOnlyFile)
Redis 能夠同時使用 AOF 持久化和 RDB 持久化。 在這種狀況下, 當 Redis 重啓時, 它會優先使用 AOF 文件來還原數據集, 由於 AOF 文件保存的數據集一般比 RDB 文件所保存的數據集更完整。
在默認狀況下,Redis 將數據庫快照保存在名字爲dump.rdb的二進制文件中,能夠在redis.conf配置文件中修改持久化信息。
save 900 1 表示在900秒內,至少更新了1條數據。Redis就將數據持久化到硬盤 save 300 10 表示在300內,至少更新了10條數據,Redis就會觸發將數據持久化到硬盤 save 60 10000 表示60秒內,至少更新了10000條數據,Redis就會觸發將數據持久化到硬盤
按照配置文件中的條件知足就執行BGSAVE;
非阻塞,Redis服務正常接收處理客戶端請求;
Redis會folk()一個新的子進程來建立RDB文件,子進程處理完後會向父進程發送一個信號,通知它處理完畢;
父進程用新的dump.rdb替代舊文件。
客戶端(redis-cli)發起SAVE命令;
阻塞Redis服務,沒法響應客戶端請求;
建立新的dump.rdb替代舊文件。
執行效率高;
恢復大數據集速度較AOF快。
會丟失最近寫入、修改的而未能持久化的數據;
folk過程很是耗時,會形成毫秒級不能響應客戶端請求。
AOF默認關閉,須要在配置文件中手動開啓。
記錄全部的寫操做命令,在服務啓動的時候使用這些命令就能夠還原數據庫。
Append only file,採用追加的方式保存,默認文件appendonly.aof。
AOF機制,添加了一個內存緩衝區(buffer):
appendfsync選項,這個選項的值能夠是always、everysec或者no
運行速度:always的速度慢,everysec和no都很快
AOF文件過大,合併重複的操做,AOF會使用盡量少的命令來記錄
(1)folk一個子進程負責重寫AOF文件
(2)子進程會建立一個臨時文件寫入AOF信息
(3)父進程會開闢一個內存緩衝區接收新的寫命令
(4)子進程重寫完成後,父進程會得到一個信號,將父進程接收到的新的寫操做由子進程寫入到臨時文件中
(5)新文件替代舊文件
重寫的本質:就是將操做同一個鍵的命令,合併。從而減少AOF文件的體積
(1)手動:
客戶端向服務器發送BGREWRITEAOF命令
(2)自動:
配置文件中的選項,自動執行BGREWRITEAOF命令
寫入機制,默認fysnc(手工同步)每秒執行,性能很好不阻塞服務,最多丟失一秒的數據;
重寫機制,優化AOF文件;
若是誤操做了(FLUSHALL等),只要AOF未被重寫,中止服務移除AOF文件尾部FLUSHALL命令,重啓Redis,能夠將數據集恢復到FLUSHALL 執行以前的狀態。
相同數據集,AOF文件體積較RDB大了不少;
恢復數據庫速度較RDB慢(文本,命令重演)
所謂的集羣,就是經過添加服務器的數量,提供相同的服務,從而讓服務器達到一個穩定、高效的狀態。
問題:咱們已經部署好了redis,而且能啓動一個redis,實現數據的讀寫,爲何還要學習redis集羣?
答:(1)單個redis存在不穩定性。當redis服務宕機了,就沒有可用的服務了。
(2)單個redis的讀寫能力是有限的。
總結:redis集羣是爲了強化redis的讀寫能力。
說明:(1)redis集羣中,每個redis稱之爲一個節點。
(2)redis集羣中,有兩種類型的節點:主節點(master)、從節點(slave)。
(3)redis集羣,是基於redis主從複製實現。
因此,學習redis集羣,就是從學習redis主從複製模型開始的。
主從複製模型中,有多個redis節點。
其中,有且僅有一個爲主節點Master。從節點Slave能夠有多個。
只要網絡鏈接正常,Master會一直將本身的數據更新同步給Slaves,保持主從同步。
(1)主節點Master可讀、可寫.
(2)從節點Slave只讀。(read-only)
所以,主從模型能夠提升讀的能力,在必定程度上緩解了寫的能力。由於能寫仍然只有Master節點一個,能夠將讀的操做所有移交到從節點上,變相提升了寫能力。
(1)在/usr/local目錄下,建立一個/redis/master-slave目錄
mkdir -p /usr/local/redis/master-slave
(2)在master-slave目錄下,建立三個子目錄6380、638一、6382
mkdir 6380 6381 6382
(3)依次拷貝redis解壓目錄下的redis.conf配置文件,到這三個子目錄中
cp /usr/local/src/redis-5.0.4/redis.conf 6380/ cp /usr/local/src/redis-5.0.4/redis.conf 6381/ cp /usr/local/src/redis-5.0.4/redis.conf 6382/
(4)進入6380目錄,修改redis.conf,將port端口修改爲6380便可
(5)進入6381目錄,修改redis.conf,將port端口改爲6381,同時指定開啓主從複製
# 主節點ip 主節點端口 replicaof 127.0.0.1 6380
(6)進入6382目錄,修改redis.conf,將port端口改爲6382,同時指定開啓主從複製
(1)打開三個shell窗口,在每個窗口中,啓動一個redis節點。查看日誌輸出。(不要改爲後臺模式啓動,看不到日誌,不直觀)
(2)另外再打開三個shell窗口,在每個窗口中,登錄一個redis節點
(3)在主節點6380上,進行讀寫操做,操做成功
(4)在從節點6381上,讀操做執行成功,而且成功從6380上同步了數據;寫操做執行失敗。(從節點,只能讀,不能寫)
# 寫操做執行失敗提示 (error) READONLY You can't write against a read only replica.
當主節點宕機了,整個集羣就沒有可寫的節點了。
問:因爲從節點上備份了主節點的全部數據,那在主節點宕機的狀況下,若是可以將從節點變成一個主節點,是否是就能夠解決這個問題了呢?
答:是的,這個就是Sentinel哨兵的做用。
Redis 的 Sentinel 系統用於管理多個 Redis 服務器(instance), 該系統執行如下三個任務:
監控(Monitoring): Sentinel 會不斷地檢查你的主服務器和從服務器是否運做正常。
提醒(Notification): 當被監控的某個 Redis 服務器出現問題時, Sentinel 能夠經過 API 向管理員或者其餘應用程序發送通知。
自動故障遷移(Automatic failover): 當一個主服務器不能正常工做時, Sentinel 會開始一次自動故障遷移操做, 它會進行選舉,將其中一個從服務器升級爲新的主服務器, 並讓失效主服務器的其餘從服務器改成複製新的主服務器; 當客戶端試圖鏈接失效的主服務器時, 集羣也會向客戶端返回新主服務器的地址, 使得集羣可使用新主服務器代替失效服務器。
(1)Sentinel能夠監控任意多個Master和該Master下的Slaves。(即多個主從模式)
(2)同一個哨兵下的、不一樣主從模型,彼此之間相互獨立。
(3)Sentinel會不斷檢查Master和Slaves是否正常。
監控同一個Master的Sentinel會自動鏈接,組成一個分佈式的Sentinel網絡,互相通訊並交換彼此關於被監視服務器的信息。
疑問:爲何要使用sentinel網絡呢?
答:當只有一個sentinel的時候,若是這個sentinel掛掉了,那麼就沒法實現自動故障切換了。
在sentinel網絡中,只要還有一個sentinel活着,就能夠實現故障切換。
(1)投票(半數原則)
當任何一個Sentinel發現被監控的Master下線時,會通知其它的Sentinel開會,投票肯定該Master是否下線(半數以上,因此sentinel一般配奇數個)。
(2)選舉
當Sentinel肯定Master下線後,會在全部的Slaves中,選舉一個新的節點,升級成Master節點。
其它Slaves節點,轉爲該節點的從節點。
(3)原Master從新上線
當原Master節點從新上線後,自動轉爲當前Master節點的從節點。
前提:已經存在一個正在運行的主從模式。
另外,配置三個Sentinel實例,監控同一個Master節點
(1)在/usr/local目錄下,建立/redis/sentinels/目錄
cd /usr/local/redis mkdir sentinels
(2)在sentinels目錄下,依次建立s一、s二、s3三個子目錄中
cd sentinels mkdir s1 s2 s3
(3)依次拷貝redis解壓目錄下的sentinel.conf文件,到這三個子目錄中
cp /usr/local/src/redis-5.0.4/sentinel.conf s1/ cp /usr/local/src/redis-5.0.4/sentinel.conf s2/ cp /usr/local/src/redis-5.0.4/sentinel.conf s3/
(4)依次修改s一、s二、s3子目錄中的sentinel.conf文件,修改端口,並指定要監控的主節點。(從節點不須要指定,sentinel會自動識別)
# s1 哨兵配置 port 26379 sentinel monitor mymaster 127.0.0.1 6380 2 # mymaster爲主節點別名,127.0.0.1爲主節點IP,6380爲主節點端口,2爲觸發故障切換的最少哨兵數量 # s2 哨兵配置 port 26380 sentinel monitor mymaster 127.0.0.1 6380 2 # s3 哨兵配置 port 26381 sentinel monitor mymaster 127.0.0.1 6380 2
(5)再打開三個shell窗口,在每個窗口中,啓動一個哨兵實例,並觀察日誌輸出
進入redis的安裝目錄,/usr/local/bin/,也能夠不用進,由於前面的那個目錄在環境變量中。
對於用redis-server啓動哨兵的方式以下:
核心日誌輸出:
(1)先關閉6380節點(kill掉)。發現,確實從新指定了一個主節點
(2)再次上線6380節點。發現,6380節點成爲了新的主節點的從節點。
Sentinel哨兵模式,確實能實現自動故障切換。提供穩定的服務。
若是哨兵和redis節點不在同一臺服務器上,注意IP綁定的問題。
(1)主從模型,全部的節點,使用ip綁定
(2)全部的哨兵,也都使用ip去綁定主機
(3)全部的哨兵,都是經過主節點的ip,去監控主從模型
在哨兵模式中,仍然只有一個Master節點。當併發寫請求較大時,哨兵模式並不能緩解寫壓力。
咱們知道只有主節點才具備寫能力,那若是在一個集羣中,可以配置多個主節點,是否是就能夠緩解寫壓力了呢?
答:是的。這個就是redis-cluster集羣模式。
(1)由多個Redis服務器組成的分佈式網絡服務集羣;
(2)集羣之中有多個Master主節點,每個主節點均可讀可寫;
(3)節點之間會互相通訊,兩兩相連;
(4)Redis集羣無中心節點。
在Redis-Cluster集羣中,能夠給每個主節點添加從節點,主節點和從節點直接遵循主從模型的特性。
當用戶須要處理更多讀請求的時候,添加從節點能夠擴展系統的讀性能。
Redis集羣的主節點內置了相似Redis Sentinel的節點故障檢測和自動故障轉移功能,當集羣中的某個主節點下線時,集羣中的其餘在線主節點會注意到這一點,並對已下線的主節點進行故障轉移。
集羣進行故障轉移的方法和Redis Sentinel進行故障轉移的方法基本同樣,不一樣的是,在集羣裏面,故障轉移是由集羣中其餘在線的主節點負責進行的,因此集羣沒必要另外使用Redis Sentinel。
Redis-cluster分片策略,是用來解決key存儲位置的。
集羣將整個數據庫分爲16384個槽位slot,全部key-value數據都存儲在這些slot中的某一個上。一個slot槽位能夠存放多個數據,key的槽位計算公式爲:slot_number=crc16(key)%16384,其中crc16爲16位的循環冗餘校驗和函數。
集羣中的每一個主節點均可以處理0個至16383個槽,當16384個槽都有某個節點在負責處理時,集羣進入上線狀態,並開始處理客戶端發送的數據命令請求。
因爲Redis集羣無中心節點,請求會隨機發給任意主節點;
主節點只會處理本身負責槽位的命令請求,其它槽位的命令請求,該主節點會返回客戶端一個轉向錯誤;
客戶端根據錯誤中包含的地址和端口從新向正確的負責的主節點發起命令請求。
redis5.0版本以後能夠直接使用redis-cli
命令建立集羣,不使用redis-trib.rb
命令了。
(1)Redis集羣最少須要6個節點,3主3從,能夠分佈在一臺或者多臺主機上。
真集羣:6臺主機,每臺主機的redis服務使用的IP不一樣,端口號隨意,同樣不同均可以
假集羣,一臺主機,redis服務使用的IP相同,端口號不一樣
本例子是在一臺主機上建立假集羣,不一樣的端口表示不一樣的redis節點,以下:
主節點: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 127.0.0.1:7006
後期新加的主節點:127.0.0.1:7007
後期新家的從節點:127.0.0.1:7008
(2)在/usr/local/src/redis-5.0.4/下建立cluster目錄,其下建立700一、7002…7006目錄,以下:
(3)將redis解壓路徑下的配置文件redis.conf,依次拷貝到每一個700X目錄內,並修改每一個700X目錄下的redis.conf配置文件:
# cd /usr/local/src/redis-5.0.4/cluster # mkdir {7001,7002,7003,7004,7005,7006} # mkdir -p /var/log/redis/{7001,7002,7003,7004,7005,7006} # redis.conf文件示例 bind 127.0.0.1 port 7001 daemonize yes pidfile /var/run/redis_7001.pid dir "./" # node.conf文件保存路徑 logfile "/var/log/redis/7001/redis.log" appendonly yes appendfsync always cluster-enabled yes cluster-config-file nodes-7001.conf # 該文件中包含集羣信息 # 其餘配置文件相似,把端口號修改一下就好了
批量啓動腳本:
# vim s/usr/local/src/redis-5.0.4/cluster/ctart_cluster.sh #!/bin/bash cd ./7001 && /usr/local/src/redis-5.0.4/src/redis-server ./redis.conf cd ../7002 && /usr/local/src/redis-5.0.4/src/redis-server ./redis.conf cd ../7003 && /usr/local/src/redis-5.0.4/src/redis-server ./redis.conf cd ../7004 && /usr/local/src/redis-5.0.4/src/redis-server ./redis.conf cd ../7005 && /usr/local/src/redis-5.0.4/src/redis-server ./redis.conf cd ../7006 && /usr/local/src/redis-5.0.4/src/redis-server ./redis.conf cd .. # chmod +x start_cluster.sh
注意:必定要進入700X目錄中啓動,由於它會自動在當前目錄中建立cluster-config,即nodes.conf。由於你在哪一個目錄下執行這個命令,則node.conf文件就會在該目錄下建立。
可是如果在配置文件中配置dir
爲其餘目錄,則該文件會建立在dir
指定目錄下
或者把redis-server程序文件依次拷貝到每一個700x目錄下,而後使用不一樣目錄的redis-server程序文件啓動
關閉腳本:
# vim /usr/local/src/redis-5.0.4/cluster/shutdown_cluster.sh #!/bin/bash pgrep redis-server | xargs -exec kill -9 # chmod +x shutdown_cluster.sh
執行啓動腳本批量啓動:
# ./start_cluster.sh
進入到redis源碼存放目錄/usr/local/src/redis-5.0.4/src下,把redis-cli文件拷貝到/usr/local/bin/目錄下
cd /usr/local/src/redis-5.0.4/cluster /usr/local/src/redis-5.0.4/src/redis-cli --cluster create 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 127.0.0.1:7006 --cluster-replicas 1 # --cluster-replicas 1 表示主從配置比,1表示的是1:1,前三個是主,後三個是從 # 若配置文件中設置的密碼,則還須要加上-a passwod ...... Can I set the above configuration? (type 'yes' to accept): yes ...... [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
注意:查詢集羣信息須要加上-c
參數
或者直接執行命令查詢,以下面所示;或者登錄到其中一個集羣節點,使用命令cluster nodes
進行查詢
# /usr/local/src/redis-5.0.4/src/redis-cli -c -h 127.0.0.1 -p 7001 cluster nodes 7d388cc31df969d3e1715ce9644318bfd48317b1 127.0.0.1:7004@17004 slave 59b6597448b668a355d85dcc7a0623bc36263e5f 0 1564918712465 4 connected bbe8b7035bfd31c47bec7d612acc112cd2869368 127.0.0.1:7003@17003 master - 0 1564918714483 3 connected 10923-16383 456921ae96af71d8183101f798cf5ceda4b0381e 127.0.0.1:7005@17005 slave bbe8b7035bfd31c47bec7d612acc112cd2869368 0 1564918713000 5 connected 5612ffbb0407dbda50828b505a16b39ede51168b 127.0.0.1:7006@17006 slave 4dad696ede24995a57c5fd790faa95c72c187a22 0 1564918713474 6 connected 4dad696ede24995a57c5fd790faa95c72c187a22 127.0.0.1:7001@17001 myself,master - 0 1564918713000 1 connected 0-5460 59b6597448b668a355d85dcc7a0623bc36263e5f 127.0.0.1:7002@17002 master - 0 1564918712000 2 connected 5461-10922
參數說明:
其餘查詢方法:
# /usr/local/src/redis-5.0.4/src/redis-cli --cluster check 127.0.0.1:7001 127.0.0.1:7001 (4dad696e...) -> 0 keys | 5461 slots | 1 slaves. 127.0.0.1:7003 (bbe8b703...) -> 0 keys | 5461 slots | 1 slaves. 127.0.0.1:7002 (59b65974...) -> 0 keys | 5462 slots | 1 slaves. [OK] 0 keys in 3 masters. 0.00 keys per slot on average. >>> Performing Cluster Check (using node 127.0.0.1:7001) M: 4dad696ede24995a57c5fd790faa95c72c187a22 127.0.0.1:7001 slots:[0-5460] (5461 slots) master 1 additional replica(s) S: 7d388cc31df969d3e1715ce9644318bfd48317b1 127.0.0.1:7004 slots: (0 slots) slave replicates 59b6597448b668a355d85dcc7a0623bc36263e5f M: bbe8b7035bfd31c47bec7d612acc112cd2869368 127.0.0.1:7003 slots:[10923-16383] (5461 slots) master 1 additional replica(s) S: 456921ae96af71d8183101f798cf5ceda4b0381e 127.0.0.1:7005 slots: (0 slots) slave replicates bbe8b7035bfd31c47bec7d612acc112cd2869368 S: 5612ffbb0407dbda50828b505a16b39ede51168b 127.0.0.1:7006 slots: (0 slots) slave replicates 4dad696ede24995a57c5fd790faa95c72c187a22 M: 59b6597448b668a355d85dcc7a0623bc36263e5f 127.0.0.1:7002 slots:[5461-10922] (5462 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. # /usr/local/src/redis-5.0.4/src/redis-cli --cluster info 127.0.0.1:7001 127.0.0.1:7001 (4dad696e...) -> 0 keys | 5461 slots | 1 slaves. 127.0.0.1:7003 (bbe8b703...) -> 0 keys | 5461 slots | 1 slaves. 127.0.0.1:7002 (59b65974...) -> 0 keys | 5462 slots | 1 slaves. [OK] 0 keys in 3 masters. 0.00 keys per slot on average.
由於集羣已經建立過了,如果關機等緣由關閉了redis服務,則只須要執行批量啓動腳本便可,就會自動開啓集羣,由於有node.conf文件的存在
# /usr/local/src/redis-5.0.4/src/redis-cli --cluster help Cluster Manager Commands: create host1:port1 ... hostN:portN --cluster-replicas <arg> check host:port --cluster-search-multiple-owners info host:port fix host:port --cluster-search-multiple-owners reshard host:port --cluster-from <arg> --cluster-to <arg> --cluster-slots <arg> --cluster-yes --cluster-timeout <arg> --cluster-pipeline <arg> --cluster-replace rebalance host:port --cluster-weight <node1=w1...nodeN=wN> --cluster-use-empty-masters --cluster-timeout <arg> --cluster-simulate --cluster-pipeline <arg> --cluster-threshold <arg> --cluster-replace add-node new_host:new_port existing_host:existing_port --cluster-slave --cluster-master-id <arg> del-node host:port node_id call host:port command arg arg .. arg set-timeout host:port milliseconds import host:port --cluster-from <arg> --cluster-copy --cluster-replace help For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-master-id node_id
添加完新節點後,須要對新添加的主節點進行hash槽從新分配,這樣該主節點才能存儲數據,redis共有16384個槽。
redis-cli --cluster reshard host:port --cluster-from node_id --cluster-to node_id --cluster-slots <args> --cluster-yes
redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-slave --cluster-master-id node_id
redis-cli --cluster del-node host:port node_id
# 建立集羣 redis-cli --cluster create host1:port1 ... hostN:portN --cluster-replicas <arg> # 例子 redis-cli --cluster create 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 127.0.0.1:7006 --cluster-replicas 1 # 例子說明 host1:port1 ... hostN:portN表示的是要添加的集羣的節點IP和端口, --cluster-replicas <arg>表示的是主從節點比例,參數1表示前三個是主節點,後三個是從節點 也就是說7001,7002,7003端口對應的節點是主節點,7004,7005,7006對應的節點是從節點 # 查詢集羣節點信息 redis-cli -c -p 7001 cluster nodes 7d388cc31df969d3e1715ce9644318bfd48317b1 127.0.0.1:7004@17004 slave 59b6597448b668a355d85dcc7a0623bc36263e5f 0 1564923261350 4 connected bbe8b7035bfd31c47bec7d612acc112cd2869368 127.0.0.1:7003@17003 master - 0 1564923263366 3 connected 10923-16383 456921ae96af71d8183101f798cf5ceda4b0381e 127.0.0.1:7005@17005 slave bbe8b7035bfd31c47bec7d612acc112cd2869368 0 1564923262000 5 connected 5612ffbb0407dbda50828b505a16b39ede51168b 127.0.0.1:7006@17006 slave 4dad696ede24995a57c5fd790faa95c72c187a22 0 1564923260000 6 connected 4dad696ede24995a57c5fd790faa95c72c187a22 127.0.0.1:7001@17001 myself,master - 0 1564923263000 1 connected 0-5460 59b6597448b668a355d85dcc7a0623bc36263e5f 127.0.0.1:7002@17002 master - 0 1564923262358 2 connected 5461-10922 # 說明:如下的操做均是以上面這個爲參數示例 # 給集羣添加一個新主節點 redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-master-id node_id # 例子 redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7003 --cluster-master-id bbe8b7035bfd31c47bec7d612acc112cd2869368 # 例子說明 new_host:new_port爲要新添加的主節點IP和端口,此處是127.0.0.1:7007 existing_host:existing_port表示的是已存在的最後一個主節點的IP和端口,這個能夠從上述的節點信息中查看到,根據slots槽數,7003端口對應的節點槽數是10923-16383,16383表示的是最後的槽數 --cluster-master-id表示的是最後一個主節點的節點id,表示的是新添加的主節點要在這個節點後面 # 再次查看集羣信息 redis-cli -c -p 7001 cluster nodes 7d388cc31df969d3e1715ce9644318bfd48317b1 127.0.0.1:7004@17004 slave 59b6597448b668a355d85dcc7a0623bc36263e5f 0 1564923261350 4 connected bbe8b7035bfd31c47bec7d612acc112cd2869368 127.0.0.1:7003@17003 master - 0 1564923263366 3 connected 10923-16383 7020c8df9423686727783c60bd2f0e367634ba84 127.0.0.1:7007@17007 master - 0 1564923260344 0 connected 456921ae96af71d8183101f798cf5ceda4b0381e 127.0.0.1:7005@17005 slave bbe8b7035bfd31c47bec7d612acc112cd2869368 0 1564923262000 5 connected 5612ffbb0407dbda50828b505a16b39ede51168b 127.0.0.1:7006@17006 slave 4dad696ede24995a57c5fd790faa95c72c187a22 0 1564923260000 6 connected 4dad696ede24995a57c5fd790faa95c72c187a22 127.0.0.1:7001@17001 myself,master - 0 1564923263000 1 connected 0-5460 59b6597448b668a355d85dcc7a0623bc36263e5f 127.0.0.1:7002@17002 master - 0 1564923262358 2 connected 5461-10922 # 會發現7007端口對應的節點已經加入到集羣中,是主節點,可是沒有從節點,也沒有分配槽數 # 給新添加的主節點分配slots槽數 redis-cli --cluster reshard host:port --cluster-from node_id --cluster-to node_id --cluster-slots 500 --cluster-yes # 例子 redis-cli --cluster reshard 127.0.0.1:7007 --cluster-from 4dad696ede24995a57c5fd790faa95c72c187a22 --cluster-to 7020c8df9423686727783c60bd2f0e367634ba84 --cluster-slots 500 # 例子說明 host:port表示的是新添加的那個主節點IP和端口,此處表示的是127.0.0.1:7007 --cluster-from node_id表示的是集羣第一個主節點的節點id,這個能夠現有集羣的slots槽數分配看出,此處表示的是7001端口對應的節點 --cluster-to node_id表示的是集羣最後一個主節點的節點id,也就是新添加的那個主節點id,此處表示的是7007端口對應的節點 --cluster-slots 500表示的是給新主節點分配多少,此處500表示是分配從0-499個slots槽數,若不加上這個會讓手動輸入 --cluster-yes表示的是自動應答爲yes,若不加上這個會讓手動輸入yes,表示贊成這次分配 # 再次查看集羣信息 /redis-cli -c -p 7001 cluster nodes 7d388cc31df969d3e1715ce9644318bfd48317b1 127.0.0.1:7004@17004 slave 59b6597448b668a355d85dcc7a0623bc36263e5f 0 1564924042000 4 connected bbe8b7035bfd31c47bec7d612acc112cd2869368 127.0.0.1:7003@17003 master - 0 1564924042157 3 connected 10923-16383 7020c8df9423686727783c60bd2f0e367634ba84 127.0.0.1:7007@17007 master - 0 1564924040140 7 connected 0-499 456921ae96af71d8183101f798cf5ceda4b0381e 127.0.0.1:7005@17005 slave bbe8b7035bfd31c47bec7d612acc112cd2869368 0 1564924040000 5 connected 5612ffbb0407dbda50828b505a16b39ede51168b 127.0.0.1:7006@17006 slave 4dad696ede24995a57c5fd790faa95c72c187a22 0 1564924041149 6 connected 4dad696ede24995a57c5fd790faa95c72c187a22 127.0.0.1:7001@17001 myself,master - 0 1564924040000 1 connected 500-5460 59b6597448b668a355d85dcc7a0623bc36263e5f 127.0.0.1:7002@17002 master - 0 1564924043166 2 connected 5461-10922 # 會發現7007端口對應的主節點已經有slots槽數了,而且是從0開始的 # 給集羣中某個主節點再添加一個從節點 redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-slave --cluster-master-id node_id # 例子 redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7008 --cluster-slave --cluster-master-id 7020c8df9423686727783c60bd2f0e367634ba84 # 例子說明 new_host:new_port表示的是要添加的那個從節點的IP和端口,此處表示的是127.0.0.1:7008 existing_host:existing_port表示的是要給哪一個主節點添加從節點,此處表示的是127.0.0.1:7007 --cluster-slave表示的是要添加從節點,不然則是添加主節點了 --cluster-master-id node_id表示要給哪一個主節點添加從節點的該主節點節點id # 再次查看集羣信息 redis-cli -c -p 7001 cluster nodes 7020c8df9423686727783c60bd2f0e367634ba84 127.0.0.1:7007@17007 master - 0 1564924845000 7 connected 0-499 4dad696ede24995a57c5fd790faa95c72c187a22 127.0.0.1:7001@17001 myself,master - 0 1564924843000 1 connected 500-5460 5612ffbb0407dbda50828b505a16b39ede51168b 127.0.0.1:7006@17006 slave 4dad696ede24995a57c5fd790faa95c72c187a22 0 1564924845214 6 connected 7d388cc31df969d3e1715ce9644318bfd48317b1 127.0.0.1:7004@17004 slave 59b6597448b668a355d85dcc7a0623bc36263e5f 0 1564924843195 4 connected bbe8b7035bfd31c47bec7d612acc112cd2869368 127.0.0.1:7003@17003 master - 0 1564924844205 3 connected 10923-16383 456921ae96af71d8183101f798cf5ceda4b0381e 127.0.0.1:7005@17005 slave bbe8b7035bfd31c47bec7d612acc112cd2869368 0 1564924845000 5 connected 415db07121ba946b202bca98e15cbdffc60bc18a 127.0.0.1:7008@17008 slave 7020c8df9423686727783c60bd2f0e367634ba84 0 1564924846224 7 connected c3e04f0e8710c25d59703374a224ee8bec776e43 :0@0 master,fail,noaddr - 1564924804548 1564924802833 0 disconnected 59b6597448b668a355d85dcc7a0623bc36263e5f 127.0.0.1:7002@17002 master - 0 1564924844000 2 connected 5461-10922 # 會發現7008端口對應的節點已是7007端口對應的從節點 # 從集羣中刪除一個從節點 redis-cli --cluster del-node host:port node_id # 例子 redis-cli --cluster del-node 127.0.0.1:7008 415db07121ba946b202bca98e15cbdffc60bc18a # 例子說明 host:port表示的是要刪除的那個節點的IP和端口,此處是127.0.0.1:7008 node_id表示的是刪除的那個節點的節點id # 其餘命令有待補充
如果容許Redis集羣被外網用戶訪問,除了須要修改配置文件外,還須要修改防火牆,開放集羣中reids節點的端口。
說明:若是要開放一個範圍的端口,可使用冒號來分割,即: 7001:7004,表示開放7001-7004之間全部的端口
如果登陸的是集羣中的節點,須要加上-c
參數;不然不用加該參數
# 登陸集羣節點的命令 redis-cli -c -h ip -p port -a password # 登陸通常節點或者從節點的命令 redis-cli -h ip -p port -a password
redis-cli -c -p 7001 cluster nodes 7020c8df9423686727783c60bd2f0e367634ba84 127.0.0.1:7007@17007 master - 0 1564925352648 7 connected 0-499 4dad696ede24995a57c5fd790faa95c72c187a22 127.0.0.1:7001@17001 myself,master - 0 1564925349000 1 connected 500-5460 5612ffbb0407dbda50828b505a16b39ede51168b 127.0.0.1:7006@17006 slave 4dad696ede24995a57c5fd790faa95c72c187a22 0 1564925351000 6 connected 7d388cc31df969d3e1715ce9644318bfd48317b1 127.0.0.1:7004@17004 slave 59b6597448b668a355d85dcc7a0623bc36263e5f 0 1564925354665 4 connected bbe8b7035bfd31c47bec7d612acc112cd2869368 127.0.0.1:7003@17003 master - 0 1564925353657 3 connected 10923-16383 456921ae96af71d8183101f798cf5ceda4b0381e 127.0.0.1:7005@17005 slave bbe8b7035bfd31c47bec7d612acc112cd2869368 0 1564925349000 5 connected c3e04f0e8710c25d59703374a224ee8bec776e43 :0@0 master,fail,noaddr - 1564924804548 1564924802833 0 disconnected 59b6597448b668a355d85dcc7a0623bc36263e5f 127.0.0.1:7002@17002 master - 0 1564925352000 2 connected 5461-10922 # 如上集羣中有一個無效的節點信息,要如何刪除,這個還不知道咋操做。