Thinkphp5.0 session 分布式部署

来源:互联网 发布:10档行情软件 编辑:程序博客网 时间:2024/06/05 20:01

要实现的功能 :部署高可用web服务

项目架构图:



在一个集群中部署2套web_server服务,通过lvs负载均衡提供一个虚拟IP,供用户访问。

用redis存储session,提高系统可用性。

数据库采用主主同步方式,利用keepalived做容灾处理。

一、

web_server 使用PHP语言,利用TP5.0框架。

application\config.php session 设置为session存储。

    'session' => [        'expire'        =>      3600,        // SESSION失效时间        'id'            =>      '',        // SESSION_ID的提交变量,解决flash上传跨域        'var_session_id'=>      '',        // SESSION 前缀        'prefix'        =>      'think',        // 驱动方式 支持redis memcache memcached        'type'          =>      'redis',        // 是否自动开启 SESSION        'auto_start'    =>      true,        //redis 主机        'host'          =>      '127.0.0.1',        //redis 端口        'port'          =>      6379,        // 密码        'password'      =>      'password',    ],

linux 安装redis(自行Google)

php 安装redis扩展(自行Google)

调用登录接口 能成功登录。登录redis客户端进行验证。keys * 可以看到huo5552v3duh5opdkr4logti93 类似这样一个key.get huo5552v3duh5opdkr4logti93可以查看具体存储的session。

二、

利用keepalived实现redis双主热备

以下参考http://huangzhijun.blog.51cto.com/482881/1725606/ 并根据自己实践做了修改

1、方案:使用keepalived + 监控脚本实现主备切换。2、设计思路:1)当 Master 与 Slave 均运作正常时, Master负责服务,Slave负责Standby;2)当 Master 挂掉,Slave 正常时, Slave接管服务,同时关闭主从复制功能;3)当 Master 恢复正常,则从Slave同步数据,同步数据之后关闭主从复制功能,恢复Master身份,于此同时Slave等待Master同步数据完成之后,恢复Slave身份。3、操作步骤10.95.40.12  master10.95.40.14  slave10.95.40.99  虚拟IP (ping 选一个不存在的ip)1)两台主机分别安装rediswget http://download.redis.io/releases/redis-2.8.3.tar.gztar -xzvf redis-2.8.3.tar.gzcd redis-2.8.3make编译成功mkdir /usr/local/rediscp src/redis-server /usr/local/rediscp src/redis-cli /usr/local/rediscp src/redis-benchmark /usr/local/rediscp redis.conf /usr/local/redis (redis.conf 在 src 目录的上一层)修改redis 配置文件开启远程登录,暂不开启密码验证。vim redis.conf #requirepass 360redis  注释掉#bind 127.0.0.1 注视掉protected-mode no 设置为 noredis-server redis.conf  需要制定配置文件redis-cli  连接测试2) 两台主机分别安装keepalivedyum -y install keepalived修改keepalived的配置文件vim /etc/keepalived/keepalived.confMaster即 10.95.40.12! Configuration File for keepalivedglobal_defs {   notification_email {     acassen@firewall.loc     failover@firewall.loc     sysadmin@firewall.loc   }   notification_email_from Alexandre.Cassen@firewall.loc   smtp_server 127.0.0.1   smtp_connect_timeout 30   router_id LVS_DEVEL}vrrp_script chk_redis {    script "/etc/keepalived/scripts/redis_check.sh"    interval 2}vrrp_instance VI_1 {    state MASTER    interface eth0    virtual_router_id 51    priority 100    advert_int 1    authentication {        auth_type PASS        auth_pass 360redis    }    track_script {        chk_redis    }    virtual_ipaddress {        10.95.40.99    }    notify_master /etc/keepalived/scripts/redis_master.sh    notify_backup /etc/keepalived/scripts/redis_backup.sh    notify_fault  /etc/keepalived/scripts/redis_fault.sh    notify_stop   /etc/keepalived/scripts/redis_stop.sh}mkdir scripts 编写检查脚本touch redis_check.shvim redis_check.sh#!/bin/bashnetstat -ntlp | grep 6379if  [ "$?" == "0" ]; then    echo $?    exit 0else    echo $?    exit 1fivim redis_master.shEDISCLI="/usr/local/redis/redis-cli"LOGFILE="/var/log/keepalived-redis-state.log"echo "[master]" >> $LOGFILEdate >> $LOGFILEecho  "Being master...."  >> $LOGFILE 2>&1echo  "Run SLAVEOF cmd ..."  >> $LOGFILE$REDISCLI SLAVEOF 10.95.40.14  6379 >>  $LOGFILE  2>&1sleep 10  #延迟10秒以后待数据同步完成后再取消同步状态echo "Run SLAVEOF NO ONE cmd ..."  >> $LOGFILE$REDISCLI SLAVEOF NO ONE  >> $LOGFILE   2>&1vim redis_backup.sh#!/bin/bashREDISCLI="/usr/local/redis/redis-cli"LOGFILE="/var/log/keepalived-redis-state.log"echo "[backup]" >> $LOGFILEdate >> $LOGFILEecho "Being slave...." >> $LOGFILE 2>&1sleep 15 # 延迟15秒待数据被对方同步完成之后再切换主从角色echo "Run SLAVEOF cmd ..." >> $LOGFILE$REDISCLI SLAVEOF 10.95.40.14 6379 >> $LOGFILE 2>&1vim redis_fault.sh#!/bin/bashLOGFILE=/var/log/keepalived-redis-state.logecho "[fault]" >> $LOGFILEdate >> $LOGFILEvim redis_stop.sh#!/bin/bashLOGFILE=/var/log/keepalived-redis-state.logecho  "[stop]">> $LOGFILEdate >> $LOGFILESlave即 10.95.40.14vim /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs {   notification_email {     acassen@firewall.loc     failover@firewall.loc     sysadmin@firewall.loc   }   notification_email_from Alexandre.Cassen@firewall.loc   smtp_server 127.0.0.1   smtp_connect_timeout 30   router_id LVS_DEVEL}vrrp_script  chk_redis  {    script "/etc/keepalived/scripts/redis_check.sh"      interval  2  }vrrp_instance VI_1 {    state BACKUP    interface eth0    virtual_router_id 51    priority 99    advert_int 1    authentication {        auth_type PASS        auth_pass 360redis    }    track_script  {        chk_redis      }    virtual_ipaddress {        10.95.40.99    }    notify_master    /etc/keepalived/scripts/redis_master.sh    notify_backup    /etc/keepalived/scripts/redis_backup.sh    notify_fault     /etc/keepalived/scripts/redis_fault.sh    notify_stop      /etc/keepalived/scripts/redis_stop.sh }同样创建scripts文件夹redis_check.shredis_fault.shredis_stop.sh文件同Master 文件vim redis_master.sh#!/bin/bashREDISCLI="/usr/local/redis/redis-cli"LOGFILE="/var/log/keepalived-redis-state.log"echo "[master]" >> $LOGFILEdate >> $LOGFILEecho "Being master...." >> $LOGFILE2>&1echo "Run SLAVEOF cmd ..." >>$LOGFILE$REDISCLI  SLAVEOF 10.95.40.12 6379 >> $LOGFILE 2>&1sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1vim redis_backup.sh#!/bin/bashREDISCLI="/usr/local/redis/redis-cli"LOGFILE="/var/log/keepalived-redis-state.log"echo "[backup]" >> $LOGFILEdate >> $LOGFILEecho "Being slave...." >> $LOGFILE 2>&1sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色echo "Run SLAVEOF cmd ..." >> $LOGFILE$REDISCLI SLAVEOF 10.95.40.12 6379 >> $LOGFILE 2>&13)启动redis 和 keepalived redis-server redis.confservice keeplived start4)测试ip add 查看 主节点是否多了虚拟IP 10.95.40.99 redis-cli -h 10.95.40.99 测试redis 是否可以连接成功停止 主节点redis 服务 看redis 客户端是否还可以连接通查看从节点是否多了虚拟IP 10.95.40.99 5)遗留问题   是否可以设置redis 密码 修改redis.conf   requirepass 360redis  修改 Master 和 Slave 的sh脚本 $REDISCLI  SLAVEOF 10.95.40.12 6379 -a 360redis>> $LOGFILE 2>&1  SLAVEOF 命令不存在

三、利用keepalived 实现mysql数据库双主热备。