摘要: 本文將介紹在專有網路VPC(VirtualPrivate Cloud)下,基於資源編排服務,快速部署高可用Dubbox服務的程序。Dubbox服務採用的註冊中心是ZooKeeper集群。做這件事情的意義在於:節約部署Dubbox的時間,降低部署Dubbox程序中出錯的風險。
本文將介紹在專有網路VPC(Virtual Private Cloud)下,基於資源編排服務,快速部署高可用Dubbox服務的程序。Dubbox服務採用的註冊中心是ZooKeeper集群。做這件事情的意義在於:節約部署Dubbox的時間,降低部署Dubbox程序中出錯的風險。
ROS
阿裡雲資源編排(ResourceOrchestration)是一種簡單易用的雲端運算資源管理和自動化運維服務。用戶通過範本標題多個雲端運算資源的相依性屬性、設定等,並自動完成所有資源的建立和設定,以達到自動化部署、運維等目的。編排範本同時也是一種標準化的資源和套用交付方式,並且可以隨時編輯修改,使基礎設施即代碼(Infrastructureas Code)成為可能。
Ansible
Ansible是一個簡單的自動化IT工具。參考Ansible官網的介紹就是:“Deployapps.Manage systems.Crush complexity.Ansible helps you build a strong foundationfor DevOps.”。
其他Ansible的相關知識可參考Ansible中文權威指南。
Ansible的工作機制,可參考基於資源編排和 Ansible 在 VPC 下快速交付套用中“Ansible 及其執行機制”章節。
Dubbox
Dubbox在Dubbo服務的基礎上新增了一些新功能,如:REST風格的遠程叫用、支援基於Jackson的JSON序號、支援基於Kryo和FST的Java高效序號實現、支援完全基於Java代碼的Dubbo設定、升級Spring、升級Zookeeper等。想瞭解其他關於Dubbox服務內容可參考DubboxGithub。
ZooKeeper
Apache ZooKeeper是Apache軟體基金會的一個軟體專案,他為大型分散式運算提供開源的分散式佈建服務、同步服務和命名註冊。ZooKeeper的架構通過冗余服務實現高可用工時。本文將介紹採用ZooKeeper集群作為Dubbox服務的註冊中心,來許諾Dubbox服務的高可用工時。其他ZooKeeper相關的知識可參考ZooKeeperWiki。
本文將從以下三個方面展開介紹:
- 準備Ansible主機
- VPC網路環境下快速部署高可用Dubbox服務
- 總結
準備Ansible主機
本章將從以下兩個方面展開:
首先需要新建一個VPC,並在這個VPC下建立一個VSwitch,在這個VPC和VSwitch下申請一台ECS實例,並給這台機器繫結公網IP,方便存取外網。本文所採用的Ansible主機(ECS)系統組建資訊如下:
CentOS Linux release 7.0.1406 (Core)
這個組建的ECS已經安裝了Python2.7.5。
說明:專有網路VPC的建立連結。建立好VPC以後直接在該VPC下新建VSwitch即可。新建ECS的連結。
建立好Ansible主機以後,我們需要給這台主機安裝Ansible和ROS SDK。Ansible用來實現對遠端主機的控制,ROSSDK用來實現對資源棧的動作。
安裝Ansible
Dubbox服務的快速部署需要借助Ansible來完成,本文採用了yum來安裝Ansible:
yum install ansible
Ansible預設安裝目錄為/etc/ansible,安裝好以後,/etc/ansible/目錄結構如下:
[root@iZ94jwkjg0sZ ansible]# ls -l
總用量 24
-rw-r--r-- 1 root root 13819 5月25 23:49 ansible.cfg
-rw-r--r-- 1 root root441 8月17 17:52 hosts
drwxr-xr-x 4 root root4096 8月17 17:52 roles
關於Ansible的安裝方式可參考Ansible Installation。
注意:如果採用的是Ubuntu系統,安裝Ansible程序如下:
apt-get install ansible
apt-get install sshpass
安裝ROSSDK
ROS提供了RESTfulAPI和SDK,本文將介紹用Python的方式來叫用ROSAPI建立資源。
在叫用ROSAPI之前需要安裝相關的依賴。
使用pip安裝aliyun-python-sdk-core:
pip install aliyun-python-sdk-core
使用pip安裝ROS SDK:
pip install aliyun-python-sdk-ros
如果Ansible主機未安裝pip,可使用以下指令安裝pip:
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
python get-pip.py
如果不瞭解pip,可參考維琪百科)。
關於ROSSDK詳細安裝和使用程序可以參考阿裡雲資源編排服務Python SDK使用入門。
VPC網路環境下快速部署高可用Dubbox服務
本章將詳解講解Dubbox服務的部署程序。您也可以跳過此章節,直接參考如何快速構建高可用Dubbox服務快速部署Dubbox服務。
本章將從以下五個方面展開:
- 建立資源棧
- 編輯Inventory檔案
- 構建PlayBook
- 執行PlayBook
- 部署Dubbox服務
建立資源棧
建立資源棧的程序主要分為以下三步:
- 定義ROS資源範本
- 叫用ROS API,建立資源棧
- 追蹤資源棧輸出資訊
定義ROS資源範本
本文通過叫用ROSAPI的方式來建立資源棧。
ROS資源範本包括以下幾種資源類型:
·"Type":"ALIYUN::ECS::InstanceGroup"
- 在資源範本中使用兩組該類型的資源,一組用來定義Dubbox主控台集群伺服器,一組用來定義ZooKeeper集群伺服器。
·"Type":"ALIYUN::SLB::LoadBalancer"
·"Type":"ALIYUN::SLB::BackendServerAttachment"
·"Type":"ALIYUN::SLB::Listener"
- 設定SLB監聽,SLB監聽Dubbox主控台集群伺服器的8080埠,並設定了健康檢查HealthCheck。
·資源棧的輸出為"Outputs",包括:EcsPrivateIps(Dubbox主控台集群伺服器的私有IP),ZKPrivateIps(ZooKeeper集群伺服器的私有IP),LoadBalanceIp(負載平衡SLB的公網IP)。
在VPC網路環境下,給InstanceGroup指定VPC和VSwtich,並許諾和Anisble主機處在同一個VPC和VSwitch下,這樣才能許諾Ansible主機可通過ECS的私有IP來登入ECS並操控ECS實例。
定義ROS資源範本的Python檔案為generate_vpc_ros_template.py,檔案內容如下:
from string import Template
# define ros template
create_resources_with_parameters = '''
{
"ROSTemplateFormatVersion": "2015-09-01",
"Resources": {
"InstanceGroupDubboxAdmin": {
"Type": "ALIYUN::ECS::InstanceGroup",
"Properties": {
"ImageId": "centos7u2_64_40G_cloudinit_20160520.raw",
"Password": "$ecs_password",
"MinAmount": 2,
"MaxAmount": 2,
"InstanceType": "$instance_type",
"ZoneId": "$zone_id",
"InternetChargeType": "PayByTraffic",
"NetworkType": "vpc",
"InstanceName": "ecs",
"VpcId": "$vpc_id",
"VSwitchId": "$vswitch_id"
}
},
"InstanceGroupZK": {
"Type": "ALIYUN::ECS::InstanceGroup",
"Properties": {
"ImageId": "centos7u2_64_40G_cloudinit_20160520.raw",
"Password": "$ecs_password",
"MinAmount": 3,
"MaxAmount": $instance_group_zk_size,
"InstanceType": "$instance_type",
"ZoneId": "$zone_id",
"InternetChargeType": "PayByTraffic",
"NetworkType": "vpc",
"InstanceName": "zk",
"VpcId": "$vpc_id",
"VSwitchId": "$vswitch_id"
}
},
"LoadBalance": {
"Properties": {
"AddressType": "internet",
"InternetChargeType": "paybytraffic",
"LoadBalancerName": "balancer"
},
"Type": "ALIYUN::SLB::LoadBalancer"
},
"Attachment": {
"Properties": {
"BackendServers": [
{
"ServerId": { "Fn::Select": ["0",{ "Fn::GetAtt": [ "InstanceGroupDubboxAdmin", "InstanceIds" ] }]},
"Weight": 100
},
{
"ServerId": { "Fn::Select": ["1",{ "Fn::GetAtt": [ "InstanceGroupDubboxAdmin", "InstanceIds" ] }]},
"Weight": 100
}
],
"LoadBalancerId": {
"Ref": "LoadBalance"
}
},
"Type": "ALIYUN::SLB::BackendServerAttachment"
},
"Listener": {
"Type": "ALIYUN::SLB::Listener",
"Properties": {
"LoadBalancerId": {
"Ref": "LoadBalance"
},
"ListenerPort": $listen_port,
"BackendServerPort": $bachend_server_port,
"Bandwidth": -1,
"Protocol": "http",
"HealthCheck": {
"HealthyThreshold": 3,
"UnhealthyThreshold": 3,
"Interval": 2,
"Timeout": 5,
"HttpCode": "http_2xx",
"URI": "$health_check_path"
},
"Scheduler": "wrr"
}
}
},
"Outputs": {
"EcsPrivateIps": {
"Value": { "Fn::GetAtt": [ "InstanceGroupDubboxAdmin", "PrivateIps"]}
},
"ZKPrivateIps": {
"Value": { "Fn::GetAtt": [ "InstanceGroupZK", "PrivateIps"]}
},
"LoadBalanceIp": {
"Value": {"Fn::GetAtt": [ "LoadBalance", "IpAddress"]}
}
}
}
'''
# define func to generate ros template
def generate_template(**kwargs):
template = Template(create_resources_with_parameters)
return template.substitute(kwargs)
叫用ROSAPI,建立資源棧
建立資源棧的Python檔案為create_stack.py,檔案內容如下:
from aliyunsdkcore.client import AcsClient
from aliyunsdkros.request.v20150901 import CreateStacksRequest
import generate_vpc_ros_template
import json
from config import *
# define func to create stack
def create_stack(stack_name, ak_id, ak_secret, region_id, zk_size):
print('invoke CreateStackRequest to create instances...')
client = AcsClient(ak_id, ak_secret, region_id)
req = CreateStacksRequest.CreateStacksRequest()
req.set_headers({'x-acs-region-id': region_id})
#create vpc network resources
template = generate_vpc_ros_template.generate_template(vpc_id = vpc_id, ecs_password = ecs_password,
instance_type = instance_type, zone_id = zone_id, vswitch_id = vswitch_id,
instance_group_zk_size = zk_size, listen_port = 8080,
bachend_server_port =8080, health_check_path = '/dubbo-admin/favicon.ico')
create_stack_body = '''
{
"Name": "%s",
"TimeoutMins": %d,
"Template": %s
}
''' % (stack_name, create_timeout, template)
req.set_content(create_stack_body)
# get response
response = client.get_response(req)
# deal response
if 201 == response[0]:
print('Create stack succeccfully!!!')
return json.loads(response[-1])
else:
print('Unexpected errors: status=%d, error=%s' % (response[0], response[-1]))
return None
if __name__ == '__main__':
create_stack(stack_name, ak_id, ak_secret, region_id, zk_size)
下面詳細解釋該Python檔案的執行程序:
1.初始化SDK用戶端物件:
client = AcsClient(ak_id, ak_secret,region_id)
2.初始化建立資源棧的要求:
req = CreateStacksRequest.CreateStacksRequest()
3.指定要求資源Region:
req.set_headers({'x-acs-region-id':region_id})
4.建構要求體,包括:棧名、逾期時間戳記、ROS資源範本
create_stack_body = '''
{
"Name": "%s",
"TimeoutMins": %d,
"Template": %s
}
''' % (stack_name, create_timeout, template)
req.set_content(create_stack_body)
5.傳送要求,建立資源棧:
response = client.get_response(req)
6. 追蹤資源棧資訊:
# deal response
if 201 == response[0]:
print('Create stack succeccfully!!!')
return json.loads(response[-1])
else:
print('Unexpected errors: status=%d, error=%s' % (response[0], response[-1]))
return None
要求成功會返回資源棧的Id和Name資訊,要求發出以後,可到ROS 主控台查看資源棧詳情。
追蹤資源棧輸出資訊
資源棧建立好以後,我們再次叫用ROSAPI追蹤資源棧的輸出資訊。方法如下:
def get_stack_outputs(stack, ak_id, ak_secret, region_id):
print('Start to get stack output...')
if stack is None:
return None
req = DescribeStackDetailRequest.DescribeStackDetailRequest()
req.set_headers({'x-acs-region-id': region_id})
req.set_StackName(stack['Name'])
req.set_StackId(stack['Id'])
client = AcsClient(ak_id, ak_secret, region_id)
attempt = attempt_times
wait = wait_time
while attempt >= 0 and wait >= 0:
response = client.get_response(req)
if 200 == response[0]:
resources = json.loads(response[-1])
if (resources is None) or (not resources.has_key('Outputs')):
time.sleep(wait)
attempt = attempt - 1
wait = wait - interval
continue
outputs = resources['Outputs']
print('Getting stack outputs finished. outputs: ', outputs)
return outputs
else:
print('Unexpected errors: status=%d, error=%s' % (response[0], response[-1]))
return None
print('Getting stack outputs timeout.')
return None
叫用時需要傳入建立好的資源棧Id和Name資訊。由於建立資源棧需要的時間不確定,所以以上方法定義了逾時重試的機制。每次重試以後的等待時間要比上次等待時間少interval秒,在嘗試attempt次若仍未追蹤到資源棧資訊視為資源建立失敗(一般不會出現這種情況)。
資源棧的輸出格式如下:
[{u'OutputKey': u'EcsPrivateIps', u'Description': u'No description given', u'OutputValue': [u'192.168.x.x', u'192.168.x.x']},
{u'OutputKey': u'ZKPrivateIps', u'Description': u'No description given', u'OutputValue': [u'192.168.x.x', u'192.168.x.x', u'192.168.x.x']},
{u'OutputKey': u'LoadBalanceIp', u'Description': u'No description given', u'OutputValue': u'112.74.x.x'}]
我們將以上輸出定義為Outputs。
編輯Inventory檔案
根據上面追蹤的資源棧輸出資訊Outputs,追蹤Dubbox主控台伺服器組的私有IP。方法如下:
def get_ecs_ips(outputs):
for i in range(len(outputs)):
if outputs[i]['OutputKey'] == ecs_ip_output_key:
return outputs[i]['OutputValue']
return None
根據上面追蹤的資源棧輸出資訊Outputs,追蹤ZooKeeper集群伺服器組的私有IP。方法如下:
def get_zk_ips(outputs):
for i in range(len(outputs)):
if outputs[i]['OutputKey'] == zk_ip_output_key:
return outputs[i]['OutputValue']
return None
因為在建立資源棧的時候,已經在設定檔中設定好了ALIYUN::ECS::InstanceGroup的登入密碼,所以可以直接使用設定檔中的密碼資訊,使用者名稱預設為root。編輯/etc/ansible/hosts檔案,即通常我們所說的AnsibleInventory檔案。編輯該檔案的方法如下:
# define func to create inventory
def edit_hosts(host_parameters, zk_parameters):
print 'Start edit hosts'
host_str = ' ansible_ssh_port=%s ansible_ssh_user=%s ansible_ssh_pass=%s\n'
with open(hosts_file, 'wb') as file:
file.write( '[%s]\n' % host_dubbo_admin )
for index in range(len(host_parameters)):
file.write( ('%s'+host_str) % (host_parameters[index][0], host_parameters[index][1], host_parameters[index][2], host_parameters[index][3]) )
file.write( '[%s]\n' % host_zookeeper )
for index in range(len(zk_parameters)):
file.write( ('%s'+host_str) % (zk_parameters[index][0], zk_parameters[index][1], zk_parameters[index][2], zk_parameters[index][3]) )
print 'Edit hosts end'
執行該方法以後,生成的Inventory檔案,即/etc/Ansible/hosts檔案,內容如下:
[dubbo_admin]
10.169.***.*** ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=***
10.44.***.*** ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=***
[zookeeper]
10.45.***.*** ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=***
10.170.***.*** ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=***
10.170.***.*** ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=***
Inventory檔案中定義了兩個遠端主機群組,dubbo_admin和zookeeper,並指定了不同主機的IP、登入合約(預設是SSH )、登入埠、登入使用者名稱和密碼。Ansible在執行PlayBook的時候通過以上資訊串連遠端主機。
構建PlayBook
本文所標題的高可用Dubbox服務,註冊中心採用的是ZooKeeper集群,因此需要構建兩個PlayBook。一個用來部署Dubbox主控台集群,一個用來部署ZooKeeper集群。
部署Dubbox主控台集群的PlayBook為vpc_dubbox_admin_playbook,結構如下:
[root@iZ94jwkjg0sZ roles]# ls -l vpc_dubbox_admin_playbook
總用量 12
drwxr-xr-x 2 501 games 4096 8月17 17:52 files
drwxr-xr-x 2 501 games 4096 8月17 17:52 tasks
drwxr-xr-x 2 501 games 4096 8月17 14:20 templates
關於vpc_dubbox_admin_playbook結構的說明如下:
·files
- 存放install_Jdk.sh、install_Jetty.sh、deploy_Admin.sh三個檔案,這三個檔案分別用來安裝JDK、Jetty以及部署Dubbox主控台服務。
·tasks
o存放要執行的yml檔案install_dubbo_admin.yml,檔案內容如下:
o---
o- name: add config
otemplate:
odest: /root/config
osrc: config.j2
omode: 0600
o
o- name: run install jdk
oscript: install_Jdk.sh
o
o- name: run install jetty
oscript: install_Jetty.sh
o
o- name: run deploy admin
oscript: deploy_Admin.sh
·templates
o存放設定檔範本config.j2,檔案內容如下:
o#第一列變數名第二列變數值第三列設定項不同列之間用tab或者空白字元分開
o#jetty安裝路徑,當目錄已經存在的時候加上f參數會強制覆寫,否則會結束安裝
oJETTY_HOME {{jetty_home}} {{enforce}}
o#設定admin主控台root用戶的密碼
oDUBBO_ADMIN_ROOT_PASSWD {{dubbo_root}}
o#設定admin主控台guest用戶的密碼
oDUBBO_ADMIN_GUEST_PASSWD {{dubbo_guest}}
o#註冊中心串連位址字元字串
oREGISTRY_ADDRESS {{registry_address}}
o#ZooKeeper集群的IP位址
oZK_IPS_STR {{zk_ips_str}}
o設定檔config.j2中的參數值從vpc_dubbox_zk.yml檔案中追蹤,通過Ansible執行PlayBook的程序中會在每一台遠端主機的/root目錄下生成config檔案,提供給install_Jdk.sh、install_Jetty.sh、deploy_Admin.sh這三個腳本使用。關於vpc_dubbox_zk.yml檔案,後面會提到。
部署ZooKeeper集群的PlayBook為vpc_dubbox_zookeeper_playbook,結構如下:
[root@iZ94jwkjg0sZ roles]# ls -l vpc_dubbox_admin_playbook
總用量 12
drwxr-xr-x 2 501 games 4096 8月17 17:52 files
drwxr-xr-x 2 501 games 4096 8月17 17:52 tasks
drwxr-xr-x 2 501 games 4096 8月17 14:20 templates
關於vpc_dubbox_zookeeper_playbook結構的說明如下:
·files
- 存放install_Jdk.sh、install_ZK.sh兩個檔案,這兩個檔案分別用來安裝JDK、部署ZooKeeper集群。
·tasks
o存放要執行的yml檔案install_zk.yml,檔案內容如下:
o---
o- name: add config
otemplate:
odest: /root/config
osrc: config.j2
omode: 0600
o
o- name: run install jdk
oscript: install_Jdk.sh
o
o- name: run install zookeeper
oscript: install_ZK.sh
·templates
o存放設定檔範本config.j2,檔案內容如下:
o#第一列變數名第二列變數值第三列設定項不同列之間用tab或者空白字元分開
o#jetty安裝路徑,當目錄已經存在的時候加上f參數會強制覆寫,否則會結束安裝
oJETTY_HOME {{jetty_home}} {{enforce}}
o#設定admin主控台root用戶的密碼
oDUBBO_ADMIN_ROOT_PASSWD {{dubbo_root}}
o#設定admin主控台guest用戶的密碼
oDUBBO_ADMIN_GUEST_PASSWD {{dubbo_guest}}
o#註冊中心串連位址字元字串
oREGISTRY_ADDRESS {{registry_address}}
o#ZooKeeper集群的IP位址
oZK_IPS_STR {{zk_ips_str}}
o設定檔config.j2中的參數值從vpc_dubbox_zk.yml檔案中追蹤,通過Ansible執行PlayBook的程序中會在每一台遠端主機的/root目錄下生成config檔案,提供給install_Jdk.sh、install_ZK.sh使用。關於vpc_dubbox_zk.yml檔案,後面會說明。
這兩個PlayBook構建好了以後,可上傳到阿裡雲OSS。在執行腳本的時候需要用到這兩個PlayBook,可以通過wget指令從阿裡雲OSS上下載,然後直接使用。
執行PlayBook
執行PlayBook,需要以下三個步驟:
- 生成Ansible可執行檔
- 下載PlayBook
- 執行PlayBook
生成Ansible可執行檔
我們需要通過Ansible執行vpc_dubbox_zk.yml檔案來執行我們構建好的兩個PlayBook。
vpc_dubbox_zk.yml檔案的生成,需要分兩步進行:
定義vpc_dubbox_zk.yml檔案範本的Python檔案為deploy_vpc_dubbox.py,檔案內容如下:
from string import Template
create_hosts_with_parameters = '''
- name: deploy dubbox service
hosts: $zookeeper
vars:
- jetty_home: $jetty_home
- enforce: $jetty_home_enforce
- dubbo_root: $dubbo_root_password
- dubbo_guest: $dubbo_guest_password
- registry_address: $registry_address
- zk_ips_str: $zk_ips_str
roles:
- $zookeeper_pb_name
- name: deploy dubbox service
hosts: $dubbo_admin
vars:
- jetty_home: $jetty_home
- enforce: $jetty_home_enforce
- dubbo_root: $dubbo_root_password
- dubbo_guest: $dubbo_guest_password
- registry_address: $registry_address
- zk_ips_str: $zk_ips_str
roles:
- $dubbo_admin_pb_name
'''
#define func to define redis playbook template
def create_playbook(**kwargs):
template = Template(create_hosts_with_parameters)
return template.substitute(kwargs)
生成vpc_dubbox_zk.yml檔案,方法如下:
# define func to create playbook init config
def create_pb_init(registry_address, zk_ips_str):
print('Start to edit playbook init config...')
with open(ansible_dir + pb_file_name, 'wb') as file_pb:
playbook = generate_playbook_template.create_playbook(dubbo_admin=host_dubbo_admin, zookeeper=host_zookeeper, jetty_home=jetty_home,
jetty_home_enforce=jetty_home_enforce, dubbo_root_password=dubbo_root_password, dubbo_guest_password=dubbo_guest_password,
registry_address=registry_address, zk_ips_str=zk_ips_str, dubbo_admin_pb_name=dubbo_admin_pb_name, zookeeper_pb_name=zookeeper_pb_name)
file_pb.write(playbook)
print('Editting pb_init is finished.')
生成的vpc_dubbox_zk.yml檔案的內容如下:
- name: deploy dubbox service
hosts: zookeeper
vars:
- jetty_home: /opt/jetty
- enforce: f
- dubbo_root: ***
- dubbo_guest: ***
- registry_address: 192.168.***.***:2181?backup=192.168.***.***:2181,192.168.***.***:2181
- zk_ips_str: 192.168.***.***,192.168.***.***,192.168.***.***
roles:
- vpc_dubbox_zookeeper_playbook
- name: deploy dubbox service
hosts: dubbo_admin
vars:
- jetty_home: /opt/jetty
- enforce: f
- dubbo_root: root
- dubbo_guest: guest
- registry_address: 192.168.***.***:2181?backup=192.168.***.***:2181,192.168.***.***:2181
- zk_ips_str: 192.168.***.***,192.168.***.***,192.168.***.***
roles:
- vpc_dubbox_admin_playbook
vpc_dubbox_zk.yml檔案中定義了一些參數,下面詳細介紹檔案中參數的作用:
·hosts
- 遠端主機群組名稱,和Inventory檔案中的遠端主機群組相對應。此檔案說明要已連結主機群組有兩個。
·vars
- 設定檔config中的參數,提供給install_Jdk.sh、install_Jetty.sh、deploy_Admin.sh、install_ZK.sh使用。
·roles
- 指定要執行的PlayBook名稱。此檔案說明要執行的PlayBook有兩個。
最終生成的vpc_dubbox_zk.yml檔案在目錄/etc/ansible/下。
下載PlayBook
前面的章節構建PlayBook中提出,構建好PlayBook後會傳到阿裡雲OSS上,然後通過wget指令下載到/etc/ansible/roles目錄下。下載PlayBook的方法如下:
def download_playbook():
for url in playbook_url:
file_name = url.split('/')[-1]
command_wget = 'wget -P ' + playbook_dir + ' ' + url
subprocess.call(command_wget, shell = True)
command_tar = 'tar zxf ' + playbook_dir + file_name + ' -C ' + playbook_dir
subprocess.call(command_tar, shell = True)
command_rm = 'rm -rf ' + playbook_dir + file_name
subprocess.call(command_rm, shell = True)
執行playbook
Ansible是通過ssh指令串連遠端主機,並執行playbook的。首次執行playbook前,由於本期Ansible主機並沒有記錄遠端主機的RSAKey,會彈出RSAKey的確認對話方塊,對話方塊內容如下:
OSX10111-0c4de9cb8aea:dubbox wujin.lhr$ ssh root@112.74.205.137
The authenticity of host '112.74.205.137 (112.74.205.137)' can't be established.
ECDSA key fingerprint is SHA256:bbDuVh6dQYDQo/X+Qzh52VGAxBFpGSqVG0jVNCB/9cE.
Are you sure you want to continue connecting (yes/no)?
因為整個程序不用人為的參與,所以可通過Python腳本自動實現上述確認的程序:
# define func to confirm ssh login before execute ansible
def confirm_ssh_login(all_ips):
print('Start to confirm ssh login to all nodes...')
if len(all_ips) == 0:
print('Host_ips is empty')
return
for ip in all_ips:
child = pexpect.spawn('ssh root@' + ip)
ret_1 = child.expect(['Are you sure you want *', 'Password*', 'root@*', pexpect.EOF])
if 0 == ret_1:
child.sendline('yes')
ret_2 = child.expect(['Password*', 'root@*', pexpect.EOF])
if 0 == ret_2 or 1 == ret_2:
print('Confirm ' + ip + ' ok!')
child.sendintr()
continue
else:
print('Confirm ' + ip + ' failed!')
elif 1 == ret_1 or 2 == ret_1:
print('Confirm ' + ip + ' ok!')
child.sendintr()
else:
print('Confirm ' + ip + ' failed!')
print('Confirm ssh login finished!')
由於用到了pexpect這個模組,在執行腳本前,需要使用pip安裝pexpect模組:
pip install pexpect
VPC網路環境下未給ECS配置公網IP,導致每台ECS無法下載安裝包,但是在安裝JDK、Jetty以及部署DubboxAdmin和Zookeeper集群的時候需要這些安裝包。因為Ansible主機配有公網IP,所以可以將安裝包先下載到Ansible主機,又因為Ansible主機和每台ECS在同一個VSwitch下面,可以通過scp指令將安裝包從Ansible主機傳到每台ECS上。具體動作程序如下:
- 首先將JDK、Jetty、Dubbox Admin以及ZooKeeper安裝包上傳至阿裡雲OSS,追蹤安裝包的下載位址。
2.在Python檔案中填入安裝包的下載位址,執行Python腳本,下載安裝包至Ansible主機。方法如下:
3.def wget_files():
4.if not os.path.exists(wget_file_path):
5.os.makedirs(wget_file_path)
6.subprocess.call('wget -P ' + wget_file_path + ' ' + jdk_path, shell = True)
7.subprocess.call('wget -P ' + wget_file_path + ' ' + jetty_path, shell = True)
8.subprocess.call('wget -P ' + wget_file_path + ' ' + dubbo_admin_path, shell = True)
9.subprocess.call('wget -P ' + wget_file_path + ' ' + zookeeper_path, shell = True)
10.通過scp指令將安裝包拷貝到每台ECS。方法如下:
11.def scp_files_from_ansible_host_to_ecs_zk(host_ips, zk_ips):
12.scp_password_info = 'root@%s\'s password:'
13.scp_command_ecs = 'scp ' + wget_file_path + 'dubbo-admin-2.8.4.war ' + wget_file_path + 'jdk-8u101-linux-x64.rpm ' + wget_file_path + 'jetty-distribution-8.1.19.v20160209.tar.gz root@%s:/root'
14.scp_command_zk = 'scp ' + wget_file_path + 'jdk-8u101-linux-x64.rpm ' + wget_file_path + 'zookeeper-3.4.6.tar.gz root@%s:/root'
15.if host_ips is None or len(host_ips) == 0:
16.print 'Host ips is None,exit!'
17.return None
18.if zk_ips is None or len(zk_ips) == 0:
19.print 'ZK ips is None,exit!'
20.return None
21.for ip in host_ips:
22.scp = pexpect.spawn(scp_command_ecs % ip)
23.i = scp.expect([scp_password_info % ip, pexpect.EOF])
24.if i == 0:
25.scp.sendline(ecs_password)
26.scp.expect(pexpect.EOF, timeout=None)
27.else:
28.print 'Scp files to' + ip + 'failed!'
29.for ip in zk_ips:
30.scp = pexpect.spawn(scp_command_zk % ip)
31.i = scp.expect([scp_password_info % ip, pexpect.EOF])
32.if i == 0:
33.scp.sendline(ecs_password)
34.scp.expect(pexpect.EOF, timeout=None)
35.else:
36.print 'Scp files to' + ip + 'failed!'
37.通過Ansible,執行PlayBook。方法如下:
38.subprocess.call('ansible-playbook ' + pb_file_dir + '/' + pb_file_name, shell=True)
執行Ansible以後會進行Dubbox服務的部署程序。
部署Dubbox服務
Dubbox服務的部署,需要以下兩個步驟:
- 搭建ZooKeeper集群
- 搭建Dubbox主控台集群
搭建ZooKeeper集群
ZooKeeper集群主要用來作為Dubbox服務的註冊中心。
搭建ZooKeeper集群,需要以下兩個步驟:
安裝JDK
因為ZooKeeper的執行需要Java環境,所以需要先安裝JDK。安裝JDK的腳本為install_Jdk.sh,檔案內容如下:
#!/bin/bash
#日誌時間格式
DATE="date +'%Y-%m-%d %H:%M:%S'"
#檢查java環境是否存在
if which java 2>/dev/null; then
echo $(eval $DATE) " java already exits" >> ~/install_dubbox.log
else
#wget jdk安裝包
#wget http://dubbo.oss-cn-shenzhen.aliyuncs.com/jdk-8u101-linux-x64.rpm
#echo $(eval $DATE) " wget jdk success" >> ~/install_dubbox.log
rpm -ivh jdk-8u101-linux-x64.rpm
rm -rf jdk-8u101-linux-x64.rpm
fi
#檢查java環境是否安裝成功
if which java 2>/dev/null; then
echo $(eval $DATE) " install jdk8 success" >> ~/install_dubbox.log
else
echo $(eval $DATE) " install jdk8 failed" >> ~/install_dubbox.log
安裝JDK程序中,首先需要檢查本期ECS是否存在Java環境,存在就跳過安裝程序,反之則安裝。
宣告:JDK安裝包請從Oracle官網下載,並下載本文指定的JDK組建(jdk-8u101-linux-x64.rpm)。從本文連結中下載JDK帶來的任何法律問題,和本文作者無關。
搭建ZooKeeper集群
搭建ZooKeeper集群的腳本為install_ZK.sh,內容如下:
#!/bin/sh
#日誌時間格式
DATE="date +'%Y-%m-%d %H:%M:%S'"
#download zk
#wget 'http://dubbo.oss-cn-shenzhen.aliyuncs.com/zookeeper-3.4.6.tar.gz'
#解壓zk到/opt目錄
tar -zxvf zookeeper-3.4.6.tar.gz -C /opt
#設定軟連結
ln -s /opt/zookeeper-3.4.6 /opt/zookeeper
#複製zoo.cfg檔案
cp /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg
#移除壓縮包
rm -rf zookeeper-3.4.6.tar.gz
#讀取設定檔內容,給變數賦初值
while read line
do
#遮罩掉註釋行
if [ ! "`echo $line|grep '#'`" ]; then
varname=`echo $line|awk '{print $1}'`
varvalue=`echo $line|awk '{print $2}'`
varconfig=`echo $line|awk '{print $3}'`
eval $varname=$varvalue
eval $varname"_CONFIG"=$varconfig
fi
done < ~/config
mkdir -p '/opt/zookeeper/data'
#修改設定檔
sed -i -e 's/^dataDir=.*/dataDir=\/opt\/zookeeper\/data/' /opt/zookeeper/conf/zoo.cfg
ZK_IPS_STR=${ZK_IPS_STR//,/ }
init_id=1
#追蹤本機ip
SELF_IP=`ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"`
for ip in $ZK_IPS_STR
do
echo "server.$init_id=$ip:2888:3888" >> /opt/zookeeper/conf/zoo.cfg
#建立myid檔案,標識本機id號
if [[ $SELF_IP == *$ip* ]]; then
echo $init_id >"/opt/zookeeper/data/myid"
fi
init_id=$((init_id+1))
done
#啟動zk
nohup /opt/zookeeper/bin/zkServer.sh start &
sleep 10
#centos 7關閉防火牆
systemctl stop firewalld.service
#查看本期是否存在zookeeper流程
ZK_ID=`ps -ef |grep zookeeper |grep -v grep |awk '{print $2}'`
if [ ! "$ZK_ID" ]; then
echo $(eval $DATE) " start zookeeper failed" >> ~/install_dubbox.error.log
else
echo $(eval $DATE) " start zookeeper success" >> ~/install_dubbox.log
fi
#移除設定檔
rm -rf ~/config
這個腳本的主要功能是安裝ZooKeeper,並通過修改ZooKeeper設定檔conf/zoo.cfg來設定ZooKeeper集群。修改後的設定檔內容如下:
tickTime=2000
dataDir=/opt/zookeeper/data
clientPort=2181
initLimit=5
syncLimit=2
server.1=slave-01:2888:3888
server.2=slave-02:2888:3888
server.3=slave-03:2888:3888
上述檔案,設定了三台機器的ZooKeeper集群。在dataDir目錄下,建立一個myid檔案,裡面內容為一個數位,用來標識本期主機號。
其他關於ZooKeeper集群設定的知識,可參考RunningReplicated ZooKeeper。
搭建Dubbox主控台集群
由於Dubbox主控台需要執行在Jetty容器上,Jetty容器的執行又需要有Java環境,因此部署Dubbox主控台之前,需要先安裝JDK和Jetty。
搭建Dubbox主控台集群,需要以下三個步驟:
- 安裝JDK
- 安裝Jetty
- 部署Dubbox主控台
安裝JDK
安裝JDK的檔案為install_Jdk.sh,和上述程序安裝JDK相同,此處不再重複。
安裝Jetty
安裝Jetty的檔案為install_Jetty.sh,內容如下:
#!/bin/bash
#jetty預設安裝目錄
JETTY_HOME_DEFAULT="/opt/jetty"
#日誌時間格式
DATE="date +'%Y-%m-%d %H:%M:%S'"
#安裝jetty
#wget http://dubbo.oss-cn-shenzhen.aliyuncs.com/jetty-distribution-8.1.19.v20160209.tar.gz
#echo $(eval $DATE) " wget jetty success" >> ~/install_dubbox.log
#解壓
tar zxf jetty-distribution-8.1.19.v20160209.tar.gz
echo $(eval $DATE) " tar zxf jetty success" >> ~/install_dubbox.log
#移除壓縮包
rm -f jetty-distribution-8.1.19.v20160209.tar.gz
echo $(eval $DATE) " rm jetty.tgz success" >> ~/install_dubbox.log
#讀取設定檔內容,給變數賦初值
while read line
do
#遮罩掉註釋行
if [ ! "`echo $line|grep '#'`" ]; then
varname=`echo $line|awk '{print $1}'`
varvalue=`echo $line|awk '{print $2}'`
varconfig=`echo $line|awk '{print $3}'`
eval $varname=$varvalue
eval $varname"_CONFIG"=$varconfig
fi
done < ~/config
#JETTY_HOME未設定,選擇預設設定JETTY_HOME_DEFAULT
if [ ! -n "$JETTY_HOME" ]; then
JETTY_HOME=$JETTY_HOME_DEFAULT
rm -rf $JETTY_HOME
mkdir -p $JETTY_HOME
echo $(eval $DATE) " JETTY_HOME採用預設設定 $JETTY_HOME" >> ~/install_dubbox.log
#如果目錄不存在,建立目錄
elif [ ! -d "$JETTY_HOME" ]; then
mkdir -p $JETTY_HOME
echo $(eval $DATE) "建立JETTY_HOME新目錄 $JETTY_HOME" >> ~/install_dubbox.log
#如果目錄已經存在,並且設定了強制執行,則覆寫目錄
elif [ "$JETTY_HOME_CONFIG" = "f" ]; then
rm -rf $JETTY_HOME
mkdir -p $JETTY_HOME
echo $(eval $DATE) "強制覆寫已存在的JETTY_HOME $JETTY_HOME" >> ~/install_dubbox.log
#如果目錄已經存在,並且沒有設定強制執行,結束程式
else
echo $(eval $DATE) " $JETTY_HOME已經存在,未選擇強制覆寫,請重新設定JETTY_HOME或在設定檔中配
置強制執行選項:f" >> ~/install_dubbox.log
#結束程式
exit
echo $(eval $DATE) "程式結束" >> ~/install_dubbox.log
fi
#移動jetty到JETTY_HOME
mv jetty-distribution-8.1.19.v20160209<param-value>false<\/param-value>/" webdefault.xml
echo $(eval $DATE) " set dirAllowed to false success" >> ~/install_dubbox.log
#查看jetty服務是否開啟,即系統已經安裝了jetty並已經開啟
JETTY_PROCESS_ID=`ps -fe|grep jetty |grep -v grep |awk '{print $2}'`
#未開啟jetty服務
if [ ! "$JETTY_PROCESS_ID" ]; then
$JETTY_HOME/bin/jetty.sh start
echo $(eval $DATE) " start jetty" >> ~/install_dubbox.log
else
kill -9 $JETTY_PROCESS_ID
echo $(eval $DATE) " stop jetty" >> ~/install_dubbox.log
$JETTY_HOME/bin/jetty.sh start
echo $(eval $DATE) " start jetty" >> ~/install_dubbox.log
fi
#查看jetty服務是否開啟
JETTY_PROCESS_ID=`ps -fe|grep jetty |grep -v grep |awk '{print $2}'`
if [ ! "$JETTY_PROCESS_ID" ]; then
echo $(eval $DATE) " install jetty failed" >> ~/install_dubbox.error.log
else
echo $(eval $DATE) " install jetty success" >> ~/install_dubbox.log
kill -9 $JETTY_PROCESS_ID
echo $(eval $DATE) " stop jetty" >> ~/install_dubbox.log
fi
安裝Jetty程序,主要包括:讀取設定檔,設定Jetty安裝目錄,修改Jetty的設定檔etc/webdefault.xml。Jetty安裝目錄的選擇包括以下三種情形:
- 未指定Jetty安裝目錄,則選擇預設目錄進行安裝
- 指定了Jetty安裝目錄但是目錄不存在,則建立目錄並安裝Jetty
- 指定了Jetty安裝目錄並且目錄已經存在
- 如果設定了強制執行選項,則覆寫目錄並安裝Jetty
- 如果沒有設定強制執行選項,程式強制結束
部署Dubbox主控台
部署Dubbox服務的檔案為deploy_Admin.sh,內容如下:
#!/bin/sh
#預設jetty安裝目錄
JETTY_HOME_DEFAULT="/opt/jetty"
#預設root使用者密碼
DUBBO_ADMIN_ROOT_PASSWD_DEFAULT=root
#預設guest使用者密碼
DUBBO_ADMIN_GUEST_PASSWD_DEFAULT=guest
#日誌時間格式
DATE="date +'%m-%d-%Y %H:%M:%S'"
#讀取設定檔內容,給變數賦初值
while read line
do
#遮罩掉註釋行
if [ ! "`echo $line|grep '#'`" ]; then
varname=`echo $line|awk '{print $1}'`
varvalue=`echo $line|awk '{print $2}'`
varconfig=`echo $line|awk '{print $3}'`
eval $varname=$varvalue
eval $varname"_CONFIG"=$varconfig
fi
done < ~/config
#JETTY_HOME未設定,選擇預設設定JETTY_HOME_DEFAULT
if [ ! -n "$JETTY_HOME" ]; then
JETTY_HOME=$JETTY_HOME_DEFAULT
#如果目錄已經存在,並且沒有要求強制覆寫
elif [ -d "$JETTY_HOME" ]; then
if [ "$JETTY_HOME_CONFIG" != "f" ]; then
echo $(eval $DATE) " $JETTY_HOME已經存在,未選擇強制覆寫,請重新設定JETTY_HOME或在設定檔中設定強制執行選項:f" >> ~/install_dubbox.log
#結束程式
echo $(eval $DATE) "程式結束" >> ~/install_dubbox.log
exit
fi
fi
#檢測admin root使用者密碼是否設定
if [ ! $DUBBO_ADMIN_ROOT_PASSWD ]; then
echo $(eval $DATE) "未設定admin root用戶的密碼,採用預設密碼 $DUBBO_ADMIN_ROOT_PASSWD_DEFAULT" >> ~/install_dubbox.log
DUBBO_ADMIN_ROOT_PASSWD=$DUBBO_ADMIN_ROOT_PASSWD_DEFAULT
fi
#檢測admin guest使用者密碼是否設定
if [ ! $DUBBO_ADMIN_GUEST_PASSWD ]; then
echo $(eval $DATE) "未設定admin guest用戶的密碼,採用預設密碼 $DUBBO_ADMIN_GUEST_PASSWD_DEFAULT" >> ~/install_dubbox.log
DUBBO_ADMIN_GUEST_PASSWD=$DUBBO_ADMIN_GUEST_PASSWD_DEFAULT
fi
#從oss上下載dubbo-admin的war包
#wget http://dubbo.oss-cn-shenzhen.aliyuncs.com/dubbo-admin-2.8.4.war
#echo $(eval $DATE) " wget dubbo-admin success" >> ~/install_dubbox.log
#將war包部署到jetty上
mv dubbo-admin-2.8.4.war $JETTY_HOME/webapps/dubbo-admin.war
echo $(eval $DATE) " mv dubbo-admin.war to webapps" >> ~/install_dubbox.log
#修改設定檔
mkdir $JETTY_HOME/webapps/dubbo-admin
cd $JETTY_HOME/webapps/dubbo-admin
jar xf ../dubbo-admin.war
cd $JETTY_HOME/webapps/dubbo-admin/WEB-INF
#設定admin註冊監聽檔案
sed -i -e "s/^dubbo.registry.address.*/dubbo.registry.address=zookeeper:\/\/$REGISTRY_ADDRESS/" dubbo.properties
echo $(eval $DATE) " set registry to redis" >> ~/install_dubbox.log
#設定root使用者密碼
sed -i -e "s/^dubbo.admin.root.password.*/dubbo.admin.root.password=$DUBBO_ADMIN_ROOT_PASSWD/" dubbo.properties
echo $(eval $DATE) " set user root passwd" >> ~/install_dubbox.log
#設定guest使用者密碼
sed -i -e "s/^dubbo.admin.guest.password.*/dubbo.admin.guest.password=$DUBBO_ADMIN_GUEST_PASSWD/" dubbo.properties
echo $(eval $DATE) " set user guest passwd" >> ~/install_dubbox.log
cd $JETTY_HOME/webapps/dubbo-admin
jar cf dubbo-admin.war *
mv dubbo-admin.war $JETTY_HOME/webapps/
rm -rf $JETTY_HOME/webapps/dubbo-admin
#啟動jetty
nohup $JETTY_HOME/bin/jetty.sh start &
echo $(eval $DATE) " start jetty" >> ~/install_dubbox.log
#關閉centos7的防火牆
systemctl stop firewalld.service
sleep 30
CODE=`curl -I -m 10 -o /dev/null -s -w %{http_code}-u root:$DUBBO_ADMIN_ROOT_PASSWD http://localhost:8080/dubbo-admin/`
echo $(eval $DATE) " return http status code: $CODE" >> ~/install_dubbox.log
if [ $CODE = 200 ]; then
echo $(eval $DATE) " admin主控台啟動成功" >> ~/install_dubbox.log
else
echo $(eval $DATE) " admin主控台啟動失敗" >> ~/install_dubbox.error.log
fi
rm -rf ~/config
部署Dubbox服務主控台的程序,主要包括:先將Dubbox服務部署到Jetty上,然後修改dubbo.properties檔案的方式來設定Dubbox服務註冊中心為ZooKeeper集群的方式,並設定Dubbox服務主控台的登入密碼。Dubbox服務註冊中心的選擇,可參考Dubbo使用者指南。
在部署Dubbox服務的程序中,有幾個需要注意的問題:
1.當存取Dubbox服務時,需要存取伺服器的8080埠,由於防火牆的原因,外部可能無法存取到伺服器的Dubbox服務,因此需要修改防火牆的設定。本文所採用的ECS系統為Centos7,簡單起見,我直接關閉了系統的防火牆。關閉防火牆的方法如下:
2.systemctl stop firewalld.service
這裡不建議採用直接關閉防火牆的方式。
2. 通過Ansible控制遠端伺服器組啟動Jetty服務時,Ansible指令執行結束以後,Jetty服務也自動結束,這是我們不想看到的結果。可通過nohup指令以守護流程的方式啟動Jetty服務,可以解決Jetty服務自動結束的問題,啟動Jetty指令如下:
nohup $JETTY_HOME/bin/jetty.sh start &
Dubbox服務部署好了以後,可通過以下位址存取Dubbox服務主控台:
http://ip:8080/dubbo-admin
注意:在VPC網路下,ip指的是SLB的公網IP。
Dubbox服務部署好以後,可通過以下動作登入主控台:
輸入使用者名稱密碼,點選登入:
登入進去以後的Dubbox主控台介面如下:
現在,我們可以使用Dubbox服務了。
總結
本章將從以下兩個方面進行總結:
- Dubbox服務系統結構圖
- 如何快速構建高可用Dubbox服務
Dubbox服務系統結構圖
最終,採用ZooKeeper集群作為註冊中心,基於資源編排快速部署出來的高可用Dubbox服務的系統結構圖,如下圖所示:
Dubbox服務的高可用,主要體現在兩個方面:
·註冊中心的高可用
- 註冊中心採用了ZooKeeper集群的方式,ZooKeeper集群中只要有超過半數的服務可用,Dubbox服務的註冊中心就可以正常工作。
·Dubbox服務主控台的高可用
- 建立兩台ECS實例並分別部署Dubbox主控台服務,這兩台ECS掛載到一個SLB上,我們可通過SLB來存取Dubbox主控台服務。
注意:生產環境中應該將SLB放在VPC網路環境內,本文中為了測試方便,把SLB放在VPC網路環境外。若需要修改SLB的網路環境,只需修改ROS資源範本。
如何快速構建高可用Dubbox服務
前面章節標題的部署程序看起來可能比較繁瑣,本文的核心是快速部署,因此你可以根據下面的指導,快速部署屬於你的高可用Dubbox服務。四個步驟快速部署高可用Dubbox服務:
- 準備Ansible主機
- 下載源碼
- 修改設定檔
- 執行main函數
準備Ansible主機
這個程序和前面章節的準備Ansible主機相同,這裡不再重複。
下載源碼
可從本文的周邊中下載源碼,然後將vpc_python檔案拷貝到Ansible主機。
修改設定檔
修改vpc_python/config.py檔案,檔案內容如下:
#define stack name
stack_name = 'vpc_dubbox_zookeeper'
# define stack creation timeout(minutes)
create_timeout = 60
#vpc parameter
vpc_id = '******'
vswitch_id = '******'
#zookeeper cluster size
zk_size = 3
#ecsgroup parameters
ecs_password = '******'
instance_type ='ecs.s2.large'
#ros ak id
ak_id = '******'
#ros ak secret
ak_secret = '******'
#ros region id
region_id = 'cn-shenzhen'
#zone id
zone_id = 'cn-shenzhen-a'
#set jetty path
jetty_home = '/opt/jetty'
#if jetty_home exists, choose f to overlap
jetty_home_enforce = 'f'
#dubbo admin root password
dubbo_root_password = '******'
#dubbo admin guest password
dubbo_guest_password = '******'
下面詳細講解設定檔中一些參數所代表的意義:
·vpc_id
·vswitch_id
·zk_size
- ZooKeeper集群的大小,ZooKeeper集群的大小必須為奇數,且必須大於1
·ecs_password
- 申請的ECS伺服器的登入密碼,使用者名稱預設為root
·ak_id
·ak_secret
·region_id
·jetty_home
·jetty_home_enforce
- 是否強制安裝jetty,f代表強制安裝,其它代表非強制
·dubbo_root_password
·dubbo_guest_password
使用者可根據自己的需求變更設定檔。
執行main函數
執行vpc_python/main.py。函數執行完以後,高可用Dubbox服務就部署好了。
相關產品:
- 資源編排ROS
- 專有網路VPC
- 專有雲解決方案
- 雲端服務器ECS