关于 五月, 2015 的文章

在AWS上构建企业级VPC私有网络[原创][图示]

参考资料:
http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Scenario2.html

背景介绍:
目前,公有云越来越普及,基本上绝大部分的初创型企业都会在企业发展初期,采用公有云上的虚拟机作为服务器来开展业务。
而在公有云厂商中,AWS基本上算是一枝独秀,无论是在功能,还是可靠性,可扩展性,以及全球布局等诸多方面。

本文主要对AWS上的VPC私有网络的创建与配置进行讲解,并对Web UI上的各个步骤进行了截图,更加形象,也方便大家的理解。

VPC,顾名思义Virtual Private Cloud,即虚拟私有云。
很多企业或项目在发展初期选择了公有云,但基本上无一例外全都选择了最简单的方式来创建虚拟机,即每台虚拟机都有一个公网IP地址,以及私网IP地址。其中,私网IP地址不可变更,所在的私网IP段不可选择,如果对服务器进行了Stop操作,再次Start之后,私网IP会随机变更;而公网IP地址,则可以绑定一个IP地址来将其固定。

在这样的一个架构当中,如果服务器数量不多,对安全性,可扩展性,高可用性等各个方面没有什么要求的话,也是能满足需要的。

但是,当服务器数量较多时,也就是说,当企业发展到中期的时候,VPC的重要性就越来越体现出来了,其中,最显著的几个方面为:
1. 在安全方面,通过构建一个VPC网络,能够将几乎所有的服务器都部署在一个私有网络中,每台服务器都只有一个私网IP,不需要直接面对公网;而直接面对公网的,则主要是负载均衡与VPN;在这样的一个网络架构中,我们也可以很容易的限制所有服务器的访问入口权限,那就是,每一个需要访问服务器的用户,都需要首先登陆VPN服务器,然后再通过内网IP与内网DNS域名解析服务来访问所有的服务器;
2. 在高可用,可扩展性方面,可以直接部署LVS/Nginx/HAProxy作为负载均衡服务器,部署Keepalived实现双机热备;
3. 在网络方面,可以创建不同的子网,设置不同的路由,灵活的根据业务来对服务器的网络进行分组;可以与本地IDC机房的私有网络通过VPN互联,即实现所谓的混合云;

架构图示:
vpc_100

配置步骤
1. 在VPC Dashboard当中,选择Your VPCs,点击Create VPC,创建一个VPC;
vpc_101

2. 点击Actions,启用ClassicLink
vpc_104

3. 点击Actions,启用DNS hostnames
vpc_105
vpc_106

4. 新建的VPC属性页如下所示:
vpc_107

5. 选择Subnets,点击Create Subnet,创建一个Public Subnet;
vpc_102

6. 再创建一个Private Subnet;
vpc_103

7. 选择Route Tables,将默认的Main路由表命名为private_local_nat,并将这个路由表绑定到Private Subnet上;
vpc_108

8. 选择Route Tables,点击Create Route Table,创建一个新的路由表public_local_igw,并将这个路由表绑定到Public Subnet上;
vpc_109
vpc_110

9. 设置完成后的Route Tables页面如下所示:
vpc_111

10. 选择Internet Gateways,点击Create Internet Gateway创建一个互联网网关,作为Public Subnet的公网出口;
vpc_112
vpc_113

11. 选择DHCP Options Sets,命名默认的DHCP Options Set为default_dhcp;
vpc_114

12. 选择Route Tables,点击public_local_igw,增加一条路由,设置新增的Internet Gateway为Public Subnet的默认公网出口网关;
vpc_115

13. 接下来,为了使所有位于Private Subnet内的Instance也能够访问互联网,我们需要创建一个位于Public Subnet内的Instance,并将其配置为可通过iptables进行NAT共享上网,然后将其添加到private_local_nat路由表中,作为Private Subnet的默认公网出口网关;
13.1 创建Gateway Instance;
vpc_116
vpc_117
vpc_118
vpc_119
vpc_120
vpc_121

13.2 为Gateway Instance分配一个固定的公网IP;
vpc_122

13.3 登录Gateway Instance,将其设置为可通过iptables共享上网的网关服务器;
[dong@Dong-MacBookPro sshkeys]$ chmod 400 drawbridge-tokyo-keypair.pem
[dong@Dong-MacBookPro sshkeys]$ ssh -i drawbridge-tokyo-keypair.pem root@52.68.53.85
[root@ip-172-18-4-11 ~]# setenforce 0
[root@ip-172-18-4-11 ~]# vi /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

