目錄
一、redis部分(基于redis+mysql+gearmand項目)
1.redis在公司還是實驗室?講一下redis項目?redis的資料結構?redis的key用的什麼字段?redis的資料與mysql資料的映射(mysql資料修改如何映射到redis)?gearman的邏輯?
2.如何觸發同步?create會觸發嗎?
3.除update還能如何觸發同步?
4.mysql表結構的更新會對key-value造成影響嗎?
5.mysql的部署方式?
6.redis的部署?
7.redis高可用?
8.看過redis的配置檔案嗎?
9.redis的資料通路協定?用的什麼用戶端?
10.二進制傳輸為什麼安全?
11.string資料類型的資料結構?如何把它放入redis中?
12.key-value往redis寫的協定
13.測試系統流量跑到多高?平台通路量有多少?redis對mysql的優勢展現?
14.mysql與redis的對比
15.redis優缺點
16、Redis的記憶體淘汰政策
18.redis持久化
1)什麼是Redis持久化?
2)Redis 的持久化機制是什麼?各自的優缺點?
3)如何選擇合适的持久化方式
4)Redis持久化資料和緩存怎麼做擴容?
二、memcache部分
1.tomcat+nginx+jdk+memcache項目介紹
項目背景
項目目的
實驗環境
項目流程
項目中插件簡介
2.cookie與session的差別
3.memcache與redis的相似點與差別
4.memcache高可用
三、CMDB項目
1.項目介紹
項目目的:
項目步驟:
項目中遇到的難點:
1.sqlite與mysql的差別
2.簡述django請求的生命周期?
3.Django 、Flask、Tornado的對比及為什麼使用Django
4.ORM是什麼?優勢?
5.簡述什麼是FBV和CBV
四、ansible自動化部署負載均衡高可用叢集
一、redis部分(基于redis+mysql+gearmand項目)
1.redis在公司還是實驗室?講一下redis項目?redis的資料結構?redis的key用的什麼字段?redis的資料與mysql資料的映射(mysql資料修改如何映射到redis)?gearman的邏輯?
1)redis+mysql+gearmand項目原理:
用redis給mysql做前端緩存,并在mysql更新時用觸發器與gearmand同步至redis
server1(job):安裝nginx+php+gearmand 配置php測試頁面
server2:部署redis
server3(workers):部署mysql與
gearman-mysql-udf
注冊udf函數插件及指定gearman伺服器
定義觸發器
用戶端通過nginx和php通路後端資料庫時,先在redis這個資料庫緩存中查找,看是否含有想要的資料,如果沒有就去後端資料庫查找,将查找到資料傳回給用戶端一份,另外在redis中緩存一份。下次如果通路相同的資料就直接去redis,縮短時間同時也減輕資料庫的查找壓力
2)redis資料結構為string
3)key為字元串
4) redis與mysql的資料映射:
mysql的變更觸發了觸發器 trigger ,然後 json_map插件将變更的資料格式化為json格式便于處理,然後找到 mysql 的 gearman 和 udf 的插件 ,然後找到 gearman(job-server / server1)。 job-server 将任務分發給 worker。worker 與 php-gearman 和 php-redis 通信,将資料同步到server2上的 redis,redis 再發送到用戶端,同時同步到本地緩存。
5)gman的邏輯
用戶端程式把請求送出給gearmand,gearmand會把請求轉發給合适的worker來處理這個請求,最後還通過gearmand傳回結果。
2.如何觸發同步?create會觸發嗎?
create不會觸發 update可以
3.除update還能如何觸發同步?

