[TOC]
### 概述
在 MongoDB 中,有兩種數據冗余方式,一種 是 Master-Slave 模式(主從復制),一種是 Replica Sets 模式(副本集)。
```
Mongodb一共有三種集群搭建的方式:
Replica Set(副本集)、
Sharding(切片)
Master-Slaver(主從)【目前已不推薦使用了!!!】
其中,Sharding集群也是三種集群中最復雜的。
副本集比起主從可以實現故障轉移!!非常實用!
MongoDB目前已不推薦使用主從模式,取而代之的是副本集模式。副本集其實一種互為主從的關系,可理解為主主。
副本集指將數據復制,多份保存,不同服務器保存同一份數據,在出現故障時自動切換。對應的是數據冗余、備份、鏡像、讀寫分離、高可用性等關鍵詞;
而分片則指為處理大量數據,將數據分開存儲,不同服務器保存不同的數據,它們的數據總和即為整個數據集。追求的是高性能。
在生產環境中,通常是這兩種技術結合使用,分片+副本集。
```
### MongoDB主從
*****
#### 主從配置
主從復制是[MongoDB](http://lib.csdn.net/base/mongodb)最常用的復制方式,也是一個簡單的[數據庫](http://lib.csdn.net/base/mysql)同步備份的集群技術,這種方式很靈活.**可用于備份,故障恢復,讀擴展**等.?
` `
最基本的設置方式就是建立一個主節點和一個或多個從節點,每個從節點要知道主節點的地址。采用雙機備份后主節點掛掉了后從節點可以接替主機繼續服務。所以這種模式**比單節點的高可用性要好很多**。
?配置主從復制的注意點:
```
1)在數據庫集群中要明確的知道誰是主服務器,主服務器只有一臺.
2)從服務器要知道自己的數據源也就是對應的主服務是誰.
3)--master用來確定主服務器,--slave 和 --source 來控制從服務器
```
` `
master-node.conf
```
port=27017
bind_ip = 182.48.115.238
dbpath=/usr/local/mongodb/data
logpath=/usr/local/mongodb/log/mongo.log
logappend=true
journal = true
fork = true
master = true //確定自己是主服務器
```
slave-node.conf
```
port=27017
dbpath=/usr/local/mongodb/data
logpath=/usr/local/mongodb/log/mongo.log
logappend=true
journal = true
fork = true
bind_ip = 182.48.115.236 //確定主數據庫端口
source = 182.48.115.238:27017 //確定主數據庫端口
slave = true //確定自己是從服務器
```
#### 主從復制的原理
```
在主從結構中,主節點的操作記錄成為oplog(operation log)。oplog存儲在一個系統數據庫local的集合oplog.$main中,這個集合的每個文檔都代表主節點上執行的一個操作。
從服務器會定期從主服務器中獲取oplog記錄,然后在本機上執行!對于存儲oplog的集合,MongoDB采用的是固定集合,也就是說隨著操作過多,新的操作會覆蓋舊的操作!
主從復制的其他設置項
--only 從節點指定復制某個數據庫,默認是復制全部數據庫
--slavedelay 從節點設置主數據庫同步數據的延遲(單位是秒)
--fastsync 從節點以主數據庫的節點快照為節點啟動從數據庫
--autoresync 從節點如果不同步則從新同步數據庫(即選擇當通過熱添加了一臺從服務器之后,從服務器選擇是否更新主服務器之間的數據)
--oplogSize 主節點設置oplog的大小(主節點操作記錄存儲到local的oplog中)
```
>在slave-node從節點的local數據庫中,存在一個集合sources。這個集合就保存了這個服務器的主服務器是誰
### MongoDB副本集(Replica Sets)?
*****
mongodb 不推薦主從復制,推薦建立副本集(Replica Set)來保證1個服務掛了,可以有其他服務頂上,程序正常運行,幾個服務的數據都是一樣的,后臺自動同步。主從復制其實就是一個單副本的應用,沒有很好的擴展性和容錯性。
` `
Replica Set 使用的是 n 個 mongod 節點,構建具備自動的容錯功能(auto-failover),自動恢復的(auto-recovery)的高可用方案。使用 Replica Set 來實現讀寫分離。通過在連接時指定或者在主庫指定 slaveOk,由Secondary 來分擔讀的壓力,Primary 只承擔寫操作。對于 Replica Set 中的 secondary 節點默認是不可讀的。
` `
#### 副本集的結構及原理
副本集包括三種節點:主節點、從節點、仲裁節點:
* **主節點負責處理客戶端請求,讀、寫數據, 記錄在其上所有操作的 oplog**;
* **從節點定期輪詢主節點獲取這些操作,然后對自己的數據副本執行這些操作**,從而保證從節點的數據與主節點一致。默認情況下,從節點不支持外部讀取,但可以設置;
副本集的機制在于主節點出現故障的時候,余下的節點會選舉出一個新的主節點,從而保證系統可以正常運行。
* **仲裁節點不復制數據,僅參與投票**。由于它沒有訪問的壓力,比較空閑,因此不容易出故障。由于副本集出現故障的時候,存活的節點必須大于副本集節點總數的一半, 否則無法選舉主節點,或者主節點會自動降級為從節點,整個副本集變為只讀。因此,增加一個不容易出故障的仲裁節點,可以增加有效選票,降低整個副本集不可用的
風險。仲裁節點可多于一個。也就是說只參與投票,不接收復制的數據,也不能成為活躍節點。
>官方推薦MongoDB副本節點最少為3臺, 建議副本集成員為奇數,最多12個副本節點,最多7個節點參與選舉。限制副本節點的數量,主要是因為一個集群中過多的副本節點,增加了復制的成本,反而拖累了集群 的整體性能。 太多的副本節點參與選舉,也會增加選舉的時間。而官方建議奇數的節點,是為了避免腦裂 的發生。
` `
##### 如何選舉主庫
MongoDB 的副本集不同于以往的主從模式:自動故障轉移
` `
**影響選舉的因素和條件**
以下因素都會決定一個從庫能否成為主庫。
* **心跳**:副本集成員每 2 秒發送一次心跳(pings),如果心跳在 10 秒內沒有返回,則其它成員將其標記為不可訪問。每個節點內部都會維護一個狀態映射表,表明當前每個節點是什么角色、日志時間戳等關鍵信息。如果是主節點,除了維護映射表
外還需要檢查自己能否和集群中內大部分節點通訊,如果不能則把自己降級為secondary只讀節點。
* **優先級**:其它成員更愿投票給 priority 值高的。
* Priority 為 0 的不能成為 primary 也不會尋求選舉
* 只要當前主節點具有最高優先級值,或者沒有具有較高優先級的輔助節點在該集合中的最新 oplog(操作日志)條目的 10 秒內,副本集就不會保持選舉。
* 如果優先級較高的成員在當前主節點的最新 oplog 條目的 10 秒內趕上,則該集合保持選舉,以便為優先級較高的節點提供成為主節點的機會。
* **Optime**:時間戳比較老的不能成為 primary。
* **Connections**:如果大多數副本集不可訪問或不可用,則所有剩余成員變為只讀。何為大多數?例如 3 個副本集中 2 個為大多數,5 個副本集中有 3 個為大多數。選舉需要時間,在選舉的過程中,副本集由于沒有 primary,不能接受寫入,所有剩余成員都變為只讀。
` `
##### 選舉過程
整個選舉過程其實非常快,對用戶來說幾乎是透明的。以下步驟為具體選舉步驟。
1. 得到每個服務器節點的最后操作時間戳。每個 mongodb 都有 oplog 機制會記錄本機的操作,方便和主服務器進行對比數據是否同步還可以用于錯誤恢復。
2. 如果集群中大部分服務器 down 機了,保留活著的節點都為 secondary 狀態并停止,不選舉了。
3. 如果集群中選舉出來的主節點或者所有從節點最后一次同步時間看起來很舊了,停止選舉等待人來操作。
4. 如果上面都沒有問題就選擇最后操作時間戳最新(保證數據是最新的)的服務器節點作為主節點。
` `
##### 選舉觸發條件
正常情況下不會觸發選舉,如有以下條件之一則會出觸發選舉。
1. 初始化一個副本集時。
2. 副本集和主節點斷開連接,可能是網絡問題。
3. 主節點掛掉。
` `
##### 如何降級為 Standalone 模式
有些場景例如核心業務從 MongoDB 下架等,則可以從副本集模式降級為 Standalone 模式。
1. 注釋掉`replicaSet`參數。
2. 刪除數據庫目錄下的`local.*`文件(注意刪除操作必須在 MongoDB 停止服務的情況下進行)。
***注意**:當切換回 Standalone 模式下時所做的任何事情都是沒有 oplog 的,這意味著當再次回到 Replica Set 模式中時會丟失部分數據(直接使用 SECONDARY 未經過刪除`local.*`文件的原配置啟動),此時MongoDB 會報錯,此處是個坑。所以這個時候得重新搭建副本集。*
` `
##### 將 Standalone 模式轉化為副本集模式
項目前期對于 MongoDB 的要求沒有那么高,隨著業務的增長,發現項目對 MongoDB 的可靠性要求越來越高,此時可以將 MongoDB 切換為副本集模式。
1. 關閉 mongodb 實例。
2. 配置 replSet 參數以及生成配置 keyFile 。
3. 連接到 mongodb。
4. 初始化,增加成員。
` `
##### 數據同步
```
副本集同步分為初始化同步和keep復制。初始化同步指全量從主節點同步數據,如果主節點數據量比較大同步時間會比較長。而keep復制指初始化同步過后,節點
之間的實時同步一般是增量同步。初始化同步不只是在第一次才會被處罰,有以下兩種情況會觸發:
1)secondary第一次加入,這個是肯定的。
2)secondary落后的數據量超過了oplog的大小,這樣也會被全量復制。
```
` `
相對于傳統主從模式的優勢:
```
傳統的主從模式,需要手工指定集群中的 Master。如果 Master 發生故障,一般都是人工介入,指定新的 Master。
這個過程對于應用一般不是透明的,往往伴隨著應用重 新修改配置文件,重啟應用服務器等。
而 MongoDB 副本集,集群中的任何節點都可能成為 Master 節點。一旦 Master 節點故障,則會在其余節點中選舉出一個新的 Master 節點。
并引導剩余節點連接到新的 Master 節點。這個過程對于應用是透明的。
```
>一個副本集即為服務于同一數據集的多個 MongoDB 實例,其中一個為主節點,其余的都為從節點。主節 點上能夠完成讀寫操作,從節點僅能用于讀操作。主節點需要記錄所有改變數據庫狀態的操作,這些記錄 保存在 oplog 中,這個[文件存儲](https://cloud.tencent.com/product/cfs?from=10680)在 local 數據庫,各個從節點通過此 oplog 來復制數據并應用于本地,保持 本地的數據與主節點的一致。**oplog 具有冪等性,即無論執行幾次其結果一致**,這個**比 mysql 的二進制日 志更好用**。
` `
#### 副本集的搭建
*****
* OS: CentOS 7 64 位。
* Software: 采用的`mongodb-linux-x86_64-4.0.10`二進制包。
* 準備三臺虛擬機:mg1(primary)->10.0.4.23,mg2(secondary)->10.0.4.64,mg3(secondary)->10.0.4.33。
` `
##### 配置副本集
建立三個成員的副本集,首先你得建立三個數據庫的存放目錄:
```
mkdir -p ./sd01 ./sd02 ./sd03
```
然后我們啟動三個副本集成員,其中`replSet`參數后面跟的是副本集的名稱,將需要有關聯的成員的副本集名稱要一致:
```
mongod --dbpath ./s01 --port 27017 --replSet s0
mongod --dbpath ./s02 --port 27018 --replSet s0
mongod --dbpath ./s03 --port 27019 --replSet s0
```
創建仲裁者也同樣非常簡單,建立一個空的數據目錄,然后和其他副本集成員一樣設置同樣的副本集名稱啟動,最后通過`rs.add`方法的第二個參數設置為`true`:
```
mongod --dbpath ./replDb/s5 --port 27020 --replSet s0
mongod --port 27017 --host localhost
> rs.add('localhost:27020', true);
```
然后通過Mongo Shell進入到端口為27017的成員中,并配置副本集:
```
mongod --port 27017 --host localhost
```
進入到Mongo Shell后通過`rs.initiate`方法來配置副本集:
```
> var conf = {
_id: 'r0',
version: 1,
members: [
{
_id: 0,
host: 'localhost:27017'
},
{
_id: 1,
host: 'localhost:27018'
},
{
_id: 2,
host: 'localhost:27019'
},
{
_id: 3,
host: 'localhost:27020'
}
]
};
> rs.initiate(conf);
```
`initiate`接受一個對象,對象`_id`為副本集名稱,必須和啟動副本集設置的一致才能添加進來(本例為`rs0`)。`version`為版本號,每當我們修改副本集配置的時候這個版本號都會遞加1,而`members`則為副本集成員,我們可以在這里一次性添加完,也可以只添加一個后面再通過`add`方法添加,比如下面這樣:
```
> rs.add('localhost:27018');
> rs.add('localhost:27019');
```
` `
##### 刪除副本集
刪除副本集通過`rs.remove`方法來刪除,它接受一個`<localhost>:<port>`這樣的字符串。下面是刪除一個副本集成員:
```
> rs.remove('localhost:27019');
```
方法二:
```
cfg = rs.conf()
cfg.members[0].host = "你的IP 或者域名"
rs.reconfig(cfg)
```
` `
##### 查詢副本集配置
查看副本集配置是通過`rs.conf`方法查詢,返回包含所有副本集的配置內容.
```
> rs.conf();
```
` `
##### 查詢主節點
每當使用`rs.add`方法添加成員的時候可能會影響選舉來選擇主節點是誰,查看主節點通過`rs.isMaster()`方法來查看。
```
> rs.isMaster();
```
返回的內容中有幾個可以了解
```
{
"hosts" : [ //副本集成員
"localhost:27017",
"localhost:27018",
"localhost:27019"
],
"setName" : "rs0", //副本集名稱
"setVersion" : 3, //副本集配置版本
"ismaster" : true, //是否是主節點
"primary" : "localhost:27017", //主節點成員的主機地址
"me" : "localhost:27017", //當前所在主機
}
```
` `
##### 讀取副節點
副節點默認是無法讀取的,我們可以通過`rs.setSlaveOk()`方法來設置Slave屬性為true。下面是設置端口為27018的副節點可以進行讀取
```
mongod --port 27018 --host localhost
> rs.setSlaveOk();
```
` `
##### 隱藏成員
隱藏成員通過設置成員的`hidden`屬性為`true`并且優先值`priority`為0則可以隱藏此成員,隱藏成員不能當主節點也不能當其他成員的復制源
```
> rs.add({
> _id: 1,
> _host: 'localhost:27017',
> hidden: true,
> priority: 0
> })
```
` `
##### 延遲復制
通過設置成員的`slaveDelay`的值并且優先值`priority`為0,來讓當前成員滯后多少秒后才開始復制數據。
```
> rs.add({
> _id: 1,
> _host: 'localhost:27017',
> slaveDelay: 120,
> priority: 0
> })
```
` `
##### 索引管理
通過成員的`buildIndexes`的值并且優先值`priority`為0,來設置是否在備份機器上建立相同的索引,一般這個選項只用于純粹備份的服務器。
下面的代碼設置添加的副本集成員不創建索引。
```
> rs.add({
> _id: 1,
> _host: 'localhost:27017',
> buildIndexes: false
> priority: 0
> })
```
` `
- Unity3D
- Unity3D學習路線
- U3D基礎
- UGUI
- 數據結構和算法
- 算法時間復雜度
- 二叉樹
- B樹 & B+樹
- 紅黑樹
- 跳躍表
- Lecod算法題目
- C++-排序算法
- sort排序
- 冒泡排序
- 選擇排序
- 插入排序
- 快速排序
- 希爾排序
- 堆排序
- 歸并排序
- 遞歸算法
- LSMs和B tree
- mysql引擎
- 匯編程序
- 匯編入門 Hello World
- 匯編語言整數加減法
- 寄存器的使用和說明
- 匯編語言常用知識點
- 匯編語言中的幾個偽指令
- 匯編語言數據類型以及數據定義
- 匯編語言計算數組和字符串長度
- 匯編語言中寄存器加[]的意思
- 匯編語言中$符號的用法
- 匯編語言系統調用(System Calls)
- 匯編語言push和pop指令
- 匯編語言尋址操作
- 匯編語言進階
- GNUx86-64匯編
- C/C++調用匯編函數
- 用匯編理解C函數的調用過程和返回值
- 從匯編的角度看C++
- C/C++
- C++-編程入門
- C/C++環境搭建
- JsonCPP的使用
- 連接數據庫
- 連接mysql
- connector
- C API
- 連接sqlite3
- 使用sqlite3步驟
- 使用Clion
- thread-多線程
- 初識thread
- detach陷阱
- 事實
- 陷阱總結
- 剪切板操作
- 剪切板基本操作
- 剪切板詳細api
- 文件操作
- 桌面右鍵菜單批處理
- Resource Hacker
- 獲取指定輸入法
- 學習網站
- C++11中的匿名函數(lambda函數,lambda表達式)
- sleep和usleep的區別
- 使用std::unique_ptr 管理 FILE 指針
- typedef的用法
- strtuct中的char*和char數組
- 各個平臺不同類型占用字節數
- C++進階
- C++淺拷貝和深拷貝的區別
- C++類型強制轉換
- C++11寫的定時器
- C調用java函數
- C++11 特性
- 二進制兼容
- GDB的基礎命令
- GDB調試死鎖
- 核心底層代碼
- 線程池的實現
- 線程池的應用場景
- C++協程庫
- C++定時器原理
- 通信協議
- Socket5協議
- https 協議
- TCP-擁塞控制
- C++-STL
- map/unordered_map/hash_map區別
- 初始化vector
- STL算法
- Effective STL
- 條款5:盡量使用區間成員函數代替它們的單元素兄弟
- 條款9:在刪除選項中仔細選擇
- 條款13:盡量使用vector和string來代替動態分配的數組
- 條款14:使用reserve來避免不必要的重新分配
- 條款16: 如何將vector和string的數據傳給遺留的API
- 條款17:使用“交換技巧”來修整過剩容量
- 條款18:避免使用vector<bool>
- 條款30:確保目標區間足夠大
- 編輯器
- VS Code
- 配置C++
- 命令行編譯
- CMake
- CMake 升級
- cmake-基本操作
- 設置入口
- 修改vs運行時庫
- CMake生成sln
- CMake設置輸出目錄
- CMake添加GDB調試
- 使靜態庫和動態庫同時存在
- C/C++網絡編程
- 網絡基礎
- 5種網絡IO模型總結
- 條件變量
- 設置阻塞socket超時時間
- ccnet
- 一個reactor單線程庫
- ccnet從單線程轉變為多線程
- IO多路復用
- IO多路復用的理解
- EPOLL
- select示例代碼
- epoll 示例代碼
- iocp示例代碼
- muduo庫
- muduo編譯
- Libevent的簡單使用
- 編譯libevent
- Libevent幾個簡單的api
- Libevent 定時器
- Libevent通用的編程技法
- Libevent簡單的Server/Client
- Boost庫學習
- Boost庫編譯
- 利用Boost 實現線程池
- boost::asio
- boost::mutex
- Boost解析Json
- Boost.Asio的一些想法
- win32t網絡編程
- 簡單的c/s socket通信
- 回響
- 迭代服務器跟客戶端
- 進行類創建
- socket文件傳輸
- 簡單的udp
- Reactor模型與Proactor模型
- Actor和CSP模型
- 大量的timewait
- EPOLL的bug
- C++-界面
- MFC
- mfc小知識
- MFC呂鑫
- 初識mfc
- 初始化
- 消息映射
- 組合鍵 與(&)運算
- WIN32+MFC自定義消息
- 對話框的相關消息
- DestroyWindow
- GDI
- 初窺
- 坐標
- 創建畫筆
- CDC
- CPaintDC
- CPen
- CBursh
- CFont
- CBitmap
- LoadImage
- CMemDC
- 自適應
- 雙緩沖問題
- 閃爍問題
- 小型軟件開發
- 記事本
- 圖形架構軟件
- 提綱圖形
- 操作
- 重載關閉按鈕
- 自定義消息
- 自繪按鈕
- 自繪基礎知識
- 自繪按鈕提綱
- 步驟
- 自會下拉列表
- 自繪下拉列表
- 自繪菜單欄
- MFC函數類
- SetTimer
- 高級控件應用
- 高級控件開發提綱
- 菜單欄
- 網絡通信協議
- 提綱
- sizeof====strlen
- 堆 == 棧
- Socket
- 基本代碼
- UDP協議
- Win32
- 窗口操作
- 創建窗口,自定義按鈕
- 給按鈕加背景圖
- 給窗口加背景
- 貼圖
- DLL組件創建
- HOOK鉤子
- MinGW
- duilib
- 地址
- 屬性列表
- 第一個duilib項目
- DUI自帶的完整
- ListControl
- TreeView
- 重設窗口大小
- 計算DPI
- HandleMessage跟MessageHandle
- CEF
- cef環境搭建
- cefsimple簡單流程
- 優化CEF
- P2P
- stun搭建
- QT5
- QT5環境安裝
- QT信號與槽的概念
- QT工程CMakeLists.txt文件的編寫
- QT32位
- libShadowQT
- GoflywayQT
- 計劃
- Protocol Buffer
- ProtoBuf安裝
- 包管理器
- vcpkg
- conan
- xmake
- C++面試總結
- 基礎
- 分布式鎖
- C++重載、覆蓋與多態性
- 20道必須掌握道C++面試題
- 傳值、傳地址、傳引用總結
- 50道面試題 (1)
- 50道面試題 (2)
- 內聯函數的作用以及使用限制
- vector的resize用法
- 虛函數/虛表/虛基類
- 公司面試
- 面試:簡單算法題目
- 面試:GetMemory
- 2021-3/11號面試記錄(lihe)
- leetcode
- leetcode331-驗證二叉樹的前序序列化
- leetcode141. 環形鏈表
- C/C++程序員面試秘籍
- 鏈表
- 使用C/C++實現atoi和itoa函數
- mysql面試題
- 協程解析
- 協程解析一(ucontext解析)
- 協程解析二(云風的coroutine)
- 進程、線程、協程
- 自己制作一個協程庫
- C語言中兩個指針間的運算
- Windows中一些宏的含義
- C++書籍在線觀看
- 安裝TeamTalk
- Lua和C/C++互相調用
- android環境配置
- TCP/IP
- 三次握手四次揮手
- 有限狀態機
- 游戲開發
- UE4
- 開發一個fps的游戲
- 環境安裝,讓人物跑起來
- 增加血條和護甲
- 再生盔甲和傷害功能
- 最后一戰
- 最后一戰安裝部署
- 登錄流程 LS & BS & CS
- 最后一戰-游戲場景服務器SS
- 降臨
- 降臨安裝部署
- skynet
- skynet安裝部署
- lua-protobuc庫--skynet使用自定義protobuf
- pbc庫--skynet使用自定義protobuf
- 掃雷
- 仙劍奇俠傳
- 爐石傳說
- unity環境搭建
- 尋路算法
- 音視頻
- WebRTC
- webrtc源碼下載
- webrtc 編譯
- gn和ninja文件作用
- webrtc 源碼目錄結構
- WebRTC實時互動入門
- web 服務
- nodejs 搭建http服務
- nodejs 搭建https服務
- webrtc 獲取音視頻設備
- webrtc 音視頻采集
- webrtc 音視頻約束
- webrtc 瀏覽器視頻特效
- webrtc 從視頻中獲取圖片
- webrtc 只采集音頻數據
- webrtc MediaStream和獲取視頻約束
- webrtc 媒體流的錄制
- webrtc 捕獲桌面
- webrtc 信令服務器
- webrtc 傳輸基本知識
- webrtc NAT
- webrtc ICE
- webrtc 媒體能力協商
- webrtc 端到端鏈接的基本流程
- webrtc SDP
- webrtc STUN/TURN
- webrtc 客戶端信令消息
- webrtc 視頻通話實現
- webrtc 傳輸速率控制
- webrtc 統計信息
- webrtc IOS
- Kamailio
- webrtc的分析
- Webrtc音視頻會議之Mesh/MCU/SFU三種架構
- RTSP / RTP / RTCP協議
- RTMP / RTSP / WebRTC之間的關系
- webrtc源碼
- PeerConnection解析
- FFmpeg
- FFmpeg命令行的使用
- ffmpeg命令語法
- FFmpeg設備采集
- FFmpeg生成水印
- FFmpeg畫中畫和視頻多宮格
- FFmpeg定時截圖
- FFmpeg基本概念
- FFmpeg基本模塊
- ffmpeg 濾鏡處理
- ffmpeg流的指定
- FFmpeg相關api
- 基本函數
- 打印音視頻信息
- 抽取音視頻數據
- 捕捉攝像頭并推流
- FFmpeg拉流截圖
- vs2017編譯錯誤
- 自定義跨平臺FFmpeg播放器
- ffmpeg拉流并且使用qt
- ffmpeg讀取攝像頭并且推流
- ASS和SRT字幕有何區別
- 解決ffmpeg 在avformat_find_stream_info執行時間太長
- sws_getContext()處理AV_PIX_FMT_NONE 幀格式引起的core dump
- OWT系列
- owt-server
- owt-server 編譯運行
- owt-server模塊
- owt-client-javascript解析
- owt-client-android
- owt-android編譯運行
- owt-client-android系列分析
- owt-conference
- Licode
- licode安裝
- licode 系列
- basic example client
- basic example server
- 音視頻基礎概念
- 視頻播放中的碼率的概念
- 幀率
- nginx-rtmp 模塊搭建與使用
- RTMP分析
- RTMP規范
- RTMP流媒體播放過程
- 一段簡單的CMakeLists.txt
- Go
- Go Base
- Go 環境安裝
- mod
- Go 流程控制
- interface convert to string/int/float64
- Go mod拉取私有倉庫
- VSCode配置go環境
- Go 設置代理
- Viper讀取配置文件
- vim打造成go的ide
- Go 交叉編譯
- GO 簡單功能
- Golang發起http請求
- Go 定時任務
- websocket協議
- Golang的定時器
- JWT認證
- Google Protobuf 請求參數為空的案例
- Go文件下載
- Go 服務熱更新方案
- Go 靜態服務器
- gocolly的使用
- golang中獲取字符串長度的幾種方法
- hugo搭建靜態博客
- go利用reids實現分布式鎖
- Go 代理
- Go 簡單http代理
- Go SS代理流程
- Go AES加密和解密的三種模式實現(CBC/ECB/CFB)
- Go 負載均衡
- Go 標準庫
- reflect.Type和reflect.Value
- container & list & ring & heap
- Context
- http 請求
- Go base64
- Go struct <=> json
- Go切片合并
- Go 包的使用
- pprof包的使用
- Go Grpc
- ymal 配置文件
- 日志包 logrus / zap
- Go 命令行多指令操作
- Cobra/viper 命令行解析
- Go sync/atomic
- zap日志
- Go 進階
- Go sync.Mutex詳解
- 使用自定義頭和protobuf解決沾包問題
- 使用 build tag 來自定義構建配置
- 使用valgrind檢測程序是否內存泄露
- Go參數傳遞是值傳遞還是引用傳遞
- Go 切片/數組
- Channel的使用
- Go Interface詳解
- GO-IM系統
- IM架構
- Go搭建一個http服務器
- mattermost-server
- matter編譯部署
- mattermost配置
- matter詳解
- Goim
- Centrifugo
- Tinode
- cgo入門
- GO語言中使用C語言
- reflect.StringHeader和reflect.SliceHeader
- Cgo使用libevent庫實現一個定時器
- cgo遍歷C結構體數組
- Go和C之間的類型轉換
- Elasticsearch
- Elasticsearch安裝
- etcd的使用
- etcd 安裝
- Docker
- Docker 安裝部署
- 修改Docker鏡像源
- 使用Dockerfile構建部署項目
- 使用Dockerfile多階段構建
- Dockerfile指令解析
- Volume
- 創建一個images
- Docker容器管理
- Shipyard
- Portainer
- lazydocker-docker 終端ui管理
- Docker 容器-ssh登錄
- Dockerfile CMD啟動命令
- Docker 容器獨立ip
- 清理 Docker文件
- Docker-Composer
- Docker遠程訪問
- Docker 遠程訪問API設置
- Docker 結合IDEA使用
- Docker 使用錯誤
- Docker鏡像瘦身
- Docker查看退出碼 exitCode
- Docker安裝寶塔
- Docker創建calibre-web
- Docker不能使用gdb調試的解決方案
- k8s
- K8s安裝部署
- 安裝部署coreDNS
- web管理之一 Dashboard
- dashboard的yaml文件
- 集群監控 heapster
- 資源監控 metrics
- web管理之二 Prometheus
- idea k8s插件
- 第一個 k8s應用
- k8s將pod在master上運行
- k8s網絡通信模型
- Deployment和Pod區別
- Statefulset的基本使用
- k8s的持久化存儲 PersistentVolume
- Ingress基本用法
- k8s錯誤處理
- 角色權限
- busybox k8s的調試工具
- nfs的安裝和使用
- Kafka
- kafka介紹
- Redis
- Redis的安裝
- Redis主從配置
- Redis數據類型
- Redis-Set
- Redis-Hash
- Redis設計與實現
- 第一節:sds
- 第二節:鏈表的實現
- 第三節:字典的實現(一) - 基本原理
- 第四節:字典的實現(二) - 哈希算法
- 第五節:字典的實現(三) - 哈希沖突解決方案
- 第六節:字典的實現(四) - rehash原理
- 第七節:跳躍表
- 第七節:整數集合
- 第八節:壓縮列表
- 第九節:對象
- 總結
- Redis源碼分析
- 配置VScode調試Redis源碼
- VScode調試Redis源碼,指針顯示的問題
- Redis模塊概述
- Redis的五個數據類型
- sds字符串分析
- adlist分析
- ziplist壓縮列表
- quicklist
- dict字典--hashtable
- zskiplist-跳躍表
- sparkline微線圖
- Redis源碼的一些基礎知識總結
- 在redis中遇見redisObject struct
- acl庫編寫Redis客戶端
- hireids操作
- 當內存耗盡時,redis怎么做
- 如何保證redis的高并發及高可用?
- 使用redis實現分布式鎖
- Redis管道技術測試
- MongoDB
- MongoDB安裝
- MongoDB免安裝版
- Mongodb C Driver驅動安裝
- MongoDB知識點
- MongoDB基礎
- MongodB原子操作
- MongoDB索引
- MongoDB主從/副本集
- MongoDB分片集群
- MongoDB性能檢測
- MongoDB構建模式
- Mongo-cxx-driver
- mongo-c-driver
- MongoDB用戶操作
- MySQL
- MySQL安裝
- 一個機器多個MySQL
- 創建遠程鏈接
- 字段編輯
- 存儲過程
- MySQL嚴格模式
- Mysql 丟失Root密碼
- 中國全省市表
- 高性能MySQL
- MySQL并發控制
- MySQL基準測試
- MySQL服務器性能剖析
- MySQLSchema與數據類型優化
- MySQL創建高性能索引
- MySQL復制
- MySQL-高可用
- MySQL引擎
- DB
- Oracle
- ORACLE9i安裝
- Oracle存儲過程
- Oracle 存儲過程基礎組件
- Oracle存儲過程示例
- Other Language
- Python
- python編程通用概念
- python安裝
- pycharm-docker調試
- Python安裝AES加密
- python安裝pip
- 錯誤
- py框架
- Django
- 開始一個項目
- 路由
- 模型層
- 創建博客文章模型
- Django Shell
- 初識Django Admin模塊
- 實現博客數據返回頁面
- 初始Django視圖與模板
- boot靜態頁面
- django分頁
- Django設置
- djangocms
- 語言特性
- 切片
- PHP
- php外部擴展
- 添加C擴展
- 添加外部C擴展
- 添加redis
- redis
- 下載
- 封裝
- 外部訪問配置
- redis基本操作
- 框架
- TP5
- Model
- 自動寫入時間戳
- Laravel
- 安裝
- TP3.2
- CACHE緩存
- create
- curl
- 文件下載
- 模塊名字
- 常用工具
- 功能代碼
- 檢測磁盤剩余空間
- 靜態類
- 消除html標簽
- 檢測手機號
- 毫秒 == 日期格式
- jQuery
- 找子元素
- php網絡編程
- socket
- socket_server.php
- socket_client.php
- websocket
- websocket_server.php
- websocket_client.html
- websocket_unit.js
- swoole
- 環境依賴及安裝
- 搭環境
- windows搭建apache+php7
- nginx做成服務順便配置php
- Lua
- Lua環境安裝
- lua api
- lua_pop & lua_settop
- lua_next
- JAVA
- Java通用編程概念
- Java環境安裝
- 編譯遇到的問題
- 請求接口
- java變量類型
- Android
- IDEA 配置 gradle
- Rust
- Rust編程通用概念
- Rust安裝
- 更換crates源
- 寫一個hello world
- 變量可變性
- 數據類型
- Struct+方法語法
- 賦值
- tokio網絡框架
- tokio安裝
- EchoServer
- 實現Future
- 組合器
- shadowsocket-rust
- shadowsocket-rust安裝
- Scheme
- 環境搭建及基本語法
- JavaScript
- NodeJs
- React
- React-Native
- 使用pkg打包
- Nginx
- Nginx-反向代理
- OpenResty初探
- OpenResty做一個postman
- lua沒有continue
- nginx 配置靜態服務器
- 將luarocks整合進openresty,并安裝lfs
- Git
- GitHub基本操作
- Github跟本地的配置和操作
- GitHub搜索
- Github鏡像
- git修改遠程倉庫
- Git基本操作
- 安裝gitlab
- VC工程的.gitignore
- Git 設置代理
- Git克隆部分文件
- Linux
- 用戶操作
- 防火墻操作
- 壓縮
- Linux時間同步
- CURL
- Linux samba文件共享
- 使用cat創建新文件并追加內容
- htop / glances / dstat
- IPC錯誤
- nc的使用
- 核與線程 CPU 4核8線程 的解釋
- Linux 使用 MLDonkey 下載 ed2k
- Linux技巧
- LINUX技巧-查找文件行中值重復的行
- tcpdump 抓包
- 日志查找
- nethogs 查看網絡流量
- 系統中加入庫目錄
- 將root權限的文件改為用戶權限
- linux 打開文件數 too many open files 解決方法
- 查看系統CPU/GPU/磁盤io
- 快速刪除大量文件的方法
- Linux-文件傳輸
- 安裝 nvidia 驅動
- 改造VIM
- 通過vimplus項目一鍵配置vim
- 自定義vim配置C++IDE
- 終端配色
- VIM+項目管理
- vimplus快捷鍵
- 自動切換輸入法
- Shell編程
- shell腳本守護進程
- if [ $# -eq 0 ]該語句是什么含義?
- 從命令行提示輸入,和自動輸入,自動交互
- grep指令
- cut指令
- awk指令
- xargs
- 使用except自動交互
- Ubuntu
- 界面安裝
- 更換源
- Ubuntu安裝docker
- Ubuntu18 安裝qt
- 更新密鑰
- Ubuntu開啟遠程登錄
- Ubuntu16.04界面無法啟動
- apt-get install 沒有自動安裝
- dpkg: 處理軟件包 nginx (--configure)時出錯
- ubuntu下瀏覽器使用代理
- Ubuntu把放大縮小按鈕移動到左邊
- wine 安裝錯誤
- Ubuntu下安裝Microsoft to do
- 在Ubuntu上使用ssh連接另外一臺機器出問題
- 解決windows和ubuntu16.04虛擬機拖放問題
- 解決apt-get /var/lib/dpkg/lock-frontend 問題
- Ubuntu安裝cinnamon
- sudo apt-get update錯誤
- googlechrome
- Ubuntu16.04安裝xmind
- Ubuntu下載迅雷
- Linux護眼寶
- 查看Ubuntu安裝的界面
- 使用aria2
- CentOS7使用yum安裝gcc
- System
- MAC
- 安裝軟件
- mac基本操作
- 安裝pod
- 改造終端
- VIM配置
- Chroom瀏覽器https訪問
- mac攝像頭打不開
- Mac與Windows或Linux的鍵鼠共享神器Synergy
- Windows
- 小工具
- bat文件的使用
- bat把exe文件做成單擊右鍵可運行的
- copy
- 注冊 dll
- 鏡像==分區
- choco
- BaiduPCS-go
- tail日志查看命令
- 右鍵菜單沒有選項
- Proxy SwitchyOmega
- Google云服務器配置
- 百度網盤不限速
- 遠程桌面
- 百度地圖離線開發
- 查看端口
- SC命令使用
- 開發
- TIME_WAIT過多導致服務不能被訪問
- 修改win的默認編碼
- 百度網盤二維碼刷新不出來
- 移動端
- Object-C
- 錄音跟播放
- 視頻的采集跟播放
- Swift
- Swift編程通用概念
- Switf環境安裝
- Swift Package Manager(SPM)
- 手動導入庫
- PerfectTemplate的使用
- PerfectTemplate環境搭建
- ios直播開發
- Simple-RTMP-Server
- Mac上安裝ffmpeg環境
- 推流拉流
- 仿直播app開發
- 框架搭建
- 開發流程
- React-Native
- React-native環境安裝
- 分布式追蹤系統
- Jaeger 客戶端庫
- LightStep 的使用
- 軟件
- PhpStorm
- 安裝ThinkStrom
- 添加xdebug
- Clion
- C++開發配置
- 激活碼
- 在linux上制作桌面圖標
- Vagrant
- VMWare
- VirtualBox
- proxifier + Shadowshocks
- Cmder
- Navicate For MongoDB
- MinDoc
- GitHub速度慢
- 科學
- VMware虛擬機磁盤操作占用過高問題
- PhotoShop+Premiere下載
- ActionView安裝部署
- 讀書筆記
- 博客
- hexo
- 部署
- jekyll
- 在線編譯器
- 書屋
- 如何閱讀一本書
- 個人發展
- Linux高性能服務器讀書筆記
- TCP/IP協議族
- IP協議
- TCP協議詳解
- TCP協議的擁塞控制
- 安全測試
- 常見web安全漏洞
- 程序設計
- log日志設計
- 爬蟲項目
- Python3.7的安裝
- Scrapy的安裝和使用
- Colly框架
- Crawlab是一款款里爬蟲的web框架
- 英文學習