[root@ip-172-18-4-11 ~]# vi /etc/sysctl.conf

# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled.  See sysctl(8) and
# sysctl.conf(5) for more details.

# Controls IP packet forwarding
net.ipv4.ip_forward = 1

# Controls source route verification
net.ipv4.conf.default.rp_filter = 1

# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0

# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0

# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1

# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 1

# Disable netfilter on bridges.
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

# Controls the default maxmimum size of a mesage queue
kernel.msgmnb = 65536

# Controls the maximum size of a message, in bytes
kernel.msgmax = 65536

# Controls the maximum shared segment size, in bytes
kernel.shmmax = 68719476736

# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296

[root@ip-172-18-4-11 ~]# sysctl -p

net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296

[root@ip-172-18-4-11 ~]# vi /etc/sysconfig/iptables

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -s 172.18.0.0/16 -o eth0 -j MASQUERADE
COMMIT

[root@ip-172-18-4-11 ~]# /etc/init.d/iptables restart

iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]
iptables: Applying firewall rules:                         [  OK  ]

[root@ip-172-18-4-11 ~]# chkconfig iptables on

13.4 修改Gateway Instance的Network属性,禁用Source/Dest. Check;
vpc_123
vpc_124

13.5 选择Route Tables,点击private_local_nat,增加一条路由,设置新增的Gateway Instance为Private Subnet的默认公网出口网关;
vpc_125

14. 至此,在AWS上创建一个企业级的VPC的过程就基本完成了,该VPC默认包括了两个Subnet,其中Public Subnet中的Instance可以直接绑定公网IP,并与Private Subnet中的Instance通过私网IP进行通信;而位于Private Subnet中的Instance不能绑定公网IP,但是可以通过Gateway Instance访问互联网,同时与Public Subnet中的Instance进行通信;

那么,在这样的一个网络中,我们完全可以将负载均衡服务器部署在Public Subnet中,然后将这些服务器绑定专门的Security Group,开放指定的端口并将请求调度到位于Private Subnet中的Instance;可以创建一个DNS服务器,为所有的Instance创建私有域名;可以创建一个VPN服务器,给登录到该VPN服务器的客户端分配一个私网IP,并修改默认DNS为自建的DNS,方便直接通过私有域名来访问Instance;可以通过keepalived来实现基于VIP的各种服务的高可用等等,几乎所有我们在本地IDC中能做的,在这里都可以实现。

不过,需要提到的是,通过VPN将VPC与本地IDC网络互联,这部分需要通过VPC的Virtual Private Gateways和Route Tables来实现;配置方式上根据具体情况的不同而有较大的差异,这部分内容,后面我会再整理然后单独介绍。

, ,

3 Comments

Hadoop运维笔记 之 CDH5.0.0升级到CDH5.3.0

参考资料:
Hadoop: http://www.cloudera.com/content/cloudera/en/documentation/core/v5-3-x/topics/cdh_ig_earlier_cdh5_upgrade.html?scroll=topic_8
Oozie: http://www.cloudera.com/content/cloudera/en/documentation/core/v5-3-x/topics/cdh_ig_oozie_upgrade.html
Hive: http://www.cloudera.com/content/cloudera/en/documentation/core/v5-3-x/topics/cdh_ig_hive_upgrade.html
Pig: http://www.cloudera.com/content/cloudera/en/documentation/core/v5-3-x/topics/cdh_ig_pig_upgrade.html

1. 在所有Hadoop服务器上停止Monit(我们线上使用了Monit来监听进程)
登录idc2-admin1(我们线上使用了idc2-admin1作为管理机以及Yum repo服务器)
# mkdir /root/cdh530_upgrade_from_500
# cd /root/cdh530_upgrade_from_500
# pssh -i -h idc2-hnn-rm-hive 'service monit stop'
# pssh -i -h idc2-hmr.active 'service monit stop'

2. 确认本地的CDH5.3.0的Yum repo服务器已经就绪
http://idc2-admin1/repo/cdh/5.3.0/
http://idc2-admin1/repo/cloudera-gplextras5.3.0/

3. 在Ansible中更新相应的repo模板(我们线上使用了Ansible作为配置管理工具)

{% if "idc2" in group_names %}

...

{% if "cdh5-all" in group_names %}
[heylinux.el6.cloudera-cdh5.3.0]
name= el6 yum cloudera cdh5.3.0
baseurl=http://idc2-admin1/repo/cdh/5.3.0
enabled=1
gpgcheck=0

