keepalived源碼
1. java培訓學什麼
java培訓主要的內容有下邊的幾個階段:
第一階段:java基礎
本階段除了JavaSE中要求大家必會的java基礎知識外,重點加強了數據結構思想、集合源碼分析、jdk9-11新特性的學習。
第二階段:資料庫
本階段主要學習Mysql資料庫知識,通過層層遞進,讓大家掌握開發使用的數據是如何存儲和處理的。並且逐步深入學習到索引和優化、鎖機制、存儲過程等。
第三階段:web網頁技術
本階段以項目案例為驅動,採用所學即所用的方式指導大家學習,在邊學邊練過程中,可深入掌握Web開發技術,具備與之匹配的實戰能力。
第四階段:框架學習
本階段主要是學習市面上流行的框架技術來提升自己的開發能力,再輔以linux命令以及Linux伺服器的使用等內容讓新手學到技術,讓老手學到思想,讓高手學到境界。
第五階段:互聯網高級技術
主要講解分布式管理系統、Keepalived+Nginx主備、微服務架構技術、消息中間件技術、MySQL調優、高並發技術、性能優化、內存和GC等。
第六階段:企業項目
本階段主要是通過讓學員學習企業流行的項目,在動手實操的過程中加深前面知識的認識,並且增加學員企業項目開發經驗。
2. Keepalived+Nginx+Memcached構架高可用
假設場景:
web應用伺服器1 : 192.168.21.21:8001
web應用伺服器2 : 192.168.21.22:8001
需要虛擬出IP:192.168.21.201:8805
解決方案:
在web1和web2上部署同樣的兩套應用程序,埠號都為8001.
在web1和web2上部署nginx,nginx使用集群方式,將請求到的8805埠分發到集群伺服器上。
在web1和web2上部署keepalived,keepalived配置虛擬ip:192.168.21.201
在web1和web2上部署Memcached,進行session復制。
實際路由:
外部訪問192.168.21.201:8805,keepalived監聽到後,確認分發到哪一台nginx。nginx通過箭筒8805埠,使用集群策略,再分發到具體伺服器。
nginx依賴openssl、pcre、zlib。
nginx具體安裝方案查看: Linux系統 - 源碼編譯安裝Nginx
或者通過源碼編譯方式:
假設web1為主機,web2為備份機。
編輯web1的keepalived的配置文件:
編輯web2的keepalived的配置文件:
兩台伺服器的nginx配置一樣
說明虛擬IP配置成功
沒有虛擬IP地址,說明主機良好的狀態下,備份機沒有接管。
在兩台伺服器上都裝上Memcached。
memcached需要依賴libevent:
其中n1和n2 即需要負載的機器上所裝memcached的ip和埠。如家政的iFly-Housekeep項目需要
192.168.21.21和192.168.21.22兩台機器,這兩台上都需要安裝memcached,埠都為11211
最近在把之前寫在印象筆記里的一些壓箱底的資料發布出來,這一篇是16年時候寫的。。
3. 基於MySQL雙主的高可用解決方案理論及實踐
MySQL在互聯網應用中已經遍地開花,但是在銀行系統中,還在生根發芽的階段。本文記錄的是根據某生產系統實際需求,對資料庫高可用方案從需求、各高可用技術特點對比、實施、測試等過程進行整理,完善Mysql高可用方案,同時為後續開展分布式資料庫相關測試做相應准備。
存儲復制技術: 傳統IOE架構下,常用高可用方案,靠存儲底層復制技術實現數據的一致性,優點數據安全性有保障,限制在於是依賴存儲硬體,實施成本較高。
keepalived+雙主復制: 兩台MySQL互為主從關系,即雙主模式,通過Keepalived配置虛擬IP,實現當其中的一台資料庫故障時,自動切換VIP到另外一台MySQL資料庫,備機快速接管業務來保證資料庫的高可用。
MHA: MHA部署在每台mysql伺服器上,定時探測集群中的master節點,當master出現故障時,它可以自動將最新的slave提升為新的master,然後將所有其他的slave重新指向新的master,優點在最大程度保證數據的一致性的前提下實現快速切換,最少需要3台伺服器,存在數據丟失的可能性。
PXC: Percona eXtra Cluster是Percona基於galera cluster封裝的集群方案。不同於普通多主復制,PXC保障強一致性和實時同步,故障切換更快。但是也需要3個節點,配置相對復雜,對性能也稍有影響。
除了上述方案外,還有MMM、Heartbeat+DRBD等高可用方案,此處不做詳細介紹。
綜合評估下,本次實施採用了 keepalived+mysql雙主實現資料庫同城雙機房的高可用。MySQL版本為: 5.7.21。操作系統:Red Hat Enterprise Linux Server 7.3。
配置過程如下:
Mysql-master1: IP地址1 --以下簡稱master1
Mysql-master2: IP地址2 --以下簡稱master2
Mysql-vip : VIP地址 --應用連接使用
Mysql復制相關概念描述:
1、 Mysql主從復制圖示:
2、 Mysql主從復制過程描述:
(1)master記錄二進制日誌:在每個事務更新數據完成之前,master在二進制日誌記錄這些改變。MySQL將事務寫入二進制日誌。在事務寫入二進制日誌完成後,master通知存儲引擎提交事務。
(2)slave將master的binarylog拷貝到自己的中繼日誌:首先,slave開始一個工作線程——I/O線程。I/O線程在master上打開一個普通的連接,然後開始binlog mp process。Binlog mp process從master的二進制日誌中讀取事務,如果已經同步了master,它會睡眠並等待master產生新的事件。I/O線程將這些事務寫入中繼日誌。
(3)SQL slave thread處理該過程的最後一步:SQL線程從中繼日誌讀取事務,並重放其中的事務而更新slave的數據,使其與master中的數據一致。只要該線程與I/O線程保持一致,中繼日誌通常會位於OS的緩存中,所以中繼日誌的開銷很小。
主主同步就是兩台機器互為主的關系,在任何一台機器上寫入都會同步至備端。
為了便於後續資料庫伺服器的擴展,且在整個復制環境中能夠自動地切換,降低運維成本,引入了當前主流的基於Mysql GTID的復制特性,工作原理及優缺點簡介如下。
3、 GTID工作原理簡介:
(1) master更新數據時,會在事務前產生GTID,一同記錄到Binlog日誌中。
(2) slave的I/O線程將變更的binlog寫入到本地的relay log中。
(3) slave的sql線程從relay log中獲取GTID,然後對比slave端的binlog是否有記錄。
(4) 如果有記錄說明該GTID的事務已經執行,slave會忽略。
(5) 如果沒有記錄,slave就會從relay log中執行該GTID的事務,並記錄到binlog。
(6) 在解析的過程中會判斷是否有主鍵,如果有就用索引,如果沒有就用全部掃描。
4、 GTID優點:
(1) 一個事務對應一個唯一的ID,一個GTID在一個伺服器上 只會執行一次。(2) GTID是用來替代傳統復制的方法,GTID復制與普通復制模式的最大不同就是不需要指定二進制文件名和位置。
(3) 減少手工干預和降低服務故障時間,當主機宕機之後會通過軟體從眾多的備機中提升一台備機為新的master。
5、 GTID也存在一些限制:
(1) 不支持非事務引擎。
(2) 不支持create table … select 語句復制(主庫直接報錯)。
(3) 不允許一個sql同時更新一個事務引擎表和非事務引擎表。
(4) 在一個復制組中,必須要求統一開啟GTID或者是統一關閉GTID。
(5) 開啟GTID需要重啟(5.7版本除外)。
(6) 開啟GTID後,就不再使用原理的傳統復制方式。
(7) 不支持create temporary table 和 drop temporary table語句。
(8) 不支持sql_slave_skip_counter。
前置條件:
主備兩個節點使用行內統一的安裝部署腳本安裝mysql5.7.21介質(略)
Master1端創建應用的資料庫(略)
1、 修改MySQL配置文件
參考相關配置規范,分別設置master1、master2的my.cnf文件,
其中server-id參數設置為不同值;
由於後續keepalived會掛起VIP,應用通過VIP連接資料庫,為了避免應用程序無法通過VIP訪問,需將兩個節點的bind-address參數注釋掉;
2、 設置master1端自動半同步模式
Mysql的同步模式主要有如下3種:
a. 主從同步復制:數據完整性好,但是性能消耗略高;
b. 主從非同步復制:性能消耗低,但容易出現不一致;
c. 主從半自動復制:介於上述兩種之間,既保持了數據的完整性,又提高了性能;
基於上述特性,建議採用半自動同步模式,由於後續要配置為雙主模式,因此任一節點其角色既為master又為slave,因此相關的master/slave插件要同時配置,過程如下。
(1) 首先查看庫是否支持動態載入(默認都支持)
(2) 主從庫上分別安裝插件
作為主庫,安裝插件semisync_master.so
作為從庫,安裝插件semisync_slave.so
(3) 安裝完成後,從plugin表中能夠看到剛剛安裝的插件
(4) 分別打開主從庫半同步復制
同時添加到各自的my.cnf中,在後續資料庫實例重啟時自動載入該配置。
此時查看狀態還沒有啟動
(5) 兩個節點分別啟動IO進程
(6) 查看半同步狀態
3、 將master1設為master2的主伺服器
(1)在master1主機上創建授權賬戶,允許在master2主機上連接
(2)將主庫master1數據導出
(3)將master.sql傳輸到master2上並導入
(4)在master2端將master1設置為自己的主庫,並開啟slave功能
在master2上查看slave狀態
至此master1到master2的主從復制關系已經建立完成。
4、 將master2設為master1的主伺服器
在master1上執行
在master1上查看slave狀態
1、keepalived相關概念說明:
keepalived是集群管理中保證集群高可用的一個軟體解決方案,其功能類似於heartbeat,用來防止單點故障
keepalived是以VRRP協議為實現基礎的,VRRP全稱VirtualRouter Rendancy Protocol,即虛擬路由冗餘協議。
虛擬路由冗餘協議,可以認為是實現路由器高可用的協議,即將N台提供相同功能的路由器組成一個路由器組,這個組裡面有一個master和多個backup,master上面有一個對外提供服務的vip,master會發組播(組播地址為224.0.0.18),當backup收不到vrrp包時就認為master宕掉了,這時就需要根據VRRP的優先順序來選舉一個backup當master,這樣的話就可以保證路由器的高可用了。
keepalived主要有三個模塊,分別是core 、check和vrrp。core模塊為keepalived的核心,負責主進程的啟動、維護以及全局配置文件的載入和解析。check負責 健康 檢查,包括常見的各種檢查方式。vrrp模塊是來實現VRRP協議的。同時為了避免出現腦裂,應關閉防火牆或者開啟防火牆但允許接收VRRP協議。
2、keepalived的安裝配置
(1)配置本地yum源,在master1和master2兩台伺服器上安裝keepalived的相關依賴包Kernel-devel/openssl-devel/popt-devl等
配置指向rhel-7.5.iso的yum本地源,步驟略
注意:如不知道keepalived需要哪些依賴包,可到下載後的源碼解壓目錄下查看INSTALL 文件內容,安裝需要的依賴包,源碼安裝任何一個軟體都要養成查看源碼包文檔的習慣,比如INSTALL,README,doc等文檔,可以獲得很多有用的信息。
(2)在兩台mysql上解壓縮並編譯安裝keepalived
(3)master1、master2上分別配置keepalived.conf
注意上圖紅色字體中兩個節點配置相同處及差異。
說明:keepalived只有一個配置文件keepalived.conf,裡面主要包括以下幾個配置區域:
· global_defs:主要是配置故障發生時的通知對象以及機器標識。
· vrrp_instance:用來定義對外提供服務的VIP區域及其相關屬性。
· virtual_server:虛擬伺服器定義
(4)同時兩個節點上都需要添加檢測腳本
作用:是當mysql停止工作時自動關閉本機的keeplived服務,從而實現將故障主機踢出熱備組,因每台機器上keepalived只添加了本機為realserver,所以當mysqld正常啟動後,我們還需要手動啟動keepalived服務。
(5)分別啟動兩個節點的keepalived服務
檢查兩個節點keepalived啟動進程
檢查兩個節點的vip掛載情況
(6)主備機故障切換測試
停止master2的mysql服務,看keepalived 健康 檢查程序是否會觸發腳本,自動進行故障切換,步驟略
查看master1節點的VIP掛載情況,驗證是否實現了自動切換,步驟略
說明在master2伺服器的mysql服務發生故障時,觸發了腳本,自動完成了切換。
(7)現在我們把master2的mysql服務開起來,並且keepalived的服務也需要啟動。
即便master2的mysql服務和keepalived服務都重新開啟了,master1仍然是主master了,master2未對主master的權利進行搶奪,說明設置的nopreempt參數生效了,為了保證群集的穩定性,生產環境不允許搶占配置,只有當master1的mysql服務壞掉的時候,master2才會再次成為主master,否則它永遠只能當master1的備份。(註:nopreempt一般是在優先順序高的mysql上設置)
Sysbench是一個模塊化的、跨平台、多線程基準測試工具,可用於評估資料庫負載情況,通過sysbench命令配置IP地址、埠號、用戶名、密碼連接到指定的資料庫db1中,創建多個表,並快速插入指定條數的記錄,觀察主備庫同步效率
(1) 下載開源工具sysbench-0.4.12.14.tar.gz,放置在相應目錄下並解壓
(2) 使用iso配置本地yum源並安裝Sysbench如下的依賴包(步驟略):autoconf/automake/cdbs/debhelper(>=9)/docbook-xml/docbook-xsl/libmysqlclient15-dev/libtool/xsltproc
(3) 編譯sysbench
編輯配置文件/etc/ld.so.conf中添加mysql lib目錄/mysql/app/5.7.21/lib,並執行命令ldconfig生效
(4) 執行sysbench壓測
使用sysbench工具向主節點的db1資料庫中創建5張表,並且每張表分別插入10萬條記錄
同時觀察備機同步效率
幾個重要的參數說明:
B、半自動同步模式、非同步模式切換測試
(1) 檢查主備同步狀態,及同步參數設置
rpl_semi_sync_master_enabled參數表示啟用半同步模式;
rpl_semi_sync_master_timeout參數單位為毫秒,表示主庫事務等待從庫返回commit成功信息超過10秒就降為非同步模式,不再等待從庫,等探測到從庫io線程恢復後,再返回為半自動同步;
rpl_semi_sync_master_wait_no_slave參數表示事務提交後需要等待從庫返回確認信息;
(2) 將slave的io線程停止
(3) 使用sysbench向master寫入少量的數據,本例創建一張表,並插入10條記錄,命令包裝在1.sh測試腳本中
通過記錄的時間戳發現,master在等待了slave10秒無響應,自動切換為非同步模式,將數據寫入本地。
(4) Slave啟動io線程,數據自動追平
至此MySQL主主復制配置完成,運行在半自動同步模式,通過keepalived實現Mysql的HA高可用。
上線後應符合統一的標准監控策略,添加備份協議對數據進行周期備份並保存到帶庫中,以及定期的數據恢復測試。
由於是靠keepalived實現的高可用,還應將如下資源添加到監控管理平台:
1、 對每台資料庫主機的3個keepalived進程進行監控;
2、 對主備節點的io線程、sql線程工作狀態進行監控;
4. linux培訓學的是什麼內容
你說的是正規的Linux培訓么,現在市場主流是Red Hat,我就拿RHCE培訓來舉個例子吧。 RHCE要培訓三門課:Linux系統管理一、Linux系統管理二、Linux服務與安全。 系統管理一:主要是針對從未接觸Linux的人事設計的,全是圖形界面。 系統管理二:在學習了「系統管理一」的基礎上進行命令行的學習,主要設計rpm軟體包管理、文件系統管理、磁碟管理、邏輯卷管理等系統核心管理。 服務與安全:主要培訓Linux上的主流企業級服務和Selinux安全。主要服務包括:Apache、Ftp、NFS、iSCSI存儲、Samba等。 學習linux推薦你看看《linux就該這么學》,這本書技術實用,內容豐富充實。
5. Linux培訓內容有哪些
以下是比較經典的Linux編程學習路線:
第一階段:linux基礎入門
1. 開班課程介紹-規章制度介紹-破冰活動;
2. Linux硬體基礎/Linux發展歷史;
3. Linux系統安裝/xshell連接/xshell優化/SSH遠程連接故障問題排查
4. 第一關一大波命令及特殊字元知識考試題講解
5. L inux基礎優化
6. Linux目錄結構知識精講
7. 第二關一大波命令及特殊知識考試題講解(上)
8. 第二關一大波命令及特殊知識考試題講解(下)
9. Linux文件屬性一大堆知識精講
10. Linux通配符/正則表達式
11. 第三關一大波命令及重要知識考試題講解(上)
12. 第三關一大波命令及重要知識考試題講解(下)
13. Linux系統許可權(上)
14. Linux系統許可權(下)
15. 第一階段結束需要導師或講師對整體課程進行回顧
第二階段:linux系統管理進階
1. Linux定時任務
2. Linux用戶管理
3. Linux磁碟與文件系統(上)
4. Linux磁碟與文件系統(中下)
5. Linux三劍客之sed命令
第三階段:Linux Shell基礎
1. Shell編程基礎1
2. Shell編程基礎234
3. Linux三劍客之awk命令
第四階段:Linux網路基礎
1. 計算機網路基礎上
2. 計算機網路基礎下
3. 第二階段結束需要導師或講師對整體課程進行回顧。
第五階段:Linux網路服務
1. 集群實戰架構開始及環境准備
2. rsync數據同步服務
3. Linux全網備份項目案例精講
4. nfs網路存儲服務精講
5. inotify/sersync實時數據同步/nfs存儲實時備份項目案例精講
第六階段:Linux重要網路服務
1. http協議/www服務基礎
2. nginx web介紹及基礎實踐
3. nginx web精講結束
4. lnmp環境部署/資料庫異機遷移/共享數據異機遷移到NFS系統
5. nginx負載均衡深入透徹
6. keepalived高可用深入透徹
第七階段:Linux中小規模集群構建與優化(50台)
1. 期中架構開戰說明+期中架構部署回顧
2. 全體晝夜兼程部署期中架構並完成上台述職演講(加上兩個周末共9天)
3. kickstart cobbler 批量自動安裝系統
4. pptp vpn與ntp服務
5. memcached原理及部署/作為緩存及session會話共享
第八階段:Ansible自動化運維與Zabbix監控
1. SSH服務秘鑰認證
2. ansible批量自動化管理集群(入門及深入)
3. zabbix監控
第九階段:大規模集群高可用服務(Lvs、Keepalived)
1. Centos7系統自行安裝/centos6與7區別
2. lvs負載均衡集群/keepalived管理LVS集群
第十階段:Java Tomcat服務及防火牆Iptables
1. iptables防火牆精講上
2. iptables防火牆精講下
3. tomcat java應用服務/nginx配合tomcat服務部署及優化
第十一階段:MySQL DBA高級應用實踐
1. MySQL資料庫入門基礎命令
2. MySQL資料庫進階備份恢復
3. MySQL資料庫深入事務引擎
4. MySQL資料庫優化SQL語句優化
5. MySQL資料庫集群主從復制/讀寫分離
6. MySQL資料庫高可用/mha/keepalved
第十二階段:高性能資料庫Redis和Memcached課程
第十三階段:Linux大規模集群架構構建(200台)
第十四階段:Linux Shell編程企業案例實戰
第十五階段:企業級代碼發布上線方案(SVN和Git)
1. GIT管理
2. 代碼上線項目案例
第十六階段企業級Kvm虛擬化與OpenStack雲計算
1. KVM虛擬化企業級實戰
2. OpenStack雲計算企業級實戰
第十七階段公有雲阿里雲8大組件構建集群實戰
第十八階段:Docker技術企業應用實踐
1. Docker容器與微服務深入實踐
2. 大數據Hadoop生態體系及實踐
第十九階段:Python自動化入門及進階
第二十階段:職業規劃與高薪就業指導
6. 關於linux學習路線的問題 請教前輩
很多同學接觸Linux不多,對Linux平台的開發更是一無所知。而現在的趨勢越來越表明,作為一 個優秀的軟體開發人員,或計算機IT行業從業人員,掌握Linux是一種很重要的謀生資源與手段。下來我將會結合自己的幾年的個人開發經驗,及對 Linux,更是類UNIX系統,及開源軟體文化,談談Linux的學習方法與學習中應該注意的一些事。
就如同剛才說的,很多同學以前可能連Linux是什麼都不知道,對UNIX更是一無所知。所以我們從最基礎的講起,對於Linux及UNIX的歷史我們不做多談,直接進入入門的學習。
Linux入門是很簡單的,問題是你是否有耐心,是否愛折騰,是否不排斥重裝一類的大修。沒折騰可以說是學不好Linux的,鳥哥說過,要真正了解Linux的分區機制,對LVM使用相當熟練,沒有20次以上的Linux裝機經驗是積累不起來的,所以一定不要怕折騰。
由於大家之前都使用Windows,所以我也盡可能照顧這些「菜鳥」。我的推薦,如果你第一次接觸Linux,那麼首先在虛擬機中嘗試它。虛擬機我推薦Virtual Box,我並不主張使用VM,原因是VM是閉源的,並且是收費的,我不希望推動盜版。當然如果你的Money足夠多,可以嘗試VM,但我要說的是即使是VM,不一定就一定好。付費的軟體不一定好。首先,Virtual Box很小巧,Windows平台下安裝包在80MB左右,而VM動輒600MB,雖然功能強大,但資源消耗也多,何況你的需求Virtual Box完全能夠滿足。所以,還是自己選。如何使用虛擬機,是你的事,這個我不教你,因為很簡單,不會的話Google或Bai都可以,英文好的可以直接看官方文檔。
現在介紹Linux發行版的知識。正如你所見,Linux發行版並非Linux,Linux僅是指操作系統的內核,作為科班出生的你不要讓我解釋,我也沒時間。我推薦的發行版如下:
UBUNTU適合純菜鳥,追求穩定的官方支持,對系統穩定性要求較弱,喜歡最新應用,相對來說不太喜歡折騰的開發者。
Debian,相對UBUNTU難很多的發行版,突出特點是穩定與容易使用的包管理系統,缺點是企業支持不足,為社區開發驅動。
Arch,追逐時尚的開發者的首選,優點是包更新相當快,無縫升級,一次安裝基本可以一直運作下去,沒有如UBUNTU那樣的版本概念,說的專業點叫滾動升級,保持你的系統一定是最新的。缺點顯然易見,不穩定。同時安裝配置相對Debian再麻煩點。
Gentoo,相對Arch再難點,考驗使用者的綜合水平,從系統安裝到微調,內核編譯都親歷親為,是高手及黑客顯示自己技術手段,按需配置符合自己要求的系統的首選。
Slackware與Gentoo類似。
CentOS,社區維護的RedHat的復刻版本,完全使用RedHat的源碼重新編譯生成,與RedHat的兼容性在理論上來說是最好的。如果你專注於Linux伺服器,如網路管理,架站,那麼CentOS是你的選擇。
LFS,終極黑客顯擺工具,完全從源代碼安裝,編譯系統。安裝前你得到的只有一份文檔,你要做的就是照文檔你的說明,一步步,一條條命令,一個個軟體包的去構建你的Linux,完全由你自己控制,想要什麼就是什麼。如果你做出了LFS,證明你的Linux功底已經相當不錯,如果你能拿LFS文檔活學活用,再將Linux從源代碼開始移植到嵌入式系統,我敢說中國的企業你可以混的很好。
你得挑一個適合你的系統,然後在虛擬機安裝它,開始使用它。如果你想快速學會Linux,我有一個建議就是忘記圖形界面,不要想圖形界面能不能提供你問題的答案,而是滿世界的去找,去問,如何用命令行解決你的問題。在這個過程中,你最好能將Linux的命令掌握的不錯,起碼常用的命令得知道,同時建立了自己的知識庫,裡面是你積累的各項知識。
再下個階段,你需要學習的是Linux平台的C/C++開發,同時還有Bash腳本編程,如果你對Java興趣很深還有Java。同樣,建議你拋棄掉圖形界面的IDE,從VIM開始,為什麼是VIM,而不是Emacs,我無意挑起編輯器大戰,但我覺得VIM適合初學者,適合手比較笨,腦袋比較慢的開發者。Emacs的鍵位太多,太復雜,我很畏懼。然後是GCC,Make,Eclipse(Java,C++或者)。雖然將C++列在了Eclipse中,但我並不推薦用IDE開發C++,因為這不是Linux的文化,容易讓你忽略一些你應該注意的問題。IDE讓你變懶,懶得跟豬一樣。如果你對程序調試,測試工作很感興趣,GDB也得學的很好,如果不是GDB也是必修課。這是開發的第一步,注意我並沒有提過一句Linux系統API的內容,這個階段也不要關心這個。你要做的就是積累經驗,在Linux平台的開發經驗。我推薦的書如下:C語言程序設計,譚浩強的也可以。C語言,白皮書當然更好。C++推薦C++ Primer Plus,Java我不喜歡,就不推薦了。工具方面推薦VIM的官方手冊,GCC中文文檔,GDB中文文檔,GNU開源軟體開發指導(電子書),匯編語言程序設計(讓你對庫,鏈接,內嵌匯編,編譯器優化選項有初步了解,不必深度)。
如果你這個階段過不了就不必往下做了,這是底線,最基礎的基礎,否則離開,不要霍霍Linux開發。不專業的Linux開發者作出的程序是與Linux文化或UNIX文化相背的,程序是走不遠的,不可能像Bash,VIM這些神品一樣。所以做不好乾脆離開。
接下來進入Linux系統編程,不二選擇,APUE,UNIX環境高級編程,一遍一遍的看,看10遍都嫌少,如果你可以在大學將這本書翻爛,裡面的內容都實踐過,有作品,你口頭表達能力夠強,你可以在面試時說服所有的考官。(可能有點誇張,但APUE絕對是聖經一般的讀物,即使是Windows程序員也從其中汲取養分,Google創始人的案頭書籍,扎爾伯克的床頭讀物。)
這本書看完後你會對Linux系統編程有相當的了解,知道Linux與Windows平台間開發的差異在哪?它們的優缺點在哪?我的總結如下:做Windows平台開發,很苦,微軟的系統API總在擴容,想使用最新潮,最高效的功能,最適合當前流行系統的功能你必須時刻學習。Linux不是,Linux系統的核心API就100來個,記憶力好完全可以背下來。而且經久不變,為什麼不變,因為要同UNIX兼容,符合POSIX標准。所以Linux平台的開發大多是專注於底層的或伺服器編程。這是其優點,當然圖形是Linux的軟肋,但我站在一個開發者的角度,我無所謂,因為命令行我也可以適應,如果有更好的圖形界面我就當作恩賜吧。另外,Windows閉源,系統做了什麼你更本不知道,永遠被微軟牽著鼻子跑,想想如果微軟說Win8不支持QQ,那騰訊不得哭死。而Linux完全開源,你不喜歡,可以自己改,只要你技術夠。另外,Windows雖然使用的人多,但使用場合單一,專注與桌面。而Linux在各個方面都有發展,尤其在雲計算,伺服器軟體,嵌入式領域,企業級應用上有廣大前景,而且兼容性一流,由於支持POSIX可以無縫的運行在UNIX系統之上,不管是蘋果的Mac還是IBM的AS400系列,都是完全支持的。另外,Linux的開發環境支持也絕對是一流的,不管是C/C++,Java,Bash,Python,PHP,Javascript,。。。。。。就連C#也支持。而微軟除Visual Stdio套件以外,都不怎麼友好,不是嗎?
如果你看完APUE的感觸有很多,希望驗證你的某些想法或經驗,推薦UNIX程序設計藝術,世界頂級黑客將同你分享他的看法。
現在是時候做分流了。 大體上我分為四個方向:網路,圖形,嵌入式,設備驅動。
如果選擇網路,再細分,我對其他的不是他熟悉,只說伺服器軟體編寫及高性能的並發程序編寫吧。相對來說這是網路編程中技術含量最高的,也是底層的。需要很多的經驗,看很多的書,做很多的項目。
我的看法是以下面的順序來看書:
APUE再深讀 – 尤其是進程,線程,IPC,套接字
多核程序設計 - Pthread一定得吃透了,你很NB
UNIX網路編程 – 卷一,卷二
TCP/IP網路詳解 – 卷一 再看上面兩本書時就該看了
5.TCP/IP 網路詳解 – 卷二 我覺得看到卷二就差不多了,當然卷三看了更好,努力,爭取看了
6.Lighttpd源代碼 - 這個伺服器也很有名了
7.Nginx源代碼 – 相較於Apache,Nginx的源碼較少,如果能看個大致,很NB。看源代碼主要是要學習裡面的套接字編程及並發控制,想想都激動。如果你有這些本事,可以試著往暴雪投簡歷,為他們寫伺服器後台,想一想全球的魔獸都運行在你的伺服器軟體上。
Linux內核 TCP/IP協議棧 – 深入了解TCP/IP的實現
如果你還喜歡驅動程序設計,可以看看更底層的協議,如鏈路層的,寫什麼路由器,網卡,網路設備的驅動及嵌入式系統軟體應該也不成問題了。
當然一般的網路公司,就算網路級別的也該毫不猶豫的僱用你。只是看後面這些書需要時間與經驗,所以35歲以前辦到吧!跳槽到給你未來的地方!
圖形方向,我覺得圖形方向也是很有前途的,以下幾個方面。
Opengl的工業及游戲開發,國外較成熟。
影視動畫特效,如皮克斯,也是國外較成熟。
GPU計算技術,可以應用在瀏覽器網頁渲染上,GPU計算資源利用上,由於開源的原因,有很多的文檔程序可以參考。如果能進火狐開發,或google做瀏覽器開發,應該會很好 。
嵌入式方向:嵌入式方向沒說的,Linux很重要。
掌握多個架構,不僅X86的,ARM的,單片機什麼的也必須得懂。硬體不懂我預見你會死在半路上,我也想走嵌入式方向,但我覺得就學校教授嵌入式的方法,我連學電子的那幫學生都競爭不過。奉勸大家,一定得懂硬體再去做,如果走到嵌入式應用開發,只能祝你好運,不要碰上像Nokia,Hp這樣的公司,否則你會很慘的。
驅動程序設計:軟體開發周期是很長的,硬體不同,很快。每個月誕生那麼多的新硬體,如何讓他們在Linux上工作起來,這是你的工作。由於Linux的兼容性很好,如果不是太低層的驅動,基本C語言就可以搞定,系統架構的影響不大,因為有系統支持,你可能做些許更改就可以在ARM上使用PC的硬體了,所以做硬體驅動開發不像嵌入式,對硬體知識的要求很高。可以從事的方向也很多,如家電啊,特別是如索尼,日立,希捷,富士康這樣的廠子,很稀缺的。
LDD – Linux驅動程序設計與內核編程的基礎讀物
深入理解Linux內核 – 進階的
Linux源代碼 – 永無止境的
當然你還的看個方面的書,如網路啊什麼的。
7. keepalived能和什麼一起使用
keepalived能和Nginx一起使用。
keepalived可以實現兩台Nginx伺服器之間的高可用主備架構,實現對Nginx伺服器的主備備份。
keepalived和Nginx服務既可以採用源碼的方式進行安裝,也可以採用YUM的方式進行安裝。
8. 怎麼利用windows操作系統和linux操作系統實現nginx+keepalived功能
keepalived+nginx實現nginx的高可用
=================================
nginx的高可用
nginx實現後端realserver的負載均衡
==================================
實驗環境:
OS:Centos 6.4(redhat 6.4)
yum源:
1
2
3
4
5
6
7
8
9
10
11
[centos]
name=sohu-centos
baseurl=http://mirrors.sohu.com/centos/$releasever/os/$basearch
gpgcheck=1
enable=0
gpgkey=http://mirrors.sohu.com/centos/RPM-GPG-KEY-CentOS-6
[epel]
name=sohu-epel
baseurl=http://mirrors.sohu.com/fedora-epel/$releasever/$basearch/
enable=1
gpgcheck=0
拓撲圖:
拓撲圖的規劃:
IP地址
軟體
Master
172.16.22.1(VIP:172.16.22.100)
keepalived+nginx
Backup
172.16.22.2(VIP:172.16.22.100)
keepalived+nginx
apache1
172.16.22.3
httpd
apache2
172.16.22.4
httpd
此架構需考慮的問題
1)、Master沒掛,則Master佔有vip且nginx運行在Master上
2)、Master掛了,則backup搶佔vip且在backup上運行nginx服務
3)、如果master伺服器上的nginx服務掛了,則vip資源轉移到backup伺服器上
4)、檢測後端伺服器的健康狀態
Master和Backup兩邊都開啟nginx服務,無論Master還是Backup,當其中的一個keepalived服務停止後,vip都會漂移到keepalived服務還在的節點上,
如果要想使nginx服務掛了,vip也漂移到另一個節點,則必須用腳本或者在配置文件裡面用shell命令來控制。
首先必須明確後端伺服器的健康狀態檢測keepalived在這種架構上是無法檢測的,後端伺服器的健康狀態檢測是有nginx來判斷的,但是nginx 的檢測機制有一定的缺陷,後端伺服器某一個宕機之後,nginx還是會分發請求給它,在一定的時間內後端服務響應不了,nginx則會發給另外一個服務 器,然後當客戶的請求來了,nginx會一段時間內不會把請求分發給已經宕機的伺服器,但是過一段時間後,nginx還是會把分發請求發給宕機的伺服器 上。
一、安裝keepalived+nginx
Master:
1、安裝keepalived和編譯安裝nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@jie1 ~]# yum -y install keepalived
[root@jie1 ~]#tar xf nginx-1.4.2.tar.gz
[root@jie1 ~]#yum -y groupinstall "Development tools" "Server Platform Development"
[root@jie1 ~]#yum -y install pcre-devel
[root@jie1 ~]# cd nginx-1.4.2
[root@jie1 nginx-1.4.2]# groupadd nginx
[root@jie1 nginx-1.4.2]# useradd -r -g nginx nginx
[root@jie1 nginx-1.4.2]#./configure \
--prefix=/usr\
--sbin-path=/usr/sbin/nginx\
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--user=nginx \
--group=nginx \
--with-http_ssl_mole \
--with-http_flv_mole \
--with-http_stub_status_mole \
--with-http_gzip_static_mole \
--http-client-body-temp-path=/var/tmp/nginx/client/\
--http-proxy-temp-path=/var/tmp/nginx/proxy/\
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/\
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi\
--http-scgi-temp-path=/var/tmp/nginx/scgi\
--with-pcre
[root@jie1 nginx-1.4.2]# make && make install
2、提供nginx的system V服務腳本文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
[root@jie1 nginx-1.4.2]# vim /etc/rc.d/init.d/nginx
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING"= "no"] && exit0
nginx="/usr/sbin/nginx"
prog=$(basename$nginx)
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
[ -f /etc/sysconfig/nginx] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`nginx -V 2>&1 | grep"configure arguments:"| sed's/[^*]*--user=\([^ ]*\).*/\1/g'-`
options=`$nginx -V 2>&1 | grep'configure arguments:'`
foropt in$options; do
if[ `echo$opt | grep'.*-temp-path'` ]; then
value=`echo$opt | cut-d "="-f 2`
if[ ! -d "$value"]; then
# echo "creating" $value
mkdir-p $value && chown-R $user $value
fi
fi
done
}
start() {
[ -x $nginx ] || exit5
[ -f $NGINX_CONF_FILE ] || exit6
make_dirs
echo-n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq0 ] && touch$lockfile
return$retval
}
stop() {
echo-n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq0 ] && rm-f $lockfile
return$retval
}
restart() {
configtest || return$?
stop
sleep1
start
}
reload() {
configtest || return$?
echo-n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null2>&1
}
case"$1"in
start)
rh_status_q && exit0
$1
;;
stop)
rh_status_q || exit0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit0
;;
*)
echo$"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit2
esac
[root@jie1 nginx-1.4.2]# chmod +x /etc/rc.d/init.d/nginx
[root@jie1 nginx-1.4.2]# service nginx start
Starting nginx: [ OK ]
[root@jie1 nginx-1.4.2]# scp -p /etc/rc.d/init.d/nginx 172.16.22.2:/etc/rc.d/init.d #把nginx的服務腳本復制到backup上,-p是保持原有的許可權
3、修改配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[root@jie1 ~]# cd /etc/keepalived/
[root@jie1 keepalived]# vim keepalived.conf
global_defs {
notification_email {
root@localhost
}
notification_email_from admin@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LTT
}
vrrp_script chk_nginx { #檢測nginx服務是否在運行有很多方式,比如進程,用腳本檢測等等
script "killall -0 nginx" #用shell命令檢查nginx服務是否存在
interval 1 #時間間隔為1秒檢測一次
weight -2 #當nginx的服務不存在了,就把當前的權重-2
fall 2 #測試失敗的次數
rise 1 #測試成功的次數
}
vrrp_instance IN_1 {
state MASTER
interface eth0
virtual_router_id 22
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass aaaa
}
virtual_ipaddress {
172.16.22.100
}
track_script {
chk_nginx #引用上面的vrrp_script定義的腳本名稱
}
}
[root@jie1 keepalived]#scp keepalived.conf 172.16.22.2:/etc/keepalived #把配置文件到Backup伺服器上,之前要保證Backup伺服器上面已經安裝了keepalived
4、開啟keepalived和nginx的服務
1
2
3
4
5
6
7
8
[root@jie1 keepalived]# service keepalived start
Starting keepalived: [ OK ]
[root@jie1 keepalived]# chkconfig --add keepalived
[root@jie1 keepalived]# chkconfig keepalived on
[root@jie1 ~]# service nginx start
Starting nginx: [ OK ]
[root@jie1 ~]# chkconfig --add nginx
[root@jie1 ~]# chkconfig nginx on
Backup:
1、安裝keepalived和編譯安裝nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@jie2 ~]# yum -y install keepalived
[root@jie2 ~]#tar xf nginx-1.4.2.tar.gz
[root@jie2 ~]#yum -y groupinstall "Development tools" "Server Platform Development"
[root@jie2 ~]#yum -y install pcre-devel
[root@jie2 ~]# cd nginx-1.4.2
[root@jie2 nginx-1.4.2]# groupadd nginx
[root@jie2 nginx-1.4.2]# useradd -r -g nginx nginx
[root@jie2 nginx-1.4.2]#./configure \
--prefix=/usr \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--user=nginx \
--group=nginx \
--with-http_ssl_mole \
--with-http_flv_mole \
--with-http_stub_status_mole \
--with-http_gzip_static_mole \
--http-client-body-temp-path=/var/tmp/nginx/client/ \
--http-proxy-temp-path=/var/tmp/nginx/proxy/ \
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
--http-scgi-temp-path=/var/tmp/nginx/scgi \
--with-pcre
[root@jie2 nginx-1.4.2]# make && make install
2、之前 已經從Master復制了nginx的system V服務腳本文件,啟動nginx服務
1
2
3
4
[root@jie2 ~]# service nginx start
Starting nginx: [ OK ]
[root@jie2 ~]# chkconfig --add nginx
[root@jie2 ~]# chkconfig nginx on
3、修改配置文件
1
2
3
4
[root@jie2 ~]# cd /etc/keepalived/
[root@jie2 keepalived]# vim keepalived.conf #此配置文件是從Master伺服器上過來,只需小小改動
state BACKUP #把這里原先的MASTER改成BACKUP
priority 99 #把這里原先的100改成99
4、開啟服務
1
2
3
4
[root@jie2 keepalived]# service keepalived start
Starting keepalived: [ OK ]
[root@jie2 keepalived]# chkconfig --add keepalived
[root@jie2 keepalived]# chkconfig keepalived on
apache1:
1、安裝(博主這里用rpm包安裝,各位朋友可以用源碼編譯安裝)
1 [root@jie3 ~]# yum -y install httpd
2、建立測試網頁文件
1
2
3
[root@jie3 ~]# cd /var/www/html/
[root@jie3 html]# cat index.html #建一個測試網頁
this is apache1
3、開啟服務
1
2
3
4
[root@jie3 html]# service httpd start
Starting httpd: [ OK ]
[root@jie3 html]# chkconfig --add httpd
[root@jie3 html]# chkconfig httpd on
apache2:
1、安裝(博主這里用rpm包安裝,各位朋友可以用源碼編譯安裝)
1 [root@jie4 ~]# yum -y install httpd
2、建立測試網頁文件
1
2
3
[root@jie4 ~]# cd /var/www/html/
[root@jie4 html]# cat index.html #建一個測試網頁
this is apache2
3、開啟服務
1
2
3
4
[root@jie4 html]# service httpd start
Starting httpd: [ OK ]
[root@jie4 html]# chkconfig --add httpd
[root@jie4 html]# chkconfig httpd on
此致所有安裝已經完成。
二、nginx實現後端realserver的負載均衡,由於兩邊的配置文件必須保持一致,所以在Master配置完後直接到Backup上
Master:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@jie1 ~]# cd /etc/nginx/
[root@jie1 nginx]# grep -v "#" nginx.conf | grep -v "^$"
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream apacheweb { #定義負載均衡的模塊
server 172.16.22.3:80 max_fails=3 fail_timeout=2s;
server 172.16.22.4:80 max_fails=3 fail_timeout=2s;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ \.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
root /var/www/html; #此處定義後端伺服器網頁存放路徑
proxy_pass http://apacheweb;
}
}
}
[root@jie1 nginx]# scp nginx.conf 172.16.22.2:/etc/nginx
9. 誰知道哪有windows環境下keepalived的版本
沒有windows版本,只有liunx版本。提供源碼下載http://packages.debian.org/zh-cn/source/squeeze/keepalivedhttp://www.pudn.com/downloads96/sourcecode/internet/detail393343.html如果有需要請自己修改。
10. 新手入門Linux的步驟
很多Linux初學者不知從何處開始學起,怎麼學,感覺很茫然。Linux菜鳥要成為Linux高手,要有一個好的學習計劃和規劃,參加正規培訓班,要不然時間花了很多,卻沒有效果。這里介紹學習Linux的步驟和建議,也可以咨詢老男孩教育,希望對初學者有幫助。
准備階段:(1)了解Linux是什麼,有什麼優缺點,發展歷史和現狀,應用領域;(2)趕快找一部計算機,趕快安裝一個 Linux 發行版本,要自己親手安裝一遍Linux操作系統(包括虛擬機的Linux環境和完整真實的Linux環境);(3)熟悉Linux環境和Linux基本操作
菜鳥階段之選教程:選擇一本好的工具書工具書對於學習者而言是相當重要的。如:跟老男孩學Linux運維,linux就該這樣學等。
菜鳥階段之系統命令:Linux命令是必須好好學習和經常使用,而不要經常去使用菜單操作。一定要養成在命令行下工作的習慣
中級階段之命令行習慣:養成在命令行下工作:一定要養成在命令行下工作的習慣,要不然沒法成為高手
中級階段之Linux系統結構理解、語言編程與英語:C語言、C++,QT,shell,makefile,java,vi編輯器使用。這些至少要精通一兩門編程語言吧
高級階段之網路編程:Linux是網路的代名詞,Linux網路服務功能非常強大,不論是郵件伺服器、Web伺服器、DNS伺服器等都非常完善。要增加自己Linux 的技能,只有通過實踐來實現了。所以學習Linux也一樣,如果你無法經常學習的話,學了後面的,前面的忘了。你對Linux命令熟悉後你可以開始搭建一個小的Linux網路,這是最好的實踐方法。 當然你不需搭建所有服務,可以慢慢來。需要說明的是這個Linux網路對於初學者有兩三台計算機即可。學好了學好學精了Linux的網路編程,可以肯定的告訴你,你已經是一個非常優秀的Linux人才或者「Linux高手」了
高級階段之嵌入式編程、底層驅動編程與內核源碼:成為Linux高手的重要的方向