vim常用命令总结

 

1. 退出

:w — 保存

:q — 退出

:wq — 保存退出(也可以使用:x或ZZ)

(加上!表示强制执行,如:q!表示强制退出)

2. 移动光标

hjkl — 分别表示←↓↑→(J比较类似于↓)

:n — 移动到第n行 (比如:1表示移动到第1行,可以使用:set nu显示行号)

0 — 将光标移动到当前行首(^表示将光标移动到除空格外的第一个字母处)

$ — 将光标移动到当前行尾

gg — 将光标移动到第一行

G — 将光标移动到本文章的末尾

nG — 将光标移动到第n行

w — 移动到下一个单词开头

e — 移动到下一个单词结尾

HML — 分别表示将光标移动到屏幕的顶端,中间,底端

Ctrl+f — 向前滚动一页

Ctrl+b — 向后滚动一页

3. 复制/粘贴/剪切

yy — 复制当前行

nyy — 复制从当前行起往下n行

p — 粘贴到当前行下一行

P — 粘贴到当前行上一行

dd — 剪切当前行(可作为删除使用)

ndd — 剪切从当前行起往下n行(可作为删除使用)

:1,100 co 200 — 将1到100行的内容复制到第200行

:1,100 co $ — 将1到100行的内容复制到文章尾

4. 删除

dw — 删除一个单词(即从光标位置起到下一个空格为止的内容)

x — 向后删除一个字符(nx表示向后删除n个字符)

d0 — 删除光标处到当前行首的内容

dG — 删除光标处到当前行尾的内容

5. 编辑/撤销

i — 在光标处插入内容

u — 撤销上次操作

6. 查找

/: — 后面加上查找的内容,表示向文章往下查找

?: — 后面加上查找的内容,表示向文章往上查找

n — 向下重复查找

N — 向上重复查找

7. 替换

:s/from/to — 替换当前行中第一个from为to

:s/from/to/g — 替换当前行中所有from为to

:%s/from/to/g — 替换文章中所有from为to

:100,200s/from/to/g — 替换文档中100到200行中from为to

 

 

memcache应对高并发量的优化

我们都知道memcahce是解决大并发量的很好一个工具,但是有一个问题值得注意,当突然有很多用户请求我们的某个页面,请求的参数相同,但对应的值却在memcahce中没有,此时这些请求都将会去查询数据库操作,瞬间对数据库照成了很大的压力。

下面我做了一个小例子来模拟这种情况。

原页面代码:

 connect("127.0.0.1",11211) or die("connect failed");

$key = $_GET['key'];
if($result = $memcache->get($key)) {
    $s = "get result form memcache: ".$key."/".$result."\n";
    file_put_contents("/var/www/html/log1.txt",$s,FILE_APPEND);
    echo $s;
}else {
    //模拟查询数据库
    sleep(5); //休眠5秒
    $result = mt_rand(1,100);
    $memcache -> set($key,$result,0,3600);
    $s = "get result not from memcache: ".$key."/".$result."\n";
    file_put_contents("/var/www/html/log2.txt",$s,FILE_APPEND);
    echo $s;
}
?>

此代码的意思是,我通过某个参数key来访问这个页面,如果此key在memcahce中存在,则在log1.txt中写入一条数据,如果不存在则休眠5秒(模拟查询数据库),在log2.txt中写入一条数据,同时将此key得到的结果放入memcahce中。

这里值得注意的是我在连接memcahce时候加了一句“or die(“connect failed”);”,即当连接报错时退出,因为有可能当memcahce的连接数超出了它本身限制的次数后,导致连接不上,从而会执行会执行else中的语句(而非memcahce中无值)。

测试并发

1)   使用ab命令测试

# ab -c 200 -n 30000 http://192.168.1.78/complicateTest.php?key=abcde

以上命令表示200个并发请求30000次

可以看到在log2文件中有许多数据,说明查询了很多次数据库:

2

