第二十周 企業(yè)級(jí)NoSQL數(shù)據(jù)庫Redis

1债热、總結(jié)tomcat優(yōu)化方法

由于Tomcat的運(yùn)行依賴于JVM拆讯,從虛擬機(jī)的角度把Tomcat的調(diào)整分為外部環(huán)境調(diào)優(yōu) JVM 和 Tomcat 自身調(diào)優(yōu)兩部分

1 內(nèi)存空間優(yōu)化,啟動(dòng)時(shí)告訴JVM我要一大塊內(nèi)存(調(diào)優(yōu)內(nèi)存是最直接的方式)
Tomcat的JVM參數(shù)設(shè)置
默認(rèn)不指定览芳,-Xmx大約使用了1/4的內(nèi)存吴汪,當(dāng)前本機(jī)內(nèi)存指定約為1G蜈亩。

在/usr/local/tomcat/bin/catalina.sh中增加一行

......
# OS specific support. $var _must_ be set to either true or false.
#添加下面一行
JAVA_OPTS="-server -Xms512m -Xmx512m -XX:NewSize=100m -XX:MaxNewSize=200m"

cygwin=false
darwin=false
........
systemctl restart tomcat
JAVA_OPTS="-server -Xms4g -Xmx4g -XX:NewSize= -XX:MaxNewSize= "
-server:服務(wù)器模式
-Xms:堆內(nèi)存初始化大小
-Xmx:堆內(nèi)存空間上限
-XX:NewSize=:新生代空間初始化大小
-XX:MaxNewSize=:新生代空間最大值

生產(chǎn)案例:

[root@centos8 ~]#vim /usr/local/tomcat/bin/catalina.sh
JAVA_OPTS="-server -Xms4g -Xmx4g -Xss512k -Xmn1g 
-XX:CMSInitiatingOccupancyFraction=65 -XX:+AggressiveOpts -XX:+UseBiasedLocking
-XX:+DisableExplicitGC -XX:MaxTenuringThreshold=10 -XX:NewRatio=2
-XX:PermSize=128m -XX:MaxPermSize=512m -XX:CMSFullGCsBeforeCompaction=5
-XX:+ExplicitGCInvokesConcurrent -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection
-XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods"

#一臺(tái)tomcat服務(wù)器并發(fā)連接數(shù)不高,生產(chǎn)建議分配物理內(nèi)存通常 4G 到 8G較多,如果需要更多連接,一般會(huì)利用虛擬化技術(shù)實(shí)現(xiàn)多臺(tái)tomcat

2 線程池調(diào)整

[root@centos8 ~]#vim /usr/local/tomcat/conf/server.xml
......
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" />
......

常用屬性:
connectionTimeout :連接超時(shí)時(shí)長(zhǎng),單位ms
maxThreads:最大線程數(shù),默認(rèn)200
minSpareThreads:最小空閑線程數(shù)
maxSpareThreads:最大空閑線程數(shù)
acceptCount:當(dāng)啟動(dòng)線程滿了之后修赞,等待隊(duì)列的最大長(zhǎng)度婶恼,默認(rèn)100
URIEncoding:URI 地址編碼格式,建議使用 UTF-8
enableLookups:是否啟用客戶端主機(jī)名的DNS反向解析榔组,缺省禁用熙尉,建議禁用,就使用客戶端IP
就行
compression:是否啟用傳輸壓縮機(jī)制搓扯,建議 "on"检痰,CPU和流量的平衡

  • compressionMinSize:?jiǎn)⒂脡嚎s傳輸?shù)臄?shù)據(jù)流最小值,單位是字節(jié)
  • compressableMimeType:定義啟用壓縮功能的MIME類型text/html, text/xml, text/css,
    text/javascript

3 Java壓力測(cè)試工具
PerfMa 致力于打造一站式IT系統(tǒng)穩(wěn)定性保障解決方案锨推,專注于性能評(píng)測(cè)與調(diào)優(yōu)铅歼、故障根因定位與解決,
為企業(yè)提供一系列技術(shù)產(chǎn)品與專家服務(wù)换可,提升系統(tǒng)研發(fā)與運(yùn)行質(zhì)量椎椰。
社區(qū)產(chǎn)品 https://opts.console.perfma.com/

2、java程序出現(xiàn)oom如何解決沾鳄?什么場(chǎng)景下會(huì)出現(xiàn)oom慨飘?

