首页 文章 精选 留言 我的

精选列表

搜索[增删改查],共8405篇文章
优秀的个人博客,低调大师

数据「熵」时代,AI 如何以标准重构治理秩序?

Agent热潮不减,但数据分析与治理状况却仍存在短板。据Gartner公司预测,到2027年,80%的数据和分析治理举措或将因各类原因而失效。如何在AI时代重塑数据治理体系,让混乱数据重归有序,成为企业智能转型的关键命题。 近日,在infoQ举办的全球人工智能开发与应用大会上,瓴羊智能数据建设与治理产品 Dataphin 高级技术专家 周鑫 受邀出席,以「基于统一标准的智能数据治理Dataphin的落地实践」为主题,系统阐述了以数据标准为核心,实现可持续数据治理的方法论,以及以AI赋能自动化数据治理、重构复杂业务流程的实践路径。 01数据「熵减」之道:基于统一标准,打造数据治理方法论 “事物天生具有‘变混乱’的趋势,数据也是如此。如何将无序变得有序?按照热力学第二定律,需要从外界输入能量,并且具备感知能力。” 周鑫表示:“对于数据治理来说,能量就是治理工具,感知就是标准规范。”数据治理是实现数据世界的“熵减”,它可以通过现状评估、制定目标、执行计划、持续监测四个治理阶段,帮助数据生产者打破孤岛,实现低成本数据开发,帮助数据管理者做好资产盘点,确保数据质量与安全,帮助数据使用者便捷用数,助力决策分析。 但在现实情况中,许多数据治理的结果通常会面临失败,周鑫将其归结为四个原因:1)治理动作分散,缺乏体系化方法论;2)治理流程复杂,重度依赖人的能力和素质;3)缺乏工具支撑,导致理论与实施脱节;4)无法持续治理,治理策略难以快速调整。 面对以上四类问题,Dataphin提出了一套以数据标准为中心的数据治理方法论及产品化的落地。其核心逻辑为:聚焦Data x AI,用中台方法论构建统一的数据标准,打造企业级好数据,帮助企业形成数据生产、数据消费、行业数据流通的数据要素服务链,驱动数据价值的释放。 “方法论的核心关键,在于以数据标准为中心。数据标准贯穿数据整个生命周期,它让数据治理具备核心抓手,不会漫无目的”,周鑫表示,企业需从核心业务入手,先行试点开展业务梳理与盘点工作,将相关统一纳入DataCatalog,并在此过程中逐步形成对应的数据标准。 标准梳理完成后,平台即可开展标准构建:通过统一的数据标准,自动实现质量监控与安全分类,保障开发过程规范,阻断不规范数据开发。同时,统一标准可提升数据的可理解性与细节清晰度,实现数据从生成、开发到消费的全生命周期标准化管理。 “整个治理链路就是以数据标准为中心,将传统的复杂的治理手段,简化成数据标准的梳理与治理效果的评估过程,数据符合标准的程度越高,整体数据质量也就越好”。 周鑫表示,该方案以数据标准为核心,通过插件集成、API注册和准实时同步等多种方式采集元数据,并统一纳入 DataCatalog,结合质量规则和安全策略进行自动识别与治理。这一方法论具备三大优势:一是体系化,明确治理目标与路径;二是易落地,借助一体化工具和AI能力,贯穿数据全生命周期;三是可持续,以标准驱动模式便于应对业务变化,有效降低治理成本与复杂度。 02语义知识+流程提效,智能Agent多场景赋能数据治理 许多企业在应用 Agent 时都难免遇到一个难题:Agent 虽然具备一定的智能和对话能力,但在复杂业务场景中常常“空转”,无法真正理解业务语境、解决预期的实际问题。 周鑫表示,造成这一现象的根本原因,“在于数据质量偏低或数字化基础薄弱,导致Agent无法有效发挥价值,最终企业只能被迫放弃”。 AI时代,优质数据至关重要,但“好数据”应如何获取?AI又该如何赋能数据治理? 首先,“Agent在没有丰富准确的语义知识下,不可能达到可生产使用的准确率”,周鑫认为,企业获取好数据,需要构建准确且丰富的语义知识体系。Dataphin针对这一需求,打造了包含元数据、数据标准、数据模型、业务知识四大语义知识体系。企业可以通过采集丰富且统一的元数据,建立涵盖码表、词根、值域及安全分类分级的标准体系,依托Dataphin智能构建的概念模型、逻辑模型和物理模型,以及对业务词条和逻辑的高效管理,实现对复杂业务知识的精准映射和应用。 以NL2SQL为例,Dataphin通过引入业务语义,不仅提升了问题泛化能力,还大幅提高了SQL匹配的准确率,显著增强了对自然语言的理解能力。实测数据显示,在Dataphin开放数据共享模型涵盖的45个典型问题中,简单问题的SQL准确率从70%提升至80%,而中等及复杂问题的准确率更是从10%跃升至60%。 其次,企业还需借助AI,对数据治理链路进行提效。基于TaskWeaver改造,Dataphin构建了具备生产化能力的Agent框架,覆盖研发、治理、资产问答等多个场景,显著提升了现有流程效率,拓展了 Agent 的应用边界。 以 NL2SQL 为例,系统可在识别信息不全时自动发起反问,补全后再继续处理,确保复杂业务场景下依然具备高理解力与执行准确率。同时,Dataphin 的开放能力不断演进,从传统的 API 和数据服务扩展至 MCP 模式,支持更灵活的接入方式,适配非固定流程和动态交互等复杂需求。 在智能找表场景,Dataphin有效解决了用户将复杂业务问题,转化为准确搜索词的难题。“引入AI后,你可以用业务的语言直接问,比如‘我要做客户分层’,‘我要用哪张表’,AI会用大模型去对业务问题进行拆解和泛化,最后找关联到你已有的全域资产”。 在数据分析场景,Dataphin通过专辑机制与丰富的语义知识,解决了因语义知识的缺失或混乱,相似口径和命名干扰、以及海量表格带来的找表难题,显著提升了找表的效率与准确率。 在数据治理场景,Dataphin通过“性别”等复杂字段特征识别,解决了正则表达式“不会写”、“看不懂”难题,取代了传统人工探查的繁琐过程,以往需要耗费十几分钟的特征识别,如今只需几十秒即可完成。 在数据管家场景中,资产上架往往涉及表描述、字段注释、目录归属、标签分类等复杂操作,尤其在字段数量众多时,人工维护工作量大、耗时长且易出错。通过引入 AI 能力,Dataphin支持属性信息的智能生成,可一键生成表/字段描述信息、目录、标签等,使人力成本与操作门槛大大降低。 随着 AI 对复杂节点的处理能力增强,Dataphin正在以“智能工作台”有机整合独立模块,重构整体业务流程。 “有了AI之后,工作台模式可以让很少的人,完成复杂的业务,每个环节都有大量AI和自动化能力支撑,人们干的最多的事情是进行确认”,周鑫表示,未来,AI还将在更多场景中深度参与,从辅助提效逐步向自动化、智能化方向迈进,推动企业实现数据治理范式的全面升级。