可以使用对数据库查询加锁来处理,即在查询数据的时候,先在缓存中存一个值K,其他客户端需要查询数据库的时候要先判断K是否存在,若存在则休眠,如下:

 connect("127.0.0.1",11211) or die("connect failed");

$key = $_GET['key'];
getResult($memcache,$key);

function getResult($memcache,$key) {
    if($result = $memcache->get($key)) {
        $s = "get result form memcache: ".$key."/".$result."\n";
        file_put_contents("/var/www/html/log1.txt",$s,FILE_APPEND);
        echo $s;
    }else {
        $tmp_key = "_temp_".$key;
        if($memcache -> add($tmp_key, "temp key",0,60)) {
            sleep(5);
            $result = mt_rand(1,100);
            $memcache -> set($key,$result,0,3600);
            $s = "get result not from memcache: ".$key."/".$result."\n";
            file_put_contents("/var/www/html/log2.txt",$s,FILE_APPEND);
            echo $s;
            $memcache -> delete($tmp_key);
        }else {
            sleep(3);
            file_put_contents("/var/www/html/log3.txt","sleep...\n",FILE_APPEND);
            getResult($memcache, $key);
       
        }
    }
}
?>

此时我们再可以观察log2.txt中的日志,发现只有一条的,即只有一条是从数据库中查询的数据。

但如果sleep的线程如果太多的话,也可能造成进程阻塞,

另一种方法是,将数据设置在memcache的时间为永久性的,在数据中设置一个过期时间,每次获取数据时判断是否过期,若过期则加锁重新查询数据库。加锁失败则返回旧数据,但是这样做的前提是要确保memcache有这个数据,若没有则还是会返回空。所以事先需要先将用户可以查询到的数据都放到内存中,但遇到内存突然重启就会出现返回空数据的情况

 connect("127.0.0.1",11211) or die("connect failed");

$key = $_GET['key'];
print_r(getResult($memcache,$key));

function getResult($memcache,$key) {
    $result = array();
    if($result = $memcache->get($key)) {
        if($result["expired"] > strtotime(date("Y-m-d H:i:s"))) {
            //memcache中有数据,且未过期,返回原数据
            return $result;
        }else {
            return lockData($result,$memcache,$key);
        }
    }else {
        //memcache中无数据
        return lockData($result,$memcache,$key);
    }
}

//加锁,查询数据库
function lockData($result,$memcache,$key) {
    $tmp_key = "_temp_".$key;
    if($memcache -> add($tmp_key, "temp key",0,60)) {
        sleep(5);
        $result["data"] = mt_rand(1,100);
        $result["expired"] = strtotime(date("Y-m-d H:i:s")." +1 hour");
        $memcache -> set($key,$result,0,0);
        $memcache -> delete($tmp_key);
    }else {
        //若memcache中没有数据则会返回空,若有值则是返回旧数据
    }
    return $result;
}

?>

 

比较好的方式是使用gearmand来处理并发,gearmand可以确保相同的请求只执行一次,gearmand的介绍可以参考这里

1)  gearmand安装

#yum install libdrizzle libdrizzle-devel

#rpm -ivh http://dl.iuscommunity.org/pub/ius/stable/Redhat/6/x86_64/epel-release-6-5.noarch.rpm

#yum install gearmand

2)  安装php的gearmand扩展

首先要先确定有phpize,如果没有可以使用:

#yum install php-devel

#wget http://pecl.php.net/get/gearman-1.1.0.tgz

#tar zxf gearman-1.1.0.tgz

#yum install libgrearman-devel.x86_64

#yum install re2c

#cd gearman-1.1.0

#/usr/bin/phpize

#./configure

#make && make install

修改php.ini文件,加入

extension=gearman.so

3)  启动gearman

#/etc/init.d/gearman start

#service httpd restart

代码示例:

服务端gearmanWorker.php:

addServer("127.0.0.1", 4730);
  $worker->addFunction("querydb","querydb");
  while ($worker->work());


function querydb($job) {
    $key = $job -> workload();
    sleep(5);
    $result = mt_rand(1,100);
    $s = "get result not form memcache: ".$key."/".$result."\n";
    file_put_contents("/var/www/html/log2.txt",$s,FILE_APPEND);
    return $result;
}

?>

客户端complicateTest.php:

 connect("127.0.0.1",11211) or die("connect failed");

$client= new GearmanClient();
$client->addServer("127.0.0.1", 4730);

$key = $_GET['key'];
echo getResult($memcache,$key,$client);

function getResult($memcache,$key,$client) {
    if($result = $memcache->get($key)) {
       //从缓存中取
       $s = "get result form memcache: ".$key."/".$result."\n";
       file_put_contents("/var/www/html/log1.txt",$s,FILE_APPEND);
    }else {
        //memcache中无数据
        $result = $client -> doNormal("querydb",$key,$key);
        $memcache -> set($key, $result,0,3600);
    }
    return $result;
}

?>

首先启动服务端

#nohup /usr/bin/php gearmanWorker.php > log.txt 2>&1 &

使用ab命令测试:

ab -c 200 -n 10000 http://192.168.1.78/complicateTest3.php?key=sc842da

可以发现log2.txt中也只有一条记录,即只有一次从数据库中取,其他的都是从缓存中获取。
 

linux -计划任务

在linux下设置计划任务

1. 命令使用

-u 指定一个用户

-l 列出某个用户的任务计划

-r 删除某个用户的任务

-e 编辑某个用户的任务

比如使用:

#crontab –u www –e

 表示设置www组下的计划任务,如果使用crontab –e 则表示设置root下的

 2. 语法

分     小时   日    月    星期    命令

0-59  0-23  1-31  1-12    0-6     command

从左到右依次为:

1)每个小时的第几分钟执行该任务

2)每天的第几个小时执行该任务

3)每月的第几天执行该任务

4)每年的第几个月执行该任务

5)每周的第几天执行该任务

6)指定要执行的程序

(注:星期中0表示星期日,每一行表示一个计划任务)

 特殊符号:

 ”*” 代表取值范围内的所有数字

 ”/” 代表”每”

 ”-” 代表从某个数字到某个数字

 ”,” 分开几个离散的数字

 3. 举例说明:

若我想添加www组下计划任务

#crontab –u www –e

   例1:

*/5 1-6 * * * /usr/local/php/bin/php /home/wwwroot/datacopy/catchdata.php

这个表示每天的1-6点,每隔5分钟执行catchdata.php脚本。

这里要注意的是,这个是通过计划任务执行的,在catchdata.php中引用某文件的路径要写成绝对路径,因为在计划任务中是不识别环境变量的,而且catchdata所在用户和用户组都要为www的,其要有执行权限。

   例2:

1 5 */3 * * /data/sh/regularly_clean_up_data.sh > /dev/null 2>&1

每隔3天的5点1分执行regularly_clean_up_data.sh这个sh脚本,将执行后的输出结果丢弃,当然你也可是将输出的结果放在一个文件中,比如使用:

> /data/log/regularly_clean_up_data.log

修改完成后需重启计划任务

#service crond restart

 4. 关于计划任务

cron服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab,因此我们配置这两个文件也能运用cron。

1)使用crontab 命令实质是修改/var/spool/cron下对应用户的cron文件,

可以使用vi直接编辑此cron文件

2)另外也可以修改/etc/crontab文件修改计划任务,其文件格式如下:

1

使用举例:

47 * * * * root /usr/sbin/ntpdate -b -s time.windows.com > /dev/null 2>&1

每47分钟同步一次时间

Linux之改变文件属性及权限

在linux中对于文件属性及权限的修改,用到的命令有如下3个:

1)chgrp: 改变文件所属用户组。
2)chown: 改变文件所有者。
3)chmod: 改变文件权限。
1. chgrp用法:
   chgrp [-R] dirname/filename
   -R: 进行递归的持续更改,即连同子目录下的所有文件目录。
   例:
