php memcache集群中的session

发布于:2014-1-9 8:56 作者:admin 浏览:2819 分类:系统架构

传统的session是以文件形式存储于服务器端的,但是当处于集群环境时,客户端访问的可能是任意服务器中的一台,也就是说不一定此时session文件就存在于此台服务器上,自然也就访问不到session了。

过去的解决办法一般是通过数据库来存储session的方式来解决,这样就可以实现跨服务器的session共享了,但与之而来的问题就是对数据库频繁访问所造成的问题了。

所以我们要用memcache来解决这个问题!

1.首先安装memcache,以及memcache在php中的扩展

2.修改php.ini文件

session.save_handler = memcache
session.save_path = “tcp://127.0.0.1:11211″

或者memcached

session.save_handler = memcached

session.save_path = "127.0.0.1:11211"


或者在php代码里面实现

ini_set('session.save_handler', 'memcache');
ini_set('session.save_path', 'tcp://192.168.0.1:10001?persistent=1&weight=1&timeout=1&retry_interval=15,tcp://192.168.0.2:10002?persistent=1&weight=1&timeout=1&retry_interval=15');

session_start();

使用多个 memcached server 时用逗号”,”隔开,并且和 Memcache::addServer() 文档中说明的一样,可以带额外的参数”persistent”、”weight”、”timeout”、”retry_interval” 等等,类似这样的:”tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2″ 。

3.大功告成,重启apache和memcache看看phpinfo里的session配置是不是变成了memcache了。


memcache 集群不用怎么设置直接用:

  addServer($ip,$port);
  addServer($ip,$port);

  addServer($ip,$port);


memcached 集群不用怎么设置直接用:

  $m = new Memcached();
  $servers = array(
      array(
'mem1.domain.com'1121133),
      array(
'mem2.domain.com'1121167)
  );
  $m->addServers($servers);


demo 页面一

<?php

session_start();


$_SESSION['TEST'] = time();

$_SESSION['TEST2'] = 'test2';


echo session_id();


$mem = new Memcache();

$mem->addServer('127.0.0.1',11211);

$mem->addServer('localhost',11211);


echo '<hr>';

print_r($mem->get(session_id()));

?>


<a href="./memcache-session2.php" target="_balnk">页面2</a>


demo 页面二

<?php

session_start();

print_r($_SESSION);


结果:正确


注:memcached 方式

ini_set("session.save_handler", "memcached"); // 是memcached不是memcache

ini_set("session.save_path", "127.0.0.1:11211"); // 不要tcp:

 

 

 

 

1.在session的存储服务器上安装 redis 

2,修改php.ini配置

 
  1. session.save_handler = redis  
  2. session.save_path = "tcp://127.0.0.1:6379"  

3,查看redis的php扩展

 

四,session存储到redis中测试

 
  1. <?php  
  2. session_start();  
  3. $_SESSION['redis'] = "aaaaaa";  
  4. echo session_id();  
  5. echo "<br>";  
  6. echo $_SESSION['redis'];  
  7. echo "<br>";  
  8. $redis = new redis();  
  9. $redis->connect('127.0.0.1', 6379);  
  10. echo $redis->get("PHPREDIS_SESSION:".session_id()); 
  11. ?>  
 

标签: session memcache

0

SESSION集群

发布于:2014-1-9 8:13 作者:admin 浏览:1539 分类:系统架构

1. 客户端cookie加密
   优点:简单,高效。比较好的方法是自己采用cookie机制来实现一个session,在应用中使用此session实现。客户端解决方法.把session加密后存在cookie中,每次session信息被写在客服端,然后经浏览器再次提交到服务器.即使两次请求在集群中的两台服务器上完成,也可以到达session共享.这种解决方法的优点是session信息不用存放在服务器端,大大减轻了服务器的压力.另一个优点是一个session中的两次或多次请求可以在一个群集中的多个服务器上完成,可以避免单端故障..
   缺点:缺点是由于受http协议头信心长度的限制,仅能够存储小部分的用户信息,同时Cookie化的 Session内容需要进行安全加解密(如:采用DES、RSA等进行明文加解密;再由MD5、SHA-1等算法进行防伪认证),另外它也会占用一定的带宽资源,因为浏览器会在请求当前域名下任何资源时将本地Cookie附加在http头中传递到服务器。  


