Cacti的起源與發展現狀
故事要從2001年的某一天說起。
一個叫Ian Berry的中學生還在學習如何使用PHP和MySQL進行編程及功能的實現,那時候他業余時間為一個名不見經傳的互聯網運營商開發項目,他希望借助這個項目不僅可以精進自己的編程功力,還可以創建一個新的監控顯示方法,既要比RRDTool容易使用、比MRTG靈活,又要更加容易擴展和調整。
天賦異稟的Ian在自己的不懈努力下,通過使用PHP語言,完成了第一個開源程序的版本。在隨后的幾年中,開源社區的開發愛好者們越發關注這只“帶刺兒的仙人掌”,並在大家的共同推動下,0.8.6版本在2004年9月13日正式發布。0.8.6版本甚至可以認為是Cacti發展歷史上的里程碑,它褪去了幼稚與粗糙,在全球開發者的細心呵護下開始展露自己成熟之后的迷人魅力,它的執行效率越來越高,經過優化的源代碼使得Cacti變得越來越靈活,越來越易於擴展。
按照原來Roadmap的計划,1.0.0版本將會在2013年年底正式發布,但是這個開源項目太火了,大家開始不斷地建立自己的分支版本,不斷在各個版本基礎上開發帶有附加特性的新的子版本,這導致1.0.0版本一直難以統一。預見到這個狀況可能發生,Ian開始在2012年6月份,集中力量重組研發資源配置,開始在提高研發效率、縮短研發周期方面花力氣,直到目前為止官方已更新至1.2.14版本。
一,cacti介紹
1.什么是Cacti?
Cacti 在英文中的意思是仙人掌的意思,Cacti是一套基於PHP,MySQL,SNMP及RRDTool開發的網絡流量監測圖形分析工具。它通過snmpget來獲取數據,使用 RRDtool繪畫圖形,而且你完全可以不需要了解RRDtool復雜的參數。它提供了非常強大的數據和用戶管理功能,可以指定每一個用戶能查看樹狀結構、host以及任何一張圖,還可以與LDAP結合進行用戶驗證,同時也能自己增加模板,功能非常強大完善。Cacti 的發展是基於讓 RRDTool 使用者更方便使用該軟件,除了基本的 Snmp 流量跟系統資訊監控外,Cacti 也可外掛 Scripts 及加上 Templates 來作出各式各樣的監控圖。
cacti是用php語言實現的一個軟件,它的主要功能是用snmp服務獲取數據,然后用rrdtool儲存和更新數據,當用戶需要查看數據的時候用rrdtool生成圖表呈現給用戶。因此,snmp和rrdtool是cacti的關鍵。Snmp關系着數據的收集,rrdtool關系着數據存儲和圖表的生成。
Mysql配合PHP程序存儲一些變量數據並對變量數據進行調用,如:主機名、主機ip、snmp團體名、端口號、模板信息等變量。
snmp抓到數據不是存儲在mysql中,而是存在rrdtool生成的rrd文件中(在cacti根目錄的rra文件夾下)。rrdtool對數據的更新和存儲就是對rrd文件的處理,rrd文件是大小固定的檔案文件(Round Robin Archive),它能夠存儲的數據筆數在創建時就已經定義。關於RRDTool的知識請參閱RRDTool教學。
2,什么是SNMP?
snmp(Simple Network Management Protocal, 簡單網絡管理協議)在架構體系的監控子系統中將扮演重要角色。大體上,其基本原理是,在每一個被監控的主機或節點上 (如交換機)都運行了一個 agent,用來收集這個節點的所有相關的信息,同時監聽 snmp 的 port,也就是 UDP 161,並從這個端口接收來自監控主機的指令(查詢和設置)。
如果安裝 net-snmp,被監控主機需要安裝 net-snmp(包含了 snmpd 這個 agent),而監控端需要安裝 net-snmp-utils,若接受被監控端通過trap-communicate發來的信息的話,則需要安裝net-snmp,並啟用trap服務。如果自行編譯,需要 beecrypt(libbeecrypt)和 elf(libraryelf)的庫。
3,什么是RRDtools?
RRDtool是指Round Robin Database 工具(環狀數據庫)。Round robin是一種處理定量數據、以及當前元素指針的技術。想象一個周邊標有點的圓環--這些點就是時間存儲的位置。從圓心畫一條到圓周的某個點的箭頭--這就是指針。就像我們在一個圓環上一樣,沒有起點和終點,你可以一直往下走下去。過來一段時間,所有可用的位置都會被用過,該循環過程會自動重用原來的位置。這樣,數據集不會增大,並且不需要維護。RRDtool處理RRD數據庫。它用向RRD數據庫存儲數據、從RRD數據庫中提取數據。

Cacti整個系統的架構是這樣的:基於SNMP協議,被監控端是服務器,或一些網絡設備,網絡管理工作站,采用Linux或Freebsd操作系統,並且安裝Net-SNMP工具,使用RRDTOOL采集數據,存儲數據,並用Cacti調用rrdtool顯示出來。
CACTI采用PHP編寫,基於B/S結構。

Cacti實例應用:
1)網絡設置
2)主機系統
(1)網絡接口流量(進與出的帶寬)
(2)監控CPU的負載、內存等等
(3)監控磁盤的空間、進程數等等
3)cacti常見的監測對象
(1)服務器資源:CPU、內存、磁盤、進程、連接數等
(2)服務器類型:WEB、Mail、FTP、數據庫、中間件
(3)網絡接口:流量、轉發速度、丟包率
(4)網絡設備性能、配置文件(對比與備份)、路由數
(5)安全設備性能、連接數、攻擊數
(6)設備運行狀態:風扇、電源、溫度
(7)機房運行環境:電流、電壓、溫濕度
二,Cacti安裝和配置
本章基於rpm一鍵包來部署,所用的包組,來自於whsir一鍵包
環境要求
- CentOS 7.8.2003 (Core)
- PHP 7.1
- MariaDB或者Mysql5.7版本以上
1、卸載自帶的mariadb相關服務
yum remove mariadb-libs
2、添加epel源
yum install epel-release
3、添加whsir一鍵包源
rpm -ivh http://mirrors.whsir.com/centos/whsir-release-centos.noarch.rpm
4、安裝nginx、php、mysql
yum install wnginx wphp71 wmysql57
5、安裝php擴展及其他所需依賴
yum install wphp71-ldap wphp71-snmp wrrdtool wnet-snmp wspine-1.2.2 sendmail
6、設置環境變量
echo 'export PATH=$PATH:/usr/local/nginx/sbin/:/usr/local/php/bin/:/usr/local/mysql/bin/' >> /etc/profile source /etc/profile
7、設置兩個軟鏈接
ln -sv /usr/local/mysql/lib/libmysqlclient.so.20 /usr/lib64/libmysqlclient.so.20 ln -sv /usr/local/mysql/lib/libmysqlclient.so /usr/lib64/libmysqlclient.so
8、取消被禁用的php函數
vi /usr/local/php/etc/php.ini
找到disable_functions行,刪除shell_exec,exec,popen,保存退出,重啟php服務
/etc/init.d/php-fpm71 restart
9、啟動相關服務
/etc/init.d/nginx start /etc/init.d/mysql start /etc/init.d/snmpd start
10、修改MySQL密碼(默認為空)*
修改默認MySQL密碼,創建cacti數據庫,並添加相應權限
mysql -uroot -p mysql> set password = password('whsir'); mysql> CREATE DATABASE cacti DEFAULT CHARACTER SET utf8; mysql> GRANT ALL ON cacti.* TO cacti@localhost IDENTIFIED BY 'blog.whsir.com'; mysql> GRANT SELECT ON mysql.time_zone_name TO cacti@localhost IDENTIFIED BY 'blog.whsir.com'; mysql> ALTER DATABASE cacti CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; mysql> flush privileges; mysql> quit
11、加載時區到mysql數據庫
/usr/local/mysql/bin/mysql_tzinfo_to_sql /usr/share/zoneinfo/ | mysql -uroot -pwhsir mysql
12、下載cacti
網絡不佳的情況下,強烈建議先下載到本地,再上傳到服務器
mkdir /data/www cd /data/www wget https://www.cacti.net/downloads/cacti-1.2.14.tar.gz tar xf cacti-1.2.14.tar.gz mv cacti-1.2.14 cacti
13、修改cacti數據庫配置文件
cd /data/www/cacti/include vi config.php
$database_type = 'mysql'; $database_default = 'cacti'; $database_hostname = 'localhost'; $database_username = 'cacti'; $database_password = 'blog.whsir.com'; $database_port = '3306'; $database_retries = 5; $database_ssl = false; $database_ssl_key = ''; $database_ssl_cert = ''; $database_ssl_ca = '';
14、導入cacti.sql
mysql -ucacti -pblog.whsir.com cacti < /data/www/cacti/cacti.sql
touch日志文件,后續安裝時用的到
touch /data/www/cacti/log/cacti.log touch /data/www/cacti/log/cacti_stderr.log
15、做一些軟鏈,后續安裝用的到
ln -sv /usr/local/rrdtool/bin/rrdtool /usr/local/bin/rrdtool ln -sv /usr/local/php/bin/php /usr/bin/php ln -sv /usr/local/snmp/bin/snmpwalk /usr/local/bin/snmpwalk ln -sv /usr/local/snmp/bin/snmpget /usr/local/bin/snmpget ln -sv /usr/local/snmp/bin/snmpbulkwalk /usr/local/bin/snmpbulkwalk ln -sv /usr/local/snmp/bin/snmpgetnext /usr/local/bin/snmpgetnext ln -sv /usr/local/snmp/bin/snmptrap /usr/local/bin/snmptrap
16、修改cacti目錄權限
chown -R www:www /data/www/cacti/
17、修改nginx配置
vi /usr/local/nginx/conf/vhost/demo.conf
修改root路徑為root /data/www;,取消php注釋include enable-php71.conf;,修改下server_name為本機IP,或者自己填個域名,自行hosts,不做過多說明!
18、重啟nginx服務
nginx -t /etc/init.d/nginx restart
19、spine配置
spine是一個基於C語言的,非常快速的輪詢引擎,它是默認的cmd.php的可選替代,如果要使用spine需要單獨的設置
cd /usr/local/spine/etc cp spine.conf.dist spine.conf vi spine.conf
DB_Host localhost DB_Database cacti DB_User cacti DB_Pass blog.whsir.com DB_Port 3306
驗證一下
/usr/local/spine/bin/spine
返回以下內容表示成功
20、進入web安裝
注意:如果訪問有問題,修改后建議清空下瀏覽器緩存,或直接開瀏覽器隱身模式,以防有緩存
http://IP/cacti
默認賬號admin 密碼admin
第一次登陸后會提示更改密碼,新版本密碼要求有大小寫特殊字符
設置語言、勾選許可協議,開始安裝
安裝向導檢查,根據檢查結果,自行更改php.ini和my.cnf文件,更改后記得重啟,如相關參數在配置中不存在,手動添加即可
這里需要在my.cnf添加以下參數(注意最后兩個參數如果不添加,后續可能會產生warning),然后重啟MySQL
vi /etc/my.cnf
[client] port = 3306 socket = /tmp/mysql.sock [mysqld] port = 3306 socket = /tmp/mysql.sock pid_file = /data/mysql/mysql.pid datadir = /data/mysql slow_query_log=off long_query_time=2 slow_query_log_file=/data/mysql/mysql_slow_query.log log-error = /data/mysql/error.log skip-external-locking key_buffer_size = 32M max_allowed_packet = 100M max_heap_table_size = 100M table_open_cache = 1024 sort_buffer_size = 1m net_buffer_length = 8K read_buffer_size = 1m read_rnd_buffer_size = 512K myisam_sort_buffer_size = 8M thread_cache_size = 16 query_cache_size = 32M tmp_table_size = 200M performance_schema_max_table_instances = 500 join_buffer_size = 120M explicit_defaults_for_timestamp = true #skip-networking #bind-address = 127.0.0.1 max_connections = 500 max_connect_errors = 2000 open_files_limit = 65535 # binlog log-bin=mysql-bin binlog_format=mixed server-id = 100 expire_logs_days = 10 # innodb default_storage_engine = InnoDB innodb_file_per_table = 1 innodb_data_home_dir = /data/mysql innodb_data_file_path = ibdata1:64M:autoextend innodb_log_group_home_dir = /data/mysql/ innodb_buffer_pool_size = 1280M innodb_log_file_size = 32M innodb_log_buffer_size = 8M innodb_flush_log_at_trx_commit = 1 innodb_lock_wait_timeout = 50 collation-server=utf8mb4_unicode_ci innodb_flush_log_at_timeout = 3 innodb_read_io_threads = 32 innodb_write_io_threads = 16 innodb_buffer_pool_instances = 17 innodb_io_capacity = 5000 innodb_io_capacity_max = 10000 [mysqldump] quick max_allowed_packet = 100M [myisamchk] key_buffer_size = 128M sort_buffer_size = 128M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout
重啟數據庫
/etc/init.d/mysql restart
Poller輪詢器配置
spine是一個高速的輪詢器,是cmd.php的替代品,在cmd.php的基礎上,擁有更好的靈活性、速度和並發性。
cacti默認使用的cmd.php進行輪詢,由於我們之前已經安裝好了spine,所以我這里就更改成spine。
在cacti監控系統中,選擇系統配置→設置→Poller→采集類型選擇spine→保存
將cmd.php改為spine
到此Cacti就安裝完成
測試檢驗
驗證snmp
使用以下命令驗證snmp能否獲取到本機的數據
如果正常,會返回以下內容
配置crontab
如果不配置此功能,圖形界面全部會顯示The Cacti Poller has not run yet。
Centos7安裝crontab服務(系統默認一般都自帶此服務)
配置crontab前,請使用以下命令測試是否可以獲取數據
檢查圖形是否已出圖