Redis主從集羣以及sentinel集羣安裝和配置總結

 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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章