Thinkphp5.0 session 分布式部署

要实现的功能 :部署高可用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  master
10.95.40.14  slave
10.95.40.99  虚拟IP (ping 选一个不存在的ip)
1)两台主机分别安装redis
wget http://download.redis.io/releases/redis-2.8.3.tar.gz
tar -xzvf redis-2.8.3.tar.gz
cd redis-2.8.3
make
编译成功
mkdir /usr/local/redis
cp src/redis-server /usr/local/redis
cp src/redis-cli /usr/local/redis
cp src/redis-benchmark /usr/local/redis
cp redis.conf /usr/local/redis (redis.conf 在 src 目录的上一层)

修改redis 配置文件开启远程登录,暂不开启密码验证。
vim redis.conf 
#requirepass 360redis  注释掉
#bind 127.0.0.1 注视掉
protected-mode no 设置为 no

redis-server redis.conf  需要制定配置文件
redis-cli  连接测试

2) 两台主机分别安装keepalived
yum -y install keepalived
修改keepalived的配置文件
vim /etc/keepalived/keepalived.conf
Master即 10.95.40.12

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   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.sh
vim redis_check.sh

#!/bin/bash
netstat -ntlp | grep 6379
if  [ "$?" == "0" ]; then
    echo $?
    exit 0
else
    echo $?
    exit 1
fi


vim redis_master.sh


EDISCLI="/usr/local/redis/redis-cli"
LOGFILE="/var/log/keepalived-redis-state.log"
echo "[master]" >> $LOGFILE
date >> $LOGFILE
echo  "Being master...."  >> $LOGFILE 2>&1
echo  "Run SLAVEOF cmd ..."  >> $LOGFILE
$REDISCLI SLAVEOF 10.95.40.14  6379 >>  $LOGFILE  2>&1
sleep 10  #延迟10秒以后待数据同步完成后再取消同步状态
echo "Run SLAVEOF NO ONE cmd ..."  >> $LOGFILE
$REDISCLI SLAVEOF NO ONE  >> $LOGFILE   2>&1

vim redis_backup.sh

#!/bin/bash
REDISCLI="/usr/local/redis/redis-cli"
LOGFILE="/var/log/keepalived-redis-state.log"
echo "[backup]" >> $LOGFILE
date >> $LOGFILE
echo "Being slave...." >> $LOGFILE 2>&1
sleep 15 # 延迟15秒待数据被对方同步完成之后再切换主从角色
echo "Run SLAVEOF cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF 10.95.40.14 6379 >> $LOGFILE 2>&1

vim redis_fault.sh


#!/bin/bash
LOGFILE=/var/log/keepalived-redis-state.log
echo "[fault]" >> $LOGFILE
date >> $LOGFILE

vim redis_stop.sh


#!/bin/bash
LOGFILE=/var/log/keepalived-redis-state.log
echo  "[stop]">> $LOGFILE
date >> $LOGFILE


Slave即 10.95.40.14
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   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.sh
redis_fault.sh
redis_stop.sh
文件同Master 文件
vim redis_master.sh
#!/bin/bash
REDISCLI="/usr/local/redis/redis-cli"
LOGFILE="/var/log/keepalived-redis-state.log"
echo "[master]" >> $LOGFILE
date >> $LOGFILE
echo "Being master...." >> $LOGFILE2>&1
echo "Run SLAVEOF cmd ..." >>$LOGFILE
$REDISCLI  SLAVEOF 10.95.40.12 6379 >> $LOGFILE 2>&1
sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态
echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1

vim redis_backup.sh
#!/bin/bash
REDISCLI="/usr/local/redis/redis-cli"
LOGFILE="/var/log/keepalived-redis-state.log"
echo "[backup]" >> $LOGFILE
date >> $LOGFILE
echo "Being slave...." >> $LOGFILE 2>&1
sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色
echo "Run SLAVEOF cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF 10.95.40.12 6379 >> $LOGFILE 2>&1

3)启动redis 和 keepalived 
redis-server redis.conf
service keeplived start

4)测试
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数据库双主热备。


你可能感兴趣的:(Thinkphp5.0 session 分布式部署)