天天看点

MySQL的复制(Replication)与主从服务器的配置

<b>MySQL</b><b>的复制</b>(Replication):

<b>复制</b>:BinaryLog(二进制日志)把它复制到另外一台服务器上去。在执行一次!则另外一台服务器就会跟此台服务器的一样;这样主要是做备份;

<b>当服务器性能瓶颈时、解决的方案</b>:

<b>提高性能的方法</b>:

    向上扩展(SCALE ON):很少用,通过提供一个性能更好的服务器,来扩展服务器处理能力的方式。 有一缺陷:性能扩展n倍,意味着价格通常扩展m*n倍,代价非常高。

向外扩展(SCALE OUT):通过提供多台服务器的方式,将访问压力平均分摊到不同的服务器中去。

<b>Cluster</b><b>(集群)</b>:

Load Balancing(负载均衡集群LB):将一个应用的请求分摊到多个服务器上,进而提供更好的性能表现的集群

High Availability(高可用集群HA):本身不能起到负载均衡的能力。主要目的:为了防止某一台服务器出现故障时,导致整个服务不可用,而为其提供备用机,或冗余机制。

High Performance(高性能集群HP):提供超级计算能力,完成复杂运算。将一非常大的运算需求切割成n片,每一台计算机计算一片,完成之后,返回给切片的计算机整合起来,得最终结果。

最常见的是前两种集群

<b>MySQL Replication</b><b>:</b>

就是一种能够通过向外扩展,将mysql的请求平均分担到多台mysql服务器的负载均衡集群,同时结合第三方的控制组件或软件,能够让mysql复制集群制作成既有负载均衡能力,又有高可用特征的集群。

<b>MySQL</b><b>的复制</b>是能够将数据从一个MySQL服务器(master)传输或复制到另一台或多台MySQL服务器(slave)上的机制。

MySQL的复制(Replication)与主从服务器的配置

<b>中继日志</b>:主服务器将数据传输到从服务器后,数据存储到中继日志中,而并非存储到磁盘上,从服务器会启动一个mysql进程读取中继日志,在mysql数据库上执行,最终实现了主从服务器上数据的一致。

从服务器是否复制二进制日志,取决与架构设计。

<b>MySQL</b><b>的主从复制是异步复制。</b>

<b>主服务器从服务器复制有:</b>

<b>异步(async</b><b>)</b>:只要发送过去就算完成,不管接收方是否接收到 写操作在内存中完成的。

<b>同步(sync</b><b>)</b>:发送方要接收到接收方的确认信号以后才终止传输

<b>从服务器延时</b>(Delayed):

只要是异步,就不可避免

从服务器的写操作从来都是单线程的,而主服务器却可以一次写入多个。

MySQL的复制(Replication)与主从服务器的配置

<b>主从复制启动3</b><b>个线程</b>:

主:dump thread:负责提供数据,将二进制日志文件的内容读取出来,发送给从服务器的专用线程的线程

从:I/O thread:负责接收主服务器发送过来的数据,并将数据写入到中继日志中

    SQL thread:负责应用数据,一次从中继日志中读取一个命令,并执行

<b>区别主从服务器各自的名称或标识:</b>

为了避免日志的循环复制,要有身份标识Server ID(主从ID不能相同)

每个服务器在同一个架构里要有自己唯一的身份标识

<b>建立复制账号:</b>

赋予复制权限

<b>基于SSL</b><b>复制</b>:

    当跨越互联网进行复制时,数据传送都是明文的,所以建议用<b>SSL</b><b>加密</b>,需要建立CA,为主、从服务器发证

首先下载平台对应的mysql版本至本地,这里是32位平台,因此,选择的为mysql-5.5.20-linux2.6-i686.tar.gz

安装mysql 、这里就不给步骤了、如果不会请参考mysql的原理、安装、基本应用那个文档;

&gt; select version();   显示mysql的版本号;

MySQL从服务器的软件版本一定不能比主服务器的软件版本低,版本要高或一样。主主复制版本一定要一样。

<b>建立</b><b>MySQL</b><b>主服务器和从服务器:</b>

