集群是我在工作中遇到最多的问题,今天分享一下我对于集群的感触
里面包含LVS负载均衡集群NAT模式如何配置从头到尾的配置
将很多机器组织到一起,作为一个整体对外提供服务
集群在扩展性、性能方面都可以做到很灵活
任务调度是集群的核心技术
提高性能
降低成本
提高可扩展性
增强可靠性
lvs是Linux Virtual Server,是实现负载均衡集群
lvs是一个虚拟服务器集群系统
将真实服务器集群虚拟成一台服务器,对外提供服务,同时在真实的服务器中实现均衡负载
当一定量的服务器作为一个整体对外提供服务,并且分摊压力,称这些服务器为负载均衡集群
LVS是一个优秀的负载均衡方案,理论上能够无限水平扩展,使服务器能够应对海量数据的冲击。
高可用,高性能,低成本,服务器应用集群
前端:负载均衡层,由一台或多台负载调度器构成 LB
中端:服务器群组层,由一组实际运行应用服务的服务器构成 SA
后端:数据共享存储层,提供共享存储空间的共享区域 SS
LVS调度算法是LVS对于请求的分发方式
DS(调度器)在向RS(真实服务器)分发请求,实现负载均衡时有10种左右的算法,常用的有4种
轮洵(rr) 加权轮询(wrr)
最少连接(lc){当连接数相同时采用加权轮询算法} 加权最少连接(wlc)
ipvsadm命令是LVS在应用层的管理命令
可以通过这个命令去进行管理LVS的配置
他是一个工具也是一条命令,用于管理LVS的策略规划
-A: 添加虚拟服务器
-E: 编辑虚拟服务器
-D: 删除虚拟服务器
-t: 添加tcp服务器
-u: 添加udp服务器
-s: 指定负载调度算法。
-a: 添加虚拟服务器后,向虚拟服务器中加入真实服务器
-r: 指定真实服务器
-w: 为节点服务器设置权重
-m: 指定工作模式为NAT
-g: 指定工作模式为DR
1,创建虚拟服务器
ipvsadm -A -t 192.168.88.5:80 -s rr
命令 添加虚拟服务器 添加TCP服务器 调度器IP 指定调度算法 轮询
2,向虚拟服务器中添加RIP(真实服务器IP)
ipvsadm -a -t 192.168.88.5:80 -r 192.168.99.100 -w 1 -m
命令 添加虚拟服务器后向里面添加真实服务器 调度器IP 指定真实服务器 真实服务器IP
为节点服务器设置权重 指定工作模式为NAT
3,删除lvs虚拟服务器配置
ipvsadm -D -t 192.168.88.5:80
命令 删除虚拟服务器 添加TCP服务器 调度器IP
调度器将用户的报文请求的VIP(虚拟IP地址)改写成选定的RS(提供服务的真实主机)
同时报文的目标端口也会修改成选定的RS端口,最后报文请求发送到选定的RS中
RS在得到数据后,RS返回数据给到用户时,需要再次经过调度器将报文的原地址和源端口改成VIP和相应端口
而后将数据发送给客户,完成整个负载均衡
在NAT方式下,用户的请求和响应报文都必须经过DS重写
当用户越来越多时,调度器的处理能力被称为瓶颈
在使用NAT时确保lvs1的ip转发功能已经打开。该功能需要改变内核参数
1,查看ip转发功能的内核参数
sysctl -a # 查看所有的内核参数
sysctl -a | grep ip_forward # 查看ip_foward参数
net.ipv4.ip_forward = 1 # 1表示打开转发,0表示关闭转发
2,设置打开ip_forward功能 etc/sysctl.conf,默认为开启
!!!
现在开始
环境准备
# 创建4台虚拟机
[root@myhost ~]# vm clone client1 lvs1 web{1..2}
# 初始化虚拟机
[root@myhost ~]# virsh console client1 # 连接client1控制台
localhost login: root
Password: a
# 登陆之后,将以下内容粘贴到终端
hostnamectl set-hostname client1
nmcli connection modify "System eth0" con-name eth0
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.88.10/24 autoconnect yes ipv4.gateway 192.168.88.5
nmcli connection down eth0
nmcli connection up eth0
# 退出
[root@localhost ~]# exit
# 退出之后,按ctrl+]可回到真机
# 真机通过ssh连接client1
[root@myhost ~]# rm -f ~/.ssh/known_hosts
[root@myhost ~]# ssh 192.168.88.10
# 配置第2台机器作为lvs1
[root@myhost ~]# virsh console lvs1
localhost login: root
Password: a
# 登陆之后,将以下内容复制到命令行
hostnamectl set-hostname lvs1
nmcli connection modify "System eth0" con-name eth0
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.88.5/24 autoconnect yes
nmcli connection down eth0
nmcli connection up eth0
rm -f /etc/sysconfig/network-scripts/ifcfg-eth1
nmcli connection add con-name eth1 ifname eth1 type ethernet autoconnect yes ipv4.method manual ipv4.addresses 192.168.99.5/24
reboot # 重启系统,使得eth1网卡生效
# 按ctrl+]可回到真机
# 真机通过ssh连接lvs1
[root@myhost ~]# ssh 192.168.88.5
# 配置第3台机器作为web1
[root@myhost ~]# virsh console web1
localhost login: root
Password: a
# 登陆之后,将以下内容复制到命令行
hostnamectl set-hostname web1
nmcli connection modify "System eth0" con-name eth0
nmcli connection modify eth0 autoconnect no
rm -f /etc/sysconfig/network-scripts/ifcfg-eth1
nmcli connection add con-name eth1 ifname eth1 type ethernet autoconnect yes ipv4.method manual ipv4.addresses 192.168.99.100/24 ipv4.gateway 192.168.99.5
reboot
# 按ctrl+]可回到真机
# 真机通过ssh连接web1
[root@myhost ~]# ssh 192.168.99.100
# 配置第4台机器作为web2
[root@myhost ~]# virsh console web2
localhost login: root
Password: a
# 登陆之后,将以下内容复制到命令行
hostnamectl set-hostname web2
nmcli connection modify "System eth0" con-name eth0
nmcli connection modify eth0 autoconnect no
rm -f /etc/sysconfig/network-scripts/ifcfg-eth1
nmcli connection add con-name eth1 ifname eth1 type ethernet autoconnect yes ipv4.method manual ipv4.addresses 192.168.99.200/24 ipv4.gateway 192.168.99.5
reboot
# 按ctrl+]可回到真机
# 真机通过ssh连接web2
[root@myhost ~]# ssh 192.168.99.200
# 创建工作目录
[root@pubserver ~]# mkdir cluster
[root@pubserver ~]# cd cluster/
#创建主配置文件
[root@pubserver cluster]# vim ansible.cfg
[defaults]
inventory = inventory
host_key_checking = false # 不检查主机密钥
# 创建主机清单文件及相关变量
[root@pubserver cluster]# vim inventory
[clients]
client1 ansible_host=192.168.88.10
[webservers]
web1 ansible_host=192.168.99.100
web2 ansible_host=192.168.99.200
[lb]
lvs1 ansible_host=192.168.88.5
[all:vars] # all是ansible自带的组,表示全部主机
ansible_ssh_user=root
ansible_ssh_pass=a
# 创建文件目录,用于保存将要拷贝到远程主机的文件
[root@pubserver cluster]# mkdir files
# 编写yum配置文件
[root@pubserver cluster]# vim files/local88.repo
[BaseOS]
name = BaseOS
baseurl = ftp://192.168.88.240/dvd/BaseOS
enabled = 1
gpgcheck = 0
[AppStream]
name = AppStream
baseurl = ftp://192.168.88.240/dvd/AppStream
enabled = 1
gpgcheck = 0
[rpms]
name = rpms
baseurl = ftp://192.168.88.240/rpms
enabled = 1
gpgcheck = 0
[root@pubserver cluster]# vim files/local99.repo
[BaseOS]
name = BaseOS
baseurl = ftp://192.168.99.240/dvd/BaseOS
enabled = 1
gpgcheck = 0
[AppStream]
name = AppStream
baseurl = ftp://192.168.99.240/dvd/AppStream
enabled = 1
gpgcheck = 0
[rpms]
name = rpms
baseurl = ftp://192.168.99.240/rpms
enabled = 1
gpgcheck = 0
# 编写用于上传yum配置文件的playbook
[root@pubserver cluster]# vim 01-upload-repo.yml
---
- name: config repos.d
hosts: all
tasks:
- name: delete repos.d # 删除repos.d目录
file:
path: /etc/yum.repos.d
state: absent
- name: create repos.d # 创建repos.d目录
file:
path: /etc/yum.repos.d
state: directory
mode: '0755'
- name: config local88 # 上传repo文件到88网段
hosts: clients,lb
tasks:
- name: upload local88
copy:
src: files/local88.repo
dest: /etc/yum.repos.d/
- name: config local99 # 上传repo文件到99网段
hosts: webservers
tasks:
- name: upload local99
copy:
src: files/local99.repo
dest: /etc/yum.repos.d/
[root@pubserver cluster]# ansible-playbook 01-upload-repo.yml
配置2台web服务器
# 创建首页文件,文件中包含ansible facts变量
[root@pubserver cluster]# vim files/index.html
Welcome from {{ansible_hostname}}
# 配置web服务器
[root@pubserver cluster]# vim 02-config-webservers.yml
---
- name: config webservers
hosts: webservers
tasks:
- name: install nginx # 安装nginx
yum:
name: nginx
state: present
- name: upload index # 上传首页文件到web服务器
template:
src: files/index.html
dest: /usr/share/nginx/html/index.html
- name: start nginx # 启动服务
service:
name: nginx
state: started
enabled: yes
[root@pubserver cluster]# ansible-playbook 02-config-webservers.yml
# 在lvs1上测试到web服务器的访问
[root@lvs1 ~]# curl http://192.168.99.100
Welcome from web1
[root@lvs1 ~]# curl http://192.168.99.200
Welcome from web2
安装LVS
[root@pubserver cluster]# vim 04-inst-lvs.yml
---
- name: install lvs
hosts: lb
tasks:
- name: install lvs # 安装lvs
yum:
name: ipvsadm
state: present
[root@pubserver cluster]# ansible-playbook 04-inst-lvs.yml
配置LVS
# 为web服务器创建虚拟服务器,使用rr调度算法
[root@lvs1 ~]# ipvsadm -A -t 192.168.88.5:80 -s rr
# 查看配置
[root@lvs1 ~]# ipvsadm -Ln # L是列出,n是使用数字,而不是名字
# 向虚拟服务器中添加RIP
[root@lvs1 ~]# ipvsadm -a -t 192.168.88.5:80 -r 192.168.99.100 -w 1 -m
[root@lvs1 ~]# ipvsadm -a -t 192.168.88.5:80 -r 192.168.99.200 -w 2 -m
# 查看配置
[root@lvs1 ~]# ipvsadm -Ln
# 验证
[root@client1 ~]# for i in {1..6}
> do
> curl http://192.168.88.5
> done
Welcome from web2
Welcome from web1
Welcome from web2
Welcome from web1
Welcome from web2
Welcome from web1
# 删除配置。(如果配置有错,用以下命令删除重配置)
[root@lvs1 ~]# ipvsadm -D -t 192.168.88.5:80
# 修改调度模式为加权轮询
[root@lvs1 ~]# ipvsadm -E -t 192.168.88.5:80 -s wrr
# 验证配置
[root@client1 ~]# for i in {1..6}; do curl http://192.168.88.5; done
Welcome from web2
Welcome from web2
Welcome from web1
Welcome from web2
Welcome from web2
Welcome from web1