前言:在前面講到了Redis分片機制可實現內存數據的擴容來提升執行速率---Redis分片機制,但是Redis分片依舊有一些問題,若是redis分片的節點若是有一個服務器宕機,則直接影響用戶的使用.Redis分片機制沒有實現高可用功能(HA)。----我所使用的Linux系統是dsCentOS-emptyjava
說明:若是須要實現redis的高可用(HA),則必須先實現主從的同步。node
當用戶操做主節點時,由程序內部自動的實現數據的同步,將數據同步給從節點.這時主機和從機擁有相同的數據。redis
說明:spring
cp -r shards sentinel
rm -f dump.rdb
redis-server 6379.conf & redis-server 6380.conf & redis-server 6381.conf &
檢查Redis啓動是否正常.vim
命令: 要求在redis的客戶端中執行服務器
info replication
role:master
說明是主機,connevted_slaves:0
說明暫無從機測試
設計方案: 6379當主機 6380/6381當從機。.net
slaveof 主機的IP地址 主機的端口號
role:slave
覺得着它是從機,master_host/port
是主機信息設計
工做原理說明:3d
當哨兵啓動時,會根據配置文件監聽當前的主機.獲取主機的所有信息。
哨兵利用心跳檢測機制,判斷當前主機是否存活.若是連續3次 PING-PONG檢測時都沒有響應.則判定當前主機宕機。
若是發現主機宕機,則哨兵會經過監聽獲取當前主機的從節點信息,以後利用選舉規則,動態選擇新的主機。
若是一旦肯定新的主節點,則將其他的節點設置爲新主機的從。
cp sentinel.conf sentinel/
記住是sentinel文件目錄下的配置文件
vim sentinel.conf
protected-mode no 17行
daemonize yes 26行
mymaster
:表示變量的名稱. 表明着當前redis的主機.
1: 表明哨兵在選舉的過程當中幾票生效.
將主機宕機後,從機選爲主機的時間定爲了10秒。
redis-sentinel sentinel.conf
將redis主機宕機,等待10秒(這是自定義的),檢查主從結構是否變化。
kill -9 22005
主機6379被宕機後,轉化爲了6380,說明哨兵的選舉一切正常。
從新啓動6379服務器,檢查是否爲6380的從機
重啓以後,檢查6379的狀態信息 6379已是6380的從機.哨兵高可用完成。
不須要
緣由:一旦使用哨兵.則會將主從信息寫入每一個節點的配置文件中.若是全部的節點都重啓則根據本身的配置文件的信息.實現主從的分配.
redis.conf文件標識:
replicaof 192.168.126.166 6380
sentinel.conf文件標識:
sentinel leader-epoch mymaster 1 sentinel known-replica mymaster 192.168.126.166 6379 sentinel known-replica mymaster 192.168.126.166 6381 sentinel current-epoch 1
說明:用戶應該連接redis哨兵,而不是redis主機。
/** * 測試哨兵機制 * masterName:當前主機的變量名稱 */ @Test public void testSentinel() { Set<String> sentinels = new HashSet<String>(); sentinels.add("192.168.126.166:26379"); JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels); Jedis jedis = pool.getResource();//1主2從 1備份2次 jedis.set("sentinel", "AAAAA"); System.out.println(jedis.get("sentinel")); }
<!--spring整合redis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> </dependency>
#標識IP地址和端口號信息 IP:PORT redis.node=192.168.126.166:6379 redis.nodes=192.168.126.166:6379,192.168.126.166:6380,192.168.126.166:6381 redis.sentinel=192.168.126.166:26379
@Value("${redis.sentinel}") private String sentinel; //node,node,node @Bean public Jedis jedis() { Set<String> sentinels = new HashSet<String>(); sentinels.add(sentinel); JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels); return pool.getResource();//1主2從 1備份2次 }
說明:修改RedisAOP的對象注入