好好学习,天天向上。Mysql数据库数据同步+PHP session共享 这两项技术个人认为在服务器群集或者squid、nginx反向代理负载均衡非常关键,Mysql数据库单向同步也就成了Mysql数据库热备份了,非常不错的技术,PHP session共享发费我最长的时间了,大概弄了半个多月,终于实验成功,因为最讨厌Linux服务器上一些软件依赖关系,没有自己去编译,都用的apt-get install 安装这些相关软件,并且用的是Ubuntu系统。
Mysql数据库数据同步
原理:mysql数据库数据同步是通过日志来同步的,对数据库的操作都会记录在日志里面,然后系统根据这些操作日志同步数据库数据。

具体的可以百度下。 
ServA:192.168.1.204 
ServB:192.168.1.80 
配置同步账号 
在ServA上增加一个ServB可以登录的帐号: 
Mysql>GRANT all privileges ON *.* TO backup@'192.168.1.80' IDENTIFIED BY '123456'; 
Mysql>create database sam; 
在ServB上增加一个ServA可以登录的帐号: 
Mysql>GRANT all privileges ON *.* TO backup@'192.168.1.204' IDENTIFIED BY '123456'; 
Mysql>create database sam; 
ServA: 
vim /etc/mysql/my.cnf 
[mysqld]下面加入: 
server-id               = 1 
log_bin                 = /var/log/mysql/mysql-bin.log 
binlog-do-db=sam 
binlog-ignore-db=mysql 
replicate-do-db=sam 
replicate-ignore-db=mysql 
master-host=192.168.1.80 
master-user=backup 
master-password=123456 
master-port=3306 
master-connect-retry=30 
ServB: 
vim /etc/mysql/my.cnf 
[mysqld]下面加入: 
server-id               = 2 
log_bin                        = /var/log/mysql/mysql-bin.log 
replicate-do-db=sam 
binlog-ignore-db=mysql 
replicate-do-db=sam 
replicate-ignore-db=mysql 
master-host=192.168.1.204 
master-user=backup 
master-password=123456 
master-port=3306 
master-connect-retry=30 
配置好了配置文件还要执行以下命令搭建起桥梁。 
主服务器的日志表名字查询: 
show master status; 
mysql> show master status; 
+------------------+----------+--------------+------------------+ 
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | 
+------------------+----------+--------------+------------------+ 
| mysql-bin.000012 |      369 | sam          | mysql            | 
+------------------+----------+--------------+------------------+ 
1 row in set (0.00 sec) 
从服务器: 
mysql>slave stop; 
mysql>CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000012',MASTER_LOG_POS=369; 
mysql>slave start; 
mysql>show slave status/G; 
如果看到下面的,就说明已经可以数据库同步了。 
Slave_IO_Running: Yes 
Slave_SQL_Running: Yes 
如果slave start; 不了,用 
change master to master_host='192.168.1.80',master_user='backup', 
master_password='123456',master_log_file='mysql2-bin.000001' ,master_log_pos=98;


PHP session共享
原理:反向代理负载均衡最能体现为什么要共享,比如开始在A服务器用你的帐号密码登录了,如果A服务器压力大了,系统会安排你和B服务器通讯,这时你的session就会没有了,因为你没有在B服务器登录过,所有你必须重新登录,PHP session共享就可以解决这个问题,因为他相当一个容器把所有的session全部存到里面,然后读取的时候每台服务器都可以去读取。可能我说的不够清楚,具体的也可以百度下。
操作系统:ubuntu

web1 : apache2   IP:192.168.1.201 
web2 : apache2   IP:192.168.1.80 
PHP Version 5.2.6 
web1 : 
apt-get install memcached php5-memcache libevent1 
vim /etc/php5/apache2/conf.d/memcache.ini 
; uncomment the next line to enable the module 
extension=memcache.so 
memcache.dbpath="/var/lib/memcache" 
memcache.maxreclevel=0 
memcache.maxfiles=0 
memcache.archivememlim=0 
memcache.maxfilesize=0 
memcache.maxratio=0 
vim /etc/php5/apache2/php.ini 
最后加入: 
extension=memcache.so 
session.save_handler = memcache 
session.save_path = "tcp://192.168.1.201:11211" 
以下方法没测试过,自己可以测试下: 
使用多个 memcached server 时用逗号","隔开 
也可以在 .htaccess : 
php_value session.save_handler "memcache" 
php_value session.save_path  "tcp://192.168.1.105:11211" 
再或者在某个一个应用中: 
ini_set("session.save_handler", "memcache"); 
ini_set("session.save_path", "tcp://192.168.1.105:11211"); 
vim /etc/memcached.conf 
-l 127.0.0.1 改成 -l 192.168.1.201 
重启两个服务: 
/etc/init.d/apache2 restart 
/etc/init.d/memcached restart 
web2 : 
apt-get install php5-memcache libevent1 
vim /etc/php5/apache2/conf.d/memcache.ini 
; uncomment the next line to enable the module 
extension=memcache.so 
memcache.dbpath="/var/lib/memcache" 
memcache.maxreclevel=0 
memcache.maxfiles=0 
memcache.archivememlim=0 
memcache.maxfilesize=0 
memcache.maxratio=0 
vim /etc/php5/apache2/php.ini 
最后加入: 
extension=memcache.so 
session.save_handler = memcache 
session.save_path = "tcp://192.168.1.201:11211" 
重启两个服务: 
/etc/init.d/apache2 restart 
最后就是PHP Session测试. 
test.php 测试完注销后,请关闭浏览器重新打开浏览器测试! 
session_start(); 
$expired = false; 
$action = $_GET['action']; 
$adm_user = $_POST['adm_user']; 
$adm_pass = $_POST['adm_pass']; 
if ($_SESSION['current_session'] != $_SESSION['user']."=".$_SESSION['session_key']) $expired = true; 
if ($action == "logout") 
{ 
    $_SESSION['current_session'] = rand(100,9000000); 
    $_SESSION['curr_sess_iden'] = rand(100,9000000); 
    $_SESSION['session_user'] = "Logged out"; 
    $_SESSION['session_key'] = rand(100,9000000); 
    $expired = true; 
} 
if ($_POST['login'] != '') 
{ 
    if ($adm_user != 'admin' || $adm_pass !='admin') { 
        echo "登陆失败: 用户名或密码错误!
"; 
        $expired = TRUE; 
    } 
    else 
    { 
        $time_started = md5(mktime()); 
        $secure_session_user = md5($adm_user.$adm_pass); 
        $_SESSION['user'] = $adm_user; 
        $_SESSION['session_key'] = $time_started.$secure_session_user.session_id(); 
        $_SESSION['current_session'] = $adm_user."=".$_SESSION['session_key']; 
        $expired = FALSE; 
    } 
} 
?> 




用户登陆-204 


if ($expired) { 
?> 

   
     
      用户名 
       
     
     
      密码 
       
     
   
   

    die(); 
}else{ 
       echo "登陆成功! 
"; 
       echo "当前会话: 
".$_SESSION['current_session']."
"; 
       echo "注销"; 
} 
?>