什么是OOM
OOM為out of memory的簡(jiǎn)稱,來源于java.lang.OutOfMemoryError,指程序需要的內(nèi)存空間大于系統(tǒng)分配的內(nèi)存空間瓤的,OOM后果就是程序crash休弃;可以通俗理解:程序申請(qǐng)內(nèi)存過大,虛擬機(jī)無法滿足圈膏,然后自殺了塔猾。

導(dǎo)致OOM問題的原因
為什么會(huì)沒有內(nèi)存了呢?原因不外乎有兩點(diǎn):
1)分配的少了:比如虛擬機(jī)本身可使用的內(nèi)存(一般通過啟動(dòng)時(shí)的VM參數(shù)指定)太少稽坤。
2)應(yīng)用用的太多丈甸,并且用完沒釋放,浪費(fèi)了尿褪。此時(shí)就會(huì)造成內(nèi)存泄露或者內(nèi)存溢出睦擂。

內(nèi)存泄露:申請(qǐng)使用完的內(nèi)存沒有釋放,導(dǎo)致虛擬機(jī)不能再次使用該內(nèi)存茫多,此時(shí)這段內(nèi)存就泄露了祈匙,因?yàn)樯暾?qǐng)者不用了,而又不能被虛擬機(jī)分配給別人用天揖。

內(nèi)存溢出:申請(qǐng)的內(nèi)存超出了JVM能提供的內(nèi)存大小夺欲,此時(shí)稱之為溢出。

最常見的OOM情況有以下三種:

  • java.lang.OutOfMemoryError: Java heap space ------>java堆內(nèi)存溢出今膊,此種情況最常見些阅,一般由于內(nèi)存泄露或者堆的大小設(shè)置不當(dāng)引起。對(duì)于內(nèi)存泄露斑唬,需要通過內(nèi)存監(jiān)控軟件查找程序中的泄露代碼市埋,而堆大小可以通過虛擬機(jī)參數(shù)-Xms,-Xmx等修改。
  • java.lang.OutOfMemoryError: PermGen space 或 java.lang.OutOfMemoryError:MetaSpace ------>java方法區(qū)恕刘,(java8 元空間)溢出了缤谎,一般出現(xiàn)于大量Class或者jsp頁面,或者采用cglib等反射機(jī)制的情況褐着,因?yàn)樯鲜銮闆r會(huì)產(chǎn)生大量的Class信息存儲(chǔ)于方法區(qū)坷澡。此種情況可以通過更改方法區(qū)的大小來解決,使用類似-XX:PermSize=64m -XX:MaxPermSize=256m的形式修改含蓉。另外频敛,過多的常量尤其是字符串也會(huì)導(dǎo)致方法區(qū)溢出。
  • java.lang.StackOverflowError ------> 不會(huì)拋OOM error馅扣,但也是比較常見的Java內(nèi)存溢出斟赚。JAVA虛擬機(jī)棧溢出,一般是由于程序中存在死循環(huán)或者深度遞歸調(diào)用造成的差油,棧大小設(shè)置太小也會(huì)出現(xiàn)此種溢出拗军。可以通過虛擬機(jī)參數(shù)-Xss來設(shè)置棧的大小。

Jprofiler定位OOM的問題原因
JProfiler是一款功能強(qiáng)大的Java開發(fā)分析工具发侵,它可以快速的幫助用戶分析出存在的錯(cuò)誤侈咕,軟件還可對(duì)需要的顯示類進(jìn)行標(biāo)記,包括了內(nèi)存的分配情況和信息的視圖等
JProfiler官網(wǎng):http://www.ej-technologies.com/products/jprofiler/overview.html

安裝jprofiler工具定位OOM原因和源碼問題的位置

#安裝OpenJDK
[root@centos8 ~]# dnf -y install java-1.8.0-openjdk-devel
[root@centos8 ~]# vim HeapOom.java
import java.util.ArrayList;
import java.util.List;

