一、什么是主从数据库

主从数据库就是把数据库架构分为主数据库和从数据库。从数据库是主数据库的备份,以提高数据的安全性,不至于一个数据库崩掉而导致整个项目也运行不起来。可以有效的防止财产的损失。一般从库只做查询操作,而主库则做更改操作,也就是所谓的读写分离。

二、什么是主主数据库

所谓的主主,其实也就是两个数据库互为主从。两个库都可以对数据库进行更改和读写操作,个人感觉是主从数据库的进化版,更加的实用,但是不足之处就是,如果有自增主键的话,很大可以会产生主键冲突,所以就需要一定的算法进行改进。

三、实现原理

第一步:master记录二进制日志

在每个事务更新数据完成之前,master在二进制日志记录这些改变。MySQL将事务写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。

第二步:slave将master的binary log拷贝到它自己的中继日志

首先,slave开始一个工作线程—I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经执行完master产生的所有文件,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。

第三步:SQL slave thread(SQL从线程)处理该过程的最后一步

SQL线程从中继日志读取事件,并重新执行其中的事件而更新slave的数据,使其与master中的数据一致。

废话不多说,直接操作

本次通过docker来实现主从和主主的实现

第一步 通过docker 下载mysql

docker pull mysql:5.7

查看是否安装成功

docker images

然后创建两个mysql数据库

docker run -d -p 3333:3306 --name master -e MYSQL_ROOT_PASSWORD=123456 docker.io/mysql:5.7
docker run -d -p 3334:3306 --name slave -e MYSQL_ROOT_PASSWORD=123456 docker.io/mysql:5.7

PS: 3333:3306 前边映射的是宿主机的端口 后边为docker本地端口

-e MYSQL_ROOT_PASSWORD=123456 设置数据库的密码

--name slave 数据库别名

第二步 进入mysql 更改mysql的配置文件

首先获取到两个mysql的容器id

docker ps

然后进入容器更改数据库的配置

docker exec -it 21d9f3f97d33 /bin/bash

进入到容器中 找到my.cnf这个文件然后更改里边配置即可

首先进入后可以通过 ls命令查看文件夹,然后进入 etc 文件夹中。有些人的my.cnf文件就在这里,也有的人可能在 etc/mysql里边,博主的my.cnf就在etc/mysql里边。然后使用 vi 编辑文件即可。

PS:新安装的docker 是没有vim 需要下载下

第一步
apt update //更新源
第二步
apt-get install vim //安装 vim

接着就可以修改配置文件(首先是master的配置信息)

[mysqld]
#配置服务器的服务号
server-id =1
log-bin = mysql-bin
binlog-ignore-db = mysql,information_schema
sync_binlog = 1
binlog_checksum = none
binlog_format = mixed
auto-increment-increment =2
auto-increment-offset= 1
slave-skip-errors = all

(salve的配置信息)

[mysqld]
#配置服务器的服务号
server-id =2
log-bin = mysql-bin
binlog-ignore-db = mysql,information_schema
sync_binlog = 1
binlog_checksum = none
binlog_format = mixed
auto-increment-increment =2
auto-increment-offset= 2
slave-skip-errors = all

如果docker的vi编辑使用不了的话,可以把文件拷贝到本地,然后在本地进行更改,本地更改完成后,再重新拷贝会docker中,代码流程如下

//把本地文件复制到docker容器
docker cp 本地路径(全路径) 容器id:docker路径
//注意容器id后边不能有空格 要不然会报错
例如: docker cp G:\home\docker_mysql\sql1\mysql\my.cnf 5a69d9cc57b2:/etc/ mysql
//把docker容器内文件复制到本地
docker cp 容器id:docker路径  本地路径

更改完成后打开我们的navicat

新建两个连接分别连接到我们新建的两个数据库(如图)

创建完成后,打开我们的主库(master)然后新建查询,依次执行一下代码

按顺序执行!!!

按顺序执行!!!

按顺序执行!!!(重要的事情说三遍)

CREATE USER salve IDENTIFIED BY 'root';
CREATE USER 'salve'@'172.17.0.1' IDENTIFIED BY 'root';
CREATE USER 'salve'@'192.168.2.14' IDENTIFIED BY 'root';//这里的ip 需要使用自己的IP地址grant replication slave on *.* to 'salve'@'%';
grant replication slave on *.* to 'salve'@'172.17.0.1';
grant replication slave on *.* to 'salve'@'192.168.2.14';//此地同理FLUSH PRIVILEGES;alter user 'salve'@'%' identified with mysql_native_password by 'root';
alter user 'salve'@'172.17.0.1' identified with mysql_native_password by 'root';
alter user 'salve'@'192.168.2.14' identified with mysql_native_password by 'root';//注意ip

