一,什么是主从复制?
MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。
二,为什么要进行主从复制?
1、在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运行。
2、做数据的热备,主库宕机后能够及时替换主库,保证业务可用性。
3、架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O 访问的频率,提高单个机器的I/O性能。
三,主从复制的基本原理:
mysql要做到主从复制,其实依靠的是二进制日志,即:假设主服务器叫A,从服务器叫B;主从复制就是B跟着A学,A做什么,B就做什么。那么B怎么同步A的动作呢?现在A有一个日志功能,把自己所做的增删改查的动作全都记录在日志中,B只需要拿到这份日志,照着日志上面的动作施加到自己身上就可以了。这样就实现了主从复制。
实现原理图:
四,主从复制配置步骤:
一,Master配置(主):
- 开启二进制日志、配置server-id:
修改/etc/my.cnf文件,在[mysqld]段下添加:
#二进制日志文件名,自定义
log_bin=master-bin
#服务器唯一ID,一般取IP最后一段
server-id=88
#只同步哪些数据库,除此之外,其它的不同步
binlog-do-db=test
- 重启mysql服务
service mysql restart
- 建立帐户并授权slave
1、登录mysql
mysql -uroot -proot #-u后面是用户名 -p后面是密码
2、创建用户
mysql>GRANT FILE ON . TO ‘slave’@’%’ IDENTIFIED BY ‘123456’;
3、授权
mysql>GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . to ‘slave’@’%’ identified by ‘123456’;
4、刷新权限
mysql>FLUSH PRIVILEGES;
-
查看在mysql库user表中是否新增slave用户
-
我们可以通过以下指令查看master状态:
mysql> show master status;
主服务器配置完毕!记下master状态中File(二进制文件)和Position(定位)的值,配置从服务器中会用到。
二,Slave配置(从):
- 修改MySQL的UUID(因为我的第二台centos os系统复制过来的所以mysql的uuid是一样的,需要修改,如果是重新安装的MySQL,此步骤可省略):
方式一:
直接修改UUID,文件路径:/var/lib/mysql/auto.cnf 建议修改最后一个数字。
server-uuid=94a2734c-e6ab-11e9-8305-080027acd343
方式二:
将auto.cnf文件删除然后重启mysql服务,重启后会自动生成一个新的auto.cnf
- 修改/etc/my.cnf文件,在[mysqld]段下添加:
#不区分大小写
lower_case_table_names=1
#服务器唯一ID,一般取IP最后一段
server-id=89
3.重启mysql服务
service mysql restart
4.配置从服务器
mysql> change master to master_host=‘192.168.56.88’,master_port=3306,
master_user=‘slave’,master_password=‘123456’,master_log_file=‘master-bin.000002’,master_log_pos=120;
解释:
#master_host 主服务器的ip
#master_port 主服务器mysql的端口号
#master_user 主服务器登录时的用户名(也就是我们配置主创建的用户)
#master_password 服务器登录时的密码
#master_log_file 主服务器master状态中的File(前面让你们记下的)
#master_log_pos 主服务器master状态中的Position
如果执行时出现下列异常,则执行下列语句再重新执行就可以了。
mysql>STOP slave;
5.启动slave服务
mysql>start slave;
6.检查从服务器复制功能状态
mysql> show slave status;
(查询结果比较混乱可以在客户端中查询看,也可以在命令后加上 \G 格式化显示)
注意这两个字段的结果:
Slave_IO_Running: Yes //此状态必须Yes
Slave_SQL_Running: Yes //此状态必须Yes
当Slave_IO_Running和Slave_SQL_Running都为YES的时候就表示主从同步设置成功了。
五,验证
接下来就可以进行一些验证了,比如在主master数据库的test数据库的一张表中插入一条数据,在slave的test库的相同数据表中查看是否有新增的数据即可验证主从复制功能是否有效,还可以关闭slave(mysql>stop slave;),然后再修改master,看slave是否也相应修改(停止slave后,master的修改不会同步到slave),就可以完成主从复制功能的验证了。