架構師學習之路


LVS 四層   轉發   內存和CPU   配置簡單

 

NGINX:L4-L7   七層    代理     正則表達式      geoip 

1.不支持自動以URL檢測       2.IP_HASH     3.負載均衡算法少   rr wrr   ip_hash

 

haproxy:L4-L7  cookie

rr

wrr

最小連接數

source

URI

HTTP請求頭

cookie

squid   Varnish  ATS   

Nginx+Squid  Nginx+varnish   Nginx+ats

73              76:2222     76:1111

client  ->    proxy --->   server

73           74:6666   76:2222     76:1111

client ->>proxy  -->>proxy    -> server

緩存:

Buffer   緩沖  寫操作     寫緩沖

Cache  緩存   讀操作    讀緩存

速度      多級

讀緩存

客戶端   瀏覽器

內存       本機內存           遠程服務器內存

硬盤        本機硬盤          遠程服務器硬盤

特性:

1.過期時間

2.強制過期

3.命中率

4.

 應用層緩存:

php 5..5 Zend Opcache 

pph opcache + 軟鏈接  部署完需要重啟php-fpm 

 redis key 大小,不建議超過2M

超過2M的key值,建議分片處理:

hash :h1 h2 h3 h4 h5 

keys : xxx h1,h2, h3, h4, h5

redis集群:

1.客戶端分片           優勢:簡單   可控

                                  缺點:手動 手動故障解決 手動數據遷移

2.Redis cluster   

3.Proxy 

11012

數據庫          表

key     hash 

 

雲服務

雲計算前:

IDC托管:買台機器-放到IDC-安裝系統-部署應用-買個域名-綁定上去-對外訪問

 ICP備-ICP證-文網文-、 IDC租用、VPS、虛擬主機

傳統數據中心面臨的問題:

資源利用率低:

資源分配不合理:

自動化能力差:

初始成本高:

 

雲計算來了:

1.一種模式   2.雲計算必須通過網絡是使用   3.彈性計算、按需計算、快速擴展

不用關心基礎設施,都有雲計算提供商提供

雲計算分類:

私有雲:

公有雲:

混合雲:

雲計算分層:IAAS,PAAS,SAAS

 

虛擬化:

內合計虛擬化技術KVM

使用場景分類:服務器虛擬化,桌面虛擬化、應用虛擬化。

 

前期總結:

1.運維標准,ITIL

2.自動化安裝-cobbler

3.監控體系-Zabbix

4.配置管理-SaltStack

5.自動化代碼部署

6.日志平台-ELKStack

 

持續集成和自動化部署

環境規划

1.開發環境-開發者本地有自己的環境,然后運維需要設置的開發環境,大家公用的服務。例如:開發數據庫mysql,其他:Redis、Memcached。

2.測試環境:功能測試環境和性能測試環境。

3.預生產環境:生產環境集群中的某一個節點擔任。

4.生產環境:直接對用戶提供服務的環境

預生產環境產生的原因:

      數據庫不一致:測試環境和生產環境數據庫肯定是不一樣的。

      使用生產環境的聯調接口。例如,支付接口。

 

已有一個可以上線的代碼在代碼倉庫

我們如何設計一套生產自動化部署系統

1.規划

2.實現

3.總結和擴展

4.在生產環境應用

 

1.1個集群10個節點。實現,一鍵部署這個10個節點。

2.一鍵回滾到任意版本

3.一鍵回滾到上一個版本

 

部署  回滾

部署:

1.代碼在哪里:SVN、git。

2.獲取什么版本代碼?

     svn+git 直接拉取master 

    svn: 指定版本號 

   git:指定tag

3.差異解決:

                  1)各個節點直接差異:

                   2)配置文件未必一樣:crontab.xml  預生產節點  

                   3)代碼倉庫和實際的差異。配置文件是否放在代碼倉庫中。Config.sample 配置文件只在部署上有,單獨的項目。

4.如何更新。Java Tomcat。需要重啟

5.測試。

6.串行和並行  分組部署

7.如何執行 1)shell ./執行。  2)web界面    

 

 實戰:

1.用戶 所有的web服務,都應該使用普通用戶。所有的web服務都不應該監聽80端口,除了負載均衡。8080

   useradd www