1
2.chown用法:
  chown [-R] 账号名称 文件或目录
  chown [-R] 账号名称:组名 文件或目录
  -R: 进行递归的持续更改,即连同子目录下的所有文件目录。
  例1:
2
 例2:
3
3. chmod用法:
   chmod [-R] xyz 文件或目录
   xyz: 为数字类型的权限属性,为rwx属性数字的相加。
   注:linux的基本权限有9个,r:4   w:2   x:1
   如:-rwxrwx—
       owner = rwx = 4+2+1 = 7
       group = rwx = 4+2+1 = 7
       others = — = 0+0+0 = 0
   1) 使用数字:
 
例1:
4
 2)使用符号: 

chmod

u

g

o

a

+(加入)

- (除去)

=(设置)

r

w

x

文件或目录

      注:u,g,o 代表3种身份,a代表all
例1:
5
例2:
6
例3:
7

apache实现服务器负载均衡

1. 什么是负载均衡
负载均衡 (Load Balancing) 负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

2.实现(我用的是反向代理来实现的)
1) 条件:3台服务器:103服务器,220服务器,200服务器,以220作为代理服务器,103和200为实际处理请求的服务器,以下简称为(103,220,200)

2) 利用php写一个测试程序,比如:我分别在103,220,200服务器apache的根目录(/var/www/html)新建一个文件:
vi /var/www/html/test/proxy_test.php
各个服务器上对应输出:“proxy test:103”,“proxy test:220”,“proxy test:200”

修改代理服务器220的apache的配置文件

    
    DocumentRoot /var/www/html
    ServerName test2.domain.com
    ErrorLog logs/test2.domain.com.com-error_log
    CustomLog logs/test2.domain.com.com-access_log common
    ProxyRequests Off  #开启反向代理
    #设置实际处理请求的代理服务器地址
       BalancerMember http://xx.xx.xx.200/test
       BalancerMember http://xx.xx.xx.103/test
       BalancerMember http://xx.xx.xx.220/test
    ProxyPass /test balancer://mycluster/
    ProxyPassReverse /test balancer://mycluster/

3) 以上配置的意思为:凡是访问test2.domain.com/test这个地址都会自动代理到

http://xx.xx.xx.200/test或http://xx.xx.xx.103/test或http://xx.xx.xx.220/test地址下

4) ProxyPass 这里我用的是‘/test’如果写成:ProxyPass / balancer://mycluster/,
那么其意思为:凡是访问test2.domain.com这个地址的都会自动代理到

http://xx.xx.xx.200/test或http://xx.xx.xx.220/test或http://xx.xx.xx.220/test地址下

5) 值得注意的是我这里写了一个代理请求的地址为http://xx.xx.xx.220/test,他其实为代理服务器的地址,但是如果直接这样按上面的写,他是不会有作用的,因为
test2.domain.com域名指向的是/var/www/html地址,而ip地址xx.xx.xx.220实际指向也是/var/www/html地址,所以当通过ip访问的时候,他还是会被代理到其他服务器,
所以我们还得将ip和/var/www/html再关联一遍,如下:

 
    DocumentRoot /var/www/html
    ServerName xx.xx.xx.220
    ErrorLog logs/xx.xx.xx.220-error_log
    CustomLog logs/xx.xx.xx.220-access_log common

注:加上上面的配置后,重启apache可能会报错
‘_default_ VirtualHost overlap on port 80, the first has precedence’
错误原因是:NameVirtualHost *:80被注释掉了,打开就好了

3.测试
访问test2.domain.com/test/proxy_test.php你会发现他会将请求均衡转向到

http://xx.xx.xx.200/test或http://xx.xx.xx.103/test或http://xx.xx.xx.220/test地址下

即会依次循环输出:“proxy test:200”,“proxy test:103”,“proxy test:220”

4.其他用法
1) ProxyPass和ProxyPassReverse的用法:
A) ProxyPass:
语法:ProxyPass [path] !|url