优秀的个人博客,低调大师

美国针对黑人解放组织的网络攻击暴

即将开播:6月19日,互联网银行架构师魏生谈互联网开放银行实施路径的探索与思考 即将开播:4月29日,民生银行郭庆谈商业银行金融科技赋能的探索与实践--> 自从上个月美国5月25日,白人警察残忍杀害乔治·弗洛伊德(George Floyd)后美国各地爆发了抗议活动,引发了连锁反应的的暴力冲突。尽管在媒体上定期报道了这一些明面上的冲突,但及这些事件背后也是暗潮涌动: Cloudflare揭露,根据其“伽利略计划”(Project Galileo)一直为处于危险中的团体提供保护:在过去的几周中,网络攻击的数量急剧增加。很可能是某些组织针对黑人解放组织为中心发起攻击,只不过是将抗议战争转移到了网络上。 专家对这些攻击进行了分析,详细可见本文下方图表:从4月到5月的一周之间,Cloudflare收多少量的恶意HTTP请求。这些请求旨在利用DDoS攻击使网站崩溃,或通过其他方式入侵。 仅在4月份,就观察到了超过1,160亿个HTTP请求,正如Cloudflare所说,这相当于在2天的时间内完成每秒670,000个阻止请求任务。 相比之下,Google每秒可接收约63,000个搜索请求,这是平时10倍的请求量,这一部分数据表示,网站在短时间内遭受到大量攻击的可能性大大增加了。 5月份的网络使用量数据使增加了17%,导致现在某些大型网站的HTTP请求达到190亿,这也意味着每秒110,000个阻止请求。 根据攻击的“目标对象”,这些攻击可以分为不同的类别: (1) 与种族主义作斗争的抗议团体是这场网络战争中受影响最大的部门:某些目的不纯的人针对他们进行了攻击,攻击量达到了平时的1120倍。 这向我们表明,白人至上主义者和其他种族主义者正在针对黑人解放运动下黑手,当然,人类的本质也是记仇的,与此同时也有正义黑客组织,对这些白人至上主义者的网站也进行了反击报复。 (2) 接应上面的,美国不同部门政府网站,例如针对警察局官网的攻击就增长了1.8倍。 (3) 军事网站:攻击量较平时增长了3.8倍。 从5月25日开始的图表中可以看到,针对性的攻击最少徘徊在几百万左右,随后又逐渐增加到更大的数量。在他们的博客文章 Cloudflare中,详细描述了一个攻击者的示例: 例如某个在法国占用了服务器的黑客团伙,持续不断地网络攻击了一个黑人解放运动团体,持续了整整一天的时间。我们阻止了这些恶意HTTP请求,并使网站保持在线状态。 ——HackRead Cloudflare分享的图片显示,乔治·弗洛伊德(George Floyd)被谋杀后,网络攻击激增:总而言之,事实是,网络数据是制高点,是在21世纪值得关注的重要内容,谁先占据了它,就相当于谁先拥有话语权(最起码舆论步伐已抢先)。 如果您经营了可能面临风险的网站,最好联系网络安全服务提供商获得DDoS和网络安全保护。换句话说,看看上面庞大的攻击数值以及各类的攻击类型,若没有专家的帮助,捍卫您的网站工作与运维将会难上加难。 【责任编辑: 赵宁宁 TEL:(010)68476606】

优秀的个人博客,低调大师

报告:新冠疫情相关网络攻击暴300倍