[heylinux.el6.cloudera-gplextras5.3.0]
name= el6 yum cloudera gplextras5.3.0
baseurl=http://idc2-admin1/repo/cloudera-gplextras5.3.0
enabled=1
gpgcheck=0
{% else %}

...

{% endif %}

4. 更新所有Hadoop服务器的repo文件(/etc/yum.repos.d/heylinux.repo)
# ansible-playbook --private-key /path/to/key_root -u root --vault-password-file=/path/to/vault_passwd.file base.yml -i hosts.idc2 --tags localrepos --limit cdh5-all

5. 升级HDFS相关内容
5.1. 获取当前的Activie Namenode(我们在线上的DNS服务器中创建了一个始终检查并指向Active Namenode的CNAME)
# host active-idc2-hnn
active-idc2-hnn.heylinux.com is an alias for idc2-hnn2.heylinux.com
idc2-hnn2.heylinux.com has address 172.16.2.12

5.2. 在Active NameNode上进入safe mode并生成新的fsimage,并等待整个过程结束。
# sudo -u hdfs hdfs dfsadmin -safemode enter
# sudo -u hdfs hdfs dfsadmin -saveNamespace

5.3 关闭所有的Hadoop服务
回到idc2-admin1上的工作目录
# cd /root/cdh530_upgrade_from_500

首先通过pssh批量关闭Namenode,ResourceManager以及Hive服务器上的Hadoop相关进程(将对应的服务器地址或主机名列表写入到idc2-hnn-rm-hive与idc2-hmr.active)
# pssh -i -h idc2-hnn-rm-hive 'for x in `cd /etc/init.d ; ls hadoop-*` ; do sudo service $x status ; done'
# pssh -i -h idc2-hmr.active 'for x in `cd /etc/init.d ; ls hadoop-*` ; do sudo service $x status ; done'

# pssh -i -h idc2-hnn-rm-hive 'for x in `cd /etc/init.d ; ls hadoop-*` ; do sudo service $x stop ; done'
# pssh -i -h idc2-hmr.active 'for x in `cd /etc/init.d ; ls hadoop-*` ; do sudo service $x stop ; done'

# 检查如果存在与新版本相冲突的libhadoop.so文件,如果存在则删除(我们线上安装了Snappy,它会自己生成一个与CDH5.3.0自带的libhadoop.so相冲突的文件并放置到当前的JDK lib目录下面)。
# pssh -i -h idc2-hnn-rm-hive 'rm -f /usr/java/jdk1.7.0_45/jre/lib/amd64/libhadoop.so'
# pssh -i -h idc2-hmr.active 'rm -f /usr/java/jdk1.7.0_45/jre/lib/amd64/libhadoop.so'
Backup the HDFS metadata on the NameNodes

