动态升级,就是程序不退出的情况下,将其代码更新的策略。假设集群含有多个机器,然后每个机器部署一套程序,当升级的时候就要去所有的上面部署一把。
(1)有个包装程序专门负责接口并检查是否需要更新,当需要更新的时候,下载下来。
(2)动态引用,将实质程序放到独立文件和文件夹下面,通过动态引用,调用的时候reload;
客户端代码:
import rpyc import sys def update(remoteHost): c=rpyc.connect(remoteHost,12233) content="".join(file("Test.py","r").readlines()) print c.root.update(content) c.close() ipList=["10.101.92.211","10.101.90.203","10.101.91.239"] for ip in ipList: update(ip)
服务器端:
import time,subprocess from rpyc import Service from rpyc.utils.server import ThreadedServer import sys g_module=None class TimeService(Service): def exposed_sum(self,a,b): return a+b def exposed_show(self,cmd): #cmd='''grep "FAIL" /home/admin/alisatasknode/taskinfo/*/*/*/*/*/*/*.log ''' return self.do_cmd(cmd)[1] def do_cmd(self,cmd): p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() return p.returncode, out, err def exposed_process(self,starttime): self.modulePath="/home/admin/rpyc-3.3.0/server.py" global g_module if g_module is None: print("none") g_module=__import__('Test') else: print("reload") g_module=reload(g_module) Test=getattr(g_module,"Test") t=Test() return t.getFailure(starttime) def exposed_update(self,content): outfile=open("Test.py","w") outfile.write(content) return "OK" s=ThreadedServer(TimeService,port=12233,auto_register=False) s.start()
在Test.py里面实现真正的逻辑
import subprocess import os,time class Test(): def do_cmd(self,cmd): p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() return p.returncode, out, err def getFailure(self,starttime): key="Table not found" keyfile= key.replace(" ","_")+".txt" timeArray = time.strptime(starttime,"%Y:%m:%d:%H:%M:%S") timeStamp = int(time.mktime(timeArray)) print("timeStamp:%s" % (timeStamp)) cmd="grep '%s' /home/admin/alisatasknode/taskinfo/20141222/phoenix/20141221/*/*/*/*.log" % (key) print("cmd:%s" % (cmd)) r=self.do_cmd(cmd) print(r[0]) infos="" if r[0] == 0: filelist=r[1].split(" ") for info in filelist: filename=info.split(":")[0] #print("filename:%s" % (filename)) if filename.find("taskinfo") < 0: continue filestamp=os.path.getmtime(filename) if filestamp >= timeStamp: print("timeStamp:%s filestamp:%s info:%s" % (timeStamp,filestamp,info)) if info.find(key): infos=infos+" "+info return infos ~