即将开播:4月29日,民生银行郭庆谈商业银行金融科技赋能的探索与实践 在最新发布的报告中,云安全公司Zscaler的安全研究人员发现,与2020年初相比,3月份与新冠病毒(COVID-19)大流行相关的恶意攻击和恶意软件环比增加了30,000%。 Zscaler的云安全产品每天都在处理来自4,000多家企业客户的超过1000亿笔交易,其中有400家企业名列《福布斯》全球2000强公司榜单。 Zscaler安全研究与运营副总裁Deepen Desai在一篇博客文章中说: 不,你没有看错。自1月份以来,我们发现针对远程用户的网络钓鱼,恶意网站和恶意软件增长了30,000%,这些都与COVID-19有关。在一月份,我们看到(阻止)了1200次此类攻击。三月份我们看到了多少次?380,000! 威胁活动的大幅增加利用了上个月以来人们对新冠病毒大流行的担忧,随后在2月Zscaler发现了10,000次以冠状病毒为主题的攻击。 总体而言,Zscaler检测到针对远程企业用户的大流行性网络钓鱼攻击增加了85%,恶意站点和阻止的恶意软件样本增加了25%,针对企业用户的威胁增加了17%。 研究人员还发现了超过13万个与COVID-19相关的可疑新注册域名,包括(新冠病毒)检测、口罩、武汉等。 新冠病毒主题相关新增域名注册 数据来源:Zscaler 根据美国联邦贸易委员会(FTC)最新的统计数据,自2020年1月以来收到的消费者投诉,与冠状病毒相关的骗局损失了超过1900万美元。仅仅十天前,报告的总损失刚超过1200万美元。 FTC在2月还警告消费者,诈骗者正利用这种流行病通过网络钓鱼电子邮件、短信和社交媒体吸引潜在的美国目标。 一周前,谷歌表示,Gmail的内置恶意软件扫描器在一周内使用COVID-19主题诱饵拦截了大约1800万个网络钓鱼和恶意软件电子邮件。 一位微软全球安全专家发推文说: 基于Office 365 ATP数据,Trickbot是使用COVID-19主题诱饵的最多产的恶意软件。 根据微软每周对数千个电子邮件网络钓鱼活动的监控数据,数百万个针对性恶意邮件/URL中,大约有60,000起攻击与COVID-19相关。 微软表示,一天之内,SmartScreen就能看到并处理超过18,000个以COVID-19为主题的恶意URL和IP地址。 值得一提的是,基于Microsoft的威胁情报,恶意攻击的实际数量并未增加,但是攻击参与者已重新利用了先前攻击中使用的基础结构,并对攻击活动进行了重新调整,用以滥用新冠病毒主题。 4月初,美国CISA和英国NCSC联合发出了COVID-19相关网络攻击的警报,称网络犯罪和国家支持的高级持续威胁(APT)团体都在积极利用COVID-19全球大流行。 【本文是51CTO专栏作者“安全牛”的原创文章,转载请通过安全牛(微信公众号id:gooann-sectv)获取授权】 戳这里,看该作者更多好文

优秀的个人博客,低调大师

每日一博 | 问题这样,拒做背锅侠