以下是两个刚创建的主从服务器例子:

主服务器的ip:172.16.39.1

从服务器的ip:172.16.39.2

<b>建立</b><b>MySQL</b><b>主服务器</b>:

主服务器

# vim /etc/my.cnf

server id = 1 (若主为1,从一定不能为1,记得要调整)

innodb_file_per_table = 1

主服务器上要启动二进制日志,默认启动:

log-bin=mysql-bin(而从服务器的二进制日志是否启动,要看它是否要作为其他服务器的主服务器,若不,就不需要启动了,可以注释)

在主服务上创建用户具有复制的权限:

mysql&gt; <b>grant replication client, replication slave on *.* to repl@'172.16.%.%' identified by 'redhat';</b>   在主服务器上创建用户

mysql&gt; <b>flush privileges;</b>    让其生效

查看所设置权限:

mysql&gt; <b>show grants for repl@'172.16.%.%';   确保没有问题、查看一下</b>  

<b>创建</b><b>MySQL</b><b>从服务器</b>:

server id = 11(值可任意填写,但不可与主服务器相同)

还可以再加一项,使每个文件一个表:

mysql&gt; show global variables like 'relay%';     查到的结果如下:

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

| Variable_name         | Value          |

| relay_log             |                |

| relay_log_index       |                |

| relay_log_info_file   | relay-log.info |

| relay_log_purge       | ON             |

| relay_log_recovery    | OFF            |

| relay_log_space_limit | 0              |

# vim /etc/my.cnf        按下面步骤启用

注释掉:

# log-bin=mysql-bin

启用:

relay-log=relay-bin           (“_”与“-”的意义是相同的)

relay-lob-index=relay-bin.index

要想生效,服务器重启:

# service mysqld restart;

查看从服务器运行状态:

mysql&gt; show slave status;

<b>启动从服务器的线程命令:</b>

MySQL的复制(Replication)与主从服务器的配置

查看帮助信息:

mysql&gt; help change master to

<b>启动从服务器的线程</b>:

mysql&gt; change master to 

-&gt; master_host='172.16.39.1',

-&gt; master_user='repl',

-&gt; master_password='redhat';

一旦执行 change master 命令,只要不换参数、不需要再执行;

要使用此命令明确启动slave:

mysql&gt; start slave;

mysql&gt; show slave status\G   <b>查看从服务器的工作属性</b>

查看这两条信息是否启动:

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

这个一定要是 YES

在从服务器上、 如果想看进程工作正常使用命令:

mysql&gt;<b>show processlist;</b>

MySQL的复制(Replication)与主从服务器的配置

服务正常、这个主从服务器就完成了;上面是两个刚创建的主从服务器;

下面是主服务器应用了一段时间后、再创建从服务器:

先备份主服务器上的所有数据:

命令:

#mysqldump --all-databases --lock-all-tables –master-data=2 &gt; /tmp/slave.sql

在复制到从服务器上去:

#scp /tmp/slave.sql 172.16.39.2:/tmp

然后在从服务器上导入数据;

导入前要关闭二进制日志 mysql&gt;<b>SET SQL_LOG_BIN=0;</b>

然后在导入数据: mysql&gt;<b>SOURCE /tmp/slave.sql; </b>

导入后在执行:<b>mysql&gt; change master to </b>

<b>-&gt; master_host='172.16.39.1',</b>

<b>-&gt; master_user='repl', </b>

<b>-&gt; master_password='redhat'</b><b>,</b>

<b>-&gt;master_log_file=’mysql-bin.000001’,</b>

<b>-&gt;master_log_pos=623;</b>

<b>623</b><b>是导入备份后的位置、一定要从这个位置开始;</b>

<b>#cd /tmp</b>

<b>#head -30 slave.sql</b>

<b>可以查看导入备份后的位置。</b>

<b> </b>

然后在<b>:</b>mysql&gt;<b>start slave;   <b>启动从服务器</b></b>

查看进程是否启动:mysql&gt;<b>show slave status\G</b>

继续阅读