Home  >  Article  >  Database  >  MySQL 主从复制详解

MySQL 主从复制详解

WBOY
WBOYOriginal
2016-06-07 17:32:241062browse

mysql的复制时异步的,因此在接收到用户的请求之后,将结果返回给用户。并将信息存放在内存中,之后再记录进二进制文件中,这样会

一、MySQL复制原理
二:MySQL主从复制的实现
三、基于事件点的复制
四、半同步复制
五、基于ssl完成MySQL的主从复制

一、Mysql复制原理

对于主服务器来讲,会不停的吧当前数据库中产生的信息记录进二进制日志中,如果服务器端接收到客户端一个需要改变数据的语句之后,这个数据如果采用的是InnoDB的话,这些数据本身首先被记录进事务日志,这些会影响数据的语句会被记录进二进制日志中,而复制讲的是,另外一个从服务器上,被动的接受数据,本身并不接受客户端链接进来做任何写操作,复制是单向的,只能从主服务器到从服务器,因此,从服务器中的数据都是来自于主服务器,主服务是监听在3306端口上,从服务器启动了一个客户端进程,这个进程会向服务器点提供数据服务的端口发起请求,请求读取二进制日志中的事件,在主服务器点上,mysql主要提供认证服务,同时会启动一个sqldump线程,这个线程在接收到用户的请求后,并确保这个用户具有权限之后,会去读取二进制日志中的事件,如果客户端是第一次来请求,那么这个进程就读取日志中的第一个事件,读一个就发送给客户端一个,从服务的进程在接收到主服务器发行过来的数据之后,会保存在本地的中继日志,然后再启动一个具有特殊功能的线程,去中继之日中读取事件,读一行,在本地执行一下,以此类推,最终生成本地的数据库。mysql的复制时异步的,,因此在接收到用户的请求之后,将结果返回给用户。并将信息存放在内存中,之后再记录进二进制文件中,这样会造成从服务器落后与主服务器,但是这样也是有好处的,如果你有一个错误操作,在这个时间内,立即去从服务器上备份数据就OK,这需要mysql管理员把握。

二:mysql主从复制的实现

1、思路:

主服务器:

创建有复制权限的用户账号

设置server-id

启用二进制日志

从服务器:

启用中继日志。(可选择关闭二进制日志)

设置server-id

启动复制线程

2、过程实现:

2.1测试环境:

虚拟主机版本:

CentOS6.4-i686

两个节点:

node1.limian.com 172.16.6.10

node2.limian.com 172.16.6.1

2.2在两个节点上同步时间

1 [root@node1 ~]# ntpdate 172.16.0.1

2.3把mysql源码复制到另一个节点

1 [root@node1 ~]# scp mysql-5.5.33-linux2.6-i686.tar.gz 172.16.6.10:/root/

2.4源码编译mysql

节点1

[root@node1 ~]# tar xf mysql-5.5.33-linux2.6-i686.tar.gz -C /usr/local/  //解压mysql
[root@node1 ~]# mkdir -pv /mydata/data  //创建数据目录
[root@node1 ~]# useradd -r -u 306 mysql  //创建用户
[root@node1 ~]# chown -R mysql.mysql /mydata/data/ //修改数据目录的属主属组
[root@node1 ~]# cd /usr/local/
[root@node1 local]# ln -sv mysql-5.5.33-linux2.6-i686 mysql  //创建连接
[root@node1 local]# chown -R root.mysql mysql/*  //改mysql目录下的属主属组
[root@node1 mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data/                //初始化mysql
[root@node1 mysql]# cp support-files/my-large.cnf /etc/my.cnf  //提供配置文件
[root@node1 mysql]# vim /etc/my.cnf
datadir = /mydata/data              //指定数据目录
innodb_file_per_table = 1            //开启单表一个空间
[root@node1 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysql              //提供启动脚本
[root@node1 mysql]# chmod +x /etc/rc.d/init.d/mysqld  //赋予脚本执行权限
[root@node1 mysql]# vim /etc/profile.d/mysql.sh  //更改环境变量
export PATH=/usr/local/mysql/bin:$PATH
[root@node1 mysql]# . /etc/profile.d/mysql.sh  //重读下该文件
[root@node1 mysql]# chkconfig --add mysqld  //添加到服务列表
[root@node1 mysql]# service mysqld start      //启动mysql

2.5节点2同样执行上边操作

2.6配置主服务器

[root@node1~]# vim /etc/my.cnf
server-id      = 1            //设置ID
log-bin=mysql-bin              //启动二进制日志
binlog_format=mixed            //指定二进制日志的记录格式为混合模式
[root@node1 mysql]# mysql
mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO reuser@'172.16.%.%' IDENTIFIED BY 'repass';  //创建具有复制权限的用户
mysql> FLUSH PRIVILEGES;        //重读授权表
mysql> show master status;    //查看二进制日志中事件的位置
+------------------+----------+--------------+------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      352 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

2.7配置从服务器:

[root@node2 ~]# vim /etc/my.cnf
添加以下两行
server-id      = 20                //指定serverID
relay-log = /mydata/data/relay-bin  //指定中继日志的位置
read-only = 1  //开启只读模式
[root@node2 ~]# service mysqld restart  //重启mysql
[root@node2 ~]# mysql
mysql> show slave status;            //查看从服务器的状态信息
Empty set (0.02 sec)              //结果显示没启动任何线程
mysql> show processlist;            //查看启动线程
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host      | db  | Command | Time | State | Info            |
+----+------+-----------+------+---------+------+-------+------------------+
|  1 | root | localhost | NULL | Query  |    0 | NULL  | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+
1 row in set (0.03 sec)
结果显示没启动任何线程

2.8、配置从服务器连接主服务器

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn