第十八章、Linux集群架构(上)

18.1 集群介绍
18.2 keepalived介绍
18.3/18.4/18.5 用keepalived配置高可用集群
18.6 负载均衡集群介绍
18.7 LVS介绍
18.8 LVS调度算法
18.9/18.10 LVS NAT模式搭建
 18.11课堂笔记
 
18.1 集群介绍
根据功能划分为两大类:高可用和负载均衡
1、高可用集群
    通常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务
 
实现高可用的开源软件有:heartbeat、keepalived
 
2、负载均衡集群
    需要有一台服务器作为分发器,它负责把用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外,就是给用户提供服务的服务器了,这些服务器数量至少为2台
 
实现负载均衡的开源软件有LVS、keepalived、haproxy、nginx,商业的有F5、Netscaler
 
 
18.2 keepalived介绍
#在这里我们使用keepalived来实现高可用集群,因为heartbeat在centos6上有一些问题,影响实验效果
 
#  keepalived通过VRRP(Virtual Router Redundancy Protocl)来实现高可用。
 
#在这个协议里会将多台功能相同的路由器组成一个小组,这个小组里会有1个master角色和N(N>=1)个backup角色。
  • master会通过组播的形式向各个backup发送VRRP协议的数据包;
  • 当backup收不到master发来的VRRP数据包时,就会认为master宕机了;
  • 此时就需要根据各个backup的优先级来决定谁成为新的mater。
 
#Keepalived要有三个模块,分别是core、check和vrrp。其中core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析,check模块负责健康检查,vrrp模块是来实现VRRP协议的。
 
 
18.3/18.4/18.5 用keepalived配置高可用集群
一、准备工作
准备两台机器150和129,150作为master,129作为backup
两台机器都执行yum install -y keepalived
 
二、两台机器安装nginx
两台机器都安装nginx,其中150上已经编译安装过nginx,129上需要yum安装nginx: yum install -y nginx(需要安装epel-release)
 
三、配置master相关操作(150主机)
1、编辑master的配置文件
> /etc/keepalived/keepalived.conf    
 #直接清空文件内容
vim  /etc/keepalived/keepalived.conf
#将链接的内容复制进去
 
keepalived配置文件说明:
#global_defs        定义全局参数
  • #notification_email    #定义一个出问题时发送到邮箱的邮箱地址(平时用不到,可以不用定义)
  • #notification_email_from  #由哪个邮箱地址发送
#vrrp_script chk_nginx   #检测服务是否正常(后面写一个检测脚本)
#vrrp_instance VI_I      #定义相关master信息
  • state            定义MASTER或者BACKUP
  • interface      指定网卡通过vrrp协议发送广播
  • virtual_router_id  定义路由器id是什么
  • priority        权重
  • authentication    认证相关信息
#virtual_ipaddress   #定义一个vip(公有ip,主、从都能用的)
#trank_script          #加载前面的检查脚本
 
2、编辑master的监控脚本
vim /usr/local/sbin/check_ng.sh
 
3、给脚本755权限
chmod 755 /usr/local/sbin/check_ng.sh
 
4、启动master的keepalived服务
systemctl start  keepalived   # 150启动服务
 
四、设定vip为100(192.168.233.100)
vim  /etc/keepalived/keepalived.conf
修改 
virtual_ipaddress {
    192.168.233.100
}
 
五、配置backup相关操作(129备份)
#配置前需要关闭防火墙(firewalld和SEXlinux)
vim  /etc/keepalived/keepalived.conf
 
vim /usr/local/sbin/check_ng.sh
 
3、给脚本755权限
chmod 755 /usr/local/sbin/check_ng.sh
 
4、129上也启动服务 
systemctl start keepalived
 
六、测试高可用
先确定好两台机器上nginx差异,比如可以通过curl -I 来查看nginx版本
  • master(150)的nginx(编译安装)默认页在/data/wwwroot/default/index.html(以前实验自定义的)
  •  backup(129)的nginx(直接yum下载的)默认页在/usr/share/nginx/html/index.html
浏览器访问192.168.233.150、192.168.233.100、192.168.233.129
 
模拟从接替主的任务(主机宕机)
#master切换到backup上时,vip会监听到backup上
测试1:关闭master上的nginx服务
#master和backup都无法关闭nginx服务,因为开启了keepalived服务,它还会自动加载nginx服务
 
主上操作:
 
从上操作:
 
测试2:在master上增加iptabls规则
iptables -I OUTPUT -p vrrp -j DROP
#通过iptables规则将master出去的包全部丢掉
 
