- 这里介绍部署3台程序服务器做集群,再配置一台前端服务器做代理转发。3台程序服务器都是一样的系统环境(建议系统使用同一个集成环境镜像来完成安装)
- 系统环境要求为
- 系统:centos 7.6(推荐centos7.x)
- web环境:安装宝塔面板
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh
- 然后登陆面板安装Nginx1.16 + MySQL5.7 + PHP7.3 + redis.
- PHP需要安装redis扩展
- PHP禁用函数里,删除shell_exec、exec
- 集群部署具体过程主要分5个步骤说明
- 一 MySQL主从架构
- 二 redis集群
- 三 NFS共享目录
- 四 kodbox部署和配置
- 五 前端服务器使用Nginx反向代理进行转发
一 MySQL主从架构
- 参考文章
选择一主多从模式部署 - 准备三台服务器,都安装了MySQL5.7.
- 192.168.1.194(主)开放3306端口
- 192.168.1.115(从)
- 192.168.1.223(从)
- 实现步骤:
1. 配置master主服务器
- 在配置文件(/etc/my.cnf)加入如下值
server-id=1 //配置server-id,让主服务器有唯一ID号
log-bin=mysql-bin //打开Mysql日志,日志格式为二进制
skip-name-resolve //关闭名称解析,(非必须)
2. 创建复制帐号slave
- 在 Master 的数据库中建立一个备份帐户:
每个 slave 使用标准的 MySQL 用户名和密码连接 master 。进行复制操作的用户会授予 REPLICATION SLAVE 权限。
grant replication slave,replication client on *.* to slave@'192.168.%.%' identified by 'kod';
3.查看主服务器状态
- 在 Master 的数据库执行命令查看主服务器二进制日志状态及位置号。
show master status
4 配置slave从服务器
- 对 slave 进行配置,打开中继日志,指定唯一servr ID,设置只读权限。在配置文件加入如下值:
1.server-id=2 //配置server-id,让从服务器有唯一ID号
2.relay_log = mysql-relay-bin //打开Mysql日志,日志格式为二进制
3.read_only = 1 //设置只读权限
4.log_bin = mysql-bin //开启从服务器二进制日志
5.log_slave_updates = 1 //使得更新的数据写进二进制日志中
- 另外一台从服务器操作类似,省略。
5 启动从服务器复制线程
- 让 slave 连接 master ,并开始重做 master 二进制日志中的事件。master_log_file 和 master_log_pos 由上面步骤中show master status 查看,在从服务器MySQL执行以下命令:
1.mysql> change master to master_host='192.168.1.194',
2.>master_user='slave', >master_password='kod',
3.>master_log_file='mysql-bin.000001',
4.>master_log_pos=413;
- 另外一台从服务器操作类似,省略。
6 查看从服务器状态
- 可使用SHOW SLAVE STATUS\G;查看从服务器状态,也可用show processlist \G;查看当前复制状态:
Slave_IO_Running: Yes //IO线程正常运行
Slave_SQL_Running: Yes //SQL线程正常运行
二 redis集群
- 参考文章
- 环境准备:
三台机器,分别开放两个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共享目录
- 参考文章
- 简介
NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。 - Server端IP:192.168.1.194
- 安装nfs和rpcbind
yum -y install nfs-utils rpcbind
- 创建共享目录 mkdir /sharedata,
# chmod -Rf 755 /sharedata && chown -Rf www:www /sharedata
- 增加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):同步,同时将数据写入到内存与硬盘中,保证不丢失数据
- 配置hosts文件(略)
- 启动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
- 查看 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
- 客户端服务器也需要安装nfs 和 rpcbind 服务,参考服务端
- 显示NFS服务器共享目录列表
# showmount -e 192.168.1.194
Export list for 192.168.1.194:
/sharedata 192.168.1.223,192.168.1.115
- 创建挂载目录
mkdir /sharedata
- 挂载服务端的共享目录
mount -t nfs -o nolock,nfsvers=3,vers=3 192.168.1.194:/sharedata /sharedata
# nolock -- 禁用文件锁
# nfsvers=3,vers=3 -- 指定使用那个版本的NFS协议
# 查看挂载的状态
mount | grep nfs
- 开机启动NFS服务
systemctl enable nfs
- 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个程序服务器上(站点目录最好是相同的),并且./config/setting_user.php这样写
1.$config['cache']['sessionType'] = 'redis';
2.$config['cache']['cacheType'] = 'redis';
3.$config['cache']['redis']['auth'] = '123456'; //redis连接密码
4.// mysql集群
5.$config['database'] = array (
6. 'DB_DEPLOY_TYPE' => 1, // 设置分布式数据库支持
7. 'DB_RW_SEPARATE' => true, // 分布式数据库的读写是否分离
8. 'DB_TYPE' => 'mysqli', // 数据库类型
9. 'DB_HOST' => '192.168.1.194,192.168.1.115,192.168.1.223', // 数据库服务器地址
10. 'DB_NAME' => 'kodbox2', // 数据库名称
11. 'DB_USER' => 'slave,slave,slave', // 数据库用户名
12. 'DB_PWD' => 'kod', // 数据库密码
13. 'DB_PORT' => '3306,3306,3306', // 数据库端口
14. 'DB_PREFIX' => '', // 数据表前缀
15. // 'DB_MASTER_NUM' => 2
16.);
17.// // // redis集群
18.$config['cache']['redis']['mode'] = 'cluster'; // slave、sentinel、cluster 第二种(哨兵模式)暂不支持
19.$config['cache']['redis']['server'] = array(
20. '192.168.1.194:7001',
21. '192.168.1.194:7002',
22. '192.168.1.115:7003',
23. '192.168.1.115:7004',
24. '192.168.1.223:7005',
25. '192.168.1.223:7006',
26.);
部署配置选择了前面的MySQL主从和redis集群,并且需要在后台存储管理增加NFS共享目录/sharedata,才能共享存储。
- 代码上的优化点:
- 程序更新涉及多个站点,设计代码只更新一次;
- 后台存储管理调整后,前端显示更新不及时;(删除配置后刷新还有);
- 插件安装删除的同步。
五 前端服务器使用Nginx反向代理
- 前端服务器可以是另外找的一台服务器,也可也把上面3台服务器之一当作前端转发服务器。要求是编译安装Nginx,如果使用宝塔面板,下载Nginx时请选择编译安装。模块安装过程参考
#Nginx需要编译安装consistent_hash模块
#如果使用宝塔面板。可以这样安装:
cd /www/server
git clone https://github.com/replay/ngx_http_consistent_hash
cd ngx_http_consistent_hash && git submodule update --init
vim /www/server/panel/install/nginx.sh
# 找到./configure 这里后面添加--add-module=/www/server/ngx_http_consistent_hash
./configure --user=www --group=www --prefix=${Setup_Path} ${ENABLE_LUA} --add-module=/www/server/ngx_http_consistent_hash
#执行 nginx -v 查看版本号,如果是nginx 1.16,则执行
sh /www/server/panel/install/nginx.sh install 1.16
- Nginx反向代理配置
1.server
2.{
3. listen 194;
4. server_name 192.168.1.194;
5. index index.php index.html index.htm default.php default.htm;
6. root /www/wwwroot/proxy2.com;
7.
8. #PHP-INFO-START PHP引用配置,可以注释或修改
9. include enable-php-00.conf;
10. #PHP-INFO-END
11.
12. #REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
13. include /www/server/panel/vhost/rewrite/proxy2.com.conf;
14. #REWRITE-END
15.
16. location / {
17. proxy_pass http://kodCommon94;
18. proxy_set_header Host $host:$server_port;
19. index index.php index.html index.htm;
20. proxy_redirect off;
21. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
22. proxy_set_header X-Real-IP $remote_addr;
23. proxy_http_version 1.1;
24. proxy_set_header Connection "";
25. add_header backendIP $upstream_addr;
26. add_header backendCode $upstream_status;
27. proxy_headers_hash_max_size 51200;
28. proxy_headers_hash_bucket_size 6400;
29.
30.if ($kodRouter ~* "explorer/upload/fileUpload"){proxy_pass http://kodKeep94;}
31.if ($kodRouter ~* "explorer/upload/serverDownload"){proxy_pass http://kodKeep94;}
32.if ($kodRouter ~* "explorer/share/fileUpload"){proxy_pass http://kodKeep94;}
33.if ($kodRouter ~* "explorer/index/fileOut"){proxy_pass http://kodKeep94;}
34.if ($kodRouter ~* "explorer/share/fileOut"){proxy_pass http://kodKeep94;}
35.if ($kodRouter ~* "explorer/history/fileOut"){proxy_pass http://kodKeep94;}
36.if ($kodRouter ~* "explorer/share/file"){proxy_pass http://kodKeep94;}
37.if ($kodRouter ~* "explorer/index/zipDownload"){proxy_pass http://kodKeep94;}
38.if ($kodRouter ~* "explorer/share/zipDownload"){proxy_pass http://kodKeep94;}
39. }
40. access_log /www/wwwlogs/proxy2.com.log main;
41. error_log /www/wwwlogs/proxy2.com.error.log info;
42.}
43.upstream kodCommon94{
44. server 192.168.1.194:94 weight=1;
45. server 192.168.1.115:94 weight=1;
46. server 192.168.1.223:94 weight=1;
47.}
48.upstream kodKeep94{
49. server 192.168.1.194:94;
50. server 192.168.1.115:94;
51. server 192.168.1.223:94;
52. consistent_hash $kodUser;
53.}