public class HeapOom {
    public static void main(String[] args) {
        List<byte[]> list =new ArrayList<byte[]>();
        int i = 0;
        boolean flag = true;
        while(flag){
            try{
                i++;
                list.add(new byte[1024* 1024]);//每次增加一個(gè)1M大小的數(shù)組對(duì)象
                Thread.sleep(1000);
            }catch(Throwable e){
                e.printStackTrace();
                flag = false;
                System.out.println("count="+i);//記錄運(yùn)行的次數(shù)
            }
        }
    }
}
[root@centos8 ~]# javac HeapOom.java
[root@centos8 ~]# java -Xms5m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError HeapOom
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid96271.hprof ...
……
[root@centos8 ~]# sz java_pid96271.hprof

[root@centos8 ~]# vim HeapOom2.java
import java. util. Random;
public class HeapOom2 {
    public static void main(String[] args) {
        String str = "I am lao wang";
        while (true){
            str += str + new Random().nextInt(88888888);
        }
    }
}
[root@centos8 ~]# javac HeapOom2.java
[root@centos8 ~]# java -Xms5m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError HeapOom2
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid96339.hprof ...
[root@centos8 ~]# sz java_pid96339.hprof

下載并安裝Jprofiler


1.png

下載并安裝JProfiler(傻瓜式安裝略)后器紧,雙擊打開前面生成的兩個(gè)文件java_pid96271.hprof和java_pid96339,可以看到下面顯示,從中分析OOM原因


2.png

3.png

4.png

5.png

3楼眷、簡(jiǎn)述redis特點(diǎn)及其應(yīng)用場(chǎng)景

redis特點(diǎn)

  • 速度快: 10W QPS,基于內(nèi)存,C語言實(shí)現(xiàn)
  • 單線程
  • 持久化
  • 支持多種數(shù)據(jù)結(jié)構(gòu)
  • 支持多種編程語言
  • 功能豐富: 支持Lua腳本,發(fā)布訂閱,事務(wù),pipeline等功能
  • 簡(jiǎn)單: 代碼短小精悍(單機(jī)核心代碼只有23000行左右),單線程開發(fā)容易,不依賴外部庫,使用簡(jiǎn)單
  • 主從復(fù)制
  • 支持高可用和分布式

redis應(yīng)用場(chǎng)景

  • Session 共享:常見于web集群中的Tomcat或者PHP中多web服務(wù)器session共享
  • 緩存:數(shù)據(jù)查詢铲汪、電商網(wǎng)站商品信息、新聞內(nèi)容
  • 計(jì)數(shù)器:訪問排行榜罐柳、商品瀏覽數(shù)等和次數(shù)相關(guān)的數(shù)值統(tǒng)計(jì)場(chǎng)景
  • 微博/微信社交場(chǎng)合:共同好友,粉絲數(shù),關(guān)注,點(diǎn)贊評(píng)論等
  • 消息隊(duì)列:ELK的日志緩存掌腰、部分業(yè)務(wù)的訂閱發(fā)布系統(tǒng)
  • 地理位置: 基于GEO(地理信息定位),實(shí)現(xiàn)搖一搖,附近的人,外賣等功能

4、對(duì)比redis的RDB张吉、AOF模式的優(yōu)缺點(diǎn)

1 RDB 模式優(yōu)點(diǎn)

  • RDB快照保存了某個(gè)時(shí)間點(diǎn)的數(shù)據(jù)齿梁,可以通過腳本執(zhí)行redis指令bgsave(非阻塞,后臺(tái)執(zhí)行)或者save(會(huì)阻塞寫操作,不推薦)命令自定義時(shí)間點(diǎn)備份肮蛹,可以保留多個(gè)備份勺择,當(dāng)出現(xiàn)問題可以恢復(fù)到不同時(shí)間點(diǎn)的版本,很適合備份,并且此文件格式也支持有不少第三方工具可以進(jìn)行后續(xù)的數(shù)據(jù)分析
    比如: 可以在最近的24小時(shí)內(nèi),每小時(shí)備份一次RDB文件伦忠,并且在每個(gè)月的每一天省核,也備份一個(gè)RDB文件。這樣的話昆码,即使遇上問題气忠,也可以隨時(shí)將數(shù)據(jù)集還原到不同的版本。
  • RDB可以最大化Redis的性能赋咽,父進(jìn)程在保存 RDB文件時(shí)唯一要做的就是fork出一個(gè)子進(jìn)程旧噪,然后這個(gè)子進(jìn)程就會(huì)處理接下來的所有保存工作,父進(jìn)程無須執(zhí)行任何磁盤 I/O 操作脓匿。
  • RDB在大量數(shù)據(jù)淘钟,比如幾個(gè)G的數(shù)據(jù),恢復(fù)的速度比AOF的快

