MySQL主从复制实践

为了减少一台数据库服务器的压力,这样一来即保证了数据的可靠性,同时提高服务器的高可用。现在搭建两台MySQL服务器:一台作为主服务器,一台作为从服务器。

MySQL主从复制

1.测试环境

名称 系统版本 MySQL版本 IP地址
主数据库 Centos 7.1 5.7 59.68.xx.xx
从数据库 Centos7.1 5.7 59.68.yy.yy

2.主从配置原理

MySQL主从复制实践_第1张图片
图片.png

Master服务器将数据的改变记录二进制日志,当Master上的数据发生改变时,则将其改变写入二进制日志中,Salve服务器会在一定时间间隔内对Master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求Master二进制事件,同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThreadSQLThread将进入睡眠状态,等待下一次被唤醒。

3.MySQL主从能解决什么问题

1.高可用

因为数据库服务器中的数据都是相同的,当Master挂掉后,可以指定一台Slave充当Master继续保证服务的运行,因为数据是一致性的(如果当插入时Master就挂掉,可能不一致,因为同步也需要时间)当然这种配置不是简单的把一台Slave充当Master,毕竟还要考虑后续的Slave的数据同步到Master。

2.负载均衡

因为读写分离也算是负载均衡的一种,所以就不单独写了,因为一般都是有多台Slave的,所以可以将读操作指定到Slave服务器上(需要代码控制),然后再用负载均衡来选择那台Slave来提供服务,同时也可以吧一些大量计算的查询指定到某台Slave,这样就不会影响Master的写入以及其他查询

3.数据备份

一般我们都会做数据备份,可能是写定时任务,一些特殊行业可能还需要手动备份,有些行业要求备份和原数据不能在同一个地方,所以主从就能很好的解决这个问题,不仅备份及时,而且还可以多地备份,保证数据的安全

4.业务模块化

可以一个业务模块读取一个Slave,再针对不同的业务场景进行数据库的索引创建和根据业务选择MySQL存储引擎

3.主从复制配置实现步骤

3.1大致步骤

  • 1、配置主数据库
    • 开启二进制日志
    • 配置唯一的server-id
    • 获得master二进制日志文件名及位置
    • 创建一个用于slave和master通信的用户账号
  • 2、配置从服务器
    • 配置唯一的server-id
    • 使用master分配的用户账号读取master二进制日志
    • 启用slave服务

3.2主数据库Master修改

1.修改MySQL的配置

找到主数据库的配置文件/etc/my.cnf,在[mysqld]部分插入如下两行:

[mysqld]
log-bin=mysql-bin #开启二进制日志
server-id=1 #设置server-id

2.重启MySQL,创建用于同步的用户账号

进入mysql,创建用户(此用户的目的是让从数据库服务器登录主服务器)并授权:用户名:DBSlave;密码:password

#创建用户 从数据库的地址
mysql> CREATE USER 'DBSlave '@'59.68.yy.yy' IDENTIFIED BY 'password';
#分配权限  
mysql> GRANT REPLICATION SLAVE ON *.* TO 'DBSlave'@'59.68.yy.yy';
#刷新权限
mysql>flush privileges;   

3.查看Master状态,记录二进制文件名(mysql-bin.000003)和位置(73)

mysql > SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000008| 154    | test         | manual,mysql     |
MySQL主从复制实践_第2张图片
image.png

3.3从服务器slave修改

1.修改mysql配置

同样找到my.cnf配置文件,添加server_id

[mysqld]
server-id=2 #设置server-id,必须唯一
log-bin=mysql-bin #开启二进制日志

2.重启mysql,打开mysql会话,执行同步SQL语句

mysql> CHANGE MASTER TO
    MASTER_HOST='59.68.xx.xx',
    MASTER_USER='DBSlave',
    MASTER_PASSWORD='password',
    MASTER_LOG_FILE='mysql-bin.000008',
    MASTER_LOG_POS=154;

3.启动salve同步进程

mysql > start slave;

4.查看slave状态

mysql > show slave status\G;

Slave_IO_RunningSlave_SQL_Running都为YES的时候就表示主从同步设置成功了。接下来就可以进行一些验证了,比如在主master数据库的test数据库的一张表中插入一条数据,在slave的test库的相同数据表中查看是否有新增的数据即可验证主从复制功能是否有效,还可以关闭slave(mysql>stop slave;),然后再修改master,看slave是否也相应修改(停止slave后,master的修改不会同步到slave),就可以完成主从复制功能的验证了。

MySQL主从复制实践_第3张图片
image.png

4.其他参数

Master开启二进制日志后默认记录所有库所有表的操作,可以通过配置来指定只记录指定的数据库甚至指定表的操作,具体在mysql配置文件的[mysql]可添加修改如下选项:

# 不同步哪些数据库  
binlog-ignore-db = mysql  
binlog-ignore-db = test  
binlog-ignore-db = information_schema  
  
# 只同步哪些数据库,除此之外,其他不同步  
binlog-do-db = test

测试

主数据库59.68.xx.xx:修改其中的一个字段的值

MySQL主从复制实践_第4张图片
image.png

然后从数据库刷新一下:看这个字段的值是否同步

MySQL主从复制实践_第5张图片
image.png

说明数据同步了!

参考资料

https://blog.csdn.net/envon123/article/details/76615059

https://www.cnblogs.com/gl-developer/p/6170423.html

你可能感兴趣的:(MySQL主从复制实践)