* 这里介绍部署3台程序服务器做集群,再配置一台前端服务器做代理转发。3台程序服务器都是一样的系统环境(建议系统使用同一个集成环境镜像来完成安装)
* 系统环境要求为
* 系统:centos 7.9(推荐选择centos7.6以上)
* web环境:[安装宝塔面板](https://www.bt.cn/bbs/thread-19376-1-1.html)(非必须)
```
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh
```
* 然后登陆面板安装Nginx1.18 + MySQL5.7 + PHP7.3 + redis.
* PHP需要安装redis扩展
* PHP禁用函数里,删除shell_exec、exec
* 集群部署具体过程主要分5个步骤说明
* 一 MySQL主从架构
* 二 redis集群
* 三 NFS共享目录
* 四 kodbox部署和配置
* 五 前端服务器使用Nginx反向代理进行转发
##### 一 MySQL主从架构
* [参考文章](https://www.cnblogs.com/keerya/p/7873502.html)
选择一主多从模式部署
* 准备三台服务器,都安装了MySQL5.7.
* 192.168.1.181(主)开放3306端口
* 192.168.1.182(从)
* 192.168.1.183(从)
* 实现步骤:
##### 1. 配置master主服务器
* 在配置文件(/etc/my.cnf)加入如下值
```
server-id=1 //配置server-id,让主服务器有唯一ID号
log-bin=mysql-bin //打开Mysql日志,日志格式为二进制
binlog_format = mixed //大多数情况下,是以statement格式记录binlog日志,当隔离级别为RC模式的时候,则修改为row模式
skip-name-resolve //关闭名称解析,(非必须)
```
##### 2. 创建复制帐号slave
* 在 Master 的数据库中建立一个备份帐户:
每个 slave 使用标准的 MySQL 用户名和密码连接 master 。进行复制操作的用户会授予 **REPLICATION SLAVE** 权限。
```
grant replication slave,replication client on *.* to slave@'192.168.%.%' identified by 'password';
```
##### 3.查看主服务器状态
* 在 Master 的数据库执行命令查看主服务器二进制日志状态及位置号。
```
show master status
```
##### 4 配置slave从服务器
* 对 slave 进行配置,打开中继日志,指定唯一servr ID,设置只读权限。在配置文件加入如下值:
```
server-id=2 //配置server-id,让从服务器有唯一ID号
relay_log = mysql-relay-bin //打开Mysql日志,日志格式为二进制
read_only = 1 //设置只读权限
log_bin = mysql-bin //开启从服务器二进制日志
binlog_format = mixed
log_slave_updates = 1 //使得更新的数据写进二进制日志中
```
* 另外一台从服务器操作类似,省略。
##### 5 启动从服务器复制线程
* 让 slave 连接 master ,并开始重做 master 二进制日志中的事件。*master_log_file* 和 *master_log_pos* 由上面步骤中*show master status* 查看,在从服务器MySQL执行以下命令:
```
mysql> change master to master_host='192.168.1.181',
master_user='slave',
master_password='password',
master_log_file='mysql-bin.000001',
master_log_pos=413;
```
* 另外一台从服务器操作类似,省略。
##### 6 查看从服务器状态
* 可使用*SHOW SLAVE STATUS\G*;查看从服务器状态,也可用*show processlist \G*;查看当前复制状态:
```
Slave_IO_Running: Yes //IO线程正常运行
Slave_SQL_Running: Yes //SQL线程正常运行
```
##### 二 redis集群
* [参考文章](https://blog.csdn.net/miss1181248983/article/details/90056960)
* 环境准备:
三台机器,分别开放两个redis服务端口和一个客户端通讯端口
```
192.168.1.194 端口:7001,7002 17001
192.168.1.115 端口:7003,7004 17003
192.168.1.223 端口:7005,7006 17005
```
* 修改配置文件:
192.168.1.194
```
1.mkdir /www/server/redis/cluster
2.cp /www/server/redis/redis.conf /www/server/redis/cluster/redis_7001.conf
3.cp /www/server/redis/redis.conf /www/server/redis/cluster/redis_7002.conf
4.chown -R redis:redis /www/server/redis # mkdir -p /tmp/{redis_7001,redis_7002} && chown -R redis:redis /tmp/{redis_7001,redis_7002}
1.# vim /www/server/redis/cluster/redis_7001.conf
2.bind 192.168.1.194 port 7001
3.daemonize yes
4.pidfile "/var/run/redis_7001.pid"
5.logfile "/www/server/redis/cluster/redis_7001.log"
6.dir "/tmp/redis_7001"
7.masterauth 123456
8.requirepass 123456
9.appendonly yes
10.cluster-enabled yes
11.cluster-config-file nodes_7001.conf cluster-node-timeout 15000
12.# vim /www/server/redis/cluster/redis_7002.conf
13.bind 192.168.1.194 port 7002
14.daemonize yes
15.pidfile "/var/run/redis_7002.pid"
16.logfile "/www/server/redis/cluster/redis_7002.log"
17.dir "/tmp/redis_7002"
18.masterauth "123456"
19.requirepass "123456"
20.appendonly yes
21.cluster-enabled yes
22.cluster-config-file nodes_7002.conf
23.cluster-node-timeout 15000
```
其它两台机器配置与192.168.1.194配置类似,只是端口不同,此处省略
* 启动redis服务和查看日志:
```
1./www/server/redis/src/redis-server /www/server/redis/cluster/redis_7001.conf
2.tail -f /www/server/redis/cluster/redis_7001.log
3./www/server/redis/src/redis-server /www/server/redis/cluster/redis_7002.conf
4.# tail -f /www/server/redis/cluster/redis_7002.log
```
其它两台机器配置与192.168.1.194类似,此处省略
* 创建集群:
```
redis-cli -a 123456 --cluster create 192.168.1.194:7001 192.168.1.194:7002 192.168.1.115:7003 192.168.1.115:7004 192.168.1.223:7005 192.168.1.223:7006 --cluster-replicas 1
Can I set the above configuration? (type 'yes' to accept): yes
#输入yes,接受上面配置
```
执行成功可以知道,
```
192.168.1.194:7001是master,它的slave是192.168.1.194:7004
192.168.1.115:7003是master,它的slave是192.168.1.115:7006
192.168.1.223:7005是master,它的slave是192.168.1.223:7002
```
自动生成nodes.conf文件:
```
# ls /tmp/redis_7001/
appendonly.aof dump.rdb nodes-7001.conf
```
* 集群操作
* 登录集群:
```
# redis-cli -c -h 192.168.1.194 -p 7001 -a 123456 # -c,使用集群方式登录
```
* 增加设置节点.......待补充
##### 三 NFS共享目录
* [参考文章](https://blog.csdn.net/Duke147/article/details/87810417)
* 简介
NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。
* **Server端IP:192.168.1.194**
1. 安装nfs和rpcbind
```
yum -y install nfs-utils rpcbind
```
2. 创建共享目录 mkdir /sharedata,
```
# chmod -Rf 755 /sharedata && chown -Rf www:www /sharedata
```
3. 增加nfs配置文件
```
#vim /etc/exports
/sharedata 192.168.1.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000)
exportfs -rv -- 加载配置生效,等价于重启 /etc/init.d/nfs reload
/sharedata:共享文件夹
192.168.1.0/24:可以挂载服务器目录的客户端ip网段192.168.1.0,子网掩码255.255.255.0
(all_squash):不管访问NFS server共享目录的用户身份如何,它的权限都将被压缩成匿名用户。
(anonuid=1000,anongid=1000):UID和GID,这里代表是www
(rw):该客户端对共享的文件具有读写权限
(sync):同步,同时将数据写入到内存与硬盘中,保证不丢失数据
```
4. 配置hosts文件(略)
5. 启动nfs和rpcbind服务
必须先启动rpcbind,再启动nfs,才能让NFS在rpcbind上注册成功
```
service rpcbind start
service nfs start
#查看启动状态:
service rpcbind status
service nfs status
#注意,RPC的状态是Active: active (running);而NFS的状态是Active: active (exited)。
#查看自己共享的服务:
# showmount -e
/sharedata 192.168.1.223,192.168.1.115
```
6. 查看 RPC 服务的注册状况
```
rpcinfo -p localhost
#NFS服务使用的111和2049端口是固定的,mountd端口是动态的,需要固定,然后在防火墙放行。
#6.1 固定端口
vi /etc/sysconfig/nfs
#1.添加:
RQUOTAD_PORT=30001
LOCKD_TCPPORT=30002
LOCKD_UDPPORT=30002
MOUNTD_PORT=30003
STATD_PORT=30004
#2.重启nfs和rpcbind:
service rpcbind restart
service nfs restart
#6.2防火墙放行端口 111、2049、30001-30004
```
* **Client端**:192.168.1.115,192.168.1.223
1. 客户端服务器也需要安装nfs 和 rpcbind 服务,参考服务端
2. 显示NFS服务器共享目录列表
```
# showmount -e 192.168.1.194
Export list for 192.168.1.194:
/sharedata 192.168.1.223,192.168.1.115
```
3. 创建挂载目录
```
mkdir /sharedata
```
4. 挂载服务端的共享目录
```
mount -t nfs -o nolock,nfsvers=3,vers=3 192.168.1.194:/sharedata /sharedata
# nolock -- 禁用文件锁
# nfsvers=3,vers=3 -- 指定使用那个版本的NFS协议
# 查看挂载的状态
mount | grep nfs
```
5. 开机启动NFS服务
```
systemctl enable nfs
```
6. NFS开机自动挂载
```
#系统服务未完全启动,挂载会失败,在系统启动以后,再挂载
# chmod +x /etc/rc.d/rc.local
#vim /etc/rc.d/rc.local
sleep 30
mount -t nfs 192.168.1.194:/sharedata /sharedata
```
##### 四 kodbox部署和配置
* 部署kodbox到3个程序服务器上,站点目录使用NFS共享目录,只部署一次,选择master数据库地址。部署完成后手动修改./config/setting_user.php
```
$config['cache']['sessionType']='redis';
$config['cache']['cacheType']='redis';
$config['cache']['redis']['auth']='123456';//redis连接密码
//mysql集群
$config['database']=array(
'DB_DEPLOY_TYPE'=>1,//设置分布式数据库支持
'DB_RW_SEPARATE'=>true,//分布式数据库的读写是否分离
'DB_TYPE'=>'mysqli',//数据库类型
'DB_HOST'=>'192.168.1.194,192.168.1.115,192.168.1.223',//数据库服务器地址
'DB_NAME'=>'kodbox2',//数据库名称
'DB_USER'=>'slave,slave,slave',//数据库用户名
'DB_PWD'=>'kod',//数据库密码
'DB_PORT'=>'3306,3306,3306',//数据库端口
'DB_PREFIX'=>'',//数据表前缀
'DB_SLAVE_NO' => '',
//'DB_MASTER_NUM'=>2
);
//redis集群
$config['cache']['redis']['mode'] = 'cluster'; // slave、sentinel、cluster 第二种(哨兵模式)暂不支持
$config['cache']['redis']['server'] = array(
'192.168.1.194:7001',
'192.168.1.194:7002',
'192.168.1.115:7003',
'192.168.1.115:7004',
'192.168.1.223:7005',
'192.168.1.223:7006',
);
```
部署配置选择了前面的MySQL主从和redis集群。
##### 五 前端服务器使用Nginx反向代理
* 前端服务器可以是另外找的一台服务器,也可也把上面3台服务器之一当作前端转发服务器。
* Nginx反向代理配置(仅供参考)
```
server
{
listen 194;
server_name 192.168.1.194;
client_max_body_size 0;
proxy_buffering off;
location / {
proxy_pass http://kodCommon94;
proxy_set_header Host $host:$server_port;
proxy_redirect off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 3600;
access_log /www/wwwlogs/proxy.com.log main;
error_log /www/wwwlogs/proxy.com.error.log info;
}
}
upstream kodCommon94{
server 192.168.1.194:94 weight=1;
server 192.168.1.115:94 weight=1;
server 192.168.1.223:94 weight=1;
}
```