2 RDB 模式缺點(diǎn)

  • 不能實(shí)時(shí)保存數(shù)據(jù)亦镶,可能會(huì)丟失自上一次執(zhí)行RDB備份到當(dāng)前的內(nèi)存數(shù)據(jù)
    如果你需要盡量避免在服務(wù)器故障時(shí)丟失數(shù)據(jù)日月,那么RDB并不適合。雖然Redis允許設(shè)置不同的保存點(diǎn)(save point)來控制保存RDB文件的頻率缤骨,但是爱咬,因?yàn)镽DB文件需要保存整個(gè)數(shù)據(jù)集的狀態(tài),所以它并不是一個(gè)輕松快速的操作绊起。因此一般會(huì)超過5分鐘以上才保存一次RDB文件精拟。在這種情況下,一旦發(fā)生故障停機(jī),你就可能會(huì)丟失好幾分鐘的數(shù)據(jù)蜂绎。
  • 當(dāng)數(shù)據(jù)量非常大的時(shí)候栅表,從父進(jìn)程fork子進(jìn)程進(jìn)行保存至RDB文件時(shí)需要一點(diǎn)時(shí)間,可能是毫秒或者秒师枣,取決于磁盤IO性能

3 AOF模式優(yōu)點(diǎn)

  • 數(shù)據(jù)安全性相對(duì)較高怪瓶,根據(jù)所使用的fsync策略(fsync是同步內(nèi)存中redis所有已經(jīng)修改的文件到存儲(chǔ)設(shè)備),默認(rèn)是appendfsync everysec践美,即每秒執(zhí)行一次 fsync,在這種配置下洗贰,Redis 仍然可以保持良好的性能,并且就算發(fā)生故障停機(jī)陨倡,也最多只會(huì)丟失一秒鐘的數(shù)據(jù)( fsync會(huì)在后臺(tái)線程執(zhí)行敛滋,所以主線程可以繼續(xù)努力地處理命令請(qǐng)求)
  • 由于該機(jī)制對(duì)日志文件的寫入操作采用的是append模式,因此在寫入過程中不需要seek, 即使出現(xiàn)宕機(jī)現(xiàn)象兴革,也不會(huì)破壞日志文件中已經(jīng)存在的內(nèi)容绎晃。然而如果本次操作只是寫入了一半數(shù)據(jù)就出現(xiàn)了系統(tǒng)崩潰問題,不用擔(dān)心杂曲,在Redis下一次啟動(dòng)之前庶艾,可以通過 redis-check-aof 工具來解決數(shù)據(jù)一致性的問題
  • Redis可以在 AOF文件體積變得過大時(shí),自動(dòng)地在后臺(tái)對(duì)AOF進(jìn)行重寫,重寫后的新AOF文件包含了恢復(fù)當(dāng)前數(shù)據(jù)集所需的最小命令集合擎勘。整個(gè)重寫操作是絕對(duì)安全的落竹,因?yàn)镽edis在創(chuàng)建新 AOF文件的過程中,append模式不斷的將修改數(shù)據(jù)追加到現(xiàn)有的 AOF文件里面货抄,即使重寫過程中發(fā)生停機(jī)述召,現(xiàn)有的 AOF文件也不會(huì)丟失。而一旦新AOF文件創(chuàng)建完畢蟹地,Redis就會(huì)從舊AOF文件切換到新AOF文件积暖,并開始對(duì)新AOF文件進(jìn)行追加操作。
  • AOF包含一個(gè)格式清晰怪与、易于理解的日志文件用于記錄所有的修改操作夺刑。事實(shí)上,也可以通過該文件完成數(shù)據(jù)的重建
    AOF文件有序地保存了對(duì)數(shù)據(jù)庫執(zhí)行的所有寫入操作分别,這些寫入操作以Redis協(xié)議的格式保存遍愿,因此 AOF文件的內(nèi)容非常容易被人讀懂,對(duì)文件進(jìn)行分析(parse)也很輕松耘斩。導(dǎo)出(export)AOF文件也非常簡(jiǎn)單:舉個(gè)例子沼填,如果不小心執(zhí)行了FLUSHALL.命令,但只要AOF文件未被重寫括授,那么只要停止服務(wù)器坞笙,移除 AOF文件末尾的FLUSHAL命令岩饼,并重啟Redis ,就可以將數(shù)據(jù)集恢復(fù)到FLUSHALL執(zhí)行之前的狀態(tài)。

