目录

  • 一 MySQL主从配置原理(主从分离,主从同步)
  • 三:django实现主从读写分离(主从同步)

一 MySQL主从配置原理(主从分离,主从同步)

mysql主从配置的流程大体如图:

1)master会将变动记录到二进制日志里面;

2)master有一个I/O线程将二进制日志发送到slave;

3)slave有一个I/O线程把master发送的二进制写入到relay日志里面;

4)slave有一个SQL线程,按照relay日志处理slave的数据;

二 操作步骤

2.1我们准备两台装好mysql的服务器(我在此用docker模拟了两台机器)

环境 mysql版本 ip地址:端口号
主库(master) 5.7 172.16.209.100:33307
从库(slave) 5.7 172.16.209.100:33306

用docker拉起两个mysql容器,步骤如下(对docker不熟悉的同学可以查看docker快速入门章节):

# 拉取mysql5.7镜像
docker pull mysql:5.7#在home目录下创建mysql文件夹,下面创建data和conf.d文件夹
mkdir /home/mysql
mkdir /home/mysql/conf.d
mkdir /home/mysql/data/
# 为了目录映射#在home目录下创建mysql文件夹,下面创建data和conf.d文件夹
mkdir /home/mysql2
mkdir /home/mysql2/conf.d
mkdir /home/mysql2/data/# 创建my.cnf配置文件(mysql1配置文件)
touch /home/mysql/my.cnf# 创建my.cnf配置文件(mysql2配置文件)
touch /home/mysql2/my.cnf
# 切换到home
cd /home# 1.切换到mysql路径内
vim /mysql/my.cnf# mysql/my.cnf添加如下内容:(配置主库)
[mysqld]  # 服务端配置
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000 server-id=100  # id号
# 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin# 主库需要配以下两句[client]  # 客户端配置
default-character-set=utf8[mysql]  # mysql配置
default-character-set=utf8
# 2.切换到mysql2路径内
vim /mysql2/my.cnf# mysql2/my.cnf添加如下内容:(配置从库)
[mysqld]
user=mysql  # 启动用户
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000 # 从库需要配以下三句   server-id=101  # 从库id号
# 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-slave-bin
# relay_log配置中继日志
relay_log=edu-mysql-relay-bin
#启动主库容器(挂载外部目录,端口映射成33307,密码设置为123456)
docker run  -di -v /home/mysql/data/:/var/lib/mysql -v /home/mysql/conf.d:/etc/mysql/conf.d -v /home/mysql/my.cnf:/etc/mysql/my.cnf -p 33307:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
#启动从库容器(挂载外部目录,端口映射成33306,密码设置为123456)
docker run  -di -v /home/mysql2/data/:/var/lib/mysql -v /home/mysql2/conf.d:/etc/mysql/conf.d -v /home/mysql2/my.cnf:/etc/mysql/my.cnf -p 33306:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# docker ps# 没有mysql就安装

2.2 远程连接入主库和从库

远程连接主库

#连接主库
mysql -h 47.102.133.190 -P 33307 -u root -p123456
#在主库创建用户并授权
##创建test用户
create user 'test'@'%' identified by '123';
##授权用户(任何表库,任何ip地址登录方式)
grant all privileges on *.* to 'test'@'%' ;
###刷新权限
flush privileges;
#查看主服务器状态(显示如下图)
show master status;
mysql-bin : bin-log日志
# Position数据位置: 21281.从库下次写入就在该位置复制或者从头开始0位置复制进行主从同步,

远程连接从库

# 远程连接从库
mysql -h 47.102.133.190 -P 33306 -u root -p123456
#配置详解
/*
change master to
master_host='MySQL主服务器IP地址',
master_user='之前在MySQL主服务器上面创建的用户名',
master_password='之前创建的密码',
master_log_file='MySQL主服务器状态中的二进制文件名',
master_log_pos='MySQL主服务器状态中的position值,0表示从头开始复制';
*/
#命令如下
change master to master_host='47.102.133.190',master_port=33307,master_user='test',master_password='123',master_log_file='mysql-bin.000003',master_log_pos=0;
#启用从库(从库上执行)
start slave;
#查看从库状态(如下图)
show slave status\G; 

