登录
登录 注册新账号
注册
已有账号登录
系统入门云计算服务,项目上云最佳实践【完整】笔记分享
原动力 阅读 470 次
1月9日发布

Download: 系统入门云计算服务,项目上云最佳实践

系统入门云计算服务

云计算是互联网演进的下一个阶段,提供从计算能力到计算基础设施,应用程序到业务流程的一切手段,无论需要什么,都可以作为云服务提供。云计算为小型,中型和大型企业带来巨大的利益。有些人认为云计算仍处于起步阶段,对大型企业的可能实施有积极和消极的评价。另一方面,企业面临着利用云服务的巨大压力,但他们需要充分了解云计算带来的挑战。系统入门云计算服务,项目上云最佳实践,切换到云服务为企业及其用户提供了巨大的好处。重要的是,公司选择一个将帮助支持过渡和平衡挑战的提供商。然而,像任何主要概念,它总是开始缓慢,但一旦企业实现云服务的优势,它会迅速用。尽管面临这些挑战,公司越来越意识到云计算带来的商业价值,并正在加快向云转型的步伐。

项目上云最佳实践 - 云服务部署技能,云服务项目架构方案

系统入门云计算服务,项目上云最佳实践
二、项目上云前期调研
运维团队规模(4人):运维1人、运维架构师1人、网络工程师1人
客户研发/测试团队规模:30人
客户电信机房资源:
3个机柜
40台左右硬件服务器(dell r410为主,其实两台16核/96G内存用于xen虚拟化)
200Mbps(独享)
客户环境简介:
由于电商环境存在大量商品图片,所以CDN是必不可少。
服务器端,前端采用nginx+varnish作为二级缓存,主要减少CDN回源访问的压力。
后端业务系统名称designe/kderp/seach/res/seo/oc/img等十余项,采用的开发语言主要为Java、php、python。操作系统主要为centos为主,少量windows环境。
图片源文件等,主要通过nfs进行磁盘挂载共享,图片数据量2T+。
数据库缓存端主要采用redis作为数据库缓存,减少数据库压力。
数据库端主要为mysql,采用硬件服务器上面部署mysql主从。
三、项目上云最佳实践确认合作意向
从客户角度来讲,有三大痛点:
虽然云的确在成本、扩展、灵活性、快捷等方面有很大优势。但是,对云产品、云架构的灵活运用,是有一定技术门槛的。怎么样利用云资源设计出低成本高性能的架构,这是个经验性的技术活。
客户没有724监控响应中心,导致出现报警往往不能及时马上联系上运维,及立即响应解决,运维的724无法得到保障。
客户有四个运维人员,成本高昂也是最实质性的痛点。
所以通过洽谈,最终在12月底确定了合作意向(具体商务方面的细节不再这里概述)。我们为客户提供上云架构方案 + 上云迁移 + 724监控 +724运维服务(我方运维为主,客户运维为辅)来解决客户痛点。
四、项目上云最佳实践上云迁移的挑战性
挑战1:时间短:客户机房2月到期,并且在每年2月14日情人节是一年中的业务高峰期。由于确定商务合作的时间点已经12月底了,所以项目排期,我们需要在1月中旬(仅两周)完成项目的上云迁移、测试、及正式上线,预留两周作为观察过渡期。
挑战2:业务系统较多、技术环境较多:通过梳理,客户有十余个业务系统。Nginx、varnish、tomcat、php、python、redis、mysql等技术环境较多,这远远增加了迁移难度。
挑战3:零配置文档、零规范:其实说到这点挑战,我是很想吐槽的。很难想象,一个做了八年运维的系统,居然在运维配置文档、运维手册方面没有一份文档,仅仅有几张零碎的架构图。另外,在主机名、防火墙、配置文件规范方面更是杂乱无章。在迁移期间还遇到件比较搞笑的事情,忘记机房交换机密码,然后网络工程师亲自破解获取最新密码。这跟我们带来的迁移难度及挑战可想而知。
五、项目上云最佳实践上云迁移

项目上云实践

系统入门云计算服务,项目上云最佳实践实战开发