然后执行下列代码

show master status;

结果大致如上(由于博主是在公司电脑上测的,文章是回来写的忘给截图了,只能借用下别人的了)

记住这两个字段后边会用到

接着打开我们的从库(salve)按顺序执行以下代码

CHANGE MASTER TO
MASTER_HOST = '192.168.2.14',  // 主库ip地址
MASTER_USER = 'master', // 刚刚授权的账号
MASTER_PASSWORD = 'root',//刚刚授权的密码
MASTER_PORT = 3333,//主库映射的本地ip
MASTER_LOG_FILE='mysql-bin.000001',// 主库show master status后的 file值
MASTER_LOG_POS=2384,//主库 show master status后的position值
MASTER_RETRY_COUNT = 60,
MASTER_HEARTBEAT_PERIOD = 10000; start slave; // 停止 stop slave

完成后执行下列代码


show slave status

当下列两个字段全为 YES 的时候 则表示成功  必须全为 YES

如若第一个不是 yes 那就说明你可能哪一步错了 重新搞一下应该就可以了

到此 主从数据库就结束了 我们就实现了主从数据库,但是呢从库只能进行查询操作,不能进行更改操作,一旦进行了更改操作那么两个数据库将不再同步 需要执行以下代码才可继续同步

//先停止
stop salve//表示跳过一步错误,后面的数字可变
set global sql_slave_skip_counter =l;//启动
start salve//查看
show slave status//Slave_IO_Running: Yes
//Slave_SQL_Running: Yes
//当两个都为 yes的时候说明成功了

接下来就是我们的主从数据库之主主数据库了

从上也不难理解所谓的主主也就是,二者互为主从关系,主库更改从库会跟着更改,从库更改主库也会跟着更改

其实通过上述主从数据库的操作也就大致能猜出主主数据库是怎么操作的了

其实实现起来也很简单,那就是在从库也添加一个授权账号和密码,在主库在进行下配置就可以了。废话不多说直接上代码

首先在从库的查询中添加以下代码,同样需要依次执行。

CREATE USER zhu IDENTIFIED BY '123456';
CREATE USER 'zhu'@'172.17.0.1' IDENTIFIED BY '123456';
CREATE USER 'zhu'@'192.168.2.14' IDENTIFIED BY '123456';grant replication slave on *.* to 'zhu'@'%';
grant replication slave on *.* to 'zhu'@'172.17.0.1';
grant replication slave on *.* to 'zhu'@'192.168.2.14';FLUSH PRIVILEGES;alter user 'zhu'@'%' identified with mysql_native_password by '123456';
alter user 'zhu'@'172.17.0.1' identified with mysql_native_password by '123456';
alter user 'zhu'@'192.168.2.14' identified with mysql_native_password by '123456';show master status;

然后就是 主库里进行配置了


CHANGE MASTER TO
MASTER_HOST = '192.168.2.14',
MASTER_USER = 'zhu',
MASTER_PASSWORD = '123456',
MASTER_PORT = 3334,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=2330,
MASTER_RETRY_COUNT = 60,
MASTER_HEARTBEAT_PERIOD = 10000; start slave;stop slaveshow slave status

其实你看到这也就明白,也就是进行了一次反向的主从绑定, 当然当你执行完最后一条代码看到两个YES的时候就说明,你已经成功了

码字不易,感谢大家三连支持

PS: 设置互为主从(即主主)的时候主键不要自增, 可能会出现主键冲突问题, 尽量自己设计主键的生成规则