4 AOF模式缺點(diǎn)

  • 即使有些操作是重復(fù)的也會(huì)全部記錄薛夜,AOF 的文件大小要大于 RDB 格式的文件
  • AOF 在恢復(fù)大數(shù)據(jù)集時(shí)的速度比 RDB 的恢復(fù)速度要慢
  • 根據(jù)fsync策略不同,AOF速度可能會(huì)慢于RDB
  • bug 出現(xiàn)的可能性更多

5籍茧、實(shí)現(xiàn)redis哨兵,模擬master故障場(chǎng)景

1.png

1 哨兵的準(zhǔn)備梯澜,實(shí)現(xiàn)主從復(fù)制架構(gòu)

哨兵的前提是已經(jīng)實(shí)現(xiàn)了一個(gè)redis的主從復(fù)制的運(yùn)行環(huán)境寞冯,從而實(shí)現(xiàn)一個(gè)一主兩從基于哨兵的高可用redis架構(gòu)
注意:master 的配置文件中masterauth 和slave 都必須相同
所有主從節(jié)點(diǎn)的redis.conf中關(guān)健配置

準(zhǔn)備主從環(huán)境配置

#在所有主從節(jié)點(diǎn)執(zhí)行
[root@centos8 ~]#dnf -y install redis
[root@centos8 ~]#vim /apps/redis/etc/redis.conf
bind 0.0.0.0
masterauth "123456"
requirepass "123456"

#或者非交互執(zhí)行
[root@centos8 ~]#sed -i -e 's/bind 127.0.0.1/bind 0.0.0.0/' -e 's/^# masterauth.*/masterauth 123456/' -e 's/^# requirepass .*/requirepass 123456/' /apps/redis/etc/redis.conf

#在所有從節(jié)點(diǎn)執(zhí)行
[root@centos8 ~]#echo "replicaof 10.0.0.8 6379" >> /apps/redis/etc/redis.conf

#在所有主從節(jié)點(diǎn)執(zhí)行
[root@centos8 ~]#systemctl enable --now redis

master服務(wù)器狀態(tài)

[root@master ~]#redis-cli -a 123456
127.0.0.1:6379> INFO replication
role:master
connected_slaves:2
……

2 編輯哨兵的配置文件

sentinel配置
Sentinel實(shí)際上是一個(gè)特殊的redis服務(wù)器,有些redis指令支持晚伙,但很多指令并不支持.默認(rèn)監(jiān)聽在26379/tcp端口
哨兵可以不和Redis服務(wù)器部署在一起简十,但一般部署在一起以節(jié)約成本
所有redis節(jié)點(diǎn)使用相同的以下示例的配置文件

#如果是編譯安裝,在源碼目錄有sentinel.conf撬腾,復(fù)制到安裝目錄即可,如:/apps/redis/etc/sentinel.conf
[root@master redis-6.2.4]#cp sentinel.conf /apps/redis/etc/
[root@master ~]#mv /apps/redis/etc/sentinel.conf /apps/redis/etc/redis-sentinel.conf
[root@master ~]#vim /apps/redis/etc/redis-sentinel.conf
bind 0.0.0.0
port 26379
daemonize yes
pidfile /apps/redis/run/redis-sentinel.pid
logfile "/apps/redis/log/sentinel_26379.log"
dir /tmp  #工作目錄

sentinel monitor mymaster 10.0.0.8 6379 2
#mymaster是集群的名稱恢恼,此行指定當(dāng)前mymaster集群中master服務(wù)器的地址和端口
#2為法定人數(shù)限制(quorum)民傻,即有幾個(gè)sentinel認(rèn)為master down了就進(jìn)行故障轉(zhuǎn)移,一般此值是所有sentinel節(jié)點(diǎn)(一般總數(shù)是>=3的 奇數(shù),如:3,5,7等)的一半以上的整數(shù)值场斑,比如漓踢,總數(shù)是3,即3/2=1.5漏隐,取整為2喧半,是master的ODOWN客觀下線的依據(jù)

sentinel auth-pass mymaster 123456
#mymaster集群中master的密碼,注意此行要在上面行的下面