2.ssh-keygen -t rsa

 

Salt State  SLS描述文件          YAML

名稱ID聲明   

apache-install:         #ID聲明   高級狀態,ID必須唯一
  pkg.installed:           #State 聲明 狀態聲明
    - names:
      - httpd
      - httpd-devel

apache-service:        #ID聲明    高級狀態,ID必須唯一
  service.running:        #State 聲明 狀態聲明
    - name: httpd            #屬性,選項聲明
    - enable: True         

LAMP架構

        步驟:                           模塊

      1.安裝軟件包                  pkg

       2.修改配置文件              file

       3.啟動服務                      service

pkg.installed   #安裝

pkg.latest       #確保最新版本

pkg remove      #卸載

pkg.purge       # 卸載並刪除配置文件

 

pkg.installed

一個ID聲明下面。狀態模塊不能重復使用

#同時安裝多個包

common_packages:

 pkg.installed: - pkgs: - unzip - dos2unix - salt-minion: 2015.8.5-1.el6
lamp-pkg:
pkg.installed:
- pkgs:
- httpd
- php
- mysql
- php-mysql
- mariadb-server
- php-cli
- php-mbstring
apache-config:
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://lamp/files/http.conf
- group: root
- user: root
- mode: 644

php-config:
file.managed:
- name: /etc/php.ini
- source:salt://lamp/files/http.conf
- user: root
- group: root
- mode: 644
    salt:// 表示當前環境的根目錄。例如:

file_roots:
  base:
    -  /home/script/salt

那么salt://lamp/files/http.conf  表示 /home/script/salt/lamp/files/http.conf

狀態間關系:

   1.我依賴誰        require

    

   2.我被誰依賴  require_in 

    

 

     

   3.我監控誰      watch   

    

 

 

    1).如果 apache-config這個ID的狀態發生變化就reload

    2)如果不加reload: True,那么就restart

   4.我被誰監控

 

   5.我引用誰     include

     

   6.我擴展誰

 如何編寫SLS技巧:

    1.按狀態分類    如果單獨使用,很清晰

     2.按服務分類    可以被其他的SLS include。例如:LAMP include mysql的服務

yaml---jinja

兩種分隔符: {% ... %} 和 {{ ... }} 

構建個模板需要3步:

      1.告訴File模塊,你要使用jinja

       - template: jinja

       2.你要列出參數列表          

              - defaults:

                  - PORT: 88

        3.模板引用

              {{ PORT }}

模板里面支持: salt執行模塊 grinas pillar 進行賦值

1.寫在模板文件中

Grainas:Listen {{ grains['fqdn_ip4'][0] }}:{{ PORT }}、

salt遠程執行模塊:{{ salt['network.hw_addr']('eth0') }}

 pillar  {{ pillar['apache'] }}

2.寫在SLS里面的defaults,變量列表中

- defaults:

          IPADDR: {{ grains['fqdn_ip4'][0] }}

          PROT: 88

所有的minion 出去的Pillar中item rsyslog的值是server的minion

 

頭腦風暴:

1.系統初始化

 2.功能模塊:設置單獨的目錄 haproxy nginx php mysql memcached

     盡可能的全、獨立

3.業務模塊: 根據業務類型划分,例如web服務。論壇 bbs

    include  

干活:

    1.salt環境配置

開發       測試 (功能測試環境、性能測試環境)        預生產           生產

1)base    基礎環境

init 目錄 ,環境初始化:1.dns配置  2.history記錄時間   3.記錄命令操作   4.內核參數優化  5.安裝yum倉庫    6.安裝zabbix-agent

                                       

2)prod     生產環境

 

本地可用的端口范圍:

    作為客戶端發起連接的時候。

    socket 網絡套接字

    五元組

    源地址  源端口   目的地址    目的端口    協議

    TCP  你要訪問baidu  x.x.x.x 9876   x.x.x.x 80 

 

 

深入學習saltstack遠程執行:

          salt ‘*’  cmd.run 'w'

命令:salt

目標:'*'

模塊:cmd.run  自帶150+模塊。自己寫模塊

返回:執行后結果的返回,Returners

目標:Targeting

            兩種:一種和mininon ID有關

                        一種和Minion  ID無關