技术的锅太多,到底该不该你背? 话说这天一大早,那个悲催的中年架构师大刘又被手机微信群给炸醒。部门的运维兄弟在公司微信群里说: 短信的生产环境服务器 CPU 占用率过高,疯狂报警。是不是你们昨天上线看门狗导致的? 大刘迷了巴登的想了想,没错,昨天确实给短信服务装上了看门狗。但是看门狗服务肯定不会有问题(架构师必备的蜜汁自信),而且上线之前各轮测试也都测过了,没见过这个想象啊。 难道是测试妹子没测试到位?难道线上短信应用自身出现了问题? 生产无小事,小事更不能忽视,主要是怕扣绩效奖金。大刘迅速打开电脑,打开 VPN ,远程登上短信生产服务器,开始大刘最拿手的 2W1H 三板斧诊断之旅。 接下来的诊断内容有点烧脑,节奏有点快,请大家坐稳扶好。 1. 病号是谁(WHO)? 大刘拿出控制台诊断仪器,输入 top 命令一探究竟。我勒个去,不看不知道一看吓一跳,PID 为 1878 的病号,CPU 占用居然 200% 多。 问题算是定位到了,但是 PID 为 1878 的病号到底是谁,难道真是昨天上线的看门狗 ? 虽然大刘久经职场,但是排查生产问题时,内心还是比较忐忑,毕竟这是生产环境。 说时迟那时快,只见大刘一个命令输入: ps -ef | grep 1878 定睛一看,原来是放屁瞅别人,短信服务自己在作祟,和看门狗没关系,大刘心里一下子平缓了不少。 锅找到了主儿,其实这个时候大刘完全可以把这个问题甩给短信开发团队,但是大刘最喜欢做的不是甩锅,而是打破砂锅刨到底。 2. 病号哪里出了问题(WHERE)? 为什么 1878 号病人占用 CPU 会这么高呢? 只见黑乎乎的控制台诊断仪器上,大刘熟练的输入: jstack -l 1878 >> 1878号病历.log 这样便得到一份 1878 号病人的病历详情单,一会儿用得上。 到底 1878 号病人的哪个部位出了问题呢? 话没说完,只见大刘又在控制台诊断仪器上,输入一个: top -Hp 1878 白板黑字,把 1878 号病人的器官信息全部列了出来。 看到结果,甚是一惊,PID 代号为 8721 的器官占用 CPU 100% 多。 疑惑油然而生,这个 PID 代号 为 8721 的器官是啥,是头、是眼睛、还是胳膊腿呢?这些器官展示的 PID 列都是昵称,都这么善于伪装,如何揭露它的真面目呢? 还好大刘有高招,借助照妖镜算法,熟练的输入: printf "%x\n" 8721 果真使得代号为 8721 的器官,现了真身,真实身份居然是 2211 的呼吸道,怪不得病号一直气喘吁吁,上气不接下气。 到这一步还无法对症下药啊,还需要进一步确诊 2211 的呼吸道到底出了什么幺蛾子,导致 1878 号病人一直气喘吁吁,上气不接下气? 只见黑乎乎的控制台诊断仪器上,大刘再次飞一般的在输入: grep 2211 -A20 1878号病历.log 诊断结果随之显示在诊断仪器上。 曾经背了很多锅的大刘,看到诊断结果心里乐了一下,一眼就看出是高并发情况下用了 HashMap 的问题(请大家们自行寻找谷歌、百度,就不在此深入展开啦),终于拨开云雾见青天。 3. 如何对症下药( HOW )? 在大刘行云流水没有一丝一毫的拖泥带水般的神操作下,1878 号病人的诊断也就结束了,这个锅就彻底被打破了。 术业有专攻,大刘就可以郑重的告诉短信开发同事具体原因了,捉得病根,开发同事也就可以对症下药啦。 大刘这套行走江湖的诊断问题方式你 get 到了没?大刘自己简单概括为 2W1H 三板斧:病号是谁、病号哪里出了问题、对症下药。 1、病号是谁?(WHO) 第一步:采用 top 命令,找出 CPU 占用最高的病号 PID ; 第二步:通过 ps -ef | grep PID 查看病号对应的真实身份。 2、病号哪里出了问题?(WHERE) 第一步:采用 jstack -l PID >> PID.log 获取病号的各器官信息的病历单; 第二步:采用 top -Hp PID 拿到占用 CPU 最高的器官昵称 PID ; 第三步:采用 printf "%x\n" PID 根据器官昵称 PID 的拿到器官真实身份 TID ; 第四步:采用 grep TID -A20 pid.log 根据 TID 去病历单中匹配,确定是哪出了问题。 3、捉得病根、便可拿出医药箱,对症下药啦。(HOW) 作为程序猿,工作中难免会遇到不少类似这样的问题。面对问题,你如果像无头苍蝇一样乱撞,撞得头破血流依然不知道缘由,在背锅即将成为现实时,那就不妨试试大刘的 2W1H 三板斧的诊断方式,说不定会帮你快速定位、解决线上问题,毕竟快速的解决生产问题会把损失降到最低。 最后,想对大家说一句: 作为程序猿,一定要有程序猿的态度。避免背锅,拒绝甩锅,打破砂锅,从你我做起。 你好,我是四猿外,一家上市公司的技术总监,管理的技术团队一百余人。 我从一名非计算机专业的毕业生,转行到程序员,一路打拼,一路成长。 我会把自己的成长故事写成文章,把枯燥的技术文章写成故事。 欢迎关注我的公众号:四猿外

优秀的个人博客,低调大师

【python】openstack管理小工具(增删改,批量ping)

