PHP+Redis集群实现Session共享

一、redis 数据库集群安装

  1. 软件版本redis-3.2.11、php-redis-2.2.4

角色

IP 地址

 主机名

Redis 数据库服务器

192.168.1.41

Redis41

Slave 1 Redis 数据库服务器

192.168.1.42

Redis42

Slave 2 Redis 数据库服务器

192.168.1.43

Redis43

VIP 地址

192.168.1.40

 

  • 三台数据库同样配置
  1. adduser -s /sbin/nologin -d /var/lib/redis redis
  2. yum -y install gcc gcc-c++
  3. tar -xf redis-3.2.11.tar.gz
  4. cd redis-3.2.11/
  5. make MALLOC=libc   //用MALLOC这个 环境变量去编译Redis,而且libc 并不是默认的 分配器,默认的是 jemalloc
  6. make PREFIX=/usr/local/redis install    //指定安装路径
  7. mkdir -p /usr/local/redis/conf
  8. cp redis.conf /usr/local/redis/conf/    
  9. cp sentinel.conf /usr/local/redis/conf/ 
  • 常用配置选项/usr/local/redis/conf/redis.conf
  1. – port 6379     // 端口
  2. – bind 192.168.1.41     //IP 地址
  3. – tcp-backlog 511     //tcp 连接总数
  4. – timeout 0     // 连接超时时间
  5. – tcp-keepalive 300     // 长连接时间
  6. – daemonize yes     // 守护进程方式运行
  7. – databases 16     // 数据库个数
  8. – logfile /var/log/redis_6379.log     //pid 文件
  9. – maxclients 10000     // 并发连接数量
  10. – dir /var/lib/redis/6379    // 数据库目录
  • 配置Redis能够让systemclt系统管理(非必须)
  1. vim /usr/lib/systemd/system/redis.server
[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
User=redis
Group=redis
Type=simple
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
ExecStop=/usr/local/redis/bin/redis-cli shutdown
Restart=always
RestartSec=42s

[Install]
WantedBy=multi-user.target

二、安装 php-redis 扩展

  • 配置 php 支持 Redis
  1. tar zxvf phpredis-2.2.4.tar.gz   
  2. cd phpredis-2.2.4    
  3. /usr/local/php/bin/phpize    //用phpize生成configure配置文件
  4. ./configure --enable-redis --with-php-config=/usr/local/php/bin/php-config  
  5. make && make install    
  6. php -m |grep redis
  • 编写测试文件 redis.php 进行页面测试
connect('192.168.1.41',6379);
$redis->set('redistest','666666');
echo $redis->get('redistest');
?>

三、redis 服务器集群高可用

  • redis集群实现大概有以下几种方式
  1. redis-cluster,  官方提供的集群搭建方案(过于重量级,比较适合后期数据量较大的时候的使用)
  2. redis+keepalive  虚拟IP,多台配置非常复杂,不宜维护,需要 slaveof no one 脚本
  3. redis+zookeeper  需要引入zookeeper,对现有代码变动较大
  4. redis+sentinel   redis自带监控中间件,哨兵模式
  • 配置三台 redis 服务器
  1. 配置主从关系,在 slave 上添加配置
  2. slaveof 192.168.1.41 6379
  3. 查看集群主从关系
  4. redis-cli -h 192.168.1.41 -p 6379 info replication
  • 修改 redis 哨兵配置文件 sentinel.conf
  1. bind 192.168.1.41
  2. protected-mode no
  3. daemonize yes
  4. port 26379
  5. dir /tmp
  6. sentinel monitor mymaster 192.168.1.41 6379 2
  7. sentinel down-after-milliseconds mymaster 3000
  8. sentinel parallel-syncs mymaster 1
  9. sentinel failover-timeout mymaster 5000
  10. sentinel client-reconfig-script mymaster /usr/local/redis/conf/reconfig.sh
  11. 分别在主,从上启动 sentinel
  12. redis-sentinel /usr/local/redis/conf/sentinel.conf
  13. 查看哨兵状态
  14. redis-cli -h 192.168.1.41 -p 26379 info sentinel

四、客户端兼容问题

        客户端程序(如PHP程序)连接redis时需要ip和port,但redis-server进行故障转移时,主数据库是变化的,所以ip地址也是变化的,客户端程序如何感知当前主redis的ip地址和端口呢?
        redis-sentinel提供了接口,请求任何一个sentinel,发送SENTINEL get-master-addr-by-name 就能得到当前主redis的ip和port。

  • 解决方案:

    增加配置切换脚本 sentinel.conf,当主数据库服务宕机时,实现VIP漂移自动切换主从。
    sentinel client-reconfig-script mymaster /usr/local/redis/conf/reconfig.sh

#!/bin/bash
#mymaster leader start 192.168.1.41 6379 192.168.1.42 6379
VIP="192.168.1.40/24"
local_ip=$(ip  addr show dev eth0 |awk '$1=="inet"{print $2}')
if [[ "${local_ip%%/*}" == "$4" ]];then
   /usr/sbin/ifconfig eth0:1 down
elif [[ "${local_ip%%/*}" == "$6" ]];then
   /usr/sbin/ifconfig eth0:1 "${VIP}"
fi

 

你可能感兴趣的:(DB)