分布式架构之数据库主从复制

一、初探

1、复制方式

  • 基于行复制
  • 基于sql语句复制
  • 混合模式复制(先采用语句,发现无法精确复制时则换成行)

2、原理

  分布式架构之数据库主从复制_第1张图片

  • master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events,可以通过show binlog events进行查看)
  • slave将master的binary log events拷贝到它的中继日志(relay log)
  • slave重做中继日志中的事件,将改变反映它自己的数据

二、实战(这里用docker启动两个mysql)

  • 先启动两个mysql镜像,如果有防火墙先把端口开了
docker run -p 53306:3306 --name mysql53306 -v /usr/local/mysql53306/conf:/etc/mysql/conf.d -v /usr/local/mysql53306/logs:/logs -v /usr/local/mysql53306/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d docker.io/mysql
 
docker run -p 63306:3306 --name mysql63306 -v /usr/local/mysql63306/conf:/etc/mysql/conf.d -v /usr/local/mysql63306/logs:/logs -v /usr/local/mysql63306/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d docker.io/mysql
  • 启动之后,分别进去两个容器进行设置才可以远程连接
//进容器修改强加密规则
docker exec -it c7b1f3097a65 /bin/bash
mysql -uroot -p123456
use mysql
select user,plugin from user where user='root';
ALTER USER 'root'@'%' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;
//我们也可以打开日志,便于查看问题
show variables like '%general_log%';
set global general_log=on;

//另外给两个容器都装一下编辑器,后续会用到
apt-get update
apt-get install vim
  • 先进到master修改好master的配置
//进到容器
docker exec -it c7b1f3097a65 /bin/bash

//修改数据库配置文件 /etc/mysql/my.cnf,在[mysqld]后面加入配置
log-bin=mysql-bin //[必须]启用二进制日志
server-id=101 //[必须]服务器唯一ID,默认是1,一般取IP最后一段

//该文件除了基础的配置,还可以加额外的配置
# 不同步哪些数据库
binlog-ignore-db = mysql
binlog-ignore-db = t_test
# 只同步哪些数据库,除此之外,其他不同步
# binlog-do-db = t_mytest

//连接上数据库
mysql -uroot -p123456
//我们使用root用户
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';

//也可以可以创建一个新用户供从库使用,同时修改其加密规则
//CREATE USER 'slave'@'%' IDENTIFIED by '123456';
//授权,如果是replication SLAVE要注意能连接的库,GRANT ALL PRIVILEGES ON *.* TO 'user'@'ip段'; 
//GRANT ALL PRIVILEGES ON *.* TO 'slave'@'%';
//use mysql
//ALTER USER 'slave'@'%' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
//ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
//FLUSH PRIVILEGES;

//最后退出容器,重启
docker restart containerid
//进容器并连接mysql,查看状态
show master status;

   

  • 进到slave修改配置
//进到容器
docker exec -it c7b1f3097a65 /bin/bash

//修改数据库配置文件 /etc/mysql/my.cnf,在[mysqld]后面加入配置
//log-bin=mysql-bin //从库可以不启用二进制日志
server-id=102 //[必须]服务器唯一ID,默认是1,一般取IP最后一段

//退出容器,重启
docker restart containerid

//重新进入容器,连接上数据库
mysql -uroot -p123456
//修改,注意master_log_file和master_log_pos对应上master的file和position
change master to 
	master_host='192.168.1.60',
	master_user='root',
	master_password='123456',
	master_port=53306,
	master_log_file='mysql-bin.000001',
	master_log_pos=155;
//启动slave
start slave;
//查看状态
show slave status\G

   分布式架构之数据库主从复制_第2张图片

  • 测试同步,在主库新建数据库、表和数据,可以看到从库自动复制

    分布式架构之数据库主从复制_第3张图片分布式架构之数据库主从复制_第4张图片

    分布式架构之数据库主从复制_第5张图片分布式架构之数据库主从复制_第6张图片

  • 可以看到每次更新后主库的position会改变,从库相应复制后也改变所连接的主库的信息

    分布式架构之数据库主从复制_第7张图片

    分布式架构之数据库主从复制_第8张图片

注意:可能出现的问题

  • ERROR 1872 (HY000): Slave failed to initialize relay log info structure from,这种是日志保留了以前的复制i洗脑洗,在从库 reset slave; 再启动即可
  • 如果此时Slave_SQL_Running=No,可以在主从库查看线程状态,show processlist\G ,这种情况可能是在slave进行了写操作或者重启时事务回滚,此时试一下
//第一种尝试
stop slave;
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
start slave;

//第二种尝试
stop slave;
//然后到master查看file和position,到slaver修改好 change master 的配置

还有

三、问题

1、主从复制延时:可以使用当主库执行完事务后不立刻返回结果而是等到至少有一个从库复制成功后才返回结果给客户端

 

 

你可能感兴趣的:(数据库)