自研产品集整体容器化升级,让开发更高效
文章撰写:朱学昊
开发时间:年1月
开发语言:Python
代码行数:+
运行方法:
1、传统“慧眼识财”系统运行在Linux单主机上,升级之后,系统将运行在容器之中,目前主要有两个容器,一个是python运行环境(客户端),一个是mysql运行环境(服务端);
2、传统“慧眼识财”系统将稽核数据加载到自己的数据结构中管理,升级之后,原始稽核数据和稽核结果都将统一放在mysql服务端,可视化水平更高,更容易新增稽核业务。
3、原始数据单表高达2.5亿条,耗费存储大概20多G,全部业务稽核下来,较每月能为公司节省六七十多万元结算损失,不要太值了。
分享序号:0202
应用版本:V1
一、背景
1、过去的一年,自主运维团队面向各个部门,开放了一系列自研产品,并投入生产,创造了巨大的经济效益。新的一年,自主运维团队,将立足其中高价值产品,扩大自研范围,探索更多的未知领域。
2、在开发的过程中,原来单机的软件研发架构,随着业务的不断扩展,必将限制研发效率,为了解决这一问题,年初,自主运维团队,将整个自研环境迁移至docker容器之中,利用业界灵活的开发技术和流程,让自研水平进一步提升。
3、2月初,已将“慧眼识财”系统迁移至docker容器之中,下面分享一下若干经验。
二、目标
1、将自主运维团队所开发的一系列有价值的产品,迁移至docker容器环境中,让开发、上线、运维更高效。
2、后继,自研产品将在docker容器中进行,通过自身的技术开发实践更好地理解业界一些好用的开发运维技术、管理、流程等。
3、浙江公司一句话说的挺好:在数字化转型氛围下,确立了“以数据为生产资料,以产品为核心驱动”的转型目标,从团队、数据、产品三个方面着手实施转型。
三、方法
从无到有的过程,装过一遍,用过一次,胜过看十本书
1、首先在win7中安装一个vmware,在vmware中安装一个Linux(我装CentOS7)。有现成的可执行安装文件,如有需要,可以联系我。
2、使用国内镜像按照网页展示,安装上Docker(网页搜,此处略)。然后就可以systemctlstartdocker,运行docker了。
3、使用国内镜像查找已经打包好的python、mysql镜像文件,下载到虚拟机中,然后就可以用下面两个命令来运行容器了,
dockerrun-itd-v/develop/mysqldata:/var/lib/mysql--namezhuxh_mysql-p:-eMYSQL_PASSWORD=mysql
dockerrun--namezhuxh_python_all-v/mnt/hgfs/vmshare:/support-itdzhuxh_python_all_v2
4、可以使用dockerinfo,systemctlstatusdocker等命令查看一系列docker运行状态,一切安装就位后,就可以进行开发了。
5、改造原来系统的代码:
(1)在自己的mysql中创建数据库
(2)在数据库中创建三张表:acct,settle,auditresult
(3)新写两个文件,分别是将稽核数据导入到MySql中
(4)改造原来稽核程序,从MySql中读取已加载好的数据,然后在内存中稽核
(5)将稽核的结果写入到Mysql中结果表中
(6)新写两个文件,一个文件生成统计界面,作为多棱镜的输入,另一个文件作为结算核减的输入
6、在入库的过程中,搞懂了docker的volume机制,并找到了利用存储存容器中大量数据的方法,解决了默认存储告警的问题
7、在本机开发过程中,研究docker四种网络模式,和共享存储等技术概念并实践之,感叹docker机制真强大
8、在稽核程序改造过程中,为了解决性能问题,用了许多方法尝试,研究了MySql的explain执行计划,MySql的join原理和使用,最终通过代码编写方法优化,解决了性能问题。说实在的Docker+MySql还真是厉害,在Win7环境下,下载一个HeidiSql客户端,就能很好地访问Docker内部的Mysql了,很方便开发。
Vmware-Win7环境
win7上的测试数据,可视化开发环境
生产上的容器:mysql和python3
生产上的mysql中稽核结果表:
四、效果
1、我们用新的程序重做了10月份的咪咕音乐结算倒挂程序,利用MySql可视化方法,我们可以展示更加细致的倒挂明细。
2、我们有信心在Docker平台上做更多的业务稽核和自研产品。
五、下一步计划
1、自主运维团队着手迁移以前的产品,将有价值的自研产品迁移到Docker中去,将效果不好的产品下线。
2、后继相关开发都将在Docker平台上进行开发,走完AIDevOps全流程。
3、计划搞一个docker实战培训。
六、附源码
1、ImportDBAcct.py
Createdon年1月22日
author:zhuxuehaoimportpymysql
importXHTools
importsys
#key:phone,val=acctlist
defloadAcct(acctfilename):
globalgMonth
globalcursor
globaldb
#acctfilename=paid.txt
#sql语句
thesql=INSERTINTOacct(msisdn,userid,month,acctitem,chgamount)VALUES(%s,%s,%s,%s,%s)
inum=0
insert_data=[]
lines=XHTools.openMyFile(./{}.format(acctfilename))
print(len(lines)={}.format(len(lines)))
forlninlines:
if(inum%)==0:
print(loadacctfile={}.format(inum))
#logging.debug({}.format(inum))
inum+=1
#bigtype=settle
tmp=ln.split(=)
iflen(tmp)!=6:
continue
phone=tmp[0].rstrip()
idno=tmp[1].rstrip()
cycle=tmp[2][:6]
acctitem=tmp[3]
chgmoney=tmp[4]
realmoney=tmp[5]
ifchgmoney==0:
continue
onelist=[]
onelist.append(phone)
onelist.append(idno)
onelist.append(cycle)
onelist.append(acctitem)
onelist.append(chgmoney)
insert_data.append(onelist)
insert_data_len=len(insert_data)
ifinsert_data_len:
print(len(insert_data)={}.format(insert_data_len))
try:
res=cursor.executemany(thesql,insert_data)
db.