MySQL主从复制、互为主从

in TCEHLinuxMySQL with 0 comment

一、主从复制简介

  主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。因为复制是异步进行的,所以从服务器不需要一直连接着主服务器,从服务器甚至可以通过拨号断断续续地连接主服务器。通过配置文件,可以指定复制所有的数据库,某个数据库,甚至是某个数据库上的某个表。

二、主从复制优势

1、提升系统并发性能
  分担单库并发压力,提高响应速度
2、数据备份
  可从从库进行数据备份,不影响整体
2、高可用
  当Master挂掉后,可以指定一台Slave充当Master继续保证服务的运行,因为数据是一致性的(如果当插入时Master就挂掉,可能不一致,因为同步也需要时间)当然这种配置不是简单的把一台Slave充当Master,毕竟还要考虑后续的Slave的数据同步到Master。在主服务器上执行写入和更新,在从服务器上向外提供读功能,达到读写分离的效果,也可以动态地调整从服务器的数量,从而调整整个数据库的性能;在主服务器上生成实时数据,而在从服务器上分析这些数据,从而提高主服务器的性能。

三、主从复制原理

1.jpg

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

四、主从复制配置

1.主库配置

修改MySQL配置
vi /etc/my.cnf,在[mysqld]下插入:

[mysqld]
log-bin=mysql-bin    # 开启二进制日志
server-id=1       #设置server-id,需要唯一
binlog-do-db = test  #只同步哪些数据库,除此之外别的都不同步

重启MySQL

service mysql restart 

创建用于数据同步的账号

mysql -u root -p 
# 创建用户,其中用户名后的为从数据ip地址
CREATE USER 'MySlave'@'192.168.xx.xx' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'password';
#分配权限  
GRANT REPLICATION SLAVE ON *.* TO 'MySlave'@'192.168.xx.xx';
#刷新权限
FLUSH PRIVILEGES;

查看master状态

show master status;

2.png

2.从库配置

修改MySQL配置
vi /etc/my.cnf,在[mysqld]下插入:

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

重启MySQL

service mysql restart 

进入mysql,进行同步

mysql -u root -p 
#指定master
CHANGE MASTER TO MASTER_HOST='192.168.xx.xx', MASTER_USER='MySlave', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=156;

启用同步

start slave;

查看slave状态

show slave status\G;

如下图即为正常,可创建表,添加数据验证
3.png

五、互为主从

  经过上面的锤炼,互为主从其实就是反过来操作就可以啦。

六、备注

1.究其原理,master库原先有数据,需手动迁移到slave库。
2.若发生SQL错误,已手动解决问题,可通过如下指令跳过错误

stop slave;
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
start slave;
Comments are closed.