2.3 测试主从同步

#在主库上创建数据库test1
create database test1;
use test1;
#创建表
create table tom (id int not null,name varchar(100)not null ,age tinyint);
#插入数据
insert tom (id,name,age) values(1,'xxx',20),(2,'yyy',7),(3,'zzz',23);
#在从库上查看是否同步成功
#查看数据库
show database;
use test1;
#查看表
show tables;
#查看数据
select * from tom;

三:django实现主从读写分离(主从同步)

# s1.pyimport os
# 脚本中调用django的环境
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djang333.settings')import django
# 启动django
django.setup()from app01.models import Bookif __name__ == '__main__':# 手动方式实现读写分离:# 插入,修改,删除使用主库(default)# using('default')  : 指定使用default主库写入(不写默认default)# Book.objects.using('default').create(name='金梅瓶', price=11)# 查询使用从库(db1)# using() queryset对象方法# using('db')  : 指定使用db从库查询# res=Book.objects.using('db').filter(pk=1)# res=Book.objects.using('default').filter(pk=1)# print(res)# 自动方式(读写分离):# 插入,修改,删除使用主库(default)Book.objects.create(name='杀无赦', price=100)# 查询使用从库(db1)res = Book.objects.filter(pk=1).first()print(res.name)
# models.py
from django.db import modelsclass Book(models.Model):name = models.CharField(max_length=32)price = models.IntegerField()
# 1.在setting.py中配置DATABASES = {# 主库'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'db_test','USER': 'root','PASSWORD': '123456','HOST': '47.102.133.190','PORT': 33307,},# 从库'db1': {'ENGINE': 'django.db.backends.mysql','NAME': 'db_test','USER': 'root','PASSWORD': '123456','HOST': '47.102.133.190','PORT': 33306,},
}# 在setting中注册
# 注册一下
# 配置全局数据库路由
DATABASE_ROUTERS = ['app01.db_router.DataRouter']
# 以后只要是写操作,就会用default,只要是读操作自动去db1
# db_router.py# 数据库路由
class DataRouter:def db_for_read(self, model, **hints):return 'db1'def db_for_write(self, model, **hints):return 'default'
# 迁移数据库,同步makemigrations --merge   # 需要跟同事写的合并一下数据makemigrationsmigrate --database=default  # 将迁移记录同步到default库中migrate --database=db1  # 将迁移记录同步到db1中

# 创建数据库db_test

makemigrations # 迁移数据库migrate  # 同步数据库

# 实现读写分离

