4月 27

tornado 从2.4升级3.0.1遇到的问题

  ”琼台博客”评论tornado3.0.1版本居然没有database。我一直在使用tornado2.4 也打算升级最新版本3.0.1学习一下。
  我先在阿里的云主机上试试。遇到了两个问题。
首先使用easy_install安装到最新版。
#easy_install -U tornado
原有数据库部分代码

from tornado import database

# format  ip, database name, user name, password
db = database.Connection("x.x.x.x","simonzhang","test", "123", 24*3600)

报错
Traceback (most recent call last):
File ““, line 1, in
ImportError: No module named database

  按照”琼台博客”所写安装torndb(直接使用mysqldb-python也可以,但是会有点麻烦)
# easy_install -U torndb
修改代码如下:

import torndb

#torndb.Connection(host, database, user=None, password=None, max_idle_time=25200, connect_timeout=0, time_zone='+0:00'
db = torndb.Connection("x.x.x.x","simonzhang","test", "123", 24*3600)

修改完毕报启动服务器
python main.py 8888
报错如下
socket.error: [Errno 97] Address family not supported by protocol

mail.py的部分代码

if __name__ == "__main__":
    listen_ip =  sys.argv[1]
    application.listen(listen_port)
    tornado.ioloop.IOLoop.instance().start()

应该是因为阿里云主机是两块网卡,eth0是内网,eth1是外网。所以直接也把IP指定

if __name__ == "__main__":
    listen_ip =  sys.argv[1]
    listen_port =  sys.argv[2]
    application.listen(listen_port, listen_ip)
    tornado.ioloop.IOLoop.instance().start()

启动服务
python mail.py x.x.x.x 8888

服务正常启动。

4月 19

hadoop运维问题1

2013-04-19 21:18:29,171 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: org.apache.hadoop.util.DiskChecker$DiskErrorException: Invalid value for volsFailed : 1 , Volumes tolerated : 0
at org.apache.hadoop.hdfs.server.datanode.FSDataset.(FSDataset.java:975)
at org.apache.hadoop.hdfs.server.datanode.DataNode.startDataNode(DataNode.java:389)
at org.apache.hadoop.hdfs.server.datanode.DataNode.(DataNode.java:299)
at org.apache.hadoop.hdfs.server.datanode.DataNode.makeInstance(DataNode.java:1582)
at org.apache.hadoop.hdfs.server.datanode.DataNode.instantiateDataNode(DataNode.java:1521)
at org.apache.hadoop.hdfs.server.datanode.DataNode.createDataNode(DataNode.java:1539)
at org.apache.hadoop.hdfs.server.datanode.DataNode.secureMain(DataNode.java:1665)
at org.apache.hadoop.hdfs.server.datanode.DataNode.main(DataNode.java:1682)

原因:磁盘损坏或链接失败
解决方案:通过hdfs的页面可以查到是那台服务器问题,在问题服务器上查看查看是那块硬盘的问题。紧急处理,停止该机的hdfs服务,在hadoop的hdfs-site.xml的配置中将损坏硬盘去掉,然后启动hdfs。之后尽快更换硬盘。

在恢复过程中使用“hadoop fsck /”查看当前状态。主要看“Missing replicas”副本丢失的比例,当数值为0%时,则恢复到系统设置的副本数量。
Minimally replicated blocks: 最小副本块完整的比例
Over-replicated blocks: 副本数高出设定默认复制级别参数的数据块文件所占比率
Under-replicated blocks: 副本数低于设定默认复制级别参数的数据块文件所占比率
Mis-replicated blocks: 丢失的副本块文件所占比率
Default replication factor: 默认副本数量
Average block replication: 实际平均副本数
Corrupt blocks: 损坏的block数
Missing replicas: 丢失的副本数
Number of data-nodes: 数据节点数
Number of racks: 机架数,如果没配置机架,默认都是1

4月 18

监控mysql从机同步状态脚本

  mysql数据库主从运行。为了知道从机的同步情况,写了个脚本,放在crontab中,如果同步出错,则邮件报警。去年写的,放上来做个备忘。

#!/usr/local/bin/python
# -------------------------------------------------------------------------------
# Filename:    .py
# Revision:    1.0
# Date:        2012-03-20
# Author:      simonzhang
# Web:         www.simonzhang.net
# Email:       simon-zzm@163.com
# -------------------------------------------------------------------------------
import os
import pexpect
import time
import smtplib
from email.mime.text import MIMEText

#### base se
mysql_bin = '/mysql5/bin/mysql'
mysql_user = ''
mysql_pass = ''
mail_host = 'smtp.exmail.qq.com'
mail_user = 'XXX@XXX.net'
mail_pwd = 'XXXX'
mail_to = "xxxxx@xxx.com"
####

def mail_warn(error_ip):
    content = 'IP %s mysql slave is error!'%error_ip
    msg = MIMEText(content)
    msg['From'] = mail_user
    msg['Subject'] = 'mysql warnning %s'%error_ip
    msg['To'] = mail_to
    try:
        s = smtplib.SMTP()
        s.connect(mail_host)
        s.login(mail_user,mail_pwd)
        s.sendmail(mail_user,[mail_to],msg.as_string())
        s.close()
    except Exception ,e:
        print e

def main():
    status = os.popen("%s -u%s -p%s -e 'show slave status\G'"%
                      (mysql_bin,mysql_user,mysql_pass)).read() 
    io_status = status[status.find('Slave_IO_Running: ')+18]
    sql_status = status[status.find('Slave_SQL_Running: ')+19]
    if (io_status == 'Y') or (sql_status == 'Y'):
        ip = os.popen("/sbin/ifconfig|grep 'inet addr'|awk '{print $2}'").read()
        get_local_ip = ip[ip.find(':')+1:ip.find('n')]
        mail_warn("%s"%get_local_ip)

if __name__ == "__main__":
    main()