我是靠谱客的博主 时尚棒球,这篇文章主要介绍分布式架构之数据库主从复制架设过程,现在分享给大家,希望可以做个参考。

1、复制方式

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

2、原理

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

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

先启动两个mysql镜像,如果有防火墙先把端口开了

复制代码
1
2
3
4
5
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

启动之后,分别进去两个容器进行设置才可以远程连接

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//进容器修改强加密规则 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的配置

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//进到容器 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修改配置

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//进到容器 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 statusG

在这里插入图片描述
测试同步,在主库新建数据库、表和数据,可以看到从库自动复制
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

注意:可能出现的问题

ERROR 1872 (HY000): Slave failed to initialize relay log info structure from,这种是日志保留了以前的复制i洗脑洗,在从库 reset slave; 再启动即可

如果此时Slave_SQL_Running=No,可以在主从库查看线程状态,show processlistG ,这种情况可能是在slave进行了写操作或者重启时事务回滚,此时试一下

复制代码
1
2
3
4
5
6
7
8
9
10
//第一种尝试 stop slave; set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; start slave; //第二种尝试 stop slave; //然后到master查看file和position,到slaver修改好 change master 的配置

4、问题

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

最后

以上就是时尚棒球最近收集整理的关于分布式架构之数据库主从复制架设过程的全部内容,更多相关分布式架构之数据库主从复制架设过程内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部