浏览器还是可以打开默认页,说明无法将主机器达到切换backup的目的
 
 
测试3:关闭master上的keepalived服务
systemctl  stop  keepalived
#停止keeplived,vip100也会释放
ip add
#发现vip100不见了
 
这时候查看从机器backup,发现vip100绑定到从上了
ip add 
 

 

tail /var/log/messages
#192.168.233.100被增加了
 
浏览器访问192.168.233.100,出现backup  backup,说明vip已经到了从上
 
 
测试4:启动master上的keepalived服务
systemctl  start keeplived
#发现vip马上就回到master上
ip add
 
浏览器访问192.168.233.100
 
#如果有多台backup,配置backup时要将权重调成不同的级别,权重越高,优先级越高
vim  /etc/keeplived/keeplived.conf
修改priority的数值即可
 
#如果使用mysql做高可用时,要保证两边的数据保持一致
 
 
18.6 负载均衡集群介绍
主流开源软件LVS、keepalived、haproxy、nginx等
#keepalived的负载均衡功能其实就是LVS
 
LVS、nginx、haproxy三者比较
  • LVS属于4层(网络OSI 7层模型),nginx属于7层,haproxy既可以认为是4层,也可以当做7层使用;
  • lvs这种4层的负载均衡是可以分发除80外的其他端口通信的,比如MySQL的,而nginx仅仅支持http,https,mail;haproxy也支持MySQL;
  • 相比较来说,LVS这种4层的更稳定,能承受更多的请求,而nginx这种7层的更加灵活,能实现更多的个性化需求
 
 
18.7 LVS介绍
#LVS是由国人章文嵩开发
#流行度不亚于apache的httpd,基于TCP/IP做的路由和转发,稳定性和效率很高
#LVS最新版本基于Linux内核2.6,有好多年不更新了
#LVS有三种常见的模式:NAT、DR、IP Tunnel
 
#LVS架构中有一个核心角色叫做分发器(Load balance),它用来分发用户的请求,还有诸多处理用户请求的服务器(Real Server,简称rs)
 
LVS NAT模式
 
#这种模式借助iptables的nat表转发来实现
1、用户的请求到分发器后,通过预设的iptables规则,把请求的数据包转发到后端的rs上去
2、rs需要设定网关为分发器的内网ip
3、用户请求的数据包和返回给用户的数据包全部经过分发器,所以分发器成为瓶颈
 
优点:
在nat模式中,只需要分发器有公网ip即可,所以比较节省公网ip资源
 
缺点:
请求量不宜太大,一般用户规模10台以下,超过10台影响效率
 
 
LVS IP Tunnel模式
#这种模式,需要有一个公共的IP配置在分发器和所有rs上,我们把它叫做vip
1、客户端请求的目标IP为vip,分发器接收到请求数据包后,会对数据包做一个加工,会把目标IP改为rs的IP,这样数据包就到了rs上
2、rs接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有rs上配置了这个vip,所以它会认为是它自己(更改目标ip)
 
#用户请求的数据包和返回给用户的数据包不需要经过分发器,不存在瓶颈
 
 
LVS DR模式
这种模式,也需要有一个公共的IP配置在分发器和所有rs上,也就是vip,还会更改MAC地址
1、和IP Tunnel不同的是,它会把数据包的MAC地址修改为rs的MAC地址
2、rs接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有rs上配置了这个vip,所以它会认为是它自己
 
 
18.8 LVS调度算法
轮询  rr(Round-Robin)(常用)
#用户请求过来,均衡将请求分发到这些rs上
 
加权轮询 wrr(Weight Round-Robin)(常用)
#带权重的轮询
 
最小连接  lc(Least-Connection)(常用)
#让新的请求交到请求量较少的服务器
 
加权最小连接  wlc(Weight Least-Connection)(常用)
#可以加一个权重
 
基于局部性的最小连接  lblc(Locality-Based Least Connections)
 
带复制的基于局部性最小连接  lblcr(Locality-Based Least Connections with Replication)
 
目标地址散列调度  dh(Destination Hashing)
 
源地址散列调度   sh(Source Hashing)
 
 
18.9/18.10 LVS NAT模式搭建
准备工作:
三台机器
分发器,也叫调度器(简写为dir)
内网:233.150,外网:226.147(添加一个网卡,设置vmware仅主机模式,不需要设置网关,设置ip192.168.226.147)
rs1
内网:233.129,设置网关为233.150
rs2
内网:233.132,设置网关为233.150
#rs机器的网关一定要设置成dir的内网ip
 
hostnamectl set-hostname xin-04   #更改主机名
bash              #进入一个子shell,主机名立刻就变了
 
 
三台机器上都执行(关闭防火墙)
systemctl stop firewalld;systemctl disable firewalld
systemctl start  iptables;systemctl enable  iptables
iptables -F;service iptables save      #保存空规则
 
