我的项目经验总结——负载均衡的理解和实战:2

1,049 阅读18分钟
原文链接: zhuanlan.zhihu.com

前言

Talk is cheap. Show me the code

你的问题,在于想得太多,而做得太少。

环境准备

需要一台性能较佳的主机 + vmvare。

我用的是vmvare fusion + MacBook Pro,机器的操作系统均为 CentOS 6 64位,系统内存设置为1024M,因为我内存是16G,如果没条件的就设置内存为比较低的,比如256M……

配置sshd服务

如果要能完全掌控虚拟机(物理机也是一样的),那么最好(必须)要开启ssh服务。

先查看是否启动(如果已经启动了,说明默认是开机启动,不需要在额外设置),一般操作系统,即使是最小安装,ssh默认也是已经安装好的。

sudo /etc/init.d/sshd status

sshd命令是openssh软件套件中的服务器守护进程。也可以使用service命令查看,需要sudo权限。

service sshd status

接下来,如果开机没有默认启动,先查看sshd是否已经是系统服务,使用chkconfig命令,该命令主要用来更新(启动或停止)和查询系统服务的运行级信息。谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接。

chkconfig --list | grep sshd

设置sshd自启动(其实我这里已经启动了,3那里,如果是off,这一步必须有)

chkconfig --level 3 sshd on
#或者省事,直接全部on

chkconfig sshd on

配置图形界面开机不自启动

这个图形桌面要他没用,为了性能,把它关了。

sudo vim /etc/inittab 

5改为3即可,意思就是关闭图形界面启动。

reboot重启……

网络配置

需要设置虚拟机的网络和host共享,Mac如下配置:

其实就是NAT模式。

为什么这样设置呢,下面做一个总结:

虚拟机的网络连接模式及其配置

在VMware中,虚拟机的网络连接主要是由VMware创建的虚拟交换机(虚拟网络)负责实现,而VMware可以根据需要创建多个虚拟网络。

Windows上,VMware最多可以创建20个虚拟网络,每个虚拟网络可以连接任意数量的虚拟机网络设备。

Linux上,VMware最多可以创建255个虚拟网络,但每个虚拟网络仅能连接32个虚拟机网络设备。

VMware的虚拟网络都是以"VMnet+数字"的形式来命名的,例如 VMnet0、VMnet1、VMnet2……以此类推,在Linux,虚拟网络的名称均采用小写形式,例如 vmnet0。

一般在安装好虚拟机后,会有三种网络模式

VMware会自动为3种网络连接模式各自创建1个虚拟机网络:VMnet0 (桥接模式)、VMnet8 (NAT模式)、VMnet1 (仅主机模式)。当然,也可以根据需要自行创建更多的虚拟网络。

桥接模式

即物理机与虚拟机处于同一个子网,vm可以被子网内其他机器感知。此时物理网卡处于混杂模式,host会将物理网卡的数据包和虚拟机网卡数据包都接收。物理网卡收到数据再将数据转发至虚拟网卡内部。如果物理网卡都收不到数据,那么虚拟机网卡也必然收不到数据。

相比于NAT模式一个优点,桥接模式的虚拟机,有自己单独的IP地址,使用了host的物理网卡,虽然和主机在同一个子网,但可以直接和外面通信。

NAT模式

vm和主机共享IP,类似于户口管理系统中的黑户,民政局根本不会知道有这个人。所以,NAT模式比较安全,因为外部网络不会主动和vm通信。即使vm要向外面发送数据,都得交给主机去做,以主机的名义将数据转发出去。主机专门使用NAT功能,负责这些虚拟机内部数据的收发。

故,为了虚拟机的安全,我的实验使用NAT模式。

仅主机模式,很好理解,不再赘述。

网卡配置

虚拟机能联网的前提,是能通过主机的物理网卡将数据发出。所谓数据的发出,是指将数据发给网卡,然后在发给网关。网关再将数据发出去,送到指定主机。主机再反向将结果反馈。

当把主机网络断开,网卡就无法将数据交由网关,此时什么数据也出不去,那么此时vm无法上网。

说到底物理网络是虚拟机数据的载体,载体没了,自然上不了网。

虚拟机的网卡默认是eth1,而物理机的网卡是eth0,且在稍后的clone操作中,每clone一次,虚拟机的网卡都会自动加1,也就是新生成一个网卡和mac地址。这样不方便实验,需要我们初始化网卡设置,恢复eth0网卡。

1、删除网卡的历史记录相关文件(在root下操作)

sudo rm -f /etc/udev/rules.d/70-persistent-net.rules

2、reboot

3、关掉网卡管理服务 NetworkManager,否则我们无法对网卡进行手工组网。