在Namenodes上备份metadata文件(我们线上有两个Namenode组成的HA,分别为idc2-hnn1与idc2-hnn2:
# mkdir /root/cdh530upgrade
# cd /root/cdh530upgrade
# tar -cf /root/nn_backup_data.data1.`date +%Y%m%d`.tar /data1/dfs/nn
# tar -cf /root/nn_backup_data.data2.`date +%Y%m%d`.tar /data2/dfs/nn

6. 升级Hadoop相关软件包
登录并升级Hive服务器idc2-hive1
# yum clean all; yum upgrade hadoop

登录并升级ResourceManager服务器idc2-rm1与idc2-rm2
# yum clean all; yum upgrade hadoop

回到idc2-admin1并升级所有的Datanode服务器idc2-hmr*
# pssh -i -h idc2-hmr.active 'yum clean all; yum upgrade hadoop hadoop-lzo -y'

登录并升级idc2-hnn1(Standby Namenode,由之前的host active-idc2-hnn命令判断得来)
# yum clean all; yum upgrade hadoop hadoop-lzo

登录并升级idc2-hnn2(Active Namenode,由之前的host active-idc2-hnn命令判断得来)
# yum clean all; yum upgrade hadoop hadoop-lzo

回到idc2-admin1并升级所有的Hadoop Clients
# pssh -i -h idc2-client 'yum clean all; yum upgrade hadoop -y'

7. 启动相关服务
登录并启动Journal Nodes服务(我们线上为idc2-hnn1, idc2-hnn2, idc2-rm1三台服务器)
# service hadoop-hdfs-journalnode start

登录所有的DataNode并启动服务(我们线上为idc2-hmr*服务器)
# service hadoop-hdfs-datanode start

登录Active NameNode并更新HDFS Metadata
# service hadoop-hdfs-namenode upgrade
# tailf /var/log/hadoop/hadoop-hdfs-namenode-`hostname -s`.heylinux.com.log

一直等待直到整个过程结束,例如在Log中出现如下类似内容:
/var/lib/hadoop-hdfs/cache/hadoop/dfs/<name> is complete.

等待直至NameNode退出Safe Mode,然后重启Standby NameNode

登录Standby NameNode并重启服务
# sudo -u hdfs hdfs namenode -bootstrapStandby
# service hadoop-hdfs-namenode start

登录所有的ResourceManager并启动服务
# service hadoop-yarn-resourcemanager start

登录所有的NodeManager并启动服务(我们线上为idc2-hmr*服务器)
# service hadoop-yarn-nodemanager start

在Active ResourceManager上启动HistoryServer(我们线上为idc2-rm1服务器)
# service hadoop-mapreduce-historyserver start

至此,整个Hadoop相关的升级就结束了,下面,将对Hive,Oozie和Pig的升级做相应的介绍。

8. 升级Hive与Oozie服务器(我们线上统一安装到了一台机器idc2-hive1)
8.1 升级Hive服务器
备份Metastore数据库
# mkdir -p /root/backupfiles/hive
# cd /root/backupfiles/hive
# mysqldump -uoozie -pheylinux metastore > metastore.sql.bak.`date +%Y%m%d`

更新hive-site.xml

Confirm the following settings are present in hive-site.xml
<property>
  <name>datanucleus.autoCreateSchema</name>
  <value>false</value>
</property>
  <property>
  <name>datanucleus.fixedDatastore</name>
  <value>true</value>
</property>

停止Hive相关服务
# service hive-server2 stop
# service hive-metastore stop

升级Hive相关软件包
# yum upgrade hive hive-metastore hive-server2 hive-jdbc
# yum install hive-hbase hive-hcatalog hive-webhcat

升级Hive的Metastore
# sudo -u oozie /usr/lib/hive/bin/schematool -dbType mysql -upgradeSchemaFrom 0.12.0

启动Hive服务
# service hive-metastore start
# service hive-server2 start

8.2 升级Oozie服务器
备份Oozie数据库
# mkdir -p /root/backupfiles/hive
# cd /root/backupfiles/hive
# mysqldump -uoozie -pheylinux oozie > oozie.sql.bak.`date +%Y%m%d`

备份Oozie配置文件
# tar cf oozie.conf.bak.`date +%Y%m%d` /etc/oozie/conf

停止Oozie
# service oozie stop

升级Oozie软件包
# yum upgrade oozie oozie-client

仔细校对新的配置文件中与原有配置文件中的参数,并将原有配置文件中的参数更新到新的配置文件

备份Oozie lib目录
# tar cf oozie.lib.bak.`date +%Y%m%d` /var/lib/oozie

升级Oozie数据库
# sudo -u oozie /usr/lib/oozie/bin/ooziedb.sh upgrade -run

升级Oozie Shared Library
# sudo -u oozie hadoop fs -mv /user/oozie/share /user/oozie/share.orig.`date +%Y%m%d`
# sudo oozie-setup sharelib create -fs hdfs://idc1-hnn2:8020 -locallib /usr/lib/oozie/oozie-sharelib-yarn.tar.gz

将所有的library从目录/user/oozie/share/lib/lib_<new_date_string>移动到/user/oozie/share/lib(<new_date_string>为目录生成后上面的时间戳)
# sudo -u oozie mv /user/oozie/share/lib/lib_<new_date_string>/* /user/oozie/share/lib/

检查HDFS中/user/oozie/share目录下的所有文件,并与备份后的share.orig.`date +%Y%m%d`中的文件进行一一对比,除了带有"cdh5"版本字样的软件包仅保留更新的以外,其它的都复制到新的lib目录下。

启动Oozie服务器
# service oozie start

9. 升级Pig
杀掉所有正在运行的Pig进程
# pkill -kill -f pig

更新Pig软件包
# yum upgrade pig

10. 在所有的软件包都升级完毕,并且HDFS也能正常工作的情况下,执行finalizeUpgrade命令做最后的收尾
登录Active Namenode并执行以下命令
# sudo -u hdfs hdfs dfsadmin -finalizeUpgrade

, , , , , ,

No Comments