NAT模式搭建
1、在dir上安装ipvsadm
yum install -y ipvsadm
 
2、在dir上编写脚本
vim /usr/local/sbin/lvs_nat.sh
#内容如下
#! /bin/bash
# director 服务器上开启路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
# 关闭icmp的重定向,为了将数据包成功转发到rs及rs发送数据包回来
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
# 注意区分网卡名字,实验的两个网卡分别为ens33和ens37
echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects
# director 设置nat防火墙
iptables -t nat -F
iptables -t nat -X
#MASQUERADE让同网段的内网去上网
iptables -t nat -A POSTROUTING -s  192.168.233.0/24  -j MASQUERADE
# director设置ipvsadm
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 192.168.226.147:80 -s rr -p 3
$IPVSADM -a -t 192.168.226.147:80 -r 192.168.233.129:80 -m -w 1
$IPVSADM -a -t 192.168.226.147:80 -r 192.168.233.132:80 -m -w 1
 
#-t后面接外网ip,-s指定算法,-p指定保持连接时间(防止使用负载均衡可能前后两次连接会到不同的服务器)(不能设置为0),-r后面接rs的ip加端口,-m说明是nat的模式,-w设置权重
 
3、运行dir上编辑的脚本
sh /usr/local/sbin/lvs_nat.sh
 
4、NAT模式效果测试
#两台rs上都安装nginx 
#设置两台rs的主页,更改/usr/share/nginx/html/index.html文件内容
[root@xinlinux-01 ~]# curl localhost
xinlinux01
 
