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

MySQL 经典架构之 主从复制 实践

2016-10-06 10:47 459 查看
面试官:你简历上写着 了解Mysql,那你了解主从吗?识得姆识得啊?

我:(蛤?蛀虫?是某种针对数据库的病毒或者什么攻击手段吗?)不好意思,完全不识得,很惭愧,就@@#¥微小#¥%……

 回来之后我觉得我还是太年轻,太简单,有时还有点幼稚。

 于是我夺取了实验室那本已经落了灰的《高性能MySQL》,翻到了复制的那一章节,原来,这就是书中说的主库备库的复制!

 为了学习这宝贵的人生经验,我需要动手做实验,那么就要做三件事:

用VMware 创建三个虚拟CentOS系统,装上MySQL,来当作MySQL服务器集群(一个Master服务器,两个Slave服务器);

给3台服务器的MySQL,创建好相关帐户,配置好主从关系,启动从库的相关线程;

在主服务器(Master)上创建一个测试数据,建三个表,错了是一个表,插入一些神奇数据,看看另外两个从库有没有更新。

当然把实践过程进行各种截图保存到word里面也是很重要的!

一、主从复制原理

不讲原理的博文都有点过分,先看我下面这张我从网上盗来的图



主库如有数据更改,就会把更改记录到图中的二进制日志(Binary log)中;

从库已经启动了一个I/O线程,这I/O线程和主库建立了一个TCP/IP连接, 主库一有更新,I/O线程就会从主库日志中复制到自己的中继日志上(Relay Log);

从库的SQL线程从中继日志中读取事件,并重放到自己的数据库中,从而完成了复制同步。

其实书上还有更多的细节我没写出来,大概了解一下复制过程就好了吧,就三步。

二、配置主服务器Master

搞了三个数据库服务器分别为:

master (192.168.214.5)

slave1 (192.168.214.6)

slave2 (192.168.214.7)

1、首先进入master系统,修改my.cnf文件

# vi  /etc/my.cnf




这是为了简单起见,只写这两个,当然也可以设置更多需要的配置

2、保存,并重启mysql服务:

# service mysqld restart


3、进入 mysql, 运行 show master status, 如下图所示, master的二进制文件 mysql-bin已经在主库上创建了,这里MySQL会自己给文件名加一些数字,比如下面的000002,管它作甚,但这个文件名待会用到。



三、配置从服务器 Slave1 、Slave 2

1、修改mysql的my.cnf文件

# vi  /etc/my.cnf




其实上面几个配置里,只有server_id是必须的

log_bin 不是必须的,从库不需要二进制日志,但为什么书里建议加上这个呢?应该是为了方便以后的主库备库的互换吧

relay_log 指定中继日志的名字(如果加上路径的话,还可以指定文件位置)

log_slave_updates = 1 允许从库将其重放的事件也记录到自身的二进制日志中

2、保存,并重启mysql服务:

# service mysqld restart


slave2的配置也是一样,不过server_id不能一样

四、在主库master创建一个复制帐号

创建一个叫作“repl”的帐号,给这个帐号特殊的权限,让两个slave 可以用这个帐号来连接到 master 并读取二进制日志。

mysql > GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO ‘repl’@’192.168.214.%’IDENTIFIED BY ‘******’;




红色部分是密码,为了安全,这帐号只允许 ip 为192.168.214.* 来访问,当然你可以直接写成’%’, 反正只是做一些微小的实验

五、启动从库

就是告诉两个slave ,master在哪儿,我如何连接到master来完成那光荣的复制使命,下面是对slave1的配置,slave2是一样的

1、进入slave1系统的mysql中执行以下语句

mysql> CHANGE MASTER TO MASTER_HOST ='192.168.214.5',
MASTER_USER ='repl',
MASTER_PASSWORD ='123456',
MASTER_LOG_FILE ='mysql-bin.000002',
MASTER_LOG_POS = 0;




MASTER_LOG_POS = 0;是指要从二进制的开头读起(实际会从4开始读)。

2、查看一下复制执行状态

mysql> SHOW SLAVE STATUS\G




蛤?竟然没运行,按M安轨!还需要再执行启动命令

mysql> START SLAVE;


再查看一下



六、在主库Master上进行数据创建和更新

创建数据库 test

mysql > create database test;
mysql > use test;
mysql > create table hath_info(
uid int not null auto_increment,
name varchar(20) not null,
slogan varchar(40) not null,
primary key(uid)
);


插入一条神奇的数据

mysql > insert into hath_info(name, slogan) values(‘hath_007’,’too young, too simple, sometimes naive’);


七、到从库 slave1 和 slave2 上分别查看是否有变

下面查看的是slave1数据库(slave2同)



同步成功,表示热烈的祝霍

总结

  第一篇博客终于写完成,姿势水平很低,有点拿衣服,类似的文章网上有很多,我只是希望做一点微小的工作,把自己的实践记录下来,达到+1s的效果。

  如果有人不幸看到这篇文章,发现有问题的地方希望能指出,把我批判一番!我会不停地积累,争取有一天写的东西能让几百个程序员一致通过!

  

  下一篇我打算试试读写分离,希望能有下一篇。

  

参考文献

《高性能MySQL》第十章 复制

Edison Chou的博文

影中的你 的BLOG

还有一些博文,但我看完后就关掉了,忘了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql