设为首页 收藏本站
查看: 3009|回复: 0

[经验分享] Lepus 天兔 监控-增加redis 内存使用报警

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-1-16 18:11:07 | 显示全部楼层 |阅读模式
安装需求

PHP和Python都是跨平台的语言,所以理论上系统应该可以支持在不同的平台上运行。但是由于时间和精力以及资源有限,目前天兔系统只测试完善了Centos/RedHat系统的支持。我们目前提供的技术支持也是只针对于Centos/RedHat系统,其他系统暂不支持技术服务。
需要的核心包如下:
以下软件包只需要部署在监控机即可。被监控机无需部署。
1.MySQL 5.0及以上(必须,用来存储监控系统采集的数据)
2.Apache 2.2及以上(必须,WEB服务器运行服务器)
3.PHP 5.3以上(必须,提供WEB界面支持)
4.Python2 (必须,推荐2.6及以上版本,执行数据采集和报警任务,不支持Python3)
5.Python连接和监控数据库的相关驱动模块包:
MySQLdb for python (Python连接MySQl的接口,用于监控MySQL,此模块必须安装)
cx_oracle for python  (Python连接Oracle的接口,非必须,如果需要监控oracle此模块必须安装)
Pymongo for python (Python连接MongoDB的接口,非必须,如果需要监控MongoDB此模块必须安装)
redis-py for python (Python连接Redis的接口,非必须,如果需要监控Redis此模块必须安装)


安装LAMP环境
(略)

安装Python基础模块
首先安装Python环境(Python版本要求为Python2.6以上,不支持Python3)

其次安装数据库连接Python的驱动包

1.安装MySQLdb for python (必须安装)
MySQLdb为Python连接和操作MySQL的类库,如果您准备使用lepus系统监控MySQL数据库,那么该模块必须安装。
安装步骤如下:
#wgethttp://cdn.lepus.cc/cdncache/software/MySQLdb-python.zip
# unzip MySQLdb-python.zip
# cd MySQLdb1-master/
# which mysql_config
/usr/local/mysql/bin/mysql_config
# vim site.cfg 修改如下:
mysql_config =/usr/local/mysql/bin/mysql_config
echo"mysql_config = /usr/local/mysql/bin/mysql_config" >> site.cfg
# python setup.py build
# python setup.py install

常见错误解决:
1).如果编译python出现如下问题
/usr/bin/ld: cannot find -lpython2.7
collect2: ld returned 1 exit status
error: command 'gcc' failed with exit status 1
请按如下步骤处理:
A.检查并安装python-devel包
# yum -y install python-devel
B.将libpython2.7.so库文件建立软连接到/usr/lib下
32位服务器下执行
# ln -s/usr/local/Python2.7/lib/libpython2.7.so /usr/lib/libpython2.7.so
64位服务器下执行
# ln -s/usr/local/Python2.7/lib/libpython2.7.so /usr/lib64/libpython2.7.so
C.检查下/etc/ld.so.conf是否包含/usr/local/Python2.7/lib
#vi /etc/ld.so.conf 添加/usr/local/Python2.7/lib
#/sbin/ldconfig
2).安装时一定要安装mysql-devel,否则上面安装报错。
yum install mysql-devel
3).需要制定so文件,否则报错。
find / -name libmysqlclient.so.18
cp/usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64/


2.安装cx_oracle for python (如果需要监控Oracle则必须安装)
下载安装oracleinstant client
http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html
如果是64位的,请选择.*x86_64.rpm,否则是.*i386.rpm
如果是oracle 9i或更高,请选择Instant Client 11,如果是8或8i,请选择Instant Client 10

[iyunv@westserver software]# rpm -ivhoracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
Preparing...########################################### [100%]
1:oracle-instantclient11.###########################################[100%]
[iyunv@westserver software]# rpm -ivhoracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm
Preparing...########################################### [100%]
1:oracle-instantclient11.###########################################[100%]
[iyunv@westserver software]# rpm -ivhoracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm
Preparing...########################################### [100%]
1:oracle-instantclient11.###########################################[100%]

[iyunv@westserver home]# vim /root/.bash_profile

ORACLE_HOME="/usr/lib/oracle/11.2/client64"
PATH=$PATH:$ORACLE_HOME/bin
export PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib:/usr/local/lib
export LD_LIBRARY_PATH

修改完成后重新加载bash_profile文件
[iyunv@westserver cx_Oracle-5.1.2]# source ~/.bash_profile

[iyunv@westserver software]# vim /etc/ld.so.conf加入
/usr/lib/oracle/11.2/client64/lib
执行ldconfig生效
[iyunv@westserver software]# ldconfig

安装cx_oracle
# wget http://cdn.lepus.cc/cdncache/software/cx_Oracle-5.1.2.tar.gz
# tar zxvf cx_Oracle-5.1.2.tar.gz
# cd cx_Oracle-5.1.2
# python setup.py build
# python setup.py install


3.安装Pymongo for python (如果需要监控Mongodb则必须安装)
pymongo为Python连接和操作MongoDB的类库,如果您准备使用lepus系统监控MongoDBs数据库,那么该模块必须安装。
安装步骤如下:
# wget http://cdn.lepus.cc/cdncache/software/pymongo-2.7.tar.gz
# tar zxvf pymongo-2.7.tar.gz
# cd pymongo-2.7
# python setup.py install

4.安装Redis 驱动(如果需要监控Redis则必须安装)
# wget http://cdn.lepus.cc/cdncache/software/redis-py-2.10.3.tar.gz
# tar zxvf redis-py-2.10.3.tar.gz
# cd redis-2.10.3/
# python setup.py install

5.安装SQLServer驱动(如果需要监控SQLServer则必须安装)
安装pymssql需要的包:
freetds(http://www.filewatcher.com/m/freetds-0.82.tar.gz.1596755-0.html)
setuptools(https://pypi.python.org/pypi/setuptools)
pymssql(https://pypi.python.org/pypi/pymssql/)

安装步骤:
A. 安装freetds

#tar zxvf freetds-0.82.tar.gz
#cd freetds-0.82
#./configure --prefix=/usr/local/freetds--with-tdsver=8.0 --enable-msdblib --enable-dbmfix --with-gnu-ld--enable-shared --enable-static
#make && make install
#echo "/usr/local/freetds/lib">> /etc/ld.so.conf.d/freetds.conf
#ldconfig -v

B. 安装setuptools
#tar zxvf setuptools-3.5.1.tar.gz
#cd setuptools-3.5.1
# python setup.py install

C. 安装pymssql
#tar zxvf pymssql-2.1.0.tar.gz
#cd pymssql-2.1.0
#python setup.py install
注:如果不安装freetds,会报如下错误:
error: command 'gcc' failed with exit status 1

6.测试各个驱动是否正常运行(非必须)
在lepus的安装文件包python目录中,你可以找到如下测试文件,测试上述驱动是否安装正确。
# python test_driver_mysql.py
MySQL python drivier is ok!
# python test_driver_oracle.py
Oracle python drivier is ok!
# python test_driver_mongodb.py
MongoDB python drivier is ok!
# python test_driver_redis.py
Redis python drivier is ok!



安装Lepus采集器
安装Lepus监控系统
注:在安装Lepus系统之前,请先根据前面内容安装LAMP和Python运行基础环境。

1)上传软件包到监控机服务器并解压缩软件到您的系统
# unzip lepus_vx.x.x.zip
2).在监控机创建监控数据库,并授权。
mysql> create database lepus defaultcharacter set utf8;
mysql> grantselect,insert,update,delete,create on lepus.* to 'lepus_user'@'localhost'identified by ‘xxxxxx';
##以上的是对监控机的程序连接数据库进行的授权,与对其他mysql实例监控无关。
mysql> flush privileges;
导入SQL文件夹里的SQL文件(表结构和数据文件)
# mysql -uroot –p  lepus < sql/lepus_table.sql
# mysql -uroot –p  lepus < sql/lepus_data.sql
注意:需要修改lepus_table.sql脚本中的字段host的长度,因为规定了varchar(30),如果监控类似阿里云RDS时,主机名长度在40以上,那么此时数据库会截断该字段,造成无法同被监控数据库实例相连。

4)安装Lpeus程序
进入到软件包的python文件夹
# cd python/
授予install.sh可执行权限
# chmod +x install.sh
执行安装
# ./install.sh
[note] lepus will be install on basedir:/usr/local/lepus
[note] /usr/local/lepus directory does notexist,will be created.
[note] /usr/local/lepus directory createdsuccess.
[note] wait copy files.......
[note] change script permission.
[note] create links.
[note] install complete.

5) 修改配置文件
进入到安装目录,默认为/usr/local/lepus
# cd /usr/local/lepus/
# vim etc/config.ini
###监控机MySQL数据库连接地址###
[monitor_server]
host="127.0.0.1"
port=3306
user=" lepus_user “
##该用户填写上面的对监控机的授权
passwd="xxxxxx"
dbname="lepus"


6) 启动Lepus (可选)
此时,你可以执行启动命令启动lepus采集进程
[iyunv@ebs-cloud lepus]# lepus start
nohup: 把输出追加到"nohup.out"
lepus server start success!

但是因为没有添加主机,所以查看日志会看到如下提示,属于正常提示。您也可以在部署完Lepus WEB控制台后再进行启动。

[iyunv@ebs-cloud lepus]# tail -f logs/lepus.log
2015-08-03 13:09:09 [WARNING] check mongodb:not found any servers
2015-08-03 13:09:09 [INFO] check mongodbcontroller finished.
2015-08-03 13:09:12 [INFO] check rediscontroller started.
2015-08-03 13:09:12 [WARNING] check redis: notfound any servers
2015-08-03 13:09:12 [INFO] check rediscontroller finished.
2015-08-03 13:09:15 [INFO] check os controllerstarted.
2015-08-03 13:09:15 [WARNING] check os: notfound any servers
2015-08-03 13:09:15 [INFO] check os controllerfinished.
2015-08-03 13:09:38 [INFO] alarm controllerstarted.
2015-08-03 13:09:38 [INFO] alarm controllerfinished.


Lepus采集程序安装完毕!


安装WEB管理台
复制PHP文件夹里的文件到Apache对应的网站虚拟目录(备注:根本不同的安装方式,这个目录是不一样的,如果采用xampp安装的Apache环境,则默认程序目录为/opt/lampp/htdocs/),例如
# cp -rf php/* /opt/lampp/htdocs/
打开application\config\database.php文件,修改PHP连接监控服务器的数据库信息
$db['default']['hostname'] = '127.0.0.1';
$db['default']['username'] = 'lepus_user';
$db['default']['password'] = 'xxxxxx';
$db['default']['database'] = lepus;
$db['default']['dbdriver'] = 'mysql';
9)登录进行添加主机和监控
通过浏览器输入IP地址或域名打开监控界面,即可登录系统。.默认管理员账号密码admin/Lepusadmin登录后请修改管理员密码,增加普通账号。


启动和关闭Lepus
启动监控系统
执行以下命令启动系统采集进程
# lepus start
执行以下命令关闭系统采集进程
# lepus stop
执行以下命令监控系统是否正常运行
# lepus status
lepus server is running...
查看启动关闭帮助命令
#lepus --help
lepus help:
support-site:  www.lepus.cc
====================================================================
start     Start lepus monitor server; Command: #lepus start
stop     Stop lepus monitor server; Command: #lepus stop
status    Check lepus monitor run status; Command: #lepus status



监控主机OS系统
yum -y install net-snmp*
sed -i "s/com2sec notConfigUser  default      public/com2sec notConfigUser 10.44.183.33      lepus/g"/etc/snmp/snmpd.conf
sed -i "s/systemview none none/all nonenone/g" /etc/snmp/snmpd.conf
sed -i "s/#view all    included /view all    included /g" /etc/snmp/snmpd.conf
#/etc/init.d/snmpd start
#grep 'Simple Net Mgmt Proto' /etc/services
#echo $?
#lsof -i :161
#ps -ef | grep 'snmpd'
sed -i 's|OPTIONS="-LS0-6d -Lf /dev/null-p /var/run/snmpd.pid"|OPTIONS="-LS 4 d -p /var/run/snmpd.pid-a"|g' /etc/init.d/snmpd
/etc/init.d/snmpd restart

监控机器验证脚本
for ip in 192.168.1.10 192.168.1.11
do
snmpwalk -v 1 -c lepus  $ip
snmpwalk -v 2c -c lepus  $ip
done

修改库增加监控:
update lepus.db_servers_os setthreshold_warning_os_process=1000 ,threshold_critical_os_process=1500 wherehost='10.47.210.138';

lepus.db_servers_os
insert into lepus.db_servers_os(host,community,tags,monitor,send_mail,threshold_warning_os_process,threshold_critical_os_process)values('10.45.14.51','lepus','Comment_DB_S1',1,1,1000,1500);
insert intolepus.db_servers_os(host,community,tags,monitor,send_mail,threshold_warning_os_process,threshold_critical_os_process)values('10.47.211.26','lepus','redis2_socket_OS',1,1,1000,1500);

lepus.db_servers_redis
insert into lepus.db_servers_redis values(0,'10.47.211.26',6784, null,"redis1_socket_6684_slave",1,1,"liuzhanbin@ifensi.com",0,null,1,1,1,1000,10000,5,3000,12000,15,0,0,CURRENT_TIMESTAMP );

注:OS 中网络的单位是KB。







监控MySQL数据库
授权即可
GRANT PROCESS, SUPER ON *.* TO'lepus'@'10.44.183.33' IDENTIFIED BY PASSWORD ‘*FCCFDA924CEE3ED0338661DD2144CA85326E2F4D'




注意:
1.后期添加新db类型监控项如Oracle,mongodb时,需安装python模块后进行验证,然后平台配置中,需要注意开启全局设置中的开关,同时需要重启lepus后才可正常采集数据。






添加对redis的内存监控表结构修改:
##增加redis阈值报警字段,默认警告阈值为80%,默认严重阈值为90%,如需调整,则到DB中手动进行调整。

alter tabledb_servers_redis add `alarm_memory_used` tinyint(2) NOT NULL DEFAULT '1',add`threshold_warning_memory_used_percent` bigint(20) NOT NULL DEFAULT '80',add`threshold_critical_memory_used_percent` bigint(20) NOT NULL DEFAULT '90';

alter tableredis_status add `maxmemory` bigint(20) NOT NULL DEFAULT '-1';
alter tableredis_status_history add `maxmemory` bigint(20) NOT NULL DEFAULT '-1' aftercreate_time;



修改py脚本
……………………………………修改check_redis.py,添加最大内存配置查询项
defcheck_redis(host,port,passwd,server_id,tags):
    try:
       r=redis.StrictRedis(host=host,port=int(port),password=passwd,db=0,socket_timeout=3,charset='utf-8')
        info=r.info()
        time.sleep(1)
        info_2=r.info()

        config=r.config_get()

        #get config
        maxmemory = config['maxmemory']

        # Server
        redis_version = info['redis_version']
        

        
sql = "insertintoredis_status(server_id,host,port,tags,redis_role,connect,redis_version,redis_git_sha1,redis_git_dirty,redis_mode,os,arch_bits,multiplexing_api,gcc_version,process_id,run_id,tcp_port,uptime_in_seconds,uptime_in_days,hz,lru_clock,connected_clients,client_longest_output_list,client_biggest_input_buf,blocked_clients,used_memory,used_memory_human,used_memory_rss,used_memory_peak,used_memory_peak_human,used_memory_lua,mem_fragmentation_ratio,mem_allocator,loading,rdb_changes_since_last_save,rdb_bgsave_in_progress,rdb_last_save_time,rdb_last_bgsave_status,rdb_last_bgsave_time_sec,rdb_current_bgsave_time_sec,aof_enabled,aof_rewrite_in_progress,aof_rewrite_scheduled,aof_last_rewrite_time_sec,aof_current_rewrite_time_sec,aof_last_bgrewrite_status,total_connections_received,total_commands_processed,current_commands_processed,instantaneous_ops_per_sec,rejected_connections,expired_keys,evicted_keys,keyspace_hits,keyspace_misses,pubsub_channels,pubsub_patterns,latest_fork_usec,used_cpu_sys,used_cpu_user,used_cpu_sys_children,used_cpu_user_children,maxmemory)values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s);"
param =(server_id,host,port,tags,role,connect,redis_version,redis_git_sha1,redis_git_dirty,redis_mode,os,arch_bits,multiplexing_api,gcc_version,process_id,run_id,tcp_port,uptime_in_seconds,uptime_in_days,hz,lru_clock,connected_clients,client_longest_output_list,client_biggest_input_buf,blocked_clients,used_memory,used_memory_human,used_memory_rss,used_memory_peak,used_memory_peak_human,used_memory_lua,mem_fragmentation_ratio,mem_allocator,loading,rdb_changes_since_last_save,rdb_bgsave_in_progress,rdb_last_save_time,rdb_last_bgsave_status,rdb_last_bgsave_time_sec,rdb_current_bgsave_time_sec,aof_enabled,aof_rewrite_in_progress,aof_rewrite_scheduled,aof_last_rewrite_time_sec,aof_current_rewrite_time_sec,aof_last_bgrewrite_status,total_connections_received,total_commands_processed,current_commands_processed,instantaneous_ops_per_sec,rejected_connections,expired_keys,evicted_keys,keyspace_hits,keyspace_misses,pubsub_channels,pubsub_patterns,latest_fork_usec,used_cpu_sys,used_cpu_user,used_cpu_sys_children,used_cpu_user_children,maxmemory)
      
vim alarm.py

……………………………………修改alarm.py,添加内存的查询项
defget_alarm_redis_status():
    sql = "selecta.server_id,a.connect,a.connected_clients,a.current_commands_processed,a.blocked_clients,a.create_time,b.host,b.port,b.alarm_connected_clients,b.alarm_command_processed,b.alarm_blocked_clients,b.threshold_warning_connected_clients,b.threshold_critical_connected_clients,b.threshold_warning_command_processed,b.threshold_critical_command_processed,b.threshold_warning_blocked_clients,b.threshold_critical_blocked_clients,b.send_mail,b.send_mail_to_list,b.send_sms,b.send_sms_to_list,b.tags,'redis'as db_type,b.alarm_memory_used,b.threshold_warning_memory_used_percent,b.threshold_critical_memory_used_percent,round(a.used_memory/1024/1024)as memory_used_MB,round(a.maxmemory/1024/1024) asmaxmemory_MB,round(a.used_memory/a.maxmemory*100) as used_max_memory_percentfrom redis_status a, db_servers_redis b where a.server_id=b.id ;"
    result=func.mysql_query(sql)
    if result <> 0:
        for line in result:
            server_id=line[0]
            connect=line[1]
            connected_clients=line[2]
            current_commands_processed=line[3]
            blocked_clients=line[4]
            create_time=line[5]
            host=line[6]
            port=line[7]
            alarm_connected_clients=line[8]
            alarm_command_processed=line[9]
            alarm_blocked_clients=line[10]
           threshold_warning_connected_clients=line[11]
           threshold_critical_connected_clients=line[12]
           threshold_warning_command_processed=line[13]
           threshold_critical_command_processed=line[14]
            threshold_warning_blocked_clients=line[15]
           threshold_critical_blocked_clients=line[16]
            send_mail=line[17]
            send_mail_to_list=line[18]
            send_sms=line[19]
            send_sms_to_list=line[20]
            tags=line[21]
            db_type=line[22]
            alarm_memory_used=line[23]
           threshold_warning_memory_used_percent=line[24]
           threshold_critical_memory_used_percent=line[25]
            memory_used_MB=line[26]
            maxmemory_MB=[27]
            used_max_memory_percent=line[28]

………………………………………………  (在”ifint(alarm_command_processed)==1:”前面加上对于内存的报警)
                if int(alarm_memory_used)==1:
                    ifint(used_max_memory_percent) >= int(threshold_critical_memory_used_percent):
                        send_mail =func.update_send_mail_status(server_id,db_type,'used_max_memory_percent',send_mail,send_mail_max_count)
                        send_sms =func.update_send_sms_status(server_id,db_type,'used_max_memory_percent',send_sms,send_sms_max_count)
                       func.add_alarm(server_id,tags,host,port,create_time,db_type,'used_max_memory_percent',used_max_memory_percent,'critical','toomuch memory used',send_mail,send_mail_to_list,send_sms,send_sms_to_list)
                       func.update_db_status('sessions',3,host,port,create_time,'used_max_memory_percent',used_max_memory_percent,'critical')
                    elif int(used_max_memory_percent)>= int(threshold_warning_memory_used_percent):
                        send_mail =func.update_send_mail_status(server_id,db_type,'used_max_memory_percent',send_mail,send_mail_max_count)
                        send_sms =func.update_send_sms_status(server_id,db_type,'used_max_memory_percent',send_sms,send_sms_max_count)
                       func.add_alarm(server_id,tags,host,port,create_time,db_type,'used_max_memory_percent',used_max_memory_percent,'warning','toomuch memory used',send_mail,send_mail_to_list,send_sms,send_sms_to_list)
                       func.update_db_status('sessions',2,host,port,create_time,'used_max_memory_percent',used_max_memory_percent,'warning')
                    else:
                        func.check_if_ok(server_id,tags,host,port,create_time,db_type,'used_max_memory_percent',used_max_memory_percent,'memoryis ok',send_mail,send_mail_to_list,send_sms,send_sms_to_list)
                       func.update_db_status('sessions',1,host,port,create_time,'used_max_memory_percent',used_max_memory_percent,'ok')
            
               ifint(alarm_command_processed)==1:
                  


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-329314-1-1.html 上篇帖子: centos 7.3 banner信息设置 下篇帖子: 使用crontab让Linux定时执行脚本文件 监控
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表