[root@dashuai dashuai]# chkconfig NetworkManager off
[root@dashuai dashuai]# service NetworkManager stop
Stopping NetworkManager daemon:                            [  OK  ]
[root@dashuai dashuai]#

4、编辑网卡配置文件,如果没有就新建一个ifcfg-eth0文件

vim /etc/sysconfig/network-scripts/ifcfg-eth0 

如下配置:

DEVICE=eth0
ONBOOT=yes # 启动时是否激活
HWADDR=xx:xx:xx:xx:xx:xx #mac地址
TYPE=Ethernet # 以太网类型
NM_CONTROLLED=yes
BOOTPROTO=static # 这里不用dhcp,而是使用静态地址,否则不利于实验。
IPADDR=x.x.x.x
NETMASK=x.x.x.x
BROADCAST=x.x.x.x 
GATEWAY=x.x.x.x #网关地址

5、让network服务接管网卡

chkconfig network on
service network start 

6、测试看下ifconfig,是否生效,以及和host互相能否ping通。

那么这些地址是如何配置的?以及如何才能正确配置?

如何配置 IP,子网掩码,广播地址以及网关

前面说了,VMnet8是NAT模式的默认网卡,所以先看下它的一些配置。

Mac的在/Library/Preferences/VMware Fusion/vmnet8文件夹下,找到dhcpd.conf文件:

IP地址

配置文件明明白白的告诉我们了,子网是192.168.12.0,掩码是255.255.255.0,子网范围是192.168.12.128——192.168.12.254,也就是说虚拟机的ip地址只可能被分配到其中的一个。

广播地址

也就是broadcast-address,一个网段的第一个地址叫网络地址,而最后一个地址是广播地址。网络地址代表这个网络本身,而广播地址带表这个网络中的所有主机。

故,192.168.12.255 是广播地址。通常,我们可以ping广播地址,只要该网段中有主机在线,那么就会返回数据包,这样就可依靠广播地址查看主机的在线情况。

网关

网关本质:一个网络通向其他网络的IP地址。网关是默认的网络数据出口。如果当前网络的数据不知道往哪里发的话,那么它会发向默认网关那里,

比如有网络A和网络B;
网络A的IP地址范围为“192.168.1.1~192. 168.1.254”,子网掩码为255.255.255.0;
网络B的IP地址范围为“192.168.2.1~192.168.2.254”,子网掩码为255.255.255.0;

而在没有路由器的情况下,两个网络之间是不能进行TCP/IP通信的,即使是两个网络连接在同一台交换机(集线器)上,TCP/IP协议也会根据子网掩码(255.255.255.0)判断两个网络,得知两个网络中的主机处在不同的网络里。而要实现这两个网络之间的通信,则必须通过网关。

如果网络A中的主机发现某数据包的目的主机不在本地网络(比如是在网络B),那么它就把数据包转发给自己的网关,再由网关转发给网络B的网关。

然后,网络B的网关再转发该数据包给网络B内部的某个主机。

所以,只有设置好网关(这个IP地址),TCP/IP协议才能实现不同网络间的互通。

那么这个IP地址(网关)是哪台机器的IP地址呢?

只需要明白:网关的IP地址是具有路由功能的设备的IP地址,具有路由功能的设备有路由器、启用了路由协议的服务器(实质上相当于一台路由器)、代理服务器(也相当于一台路由器)。故,网关也被称为 IP路由器。

在文件中,已经给出就是routers,192.168.12.2,很重要!

子网掩码

是用来判断任意两台计算机的ip地址是否属于同一子网的根据。最为简单的理解就是两台计算机各自的ip地址与子网掩码进行and运算,若得出的结果是相同的,则说明这两台计算机是处于同一个子网,它们可以直接进行通讯

也很重要。

以上。

如果都配置对,那么虚拟机的网络就算ok了。

如果虚拟机网卡没有地址怎么办?

期间遇到一个小插曲。只需要在虚拟机的设置选项中,删除当前网络适配器,新建一个网络适配器,并生成新的mac地址即可。

vmware 会自动将这个mac地址分配到当前虚拟机。查看网卡配置的命令:

vim /etc/sysconfig/network-scripts/ifcfg-eth0 

配置FTP客户端

为了方便管理文件,使用FTP服务连接服务器。我使用的是FileZilla Mac版。

查看vm的ip地址,使用FTP客户端连接即可。

远程操作

如果是win,最好使用securecrt。Mac下,我用的是iterm2。

这样一台 CentOS 服务器,就已经完全在我掌控之中。

clone机器

先理解几个概念。

虚拟机快照