from configparser import ConfigParser
from threading import Timer
import requests 
import random
import hashlib
import datetime
import time
import json
import logging
import math
logger = logging.getLogger()
grade = [10,40,70,130,200,400,1000,3000,8000,20000]
api = ''
class Task(object):

   '''
   对象的构造函数
   '''
   def __init__(self, uin, pwd, pushmethod, sckey, appToken, wxpusheruid, countrycode=86):
       self.uin = uin
       self.pwd = pwd
       self.countrycode = countrycode
       self.pushmethod = pushmethod
       self.sckey = sckey
       self.appToken = appToken
       self.wxpusheruid = wxpusheruid
   '''
   带上用户的cookie去发送数据
   url:完整的URL路径
   postJson:要以post方式发送的数据
   返回response
   '''
   def getResponse(self, url, postJson):
       response = requests.post(url, data=postJson, headers={'Content-Type':'application/x-www-form-urlencoded'},cookies=self.cookies)
       return response
   '''
   登录
   '''
   def login(self):
       data = {"uin":self.uin,"pwd":self.pwd,"countrycode":self.countrycode,"r":random.random()}
       if '' in self.uin:
           url = api + '?do=email'
       else:
           url = api + '?do=login'
       response = requests.post(url, data=data, headers={'Content-Type':'application/x-www-form-urlencoded'})
       code = json.loads(response.text)['code']
       self.name = json.loads(response.text)['profile']['nickname']
       self.uid = json.loads(response.text)['account']['id']
       if code==200:
           self.error = ''
       else:
           self.error = '登录失败,请检查账号'
       self.cookies = response.cookies.get_dict()
       self.log('登录成功')
   '''
   每日签到
   '''
   def sign(self):
       url = api + '?do=sign'
       response = self.getResponse(url, {"r":random.random()})
       data = json.loads(response.text)
       if data['code'] == 200:
           self.log('签到成功')
       else:
           self.log('重复签到')
   '''
   每日打卡300首歌
   '''
   def daka(self):
       url = api + '?do=daka'
       response = self.getResponse(url, {"r":random.random()})
       self.log(response.text)
   '''
   查询用户详情
   '''
   def detail(self):
       url = api + '?do=detail'
       data = {"uid":self.uid, "r":random.random()}
       response = self.getResponse(url, data)
       data = json.loads(response.text)
       self.level = data['level']
       self.listenSongs = data['listenSongs']
       self.log('获取用户详情成功')
   '''
   Wxpusher推送
   '''
   def wxpusher(self):
       if (self.appToken == '' or self.wxpusheruid == ''):
           self.log('未填写WxPusher推送所需参数,请检查')
           return
       self.diyText() # 构造发送内容
       url = 'https://wxpusher.zjiecode.com/api/send/message/'
       data = json.dumps({
           "appToken":self.appToken,
           "content":self.content,
           "summary":self.title,
           "contentType":3,
           "uids":[self.wxpusheruid]
       })
       response = requests.post(url, data = data, headers = {'Content-Type': 'application/json;charset=UTF-8'})
       if (response.json()['data'][0]['status']) == '创建发送任务成功':
           self.log('用户:' + self.name + '  WxPusher推送成功')
       else:
           self.log('用户:' + self.name + '  WxPusher推送失败,请检查appToken和uid是否正确')
   '''
   自定义要推送到微信的内容
   title:消息的标题
   content:消息的内容,支持MarkDown格式
   contentType:消息类型,1为普通文本,2为html,3为markdown
   '''
   '''
   Server推送
   '''
   def server(self):
       if self.sckey == '':
           return
       self.diyText() # 构造发送内容
       data = {
           "text":self.title,
           "desp":self.content
       }
       if (self.pushmethod.lower() == 'scturbo'):      #Server酱 Turbo版
           url = 'https://sctapi.ftqq.com/' + self.sckey + '.send'
           response = requests.post(url, data=data, headers = {'Content-type': 'application/x-www-form-urlencoded'})
           errno = response.json()['data']['errno']
       else:                                           #Server酱 普通版
           url = 'http://sc.ftqq.com/' + self.sckey + '.send'
           response = requests.post(url, data=data, headers = {'Content-type': 'application/x-www-form-urlencoded'})
           errno = response.json()['errno']
       if errno == 0:
           self.log('用户:' + self.name + '  Server酱推送成功')
       else:
           self.log('用户:' + self.name + '  Server酱推送失败,请检查sckey是否正确')
   '''
   自定义要推送到微信的内容
   title:消息的标题
   content:消息的内容,支持MarkDown格式
   '''
   def diyText(self):
       # today = datetime.date.today()
       # kaoyan_day = datetime.date(2020,12,21) #2021考研党的末日
       # date = (kaoyan_day - today).days
       for count in grade:
           if self.level < 10:
               if self.listenSongs < 20000:
                   if self.listenSongs < count:
                       self.tip = '还需听歌' + str(count-self.listenSongs) + '首即可升级'
                       break
               else:
                   self.tip = '你已经听够20000首歌曲,如果登录天数达到800天即可满级'
           else:
               self.tip = '恭喜你已经满级!'
       if self.error == '':
           state = ("- 目前已完成签到\n"
                   "- 今日共打卡" + str(self.dakanum) + "次\n"
                   "- 今日共播放" + str(self.dakaSongs) + "首歌\n"
                   "- 还需要打卡" + str(self.day) +"天")
           self.title = ("网易云今日打卡" + str(self.dakaSongs) + "首,已播放" + str(self.listenSongs) + "首")
       else:
           state = self.error
           self.title = '网易云听歌任务出现问题!'
       self.content = (
           "------\n"
           "#### 账户信息\n"
           "- 用户名称:" + str(self.name) + "\n"
           "- 当前等级:" + str(self.level) + "级\n"
           "- 累计播放:" + str(self.listenSongs) + "首\n"
           "- 升级提示:" + self.tip + "\n\n"
           "------\n"
           "#### 任务状态\n" + str(state) + "\n\n"
           "------\n"
           "#### 打卡日志\n" + self.dakaSongs_list + "\n\n")