1.Minion ID有關的方法。

    Minion ID 

   通配符

salt '*'  test.ping

salt 'linux[1|2]'  test.ping

     列表

salt 'master,slave'  test.ping

      正則表達式:

salt -E  'linu(node1|node2)*'   test.ping   

      所有匹配目標的方式,都可以用到top file里面來指定目標

     主機名設置方案:

           1.IP地址

            2.根據業務來進行設置

                redis-node1-redis-03-idc04-soa.example.com

                redis-node1  redis第一個節點

                redis04  集群

                 idc04    機房

                  soa      業務線

2.Minion ID 無關

   子網,IP地址

    salt -s 192.168.53.11  test.ping

    salt -s 192.168.53.0/24  test.ping

模塊:自帶模塊

返回程序:

編寫模塊:

1.放哪  /svr/salt/_modules

2.命名:文件名就是模塊名,例如  my_disk.py

3.刷新

 

saltstack快速入門:

python 編寫 REST API

   三大功能:遠程執行

                     配置管理(狀態)

                      雲管理

同類產品:Puppet + func ruby 編寫,ansible python 編寫

四種運行方式:

        Local:

        Minion/Master C/S架構

        Syndic  - zabbix  Proxy

        Salt SSH

典型案例:

1.遠程執行 salt "*" cmd.run 'uptime'

2.State  你要寫一個文件。格式:YAML  后綴 .sls

 YAML:三板斧

       1.縮進(層級關系):兩個空格,不能使用tab鍵。

        2.冒號  key: value   冒號后面有個空格

        3.短橫線 - list1   短橫線后面有個空格

                       - list2

SaltStack 數據系統

     Grains (谷粒):靜態數據  當Minion啟動的時候收集的Minion本地的相關信息

                                    操作系統版本 ,內核版本,CPU,內存,硬盤。設備型號。序列號

           1.資產管理。信息查詢

            2.用於目標選擇   salt -G 'os:centos' cmd.run 'w'  

            3.配置管理中使用。 

TOP File 使用案例:

base:
    'slave':
      - web.apache
    'roles:apache':
      - match: grain
      -web.apache

   配置管理案例:

開發一個Grains:

      python: 寫一個Python腳本,返回一個字典就可以了。

      

#!/usr/bin/env python
#-*- coding: utf-8 -*-

def my_grains():
#初始化一個grains字典
grains = {}
#設置字典中的key-value
grains['iaas'] = 'openstack'
grains['edu'] = 'oldboyedu'
#返回這個字典
return grains

刷新Grains:

         salt ‘*’  saltutil.sync_grains

Grains優先級:

    1.系統自帶

     2.grains文件寫的

      3.minion配置文件寫的

      4.自己寫的

        

    Pillar       (柱子)

Pillar 動態的,給特定的minion指定特定的數據。只有指定的minion自己能看到自己的數據。

pillar_roots  top file

1.寫pillar  sls

2.top file

[root@master web]# salt 'master' pillar.item hehe
master:
----------
hehe:
----------
apache:
httpd

pillar使用場景:

1.目標選擇

Grains VS Pillar

               類型         定義位置    數據采集方式         應用場景

Grains    靜態          minion       minion啟動收集        數據查詢   目標選擇     配置管理      

Pillar      動態           master       master自定義         目標選擇   配置管理     敏感數據

 

工作流:

 

監控自動化分類:

1.自動注冊

1.1zabbix agent自動添加

2.主動發現

    2.1 自動發現discover

     2.zabbix api

curl -s -X POST -H 'Content-Type:application/json' -d  '

{
    "jsonrpc": "2.0", "method": "user.login", "params": { "user": "Admin", "password": "zabbix" }, "id": 1 }' http://172.16.1.11/zabbix/discoveryconf.php|python -m json.tool

1,監控主機多,性能跟不上,延遲大

     2.多機房,防火牆

zabbix輕松解決。Nagios不太好解決

      監控模式,針對Agent來說

1.被動模式

2.主動模式 active

 Queue里有大量延遲的item

   當監控主機超過300+,建議使用主動模式

主動模式配置:

Zabbix Proxy

       zabbix-server ->>zabbix proxy ->zabbix agent

        

yum install -y zabbix-proxy zabbix-proxy-mysql mariadb-server

 

 

 