它主要是用作URL前缀匹配,不能有正则表达式,它里面配置的Path实际上是一个虚拟的路径,在反向代理到后端的url后,path是不会带过去的,使用示例:

a)ProxyPass /images/ !

这个示例表示,/images/的请求不被转发。

b)ProxyPass /mirror/foo/ http://backend.example.com/

我们假设当前的服务地址是http://example.com/,如果我们做下面这样的请求:

http://example.com/mirror/foo/bar

那将被转成内部请求:

http://backend.example.com/bar

注:配置的时候,不需要被转发的请求,要配置在需要被转发的请求前面。

B) ProxyPassReverse
语法:ProxyPassReverse [路径] url

它一般和ProxyPass指令配合使用,此指令使Apache调整HTTP重定向应答中Location, Content-Location, URI头里的URL,这样可以避免在Apache作为反向代理使用时,。后端服务器的HTTP重定向造成的绕过反向代理的问题。参看下面的示例:

 
    ProxyPass /example http://www.example.com/
    ProxyPassReverse /example http://www.example.com/

ProxyPassReverse的作用就是反向代理,如果没有加这样的反向代理设置的情况下,访问http://www.test.com/example/a,如果www.example.com对请求进行了redirect至http://www.example.com/b,那么,客户端就会绕过反向代理,进而访问http://www.test.com/example/b。如果设置了反向代理,则会在转交HTTP重定向应答到客户端之前调整它为http://www.test.com/example/a/b,即是在原请求之后追加上了redirect的路径。

C) ProxyPassMatch:
语法:ProxyPassMatch [regex] !|url

这个实际上是url正则匹配,而不是简单的前缀匹配,匹配上的regex部分是会带到后端的url的,这个是与ProxyPass不同的。使用示例:

a) ProxyPassMatch ^/images !

这个示例表示对/images的请求,都不会被转发。

b) ProxyPassMatch ^(/.*\.gif)$ http://backend.example.com$1

这个示例表示对所有gif图片的请求,都被会转到后端,如此时请求http://example.com/foo/bar.gif,那内部将会转换为这样的请求

http://backend.example.com/foo/bar.gif。

2) 反向代理其他分配方式(以上配置我使用的是平均分配,即每个服务器的请求次数是相同的)
1. 负载比例分配
打开 balancer-manager 的界面,可以看到请求是平均分配的。

如果不想平均分配怎么办?给 BalancerMember 加上 loadfactor 参数即可,取值范围为1-100。
比如你有三台服务器,负载分配比例为 7:2:1,只需这样设置:
Httpd.conf代码

    ProxyRequests Off 

        BalancerMember http://node-a.myserver.com:8080 loadfactor=7 
        BalancerMember http://node-b.myserver.com:8080 loadfactor=2 
        BalancerMember http://node-c.myserver.com:8080 loadfactor=1 

    ProxyPass / balancer://mycluster

2. 负载分配算法

默认情况下,负载均衡会尽量让各个服务器接受的请求次数满足预设的比例。如果要改变算法,可以使 用 lbmethod 属性。如:

Httpd.conf代码

    ProxyRequests Off

        BalancerMember http://node-a.myserver.com:8080 loadfactor=7 
        BalancerMember http://node-b.myserver.com:8080 loadfactor=2 
        BalancerMember http://node-c.myserver.com:8080 loadfactor=1 

    ProxyPass / balancer://mycluster 
    ProxySet lbmethod=bytraffic

lbmethod可能的取值有:
lbmethod=byrequests 按照请求次数均衡(默认)
lbmethod=bytraffic 按照流量均衡
lbmethod=bybusyness 按照繁忙程度均衡(总是分配给活跃请求数最少的服务器)

各种算法的原理请参见Apache的文档。

3) 热备份(Hot Standby)
热备份的实现很简单,只需添加 status=+H 属性,就可以把某台服务器指定为备份服务器:
Httpd.conf代码

    ProxyRequests Off 

        BalancerMember http://node-a.myserver.com:8080 
        BalancerMember http://node-b.myserver.com:8080 status=+H 

    ProxyPass / balancer://mycluster

