11、redis使用ruby實現叢集高可用

項羽齊發表於2018-03-26

哨兵搭建的注意事項

1.1 配置檔案還原

1.1.1 哨兵的配置檔案介紹

說明:

哨兵啟動時需要依賴2個配置檔案

redis.conf

sentinel.conf

1.搭建redisredis必須實現主從結構 並且在配置檔案中已經寫入.

2.如果主從搭建出現問題.需要重新拷貝新的配置檔案 再次配置

 

 

3.哨兵配置檔案出錯

1.先配置單臺的哨兵

2.先拷貝單臺哨兵的配置檔案.

3.根據自己的需要將配置檔案修改哨兵的個數/序列號

4.重啟哨兵 6379 6380 6381

Redis中的持久化

2.1 RDB模式

說明:RDB模式是redis中預設的持久化方式.redis中預設每15分鐘持久化一次.redis中記憶體的資訊寫入到.rdb結尾的檔案中.redis節點出現當機/斷電.redis再次啟動時先讀取rdb持久化檔案,恢復記憶體資料.

2.1.1 redis的單位

 

 

2.1.2 redis中預設的持久化策略

 

 

說明:save 規定的時間 更新的次數(set)

save 900 1  如果redis15分鐘內只執行一次set操作.則進行資料持久化.

save 300 10  如果redis5分鐘內執行了10set操作,則進行持久化

save 60 10000 …

 總結:根據save的語法,可以根據自身的需要調整redis的預設的持久化策略.

2.1.3 save  bgsave

說明:如果想通過自己手動的持久化檔案,需要執行savebgsave達到持久化的目的.

用法:

如果使用save命令持久化,則首先會重新開啟一個執行緒,主動執行持久化操作.這時所有的redis操作都會阻塞.直到持久化操作完成.

 如果使用bgsave命令.則不會造成阻塞的現象.會新開啟一個執行緒.該執行緒的工作有點類似於gc.不能保證持久化操作立即執行.

   

 

2.1.4 持久化檔案的名稱和路徑

1.持久化檔案的名稱

 

 

2.路徑可以手動的指定

 

 

3.問題:由於redis關機,當再次啟動時發現全部的redis資訊都相同?老師為什麼??????

說明:由於分片的操作.3redis的持久化檔名稱和路徑都是相同的.redis啟動時會讀取持久化檔案恢復資料,.所有導致3redis的資料是系統的!!!

總結:不同的redis.持久化檔名稱必須不同

2.1.5 RDB持久化的總結

  1. redis中預設的持久化策略
  2. redis中可以手動的進行持久化   sava bgsave
  3. 手動的修改redis的持久化策略   save 時間  set次數
  4. redis的持久化檔名稱必須不同
  5. RDB檔案在固定的時間間隔持久化資料,不能保證實時持久化

2.2 AOF持久化

2.2.1 AOF介紹

說明:AOF策略能夠滿足實時持久化的要求,但是消耗的效能較高(rdb).AOF持久化策略模式是關閉的.如果需要開啟只需要將appendonly yes.當開啟了AOF持久化策略後,RBD模式將不起作用.並且生成持久化檔案appendonly.aof

 

AOF的執行的原理:

 redis出現當機或者斷電的現象,這時當redis重新啟動時.這時會首先檢查AOF檔案.進行資料的恢復.

2.2.2 AOF檔案預設的持久化策略

 

 

always: 實時備份.這時的效能會很低

everysec: 每秒進行一次資料持久化.效率略低於rdb

no: 將具體備份的時間交給作業系統決定.

 

 

2.2.3 AOF的總結

  1. 能夠實現實時備份
  2. 對於資料完整性要求較高時使用AOF備份
  3. AOF的效率略低於RDB
  4. 根據不用的公司需要選擇不同的持久化方式

2.3 Redis中的記憶體策略

2.3.1 Redis是如何維護記憶體

說明:redis中可以手動的設定最大的記憶體,可以用10mb/10gb這樣的單位進行設定.如果將記憶體設定為10M.隨著時間的推移,記憶體空間會面臨存滿的現象.redis會根據自身的記憶體策略進行維護

 

 

2.3.2 記憶體策略

# volatile-lru -> 從已經設定過期時間的資料中,選擇最近最少使用的資料進行刪除

# allkeys-lru -> 從全部資料中挑選出最近最少使用的資料進行刪除

# volatile-random -> 從已經設定的過期時間的資料中,進行隨機淘汰

# allkeys-random -> 從全部資料中進行隨機淘汰

# volatile-ttl -> 從設定了過期時間的資料集中,選擇馬上就要過期的資料進行釋放操作

