MySQL Replication
mysql的复制:
1:复制是什么?
复制是一种能力,将MySQL的数据分布到多个系统上去,这种分布的机制,是通过将MySQL的某一台主机的数据COPY到其它主机上,
并重新执行一遍来实现的。
@@mysql复制是其自带的,从某种程度上来讲,能够架构高可用的MySQL系统
----------------------------------------------------------------
2:实现的机制或说是原理:
主从架构:
一主多从的架构:
@@其修改的操作只能在主服务器上
主主架构:
@@可以有效避免一个主服务器的压力
环状主架构:
@@几台服务器互相COPY
一主从从架构:
@@一台主服务器,一台从服务器后还可以跟n台从服务器。
--------------------------------------
其架构还支持,将一台主服务器的部分数据复制到一台从服务器上,将另外一部分的数据复制到另一台的从服务器上。
@@此种机制要通过 Filter,过滤来实现。
--------------------------------------------------------
3:mysql的复制的类型:
(1):基于语句的复制:(其执行的时间有所差别,用户也有所差别)
@@在主服务器上执行的SQL语句,在从服务器上同样的执行的一边。
@@mysql默认采用基于语句的复制,效率比较高。一旦发现没法精确复制时,会自动选着基于行的复制。
(2):基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍
@@ 从mysql5.0开始支持
(3):混合类型的复制
@@默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。
------------------------------------------------------------------------------------------------------------
4:
mysql默认情况下只能为读提供扩展功能操作,而不能为写操作提供扩展功能。
单主服务器,在写操作比较多的情况下可能成为整个系统架构的瓶颈的。
-------------------------------------------------------------------------------
5:主从架构解决的问题 Problems Solved by Replicaton,也是从服务器带来的好处。
Data distribution 数据的分布
Load balancin 负载均衡(Mainly for Read)
Backups 用从服务器来实现备份
High availability and failover 高可用和故障转移的功能
Testing MySQL upgrades 测试MySQL软件的升级
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
6:主从架构工作的原理:
主服务器上每一个数据的修改,都会记录在二进制日志(Binary log)中去,
因此只要能够得到其二进制文件在从服务器上执行一遍就可以了。
从服务器上启动了一个进程-I/O thread 远程连接到主服务器上去。
并请求读取主服务器的二进制日志文件。把其二进制文件的内容都复制过来
保存到从服务器的中继日志文件(Relay log)中去。
从服务器一旦发现,中继日志中更新了,就启动一个新的线程SQL thread
这个线程会从中继日志文件中读取从主服务器上复制过来的,改变数据库的
每一个操作,并在当前服务器上从新应用一遍,或说是执行一遍。
@@二进制日志不能让人随便能够读取,有两个特殊的权限Replication Client,Replication Slave
这两个权限限定了,除了复制二进制日志,读取二进制日志文件相关信息的权限,没有任何的权限。
因此需要在主服务器上建立一个这样的用户,并在从服务器上使用。
@@如果我们的主从架构跨域互联网,且复制的过程是明文的,因此在Internet上传输,别人完全可以
抓包的形式,获取相关的数据。但复制是支持SSL的,所以要加密。
@@mysql服务器的ServerID默认情况都是1,为了避免循环复制,我们需要手动修改mysql的主配置文件
可以把从服务器的ServerID的修改为2,3,4,......
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
7:建立主从架构的规划:
主服务器:
启动二进制日志文件
修改ServerID
建立一个用户,具有那两个特殊权限
从服务器:
修改ServerID
启动中继日志(Relay log)
连接到主服务器
-------------------------------------------------------------------------------------------
配置主服务器:Configuring the Master
(1) The server ID is uesd to distinguish two servers from each other
(2) To set up the binary log and server ID ,you have to take the server down
and add the log-bin,log-bin-index,and server-id options to the my.cnf configuration file
log-bin: 二进制日志,其默认值on,代表着启用二进制日志,它的文件名默认是主机名+000001的形式,随主机名的改变
,二进制日志名也得改变。所以要设定一个固定的名字给它。不用给它指后缀的,系统自加的。
log-bin-index:此文件包含了当前系统被使用的所有的二进制日志文件。
server-id:
@@此定义是在my.cnf的[mysqld]字段定义
---------------------------------------------------------------------------------------------
创建一个数据库用户:
mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO repl@'192.168.0.%' IDENTIFIED BY 'password';
---------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
配置从服务器:Configuring the Slave
(1) As with the master server,you need to assign each slave a unique server ID
(2) You may also want to consider adding the names of the Relay Log and the Realy Log index files to the
my.cnf file using the options relay-log and relay-log-index.
----------------------------------------------------------------------------------------------
(3)连接到主服务器上:
mysql> CHANGE MASTER TO MASTER_HOST='server1',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='password',
---------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
主服务器:172.16.100.1
从服务器:172.16.100.2
这两个服务器都是干净的服务器,也就是原始数据都相同。
-----------------------------------------------------
主服务器:
(1):编辑主配置文件my.cnf
# vim /etc/my.cnf
@@找到log-bin
log-bin=mysql-bin
@@添加log-bin-index
log-bin-index=mysql-bin.index
@@使server-id 等于1
server-id =1
# service mysqld restart
--------------------------------------------
(2):创建mysql用户
# mysql
mysql> GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO repl@'172.16.%.%' IDENTIFIED BY 'redhat';
@@添加用户repl ,设置其权限,密码
mysql> FLUSH PRIVILEGES;
mysql> SHOW MASTER STATUS;
@@可以查看主服务器的状态。
----------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------
从服务器:
(1):编辑主配置文件:
# vim /etc/my.cnf
@@可以关闭二进制文件的功能
#log-bin=mysql-bin
#binlog_format=mixed
@@添加relay-log,relay-log-index
relay-log=relay-bin
relay-log-index=relay-bin.index
@@修改server-id的值
server-id =2
# service mysqld start
---------------------------------------------------
(2):连接到主服务器上:
# mysql
mysql> CHANGE MASTER TO MASTER_HOST='172.16.100.1', MASTER_USER='repl', MASTER_PASSWORD='redhat', MASTER_LOG_FILE='mysql-bin.000001';
mysql> SHOW SLAVE STATUS\G;
@@可以查看从服务器的状态。
mysql> START SLAVE; @@启动从服务器的
mysql> SHOW SLAVE STATUS\G;
@@主要查看
Slave_IO_Running, Slave_SQL_Running这两个选项的状态值。
@@此时如果发现有错误,可以在主服务器上,查看错误日志。
# cd /mydata/data
# tail localhost.localdomain.err
-------------------------------------------------------------------------------------
(3)可以设置从服务器的数据库为只读的,以防不懂数据库的人修改数据库
# mysql
mysql> SHOW VARIABLES LIKE '%read_only%';
@@可以查看read_only的值。设置其值为ON
mysql> SET GLOBAL read_only=ON;
-------------------------------------------------------------------------------------
测试:
在主服务器上创建个数据库,在数据库中创建个表
# mysql
mysql> CREATE DATABASE hellodb;
mysql> use hellodb;
mysql> CREATE TABLE t1 (
-> NAME VARCHAR(15));
此时可以进行相关的验证,看配置的复制功能是否成功。