sentinel down-after-milliseconds mymaster 3000
#(SDOWN)判斷mymaster集群中所有節(jié)點(diǎn)的主觀下線的時(shí)間青责,單位:毫秒挺据,建議3000

sentinel parallel-syncs mymaster 1
#發(fā)生故障轉(zhuǎn)移后,可以同時(shí)向新master同步數(shù)據(jù)的slave的數(shù)量脖隶,數(shù)字越小總同步時(shí)間越長(zhǎng)扁耐,但可以減輕新master的負(fù)載壓力

sentinel failover-timeout mymaster 180000
#所有slaves指向新的master所需的超時(shí)時(shí)間,單位:毫秒

sentinel deny-scripts-reconfig yes  #禁止修改腳本

三個(gè)哨兵服務(wù)器的配置都如下

[root@master ~]#grep -vE "^#|^$" /apps/redis/etc/redis-sentinel.conf
bind 0.0.0.0
port 26379
daemonize yes
pidfile /apps/redis/run/redis-sentinel.pid
logfile "/apps/redis/log/sentinel_26379.log"
dir /tmp
sentinel monitor mymaster 10.0.0.8 6379 2 
sentinel auth-pass mymaster 123456 
sentinel down-after-milliseconds mymaster 3000 
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

#以下內(nèi)容自動(dòng)生成产阱,不需要修改
sentinel myid 50547f34ed71fd48c197924969937e738a39975b
#此行自動(dòng)生成必須唯一婉称,修改此值需重啟redis和sentinel服務(wù)

[root@master ~]#scp /apps/redis/etc/redis-sentinel.conf 10.0.0.17: /apps/redis/etc/
[root@master ~]#scp /apps/redis/etc/redis-sentinel.conf 10.0.0.27: /apps/redis/etc/

3 啟動(dòng)哨兵
三臺(tái)哨兵服務(wù)器都要啟動(dòng)

#確保每個(gè)哨兵主機(jī)myid不同
[root@slave1 ~]#vim /apps/redis/etc/redis-sentinel.conf
sentinel myid 50547f34ed71fd48c197924969937e738a39975c

[root@slave2 ~]#vim /apps/redis/etc/redis-sentinel.conf
sentinel myid 50547f34ed71fd48c197924969937e738a39975d
#如果是編譯安裝在所有節(jié)點(diǎn)生成新的service文件
[root@centos8 ~]#vim /lib/systemd/system/redis-sentinel.service
[Unit]
Description=Redis Sentinel
After=network.target

[Service]
ExecStart=/apps/redis/bin/redis-sentinel /apps/redis/etc/redis-sentinel.conf --supervised systemd
ExecStop=/bin/kill -s QUIT $MAINPID
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755

[Install]
WantedBy=multi-user.target

#注意所有節(jié)點(diǎn)的目錄權(quán)限,否則無法啟動(dòng)服務(wù)
[root@master ~]#chown -R redis.redis /apps/redis/
[root@slave1 ~]#chown -R redis.redis /apps/redis/
[root@slave2 ~]#chown -R redis.redis /apps/redis/

[root@master ~]#systemctl enable --now redis-sentinel.service
[root@slave1 ~]#systemctl enable --now redis-sentinel.service
[root@slave2 ~]#systemctl enable --now redis-sentinel.service

4 驗(yàn)證哨兵端口

[root@master ~]#ss -ntl   # *:6379构蹬、*:26379端口打開
[root@slave1 ~]#ss -ntl
[root@slave2 ~]#ss -ntl

5 查看哨兵日志

#master的哨兵日志
[root@master ~]#tail -f /apps/redis/log/sentinel_26379.log

#slave的哨兵日志
[root@slave1 ~]#tail -f /apps/redis/log/sentinel_26379.log
[root@slave2 ~]#tail -f /apps/redis/log/sentinel_26379.log

6 當(dāng)前sentinel狀態(tài)

在sentinel狀態(tài)中尤其是最后一行王暗,涉及到masterIP是多少,有幾個(gè)slave庄敛,有幾個(gè)sentinels俗壹,必須是符合全部服務(wù)器數(shù)量

[root@master ~]#redis-cli -p 26379
127.0.0.1:26379> INFO sentinel
# Sentinel
……
master0:name=mymaster,status=ok,address=10.0.0.8:6379,slaves=2,sentinels=3 #兩個(gè)slave,三個(gè)sentinel服務(wù)器藻烤,如果sentinels值不符合策肝,檢查myid可能沖突

