运维

由于一些错误操作导致mysql server 无法正常启动

tail /var/log/mysqld.log

查看错误日志:

1
2
3
4
5
6
7
8
9
10
11
12
ERROR 1286 (42000): Unknown table engine 'InnoDB'

InnoDB: stored checksum 1820380758, prior-to-4.0.14-form stored checksum 1820380758
InnoDB: Page lsn 2 3436109869, low 4 bytes of lsn at page end 3436109869
InnoDB: Page number (if stored to page already) 5,
InnoDB: space id (if created with >= MySQL-4.1.1 and stored already) 0
InnoDB: Page may be a transaction system page
InnoDB: Also the page in the doublewrite buffer is corrupt.
InnoDB: Cannot continue operation.
InnoDB: You can try to recover the database with the my.cnf
InnoDB: option:
InnoDB: innodb\_force\_recovery=6

修改/etc/my.cnf innodb_force_recovery=6 后重启mysql。 备份所有数据库:

mysqldump -A -uroot -p > all.sql

由于mysql server很久没升级了,而且用的是阿里云提供的安装脚本,我想完全删除再通过yum安装: 删除mysql客户端及服务端

yum remove mysql mysql-server

移除或备份mysql数据文件夹

mv /var/lib/mysql /var/lib/mysql\_old\_backup

安装mysql社区版

yum instanll mysql mysql-server

启动mysql-server

sudo /sbin/service mysqld start

报错:

[ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable

解决:

chown -R mysql:mysql /var/lib/mysql

初始安装设置 查看安装后的默认root密码

sudo grep 'temporary password' /var/log/mysqld.log

下面会提示输入上面查到的密码

sudo /usr/bin/mysql_secure_installation

查看运行的django网站日志

……
MySQLdb ……
……
OperationalError: (2002, “Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)”)

MySQLdb尝试通过 ‘/tmp/mysql.sock’连接mysql 而此时mysql通过 ‘/var/lib/mysql/mysql.sock’建立的连接,调整django settings

DATABASES = {
    'default': {
       ......
        'OPTIONS': { 'unix_socket':'/var/lib/mysql/mysql.sock'}
    }
}

在此期间发现另一个错误

OperationalError: (1193, "Unknown system variable 'storage_engine'")

这是之前在DATABASES OPTIONS里配置的,可能由于mysql版本差异(新安装的是5.7.20 MySQL Community Server)已经没有这个变量了,于是删除了这块的配置。

"init_command": "SET storage_engine=INNODB"

以上所有操作都在CentOS release 6.5 (Final)进行的。

构思:salt + redis 结合一个python web framework来做 参考项目: saltobserver 用flask搭建用来展示salt redis returner的结果,采用gevent实时从redis里获取数据并发送给websocket client. 最初我想使用asyncio,我看到asyncio可以很方便的和tornaodo结合起来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from tornado.platform.asyncio import AsyncIOMainLoop

def main():
tornado.options.parse\_config\_file("config.py")
tornado.options.parse\_command\_line()
AsyncIOMainLoop().install()
application = Application()
application.listen(options.port)
loop = asyncio.get\_event\_loop()
try:
loop.run_forever()
except KeyboardInterrupt:
pass
finally:
loop.close()

tornado-redis 作者说如果使用redis pubsub推荐用他这个项目,项目的demo里有个sockjs demo 展示了如何使用tornado-redis构建公共聊天网站。 demo里用到了sockjs-tornado,然而这个是为了结合socketjs来使用的,也就是说同时处理一般的http请求和websocket,我并不考虑向下兼容的问题,那么

1
subscriber = tornadoredis.pubsub.SockJSSubscriber(tornadoredis.Client())

这个tornadoredis.pubsub.SockJSSubscriber类我是否用得到呢?这只是一个包装类,继承自BaseSubscriber重写了on_message发送广播给subscribers。
看来用不到,那么我大概可以用SocketIOSubscriber在tornado.websocket.WebSocketHandler处理subscribe,unsubscribe,重写on_message就好了。

原本我想使用asyncio同时我可以使用asyncio-redis 这样我web framework我可以用更简单的aiohttp,然而当我在服务器上测试用salt client发送指令时发现并不能兼容python3 https://github.com/saltstack/salt/issues/24750 那么综合下来可供我使用的有哪些呢
由于salt client暂时不支持python3,也就无法使用asyncio,aiohttp,那么我先用tornado这样以后支持也很方便切换过来。
SocketIOSubscriber的on_message会调用subscriber的on_message也就是在Handler里on_message,那么SocketIOSubscriber的on_message什么时候调用呢?当redis里有了新消息时。


今天是10月8日,昨天的雾霾消散了。发布这篇文章有一个多月了,这个构思走到了第一个版本,我把它放在了github,下面是预览。

assassin_preview

https://github.com/bung87/assassin 项目名称用了一款我喜爱的游戏的名字《刺客信条》。用两台机器配置了saltstack查看各种命令返回的数据结构,然后找来一些库解析结果,实现功能,尚未在正式环境跑过。 只有ping大致的做了数据可视化,用raphel.js实现了动画效果,然后包含ping,dig,traceroute都做了基本的表格形式的数据展示。 traceroute这个功能应该是选择一个节点去测试,由于兴趣也不是很浓,没做到这一步。 任务用jquery的deffered实现任务状态的更新,基于socket实现实时的客户端任务状态更新,完成了process状态的实现,需要根据任务开始前确定可用节点,及任务结束后确定返回结果的节点,设置超时,对比节点响应数等,这部分没做。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×