即请求总是流向 node-a ,一旦node-a挂掉, Apache会检测到错误并把请求分流给 node-b。Apache会每隔几分钟检测一下 node-a 的状况,如果node-a恢复,就继续使用node-a。

 

本文参考文献:http://blog.51yip.com/apachenginx/873.html

http://koda.iteye.com/blog/465061

http://www.ayuelee.cn/apache-error-default-VirtualHost-overlap.html

http://blog.csdn.net/fenglibing/article/details/6796094

yum安装LAMP

1.安装mysql

[root@zhangchuan ~]# yum install mysql mysql-server

添加mysql开机启动

[root@zhangchuan ~]# chkconfig mysqld on

启动mysql

[root@zhangchuan ~]# /etc/init.d/mysqld start

设置 MySQL 数据 root 账户的密码:

[root@zhangchuan ~]# mysql_secure_installation

当出现如下提示时候直接按回车:

Enter current password for root

出现如下再次回车:

Set root password? [Y/n]

出现如下提示输入你需要设置的密码,回车后在输入一次确认:

New password:

接下来还会有四个确认,分别是:

Remove anonymous users? [Y/n]

Disallow root login remotely? [Y/n]

Remove test database and access to it? [Y/n]

Reload privilege tables now? [Y/n]

直接回车即可。

更改mysql的用户名:

mysql的用户都存在mysql数据库的user表中,

据说默认使用root用户不是很安全,

使用update user set user=’mysqlroot’更换用户名即可。

但别忘了刷新权限:flush privileges;

2.安装apache

[root@zhangchuan ~]# yum install httpd

添加apache开机启动:

[root@zhangchuan ~]# chkconfig httpd on

启动apache:

[root@zhangchuan ~]# /etc/init.d/httpd start

在 CentOS 中 Apache 的默认根目录是 /var/www/html,

配置文件 /etc/httpd/conf/httpd.conf。

其他配置存储在 /etc/httpd/conf.d/ 目录

3.安装php

[root@zhangchuan ~]# yum install php

重启apache

[root@zhangchuan ~]# /etc/init.d/httpd restart

测试php

[root@zhangchuan ~]# vi /var/www/html/info.php


4.php相关模块安装:

[root@zhangchuan ~]# yum install php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc

重启apache

[root@zhangchuan ~]# /etc/init.d/httpd restart

5.memcahced安装:

        网上有的说要导入memcache库,但我安装的时候就是直接安装的,可能是centos版本不同

我的是CentOS release 6.3 (Final),内核为:2.6.32-279.el6.x86_64

关于导入包的的步骤可以查看:http://www.bootf.com/442.html

[root@zhangchuan ~]# yum install memcached php-pecl-memcache

添加memcache开机启动:

[root@zhangchuan ~]# chkconfig memcached on

启动memcached:

[root@zhangchuan ~]# /etc/init.d/memcached start

重启apache:

[root@zhangchuan ~]# /etc/init.d/httpd restart

测试php的memcache是否安装成功:

connect('127.0.0.1', 11211);
    $memcache->set('key', 'hello memcache!', 0, 60);
    $result = $memcache->get('key');
    echo $result;
?>

6. jdk安装:

yum install java-1.7.0-openjdk*

 

Linux建立代理服务器

1.    什么是代理服务器?

举个例子来说:比如A服务器需要访问B服务器,A可以直接访问B服务器,假如现在B服务器现在做了限制,只让C服务器可以访问他,此时A访问B时先可以先访问C,由C服务器来访问B服务器,将所得到的数据再返回A

2.    搭建环境

我使用的是squid工具,

1)    在linux上使用yum install squid就可以安装

2)    修改配置文件vi /etc/squid/squid.conf

将http_access deny all修改为http_access allow all,此时便可以使用代理了,(关于在浏览器中配置代理后面会详细讲到)

3)    指定固定ip可以代理,使用acl

http_access allow mytest

acl mytest src 223.21.146.148/29

