五节点Nginx+PHP负载均衡架构的搭建

前言

在去年项目中搭建了五节点负载均衡架构,算是到目前遇到的挑战性比较大的工作,花费了很多时间学习和讨论,接触到一些新的知识,故在此记录一下。

思路

客户提供了五台服务器,CPU2核,内存4GB,因为要搭建一个负载均衡架构,所以其中一台带宽比较大。

那么如何分配五台服务器呢?我们希望最后的架构能做到负载均衡、数据库主从复制、读写分离,所以决定:

  • 1个负载均衡服务器

  • 2个应用服务器

  • 2个MySQL群集节点

架构图

MySQL分布式集群的搭建

在Linux上安装MySQL

详见:

在Linux上,使用MySQL的yum仓库,安装MySQL

同步:主主复制和主从复制

实际的生产环境中,面对数据量大、高并发等情况,单台MySQL数据库服务器可能不能满足实际的需求,此时我们需要采用MySQL分布式集群。在此之前,我们必须保证每台MySQL服务器里的数据同步。

数据同步只需要我们通过MySQL内部配置就可以完成,主要有两种方式:主从复制和主主复制。

主从复制

1、原理

MySQL复制基于主服务器在二进制日志Binary log)中跟踪所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。

每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以便从服务器可以对其数据拷贝执行相同的更新。

2、配置与实现

  • 场景描述:

主数据库服务器:###.###.##.##1,MySQL已经安装,并且无应用数据。

从数据库服务器:###.###.##.##2,MySQL已经安装,并且无应用数据。

  • 主服务器上进行的操作

启动mysql服务

1
/opt/mysql/init.d/mysql start

通过命令行登录管理MySQL服务器

1
/opt/mysql/bin/mysql -uroot -p'password'

授权给从数据库服务器###.###.##.##2

1
mysql> GRANT REPLICATION SLAVE ON *.* to 'user'@'###.###.##.##2' identified by ‘password’;

查询主数据库状态

1
2
3
4
5
6
Mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 | 261 | | |
+------------------+----------+--------------+------------------+

记录下 FILE 及 Position 的值,在后面进行从服务器操作的时候需要用到。

  • 配置从服务器

修改从服务器的配置文件/opt/mysql/etc/my.cnf

server-id = 1修改为 server-id = 10,并确保这个ID没有被别的MySQL服务所使用。

启动mysql服务

1
/opt/mysql/init.d/mysql start

通过命令行登录管理MySQL服务器

1
/opt/mysql/bin/mysql -uroot -p'password'

执行同步SQL语句

1
2
3
4
5
6
mysql> change master to
master_host=’###.###.##.##1’,
master_user=’user’,
master_password=’password’,
master_log_file=’mysql-bin.000005’,
master_log_pos=261;

正确执行后启动Slave同步进程

1
mysql> start slave;

主从同步检查

1
mysql> show slave status\G
  • 验证主从复制效果

在主服务器上建立数据库,建立数据表,插入数据。
在从服务器上查看数据与主服务器是否一致。

主主复制

1、原理

主主复制即在两台MySQL主机内都可以变更数据,而且另外一台主机也会做出相应的变更。

2、实现

主主复制其实就是两台MySQL主机互为主从,只要将两台主机分别按照主从复制的配置方法配置一遍即可。在项目中我们选择了主主复制来配置两台MySQL主机,是因为我们发现在实际运行中,如果选择主从复制,作为主的主机宕机之后,另一台主机无法自动担任主的角色,导致数据库插入数据失败。

读写分离:MyCat中间件

主从复制(Master-Slave)的方式是来实现同步数据,之后我们通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力。

MyCAT是mysql中间件,前身是阿里大名鼎鼎的Cobar,Cobar在开源了一段时间后,不了了之。于是MyCAT扛起了这面大旗,在大数据时代,其重要性愈发彰显。

由于项目框架影响,最后发现不能使用mycat中间件来进行读写分离的操作,下面简单介绍安装及配置步骤:

1、安装java

因Mycat是用java开发的,所以需要在实验环境下安装java。

2、安装MySQL

3、安装MyCAT

解压mycat的安装包到/user/local/下

设置mycat的环境变量

1
vi /etc/profile

使配置文件立即生效

1
source /etc/profile

进入mycat的配置文件目录

1
cd /usr/local/mycat/conf/

schema.xml:这个配置文件主要是用来配置数据库节点,逻辑表等

1
vi schema.xml

server.xml:这个配置文件主要是用来配置用户权限,系统变量