# noeviction -> redis的預設策略.不會刪除資料,會直接返回錯誤資訊.在做寫操作時 

 

 

說明:可以修改預設記憶體策略.建議使用lur演算法和TTL演算法

如果採用lur演算法則使用allkeys-lru

 

說明:如果引用演算法將記憶體的資料進行刪除時,lru

 

maxmemory-samples 1-10   10的刪除的可靠性更好,但是效能是最低的

3的速度是最快的,但是效果不是特別的理想.

預設為5

 

2.4 搭建redis叢集

2.4.1 哨兵的缺點

1.哨兵當機後將直接影響整個服務

2.搭建redis伺服器,一個服務對應三個哨兵,那麼會導致哨兵的數量比伺服器都多,維護不易.

2.4.2 哨兵的優點

說明:

哨兵可以實現redis的高可用.分片技術可以將記憶體資料交給多臺機器維護.效能上更好.

矛盾點:

哨兵缺少了分片的記憶體分散.

    分片缺少了哨兵的高可用

2.5 Redis叢集

2.5.1 叢集的優點

說明:

  1. 叢集可以實現內部的高可用
  2. 叢集通過多臺的主機共同為記憶體空間
  3. 叢集部署時無需手動掛載主從.程式自動維護.
  4. 教學中配置32從一共9臺機器

 

2.6 Redis叢集的搭建

2.6.1 建立7000-7008資料夾

說明:配置前將全部的redis服務關閉,之後重新拷貝新的配置檔案重新配置

mkdir cluster

[root@localhost redis-3.2.8]# cp redis.conf cluster/

redis-7000.conf

 

建立多個資料夾儲存redis資訊.將配置檔案移動到7000資料夾下

 

 

 

2.6.2 編輯配置檔案

  1. 將繫結IP註釋

 

 

  1. 關閉保護模式

 

 

  1. 修改埠號

 

 

  1. 開啟後臺啟動

 

 

  1. 修改PID路徑

 

 

  1. 修改持久化檔案的名稱

 

 

  1. 修改持久化檔案的目錄

 

 

  1. 修改記憶體策略

 

 

  1. 開啟叢集

 

 

  1. 修改叢集節點資訊

 

 

2.6.3 複製配置檔案到指定資料夾下

 

 

 

2.6.4 修改檔案標號

:%s/7000/7001/g    

7000表示原有檔名

7001新檔名稱

之後儲存退出:wq

分別修改7001-7008的配置檔案

 

 

 

2.6.5 批量啟動

 

 

 

關閉防火牆

service iptables stop

 

 

2.6.6 叢集的部署

說明:叢集啟動時需要依賴工具外掛 ruby

啟動命令:

 

./src/redis-trib.rb create --replicas 2 192.168.220.132:7000 192.168.220.132:7001 192.168.220.132:7002 192.168.220.132:7003 192.168.220.132:7004 192.168.220.132:7005 192.168.220.132:7006 192.168.220.132:7007 192.168.220.132:7008

 

輸入yes

 

 

 

說明:

如果出現上述的資訊恭喜你叢集搭建成功!!!

 

2.7 Redis叢集Spring管理

2.7.1  修改redis.properties檔案

 

 

 

 

2.7.2 編輯Spring配置檔案

<!-- jedis 配置-->  
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig" >  
        <!--最大空閒數-->  
        <property name="maxIdle" value="${redis.maxIdle}" />  
        <!--最大建立連線等待時間-->  
        <property name="maxWaitMillis" value="${redis.maxWait}" />  
        <!--是否在從池中取出連線前進行檢驗,如果檢驗失敗,則從池中去除連線並嘗試取出另一個-->  
        <property name="testOnBorrow" value="${redis.testOnBorrow}" />  
        <property name="maxTotal" value="${redis.maxTotal}" />  
        <property name="minIdle" value="${redis.minIdle}" />  
    </bean>
    

    <bean id="jedisCluster"  class="com.jt.common.util.RedisCluster" >  
        <property name="addressConfig">
            <value>classpath:/properties/redis.properties</value>  
        </property>  
        <property name="addressKeyPrefix" value="redis.cluster" />   <!--  屬性檔案裡  key的字首 -->  
        <property name="timeout" value="${redis.timeout}" />  
        <property name="maxRedirections" value="6" />  
        <property name="genericObjectPoolConfig" ref="poolConfig" />  
    </bean>  

 

2.7.3 編輯工具類方法

說明:工具類實現工廠介面和InitializingBean

 

 

 

2.先建立物件

 

 

 

  1. 通過工廠建立物件

 

 

2.7.4 業務層呼叫

 

 

2.7.5 修改哨兵依賴配置

 

 

相關文章