4.mysql表結構的更新會對key-value造成影響嗎?
5.mysql的部署方式?
1)安裝mariadb-devel
2)編譯使用者自定義函數并拷貝到資料庫的預設插件目錄中
3)注冊udf函數,建立一個json對象,把資料全部映射為json格式,因為json格式可讀性強
4)注冊udf函數插件及指定gearman伺服器
5)定義觸發器
6.redis的部署?
單執行個體
源碼編譯,安裝gcc,編輯配置檔案
檢查配置檔案不為slave 并清除資料避免影響
7.redis高可用?
哨兵模式
Redis Sentinel是Redis官方的高可用性解決方案。
Redis 的 Sentinel 系統用于管理多個 Redis 伺服器(instance), 該系統執行以下三個任務:
監控(Monitoring): Sentinel 會不斷地檢查你的主伺服器和從伺服器是否運作正常。
提醒(Notification): 當被監控的某個 Redis 伺服器出現問題時, Sentinel 可以通過 API 向管理者或者其他應用程式發送通知。
自動故障遷移(Automatic failover): 當一個主伺服器不能正常工作時, Sentinel 會開始一次自動故障遷移操作, 它會将失效主伺服器的其中一個從伺服器更新為新的主伺服器, 并讓失效主伺服器的其他從伺服器改為複制新的主伺服器; 當用戶端試圖連接配接失效的主伺服器時, 叢集也會向用戶端傳回新主伺服器的位址, 使得叢集可以使用新主伺服器代替失效伺服器。
8.看過redis的配置檔案嗎?
https://blog.csdn.net/cristianoxm/article/details/105694128?biz_id=102&utm_term=redis%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%AF%A6%E8%A7%A3&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-105694128&spm=1018.2118.3001.4187
9.redis的資料通路協定?用的什麼用戶端?
RESP協定是二進制安全的,并且不需要處理從一個程序傳輸到另一個程序的塊資料的大小,因為它使用字首長度(prefixed-length)的方式來傳輸塊資料的。
10.二進制傳輸為什麼安全?
“二進制安全”就是說你傳給我的資料的二進制是什麼樣,存在我這裡的就是什麼樣,隻要傳給到我,我肯定保證它在這裡是不會被篡改的。(我不會對這些資料進行再編碼,再序列化)。
Redis 用二進制安全的好處:存和取都按位元組數組來,在這裡沒有類型,不會變化存儲的資料,不會有溢出和覆寫,不會有亂碼問題。
11.string資料類型的資料結構?如何把它放入redis中?
12.key-value往redis寫的協定
13.測試系統流量跑到多高?平台通路量有多少?redis對mysql的優勢展現?
壓測
14.mysql與redis的對比
Redis
基于記憶體,讀寫速度快,也可做持久化,但是記憶體空間有限,當資料量超過記憶體空間時,需擴充記憶體,而記憶體成本較高;
MySQL
基于磁盤,讀寫速度沒有Redis快,但是不受空間容量限制,成本效益高;
mysql+redis的優勢:
MySQL做為主存儲,Redis用于緩存,加快通路速度,提高通路效率。需要高性能的地方使用Redis,不需要高性能的地方使用MySQL。
15.redis優缺點
優點
- 讀寫性能優異, Redis能讀的速度是110000次/s,寫的速度是81000次/s。
- 支援資料持久化,支援AOF和RDB兩種持久化方式。
- 支援事務,Redis的所有操作都是原子性的,同時Redis還支援對幾個操作合并後的原子性執行。
- 資料結構豐富,除了支援string類型的value外還支援hash、set、zset、list等資料結構。
- 支援主從複制,主機會自動将資料同步到從機,可以進行讀寫分離。
缺點
- 資料庫容量受到實體記憶體的限制,不能用作海量資料的高性能讀寫,是以Redis适合的場景主要局限在較小資料量的高性能操作和運算上。
- Redis 不具備自動容錯和恢複功能,主機從機的當機都會導緻前端部分讀寫請求失敗,需要等待機器重新開機或者手動切換前端的IP才能恢複。
- 主機當機,當機前有部分資料未能及時同步到從機,切換IP後還會引入資料不一緻的問題,降低了系統的可用性。
- Redis 較難支援線上擴容,在叢集容量達到上限時線上擴容會變得很複雜。為避免這一問題,運維人員在系統上線時必須確定有足夠的空間,這對資源造成了很大的浪費。
16、Redis的記憶體淘汰政策
Redis的記憶體淘汰政策是指在Redis的用于緩存的記憶體不足時,怎麼處理需要新寫入且需要申請額外空間的資料。
全局的鍵空間選擇性移除
- noeviction:當記憶體不足以容納新寫入資料時,新寫入操作會報錯。
- allkeys-lru:當記憶體不足以容納新寫入資料時,在鍵空間中,移除最近最少使用的key。(這個是最常用的)
- allkeys-random:當記憶體不足以容納新寫入資料時,在鍵空間中,随機移除某個key。
設定過期時間的鍵空間選擇性移除
- volatile-lru:當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,移除最近最少使用的key。
- volatile-random:當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,随機移除某個key。
- volatile-ttl:當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,有更早過期時間的key優先移除。
總結
Redis的記憶體淘汰政策的選取并不會影響過期的key的處理。記憶體淘汰政策用于處理記憶體不足時的需要申請額外空間的資料;過期政策用于處理過期的緩存資料。
18.redis持久化
1)什麼是Redis持久化?
持久化就是把記憶體的資料寫到磁盤中去,防止服務當機了記憶體資料丢失。
2)Redis 的持久化機制是什麼?各自的優缺點?
Redis 提供兩種持久化機制 RDB(預設) 和 AOF 機制:
RDB:是Redis DataBase縮寫快照
RDB是Redis預設的持久化方式。按照一定的時間将記憶體的資料以快照的形式儲存到硬碟中,對應産生的資料檔案為dump.rdb。通過配置檔案中的save參數來定義快照的周期。
優點:
- 1、隻有一個檔案 dump.rdb,友善持久化。
- 2、容災性好,一個檔案可以儲存到安全的磁盤。
- 3、性能最大化,fork 子程序來完成寫操作,讓主程序繼續處理指令,是以是 IO 最大化。使用單獨子程序來進行持久化,主程序不會進行任何 IO 操作,保證了 redis 的高性能
- 4.相對于資料集大時,比 AOF 的啟動效率更高。
缺點:
- 1、資料安全性低。RDB 是間隔一段時間進行持久化,如果持久化之間 redis 發生故障,會發生資料丢失。是以這種方式更适合資料要求不嚴謹的時候)
- 2、AOF(Append-only file)持久化方式: 是指所有的指令行記錄以 redis 指令請 求協定的格式完全持久化存儲)儲存為 aof 檔案。
AOF:持久化
AOF持久化(即Append Only File持久化),則是将Redis執行的每次寫指令記錄到單獨的日志檔案中,當重新開機Redis會重新将持久化的日志中檔案恢複資料。
當兩種方式同時開啟時,資料恢複Redis會優先選擇AOF恢複。
優點:
- 1、資料安全,aof 持久化可以配置 appendfsync 屬性,有 always,每進行一次 指令操作就記錄到 aof 檔案中一次。
- 2、通過 append 模式寫檔案,即使中途伺服器當機,可以通過 redis-check-aof 工具解決資料一緻性問題。
- 3、AOF 機制的 rewrite 模式。AOF 檔案沒被 rewrite 之前(檔案過大時會對指令 進行合并重寫),可以删除其中的某些指令(比如誤操作的 flushall))
缺點:
- 1、AOF 檔案比 RDB 檔案大,且恢複速度慢。
- 2、資料集大的時候,比 rdb 啟動效率低。
AOF與RDB的對比
- AOF檔案比RDB更新頻率高,優先使用AOF還原資料。
- AOF比RDB更安全也更大
- RDB性能比AOF好
- 如果兩個都配了優先加載AOF
3)如何選擇合适的持久化方式
- 一般來說, 如果想達到足以媲美PostgreSQL的資料安全性,你應該同時使用兩種持久化功能。在這種情況下,當 Redis 重新開機的時候會優先載入AOF檔案來恢複原始的資料,因為在通常情況下AOF檔案儲存的資料集要比RDB檔案儲存的資料集要完整。
- 如果你非常關心你的資料, 但仍然可以承受數分鐘以内的資料丢失,那麼你可以隻使用RDB持久化。
- 有很多使用者都隻使用AOF持久化,但并不推薦這種方式,因為定時生成RDB快照(snapshot)非常便于進行資料庫備份, 并且 RDB 恢複資料集的速度也要比AOF恢複的速度要快,除此之外,使用RDB還可以避免AOF程式的bug。
- 如果你隻希望你的資料在伺服器運作的時候存在,你也可以不使用任何持久化方式。
4)Redis持久化資料和緩存怎麼做擴容?
- 如果Redis被當做緩存使用,使用一緻性哈希實作動态擴容縮容。
- 如果Redis被當做一個持久化存儲使用,必須使用固定的keys-to-nodes映射關系,節點的數量一旦确定不能變化。否則的話(即Redis節點需要動态變化的情況),必須使用可以在運作時進行資料再平衡的一套系統,而目前隻有Redis叢集可以做到這樣。
二、memcache部分
1.tomcat+nginx+jdk+memcache項目介紹
項目背景
在交易類的電子商務網站,需要有購物車記錄使用者的購買資訊,使用者每次購買請求都是向購物車中增加商品;在社交類的網站中,需要記錄使用者的目前登入狀态、最新釋出的消息及好友狀态等, 使用者每次重新整理頁面都需要更新這些資訊。而基于 nginx+tomcat+memcache 實作的會話保持則完美解決了這些問題,提升了客戶體驗與運維服務品質。
項目目的
同一用戶端通路業務網站,經過排程器負載排程到達後端,不管選擇的是那個後端,session ID都不變,都儲存在兩台或多台的memcached緩存中(負載備援);以保持會話;用戶端請求時nginx通過負載排程算法将請求排程至某一後端伺服器;并把session存儲到兩台memcached中;用戶端重新整理(不換浏覽器)時,請求換成另一個後端伺服器響應時session ID保持不變;
實驗環境
server1:nginx排程器
server2、server3:安裝tomcat、jdk,編寫test.jsp
項目流程
1.環境:server1:nginx server2 : tomcat 實驗完添加server3:tomcat
編寫test.jsp實作使用者登入資訊頁面。使得nginx将對jsp的通路代理至後端tomcat,隻開啟一個tomcat時,産生的資料會儲存到本地。再實作nginx+tomcat負載均衡。
問題:當開啟兩個tomcat時,由于在負載均衡狀态,受到nginx的排程,server2端送出資料後直接跳到了server3,與之前的建立的session斷開了,再次回來資料就不存在了。
2.重新編譯nginx,加入sticky子產品,避免請求來回跳,資訊丢失。此時隻要通路的server2不挂,資料會一直儲存。
問題:如果server2的tomcat挂掉,那麼server2上的資料依然會丢失,是以我們需要memcache的加入實作session交叉存放,就是将通路server2中的tomcat上的資料存放在sever3中的memcache去,将通路server3中tomcat上的資料存放在server2中。
3.serve2、server3配置session管理器,将tomcat/conf/context.xml,n1改為n2,即将2中的緩存存至3中,反之亦然。開啟memcache,并重新開機tomcat,此時多次登入仍會儲存之前的登入資訊,且當一個服務端挂掉時,另一個服務端會接管并儲存之前的登入資訊在頁面中。
項目中插件簡介
Tomcat 伺服器是一個免費的開放源代碼的Web 應用伺服器,屬于輕量級應用伺服器,在中小型系統和并發通路使用者不是很多的場合下被普遍使用,是開發和調試JSP 程式的首選。
Memcache是一個自由和開放源代碼、高性能、配置設定的記憶體對象緩存系統。用于加速動态web應用程式,減輕資料庫負載。
小米運維開發工程師0903複習資料一、redis部分(基于redis+mysql+gearmand項目)二、memcache部分三、CMDB項目四、ansible自動化部署負載均衡高可用叢集
2.cookie與session的差別
session和cookie的作用有點類似,都是為了存儲使用者相關的資訊。不同的是,cookie是存儲在本地浏覽器,而session存儲在伺服器。存儲在伺服器的資料會更加的安全,不容易被竊取。
3.memcache與redis的相似點與差別
Redis 和 Memcache 都是基于記憶體的資料存儲系統。Memcached是高性能分布式記憶體緩存服務;Redis是一個開源的key-value存儲系統。memcache通過緩存資料庫查詢結果,減少資料庫通路次數,以提高動态 Web 應用的速度、提高可擴充性。
以下為差別
1)資料操作不同。
Memcached基本隻支援簡單的key-value存儲,不支援枚舉,不支援持久化和複制等功能。Redis支援伺服器端的資料操作相比Memcached來說,擁有更多的資料結構和并支援更豐富的資料操作,支援list、set、sorted set、hash等衆多資料結構,還同時提供了持久化和複制等功能。
2)記憶體管理機制不同。
在Redis中,并不是所有的資料都一直存儲在記憶體中的。這是和Memcached相比一個最大的差別。當實體記憶體用完時,Redis可以将一些很久沒用到的value交換到磁盤。Redis隻會緩存所有的key的資訊,如果Redis發現記憶體的使用量超過了某一個閥值,将觸發swap的操作,Redis根據“swappability = age*log(size_in_memory)”計算出哪些key對應的value需要swap到磁盤。然後再将這些key對應的value持久化到磁盤中,同時在記憶體中清除。這種特性使得Redis可以保持超過其機器本身記憶體大小的資料。
而Memcached預設使用Slab Allocation機制管理記憶體,其主要思想是按照預先規定的大小,将配置設定的記憶體分割成特定長度的塊以存儲相應長度的key-value資料記錄,以完全解決記憶體碎片問題。
3)存儲資料安全性不同
memcache挂掉後,資料沒了;redis可以定期儲存到磁盤(持久化),資料丢失後可以通過aof恢複;
4)叢集管理不同
Memcached是全記憶體的資料緩沖系統,Redis雖然支援資料的持久化,但是全記憶體畢竟才是其高性能的本質。作為基于記憶體的存儲系統來說,機器實體記憶體的大小就是系統能夠容納的最大資料量。如果需要處理的資料量超過了單台機器的實體記憶體大小,就需要建構分布式叢集來擴充存儲能力。
Memcached本身并不支援分布式,是以隻能在用戶端通過像一緻性哈希這樣的分布式算法來實作Memcached的分布式存儲。相較于Memcached隻能采用用戶端實作分布式存儲,Redis更偏向于在伺服器端建構分布式存儲。
5)應用場景不同
Redis出來作為NoSQL資料庫使用外,還能用做消息隊列、資料堆棧和資料緩存等;Memcached适合于緩存SQL語句、資料集、使用者臨時性資料、延遲查詢資料和session等。
4.memcache高可用
2015:使用magent代理
出現故障:使用Magent代理Memcache節點出現故障恢複導緻緩存傳回為空,即當master挂了之後再次啟動就會把使用者踢出去,也就是sesson miss。
2018:Repcached
全稱replication cached,日本人高可用技術,簡稱複制緩沖區技術。
使用場景:它是一個單Master單Slave的方案,但它的Master和Slave都是可讀可寫的,而且可以互相同步,并且Master和Slave會自動切換(主變從,從變主自由切換)。如果Master當機,Slave偵測到連接配接斷了,它會自動Listen而成為Master,而如果Slave壞掉,Master也會偵測到連接配接斷了,它就會重新等待新的Slave加入。
優點:
1)能夠實作memcached節點備援備份
2)主從之間可以互相讀寫
缺點:
1)隻支援一主一從備份,單對單
2)備援備份,占用記憶體較多
三、CMDB項目
1.項目介紹
項目目的:
當使用者發起HTTP請求時, Django的采集接口将HTTP請求的頭部資訊headers裡面的IP和UA資訊采集,并存儲到資料庫中。 當使用者想要通路采集資料時, 從資料庫中讀取,以界面的方式展示給使用者。
基于Django架構實作Web形式的自動化運維系統, 遠端控制伺服器, 提高運維工程師的工作品質和效率。
項目步驟:
1.配置settings.py 定義資料庫的資訊(配置mysql資料庫,其中資料庫名字,使用者密碼,其中都需要提前主機中建立好)
2.models.py定義資料庫的結構并生成遷移腳本并寫入資料庫:
内容包括主機ip位址、mac位址、作業系統資訊等等,并定義各個資料類型的資料格式。
指令:
python3 manage.py makemigrations
python3 manage.py migrate
3.建立admin.py管理登入使用者
4.建立views.py(儲存函數或者類的視圖檔案)完成視圖層的建立:
nmap掃描存活主機;
telnetlib判斷ssh服務是否開啟,即是否為linux伺服器;
paramiko實作遠端登入。
5.前端html檔案配置
6.路由檔案配置(主路由調用admin,子路由調用views)
項目中遇到的難點:
1.Linux中使用mysql需要mysqlclient子產品,需安裝mysql-devel這個依賴項才可使用。
SQLITE功能簡約,小型化,追求最大磁盤效率;MYSQL功能全面,綜合化,追求最大并發效率。如果隻是單機上用的,資料量不是很大,需要友善移植或者需要頻繁讀/寫磁盤檔案的話,就用SQLite比較合适;如果是要滿足多使用者同時通路,或者是網站通路量比較大是使用MYSQL比較合适。
2.各個子產品的探索,以及,views編寫的困難,utils的分離
1.sqlite與mysql的差別
性能方面
SQLITE是單機資料庫。功能簡約,小型化,追求最大磁盤效率
MYSQL是完善的伺服器資料庫。功能全面,綜合化,追求最大并發效率
安全方面
SQLite沒有内置的身份驗證機制,任何人都可以通路資料庫檔案。但是,MySQL帶有許多内置的安全功能。這包括使用使用者名,密碼和SSH進行身份驗證。
2.簡述django請求的生命周期?
(1)使用者輸入網址,浏覽器發起請求
(2)WSGI(伺服器網關接口)建立socket服務端,接受請求
(3)中間件處理請求
(4)url路由,根據目前請求的url找到相應的視圖函數
(5)進入view,進行業務處理,執行類或者函數,傳回字元串
(6)再次通過中間件處理相應
(7)WSGI傳回響應
(8)浏覽器渲染
3.Django 、Flask、Tornado的對比及為什麼使用Django
Django:python界最全能的web開發架構,各種功能完善,可維護性金和開發速度一級棒。
Flas:微架構的典範,号稱python代碼寫得最好的項目之一。flask靈活。
Tornado:天生異步,性能強悍,諸多的功能需要自己完善。
1.Django走的是大而全的方向,開發效率高。它的MTV架構,自帶的ORM,admin背景管理,自帶的sqlit資料庫
和開發測試用的伺服器給開發者提供了
超高的開發效率
2.Flask是輕量級的架構,自由,靈活,可擴充性很強,核心基于Werkzeug WSGI工具和jinja2模闆引擎
3.Tornado走的是少而精的方向,性能優越。它最出名的是異步非阻塞的設計方式
4.ORM是什麼?優勢?
什麼是ORM:
ORM(Object-relational mapping),中文翻譯為對象關系映射,是一種為了解決面向對象與關系資料庫
存在的互不比對的現象的技術。簡單的說,ORM是通過使用描述對象和資料庫之間映射的中繼資料,将程式中
的對象自動持久化到關系資料庫中。
優勢:
1)orm的技術特點,提高了開發效,可以自動對實體Entity對象與資料庫中的Table進行字段與屬性的映射;
2) 不用直接SQL編碼,能夠像操作對象一樣從資料庫中擷取資料
5.簡述什麼是FBV和CBV
FBV和CBV本質是一樣的
基于函數的視圖叫做FBV,基于類的視圖叫做CBV
在python中使用CBV的優點:
1)提高了代碼的複用性,可以使用面向對象的技術,比如Mixin(多繼承)
2)可以用不同的函數針對不同的HTTP方法處理,而不是通過很多if判斷,提高代碼可讀性
四、ansible自動化部署負載均衡高可用叢集
ansible 自動化建構系統負載均衡高可用架構 項目描述 : 随着企業資訊化的不斷發展,需要面對越來越複雜的業務和越來越多樣化的使用者需求,自動 化運維工具 ansible 通過自動化運維能最大限度地在更少的維修時間内實作運維目标,提高運維服務質 量。 我的職責: 項目通過為各項服務建立 Ansible roles,實作階層化、結構化地組織 Playbook。建立 Haproxy 角色負載均衡排程後端真實 Nginx 伺服器,Keepalived 角色實作系統排程器的高可用。整個 建構過程拆分為如下過程: 1. Ansible 角色初始化:生成各服務角色的層級目錄檔案,如 tasks,vars,handlers 等。 2. 功能實作:各角色任務(tasks)檔案實作服務的安裝,templates 存放服務配置檔案,handlers 實作 服務的觸發重新開機,vars 實作服務配置的差異性,如 keepalived 服務參數配置。 3. 服務的遠端推送:遠端主機執行腳本實作服務的自動部署, Keepalived 實作在兩台 Haproxy 之間 切換,後端 Nginx 伺服器處理排程器發來的請求。