百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>数据库> memcached 做mysql主从备份方法
分享文章到:

memcached 做mysql主从备份方法

发布时间:01/15 来源: 浏览: 关键词:

 一般的大站通常做法是    拿着内存当数据库教程来用(memcached).     和很好的读  写分离  备份机制 (mysql教程 的主从)

在这样的环境下我们怎么进行PHP开发呢.  本人不太会讲话.所以还是帖代码吧. 

刚在linux  的 VIM  里写的一个  demo    调试通过.  也同时希望大家拍砖 ,  使用PHP5  写的. PHP4写出来怕大家说我落后了

<?php教程
$memcached = array(  //用memcached 的 多 进程模拟 多台memcached 服务器     cn     en   为  内存服务器名
     'cn'=>array('192.168.254.144',11211),
     'en'=>array('192.168.254.144',11212)
     );
$mysql    = array( // mysql 的主从 我的环境是 : xp 主    linux 从  mysql 5  php5
     'master'=>array('192.168.254.213','root','1','mydz'),
     'slave_1'=>array('192.168.254.144','root','1','mydz')  //可以灵活添加多台从服务器
     );
?>

服务器配置文件: 十分方便的 切换主从.  当主换了  从可以迅速切换为主.  支持 多从服务器   .

[php]
<?php
class Memcached
{
private $mem;
public $pflag=''; // memcached pconnect tag
private function memConnect($serkey){
  require 'config.php';
  $server = $memcached;
  $this->mem = new Memcache;
  $link = !$this->pflag ? 'connect' : 'pconnect' ;
  $this->mem->$link($server[$serkey][0],$server[$serkey][1]) or $this->errordie('memcached connect error');

}

public function set($ser_key,$values,$flag='',$expire=''){
  $this->memConnect($this->tag($ser_key));
  if($this->mem->set($ser_key,$values,$flag,$expire)) return true;
  else return false;
}

public function get($ser_key){
  $this->memConnect($this->tag($ser_key));
  if($var=$this->mem->get($ser_key)) return $var;
  else return false;
}
private function tag($ser_key){
  $tag=explode('_',$ser_key);
  return $tag[0];
}
private function errordie($errmsg){
  die($errmsg);
}
}
?>
[/php]

简单的封装了 memcached  的操作. 详细的时间不多.我要离开公司了tukiz43  

在memcached 的多服务器上.  我的实现思路是这样的:   在把信息添加到 内存服务器的时候.我选择了手工设置添加到那个服务器.而不用传统的根据ID自动分配.
这样可以更灵活点. 

以内存服务器名 为表示   比如 存  $arr 这个信息到  en 这台 内存服务器 我就这样写   $mem->set('en_'.$arr);    明白了吧


[php]
<?php
class Mysql
{
private   $mysqlmaster;
private   $myssqlslave;
private static $auid=0;
public function __construct(){
  require 'config.php';
  $msg = $mysql;
 
  $this->mysqlmaster = new mysqli($msg['master'][0],$msg['master'][1],$msg['master'][2],$msg['master'][3]); //master mysql
   $this->mysqlslave  = $this->autotranscat($msg); // slave mysql

  if(mysqli_connect_errno()){
   printf("Connect failed: %sn",mysqli_connect_error());
   exit();
  }
  if(!$this->mysqlmaster->set_charset("latin1") && !$this->mysqlslave->set_charset("latin1")){
   exit("set charset error");
  }
}

private function autotranscat($mysql){
  session_start();
  $_SESSION['SID']!=0 || $_SESSION['SID']=0   ;
  if($_SESSION['SID'] >=count($mysql)-1) $_SESSION['SID'] = 1;
  else $_SESSION['SID']++;
  $key = 'slave_'.$_SESSION['SID'];
  echo($_SESSION['SID']);
  return new mysqli($mysql[$key][0],$mysql[$key][1],$mysql[$key][2],$mysql[$key][3]);
}

public function mquery($sql){ //insert  update
  if(!$this->mysqlmaster->query($sql)){
   return false;
  }
}

public function squery($sql){
  if($result=$this->mysqlslave->query($sql)){
   return $result;
  }else{
   return false;
  };
}
public function fetArray($sql){
  if($result=$this->squery($sql)){
   while($row=$result->fetch_array(MYSQLI_ASSOC)){
    $resultraa[] = $row;
   };
   return $resultraa;
  }
}
}
?>
[/php]

这个是 mysqli 的封装.  也就是   读  从  写 主  的操作的封装.