Zabbix生產案例實戰

1、項目規划

  主機分組:    

     交換機

      NGINX

     tomcat

     mysql

 監控對象識別:

     1.使用SNMP監控交換機

      2.使用IPMI監控服務器硬件

      3.使用Agent監控服務器

      4.使用JMX監控java

      5.監控mysql

     6.監控web狀態

      7.監控NGINX狀態

SNMP監控

1.1.交換機開啟snmp

       config t

      snmp-server  community public ro

       end

 1.2.在zabbix 上添加監控

3.關聯監控模板

IPMI:

    建議:使用自定義item,本地執行IPMItool命令來獲取數據

JMX :(使用Zabbix Java Gateway 代理)

1.yum install zabbix-java-gateway java-1.8.0

2.vim  /etc/zabbix/zabbix_java_gateway.conf

3.啟動systemctl start zabbix-java-gateway.service

4.端口 進程

JMX 三種類型:1.無密碼認證 2.用戶密碼認證 3.ssl

5.vim /etc/zabbix/zabbix_server.conf

   設置Java Gageway地址

6.重啟zabbix server

 安裝 Tomcat,啟動Tomcat,端口8080

開啟jmx遠程監控

vim catalina.sh 

CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8888
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=172.16.1.11"

重啟Tomcat

手動檢測監控狀態

yum install -y zabbix-get

1.開啟NGINX監控

2.編寫腳本來進行數據采集

3.設置用戶自定義參數

4.重啟zabbix-agent

5.添加item

6.創建圖形

7.創建觸發器