对某一个特定文件系统在某一个特定时间内的一个具有只读属性的镜像。当你需要重复的返回到某一系统状态,又不想创建多个虚拟机的时候,就可以使用快照功能。

完整克隆和带链接的克隆

在VMware中,克隆和快照功能很相像,但又不同。一个虚拟机的克隆就是原始虚拟机全部状态的一个拷贝,或者说一个镜像。

克隆的过程并不影响原始虚拟机,克隆的操作一但完成,克隆的虚拟机就可以脱离原始虚拟机独立存在,而且在克隆的虚拟机中和原始虚拟机中的操作是相对独立的,不相互影响。

克隆过程中,VMware会生成和原始虚拟机不同的MAC地址和UUID,这就允许克隆的虚拟机和原始虚拟机在同一网络中出现,并且不会产生任何冲突。

VMware支持两种类型的克隆:完整克隆 和 链接克隆。

完整克隆

一个完整克隆是和原始虚拟机完全独立的一个拷贝,它不和原始虚拟机共享任何资源。 可以脱离原始虚拟机独立使用。

链接克隆

一个链接克隆需要和原始虚拟机共享同一虚拟磁盘文件,不能脱离原始虚拟机独立运行。但采用共享磁盘文件却大大缩短了创建克隆虚拟机的时间,同时还节省了宝贵的物理磁盘空间。通过链接克隆,可以轻松的为不同的任务创建一个独立的虚拟机。

故,选择带链接的克隆,节省空间。

新机器的配置

主要目的:实现服务器的集群。

先关机,然后复制。

设置好新机器的名字,我这里叫lvs1和lvs2。正常来说速度很快,应该会马上就完成了。

每台机器都要重复如上一系列配置,搞定后,分别登录试试看看,和宿主机ping下,确认都是没问题的即可。

网卡配置

lvs1的网卡配置:

lvs2的网卡配置:

改好之后,就可以使用终端软件连接机器,比较方便。

主机名配置

为了集群的管理方便,必然要修改所有的机器名。一般原则是便于识别即可。

在CentOS中,有三种定义的主机名:静态的(static),瞬态的(transient),和灵活的(pretty)。
“静态”主机名也称为内核主机名,是系统在启动时从/etc/hostname自动初始化的主机名。
“瞬态”主机名是在系统运行时临时分配的主机名,例如,通过DHCP或mDNS服务器分配。静态主机名和瞬态主机名都遵从作为互联网域名同样的字符限制规则。
“灵活”主机名则允许使用自由形式(包括特殊/空白字符)的主机名,以展示给终端用户(如Linuxidc)。

如下命令:

hostname 新的主机名

hostname命令用于显示和设置系统的主机名。但是,用hostname命令,系统并不会永久保存,重启后还是原来的主机名。如果需要永久修改主机名,需要同时修改两个文件:

/etc/hosts和/etc/sysconfig/network。

因为,一旦修改了静态主机名,/etc/hostname 将被自动更新。但 /etc/hosts 不会更新以保存所做的修改,所以你每次在修改主机名后一定要手动更新/etc/hosts,而且大家都知道,hosts是一个没有扩展名的系统文件,其作用其实就是一个本地的DNS服务器。不改,再重启CentOS ,启动时会很慢。

修好之后,exit退出重新登录,如下显示,说明主机名已经成功修改。

配置小结

总的结构是这样子的:主vm的IP地址是192.168.12.130,lvs1是131,lvs2是 132,如下图,其中外网公用一个虚拟IP。

在虚拟机中是这个样子:

LVS管理工具——Piranha

水虎鱼(食人鱼)——Piranha,是RETHAT提供的一个基于web的LVS配置软件,可以省去手工配置lvs的繁杂工作,同时也可以提供HA功能,也就是配置双机热备。并且也可以监控RealServer的状态。

新增桥接网卡