[root@xinlinux-04 ~]# curl localhost
xinlinux04
 
 
curl 192.168.226.147(为了更好的体现效果,编辑脚本,将-p 3 删除掉)
[root@xinlinux-03 yum.repos.d]# curl 192.168.226.147
xinlinux04
[root@xinlinux-03 yum.repos.d]# curl 192.168.226.147
xinlinux01
[root@xinlinux-03 yum.repos.d]# curl 192.168.226.147
xinlinux04
[root@xinlinux-03 yum.repos.d]# curl 192.168.226.147
xinlinux01
 
 
18.11课堂笔记
一、mysql主从原理(面试可能会问
1、Mysql主从是基于binlog这个二进制文件,这个文件记录了一些日志
2、主从过程有三个步骤
3、mysql主从共有三个线程
 
使用场景:
1、数据备份,主机器宕机,从机器还能随时对web提供服务
2、作为一个从库,读的库,减轻主库的压力,数据备份且可以分担主机器被调用数据时的压力,mysql主从,是有方向性的,写数据,必须从主机器开始;如果不依照原理会导致数据紊乱
 
 
二、主从配置
查看同步是否成功注意几个参数:
1、两个yes
2、Second_Behind_Master   落后多少秒
3、SQL_Running_State   状态
4、error信息
 
 
三、检测主从同步异常
#不可多个库同一行用逗号隔开,可以写多行
 
 
四、binlog三种模式的区别
1.Row
日志中会记录成每一行数据被修改的形式,然后在slave端再对相同的数据进行修改,只记录要修改的数据,只有value,不会有sql多表关联的情况。
优点:在row模式下,bin-log中可以不记录执行的sql语句的上下文相关的信息,仅仅只需要记录那一条记录被修改了,修改成什么样了,所以row的日志内容会非常清楚的记录下每一行数据修改的细节,非常容易理解。而且不会出现某些特定情况下的存储过程和function,以及trigger的调用和出发无法被正确复制问题。
缺点:在row模式下,所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容。
 
2.statement
每一条会修改数据的sql都会记录到master的binlog中,slave在复制的时候sql进程会解析成和原来master端执行多相同的sql再执行。
优点:在statement模式下首先就是解决了row模式的缺点,不需要记录每一行数据的变化减少了binlog日志量,节省了I/O以及存储资源,提高性能。因为他只需要记录在master上所执行的语句的细节以及执行语句的上下文信息。
缺点:在statement模式下,由于他是记录的执行语句,所以,为了让这些语句在slave端也能正确执行,那么他还必须记录每条语句在执行的时候的一些相关信息,也就是上下文信息,以保证所有语句在slave端被执行的时候能够得到和在master端执行时候相同的结果。另外就是,由于mysql现在发展比较快,很多的新功能不断的加入,使mysql的复制遇到了不小的挑战,自然复制的时候涉及到越复杂的内容,bug也就越容易出现。在statement中,目前已经发现不少情况会造成Mysql的复制出现问题,主要是修改数据的时候使用了某些特定的函数或者功能的时候会出现,比如:sleep()函数在有些版本中就不能被正确复制,在存储过程中使用了last_insert_id()函数,可能会使slave和master上得到不一致的id等等。由于row是基于每一行来记录的变化,所以不会出现,类似的问题。
 
3.Mixed
从官方文档中看到,之前的 MySQL 一直都只有基于 statement 的复制模式,直到 5.1.5 版本的 MySQL 才开始支持 row 复制。从 5.0 开始,MySQL 的复制已经解决了大量老版本中出现的无法正确复制的问题。但是由于存储过程的出现,给 MySQL Replication 又带来了更大的新挑战。另外,看到官方文档说,从 5.1.8 版本开始,MySQL 提供了除 Statement 和 Row 之外的第三种复制模式:Mixed,实际上就是前两种模式的结合。在 Mixed 模式下,MySQL 会根据执行的每一条具体的 SQL 语句来区分对待记录的日志形式,也就是在 statement 和 row 之间选择一种。新版本中的 statment 还是和以前一样,仅仅记录执行的语句。而新版本的 MySQL 中对 row 模式也被做了优化,并不是所有的修改都会以 row 模式来记录,比如遇到表结构变更的时候就会以 statement 模式来记录,如果 SQL 语句确实就是 update 或者 delete 等修改数据的语句,那么还是会记录所有行的变更。
 
 
五、拓展
1、不停库不锁表在线主从配置
 
 
2、主从不同步
#最彻底的方法是重做一遍主从
两台机器都执行yum install -y keepalived
 
二、两台机器安装nginx
两台机器都安装nginx,其中150上已经编译安装过nginx,129上需要yum安装nginx: yum install -y nginx(需要安装epel-release)
 
三、配置master相关操作(150主机)
1、编辑master的配置文件
> /etc/keepalived/keepalived.conf    
 #直接清空文件内容
vim  /etc/keepalived/keepalived.conf
#将链接的内容复制进去
 
keeplived配置文件说明:
#global_defs        定义全局参数
  • #notification_email    #定义一个出问题时发送到邮箱的邮箱地址(平时用不到,可以不用定义)
  • #notification_email_from  #由哪个邮箱地址发送
#vrrp_script chk_nginx   #检测服务是否正常(后面写一个检测脚本)
#vrrp_instance VI_I      #定义相关master信息
  • state            定义MASTER或者BACKUP
  • interface      指定网卡通过vrrp协议发送广播
  • virtual_router_id  定义路由器id是什么
  • priority        权重
  • authentication    认证相关信息
#virtual_ipaddress   #定义一个vip(公有ip,主、从都能用的)
#trank_script          #加载前面的检查脚本
 
2、编辑master的监控脚本
vim /usr/local/sbin/check_ng.sh
 
3、给脚本755权限
chmod 755 /usr/local/sbin/check_ng.sh
 
4、启动master的keeplived服务
systemctl start  keepalived   # 150启动服务
 
四、设定vip为100(192.168.233.100)
vim  /etc/keepalived/keepalived.conf
修改 
virtual_ipaddress {
    192.168.233.100
}
 
五、配置backup相关操作(129备份)
#配置前需要关闭防火墙(firewalld和SEXlinux)
vim  /etc/keepalived/keepalived.conf
 
vim /usr/local/sbin/check_ng.sh

 

准备工作:
三台机器
分发器,也叫调度器(简写为dir)
内网:233.150,外网:226.147(添加一个网卡,设置vmware仅主机模式,不需要设置网关,设置ip192.168.226.147)
rs1
内网:233.129,设置网关为233.150
rs2
内网:233.132,设置网关为233.150
#rs机器的网关一定要设置成dir的内网ip
 
hostnamectl set-hostname xin-04   #更改主机名
bash              #进入一个子shell,主机名立刻就变了
 
 
三台机器上都执行(关闭防火墙)
systemctl stop firewalld;systemctl disable firewalld
systemctl start  iptables;systemctl enable  iptables
iptables -F;service iptables save      #保存空规则
 
NAT模式搭建
1、在dir上安装ipvsadm
yum install -y ipvsadm
 
2、在dir上编写脚本
vim /usr/local/sbin/lvs_nat.sh
#内容如下
#! /bin/bash
# director 服务器上开启路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
# 关闭icmp的重定向,为了将数据包成功转发到rs及rs发送数据包回来
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
# 注意区分网卡名字,实验的两个网卡分别为ens33和ens37
echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects
posted @ 2018-10-16 11:48  最爱吃菜  阅读(200)  评论(0编辑  收藏  举报