前言:
在前面講到了Redis分片機制可實現內存數據的擴容來提高執行速率---Redis分片機制,可是Redis分片依舊有一些問題,如果redis分片的節點如果有一個服務器宕機,則直接影響用戶的使用.Redis分片機制沒有實現高可用功能(HA)。----我所使用的Linux系統是dsCentOS-empty
1.Redis高可用哨兵機制
1.1主從同步配置
1.1.1 主從同步說明
說明:如果需要實現redis的高可用(HA),則必須先實現主從的同步。
當用戶操作主節點時,由程序內部自動的實現數據的同步,將數據同步給從節點.這時主機和從機擁有相同的數據。
1.1.2 準備哨兵的Redis節點
說明:
1.首先將redis的分片服務器全部關閉。
2.複製分片的文件目錄,並且改名為sentinel
<code>cp -r shards sentinel
/<code>
3.刪除多餘的持久化文件
<code>rm -f dump.rdb
/<code>
4.分別啟動redis
<code>redis-server 6379.conf & redis-server 6380.conf & redis-server 6381.conf &
/<code>
檢查Redis啟動是否正常.
1.1.3檢查Redis節點狀態
命令: 要求在redis的客戶端中執行
<code>info replication
/<code>
role:master說明是主機,connevted_slaves:0 說明暫無從機
1.1.4實現主從掛載
設計方案: 6379當主機 6380/6381當從機。
在6380/6381中執行如下命令:
<code>slaveof 主機的IP地址 主機的端口號
/<code>
2.檢查主從的狀態
role:slave以為著它是從機,master_host/port 是主機信息
3.向Redis的主機中添加數據,之後檢查6380/6381中是否有數據 是否實現數據的同步.
1.2Redis哨兵實現
1.2.1 哨兵工作原理
工作原理說明:
- 當哨兵啟動時,會根據配置文件監聽當前的主機.獲取主機的全部信息。
- 哨兵利用心跳檢測機制,判斷當前主機是否存活.如果連續3次 PING-PONG檢測時都沒有響應.則斷定當前主機宕機。
- 如果發現主機宕機,則哨兵會通過監聽獲取當前主機的從節點信息,之後利用選舉規則,動態選擇新的主機。
- 如果一旦確定新的主節點,則將其餘的節點設置為新主機的從。
1.複製哨兵的配置文件
<code>cp sentinel.conf sentinel/
/<code>
2.打開sentinel配置文件
記住是sentinel文件目錄下的配置文件
<code>vim sentinel.conf
/<code>
2.關閉保護模式
<code>
protected-mode no 17行
/<code>
3.開啟後臺啟動
<code>daemonize yes 26行
/<code>
4.配置哨兵的監控
mymaster:表示變量的名稱. 代表著當前redis的主機.1: 代表哨兵在選舉的過程中幾票生效.
5.修改哨兵的宕機選舉時間
將主機宕機後,從機選為主機的時間定為了10秒。
6.保存配置
1.2.3測試哨兵高可用
1.啟動哨兵
<code>redis-sentinel sentinel.conf
/<code>
2.檢查哨兵服務是否啟動
3.高可用測試
將redis主機宕機,等待10秒(這是自定義的),檢查主從結構是否變化。
<code>kill -9 22005
/<code>
主機6379被宕機後,轉化為了6380,說明哨兵的選舉一切正常。
重新啟動6379服務器,檢查是否為6380的從機
重啟之後,檢查6379的狀態信息 6379已經是6380的從機.哨兵高可用完成。
2.SpringBoot整合哨兵
2.1 哨兵入門案例
如果哨兵機制服務器全部重啟,問 :是否需要重新配置主從,重新配置哨兵?
不需要
原因:一旦使用哨兵.則會將主從信息寫入每個節點的配置文件中.如果所有的節點都重啟則根據自己的配置文件的信息.實現主從的分配.redis.conf文件標識:
<code>replicaof 192.168.126.166 6380
/<code>
sentinel.conf文件標識:
<code>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
/<code>
測試哨兵機制
說明:用戶應該鏈接redis哨兵,而不是redis主機。
<code> /**
* 測試哨兵機制
* 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"));
}
/<string>/<string>/<code>
2.2 SpringBoot整合Redis哨兵
2.2.1添加redis依賴(在測試哨兵之前添加)
<code>
<dependency>
\t<groupid>redis.clients/<groupid>
\t<artifactid>jedis/<artifactid>
/<dependency>
<dependency>
\t<groupid>org.springframework.data/<groupid>
\t<artifactid>spring-data-redis/<artifactid>
/<dependency>
/<code>
2.2.2 編輯redis.properties文件
<code>#標識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
/<code>
2.2.3 編輯redisConfig配置類
<code> @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次
}
/<string>/<string>/<code>
2.2.4修改RedisAOP
說明:修改RedisAOP的對象注入
閱讀更多 Java技術前沿 的文章