您的位置:首页 > 数据库 > MySQL

MySQL主从数据库搭建指南,相信我,能让你的数据万无一失

2015-12-25 12:56 423 查看
原理:

mysql的整个主从复制过程实际上就是:slave端从master端获取binlog日志,然后再在自己身上完全顺序的执行该日志中所记录的各种SQL操作,所以binlog日志功能必须开启。

数据同步过程:

MySQL主从复制的基本交互过程,如下:

1、slave端的IO线程连接上master端,并请求从指定binlog日志文件的指定pos节点位置(或者从最开始的日志)开始复制之后的日志内容。

2、master端在接收到来自 slave端的IO线程请求后,通知负责复制进程的IO线程,根据slave端IO线程的请求信息,读取指定binlog日志指定pos节点位置之后的日志信息,然后返回给slave端的IO线程。该返回信息中除了binlog日志所包含的信息之外,还包括本次返回的信息在master端的binlog文 件名以及在该binlog日志中的pos节点位置。

3、slave端的IO线程在接收 到master端IO返回的信息后,将接收到的binlog日志内容依次写入到slave端的relaylog文件(mysql-relay- bin.xxxxxx)的最末端,并将读取到的master端的binlog文件名和pos节点位置记录到master-info(该文件存在slave 端)文件中,以便在下一次读取的时候能够清楚的告诉master“我需要从哪个binlog文件的哪个pos节点位置开始,请把此节点以后的日志内容发给 我”。

4、slave端的SQL线程在检 测到relaylog文件中新增内容后,会马上解析该log文件中的内容。然后还原成在master端真实执行的那些SQL语句,并在自身按顺丰依次执行 这些SQL语句。这样,实际上就是在master端和slave端执行了同样的SQL语句,所以master端和slave端的数据是完全一样的。

以上mysql主从复制交互过程比较复杂,理解起来也比较麻烦,我简化了该交互过程。如下:

1、master在执行sql之后,记录二进制log文件(bin-log)。

2、slave连接master,并从master获取binlog,存于本地relay-log中,然后从上次记住的位置起执行SQL语句,一旦遇到错误则停止同步。

从以上mysql的Replication原理可以看出:

* 主从间的数据库不是实时同步,就算网络连接正常,也存在瞬间主从数据不一致的情况。

* 如果主从的网络断开,则从库会在网络恢复正常后,批量进行同步。

* 如果对从库进行修改数据,那么如果此时从库正在在执行主库的bin-log时,则会出现错误而停止同步,这个是很危险的操作。所以一般情况下,我们要非常小心的修改从库上的数据。

* 一个衍生的配置是双主、互为主从配置,只要双方的修改不冲突,则可以工作良好。

* 如果需要多主库的话,可以用环形配置,这样任意一个节点的修改都可以同步到所有节点

环境:

(以下是我这次搭建所使用的环境)

主数据库:

系统:ubuntu ; 数据库:MYSQL;

从数据库

系统:ubuntu ; 数据库:MYSQL;

步骤:

1.在两台mysql上创建同步用户,让两个mysql可以互相通过username/username用户访问对方。

(username是你的mysql用户名;pasword是你的mysql密码)

主执行:GRANT ALL PRIVILEGES ON *.* TO 'username'@'从ip' IDENTIFIED BY 'password' WITH GRANT OPTION;

从执行:GRANT ALL PRIVILEGES ON *.* TO 'username'@'主ip' IDENTIFIED BY 'password' WITH GRANT OPTION;

2.修改两台数据库的配置文件。

主数据库:

打开/etc/mysql/my.cnf: vi /etc/my.cnf 找到[mysqld]在其下添加下面选项:

(有的数据库配置文件路径可能是 /etc/my.cnf)

log-bin=mysql-bin //启用二进制日志文件

innodb_flush_log_at_trx_commit = 1 //默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。日志仍然会每秒flush到硬盘,所以你一般不会丢失超过1-2秒的更新。设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统挂了时才可能丢数据。

sync_binlog=1 //这个跟上面那个差不多,1是最慢的也是最安全的

binlog-do-db=dreamwriter //需要进行同步的数据库,对于多个数据库,重复选项多次即可

binlog-ignore-db=mysql //不进行同步的数据库,对于多个数据库,重复选项多次即可

replicate-do-db=dreamwriter //需要进行同步的数据库,对于多个数据库,重复选项多次即可

server-id=1 //主数据库将server-id设置为1:

注意server-id选项必须打开,并且集群中每个mysql都要有一个单独的值,不能重复。一般设置主为1,从为2, 3, 4....。只要不相同什么整数都没有关系,也可以设置为IP的值,如:202,203.

得到主数据库二进制log文件和位置ip:

重启mysql;

执行sql语句:show master status;

结果:

记住File = mysql-bin.000001 Position =107;下面步骤要用到。

从数据库:

Vi /etc/mysql/my.cnf;

log-bin=mysql-bin #启用二进制日志文件

server-id=2 #设置数据库ID

binlog-do-db=databasename #二进制需要同步的数据库(多个用逗号分隔)

binlog-ignore-db=mysql #避免同步的数据库(多个用逗号分隔)

#配置主从同步

server-id=2 #从服务器ID

master-host=192.168.28.128 #主服务器IP

master-user=gnh1 #主服务器登陆名

master-password=112233 #主服务器登陆密码

master-port=3306 #主服务器断口

master-connect-retry=60 #断点从新连接时间(秒)

replicate-ignore-db=mysql #屏蔽对MYSQL库的同步

replicate-do-db=wuliu #二进制需要同步的数据库

文中该颜色部分可能已经过时,据网上消息介绍,Mysql版本从5.1.7以后开始就不支持“master-host” 类似的参数。所以可能报错:

[ERROR] mysqld: unknown variable ‘master-host=192.168.28.128′。

所以只需添加两行:

server-id = 2

replicate-do-db =dreamwriter //同步的数据库

执行SQL语句:

change master to master_host=’121.42.59.152’,master_user=’xx’, master_password=’xx’,master_log_file=’mysql-bin.000001′,master_log_pos=107;

查看从数据库配置状态(需要重启Mysql)

show slave status;

查看结果字段Slave_IO_State,一般应该为"Waiting for master to send event",此时Slave_IO_Running和Slave_SQL_Running应该为yes或者true,

如果不是,在slave端执行: stop slave; start slave; 重启复制进程。Replicate_Do_DB为要复制的数据库,和my.cnf配置的相同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: