haloi 发表于 2017-12-21 08:35:35

redis实现session共享,哨兵

  一、Redis介绍
  1、redis是key-value的存储系统,属于非关系型数据库
  2、特点:支持数据持久化,可以让数据在内存中保存到磁盘里(memcached:数据存在内存里,如果服务重启,数据会丢失)
  3、支持5种数据类型:string,hash,list,set,zset
  4、两种文件格式(即数据持久化)
  (1)RDB(全量数据):多长时间/频率,把内存中的数据刷到磁盘中,便于下次读取文件时进行加载
  (2)AOF(增量请求):类似mysql的二进制日志,不停地把对数据库的更改语句记录到日志中,下次重启服务,会根据二进制日志把数据重写一次,加载到内存里,实现数据持久化
  5、存储
  (1)内存存储 (2)磁盘存储(RDB)(3)log文件(AOF)
  二、Redis安装
  1、下载 redis-2.8.21.tar.gz
  2、解压:tar zxvf redis-2.8.21.tar.gz
  3、cd redis-2.8.21
  4、编译:make
  5、安装: make PREFIX=/usr/local/redis install
  6、创建配置文件所在的目录:mkdir /usr/local/redis/etc
  7、网上下载配置文件 redis.conf,放到 6 创建的目录下
  8、创建启动脚本 /etc/init.d/redis
  9、添加redis用户:useradd -s /sbin/nologin redis
  10、创建var目录,放置redis 的pid,rdb文件:mkdir /usr/local/redis/var
  11、修改var目录和配置文件权限
  (1)chmod 777 /usr/local/redis/var
  (2)chmod 755 /etc/init.d/redis
  12、启动redis:service redis start
  13、ps aux | grep redis      ——》 监听6379端口
  三、php应用redis
  前提:已经搭建了LAMP网站架构
  php不能直接连redis,需要redis模块的支持(redis是和开发语言结合使用的)

1、Redis扩展模块安装
(1)下载 phpredis.zip
(2)解压:unzip phpredis.zip
(3)cd phpredis-develop/
(4)/usr/local/php/bin/phpize   ——》生成 configure文件
(5)编译redis.so的模块
./configure --with-php-config=/usr/local/php/bin/php-config
(6)make && make install
(7)检查是否有redis.so文件
ls /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/
——》 redis.so
(8)编辑php.ini配置文件
最后1行加上
extension=redis.so
(9)php检查是否加载了redis.so模块
/usr/local/php/bin/php -m |grep redis
——》redis
2、Redis 实现session共享
(1)apache测试目录下创建info.php ——》 调用 phpinfo() 函数
(2)apache虚拟主机配置文件(extra目录下)或者主配置文件httpd.conf 中定义
session存储的处理方式和存储路径
(a)php_value session.save_handler "redis"
(b)php_value session.save_path "tcp://127.0.0.1:6379"
ps: 还有另外两种方法
1、php的全局配置文件php.ini添加上面2行
2、如果是lnmp架构
php-fpm.conf对应的pool中加入
php_value = redis
php_value = "tcp://127.0.0.1:6379"
(3)重启apachectl
/usr/local/apache2/bin/apachectl restart
(4)浏览器访问:192.168.131.110/info.php
  说明配置已经生效
  3、Redis 存储session 测试
  (1)进入apache的htdoc下
  (2)创建session.php
  

<?php  

   ();  

   if (!isset($_SESSION['TEST'])) {  

         $_SESSION['TEST'] = ();  

   }  

   $_SESSION['TEST3'] = ();  

   print $_SESSION['TEST'];  

   print "<br><br>";  

   print $_SESSION['TEST3'];  

   print "<br><br>";  

   print ();  

?>  

  (3)测试——》 记得去掉redis配置文件中的密码设置,否则会返回500授权错误
  (a)curl localhost/session.php

  (b)redis-cli——》 在家目录的.bashrc加入了redis启动目录

  说明session已经存入到redis里了
  四、redis的一些题外话
  redis一些重点
  1、主从
  2、持久化
  3、哨兵实现主从切换
  4、sentinel原理 (2.8.0之后有这个功能 sentinel.conf)
  5、数据类型: hash,string 用得多
  着重讲下哨兵
  1、支持redis协议
  2、原理简单描述
  所有服务器都部署哨兵,哨兵去监控主从,要是redis或者哨兵死了,另外所有的机器会重新投票(就是下图6379后面的数字,比如2),投死那台挂掉的机器(2台机器投票确认机器死了),再在另外所有的机器上自成一个体系,重新生成主

  3、重点
  (1)哨兵的配置文件也就是sentinel.conf是时时发生变化的
  当主被投票死掉后,从起来于是产生一个新的主ip,新主会变成配置文件master的ip
  (2)redis的配置文件也会改变
  (3)当已死的主恢复后,就变成了从
  (4)哨兵一定要是单数,否则选举易出现问题,偶数可能会同票
  4、几个问题
  (1)什么时候用redis?

所有的web第一次请求,先从db上取,取到的结果再返回给客户端的同时也写到redis去,
当再次用到这个结果时就从redis取,不需要再从db上取(很慢)
(2)什么时候用redis高可用,也就是哨兵?
所有的研发程序需要连主(可写),从(只读)是写不进去东西的
主redis有一个vip或者直连它的物理ip,研发程序直连redis写东西时,
redis主挂了,哨兵就起到作用
redis取不到数据,就从db上取——》程序做的,自动的降级
如果程序没有做降级,redis主挂了,线上所有涉及到在redis写的业务都用不了 ——》 所以就要用哨兵
页: [1]
查看完整版本: redis实现session共享,哨兵