8.創建模板

  1)編寫腳本

   2)上傳到/etc/zabbix/zabbix_agentd.d/

   3).修改agent配置Include=/etc/zabbix/zabbix_agentd.d/*.conf

    4)chmod u+x 腳本

location /nginx_status {
stu_status on ;
access_log off;
allow 127.0.0.1/24;
deny all;
}

UserParameter=linux_status[*],/etc/zabbix/zabbix_agentd.d/zabbix_linux_plugin.sh "$1" "
$2" "$3"

重啟代理

測試

zabbix_get -s 172.16.1.11 -k linux_status[nginx_status,81,active]

 

自定義告警腳本:

   1.放在cd /usr/lib/zabbix/alertscripts/

    2.要支持三個參數 1收件人 2主題 3內容

     3.執行權限

      4.web界面添加

      5.修改Actions

使用percona監控插件監控mysql

yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
https://www.percona.com/doc/percona-monitoring-plugins/LATEST/zabbix/index.html
yum install percona-zabbix-templates
1.php腳本用來數據采集
2.shell 調用這個PHP
3.zabbix配置文件
4.zabbix模板文件
創建mysql數據庫zabbix專用用戶

完整告警流程:

1.創建用戶組,添加權限,權限只能按用戶組分配

2.創建用戶,選擇用戶角色

3.報警媒介

4.Action

    添加新主機后,要確認權限分配。

 

自定義監控項:

1.添加用戶自定義參數

cat /etc/zabbix/zabbix_agentd.d/nginx.conf
UserParameter=nginx.active,/usr/bin/curl -s http://172.16.1.11:81/nginx-status|awk 'NR==1 {print $NF}'

2.重啟zabbix-agent

3.在server端使用zabbix-get測試獲取

zabbix_get -s 172.16.1.11 -p 10050 -k "nginx.active"
1

4.在web界面創建item

5.自定義圖形:

6.自定義screen:

7.自定義map:

作業:

   1.網絡監控 Smokeping部署

   2.zabbix熟悉亂點

  3.下次分享 Piwik 流量分析系統

 

zabbix概述:

     zabbix-agent

 

    zabbix-server

mysql數據庫-

web界面

 

 

應用服務監控:

       nginx:

yum install -y gcc glibc gcc-c++ pcre-evel  openssl-devel

wget http://nginx.org/download/nginx-1.10.1.tar.gz

configure   Shell 腳本,執行他的作用。生成 MAKEFILE 

./configure -prefix=/application --user=nginx --group=nginx.......

make && make install

ln /application/nginx-1.10.1/  /applicaiton/nginx

 

監控體系: 采集 存儲 展示 告警

Nagios+Cacti

Zabbix   IPMI  SNMP JVM  Server - Agent

Gangla

 

監控:

監控對象

      1.監控對象的理解:CPU 是怎么工作的。原理

       2.監控對象的指標:CPU使用率,CPU負載 CPU個數 CPU上下文切換

       3.確定性能基准線:怎么樣才算故障?CPU負載多少才算高

監控范圍:

       1.硬件監控              服務器的硬件故障

       2.操作系統監控       CPU 內存 IO 進程 

        3.應用服務監控 

         4.業務監控              

硬件監控:

        遠程控制卡:DELL 服務器:iDRAC

                              HP服務器:ILO

                             IBM服務器:IMM

         Linux就可以使用IPMI  BMC控制器   

         ipmitool    

         1.硬件要支持IPMI

          2.操作系統支持  Linux IPMI 

           3.管理工具         ipmitool

安裝:yum install OpenIPMI ipmitool

啟動:systemctl start ipmi

使用IPMI有兩種方式1   本地調用

                                  2.  遠程調用

ipmitool help

ipmi 配置網絡,有兩種方式:

       ipmi over lan

       獨立:單獨網線(單獨交換機配置ipmi)       

硬件監控:         1.使用IPMI 2.機房巡檢

路由器和交換機:SNMP(簡單管理網絡協議) 監控

        yum install net-snmp net-snmp-utils -y

 

系統監控:

   ---CPU

   ---內存

 -----IO Input/Ouput(網絡、磁盤)

CPU三個重要概念:

       上下文切換:CPU調度器實施的進程的切換過程,上下文切換

        運行隊列(負載):運行隊列  

        使用率:

       時間片

確定服務類型:

      IO密集型: 數據庫

     CPU密集型: web mail

確定性能基准線:

       運行隊列 :1-3線程    1CPU 4核  負載不超過12個線程

       CPU使用:65%-70% 用戶態利用率

                          30%-35%   內核態利用率

                          0%-5%       空閑

       上下文切換:

監控工具:top:P CPU使用率排序    M內存使用率排序

                  top vmstat mpstat

內存:free vmstat

           頁 4KB 

            1.尋址  2.空間    

 

硬盤:塊      iotop dd iostat

          IOPS   IO’s Per Second

           順序IO

           隨機IO

網絡:iftop  帶寬   

阿里測試,奇雲測

IBM nmon  二進制                   測試用

 

 

作業:

1.注冊GITHUB,創建edu-docs項目

2.熟悉基本git命令

3.上傳今天編寫的第一個規范,到github上

4.講Cobbler的實驗在虛擬機上再次完成,並編寫文檔

預習:

1.安裝zabbix

 

 

自動化規范:

1.服務器采購

2.服務器驗收並設置raid

3.服務商提供驗收單,運維驗收負責人簽字

4.服務器上架

5.資產錄入

6.開始自動化安裝

    1)將新服務器划入裝機VLAN

    2)根據資產清單上的MAC地址,自定義安裝

     3)

 

基於ITIL的IT運維管理體系:

 

運維自動化發展層級:智能化、服務化(API)、Web化、平台化、標准化、工具化

智能化

智能化的自動化擴容、縮容、服務降級、故障自愈

觸發機制--》決策系統(決策樹)--》

                1、 zabbix觸發Action

觸發:

1)、當某個集群的訪問量超過最大支撐量,比如10000.

2)、並持續5分鍾

3)、不是攻擊

4)、資源池有可用資源

    4.1) 當前網絡帶寬使用率

     4.2 )如果是共有雲,錢夠不夠

5)、當前后端服務支撐量是否超過閾值,如果超過應該后端先擴容

6)、數據庫是否可以支撐當前並發

7)、當前自動化擴展隊列,是否有正在擴容的節點

8)、其他業務相關的

                 之前:先判斷Buffer是否有最近X小時,已經移除的之前創建的虛擬機

                            並查詢軟件版本是否和當前一致,如果一致,從第5步開始

                            如果不一致,從第4步開始

                      2、OpenStack 創建虛擬機

                      3、Saltstack 配置環境---------監控

                      4、部署系統部署當前代碼

                      5、測試服務是否可用(注意間隔和次數)

                      6、加入集群

                      7、通知(短信、郵件)

自動化縮容:

                     1、觸發條件和決策

                      2、從集群中移除節點---關閉監控--移除

                      3、通知

                      4、移除的節點存放於Buffer里面

                       5、Buffer里面超過1天的虛擬機,自動關閉,存放於xx區

                       6、xx區的虛擬機,每7天清理刪除

 

服務化(API化)

DNS WEB 管理 bind-DLZ       dns-api

負載均衡WEB管理                   slb-api

JOB管理平台                            job-api

監控WEB管理 Zabbix           zabbix-api 

操作系統安裝平台                 cobbler-api

部署平台                                deploy-api

配置管理平台                      saltstack-api

自動化測試平台                     test-api

       1、調用 cobbler-api安裝操作系統

        2、調用saltstack-api進行系統初始化

         3、調用 dns-api解析主機名

         4、調用zabbix-api 將新上線機器加上監控

          5、再次調用 saltstack-api部署軟件(安裝NGINX+PHP)

           6、調用deploy-api將當前版本的代碼部署到服務器上

           7、調用  test-api測試當前服務運行十分正常

            8、調用slb-api將該節點加入集群

 

運維操作平台-WEB化:

              例子:JOB管理平台

1、做成web界面

2、權限控制

3、日志記錄

4、弱化流程

5、不用SSH到服務器,減少人為操作造成的故障 web ssh

 

DNS WEB 管理 bind-DLZ

負載均衡WEB管理

JOB管理平台

監控WEB管理 Zabbix

操作系統安裝平台

 

工具化:

    1.SHELL腳本(功能性(流程)腳本、檢查性、報表性)

     2.開源工具:Zabbix ELKStack SaltStack Cobbler

     目標:1、促進標准化的實施

                2、將重復的操作,簡單化

                 3、將多次操作,流程化

                  4、減少人為操作的低效和降低故障率

                 工具化和標准化是好基友!

痛點:

              1、至少要SSH到服務器執行。可能犯錯

              2、多個腳本有執行順序的時候,可能犯錯

               3、權限管理問題,日志沒法統計

                4、無法避免手工操作

 

運維自動化發展:

1.運維標准化

物理設備層面:

       1)服務器標簽化、設備負責人、設備采購詳情、設備擺放標准。

        2)網絡划分、遠程控制卡、網卡端口

        3)服務器機型、硬盤、內存統一。根據業務分類。

        4)資產命名規范、編號規范、類型規范

        5)監控標准

操作系統層面:

        1)操作系統版本

         2)系統初始化(DNS、NTP、內核參數調優、rsyslog、主機名規范)

          3)基礎Agent配備(Zabbix Agent、Logstash Agent、Saltstack minion)

           4)系統監控標准(CPU、內存、硬盤、網絡、進程)

應用服務層面:

            1)Web服務器選型(Apache、Nginx)

             2)進程啟動用戶、端口監聽規范、日志收集規范(訪問日志、錯誤日志、運行日志)

             3)配置管理(配置文件規范、腳本規范)

              4)架構規范(Nginx+Keepalived、LVS+Keepalived等)

               5)部署規范(位置、包命名等)

運維操作層面:

                1)機房巡檢流程(周期、內容、報修流程)

                2)業務部署流程(先測試、后生產。回滾)

                3)故障處理流程(緊急處理、故障升級、重大故障管理)

                 4)工作日志標准(如何編寫工作日志)

                 5)業務上線流程(1.項目發起 2.系統安裝 3.部署Nginx 4.解析域名 5.測試 6.加監控 7.備份)

                  6)業務下線流程(誰發起,數據如何處理。)

                   7)運維安全規范(密碼復雜度、更改周期、VPN使用規范、服務登陸規范)

 目標:文檔化

 

運維知識體系:

https://www.unixhot.com/page/ops

運維學習和發展的一個線路:

1.搭建服務(部署並運行起來)

2.用好服務(監控、管理、優化)

3.自動化(服務直接的關聯和協同工作)

4.產品設計(如何設計一個監控系統)

雲計算的核心競爭力是運維!

系統架構師(偏管理):網絡 系統 數據庫 開發 雲計算 自動化 運維管理 服務管理 項目管理 測試 業務

專注某一領域


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM