整个集群的架构如下图,服务器是exsi虚拟化。
一、Firewall
在集群的配置过程中,我们的Firewall和SElinux是一直处于关闭的,感觉还是先配置上比较方便,说来惭愧 SElinux我不会(setenforce 0),在这里我就只打开Firewall了。
- 第一层Nginx监听的是80端口(也可以自定义),再将请求反向代理到web服务器的80端口(也可以自定义) ,所以他们都需要在Firewall上允许80端口的流量通过,即:
1 | firewall-cmd --zone=public --add-port=80/tcp |
- nginx高可用实现依靠的keepalived是以VRRP为基础,keepalived官方文档给出的组播地址是224.0.0.18,所以第一层和第三层的nginx的服务器上都需要在防火墙上允许vrrp组播的通过,即:
1 | firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 \ |
- MySQL集群必然要开启3306端口,第三层的Nginx也是在监听3306端口,即:
1 | firewall-cmd --zone=public --add-port=3306/tcp |
建议先看第五步网络存储挂载。
二、nginx高可用集群
nginx version: nginx/1.14.0,keepalived-2.0.7
编译安装nginx
wget http://www.zlib.net/zlib-1.2.11.tar.gz
wget https://jaist.dl.sourceforge.net/project/pcre/pcre/8.41/pcre-8.41.tar.gz
wget https://www.openssl.org/source/openssl-1.0.2o.tar.gz
wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
wget http://nginx.org/download/nginx-1.14.0.tar.gz
tar xvf …… 解压缩
1 | cd nginx-1.14.0.tar.gz |
配置nginx.conf
1 | #user nobody; |
nginx负载均衡功能实现依靠upstream模块,upstream模块应放于nginx.conf配置的http{}标签内,支持五种分配方式,轮询(默认)、weight、ip_hash三种原生方式,以及fair、url_hash两种第三方支持的方式。我用的是weight方式。
1 | proxy_pass http://backend; |
访问的是nginx服务器的地址即起到了反向代理的作用,代理web
接下来安装keepalive实现nginx集群的高可用。
编译安装keepalived
1 | cd keepalived-2.0.7 |
生成Makefile时有如下报错,需要另外安装libnl/libnl-3以支持IPv6,此处确实用不到,VRRP功能开启即可
配置keepalived
1 | ! Configuration File for keepalived |
keepalived是集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防止单点故障。
以VRRP协议为实现基础,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
1 | nginx_check.sh如下: |
配置完成后Ngx-Master:
Ngx-Backup:
宕掉Master的网卡,vip直接转移到了Backup上
重启网卡后,vip回归到Master
三、web 集群
这一部分其实很简单,在安装操作系统的时候我选的”Basic web server”,为了能验证web能提交数据到MySQL,写了一个PHP页面。
在连接数据库的时候,数据库地址是vip:192.168.255.200
1 | index.php |
1 | deal.php |
1 | coon.php |
下面的代码用来测试从数据库读取内容
1 | <?php |
如果两个web服务器中的页面不同,在提交表单的时候回显示无法找到。
最终效果为:
四、nginx高可用集群
nginx version: nginx/1.14.0,keepalived-2.0.7
与第一层原理相同,只不过反向代理的数据库,监听端口是3306
这里也会有一个Vip:192.168.255.200
配置Nginx
1 | nginx.conf |
配置keepalived
1 | keepalived.conf |
vip转移不再演示。
五、mysql双机热备集群
Server version: 5.6.43-log MySQL Community Server
源码安装mysql,不再展开。
mysql1:my.cnf
1 | # For advice on how to change settings please see |
mysql2:my.cnf
1 | # For advice on how to change settings please see |
web想要上传数据到数据库,首先需要使用web登录至数据库,然后MySQL中应当有已经创建好的数据库,库中要有表,用户权限等等。MySQL集群我们做的是双主,数据是同步的。
先配置双主吧,然后只用建一遍库就可以了。双主模型其实就是互为主从,主从同步复制原理分成三步:master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events ),slave将master的binary log events拷贝到它的中继日志(relay log),slave重做中继日志中的事件,将改变反映它自己的数据。
首先在两台mysql上创建用户张三 ,允许对方远程连接
1 | grant all privileges on *.* to zhangsan@192.168.255.52(192.168.255.57) identified by '123456'; |
先以MySQL1为主
MySQL1上(192.168.255.52 主):
1 | mysql> show master status; |
MySQL2上(192.168.255.57 从):
1 | mysql> change master to master_host='192.168.255.52',master_port=3306,master_user='zhangsan',master_password='123456',m aster_log_file='mysql-bin.000008',master_log_pos=120; |
再以MySQL2为主
MySQL2上(192.168.255.57 主):
1 | mysql> show master status; |
MySQL1上(192.168.255.52从);
1 | mysql> change master to master_host='192.168.255.57',master_port=3306,master_user='zhangsan',master_password='123456',m aster_log_file='mysql-bin.000006',master_log_pos=120; |
查看状态, Slave_IO_State 为等待主机事件;MySQL1主机显示192.168.255.57(即MySQL2)为主,在MySQL2上查看则相反;Slave_IO_Running: Yes;Slave_SQL_Running: Yes
1 | Mysql 1 : |
1 | MySQL 2: |
创建数据库
创建db-jd数据库,在库中创建tb_goods表,表中字段与PHP网页相对应,在mysql1中创建,mysql2中同步
1 | mysql> create database db_jd; |
授权允许web登陆
在两台MySQL服务器上创建web用户,允许远程登陆,并赋予db_jd数据库的权限1
2
3
4
5
6
7
8mysql> create user web@192.168.255.50 identified by '123456';
Query OK, 0 rows affected (0.37 sec)
mysql> grant all privileges on db_jd.* to web@192.168.255.50;
Query OK, 0 rows affected (0.12 sec)
mysql> create user web@192.168.255.53 identified by '123456';
Query OK, 0 rows affected (0.37 sec)
mysql> grant all privileges on db_jd.* to web@192.168.255.53;
Query OK, 0 rows affected (0.12 sec)
关于为什么不直接将权限赋给VIP,以及给Nginx服务器赋权,我认为归根到底还是web服务器的Apache与MySQL服务器MySQL -server之间通过套接字进行进程间通信,无论是vip还是Nginx只不过是中间的一座连接桥而已,实质上还是Apache与MySQL-Server通信。
在web插入数据进行测试,如下是在web1界面添加数据
mysql1中可以看到插入的数据test
mysql2中同样有
六、网络链接NAS存储
输入ip访问NAS服务器的web页面,然后将nas中已经存在的文件夹挂载到mysql服务器的数据目录下即可。
使用mount挂载后,格式化了mysql数据目录下的文件,很郁闷,建议先挂载后再去安装mysql。
在NAS上开启NFS协议(NetworkFileSystem)。自带数据备份操作很简单。
1 | mount -t nfs -o nolock 172.18.74.39:/home/admin /var/lib/mysql |