<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          redis詳解、哨兵模式、集群模式

          共 7165字,需瀏覽 15分鐘

           ·

          2021-05-23 13:21

          點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

          優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

          redis 安裝

          安裝步驟:

          1、下載獲得redis-3.2.5.tar.gz后將它放入我們的Linux目錄/opt
          2、解壓命令:tar -zxvf redis-3.2.5.tar.gz
          3、解壓完成后進(jìn)入目錄:cd redis-3.2.5
          4、在redis-3.2.5目錄下執(zhí)行make命令
          運(yùn)行make命令時(shí)出現(xiàn)故障意出現(xiàn)的錯(cuò)誤解析:gcc:命令未找到
          能上網(wǎng):
          yum install gcc
          yum install gcc-c++
          不能上網(wǎng):
          將資料中的rpmgcc目錄復(fù)制到Linux的opt目錄中
          進(jìn)入opt目錄中的rpmgcc目錄執(zhí)行命令:rpm -Uvh *.rpm --nodeps --force

          然后使用gcc –v和g++ -v查看gcc和g++版本,會(huì)看到詳細(xì)的版本信息,然后
          離線環(huán)境下安裝GCC和GCC-C++就完成了。
          5、在redis-3.2.5目錄下再次執(zhí)行make命令
          Jemalloc/jemalloc.h:沒有那個(gè)文件
          解決方案:運(yùn)行make distclean之后再 make
          6、在redis-3.2.5目錄下再次執(zhí)行make命令

          查看默認(rèn)安裝目錄:usr/local/bin

          Redis-benchmark:性能測試工具,可以在自己本子運(yùn)行,看看自己本子性能如何(服務(wù)啟動(dòng)起來后執(zhí)行)
          Redis-check-aof:修復(fù)有問題的AOF文件,持久化
          Redis-check-dump:修復(fù)有問題的dump.rdb文件
          Redis-sentinel:Redis集群使用,哨兵
          redis-server:Redis服務(wù)器啟動(dòng)命令
          redis-cli:客戶端,操作入口

          啟動(dòng)

          1、備份redis.conf:拷貝一份redis.conf到其他目錄

          2、修改redis.conf文件將里面的daemonize no 改成 yes,讓服務(wù)在后臺(tái)啟動(dòng)

          3、啟動(dòng)命令:執(zhí)行 redis-server /myredis/redis.conf

          4、用客戶端訪問: redis-cli
          5、測試驗(yàn)證:ping

          Redis的Java客戶端Jedis

          Jedis所需要的jar包

          Commons-pool-1.6.jar
          Jedis-2.1.0.jar

          idea連接虛擬機(jī)的Redis的注意事項(xiàng)

          禁用Linux的防火墻:
          臨時(shí)禁用:service iptables stop
          關(guān)閉開機(jī)自啟:chkconfig iptables off
          redis.conf中注釋掉bind 127.0.0.1(61行) ,然后 protect-mode(80行)設(shè)置為 no。


          Jedis測試連通性

          Redis事務(wù)

          Redis事務(wù)是一個(gè)單獨(dú)的隔離操作:事務(wù)中的所有命令都會(huì)序列化、按順序地執(zhí)行。事務(wù)在執(zhí)行的過程中,不會(huì)被其他客戶端發(fā)送來的命令請(qǐng)求所打斷。
          Redis事務(wù)的主要作用就是串聯(lián)多個(gè)命令防止別的命令插隊(duì)
          Multi、Exec、discard
          從輸入Multi命令開始,輸入的命令都會(huì)依次進(jìn)入命令隊(duì)列中,但不會(huì)執(zhí)行,至到輸入Exec后,Redis會(huì)將之前的命令隊(duì)列中的命令依次執(zhí)行。
          組隊(duì)的過程中可以通過discard來放棄組隊(duì)。

          事務(wù)的錯(cuò)誤處理
          組隊(duì)中某個(gè)命令出現(xiàn)了報(bào)告錯(cuò)誤,執(zhí)行時(shí)整個(gè)的所有隊(duì)列會(huì)都會(huì)被取消。

          如果執(zhí)行階段某個(gè)命令報(bào)出了錯(cuò)誤,則只有報(bào)錯(cuò)的命令不會(huì)被執(zhí)行,而其他的命令都會(huì)執(zhí)行,不會(huì)回滾。

          悲觀鎖(Pessimistic Lock), 顧名思義,就是很悲觀,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人會(huì)修改,所以每次在拿數(shù)據(jù)的時(shí)候都會(huì)上鎖,這樣別人想拿這個(gè)數(shù)據(jù)就會(huì)block直到它拿到鎖。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫里邊就用到了很多這種鎖機(jī)制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。
          樂觀鎖(Optimistic Lock), 顧名思義,就是很樂觀,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人不會(huì)修改,所以不會(huì)上鎖,但是在更新的時(shí)候會(huì)判斷一下在此期間別人有沒有去更新這個(gè)數(shù)據(jù),可以使用版本號(hào)等機(jī)制。樂觀鎖適用于多讀的應(yīng)用類型,這樣可以提高吞吐量。Redis就是利用這種check-and-set機(jī)制實(shí)現(xiàn)事務(wù)的。

          Redis的持久化

          Redis 提供了2個(gè)不同形式的持久化方式。
          RDB (Redis DataBase)
          AOF (Append Of File)

          RDB

          在指定的時(shí)間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫入磁盤,也就是行話講的Snapshot快照,它恢復(fù)時(shí)是將快照文件直接讀到內(nèi)存里。
          Redis會(huì)單獨(dú)創(chuàng)建(fork)一個(gè)子進(jìn)程來進(jìn)行持久化,會(huì)先將數(shù)據(jù)寫入到一個(gè)臨時(shí)文件中,待持久化過程都結(jié)束了,再用這個(gè)臨時(shí)文件替換上次持久化好的文件。整個(gè)過程中,主進(jìn)程是不進(jìn)行任何IO操作的,這就確保了極高的性能如果需要進(jìn)行大規(guī)模數(shù)據(jù)的恢復(fù),且對(duì)于數(shù)據(jù)恢復(fù)的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺點(diǎn)是最后一次持久化后的數(shù)據(jù)可能丟失。
          關(guān)于fork
          在Linux程序中,fork()會(huì)產(chǎn)生一個(gè)和父進(jìn)程完全相同的子進(jìn)程,但子進(jìn)程在此后多會(huì)exec系統(tǒng)調(diào)用,出于效率考慮,Linux中引入了“寫時(shí)復(fù)制技術(shù)”,一般情況父進(jìn)程和子進(jìn)程會(huì)共用同一段物理內(nèi)存,只有進(jìn)程空間的各段的內(nèi)容要發(fā)生變化時(shí),才會(huì)將父進(jìn)程的內(nèi)容復(fù)制一份給子進(jìn)程。
          rdb的保存的文件
          在redis.conf中配置文件名稱,默認(rèn)為dump.rdb

          rdb文件的保存路徑,也可以修改。默認(rèn)為Redis啟動(dòng)時(shí)命令行所在的目錄下

          rdb的保存策略

          手動(dòng)保存快照
          命令save: 只管保存,其它不管,全部阻塞
          save vs bgsave

          stop-writes-on-bgsave-error yes

          當(dāng)Redis無法寫入磁盤的話,直接關(guān)掉Redis的寫操作

          rdbcompression yes

          進(jìn)行rdb保存時(shí),將文件壓縮

          rdbchecksum yes

          在存儲(chǔ)快照后,還可以讓Redis使用CRC64算法來進(jìn)行數(shù)據(jù)校驗(yàn),但是這樣做會(huì)增加大約10%的性能消耗,如果希望獲取到最大的性能提升,可以關(guān)閉此功能
          rdb的備份
          先通過config get dir 查詢r(jià)db文件的目錄
          將*.rdb的文件拷貝到別的地方
          rdb的恢復(fù)
          關(guān)閉Redis
          先把備份的文件拷貝到工作目錄下
          啟動(dòng)Redis, 備份數(shù)據(jù)會(huì)直接加載
          rdb的優(yōu)點(diǎn)
          節(jié)省磁盤空間
          恢復(fù)速度快
          rdb的缺點(diǎn)
          雖然Redis在fork時(shí)使用了寫時(shí)拷貝技術(shù),但是如果數(shù)據(jù)龐大時(shí)還是比較消耗性能。
          在備份周期在一定間隔時(shí)間做一次備份,所以如果Redis意外down掉的話,就會(huì)丟失最后一次快照后的所有修改。

          AOF

          以日志的形式來記錄每個(gè)寫操作,將Redis執(zhí)行過的所有寫指令記錄下來(讀操作不記錄),只許追加文件但不可以改寫文件,Redis啟動(dòng)之初會(huì)讀取該文件重新構(gòu)建數(shù)據(jù),換言之,Redis重啟的話就根據(jù)日志文件的內(nèi)容將寫指令從前到后執(zhí)行一次以完成數(shù)據(jù)的恢復(fù)工作。

          AOF默認(rèn)不開啟,需要手動(dòng)在配置文件中配置

          可以在redis.conf中配置文件名稱,默認(rèn)為 appendonly.aof

          AOF文件的保存路徑,同RDB的路徑一致。
          AOF和RDB同時(shí)開啟,redis 聽aof的
          AOF文件故障備份
          AOF的備份機(jī)制和性能雖然和RDB不同, 但是備份和恢復(fù)的操作同RDB一樣,都是拷貝備份文件,需要恢復(fù)時(shí)再拷貝到Redis工作目錄下,啟動(dòng)系統(tǒng)即加載。
          AOF文件故障恢復(fù)
          如遇到AOF文件損壞,可通過

          redis-check-aof --fix appendonly.aof 進(jìn)行恢復(fù)
          AOF同步頻率設(shè)置
          始終同步,每次Redis的寫入都會(huì)立刻記入日志
          每秒同步,每秒記入日志一次,如果宕機(jī),本秒的數(shù)據(jù)可能丟失。
          把不主動(dòng)進(jìn)行同步,把同步時(shí)機(jī)交給操作系統(tǒng)。

          Rewrite
          AOF采用文件追加方式,文件會(huì)越來越大為避免出現(xiàn)此種情況,新增了重寫機(jī)制,當(dāng)AOF文件的大小超過所設(shè)定的閾值時(shí),Redis就會(huì)啟動(dòng)AOF文件的內(nèi)容壓縮,只保留可以恢復(fù)數(shù)據(jù)的最小指令集.可以使用命令bgrewriteaof。
          Redis如何實(shí)現(xiàn)重寫?
          AOF文件持續(xù)增長而過大時(shí),會(huì)fork出一條新進(jìn)程來將文件重寫(也是先寫臨時(shí)文件最后再rename),遍歷新進(jìn)程的內(nèi)存中數(shù)據(jù),每條記錄有一條的Set語句。重寫aof文件的操作,并沒有讀取舊的aof文件,而是將整個(gè)內(nèi)存中的數(shù)據(jù)庫內(nèi)容用命令的方式重寫了一個(gè)新的aof文件,這點(diǎn)和快照有點(diǎn)類似。
          何時(shí)重寫
          重寫雖然可以節(jié)約大量磁盤空間,減少恢復(fù)時(shí)間。但是每次重寫還是有一定的負(fù)擔(dān)的,因此設(shè)定Redis要滿足一定條件才會(huì)進(jìn)行重寫。

          系統(tǒng)載入時(shí)或者上次重寫完畢時(shí),Redis會(huì)記錄此時(shí)AOF大小,設(shè)為base_size,如果Redis的AOF當(dāng)前大小>= base_size +base_size*100% (默認(rèn))且當(dāng)前大小>=64mb(默認(rèn))的情況下,Redis會(huì)對(duì)AOF進(jìn)行重寫。
          AOF的優(yōu)點(diǎn)
          備份機(jī)制更穩(wěn)健,丟失數(shù)據(jù)概率更低。
          可讀的日志文本,通過操作AOF穩(wěn)健,可以處理誤操作。
          AOF的缺點(diǎn)
          比起RDB占用更多的磁盤空間。
          恢復(fù)備份速度要慢。
          每次讀寫都同步的話,有一定的性能壓力。
          存在個(gè)別Bug,造成恢復(fù)不能。
          用哪個(gè)好
          官方推薦兩個(gè)都啟用。
          如果對(duì)數(shù)據(jù)不敏感,可以選單獨(dú)用RDB。
          不建議單獨(dú)用 AOF,因?yàn)榭赡軙?huì)出現(xiàn)Bug。
          如果只是做純內(nèi)存緩存,可以都不用。

          Redis的主從復(fù)制

          主從復(fù)制,就是主機(jī)數(shù)據(jù)更新后根據(jù)配置和策略,自動(dòng)同步到備機(jī)的master/slaver機(jī)制,Master以寫為主,Slave以讀為主
          用處
          讀寫分離,性能擴(kuò)展
          容災(zāi)快速恢復(fù)
          配從(服務(wù)器)不配主(服務(wù)器)
          在這里插入圖片描述

          啟動(dòng)3臺(tái)redis服務(wù)

          info replication
          打印主從復(fù)制的相關(guān)信息
          slaveof 
          成為某個(gè)實(shí)例的從服務(wù)器


          一主二仆模式演示
          復(fù)制原理
          每次從機(jī)聯(lián)通后,都會(huì)給主機(jī)發(fā)送sync指令
          主機(jī)立刻進(jìn)行存盤操作,發(fā)送RDB文件,給從機(jī)
          從機(jī)收到RDB文件后,進(jìn)行全盤加載
          之后每次主機(jī)的寫操作,都會(huì)立刻發(fā)送給從機(jī),從機(jī)執(zhí)行相同的命令
          薪火相傳
          上一個(gè)slave可以是下一個(gè)slave的Master,slave同樣可以接收其他slaves的連接和同步請(qǐng)求,那么該slave作為了鏈條中下一個(gè)的master, 可以有效減輕master的寫壓力,去中心化降低風(fēng)險(xiǎn)。
          用 slaveof 
          中途變更轉(zhuǎn)向:會(huì)清除之前的數(shù)據(jù),重新建立拷貝最新的
          風(fēng)險(xiǎn)是一旦某個(gè)slave宕機(jī),后面的slave都沒法備份
          反客為主
          當(dāng)一個(gè)master宕機(jī)后,后面的slave可以立刻升為master,其后面的slave不用做任何修改。。
          用 slaveof no one 將從機(jī)變?yōu)橹鳈C(jī)。

          哨兵模式(sentinel)
          反客為主的自動(dòng)版,能夠后臺(tái)監(jiān)控主機(jī)是否故障,如果故障了根據(jù)投票數(shù)自動(dòng)將從庫轉(zhuǎn)換為主庫.

          配置哨兵
          調(diào)整為一主二仆模式
          自定義的/myredis目錄下新建sentinel.conf文件
          在配置文件中填寫內(nèi)容:

          sentinel  monitor  mymaster  127.0.0.1  6379  1

          其中mymaster為監(jiān)控對(duì)象起的服務(wù)器名稱, 1 為 至少有多少個(gè)哨兵同意遷移的數(shù)量。

          啟動(dòng)哨兵

          執(zhí)行redis-sentinel /myredis/sentinel.conf

          現(xiàn)在我將6379 shutdown 然后在將6379連上,發(fā)現(xiàn) 主機(jī)為6381 從機(jī)為6379、6380

          哨兵模式搭建完畢,下面來搞集群

          redis的集群

          Redis 集群實(shí)現(xiàn)了對(duì)Redis的水平擴(kuò)容,即啟動(dòng)N個(gè)redis節(jié)點(diǎn),將整個(gè)數(shù)據(jù)庫分布存儲(chǔ)在這N個(gè)節(jié)點(diǎn)中,每個(gè)節(jié)點(diǎn)存儲(chǔ)總數(shù)據(jù)的1/N。

          Redis 集群通過分區(qū)(partition)來提供一定程度的可用性(availability):即使集群中有一部分節(jié)點(diǎn)失效或者無法進(jìn)行通訊, 集群也可以繼續(xù)處理命令請(qǐng)求。
          1、安裝ruby環(huán)境
          能上網(wǎng):
          執(zhí)行yum install ruby
          執(zhí)行yum install rubygems
          不能上網(wǎng):
          cd /run/media/root/CentOS 7 x86_64/Packages(路徑跟centos6不同) 獲取右圖rpm包
          拷貝到/opt/rpmruby/目錄下,并cd到此目錄
          執(zhí)行:rpm -Uvh *.rpm --nodeps --force
          按照依賴安裝各個(gè)rpm包
          2、拷貝redis-3.2.0.gem到/opt目錄下
          3、執(zhí)行在opt目錄下執(zhí)行 gem install --local redis-3.2.0.gem

          制作6個(gè)實(shí)例,6379,6380,6381,6389,6390,6391.conf
          cluster-enabled yes 打開集群模式
          cluster-config-file nodes-6379.conf 設(shè)定節(jié)點(diǎn)配置文件名
          cluster-node-timeout 15000 設(shè)定節(jié)點(diǎn)失聯(lián)時(shí)間,超過該時(shí)間(毫秒),集群自動(dòng)進(jìn)行主從切換。

          復(fù)制6份

          并且改端口(每個(gè)都要改)

          將六個(gè)節(jié)點(diǎn)合成一個(gè)集群
          組合之前,請(qǐng)確保所有redis實(shí)例啟動(dòng)后,nodes-xxxx.conf文件都生成正常。

          合體:
          cd /opt/redis-3.2.5/src

          ./redis-trib.rb create --replicas 1 192.168.1.101:6379 192.168.1.101:6380 192.168.1.101:6381 192.168.1.101:6389 192.168.1.101:6390 192.168.1.101:6391

          合體成功

          通過 cluster nodes 命令查看集群信息
          redis cluster 如何分配這六個(gè)節(jié)點(diǎn)?
          一個(gè)集群至少要有三個(gè)主節(jié)點(diǎn)。
          選項(xiàng) --replicas 1 表示我們希望為集群中的每個(gè)主節(jié)點(diǎn)創(chuàng)建一個(gè)從節(jié)點(diǎn)。
          分配原則盡量保證每個(gè)主數(shù)據(jù)庫運(yùn)行在不同的IP地址,每個(gè)從庫和主庫不在一個(gè)IP地址上。
          什么是slots?
          一個(gè) Redis 集群包含 16384 個(gè)插槽(hash slot), 數(shù)據(jù)庫中的每個(gè)鍵都屬于這 16384 個(gè)插槽的其中一個(gè), 集群使用公式 CRC16(key) % 16384 來計(jì)算鍵 key 屬于哪個(gè)槽, 其中 CRC16(key) 語句用于計(jì)算鍵 key 的 CRC16 校驗(yàn)和 。
          集群中的每個(gè)節(jié)點(diǎn)負(fù)責(zé)處理一部分插槽。舉個(gè)例子, 如果一個(gè)集群可以有主節(jié)點(diǎn), 其中:
          節(jié)點(diǎn) A 負(fù)責(zé)處理 0 號(hào)至 5500 號(hào)插槽。
          節(jié)點(diǎn) B 負(fù)責(zé)處理 5501 號(hào)至 11000 號(hào)插槽。
          節(jié)點(diǎn) C 負(fù)責(zé)處理 11001 號(hào)至 16383 號(hào)插槽。
          如果主節(jié)點(diǎn)下線?從節(jié)點(diǎn)能否自動(dòng)升為主節(jié)點(diǎn)?
          主節(jié)點(diǎn)恢復(fù)后,主從關(guān)系會(huì)如何?
          如果所有某一段插槽的主從節(jié)點(diǎn)都宕掉,redis服務(wù)是否還能繼續(xù)?
          redis.conf中的參數(shù) cluster-require-full-coverage

          集群的Jedis開發(fā)

          public class JedisClusterTest {

            public static void main(String[] args) {
           
               Set<HostAndPort> set =new HashSet<HostAndPort>();
               set.add(new HostAndPort("192.168.1.101",6379));
               JedisCluster jedisCluster=new JedisCluster(set);

               jedisCluster.set("k1""v1");
               System.out.println(jedisCluster.get("k1"));
            }

          }

          Redis 集群提供了以下好處:
          實(shí)現(xiàn)擴(kuò)容
          分?jǐn)倝毫?br style="outline: 0px;">無中心配置相對(duì)簡單
          Redis 集群的不足:
          多鍵操作是不被支持的
          多鍵的Redis事務(wù)是不被支持的。lua腳本不被支持。
          由于集群方案出現(xiàn)較晚,很多公司已經(jīng)采用了其他的集群方案,而代理或者客戶端分片的方案想要遷移至redis cluster,需要整體遷移而不是逐步過渡,復(fù)雜度較大。


          版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。

          本文鏈接:

          https://blog.csdn.net/weixin_40245787/article/details/87858380







          粉絲福利:Java從入門到入土學(xué)習(xí)路線圖

          ??????

          ??長按上方微信二維碼 2 秒


          感謝點(diǎn)贊支持下哈 

          瀏覽 52
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本黄色三级在线 | 天堂a 中文在线 | 看一级片视频 | 五月亭亭六月丁香 | 伊人在线大香蕉视频 |