MySQL主从配置(Django实现主从配置读写分离)相关推荐

  1. MySQL使用Mycat实现分库分表-读写分离

    MySQL使用Mycat实现分库分表-读写分离 Mycat Mycat介绍 什么是Mycat? Mycat架构 Mycat核心概念 MyCat主要解决的问题 MyCat对多数据库的支持 Mycat分片 ...

  2. mysql 修改表属主_mysql主从配置实现一主一从读写分离

    主从介绍 Mysql主从又叫Replication.AB复制.简单讲就是A与B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,实现数据实时同步 mysql主从是基于binlog,主上需开启b ...

  3. MySQL高可用实现:主从结构下ProxySQL中的读写分离

    墨墨导读:ProxySQL是一个高性能的MySQL中间件,拥有强大的规则引擎. ProxySQL提供强大的路由规则.当应用程序自身不支持读写分离时,DBA可以通过配置路由规则为应用程序提供透明的读写分 ...

  4. spring配置主库从库_springboot集成mybatis配置主从复制双库实现读写分离

    一般情况下网站对数据库的读要比写多多了,所以当数据量大了的时候,使用读写分离是很有必要的 spring提供了数据源路由的类,正好拿它来实现一下 创建项目 简单的springboot项目,依赖有myba ...

  5. 【DB宝42】MySQL高可用架构MHA+ProxySQL实现读写分离和负载均衡

    文章目录 一.MHA+ProxySQL架构 二.快速搭建MHA环境 2.1 下载MHA镜像 2.2 编辑yml文件,创建MHA相关容器 2.3 安装docker-compose软件(若已安装,可忽略) ...

  6. MySQL数据库知识学习(五)读写分离与分库分表策略

    通过数据库锁及存储引擎的学习,我们知道数据库在数据操作过程中为了保证数据的一致性是会给表或行加锁的,在网站发展的初期,由于没有太多访问量,一般来讲只需要一台服务器就够了,这的操作也不会有什么问题.但随 ...

  7. MySQL:一主两从架构(读写分离)

    文章目录 1. 主从同步原理 1.1 基本原理 1.2 具体步骤 2. 开始一主两从配置 2.1 服务器规划 2.2 环境需要 2.3 配置master 2.4 配置slave1 2.5 配置slav ...

  8. mysql amoeba 事务_MySQL基于Amoeba实现读写分离

    在实际的生活环境中,如果对数据库的读和写都在同一个数据库服务中操作,无论是在安全性,高可用还是高并发等各个方面都不能完全满足实际需求的,因此一般来说都是通过主从复制的方式来同步数据,再通过读写分离来提 ...

  9. MySQL主从(MySQL proxy Lua读写分离设置,一主多从同步配置,分库分表方案)

    Mysql Proxy Lua读写分离设置 一.读写分离说明 读写分离(Read/Write Splitting),基本的原理是让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELE ...

  10. 终于学会了 MySQL 主从配置和读写分离

    面试官:我看你简历上写的你们公司数据库是 MySQL 读写分离的? 小阿花:嗯,是的. 面试官:那你说说数据库是主从怎么配置? 小阿花:额,都是 DBA 帮我们搞好的,我们直接用就好了. 面试官:你们 ...

最新文章

  1. 1264: [AHOI2006]基因匹配Match
  2. poj-3641 Pseudoprime numbers(费马小定理)
  3. PHP+百度地图API+JAVASCRIPT实现GPS坐标与百度坐标转换的实例
  4. 管桩的弹性模量计算公式_桩基设计计算公式
  5. LeetCode 2. 两数相加(单链表反转)
  6. html 列表点,HTML列表
  7. java gps 距离计算_Java教程之地图中计算两个GPS坐标点的距离
  8. IDEA部署项目和多余的项目删掉的演示
  9. kitti数据集简介、百度网盘分享 kitti-object、kitti-tracking 全套数据集 自动驾驶
  10. Hakase and Nano 博弈
  11. c# winform 窗体间的传值
  12. ArcEngine 相关-转载
  13. 记一次oracle安装错误:INFO: //usr/lib64/libstdc++.so.5: undefined reference to `memcpy@GLIBC_2.14'...
  14. php 线性回归算法,线性回归方程计算器
  15. android下拉菜单_如何调整和重新排列Android的快速设置下拉菜单
  16. 狂肝两万字带你用pytorch搞深度学习!!!
  17. 中国游客是否可以持中国驾照在美国自驾游?_游侠_新浪博客
  18. 【Shell】awk命令--输出某列,列求和,列求平均值,列最大值,列去重复,取倒列,过滤行,匹配,不匹配,内置变量|定义分隔符|多个分隔符...
  19. 2021教师资格考试结构化面试:如何组织与培养班集体?
  20. 德国跨国汽车巨头大陆集团遭LockBit勒索软件组织攻击

热门文章

  1. 汉澳Sinox2014X64server高级桌面服务器版操作系统发布
  2. html判断文本框和按钮,css样式之区分input是按钮还是文本框的方法
  3. 计算机网络(一):网络层次划分及各层的网络协议
  4. 时钟芯片RX8025T的电源设计
  5. smartprinter注册版_SmartPrinter免费版
  6. 放置江湖html5源码,codearchive/reverse/放置江湖 at master · crazyyao0/codearchive · GitHub...
  7. 问题1:编译内核出现错误‘debian/stamp/build/kernel‘及解决方案
  8. ansi 软件测试,VB中的Unicode和Ansi格式
  9. 遥感图像预处理-几何校正
  10. 新手在Kail Linux中使用pdfcrack 来破解pdf密码