7 停止Redis Master 節(jié)點(diǎn)測(cè)試故障轉(zhuǎn)移

[root@master ~]#killall redis-server

8 故障轉(zhuǎn)移后的redis配置文件會(huì)被自動(dòng)修改

故障轉(zhuǎn)移后redis.conf中的replicaof行的master IP會(huì)被修改

[root@slave2 ~]#grep ^replicaof /apps/redis/etc/redis.conf
replicaof 10.0.0.18 6379

哨兵配置文件的sentinel monitor IP 同樣也會(huì)被修改

[root@slave1 ~]#grep "^[a-z]" /apps/redis/etc/redis-sentinel.conf
……
sentinel monitor mymaster 10.0.0.18 6379 2   #自動(dòng)修改此行
……

[root@slave2 ~]#grep "^[a-z]" /apps/redis/etc/redis-sentinel.conf
……
sentinel monitor mymaster 10.0.0.18 6379 2   #自動(dòng)修改此行
……

9 當(dāng)前 redis狀態(tài)

新的master 狀態(tài)

[root@slave1 ~]#redis -a 123456
127.0.0.1:6379> INFO replication
# Replication
role:master   #提升為master
connected_slaves:1
……

另一個(gè)slave指向新的master

[root@slave2 ~]#redis -a 123456
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:10.0.0.18  #指向新的master
master_port:6379
master_link_status:up
……

10 恢復(fù)故障的原master重新加入redis集群

[root@master ~]#cat /apps/redis/etc/redis.conf
#sentinel會(huì)自動(dòng)修改下面行指向新的master
replicaof 10.0.0.18 6379

在原 master上觀察狀態(tài)

[root@master ~]#redis-cli -a 123456
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:10.0.0.18
master_port:6379
master_link_status:up
……

[root@master ~]#redis-cli -p 26379
127.0.0.1:26379> INFO sentinel
# Sentinel
……
master0:name=mymaster,status=ok,address=10.0.0.18:6379,slaves=2,sentinels=3

觀察新master上狀態(tài)和日志

[root@slave1 ~]#redis-cli -a 123456
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:2

[root@slave1 ~]#tail -f /apps/redis/log/sentinel_26379.log
25717:X 28 Apr 2022 17:42:33.757 # +sdown slave 10.0.0.8:6379 10.0.0.8 6379@mymaster 10.0.0.18 6379
25717:X 28 Apr 2022 18:41:29.566 # -sdown slave 10.0.0.8:6379 10.0.0.8 6379 @mymaster 10.0.0.18 6379
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肛捍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子之众,更是在濱河造成了極大的恐慌拙毫,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棺禾,死亡現(xiàn)場(chǎng)離奇詭異缀蹄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)膘婶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門缺前,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悬襟,你說我怎么就攤上這事衅码。” “怎么了脊岳?”我有些...
    開封第一講書人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵逝段,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我割捅,道長(zhǎng)奶躯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任亿驾,我火速辦了婚禮嘹黔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘莫瞬。我一直安慰自己儡蔓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開白布疼邀。 她就那樣靜靜地躺著浙值,像睡著了一般。 火紅的嫁衣襯著肌膚如雪檩小。 梳的紋絲不亂的頭發(fā)上开呐,一...
    開封第一講書人閱讀 51,231評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音规求,去河邊找鬼筐付。 笑死,一個(gè)胖子當(dāng)著我的面吹牛阻肿,可吹牛的內(nèi)容都是我干的瓦戚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼丛塌,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼较解!你這毒婦竟也來了畜疾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤印衔,失蹤者是張志新(化名)和其女友劉穎啡捶,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奸焙,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瞎暑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了与帆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片了赌。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖玄糟,靈堂內(nèi)的尸體忽然破棺而出勿她,到底是詐尸還是另有隱情,我是刑警寧澤阵翎,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布逢并,位于F島的核電站,受9級(jí)特大地震影響贮喧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜猪狈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一箱沦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雇庙,春花似錦谓形、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至竹椒,卻和暖如春童太,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胸完。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工书释, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赊窥。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓爆惧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親锨能。 傳聞我的和親對(duì)象是個(gè)殘疾皇子扯再,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容