主从同步,听名字是不是挺高大上的,其实原理很简单,就是两个mysql数据库,一个设置为主库,一个设置为从库,当我们对主库进行操作(比如新增、删除数据)的时候,将操作记录下来(比如记录在一个约定的文件中),然后从库去检测主库的操作记录,如果发现主库的数据有变更,那么从库就根据操作记录,同步的对自己的数据进行变更,这样就保证了主库、从库的数据一致性,这就是所谓的主从同步。
那么为什么要使用主从同步呢,主要有两个原因:
一是可以提高数据库的效率,比如一个数据库读写操作很平凡,mysql数据库在进行写操作的时候,是会进行锁库的,所以就会造成数据库性能下降,这时我们用主从方式配置多台数据库,主库进行增、删、改操作,从库进行查询操作,这样就能大大提高数据库的效率;
二是可以进行数据备份,我们配置了多台数据库,假如其中一台挂掉了,也不至于造成数据全部丢失的损失;
所以现在mysql的主从应用十分广泛,很多大型项目都会采用多主多从的mysql集群,实现高可用的数据访问;这里只是讲讲最基本的一主一从两台数据库的集群方式,更多高级的应用,留待后面深入学习研究。
开始前的准备工作:两台安装了mysql的电脑。这里我在自己的本机上,用VMware虚拟机来模拟两台电脑,因为基本所有的项目都部署在linux环境,所以我在虚拟机上安装的ubuntu系统,系统安装好之后,再安装mysql数据库,最好保持两台电脑上的数据库版本一致,至于怎么在虚拟机上安装ubuntu系统,还有怎么在ubuntu中安装mysql这些问题,可以自行百度,有各种教程,这里就不一一讲述。
如下图,我已经安装好了两台ubuntu,也在上面安装好了mysql数据库,两个mysql的版本都是5.7.19
我们以Ubuntu64上的mysql为主数据库,以Ubuntu65上的mysql为从数据库,来进行配置操作
步骤一:记下两台电脑的ip地址,在ubuntu上打开终端窗口,输入命令ifconfig,可以查看IP地址,我的两个地址为 192.168.244.128 和 192.168.244.129
步骤二:数据库配置,ubuntu下mysql的默认安装目录是 /etc/mysql ,配置文件路径为 /etc/mysql/mysql.conf.d/mysqld.cnf
【主数据库配置】
1、新建数据库test_db(这就是我们用来测试数据同步的数据库),开始里面什么东西都没有;
2、打开配置文件 mysqld.cnf ,找到配置项 #server-id=1 ,修改如下
server-id=1 #服务器 id,随便写,但是不能和从数据库一致
log-bin=/var/log/mysql/mysql-slow.log #日志文件存放路径
binlog-do-db=test_db #待同步的数据库
3、注释掉 #bind-address= 127.0.0.1 #只允许本地访问
4、保存并重启mysql服务,命令为 service mysql restart
5、登陆数据库:mysql -u用户名 -p密码 (mysql -uroot -p123456)
6、给要连接的从服务器设置权限:grant replication slave,reload,super on *.* to test@192.168.244.129 identified by '123456';
7、输入命令 show master status ,找到File 和 Position 的值记录下来;如下图
这个File,就是记录主库操作的文件,Position就是文件中记录开始的位置,从数据库就是通过这两个值来确定需要同步的数据
【从数据库配置】
1、新建数据库test_db;
2、打开配置文件 mysqld.cnf ,找到配置项 #server-id=1 ,修改如下
server-id=2 #服务器 id,不能和主数据库一致
log-bin=/var/log/mysql/mysql-slow.log #日志文件存放路径
binlog-do-db=test_db #待同步的数据库
3、注释掉 #bind-address= 127.0.0.1 #只允许本地访问
4、保存并重启mysql服务,命令为 service mysql restart
5、从服务器上测试:mysql -utest -p123456 -h 192.168.244.128,查看能否连接主数据库成功(我这里显示连接成功);
6、输入exit;断开主库连接,连接本地从库(mysql -uroot -p123456),修改从数据库对主数据库的连接的参数
change master to master_host='192.168.244.128',master_user='test',master_password='123456', master_log_file='mysql-bin.000001',master_log_pos=466;
(这里输入的mysql-bin.000001和466就是主数据库配置中7记录下来的值)
7、设置完之后,执行 start slave ; 开启slave线程;执行show slave status\G ,查看


CREATE TABLE `my_user` (
`user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_name` varchar(100) NOT NULL COMMENT '用户名',
`user_password` varchar(100) NOT NULL COMMENT '用户密码',
`user_age` int(5) NOT NULL COMMENT '用户年龄',
`user_phone` varchar(50) NOT NULL COMMENT '用户手机号',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8;
在数据表my_user中插入4条数据
INSERT INTO `my_user` VALUES ('2', '李四', '222222', '21', '18111112222');
INSERT INTO `my_user` VALUES ('3', '王五', '333333', '22', '18211112222');
INSERT INTO `my_user` VALUES ('4', '赵六', '444444', '23', '18511112222');
INSERT INTO `my_user` VALUES ('5', '马七', '555555', '24', '18711112222');
3、接下来,到从库(Ubuntu65),进行如下操作
可以看到,已经有了数据表my_user,这就是通过主从同步,数据库自动帮我们进行的操作,再来查询一下数据,如下
可以看到,数据也同步了过来。
注意:如果对从数据库进行修改,是不会同步对主数据库进行修改的,所以insert,delete update 操作都应该是对主数据库的操作, 而select操作则对从数据库进行操作,如果想
要操作从数据库也能同步到主数据库,这就是主主同步模式,除此之外还有更加复杂的一主多从,多主多从模式,后面有机会再写文章进行介绍。
到这里,mysql的主从同步已经全部配置完成,后买我们讲到数据库读写分离的时候,就会利用这个主从同步来做,欢迎持续关注!