说明

上一次我们简单介绍到有关Neo4j集群通过CloudFormation的部署,有兴趣的同学可详见Neo4j Enterprise生产集群部署

但是上面方式的部署也暴露出以下几个主要问题:

  • (1)网段使用的是“10.0.0.0/16”,这个网段不一定符合我们网络同学规划的网段;
  • (2)各节点分布在大的VPC(即10.0.0.0/16)网段下的子网段,如:10.0.1.0/24、10.0.2.0/24、10.0.3.0/24,当然这样做完全符合高可用的要求的,但对于网段数量比较拮据时,我们期望是neo4j各节点在同一子网段,如:10.0.0.1/24、10.0.0.2/24、10.0.0.3/24;
  • (3)各节点分布在不同的可用区,如eu-west-1a、eu-west-1b、eu-west-1c,当然这样做完全符合高可用的要求的,我们如想各节点分布在同一可用区,如eu-west-1a;

基于上面提出的问题,我们将对默认模板进行定制开发,设计出符合我们期望的模板,用来部署我们定制的 Neo4j 集群。

获取默认模板

参考Neo4j Enterprise生产集群部署文章中创建堆栈,获取"Amazon S3 URL",如下:

定制你的Neo4j生产集群部署

直接使用红框中链接即可下载默认模板。

定制模板

在设计我们的模板前,我们先理清需求,根据具体业务需求,添加或更改默认模板中相关模块。需求如下:

  • (1)大VPC网段使用"10.180.32.0/19",子网段使用"10.180.32.0/24";
  • (2)各节点分布在子网段"10.180.32.0/24"下即使用同一网段;
  • (3)各节点分布在同一可用区下,如"ap-southeast-1a";

上面的需求点我们已经了解,下面我们来定制开发我们的模板吧。在开发模板前,我们有必要了解下AWS CloudFormation

指定可用区

在模板中Parameters下添加如下:

"AvailabilityQu": {
            "Type": "String",
            "Description": "Availability Zone into which instance will launch",
            "Default": "ap-southeast-1a"
        },

上面我们定义了一个"可用区"的参数,类型是字符串,默认值是"ap-southeast-1a"。下面我们在模板中引用该参数。

指定VPC网段

在模板Resources下更新如下内容:

"VPC": {
      "Type": "AWS::EC2::VPC",
      "Properties": {
        "EnableDnsSupport": "true",
        "EnableDnsHostnames": "true",
        "InstanceTenancy": "default",
        "CidrBlock": "10.180.32.0/19",
        "Tags": [
          {
            "Key": "Name",
            "Value": {
              "Fn::Join": [
                "-",
                [
                  "Neo4jVPC",
                  {
                    "Ref": "AWS::StackName"
                  }
                ]
              ]
            }
          },
          {
            "Key": "Application",
            "Value": {
              "Ref": "AWS::StackId"
            }
          }
        ]
      }
    },

上面定义"CidrBlock": "10.180.32.0/19",即告诉模板新创建VPC网段"10.180.32.0/19"。

这里提一下,最好不要使用已存在VPC网段,因为一旦"AWS CloudFormation"部署出错或成功后删除堆栈,将无法正常删除VPC部分,因当前VPC还在被其他资源使用中,无法删除的。如下:

定制你的Neo4j生产集群部署

指定子网

在模板Resources下更新如下内容:

"Subnet0": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "AvailabilityZone": {
          "Ref": "AvailabilityQu"
        },
        "VpcId": {
          "Ref": "VPC"
        },
        "CidrBlock": "10.180.32.1/24",
        "Tags": [
          {
            "Key": "Name",
            "Value": {
              "Fn::Join": [
                "-",
                [
                  "Neo4jSubnet0",
                  {
                    "Ref": "AWS::StackName"
                  }
                ]
              ]
            }
          },
          {
            "Key": "Application",
            "Value": {
              "Ref": "AWS::StackId"
            }
          }
        ],
        "MapPublicIpOnLaunch": "true"
      }
    },

上面的内容较多,我们重点看下如下:

"AvailabilityZone": {
  "Ref": "AvailabilityQu"
},

使用 Ref 内部函数来引用某个参数,AWS CloudFormation 使用该参数的值来预置堆栈。"Subnet0"下"CidrBlock": "10.180.32.1/24",即是我们定义的子网段。

各节点分布同一子网段

删除默认模板中"subnet1"和"subnet2"子网段的定义,并将节点、路由及网关等信息变量均修改为"subnet0",举例如下:

"SubnetRouteTableAssociation0": {
      "Type": "AWS::EC2::SubnetRouteTableAssociation",
      "Properties": {
        "SubnetId": {
          "Ref": "Subnet0"
        },
        "RouteTableId": {
          "Ref": "RouteTable"
        }
      }
    },
    "SubnetNetworkAclAssociation0": {
      "Type": "AWS::EC2::SubnetNetworkAclAssociation",
      "Properties": {
        "SubnetId": {
          "Ref": "Subnet0"
        },
        "NetworkAclId": {
          "Ref": "NetworkAcl"
        }
      }
    },

这里涉及到的修改内容较多,文章后面我会共享一份我已修改的temptele,方便大家理解和参考。

分享Temptele

使用阿里云云盘blog-test.json