2. 使用共享存储来保存session
   优点:使用nfs或windows文件共享都可以,或者专用的共享存储设备。
   缺点:因为是网络磁盘,访问量大的时候IO存在瓶颈。共享存储是一个单点,这个可以通过raid来解决。


3. 使用数据库保存session
   优点:使用数据库来保存session,就算服务器宕机了也没事,session照样在。
   缺点:每次请求都进行数据库读写开销不小(使用内存数据库可以提高性能,宕机就会丢失数据。可供选择的内存数据库有BerkeleyDB,Mysql的内存表);


4. 使用memcached来保存session
   优点:这种方式跟数据库类似,不过因为是内存存取的,性能自然要比数据库好多了。
   缺点:memcached服务器一死,所有session全丢。

5. 使用redis来保存session
    优点:这种方式跟数据库类似,不过因为是内存存取的,性能自然要比数据库好多了。因为redis有数据持久化功能,避免了用户其他内存方式服务器死掉,数据全部丢失的问题。完美。


6.使用硬件的方式保存session
  优点: 如F5,支持session共享,且处理速度快。

  缺点:不灵活,硬件贵。

 

7. session群集
  优点:提供一个群集保存session共享信息.其他应用统统把自己的session信息存放到session群集服务器组.当应用系统需要session信息的时候直接到session群集服务器上读取.


8. session复制方案
   优点:让用户的一个session在一个服务器完成.定时的备份session信息到salve上面.一台服务器down掉后,通过均衡服务器透明把用户的请求转发到群集中的其他服务器上,此时需要从salve上读取备份的session信息.  避免单点。
  

 

标签: session 集群

0

nginx 负载均衡1(轮询方式)

发布于:2014-1-8 11:07 作者:admin 浏览:2682 分类:系统架构

1. 服务器环境(3台服务器)

IP: 192.168.1.10 (负载均衡服务器)

IP: 192.168.1.20 (WEB服务器)

IP: 192.168.1.30 (WEB服务器)

 

 

2.配置负载服务器

#用户和用户组
user  www www;

worker_processes 1;


#最大文件描述符
worker_rlimit_nofile 51200;


#epoll 事件驱动
events 
{
      use epoll;
      worker_connections 51200;
}


#主配置
http 
{
   
   #配置均衡名称为test
    upstream  test  {
              server   192.168.1.20:80;
              server   192.168.1.30:80;
    }

    server {
      listen 80;
      server_name www.test.com;
      location / {
         proxy_pass        http://test;   #负载均衡名称
         proxy_set_header   Host             $host;
         proxy_set_header   X-Real-IP        $remote_addr;
         proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
      }
      access_log logs/access_log;
      error_log logs/error_log;
    }
}

 

 

3. 配置WEB服务器

修改WEB服务器IP=192.168.1.20   默认首页index.html 输出为 "IP=192.168.1.20"

修改WEB服务器IP=192.168.1.30   默认首页index.html 输出为 "IP=192.168.1.30"

 

 

4. 重新启动负载服务器

 

5.访问域名  http://www.test.com (绑定HOSTS为  192.168.1.10 www.test.com)

因为是轮询方式访问:Ctrl+F5 会轮替出现 "IP=192.168.1.20"  和 "IP=192.168.1.30" 的字样。说明配置成功。

 

 

 

标签: nginx 负载均衡

0

MySQL数据库备份命令

发布于:2014-1-7 11:56 作者:admin 浏览:2171 分类:数据库

备份MySQL数据库的命令
mysqldump -hhostname -uusername -ppassword databasename > backupfile.sql


备份MySQL数据库为带删除表的格式,能够让该备份覆盖已有数据库而不需要手动删除原有数据库。
mysqldump -–add-drop-table -uusername -ppassword databasename > backupfile.sql


直接将MySQL数据库压缩备份
mysqldump -hhostname -uusername -ppassword databasename | gzip > backupfile.sql.gz


备份MySQL数据库某个(些)表
mysqldump -hhostname -uusername -ppassword databasename specific_table1 specific_table2 > backupfile.sql

 

同时备份多个MySQL数据库
mysqldump -hhostname -uusername -ppassword –databases databasename1 databasename2 databasename3 > multibackupfile.sql

 

仅仅备份数据库结构
mysqldump –no-data –databases databasename1 databasename2 databasename3 > structurebackupfile.sql


