MySQL的复制(Replication):
 
复制:BinaryLog(二进制日志)把它复制到另外一台服务器上去。在执行一次!则另外一台服务器就会跟此台服务器的一样;这样主要是做备份;
 
当服务器性能瓶颈时、解决的方案
提高性能的方法
    向上扩展(SCALE ON):很少用,通过提供一个性能更好的服务器,来扩展服务器处理能力的方式。 有一缺陷:性能扩展n倍,意味着价格通常扩展m*n倍,代价非常高。
向外扩展(SCALE OUT):通过提供多台服务器的方式,将访问压力平均分摊到不同的服务器中去。
 
Cluster(集群)
Load Balancing(负载均衡集群LB):将一个应用的请求分摊到多个服务器上,进而提供更好的性能表现的集群
High Availability(高可用集群HA):本身不能起到负载均衡的能力。主要目的:为了防止某一台服务器出现故障时,导致整个服务不可用,而为其提供备用机,或冗余机制。
High Performance(高性能集群HP):提供超级计算能力,完成复杂运算。将一非常大的运算需求切割成n片,每一台计算机计算一片,完成之后,返回给切片的计算机整合起来,得最终结果。
最常见的是前两种集群
MySQL Replication
就是一种能够通过向外扩展,将mysql的请求平均分担到多台mysql服务器的负载均衡集群,同时结合第三方的控制组件或软件,能够让mysql复制集群制作成既有负载均衡能力,又有高可用特征的集群。
 
MySQL的复制是能够将数据从一个MySQL服务器(master)传输或复制到另一台或多台MySQL服务器(slave)上的机制。
 
中继日志:主服务器将数据传输到从服务器后,数据存储到中继日志中,而并非存储到磁盘上,从服务器会启动一个mysql进程读取中继日志,在mysql数据库上执行,最终实现了主从服务器上数据的一致。
 
从服务器是否复制二进制日志,取决与架构设计。
MySQL主从复制是异步复制。
主服务器从服务器复制有:
异步(async:只要发送过去就算完成,不管接收方是否接收到 写操作在内存中完成的。
同步(sync:发送方要接收到接收方的确认信号以后才终止传输
 
从服务器延时(Delayed):
只要是异步,就不可避免
 
从服务器的写操作从来都是单线程的,而主服务器却可以一次写入多个。
主从复制启动3个线程
主:dump thread:负责提供数据,将二进制日志文件的内容读取出来,发送给从服务器的专用线程的线程
从:I/O thread:负责接收主服务器发送过来的数据,并将数据写入到中继日志中
    SQL thread:负责应用数据,一次从中继日志中读取一个命令,并执行
 
区别主从服务器各自的名称或标识:
为了避免日志的循环复制,要有身份标识Server ID(主从ID不能相同)
每个服务器在同一个架构里要有自己唯一的身份标识
 
建立复制账号:
赋予复制权限
基于SSL复制
    当跨越互联网进行复制时,数据传送都是明文的,所以建议用SSL加密,需要建立CA,为主、从服务器发证
 
 
 
首先下载平台对应的mysql版本至本地,这里是32位平台,因此,选择的为mysql-5.5.20-linux2.6-i686.tar.gz
安装mysql 、这里就不给步骤了、如果不会请参考mysql的原理、安装、基本应用那个文档;
 
> select version();   显示mysql的版本号;
MySQL从服务器的软件版本一定不能比主服务器的软件版本低,版本要高或一样。主主复制版本一定要一样。
 
建立MySQL主服务器和从服务器:
以下是两个刚创建的主从服务器例子:
主服务器的ip:172.16.39.1
从服务器的ip:172.16.39.2
建立MySQL主服务器
主服务器
# vim /etc/my.cnf
server id = 1 (若主为1,从一定不能为1,记得要调整)
innodb_file_per_table = 1
主服务器上要启动二进制日志,默认启动:
log-bin=mysql-bin(而从服务器的二进制日志是否启动,要看它是否要作为其他服务器的主服务器,若不,就不需要启动了,可以注释)
 
在主服务上创建用户具有复制的权限:
mysql> grant replication client, replication slave on *.* to repl@'172.16.%.%' identified by 'redhat';   在主服务器上创建用户
 
mysql> flush privileges;    让其生效
查看所设置权限:
mysql> show grants for repl@'172.16.%.%';   确保没有问题、查看一下  
 
创建MySQL从服务器
 
# vim /etc/my.cnf
server id = 11(值可任意填写,但不可与主服务器相同)
 
还可以再加一项,使每个文件一个表:
innodb_file_per_table = 1
 
mysql> 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> show slave status;
 
启动从服务器的线程命令:
查看帮助信息:
mysql> help change master to
启动从服务器的线程
mysql> change master to 
-> master_host='172.16.39.1',
-> master_user='repl',
-> master_password='redhat';
一旦执行 change master 命令,只要不换参数、不需要再执行;
要使用此命令明确启动slave:
mysql> start slave;
 
mysql> show slave status\G   查看从服务器的工作属性
 
查看这两条信息是否启动:
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
这个一定要是 YES
在从服务器上、 如果想看进程工作正常使用命令:
mysql>show processlist;
 
服务正常、这个主从服务器就完成了;上面是两个刚创建的主从服务器;
 
下面是主服务器应用了一段时间后、再创建从服务器:
 
先备份主服务器上的所有数据:
命令:
#mysqldump --all-databases --lock-all-tables –master-data=2 > /tmp/slave.sql
在复制到从服务器上去:
#scp /tmp/slave.sql 172.16.39.2:/tmp
 
然后在从服务器上导入数据;
导入前要关闭二进制日志 mysql>SET SQL_LOG_BIN=0;
然后在导入数据: mysql>SOURCE /tmp/slave.sql;
导入后在执行:mysql> change master to 
-> master_host='172.16.39.1',
-> master_user='repl',
-> master_password='redhat'
->master_log_file=’mysql-bin.000001’,
->master_log_pos=623;
623是导入备份后的位置、一定要从这个位置开始;
#cd /tmp
#head -30 slave.sql
可以查看导入备份后的位置。
 
然后在mysql>start slave;   启动从服务器
查看进程是否启动:mysql>show slave status\G