1
vi server.xml

详细配置参考:
mycat配置

sysbench基准测试、压力测试

SysBench是一个模块化的、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况。

  • 数据库准备
1
sysbench /usr/local/share/sysbench/oltp_read_only.lua --mysql-host=###.###.##.## --mysql-port=3306 --mysql-user=root --mysql-password= password --mysql-db=sbtest --db-driver=mysql --tables=10 --table-size=100000 --report-interval=10 --threads=30 --time=120 prepare
  • 开始
1
sysbench /usr/local/share/sysbench/oltp_read_only.lua --mysql-host=###.###.##.## --mysql-port=3306 --mysql-user=root --mysql-password=password --mysql-db=sbtest --db-driver=mysql --tables=10 --table-size=100000 --report-interval=10 --threads=30 --time=120 run
  • 清楚测试数据
1
sysbench /usr/local/share/sysbench/oltp_read_only.lua --mysql-host=###.###.##.## --mysql-port=3306 --mysql-user=root --mysql-password=password --mysql-db=sbtest --db-driver=mysql --tables=10 --table-size=100000 --report-interval=10 --threads=30 --time=120 cleanup

Nginx实现负载均衡与反向代理

负载均衡原理:

系统的扩展可分为纵向(垂直)扩展和横向(水平)扩展。纵向扩展,是从单机的角度通过增加硬件处理能力,比如CPU处理能力,内存容量,磁盘等方面,实现服务器处理能力的提升,不能满足大型分布式系统(网站),大流量,高并发,海量数据的问题。因此需要采用横向扩展的方式,通过添加机器来满足大型网站服务的处理能力。

比如:一台机器不能满足,则增加两台或者多台机器,共同承担访问压力。这就是典型的集群和负载均衡架构:

如下图:

负载均衡

应用集群:将同一应用部署到多台机器上,组成处理集群,接收负载均衡设备分发的请求,进行处理,并返回相应数据。

负载均衡设备:将用户访问的请求,根据负载均衡算法,分发到集群中的一台处理服务器。(一种把网络请求分散到一个服务器集群中的可用服务器上去的设备)

负载均衡的作用(解决的问题)

1.解决并发压力,提高应用处理性能(增加吞吐量,加强网络处理能力);

2.提供故障转移,实现高可用;

3.通过添加或减少服务器数量,提供网站伸缩性(扩展性);

4.安全防护;(负载均衡设备上做一些过滤,黑白名单等处理)

Nginx负载均衡配置

配置实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#user nobody;
worker_processes 2;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
worker_connections 1024;#最大连接数
}
http {
include mime.types;#文件扩展名与文件类型映射表,此映射表主要用于部署在本nginx上的静态资源
default_type application/octet-stream;
#日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;#连接超时时间
gzip on;
#反向代理
#此配置将请求转发到两个WEB服务器,根据客户端IP分配目标主机,同时按权重分配流量
upstream app1 {
ip_hash;
server ###.###.##.##:8080 weight=5;
server ###.###.##.##:80 weight=3;
}

配置完后,记得执行以下命令生效配置

1
nginx -s reload

Nginx负载均衡策略

下面列举的是常用的三种负载均衡策略,可以根据实际情况的不同进行选择。为了更简单的解决session问题,本次采用的是ip_hash的策略。

1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

1
2
3
4
upstream backserver {
server ###.###.##.#1;
server ###.###.##.#2;
}

2、指定权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

1
2
3
4
upstream backserver {
server ###.###.##.#1 weight=10;
server ###.###.##.#2 weight=10;
}

3、IP绑定 ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

1
2
3
4
5
upstream backserver {
ip_hash;
server ###.###.##.#1:88;
server ###.###.##.#2:80;
}

nfs挂载

NFS 就是 Network FileSystem 的缩写,最早之前是由sun 这家公司所发展出来的。
它最大的功能就是可以透过网络,让不同的机器、不同的操作系统、可以彼此分享个别的档案 (share files)。所以,你也可以简单的将他看做是一个文件服务器 (file server) 。

两个应用服务器中代码就是通过nfs保持同步的,nfs挂载目录设置在第一台应用服务器上的目录中。

1
2
3
4
5
6
7
8
9
//1、创建挂载目录
//2、挂载nfs
mount ip:/data/config /wwwroot/####/data/config/
//3、显示NFS服务器的挂载信息
showmount -e ip
//可以查看挂载的情况
df -h
//取消nfs挂载
umount /wwwroot/####/data/upload
您的支持将鼓励我继续创作~