工具介绍: 创建虚拟机会使用多线程队列的方式去控制同时创建的虚拟机数量 如果在创建的虚拟机比较多,会2次创建。第一次会在各个宿主机上创建一台,其余的会再第一次创建成功后创建。 因为第一次创建需要传输镜像会比较慢,在宿主机上已经有对应的镜像后,再次创建相同镜像的虚拟机,不再需要传输相应的镜像(所有相同镜像的虚拟机共用同一个后端镜像,openstack对镜像管理使用copy on write技术) 查询和更改主要都是通过查询数据库实现。 其它功能自测。 使用帮助: python openstack_manager.py --help 创建虚拟机: python openstack_manager.py -c -f vmhost -t nslm -c, 指定是要进行创建虚拟机 , -f 指定要创建的虚拟机列表文件 , -t 指定要给那个项目创建虚拟机 删除虚拟机: python openstack_manager.py -d ip1 ip2 -d 指定要删除的ip ,可以跟多个 查看某个虚拟机信息 python openstack_manager.py -i ip1 ip2 -i 指定ip,后面可以跟上多个值 查看宿主机下的虚拟机信息 python openstack_manager.py -n node1 node2 -n 指定node,可以跟上多个值 更改虚拟机配置: python openstack_manager.py -u ip -F flavor -u指定某个ip, -F 指定某个配置 批量ping: python openstack_manager.py -p -f vmhost -p指定进行批量ping,-f指定文件 从文件中获取创建虚拟机的命令 (创建过程中某个虚拟机出错,可以进行查看创建虚拟机命令进行手动创建) python openstack_manager.py -g -f vmhost -t -g指定要进行获取命令,-f指定文件,-t指定项目 -f 指定文件的文件格式: 批量ping是检查ip虚拟机是否存在,指定的文件也是参照此格式 nodename instance_ip flavor 一行一个虚拟机 其它使用信息: 脚本中的flavor对应的flavor id,项目帐号密码和镜像ID,数据库帐号等替换成自己生产环境中的信息 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 #!/usr/bin/python #coding:utf8 #Auth by lust import sys,commands,os,MySQLdb import Queue, threading,time from fabric.colors import * from optparse import OptionParser class vmListAnaly(): def __init__( self ,vmlist_file): self .f_handle = open (vmlist_file) self .vmlist = {} while True : self .file_tmp = self .f_handle.readline() if self .file_tmp: if self .vmlist.has_key( self .file_tmp.split()[ 0 ]): self .vmlist[ self .file_tmp.split()[ 0 ]].append(( self .file_tmp.split()[ 1 ], self .file_tmp.split()[ 2 ])) else : self .vmlist[ self .file_tmp.split()[ 0 ]] = [] self .vmlist[ self .file_tmp.split()[ 0 ]].append(( self .file_tmp.split()[ 1 ], self .file_tmp.split()[ 2 ])) else : break def getAllIps( self ): ips = [] for __host in self .vmlist: for i in self .vmlist[__host]: ips.append(i[ 0 ]) return ips def getFirstIps( self ): ips = [] for __host in self .vmlist: ips.append( self .vmlist[__host][ 0 ][ 0 ]) return ips def getSecondIps( self ): ips = [] for __host in self .vmlist: del self .vmlist[__host][ 0 ] for __host in self .vmlist: for i in self .vmlist[__host]: ips.append(i[ 0 ]) return ips def getAllCreInfo( self ): return self .vmlist def getFirstCreInfo( self ): results = [] for __host in self .vmlist: self .vmlist[__host] = [ self .vmlist[__host][ 0 ]] return self .vmlist def getSecondCreInfo( self ): for __host in self .vmlist: del self .vmlist[__host][ 0 ] return self .vmlist def __del__( self ): self .f_handle.close() class getCmd(): def __init__( self ,project,vminfo,flavor,mysql_host,mysql_user,mysql_passwd): self .mysql_user = mysql_user self .mysql_host = mysql_host self .mysql_passwd = mysql_passwd self .project = project self .vminfo = vminfo self .flavor = flavor self .create_cmd = [] def get_cmd( self ): quantum_obj = mysqlEng(host = self .mysql_host,user = self .mysql_user,passwd = self .mysql_passwd) for __host in self .vminfo: if self .vminfo[__host]: for i in self .vminfo[__host]: __ip = i[ 0 ] __flavor = i[ 1 ] __network_id = quantum_obj.getNetworkID(__ip) __tmp = "nova --os-username %s --os-password %s --os-tenant-name %s boot --security-groups %s --flavor %s --image %s --nic net-id=%s,v4-fixed-ip=%s --meta lan=%s --availability-zone nova:%s %s" % ( self .project[ 'OS_USERNAME' ], self .project[ 'OS_PASSWORD' ], self .project[ 'OS_TENANT_NAME' ], self .project[ 'SECURITY_GROUPS' ],flavor[__flavor], self .project[ 'IMAGE_ID' ],__network_id,__ip,__ip,__host,__ip) self .create_cmd.append(__tmp) return self .create_cmd class mysqlEng(): def __init__( self ,host = '127.0.0.1' ,user = 'root' ,passwd = ' ',port=' 3306 '): self .conn = MySQLdb.connect(host = host,user = user,passwd = passwd,port = 3306 ) self .cur = self .conn.cursor() def getNetworkID( self ,ip): self .conn.select_db( 'quantum' ) net = "%s.%s.%s.0/24" % (ip.split( '.' )[ 0 ],ip.split( '.' )[ 1 ],ip.split( '.' )[ 2 ]) __sql = "select network_id from subnets where name='%s'" % net self .cur.execute(__sql) ret = self .cur.fetchall() return ret[ 0 ][ 0 ] def getVmstate( self ,ip): self .conn.select_db( 'nova' ) __sql = "select instances.uuid,instance_metadata.value,instances.host,instances.vm_state from instance_metadata,instances where instances.uuid = instance_metadata.instance_uuid and instance_metadata.value = %s and instances.vm_state not in ('error','deleted');" self .cur.execute(__sql,ip) ret = self .cur.fetchall() return ret[ 0 ][ 3 ] def getActNum( self ,ips): self .conn.select_db( 'nova' ) __sql = "select count(*) from instance_metadata,instances where instances.uuid = instance_metadata.instance_uuid and instance_metadata.value in ('%s') and instances.vm_state = 'active';" % "','" .join(ips) self .cur.execute(__sql) ret = self .cur.fetchall() return ret[ 0 ][ 0 ] def updateInstanceFlavor( self ,ip,flavor): self .conn.select_db( 'nova' ) __get_flavor_info_sql = "select id,memory_mb,vcpus from instance_types where flavorid = '%s' and deleted = 0;" % flavor self .cur.execute(__get_flavor_info_sql) __flavor_info = self .cur.fetchall() __flavor_id = __flavor_info[ 0 ][ 0 ] __mem = __flavor_info[ 0 ][ 1 ] __vcpus = __flavor_info[ 0 ][ 2 ] __update_flavor_info_sql = "update instances set instance_type_id='%d',vcpus='%d',memory_mb='%d' where hostname='%s' AND vm_state != 'deleted' AND vm_state != 'error';" % (__flavor_id,__vcpus,__mem,ip) self .cur.execute(__update_flavor_info_sql) self .conn.commit() def getInstanceFlavor( self ,ip): self .conn.select_db( 'nova' ) __get_instance_flavor_sql = "select vcpus,memory_mb from instances where hostname='%s' AND vm_state != 'deleted' AND vm_state != 'error';" % ip self .cur.execute(__get_instance_flavor_sql) ret = self .cur.fetchall() results = (ip,ret[ 0 ][ 0 ],ret[ 0 ][ 1 ]) return results def getInstanceInfo( self ,ips): self .conn.select_db( 'nova' ) __get_instance_info_sql = "select instances.uuid,instance_metadata.value,instances.host,instances.vm_state,memory_mb from instance_metadata,instances where instances.uuid = instance_metadata.instance_uuid and instance_metadata.value in ('%s') and instances.vm_state !='error' and instances.vm_state != 'deleted';" % "','" .join(ips) self .cur.execute(__get_instance_info_sql) ret = self .cur.fetchall() return ret def getNodeInfo( self ,nodes): self .conn.select_db( 'nova' ) __get_node_info_sql = "select instances.uuid,instance_metadata.value,instances.host,instances.vm_state,memory_mb from instance_metadata,instances where instances.uuid = instance_metadata.instance_uuid and instances.host in ('%s') and instances.vm_state !='error' and instances.vm_state != 'deleted';" % "','" .join(nodes) self .cur.execute(__get_node_info_sql) ret = self .cur.fetchall() return ret def __del__( self ): self .cur.close() self .conn.close() class checkIps(): def __init__( self ): self .ping_queue = Queue.Queue() self .up_ip = [] self .down_ip = [] def __check( self ,q): while q.qsize(): __ip = q.get() __cmd = "ping -c 2 %s" % __ip if commands.getstatusoutput(__cmd)[ 0 ] = = 0 : self .up_ip.append(__ip) else : self .down_ip.append(__ip) q.task_done() def put2q( self ,ips): for __ip in ips: self .ping_queue.put(__ip) def checking( self ): print yellow( 'Checking ips ...' ) for i in xrange ( 100 ): __pingd = threading.Thread(target = self .__check,args = ( self .ping_queue)) __pingd.setDaemon __pingd.start() self .ping_queue.join() return { 'up' : self .up_ip, 'down' : self .down_ip} class createVm(): def __init__( self ,mysql_host,mysql_user,mysql_passwd): self .create_queue = Queue.Queue() self .mysql_user = mysql_user self .mysql_host = mysql_host self .mysql_passwd = mysql_passwd def __put2q( self ,cmd_list,q): while len (cmd_list) > 0 : while q.qsize() < = 3 : q.put(cmd_list.pop()) time.sleep( 1 ) if not cmd_list: break time.sleep( 1 ) def __create( self ,q): time.sleep( 5 ) while q.qsize() > 0 : __cmd = q.get() __ip = __cmd.split()[ - 1 ] print "Building %s" % __ip ret = commands.getstatusoutput(__cmd) if ret[ 0 ] = = 0 : time.sleep( 2 ) __vm_state = 'building' while __vm_state ! = 'active' : time.sleep( 5 ) __vm_state = mysqlEng(host = self .mysql_host,user = self .mysql_user,passwd = self .mysql_passwd).getVmstate(__ip) if __vm_state = = 'error' : self .error_vms + = 1 print red( "虚拟机创建出错,IP:%s" ) % __ip break self .ok_vms + = 1 print green( "%s 创建成功,此次创建虚拟机总数:%s , 成功的虚拟机:%s ,出错的虚拟机:%s" ) % (__ip, self .all_vms, self .ok_vms, self .error_vms) else : self .error_vms + = 1 print red( "执行命令出错,IP:%s,出错信息: %s \n" ) % (__ip,ret[ 1 ]) def creating( self ,cmds,ths): self .all_vms = len (cmds) self .ok_vms = 0 self .error_vms = 0 __put_thread = threading.Thread(target = self .__put2q, args = (cmds, self .create_queue)) __put_thread.setDaemon __put_thread.start() for i in xrange (ths): __created = threading.Thread(target = self .__create, args = ( self .create_queue,)) __created.setDaemon __created.start() time.sleep( 10 ) class createAllvm(): def __init__( self ,vmlist,flavor,mysql_host,mysql_user,mysql_passwd): self .vmlist = vmlist self .mysql_host = mysql_host self .mysql_user = mysql_user self .mysql_passwd = mysql_passwd self .flavor = flavor def start( self ): create_obj = createVm(mysql_host = self .mysql_host,mysql_user = self .mysql_user,mysql_passwd = self .mysql_passwd) first_create_cmd = getCmd(project_info,vmListAnaly( self .vmlist).getFirstCreInfo(), self .flavor,mysql_host = self .mysql_host,mysql_user = self .mysql_user,mysql_passwd = self .mysql_passwd).get_cmd() create_obj.creating(first_create_cmd, 2 ) first_ips = vmListAnaly( 'vmhost' ).getFirstIps() while True : time.sleep( 10 ) if mysqlEng(host = self .mysql_host,user = self .mysql_user,passwd = self .mysql_passwd).getActNum(first_ips) = = len (first_ips): break print '第一波创建完毕' second_create_cmd = getCmd(project_info,vmListAnaly( self .vmlist).getSecondCreInfo(), self .flavor,mysql_host = self .mysql_host,mysql_user = self .mysql_user,mysql_passwd = self .mysql_passwd).get_cmd() if not second_create_cmd: print green( '只有一波了..创建完毕' ) sys.exit() create_obj.creating(second_create_cmd, 3 ) second_ips = vmListAnaly( 'vmhost' ).getSecondIps() while True : time.sleep( 10 ) if mysqlEng(host = self .mysql_host,user = self .mysql_user,passwd = self .mysql_passwd).getActNum(second_ips) = = len (second_ips): break print '第二波创建完毕' if __name__ = = '__main__' : #project_name = sys.argv[1] #vmlist = sys.argv[2] mysql_host = '127.0.0.1' mysql_user = 'root' mysql_passwd = '123456' parser = OptionParser() parser.add_option( "-c" , "--create" ,dest = "create" ,action = "store_true" ,default = False , help = "create vm in filename" ) parser.add_option( "-u" , "--update" ,dest = "update" , help = "update ip to a flavor" ) parser.add_option( "-p" , "--ping" ,dest = "ping" ,action = "store_true" ,default = False , help = "multil threading to ping" ) parser.add_option( "-i" , "--instances" ,dest = "instances" , help = "query a ip's info" ) parser.add_option( "-n" , "--nodes" ,dest = "nodes" , help = "query a host's info" ) parser.add_option( "-g" , "--getcmd" ,dest = "getcmd" ,action = "store_true" ,default = False , help = "get build vm commands from a file" ) parser.add_option( "-d" , "--delete" ,dest = "delete" , help = "delete a instance" ) parser.add_option( "-f" , "--filename" ,dest = "filename" , help = "Specify a file" ) parser.add_option( "-F" , "--flavor" ,dest = "flavor" , help = "Specify a flavor" ) parser.add_option( "-t" , "--tenant" ,dest = "tenant" , help = "Specify a tenant" ) (options,args) = parser.parse_args() project_conf = { 'test' :{ 'OS_USERNAME' : 'test' , 'OS_PASSWORD' : 'test' , 'OS_TENANT_NAME' : 'test' , 'SECURITY_GROUPS' : 'default' , 'IMAGE_ID' : '25b349f2-a105-4d2d-aabe-89253e8b4eb1' , }, 'test2' :{ 'OS_USERNAME' : 'test2' , 'OS_PASSWORD' : 'test2' , 'OS_TENANT_NAME' : 'test2' , 'SECURITY_GROUPS' : 'default' , 'IMAGE_ID' : 'a6955dde-7794-45cc-a468-65ce7d2473c1' , }, } flavor = { '1' : '1' , '2' : '2' , '4' : '4' , '6' : '6' , '8' : '8' , '12' : '12' , '16' : '16' , } the_mysql_obj = mysqlEng(host = mysql_host,user = mysql_user,passwd = mysql_passwd) if options.create: project_info = project_conf[options.tenant] vmfile = options.filename the_create_obj = createAllvm(vmlist = vmfile,flavor = flavor,mysql_host = mysql_host,mysql_user = mysql_user,mysql_passwd = mysql_passwd) the_create_obj.start() if options.update: ip = options.update flavor = options.flavor the_mysql_obj.updateInstanceFlavor(ip,flavor) print "update ok,now the vm %s is %s cups and %sMB memory" % the_mysql_obj.getInstanceFlavor(ip) instance_id = the_mysql_obj.getInstanceInfo([ip])[ 0 ][ 0 ] print red( 'please command == nova reboot --hard %s == to effect' % instance_id) if options.ping: filename = options.filename allip = vmListAnaly(filename).getAllIps() check_obj = checkIps() check_obj.put2q(allip) check_ret = check_obj.checking() if check_ret[ 'up' ]: for ip in check_ret[ 'up' ]: print red( "%s is up,please check..." ) % ip sys.exit( 9 ) else : print green( 'All ip is check ok...,you can create these vms' ) if options.instances: args.append(options.instances) ips = args instances_info = the_mysql_obj.getInstanceInfo(ips) print "id\t\t\t\t\tip\t\tnode\t\t\tstate\tmemory" for i in instances_info: print "%s\t%s\t%s\t%s\t%s" % i if options.nodes: args.append(options.nodes) nodes = args nodes_info = the_mysql_obj.getNodeInfo(nodes) print "id\t\t\t\t\tip\t\tnode\t\t\tstate\tmemory" for i in nodes_info: print "%s\t%s\t%s\t%s\t%s" % i if options.getcmd: filename = options.filename tenant = options.tenant project_info = project_conf[tenant] result = getCmd(project_info,vmListAnaly(filename).getAllCreInfo(),flavor,mysql_host = mysql_host,mysql_user = mysql_user,mysql_passwd = mysql_passwd).get_cmd() for i in result: print i if options.delete: args.append(options.delete) ips = args instances_ids = [] instances_info = the_mysql_obj.getInstanceInfo(ips) for i in instances_info: instances_ids.append(i[ 0 ]) if not instances_ids: print red( "no instance found" ) sys.exit( 8 ) delete_cmd = "nova delete " + ' ' .join(instances_ids) result = commands.getstatusoutput(delete_cmd) if result[ 0 ] = = 0 : print green( 'OK' ) else : print red( "error info: %s" % result[ 1 ]) 本文转自lustlost 51CTO博客,原文链接:http://blog.51cto.com/lustlost/1375779,如需转载请自行联系原作者

