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