[php]
<?php
require 'init.php';
$mem = new Memcached;
/* $mem->set('en_xx','bucuo');
echo($mem->get('en_xx'));
$mem->set('cn_jjyy','wokao');
echo($mem->get('cn_jjyy'));
*/
$sq = new Mysql;
$sql = "insert into mybb(pid) values(200)";
$mdsql = md5($sql);
if(!$result=$mem->get('cn_'.$mdsql)){
  $sq->mquery("insert into mybb(pid) values(200)"); //插入到主mysql
  $result = $sq->fetArray("select * from mybb"); //查询 是 从mysql
  foreach($result as $var){
   echo $var['pid'];
  }
  $mem->set('cn_'.$mdsql,$result); //添加到 名为 cn 的 memcached 服务器 
}else{
  foreach($result as $var){
   echo $var['pid'];
  }
}
?>

看个php备份类

<?php
/*******************************************************
**文 件 名:DBManagement.php
**Copyright (c)2007-2008 ** 网站开发部
**文件编号:wtcms-lcq-db-004
**创 建 人:林超旗
**日    期:2007-04-07
**修 改 人:
**日    期:
**描    述:实现数据的导入导出,数据表结构的导入导出
********************************************************/

        //
        //包含Mysql数据库操作文件
        //
        require_once("MysqlDB.php");
       
/*******************************************************
**类    名:MysqlDB
**类 编 号:lcq-DB-003
**作    用:数据库链接的建立,数据操作,获取字段个数,记录条数等
**作    者:林超旗
**编写日期:(2007-04-07)
********************************************************/
class DBManagement implements IDBManagement
{       
        //
        //当前数据库中所有的数据表的名字
        //
        private $TablesName;
        //
        //默认路径
        //
        private $DefaultPath;
        //
        //当前要操作的数据库名
        //
        private $DatabaseName;
        //
        //操作数据库的对象
        //
        private $db;
       
/*******************************************************
**方 法 名:__construct
**功能描述:创建一个DBManagement的对象
**输入参数:$_DatabaseName-string<要操作的数据库名,如果为空则从配置文件中读取>
**        $_DefaultPath-string<存储数据的默认路径,如果为空则从配置文件中读取>
**输出参数:无
**返 回 值:无
**作    者:林超旗
**日    期:2007-04-09
**修 改 人:
**日    期:
********************************************************/       
        function __construct($_DatabaseName="",$_DefaultPath="")//
        {
                require("config.inc.php");
                if(!$_DatabaseName)        {$this->DatabaseName=$dbName;}
                else {$this->DatabaseName=$_DatabaseName;}
               
                if(!$_DefaultPath) {$this->DefaultPath=$defaultPath;}
                else {$this->DefaultPath=$_DefaultPath;}
                $path=realpath($this->DefaultPath);
                $this->DefaultPath=str_replace("","/",$path);
                //$this->db=new DBFactory();
                $this->db=new MysqlDB();
        }
       
/*******************************************************
**方 法 名:GetTablesName
**功能描述:获取$this->Database的所有数据表的名字
**输入参数:无        
**输出参数:无
**返 回 值:-array <$this->TablesName:$this->Database的所有数据表的名字>
**作    者:林超旗
**日    期:2007-04-09
**修 改 人:
**日    期:
********************************************************/       
        protected function GetTablesName()
        {
                $result=$this->db->Query("show table status");
                while($Row=$this->db->NextRecord($result))
                {
                        $this->TablesName[]=$Row["Name"];
                }
                return $this->TablesName;
        }
       
/*******************************************************
**方 法 名:GetDataFileName
**功能描述:获取与$this->Database的所有数据表对应的数据文件的物理文件名
**输入参数:无        
**输出参数:无
**返 回 值:-array <$DataFilesName:$与$this->Database的所有数据表对应的数据文件的物理文件名>
**作    者:林超旗
**日    期:2007-04-09
**修 改 人:
**日    期:
********************************************************/       
        protected function GetDataFileName()
        {
                $this->GetTablesName();
                $count=count($this->GetTablesName());
                for ($i=0;$i<$count;$i++)
                {
                        $DataFilesName[]=$this->DefaultPath."/".$this->TablesName[$i].".txt";
                        //echo $DataFilesName[$i];
                }
                return $DataFilesName;
        }
       
/*******************************************************
**方 法 名:SaveTableStructure
**功能描述:保存数据表的结构到install.sql文件中,目标路径为$DefaultPath
**输入参数:无        
**输出参数:无
**返 回 值:- bool<返回为true表示保存成功;
**                为false表示保存失败>
**作    者:林超旗
**日    期:2007-04-09
**修 改 人:
**日    期:
********************************************************/       
        protected function SaveTableStructure($text)
        {
                $fileName=$this->DefaultPath."/Install.sql";
                //if(file_exists($fileName))
                //{
                //        unlink($fileName);
                /

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有10人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板