优秀的个人博客,低调大师

全球网络攻击泄漏数据量每年暴224%

根据Imperva发布的最新报告,自2017年以来,全球网络攻击泄漏数据记录的数量平均每年增长高达224%。 本周正值GDPR成立三周年,数据安全公司Imperva对过去几年中数千起网络攻击事件进行了统计,以更好地了解企业面临的不断增长的风险。 仅2021年1月报告的泄露记录(8.78亿)就超过了2017年全年(8.26亿)。 Imperva安全研究员Ofir Shaty表示,在过去四年中,此数字有所增加,与此同时,报告的攻击事件数量也增加了34%,每个事件的平均泄露记录数量增加了131%。 “我们生活在一个数字化时代,每天都有更多的服务被消费,其中大多数都在线提供。越来越多的企业正在迁移到云中,如果不谨慎操作,数字业务系统将变得更加脆弱。那里的数据量巨大,并且每年都在增加。”他说: “信息安全的采用要滞后于数字服务的采用,种差距导致了每年越来越多的网络攻击和数据泄漏事件。” Imperva预测: 2021年将发生约1500起数据泄露事件,超过400亿条记录将被泄露。 但并非所有的数据泄漏都是恶意攻击的结果。云服务的错误配置也是导致数据泄漏激增的重要原因。在过去十年的100起最严重的数据泄漏事件中,42%来自Elasticsearch服务器,四分之一(25%)来自AWS S3存储桶,17%来自MongoDB部署。 Imperva警告说,Shodan之类的工具和LeakLocker之类的开源应用程序使得此类漏洞的发现变得越来越容易。 “组织的安全性取决于安全链中最薄弱的环节。很多时候,保护数据库的‘墙’都有漏洞,攻击者可以利用这些漏洞来获取敏感数据。”报告总结道。 【本文是51CTO专栏作者“安全牛”的原创文章,转载请通过安全牛(微信公众号id:gooann-sectv)获取授权】 戳这里,看该作者更多好文

