1.spring事物的傳播行爲,主要是用來解決業務層擁有事物的方法,相互調用的問題。
2.聲明事物,
在代碼執行前,開啓事務。代碼執行完,提交事務
3.spring並無提供事務具體的處理,而只是調用orm框架的事務,connection的事務。
spring只是對底層事務作了一層封裝。
4.spring對事務管理主要用了三個APi。PlatformTransactionManager ,TransactionDefinition,和TransactionStatus。
spring對TransactionManager不一樣的orm框架進行了不一樣的實現,如hibernate TransactionManager,DatasourceTransactionManager。
不一樣的transactionManager實現。
5.TransactionDefiniton定義了事務具體的定義,如傳播狀態,隔離級別,和是否只讀。
11. Redis 支持的數據類型
一、string(字符串)
二、hash(哈希)
Redis hash 是一個鍵值(key=>value)對集合。
Redis hash是一個string類型的field和value的映射表,hash特別適合用於存儲對象。
三、list(列表)
Redis 列表是簡單的字符串列表,按照插入順序排序。你能夠添加一個元素到列表的頭部(左邊)或者尾部(右邊)。
四、set(集合)
Redis的Set是string類型的無序集合。
五、zset(sorted set:有序集合)
Redis zset 和 set 同樣也是string類型元素的集合,且不容許重複的成員。
不一樣的是每一個元素都會關聯一個double類型的分數。redis正是經過分數來爲集合中的成員進行從小到大的排序。
zset的成員是惟一的,但分數(score)卻能夠重複。
12. Redis 經常使用命令
清空Redis全部key:
flush db # 清除當前數據庫的全部keys
flush all # 清除全部數據庫的全部keys
查詢匹配key:
keys * # 查看全部keys
keys prefix_* # 查看前綴爲"prefix_"的全部keys
key基本操做:
exists key # 確認一個key是否存在
set key value # 設置key和value
get key # 獲取key的value
del key # 刪除一個key
type key # 返回值的類型
keys pattern # 返回知足給定pattern的全部key
random key # 隨機返回key空間的一個
key rename oldname newname # 重命名key
db size # 返回當前數據庫中key的數目
select index # 選擇第0~15中
什麼是應用服務雪崩?
雪崩問題
分佈式系統都存在這樣一個問題,因爲網絡的不穩定性,決定了任何一個服務的可用性都不是 100% 的。當網絡不穩定的時候,做爲服務的提供者,自身可能會被拖死,致使服務調用者阻塞,最終可能引起雪崩連鎖效應。
緩存雪崩
當緩存服務器重啓或者大量緩存集中在某一個時間段失效,這樣在失效的時候,也會給後端系統(好比DB)帶來很大壓力,形成數據庫後端故障,從而引發應用服務器雪崩。
雪崩效應產生的幾種場景
流量激增:好比異常流量、用戶重試致使系統負載升高;
緩存刷新:假設A爲client端,B爲Server端,假設A系統請求都流向B系統,請求超出了B系統的承載能力,就會形成B系統崩潰;
程序有Bug:代碼循環調用的邏輯問題,資源未釋放引發的內存泄漏等問題;
硬件故障:好比宕機,機房斷電,光纖被挖斷等。
數據庫嚴重瓶頸,好比:長事務、sql超時等。
線程同步等待:系統間常常採用同步服務調用模式,核心服務和非核心服務共用一個線程池和消息隊列。若是一個核心業務線程調用非核心線程,這個非核心線程交由第三方系統完成,當第三方系統自己出現問題,致使核心線程阻塞,一直處於等待狀態,而進程間的調用是有超時限制的,最終這條線程將斷掉,也可能引起雪崩;
緩存雪崩的解決方案
緩存失效的幾種狀況:
一、緩存服務器掛了
二、高峯期緩存局部失效
三、熱點緩存失效
解決方案:
一、避免緩存集中失效,不一樣的key設置不一樣的超時時間
二、增長互斥鎖,控制數據庫請求,重建緩存。
三、提升緩存的HA,如:redis集羣。
雪崩的總體解決方案
通常狀況對於服務依賴的保護主要有3種解決方案:
(1)熔斷模式
這種模式主要是參考電路熔斷,若是一條線路電壓太高,保險絲會熔斷,防止火災。放到咱們的系統中,若是某個目標服務調用慢或者有大量超時,此時,熔斷該服務的調用,對於後續調用請求,不在繼續調用目標服務,直接返回,快速釋放資源。若是目標服務狀況好轉則恢復調用。
重點監控的機器性能指標
cpu(Load) cpu使用率/負載
memory 內存
mysql監控長事務(這裏與sql查詢超時是緊密結合的,須要重點監控)
sql超時
線程數等
總之,除了cpu、內存、線程數外,重點監控數據庫端的長事務、sql超時等,絕大多數應用服務器發生的雪崩場景,都是來源於數據庫端的性能瓶頸,從而先引發數據庫端大量瓶頸,最終拖累應用服務器也發生雪崩,最後就是大面積的雪崩。
(2)隔離模式
這種模式就像對系統請求按類型劃分紅一個個小島的同樣,當某個小島被火少光了,不會影響到其餘的小島。
例如能夠對不一樣類型的請求使用線程池來資源隔離,每種類型的請求互不影響,若是一種類型的請求線程資源耗盡,則對後續的該類型請求直接返回,再也不調用後續資源。這種模式使用場景很是多,例如將一個服務拆開,對於重要的服務使用單獨服務器來部署,再或者公司最近推廣的多中心。
(3)限流模式
上述的熔斷模式和隔離模式都屬於出錯後的容錯處理機制,而限流模式則能夠稱爲預防模式。限流模式主要是提早對各個類型的請求設置最高的QPS閾值,若高於設置的閾值則對該請求直接返回,再也不調用後續資源。這種模式不能解決服務依賴的問題,只能解決系統總體資源分配問題,由於沒有被限流的請求依然有可能形成雪崩效應。
熔斷設計
在熔斷的設計主要參考了hystrix的作法。其中最重要的是三個模塊:熔斷請求判斷算法、熔斷恢復機制、熔斷報警
(1)熔斷請求判斷機制算法:使用無鎖循環隊列計數,每一個熔斷器默認維護10個bucket,每1秒一個bucket,每一個blucket記錄請求的成功、失敗、超時、拒絕的狀態,默認錯誤超過50%且10秒內超過20個請求進行中斷攔截。
(2)熔斷恢復:對於被熔斷的請求,每隔5s容許部分請求經過,若請求都是健康的(RT<250ms)則對請求健康恢復。
(3)熔斷報警:對於熔斷的請求打日誌,異常請求超過某些設定則報警。
隔離設計
隔離的方式通常使用兩種
(1)線程池隔離模式:使用一個線程池來存儲當前的請求,線程池對請求做處理,設置任務返回處理超時時間,堆積的請求堆積入線程池隊列。這種方式須要爲每一個依賴的服務申請線程池,有必定的資源消耗,好處是能夠應對突發流量(流量洪峯來臨時,處理不完可將數據存儲到線程池隊裏慢慢處理)
(2)信號量隔離模式:使用一個原子計數器(或信號量)來記錄當前有多少個線程在運行,請求來先判斷計數器的數值,若超過設置的最大線程個數則丟棄改類型的新請求,若不超過則執行計數操做請求來計數器+1,請求返回計數器-1。這種方式是嚴格的控制線程且當即返回模式,沒法應對突發流量(流量洪峯來臨時,處理的線程超過數量,其餘的請求會直接返回,不繼續去請求依賴的服務)
超時機制設計
(1)超時分兩種,一種是請求的等待超時,一種是請求運行超時。
(2)等待超時:在任務入隊列時設置任務入隊列時間,並判斷隊頭的任務入隊列時間是否大於超時時間,超過則丟棄任務。
(3)運行超時:直接可以使用線程池提供的get方法。
如何提早發現雪崩
就是首先讓系統不雪崩,而後經過監控發現請求正在接近或者超過閥值,而後再根據具體狀況處理,這個接近或者超過閥值的過程,能夠稱爲 「提早發現雪崩」。
以上就是應用服務雪崩的場景以及技術方案總結。
配置的優化其實包含兩個方面的:操做系統內核的優化和mysql配置文件的優化
1)系統內核的優化對專用的mysql服務器來講,無非是內存實用、鏈接數、超時處理、TCP處理等方面的優化,根據本身的硬件配置來進行優化,這裏很少講;
2)mysql配置的優化,通常來講包含:IO處理的經常使用參數、最大鏈接數設置、緩存使用參數的設置、慢日誌的參數的設置、innodb相關參數的設置等,若是有主從關係在設置主從同步的相關參數便可,網上的相關配置文件不少,大同小異,經常使用的設置大多修改這些差很少就夠用了。
二、 sql語句的優化
一、 儘可能稍做計算
Mysql的做用是用來存取數據的,不是作計算的,作計算的話能夠用其餘方法去實現,mysql作計算是很耗資源的。
2.儘可能少 join
MySQL 的優點在於簡單,但這在某些方面其實也是其劣勢。MySQL 優化器效率高,可是因爲其 統計信息的量有限,優化器工做過程出現誤差的可能性也就更多。對於複雜的多表 Join,一方面因爲其優化器受限,再者在 Join 這方面所下的功夫還不夠,因此性能表現離 Oracle 等關係型數據庫前輩仍是有必定距離。但若是是簡單的單表查詢,這一差距就會極小甚至在有些場景下要優於這些數據庫前輩。
3.儘可能少排序
排序操做會消耗較多的 CPU 資源,因此減小排序能夠在緩存命中率高等 IO 能力足夠的場景下會較大影響 SQL的 響應時間。
對於MySQL來講,減小排序有多種辦法,好比:
經過利用索引來排序的方式進行優化
減小參與排序的記錄條數
非必要不對數據進行排序
4.儘可能避免 select *
在數據量少而且 訪問量不大的狀況下,select * 沒有什麼影響,可是量級達到必定級別的時候,在執行效率和IO資源的使用上,仍是有很大關係的,用什麼字段取什麼字段,減小沒必要要的資源浪費。
以前遇到過由於一個字段存儲的數據比較大,併發高的狀況下把網絡帶寬跑滿的狀況,形成網站打不開或是打開速度極慢的狀況。
5.儘可能用 join 代替子查詢
雖然 Join 性能並不佳,可是和 MySQL 的子查詢比起來仍是有很是大的性能優點。MySQL 的子查詢執行計劃一直存在較大的問題,雖然這個問題已經存在多年,可是到目前已經發布的全部穩定版本中都廣泛存在,一直沒有太大改善。雖然官方也在很早就認可這一問題,而且承諾儘快解決,可是至少到目前爲止咱們尚未看到哪個版本較好的解決了這一問題。
6.儘可能少 or
當 where 子句中存在多個條件以「或」並存的時候,MySQL 的優化器並無很好的解決其執行計劃優化問題,再加上 MySQL 特有的 SQL 與 Storage 分層架構方式,形成了其性能比較低下,不少時候使用 union all 或者是union(必要的時候)的方式來代替「or」會獲得更好的效果。
7.儘可能用 union all 代替 union
union 和 union all 的差別主要是前者須要將兩個(或者多個)結果集合並後再進行惟一性過濾操做,這就會涉及到排序,增長大量的 CPU 運算,加大資源消耗及延遲。因此當咱們能夠確認不可能出現重複結果集或者不在意重複結果集的時候,儘可能使用 union all 而不是 union。
8.儘可能早過濾
這一優化策略其實最多見於索引的優化設計中(將過濾性更好的字段放得更靠前)。
在 SQL 編寫中一樣能夠使用這一原則來優化一些 Join 的 SQL。好比咱們在多個表進行分頁數據查詢的時候,咱們最好是可以在一個表上先過濾好數據分好頁,而後再用分好頁的結果集與另外的表 Join,這樣能夠儘量多的減小沒必要要的 IO 操做,大大節省 IO 操做所消耗的時間。
9.避免類型轉換
這裏所說的「類型轉換」是指 where 子句中出現 column 字段的類型和傳入的參數類型不一致的時候發生的類型轉換:
A:人爲在column_name 上經過轉換函數進行轉換
直接致使 MySQL(實際上其餘數據庫也會有一樣的問題)沒法使用索引,若是非要轉換,應該在傳入的參數上進行轉換
B:由數據庫本身進行轉換
若是咱們傳入的數據類型和字段類型不一致,同時咱們又沒有作任何類型轉換處理,MySQL 可能會本身對咱們的數據進行類型轉換操做,也可能不進行處理而交由 存儲引擎去處理,這樣一來,就會出現索引沒法使用的狀況而形成執行計劃問題。
以上兩種狀況在開發者由於某種緣由常常會有,原本能夠用到索引的結果類型不對沒有用到索引,或是由於類型不對又有越界的狀況發生形成沒法使用索引的狀況,結果形成很嚴重的事故。
10.優先優化高併發的 SQL,而不是執行頻率低某些「大」SQL
對於破壞性來講,高併發的 SQL 老是會比低頻率的來得大,由於高併發的 SQL 一旦出現問題,甚至不會給咱們任何喘息的機會就會將系統壓跨。而對於一些雖然須要消耗大量 IO 並且響應很慢的 SQL,因爲頻率低,即便遇到,最多就是讓整個系統響應慢一點,但至少可能撐一下子,讓咱們有緩衝的機會。
11.從全局出發優化,而不是片面調整
SQL 優化不能是單獨針對某一個進行,而應充分考慮系統中全部的 SQL,尤爲是在經過調整索引優化 SQL 的執行計劃的時候,千萬不能顧此失彼,因小失大。
12.儘量對每一條運行在數據庫中的SQL進行 explain
優化 SQL,須要作到心中有數,知道SQL 的執行計劃才能判斷是否有優化餘地,才能判斷是否存在執行計劃問題。在對數據庫中運行的 SQL 進行了一段時間的優化以後,很明顯的問題 SQL 可能已經不多了,大多都須要去發掘,這時候就須要進行大量的 explain 操做收集執行計劃,並判斷是否須要進行優化。
問題一:
什麼是Spring Cloud?
Spring cloud流應用程序啓動器是基於Spring Boot的Spring集成應用程序,提供與外部系統的集成。Spring cloud Task,一個生命週期短暫的微服務框架,用於快速構建執行有限數據處理的應用程序。
問題二:
使用Spring Cloud有什麼優點?
使用Spring Boot開發分佈式微服務時,咱們面臨如下問題
-
與分佈式系統相關的複雜性-這種開銷包括網絡問題,延遲開銷,帶寬問題,安全問題。
-
服務發現-服務發現工具管理羣集中的流程和服務如何查找和互相交談。它涉及一個服務目錄,在該目錄中註冊服務,而後可以查找並鏈接到該目錄中的服務。
-
冗餘-分佈式系統中的冗餘問題。
-
負載平衡 --負載平衡改善跨多個計算資源的工做負荷,諸如計算機,計算機集羣,網絡鏈路,中央處理單元,或磁盤驅動器的分佈。
-
性能-問題 因爲各類運營開銷致使的性能問題。
-
部署複雜性-Devops技能的要求。
問題三:
服務註冊和發現是什麼意思?Spring Cloud如何實現?
當咱們開始一個項目時,咱們一般在屬性文件中進行全部的配置。隨着愈來愈多的服務開發和部署,添加和修改這些屬性變得更加複雜。有些服務可能會降低,而某些位置可能會發生變化。手動更改屬性可能會產生問題。 Eureka服務註冊和發現能夠在這種狀況下提供幫助。因爲全部服務都在Eureka服務器上註冊並經過調用Eureka服務器完成查找,所以無需處理服務地點的任何更改和處理。
問題四:
負載平衡的意義什麼?
在計算中,負載平衡能夠改善跨計算機,計算機集羣,網絡連接,中央處理單元或磁盤驅動器等多種計算資源的工做負載分佈。負載平衡旨在優化資源使用,最大化吞吐量,最小化響應時間並避免任何單一資源的過載。使用多個組件進行負載平衡而不是單個組件可能會經過冗餘來提升可靠性和可用性。負載平衡一般涉及專用軟件或硬件,例如多層交換機或域名系統服務器進程。
問題五:
什麼是Hystrix?它如何實現容錯?
Hystrix是一個延遲和容錯庫,旨在隔離遠程系統,服務和第三方庫的訪問點,當出現故障是不可避免的故障時,中止級聯故障並在複雜的分佈式系統中實現彈性。
一般對於使用微服務架構開發的系統,涉及到許多微服務。這些微服務彼此協做。
思考如下微服務
假設若是上圖中的微服務9失敗了,那麼使用傳統方法咱們將傳播一個異常。但這仍然會致使整個系統崩潰。
隨着微服務數量的增長,這個問題變得更加複雜。微服務的數量能夠高達1000.這是hystrix出現的地方 咱們將使用Hystrix在這種狀況下的Fallback方法功能。咱們有兩個服務employee-consumer使用由employee-consumer公開的服務。
簡化圖以下所示
如今假設因爲某種緣由,employee-producer公開的服務會拋出異常。咱們在這種狀況下使用Hystrix定義了一個回退方法。這種後備方法應該具備與公開服務相同的返回類型。若是暴露服務中出現異常,則回退方法將返回一些值。
問題六:
什麼是Hystrix斷路器?咱們須要它嗎?
因爲某些緣由,employee-consumer公開服務會引起異常。在這種狀況下使用Hystrix咱們定義了一個回退方法。若是在公開服務中發生異常,則回退方法返回一些默認值。
17. 經常使用的 Liunx 命令
-
1.uptime命令
在Linux中,uptime命令顯示了你的系統運行了多久以及目前登陸的用戶有多少,另外還顯示了間隔1分鐘、5分鐘和15分鐘的負載平均值。
# uptime 08:16:26 up 22 min, 1 user, load average: 0.00, 0.03, 0.22
檢查uptime版本
除了uptime(正常運行時間)和version(版本)外,uptime命令沒有其餘選項。若是時間不到1天,它只給出hours:mins這種形式的信息。
[tecmint@linuxprobe ~]$ uptime -V procps version 3.2.8
-
2.w命令
該命令會顯示目前登陸的用戶及其進程,另外還會顯示負載平均值。此外,它還顯示了登陸名稱、tty名稱、遠程主機、登陸時間、閒置時間、JCPU、PCPU、命令和進程。
# w 08:27:44 up 34 min, 1 user, load average: 0.00, 0.00, 0.08 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT tecmint pts/0 192.168.50.1 07:59 0.00s 0.29s 0.09s w 可用的選項 -h:不顯示標題。 -s:不顯示JCPU和PCPU。 -f:不顯示字段信息。 -V:(大寫V)-顯示版本。
-
3.users命令
users命令顯示了目前已登陸的用戶,除了help(幫助)和version(版本)外,該命令沒有其餘參數。
# users Tecmint
-
4.who命令
who命令僅僅返回用戶名稱、日期、時間和主機信息;who命令相似w命令,不像w命令,who並不輸出用戶執行的操做這一信息,不妨具體看看who和w這兩個命令之間的區別。
# who tecmint pts/0 2010-09-18 07:59 (192.168.50.1)# w 08:43:58 up 50 min, 1 user, load average: 0.64, 0.18, 0.06 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT tecmint pts/0 192.168.50.1 07:59 0.00s 0.43s 0.10s w who命令的選項 -b:顯示上一次系統重啓日期和時間。 -r:顯示當前的運行級別。 -a,–all:顯示累積的全部信息。
-
5.whoami命令
whoami命令輸出當前用戶的姓名;你還能夠使用「who am i」命令顯示當前用戶,若是你以根用戶身份使用sudo命令登陸,「whoami」命令返回根用戶是當前用戶,若是你想知道登陸的用戶具體是哪一個,使用「who am i」命令。
# whoami tecmint
-
6.ls命令
ls命令顯示了人類可讀格式的文件列表。
# ls -l total 114 dr-xr-xr-x. 2 root root 4096 Sep 18 08:46 bin dr-xr-xr-x. 5 root root 1024 Sep 8 15:49 boot
按照上一次修改時間排序文件。
# ls -ltr total 40 -rw-r--r--. 1 root root 6546 Sep 17 18:42 install.log.syslog -rw-r--r--. 1 root root 22435 Sep 17 18:45 install.log -rw-------. 1 root root 1003 Sep 17 18:45 anaconda-ks.cfg
7.crontab命令
可以使用crontab命令和-l選項,列出當前用戶的計劃任務。
# crontab -l 00 10 * * * /bin/ls >/ls.txt
能夠使用-e選項編輯crontab,在下面例子中,將用VI編輯工具打開計劃任務,進行必要的更改,按:wq鍵退出,這會自動保存設置。
# crontab -e
8.less命令
less命令容許快速查看文件;你能夠向上和向下翻頁,按「q」便可退出less窗口。
# less install.log Installing setup-2.8.14-10.el6.noarch warning: setup-2.8.14-10.el6.noarch: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY Installing filesystem-2.4.30-2.1.el6.i686 Installing ca-certificates-2010.63-3.el6.noarch Installing xml-common-0.6.3-32.el6.noarch nstalling tzdata-2010l-1.el6.noarch Installing iso-codes-3.16-2.el6.noarch
9.more命令
more命令容許快速查看文件,並以百分比的形式顯示詳細信息,你能夠向上和向下翻頁,按「q」便可退出more窗口。
# more install.log Installing setup-2.8.14-10.el6.noarch warning: setup-2.8.14-10.el6.noarch: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY Installing filesystem-2.4.30-2.1.el6.i686 Installing ca-certificates-2010.63-3.el6.noarch Installing xml-common-0.6.3-32.el6.noarch Installing tzdata-2010l-1.el6.noarch Installing iso-codes-3.16-2.el6.noarch --More--(10%)
10.cp命令
將文件歷來源拷貝到目的地,保留同一種模式。
# cp -p fileA fileB
覆蓋文件以前系統會提示你。
# cp -i fileA fileB
11.mv命令
將fileA改名爲fileB; -i選項會在覆蓋前提示;若是文件已經存在,會要求予以確認。
# mv -i fileA fileB
12.cat命令
cat命令用來同時查看多個文件。
# cat fileA fileB
要是某個文件在一個屏幕/頁面顯示不了,你能夠使用cat命令來合併more和less命令,查看文件內容。
# cat install.log | less or # cat install.log | more
13.cd命令(切換目錄)
藉助cd命令(切換目錄),它會進入到fileA目錄。
# cd /fileA
14.pwd命令(輸出工做目錄)
pwd命令會返回當前的工做目錄。
# pwd /root
15.sort命令
以升序排序一行行文本文件,若是使用-r選項,就會以降序排序。
#sort fileA.txt #sort -r fileA.txt
16.vi命令
對大多數相似UNIX的操做系統而言,vi是最流行的文本編輯器,下面例子使用-R選項,打開只讀方式的文件,按「:q」便可退出vi窗口。
# vi -R /etc/shadows
17.ssh命令(安全外殼)
ssh命令用來登陸入到遠程主機;好比說,下面這個ssh例子會使用用戶做爲narad,鏈接到主機(192.168.50.2)。
# ssh narad@192.168.50.2
想檢查ssh的版本,使用選項-V(大寫),便可顯示ssh的版本。
# ssh -V OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 201