1. 單機單實例或多實例安裝
單實例的安裝步驟很簡單
(1)首先去redis官網上下載最新的穩定版本(可以直接去redis中文官網http://www.redis.cn/download.html)
wget http://download.redis.io/releases/redis-4.0.1.tar.gz
(2)下載的是壓縮包,解壓
tar xzf redis-4.0.1.tar.gz
(3)
加壓出來的其實還是未編譯鏈接的文件,redis是C實現的,需要執行編譯鏈接最後才生成可執行文件。
cd redis-4.0.1
make
(4)
服務端和客戶端啓動程序都在src目錄下
啓動服務端
src/redis-server
啓動客戶端
src/redis-cli
--
這樣就可以在客戶端上進行讀寫操作了
(5)修改配置文件
daemonize yes
port 6380
pidfile /home/itzxyy/zrf/redis-4.0.1/pid/redis_6380.pid
logfile /home/itzxyy/zrf/redis-4.0.1/log/redis_6380.log
dbfilename dump_6380.rdb
dir /home/itzxyy/zrf/redis-4.0.1/redisdb/
其中daemonize
設置服務進程是否爲後臺進程,pidfile保存進程id,目的是防止重複啓動相同端口的服務實例,後面試圖啓動同個實例進程時會先檢查pid文件是否存在,如果存在則讀取裏面的進程id,並檢查系統中是否存在這個pid的進程,如果存在則退出,否則則重新寫入新的pid,並且寫的時候對pid文件進行加鎖防止其他進程競爭,dbfilename和dir就是持久化文件的文件名和保存目錄路徑,
注意還有個配置bind 默認是bind 127.0.0.1,也就是隻接受本機上的客戶端的連接訪問,如果允許其他主機上的客戶端訪問,則可改成空或者0.0.0.0
單機多實例部署配置也比較簡單,多搞一份config文件,修改部分內容(主要是端口號以及和端口號有關的命名),再啓動一個實例進程即可。
2. 多實例主從配置(哨兵配置)
(1)去另外一臺主機照上述流程安裝redis,拷貝主節點的配置文件,這個配置其實也挺簡單,只要修改一個配置項就行
slaveof 132.121.127.31 6379
--其他配置在目錄結構相同的情況下可以保持不變,正常的啓動命令
(2)如果需要增加哨兵集羣監控,拷貝一份正常配置文件重命名爲redis-sentinel-26380.conf並修改以下配置:
port 26380
pidfile /home/itzxyy/zrf/redis-4.0.1/pid/redis_26380.pid
logfile /home/itzxyy/zrf/redis-4.0.1/log/redis_26380.log
dbfilename dump_26380.rdb
增加以下關於哨兵的四行配置項(如果要監控多個主實例,則每個主實例都要四行配置項)
sentinel monitor mymaster 132.121.127.31 6380 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster180000
--然後執行redis-sentinel redis-sentinel-26379.conf把哨兵進程啓起來。然後試着把監控的主節點kill掉,你會發現哨兵會發現然後把備節點切換成主節點,mastername保持不變。但是指向的實例發生改變。
如果這時候 把之前kill掉的舊主實例啓起來,那麼就舊實例會自動變成新主實例的從實例,並且redis會把slaveof 新主實例ip 端口回寫到舊實例的配置文件中。如果這時候再去手工把新主實例進程kill掉,那麼sentinel就會發現到,把新的從節點切換成備節點,並且把slaveof 新主實例ip 端口這行配置去掉。
有點需要注意的是,redis會經常動態地把當前的配置狀態回寫到配置文件中,有時候運行是你再去看配置文件時會發現已經和剛啓動時差很多。
比如sentinel的配置文件運行時是這樣的:
sentinel myid70c035923fd5e3f269abb4b7cc44deb97bxxxxx
sentinel monitor master-132.121.127.31:6379132.121.127.31 6379 2
sentinel config-epochmaster-132.121.127.31:6379 2
sentinel leader-epochmaster-132.121.127.31:6379 2
sentinel known-slavemaster-132.121.127.31:6379 132.121.127.32 6379
sentinel known-sentinelmaster-132.121.127.31:6379 132.121.127.32 26380f6fc2a34aa0bd239ef3286348d9d453exxxxxx
sentinel known-sentinelmaster-132.121.127.31:6379 132.121.127.32 2638172e17db4ba728668468e4ef9273b94f6a07xxxx
sentinel monitor master-132.121.127.31:6381132.121.127.31 6381 2
sentinel config-epochmaster-132.121.127.31:6381 0
sentinel leader-epochmaster-132.121.127.31:6381 0
sentinel known-slavemaster-132.121.127.31:6381 132.121.127.32 6381
# Generated by CONFIG REWRITE
sentinel known-sentinelmaster-132.121.127.31:6381 132.121.127.32 26380f6fc2a34aa0bd239ef3286348d9d453e4bdfxxxxxx
sentinel known-sentinel master-132.121.127.31:6381132.121.127.32 26381 72e17db4ba728668468e4ef9273b94f6a07xxxxx
sentinel monitor master-132.121.127.31:6380132.121.127.31 6380 2
sentinel config-epochmaster-132.121.127.31:6380 0
sentinel leader-epochmaster-132.121.127.31:6380 0
sentinel known-slavemaster-132.121.127.31:6380 132.121.127.32 6380
sentinel known-sentinelmaster-132.121.127.31:6380 132.121.127.32 26380f6fc2a34aa0bd239ef3286348d9d453e4bdfxxxx
sentinel known-sentinelmaster-132.121.127.31:6380 132.121.127.32 26381 72e17db4ba728668468e4ef9273b94f6a07xxxxx
sentinel current-epoch 2
--其實就是增加了sentinel進程啓動後發現sentinel集羣中其他sentinel節點的信息(包括id,監控的主從節點的關係),其中監控的主從節點的關係信息很重要,是上述主備之間能自動切換的保障。有個有意思的問題,我發現啓動後,下面三行配置項居然被刪掉了
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster180000
--有個解釋:要是參數配置的是默認值,在sentinel運行時該參數會在配置文件文件裏被刪除掉,直接不顯示
3. sentinel API操作
publicShardedJedisSentinelPool createShardedJedisSentinelPool(Set<HostAndPort>hostInfo,
Set<String>sentinels) {
// TODO Auto-generated methodstub
ShardedJedisSentinelPoolshardedJedisSentinelPool = new ShardedJedisSentinelPool(hostInfo, sentinels);
returnshardedJedisSentinelPool;
}
Set<HostAndPort> hostInfo = newHashSet<HostAndPort>();
HostAndPort hostAndPort1 =new HostAndPort("132.121.127.31",6379);
HostAndPort hostAndPort2 =new HostAndPort("132.121.127.31",6380);
HostAndPort hostAndPort3 =new HostAndPort("132.121.127.31",6381);
hostInfo.add(hostAndPort1);
hostInfo.add(hostAndPort2);
hostInfo.add(hostAndPort3);
String[] sentinelList ={"132.121.127.32:26379","132.121.127.32:26380","132.121.127.32:26381"};
Set<String> sentinels =new HashSet<String>(Arrays.asList(sentinelList));
ShardedJedisSentinelPool pool= redisDao.createShardedJedisSentinelPool(hostInfo, sentinels);
Jedis jedis =pool.getResource(args[0]);
System.out.println(jedis.getClient().getHost()+jedis.getClient().getPort());
jedis.set(args[0], args[1]);
jedis.close();
pool.close();
--其中ShardedJedisSentinelPool的實現請看《如何簡單地實現易用的ShardedJedisSentinelPool》