优秀的个人博客,低调大师

流量暴基建告急 网络重构需二次投资

大家都知道,本来盖平房时挖的是平房地基,房子不够住,再加盖二层、三层…越高就越容易发生倒塌事故。其实,建网络和建房子一样,本来基础设施是2G、3G时用的,上4G很免强了,底层的硬件和带宽不够的话,用户再上来的越多访问互联网就会变慢,响应迟缓,最后可能会卡、会瘫掉。网络。当下和未来,流量还会进一步增加,而固有的网络基础设施已经告急了!运营商需要软硬兼施地对网络基础设施进行二次建设、更換设备。 移动互联网大发展造成流量爆炸 运营商心里的痛 从2007年开始,宽带和3G网络开始普及,到2017年4G网络和光纤宽带已经普及,近10年的时间网络流量的爆炸增长令人咂舌。高速的宽带让原本以语音和短信为主要通信方式的人们,逐步转变为以音频、视频、图片等大流量应用为主的娱乐和生活方式。截止到2017年上半年,我国个人互联网流量1-4月固定互联网宽带接入流量达到561.7亿G。移动互联网1-4月累计流量达53.7亿G,同比增长128.5%,人均移动互联网流量已突破1G,达到1377M。高速增长的流量,运营商痛在心里。 不敢想象 上网设备和流量多到爆炸 这还不算完,现在的网络流量,每一天都在增加,4G网络的普及,运营商提速降费的政策,社交网络带来的视频应用等,都在为流量爆炸做自己的贡献。这些飞涨的流量,让现有网络容量、处理能力面临着严峻的挑战。根据贝尔实验室的预测,到2020年,全球网络流量每月将达330EB,到2025年,全球物联网设备将达到1000亿部。 在云计算、物联网、社交网络等发达的当下,以及5G将应用的未来,运营商和互联网公司现有的基础设施已经不堪重负,需要更强的基础网络设施,以及全新的网络架构,使得未来的网络更加通畅。 运营商网络基础设施建设加大投入 从芯片到路由器整机 需要全面向多T比特级别进军 要想升级网络体验,强大的网络基础设施是基础,首先要改变的是硬件。诺基亚、思科、华为等厂商,都在研发新一代网络处理机芯片和路由器系统。诺基亚更是已经推出处理能力高达2.4Tb/s的网络处理器芯片。并且同时推出了576Tb/s容量的路由器系统。更强的路由器系统,可以将100G、400G甚至1000G的高速传输网络链接到IP网络中,大幅提升网络带宽和处理能力。 SDN+NFV加速落地 网络存量规模巨大改革非一日之功 硬件升级就能对网络支持的更好吗?这还需要运营商对网络架构的调整。网络就像人类的血管,流量一大就会有堵塞的地方,需要SDN和NFV技术的帮助,进行疏通。通过将大数据和云计算技术的引入,SDN将会帮助运营商预测流量高峰,从而通过控制器调节到另外一条链路上,进行自动处理,与以往人工手动处理相比,大大节省资源加快了响应速度。目前,还有SD-WAN等新技术不断涌现,对于现有网络的软件定义改造也在逐步的进行。 不过,运营商全面升级为最新的硬件并进行网络重构工作是个艰难的任务。在经过这么多年的网络建设后,运营商的网络存量非常巨大。不仅要投入巨额的资金,还需要各个厂商的支持,所以全面改造并不是一朝一夕的工作,但是加快改造的进度也是一个刻不容缓的问题。 解决网络拥堵问题 结语 5G未来的商用和无限流量时代的到来,会给网络带来前所未有的压力。如何将网络的地基打得更加坚实,从而支撑众多的应用,二次投资建设是不可避免的。软硬兼施是一个解决流量爆炸时代网络问题的必经之路。 本文转自d1net(转载)

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Oracle

Oracle

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Eclipse

Eclipse

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。