Mysql 数据库 主从数据库 (主从)(主主)相关推荐

  1. mysql 强制读主库_laravel(lumen)配置读写分离后,强制读主(写)库数据库,解决主从延迟问题...

    在Model里面加上下面这句,强制读主(写)库数据库,解决主从延迟问题. public static function boot() { //清空从连接,会自动使用主连接 DB::connection ...

  2. Mysql数据库主从及主主复制配置演示

    From : http://www.cnblogs.com/tae44/p/4682810.html 实验系统:CentOS 6.6_x86_64 实验前提:提前准备好编译环境,防火墙和selinux ...

  3. k8s主从自动切换mysql_K8S与Ceph RBD集成-多主与主从数据库示例

    参考文章: 感谢以上作者提供的技术参考,这里我加以整理,分别实现了多主数据库集群和主从数据库结合Ceph RDB的实现方式.以下配置只为测试使用,不能做为生产配置. K8S中存储的分类 在K8S的持久 ...

  4. mysql主从 查询负载_MySQL集群:主从数据库配置 实现查询负载

    在做web应用系统中,如果数据库出现了性能瓶颈,而你又是使用的MySQL数据库,那么就可以考虑采用数据库集群的方式来实现查询负载了.因为一般来讲任何一个系统中数据库的查询操作比更新操作要多的多,因此通 ...

  5. mysql主从数据库含义_(转)Mysql数据库主从心得整理

    管理mysql主从有2年多了,管理过200多组mysql主从,几乎涉及到各个版本的主从,本博文属于总结性的,有一部分是摘自网络,大部分是根据自己管理的心得和经验所写,整理了一下,分享给各位同行,希望对 ...

  6. MySQL主从数据库同步延迟问题解决

    MySQL主从数据库同步延迟问题 摘要: MySQL的主从同步是一个很成熟的架构,优点为:①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;②在从主服务器进行备份,避免备份期间影响 ...

  7. mysql 主从,主主,主主复制时的主键冲突解决

    原理:slave 的i/o thread ,不断的去master抓取 bin_log, 写入到本地relay_log 然后sql thread不断的更新slave的数据 把主服务器所有的数据复制给从服 ...

  8. Zabbix 监控Mysql数据库及主从数据库

    Zabbix监控mysql主从数据库在脚步出现用户名和密码是会出现如下报错"Warning: Using a password on the command line interface c ...

  9. windows mysql 主从_mysql读写分离实战二-windows 上mysql主从数据库搭建及问题总结

    根据前篇web项目的搭建后,需要搭建主从数据库,这里在windows服务器上搭建了主从结构的mysql,这里在记录下在本机模拟搭建过程 在windows上安装和linux还是有些不同,不注意就会耽误不 ...

  10. 学一点 mysql 双机异地热备份----快速理解mysql主从,主主备份原理及实践

    学一点 mysql 双机异地热备份----快速理解mysql主从,主主备份原理及实践 原文 学一点 mysql 双机异地热备份----快速理解mysql主从,主主备份原理及实践 感谢大家在上一篇 学一 ...

最新文章

  1. FFmpeg Basic学习笔记(4)
  2. Spring和springmvc两个容器的关系
  3. Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)【系列1】...
  4. 伪代码的简单例子_使用策略+工厂模式彻底干掉代码中的if else!
  5. BZOJ5020: [THUWC 2017]在美妙的数学王国中畅游(LCT,泰勒展开,二项式定理)
  6. linux命令 sed 有的功能有,Linux命令:sed简介
  7. arm b bl 地址无关码_32位和64位下的arm_pwn初探
  8. 【华为云技术分享】解密如何使用昇腾AI计算解决方案构建业务引擎
  9. Windows Server 2003网络配置与管理
  10. 二维数组,字符串,字符数组
  11. python excel案例导入jira_用Python脚本批量添加JIRA用户,python,jira
  12. Atitit 命令指令的分类与权限 IMAP协议为例子 目录 1. 指令的作用的权限吧。 全局命令 未认证状态命令 未认证状态命令 选中状态指令 2 1.1. 1.在任何状态下都有效的指令(全局命
  13. 恢复更新--vue源码系列1之如何看源码
  14. 域名排名(前100万)
  15. win10电源设置选项无效--高级电源选项
  16. celebA数据集(StarGAN)分享
  17. 在matlab中建模基准地形和山峰
  18. 致那些喜欢站在上帝视角的人
  19. 面试前端程序员想拿 10K,面试官说你只值8K,如何应付?
  20. 软考高级-信息系统管理师之综合测试与管理(最新版)

热门文章

  1. WCF服务启动时遇到AddressAccessDeniedException
  2. python播放WAVE文件
  3. c#日期转换周几_C#根据日期计算星期几的实例代码
  4. Qt 统计文件夹的文件总大小
  5. 【持续更新】java 指令释疑
  6. 与cache相关的一些问题和思考
  7. linux环境下VSCode的C++环境搭建
  8. 进程互斥(当前程序已运行)
  9. VisionMaster 学习笔记(仪表盘检测)
  10. JAVA_JDK下载与安装教程(小白)