由于要联网安装Piranha(英 [pɪ'rɑːnə; -njə],学习下新单词 ^_^),那么需要新加一块桥接网卡,并且需要配置网卡。添加一个网络适配器:

设置网卡模式为桥接模式

这个时候ping百度是ping不通的,我的目标就是让他ping通,也就是能联外网。

按照之前的配置规则进行修改。因为仅仅是临时上网,DHCP即可。

重启网络,如下就ok了。

下面测试下(百度,一如既往的功能就是测试网络连通性^_^)

其他机器同理。

注意,搞定所有需要安装的东西之后,为了安全,别忘了关闭桥接网卡。

yum加速插件

使用yum可以简化系统软件更新的工作。而为了保证更新的持续进行,通常都会提供多个mirror供下载使用,但由于存在地域问题,从不同的镜像下载速度差异很大。选择从适合的镜像下载软件包,会极大的影响更新速度。以CentOS为例,可使用一个叫fastestmirror的插件,让yum在更新时先根据ping值进行判断,然后从最快响应的地址下载。

yum install yum-fastestmirror

一路yes即可。

Piranha安装

yum install ipvsadm modcluster piranha system-config-cluster php php-cli php-common

可了解下,其中最主要的几个文件:

/etc/sysconfig/ha/lvs.cf,/etc/init.d/piranha-gui,/etc/init.d/pulse

测试下是否安装成功,启动:

/etc/init.d/piranha-gui start

默认端口是3636。如下命令访问web界面。

curl localhost:3636

防火墙配置

在宿主机启动web管理平台的界面

/etc/init.d/piranha-gui start

如果在本机work,而在宿主机不work,很可能是防火墙iptables有问题。

防火墙

在计算机领域中,防火墙(英文:Firewall)是一项协助确保信息安全的设备,会依照特定的规则,允许或是限制传输的数据通过。防火墙可能是一台专属的硬件或是架设在一般硬件上的。通俗的一个类比就是中国古代的长城或者城市的城墙,用于安全防御的作用,只有满足特定要求,接受检查后才能进入。防火墙作为内网与外网之间的一种访问控制设备, 常常安装在内网和外网交界点上。主要分为网络层防火墙和应用层防火墙两种,但也有些防火墙是同时运作于网络层和应用层。

iptables

iptables属于网络层防火墙。由于工作在网络层,不需要把数据发送到用户空间,在系统内核空间中进行了数据过滤处理,因此可以保证数据处理效率。与此同时也会带来一个坏处,既然是工作于内核空间,那么它要么集成到内核内部要么被内核调用,且用户是无法直接与内核交互,那我们怎么定义iptables规则。

因为以上原因iptables分为两部分,一部分是工作于内核中真正实现访问管控功能的netfileter,与此同时还要有与内核通信提供过滤规则的用户空间组件iptables。其实iptables的官方网站就是 The netfilter.org project

iptables 是一个运行在用户空间的应用软件,通过控制Linux内核netfilter模块,来管理网络数据包的流动与转送。在大部分的Linux系统上面,iptables是使用/usr/sbin/iptables来操作。通常iptables都需要内核层级的模块来配合运作,Xtables是主要在内核层级里面iptables API运作功能的模块。因相关动作上的需要,iptables的操作需要用到超级用户的权限。

netstat查看端口占用情况

Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。
-a (all)显示所有选项,默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在 Listen (监听) 的服務状态
-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令。
提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到

需要让防火墙打开80端口(因为lvs的主服务器代理的是80端口),3636端口,那么该怎么设置呢?

增加防火墙过滤表的规则

1、关闭SELinux

/usr/sbin/setenforce 0

SELinux 全称 Security Enhanced Linux (安全强化 Linux),是 MAC (Mandatory Access Control,强制访问控制系统)的一个实现,目的在于明确的指明某个进程可以访问哪些资源(文件、网络端口等)。

参考:Linux 下为何要关闭 SELinux?

2、iptables配置

当主机收到一个数据包后,数据包先在内核空间中处理,若发现目的地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目的不是自身,则会将包丢弃或进行转发。
iptables实现防火墙功能的原理是:在数据包经过内核的过程中有五处关键地方,分别是PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING,称为钩子函数,iptables这款用户空间的软件可以在这5处地方写规则,对经过的数据包进行处理,规则一般的定义为“如果数据包头符合这样的条件,就这样处理数据包”。
iptables中定义有5条链,说白了就是上面说的5个钩子函数,因为每个钩子函数中可以定义多条规则,每当数据包到达一个钩子函数时,iptables就会从钩子函数中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合钩子函数中任一条规则,iptables就会根据该函数预先定义的默认策略来处理数据包
iptables中定义有表,分别表示提供的功能,有filter表(实现包过滤)、nat表(实现网络地址转换)、mangle表(实现包修改)、raw表(实现数据跟踪),这些表具有一定的优先级:raw-->mangle-->nat-->filter
一条链上可定义不同功能的规则,检查数据包时将根据上面的优先级顺序检查

参考:iptables超全详解

3、保存防火墙设置

浏览器访问piranha的web管理界面

用户名就是软件名,然后还需要初始化密码

/usr/sbin/piranha-passwd

到此为止,我的集群机器就算配置好了。

辛苦的劳动,转载请注明出处,如果真心帮到了您,为鼓励更多的写作,您可以选择博客右侧的打赏功能。

原文:我的项目经验总结--负载均衡的理解和实战:2 - dashuai的博客 - 博客园