Kaynağa Gözat

解决数据库重连隐患(当数据库[MySQL|Redis]重启后)

James Iter 8 yıl önce
ebeveyn
işleme
ee1b000228
3 değiştirilmiş dosya ile 57 ekleme ve 27 silme
  1. 5 3
      docs/todo.md
  2. 21 2
      models/database.py
  3. 31 22
      models/initialize.py

+ 5 - 3
docs/todo.md

@@ -39,9 +39,10 @@
 - [x] 系统模板加入是否为 Windows 类系统的标记
 - [x] 系统模板加入是否为 Windows 类系统的标记
 - [x] 系统模板为 Windows 时,时钟偏移值设定为 localtime,否则为 utc
 - [x] 系统模板为 Windows 时,时钟偏移值设定为 localtime,否则为 utc
 - [x] 初始化时,生成默认的启动作业及其细则,方便用户直接使用
 - [x] 初始化时,生成默认的启动作业及其细则,方便用户直接使用
-- [ ] 制作适用于 JimV 的 CentOS 7、Windows 2012 模板镜像
-- [ ] 制作模板镜像的 BT 链接,并展现到模板镜像的下载页面
-- [ ] 解决数据库重连隐患(当数据库[MySQL|Redis]重启后)
+- [x] 制作适用于 JimV 的 CentOS 7 Mini 模板镜像
+- [ ] 制作适用于 JimV 的 Windows 2012 模板镜像
+- [x] 制作模板镜像的 BT 链接,并展现到模板镜像的下载页面
+- [x] 解决数据库重连隐患(当数据库[MySQL|Redis]重启后)
 - [ ] 考虑开辟一个单独的消息处理线程。所有业务消息都塞到进程中的队列内,由该线程统一处理。这样可以更好的处理数据库重连问题。
 - [ ] 考虑开辟一个单独的消息处理线程。所有业务消息都塞到进程中的队列内,由该线程统一处理。这样可以更好的处理数据库重连问题。
 - [ ] 去除非 Debug 模式下的调试信息
 - [ ] 去除非 Debug 模式下的调试信息
 - [ ] 实现 CentOS 7 单机版一建安装脚本(包括全新的数据库安装、配置、部署)
 - [ ] 实现 CentOS 7 单机版一建安装脚本(包括全新的数据库安装、配置、部署)
@@ -65,5 +66,6 @@
 - [ ] 考虑 vm_network,vm_manage_network 改名为 vm_network_bridge,vm_manage_network_bridge
 - [ ] 考虑 vm_network,vm_manage_network 改名为 vm_network_bridge,vm_manage_network_bridge
 - [ ] 通过 sysctl 隔离出 vnc 使用的端口,避免被冲突。参见 net.ipv4.ip_local_reserved_ports
 - [ ] 通过 sysctl 隔离出 vnc 使用的端口,避免被冲突。参见 net.ipv4.ip_local_reserved_ports
 - [ ] 考虑热更新、升级的问题
 - [ ] 考虑热更新、升级的问题
+- [ ] 加入清除老旧日志的功能
 
 
 
 

+ 21 - 2
models/database.py

@@ -2,6 +2,8 @@
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
 
 
 
 
+import traceback
+
 import mysql.connector
 import mysql.connector
 import mysql.connector.pooling
 import mysql.connector.pooling
 import redis
 import redis
@@ -68,8 +70,11 @@ class Database(object):
                 _cnx.close()
                 _cnx.close()
 
 
         while True:
         while True:
-            time.sleep(5)
-            ping(label='', _cnxpool=cls.cnxpool)
+            try:
+                time.sleep(5)
+                ping(label='', _cnxpool=cls.cnxpool)
+            except:
+                logger.error(traceback.format_exc())
 
 
     @classmethod
     @classmethod
     def init_conn_redis(cls):
     def init_conn_redis(cls):