备份服务器上所有数据库
mysqldump –all-databases > allbackupfile.sql


还原MySQL数据库的命令
mysql -hhostname -uusername -ppassword databasename < backupfile.sql


还原压缩的MySQL数据库
gunzip < backupfile.sql.gz | mysql -uusername -ppassword databasename


将数据库转移到新服务器
mysqldump -uusername -ppassword databasename | mysql –host=*.*.*.* -C databasename

标签: mysql 备份

0

MYSQL 主从数据库架构

发布于:2014-1-7 11:14 作者:admin 浏览:2364 分类:数据库
MYSQL 主从数据库架构

1. 实验环境
DBServerMaster: 192.168.1.10
DBServerSlave:  192.168.1.20
相同的MYSQL版本两份,分别安装在上述的服务器。

2. 安装mysql
[root@localhost /]# yum install mysql mysql-server


3. 配置主(master)服务器

//先锁表备份数据。
mysql> flush tables with read lock;
mysql> mysqldump -hhostname -uusername -ppassword –all-databases > allbackupfile.sql; 
mysql> unlock tables;



//配置主服务器
[root@localhost /]# vi /etc/my.cnf


//在配置项mysqld加入两行代码
[mysqld]
log-bin=master-log-bin    //日志文件
server-id=1               //主服务器标识ID


//授权从服务器同步用户
[root@localhost /]# grant privileges repliaction slave on *.*  to 'slave'@'192.168.1.20' identified by '123456';  


//重新启动数据库
[root@localhost /]# service mysqld restart;


//查看数据库状态
mysql>show master status;
+-----------------------+----------+--------------+------------------+
| File                  | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-----------------------+----------+--------------+------------------+
| master-log-bin.000001 |      875 |              |                  |
+-----------------------+----------+--------------+------------------+


4. 配置从(slave)数据库

//先锁表备份数据。
mysql> flush tables with read lock;
mysql> mysqldump -hhostname -uusername -ppassword –all-databases | gzip > backupfile.sql.gz; //压缩备份
mysql> unlock tables;



//配置从服务器
[root@localhost /]# vi /etc/my.cnf

//在配置项mysqld加入两行代码
[mysqld]
server-id=2               //从服务器标识ID 。和主服务器server-id=1不同。
master-host=192.168.1.10  //主服务器IP
master-user=slave         //主服务器授权给从服务器的用户
master-password=123456    //主服务器授权给从服务器的密码

设置slave参数
mysql>change master to master_host='192.168.1.10',master_user='slave',master_password='123456';

//启动从数据库
mysql>slave start;

//重新启动数据库
[root@localhost /]# service mysqld restart;

//查看数据库主要状态
mysql>show slave status;
Master_Host:192.168.1.10
Master_User:slave
Master_Port:3306
Master_Log_File:master-log-bin.000001
Read_Master_Log_Pos:875
Slave_IO_Running:Yes
Slave_SQL_Running:Yes



5. 测试库测试

5.1 主库测试

mysql> use test;

Database changed



mysql> create table master_slave_test(name varchar(100) not null,vkey int(11) not null);

mysql> show tables;

+-------------------+

| Tables_in_test    |

+-------------------+

| master_slave_test |

+-------------------+



mysql> insert into master_slave_test set name='测试主从同步',vkey='1';

mysql> select * from master_slave_test;

+--------------------+------+

| name               | vkey |

+--------------------+------+

| 测试主从同步    |    1 |

+--------------------+------+






5.2 从库测试

mysql> use test;
Database changed

mysql> show tables;

+-------------------+

| Tables_in_test    |

+-------------------+

| master_slave_test |

+-------------------+

1 row in set (0.00 sec)



mysql> select * from master_slave_test;

+--------------------+------+

| name               | vkey |

+--------------------+------+

| 测试主从同步     |    1 |

+--------------------+------+

1 row in set (0.00 sec)



通过上述测试,同步成功。

标签: mysql

0

Ignoring query to other database

发布于:2014-1-7 9:22 作者:admin 浏览:1492 分类:错误汇总
mysql>show databases; 
 
错误提示 Ignoring query to other database   

原因在登录mysql的时候,-uroot中的用户少写了u  


错误如下代码 
[root@pc01 ~]# mysql -root -p  Enter password:  
正确如下代码 
[root@pc01 ~]# mysql -uroot -p  Enter password:  

标签: mysql

0

1 2