4)    http_port

代理的端口号,默认为3128。

5)    启动

/etc/init.d/squid start

3.    浏览器配置,(以firefox为例)

选择Tools -> Options -> Advanced -> Network,填入代理服务器的IP,如下截图,保存后就可以使用代理服务器上网了

8d8e03cdgx6DAL8arGg78&690

 

代理服务器详细及更多配置请参见:http://blog.s135.com/book/squid/chap06.html

 

 

Linux之FTP

1. 安装FTP

yum install vsftpd

chkconfig vsftpd on

2. 添加用户

useradd -d /data/ftpData1 -s /sbin/nologin ftpuser1

passwd ftpuser1

userdel ftpuser1 //删除用户

3. 更改用户组和授予权限

chown –R ftpuser1 /data/ftpData1

chmod 755 /data/ftpData1

4. 启动ftp

service vsftpd start

5. 测试登陆

1)    使用客服端工具,或者是ftp命令

若不能使用ftp命令,使用yum install ftp

2)    ftp 192.168.1.88

输入用户名和密码

Mysql数据同步(单向)

首先准备两台服务器:

主:192.168.1.88

从:192.168.1.78

创建需要同步的数据库,比如为sync_db,将这个数据库各拷贝到78和88一份

 G4QQP36U9$){EF9`N2AZP(O

 

修改主服务器88上的配置,找到my.cnf文件,若不知道位置,可以使用

#find / -name “my.cnf”找到

#vi /etc/my.cnf

添加:

#88 master server

server-id=100088

log-bin

binlog_do_db=sync_db

解释:

1)      server-id:标识,唯一,值范围在:1至2^23-1

2)      log-bin:配置是否在数据库有变动时写二进制日志,在mysql的的数据目录下回生成

mysqld-bin.000001的文件。

可在mysql命令行通过show variables like ‘%bin’;查看是否开启,ON表示已开启。

3)      binlog_do_db:同步的数据库

修改从服务器78的配置,在my.cnf中添加

#23 slave server

server-id=100078

master-host=192.168.1.88

master-user=root

master-password=123456

master-port=3306

master-connect-retry=60

replicate-do-table=sync_db.c_user

replicate-do-table=sync_db.c_citys

解释:

1)      master-host, master-user, master-password, master-port分别为主服务器的主机IP,用户,密码,端口

2)      master-connect-retry为:尝试连接的最大时间,单位为秒

3)      replicate-do-table为:同步的表,也可以使用replicate-do-db=sync_db同步整个数据库

 

重启主服务器和从服务器

#service mysqld restart

主服务器数据库目录下会生成mysqld-bin.index和mysqld-bin.000001文件

mysqld-bin.000001为主服务器操作的记录,包括sql语句等

从服务器数据库目录会生成:

master.info

relay-log.info

mysql-bin.index

mysql-bin.000001

mysqld-relay-bin.index

mysqld-relay-bin.000001

测试同步

更改主服务器88上的数据

insert into c_user(name,sex,age,address) values(‘zhangsan’,’1′,20,’beijing’);

可看到从服务器上也同时插入了一条数据

查看主从服务器同步状态

主服务器

mysql>show master status

 2

从服务器

3

解释:

1)  Slave_IO_Running和Slave_SQL_Running的值均为Yes时为同步开启;

2)  Last_Errno和Last_Error是错误信息的提示(如果有错误)

 

故障修复:

若发现从服务器数据中断,可使用change重新定位同步点,如下:

stop slave; # MySQL 返回的查询结果为空 (即零行)。

CHANGE MASTER TO

MASTER_HOST=’192.168.1.88′,

MASTER_LOG_FILE=’mysqld-bin.000043′,

MASTER_LOG_POS=464512808;# MySQL 返回的查询结果为空 (即零行)。

start slave;# MySQL 返回的查询结果为空 (即零行)。

MASTER_LOG_FILE和MASTER_LOG_POS为主服务器上的同步二进制文件同步点

可通过show master status查看