@@ -107,3 +112,17 @@ class Database(object):
 
 
         cls.r.client_setname(ji.Common.get_hostname())
         cls.r.client_setname(ji.Common.get_hostname())
 
 
+    @classmethod
+    def keepalived_redis(cls):
+        while True:
+            try:
+                time.sleep(5)
+                cls.r.ping()
+
+            except redis.exceptions.ConnectionError as e:
+                logger.error(e.message)
+                cls.init_conn_redis()
+
+            except:
+                logger.error(traceback.format_exc())
+

+ 31 - 22
models/initialize.py

@@ -2,6 +2,7 @@
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
 
 
 
 
+import traceback
 from multiprocessing import JoinableQueue
 from multiprocessing import JoinableQueue
 from flask import Flask
 from flask import Flask
 import logging
 import logging
@@ -134,12 +135,16 @@ class Init(object):
         from models import Utils
         from models import Utils
 
 
         while True:
         while True:
-            if Utils.exit_flag:
-                print 'Thread pub_sub_ping_pong say bye-bye'
-                return
+            try:
+                if Utils.exit_flag:
+                    print 'Thread pub_sub_ping_pong say bye-bye'
+                    return
+
+                time.sleep(10)
+                db.r.publish(app.config['instruction_channel'], message=json.dumps({'action': 'ping'}))
 
 
-            time.sleep(10)
-            db.r.publish(app.config['instruction_channel'], message=json.dumps({'action': 'ping'}))
+            except:
+                logger.error(traceback.format_exc())
 
 
     @staticmethod
     @staticmethod
     def clear_expire_monitor_log():
     def clear_expire_monitor_log():
@@ -150,29 +155,33 @@ class Init(object):
         the_time = '03:30'
         the_time = '03:30'
 
 
         while True:
         while True:
-            if Utils.exit_flag:
-                print 'Thread clear_expire_monitor_log say bye-bye'
-                return
+            try:
+                if Utils.exit_flag:
+                    print 'Thread clear_expire_monitor_log say bye-bye'
+                    return
+
+                time.sleep(10)
 
 
-            time.sleep(10)
+                # 每天凌晨3点30分执行,清除15天前的监控记录
+                if ji.JITime.now_time()[:5] == the_time and not already_clear:
+                    boundary = ji.Common.ts() - 86400 * 15
+                    filter_str = 'timestamp:lt:' + boundary.__str__()
 
 
-            # 每天凌晨3点30分执行,清除15天前的监控记录
-            if ji.JITime.now_time()[:5] == the_time and not already_clear:
-                boundary = ji.Common.ts() - 86400 * 15
-                filter_str = 'timestamp:lt:' + boundary.__str__()
+                    CPUMemory.delete_by_filter(filter_str=filter_str)
+                    Traffic.delete_by_filter(filter_str=filter_str)
+                    DiskIO.delete_by_filter(filter_str=filter_str)
 
 
-                CPUMemory.delete_by_filter(filter_str=filter_str)
-                Traffic.delete_by_filter(filter_str=filter_str)
-                DiskIO.delete_by_filter(filter_str=filter_str)
+                    HostCPUMemory.delete_by_filter(filter_str=filter_str)
+                    HostTraffic.delete_by_filter(filter_str=filter_str)
+                    HostDiskUsageIO.delete_by_filter(filter_str=filter_str)
 
 
-                HostCPUMemory.delete_by_filter(filter_str=filter_str)
-                HostTraffic.delete_by_filter(filter_str=filter_str)
-                HostDiskUsageIO.delete_by_filter(filter_str=filter_str)
+                    already_clear = True
 
 
-                already_clear = True
+                if already_clear and ji.JITime.now_time()[:5] != the_time:
+                    already_clear = False
 
 
-            if already_clear and ji.JITime.now_time()[:5] != the_time:
-                already_clear = False
+            except:
+                logger.error(traceback.format_exc())
 
 
 
 
 q_ws = JoinableQueue()
 q_ws = JoinableQueue()