• 集群部署方案说明.md dd 11.75 kB 2021-05-08 15:55
  • Position: 集群部署方案说明.md

    * 这里介绍部署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;
        }
    ```
    
    
    

    Powered by kodbox V1.36

    Copyright © kodcloud.com.

    Files