MySQL数据库(MySQL主从搭建|Django中实现MySQL读写分离|Django中使用MySQL连接池)

文章目录

  • 一、MySQL主从搭建
    • 1.MySQL主从的目的?
    • 2.MySQL主从原理
    • 3.搭建步骤
  • 二、Django中实现MySQL读写分离
    • 1.使用sqlite实现读写分离
    • 2.MySQL实现读写分离
  • 三、Django中使用连接池
    • 1.使用池的目的
    • 2.Django中使用MySQL连接池

一、MySQL主从搭建

1.MySQL主从的目的?

	1.读写分离读写分离,在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;(主库写,从库读)2.单个实例并发量低,提高并发量是提升I/O性能;随着日常生产中业务量越来越大,I/O访问频率越来越高,单机无法满足,此时做多库的存储,有效降低磁盘I/O访问的频率,提高了单个设备的I/O性能。也即减少了磁盘I/O的频率,分摊了数据库压力。3.只在主库写,读数据都去从库确保数据安全;做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据的丢失。

2.MySQL主从原理

MySQL服务器之间的主从同步是基于二进制日志机制(binlog),主服务器使用二进制日志(binlog)来记录数据库的变动情况从服务器通过读取和执行该日志文件来保持和主服务器的数据一致

	'MySQL主从原理'步骤一:主库db的更新事件(update、insert、delete)被写到binlog日志中步骤二:从库发起连接,连接到主库步骤三:此时主库创建一个binlog dump thread线程,把binlog的内容发送到从库步骤四:从库启动之后,创建一个I/O线程,读取主库传过来的binlog日志内容并写入到relay log中步骤五:还会创建一个SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db中

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

3.搭建步骤

	'我这里演示,用两台机器(使用MySQL的docker镜像模拟两台机器)'-注意:搭建主从,MySQL的版本必须要完全一致,我这里在docker上面镜像模拟,所以用的同一个镜像-主库:192.168.200.100 3307-从库:192.168.200.100 3306第一步:拉取MySQL5.7的镜像第二步:创建文件夹,文件(目录映射)'主库的'mkdir /home/mysqlmkdir /home/mysql/conf.dmkdir /home/mysql/data/touch /home/mysql/my.cnf'从库的'mkdir /home/mysql1mkdir /home/mysql1/conf.dmkdir /home/mysql1/data/touch /home/mysql1/my.cnf第三步(重要):编写mysql配置文件(主,从)-主库配置,参照自己本机安装的MySQL配置的my.ini来即可,但是会有区别[mysqld]user=mysqlcharacter-set-server=utf8default_authentication_plugin=mysql_native_passwordsecure_file_priv=/var/lib/mysqlexpire_logs_days=7sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTIONmax_connections=1000# 搭建主从这下面两句必须加,服务端设置的id号,开启MySQL的binlog日志server-id=100log-bin=mysql-bin[client]default-character-set=utf8[mysql]default-character-set=utf8-从库配置[mysqld]user=mysqlcharacter-set-server=utf8default_authentication_plugin=mysql_native_passwordsecure_file_priv=/var/lib/mysqlexpire_logs_days=7sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTIONmax_connections=1000# 同上一样,设置服务端的id号(不能重复),开启从库的relay log日志server-id=101  log-bin=mysql-slave-bin   relay_log=edu-mysql-relay-bin [client]default-character-set=utf8[mysql]default-character-set=utf8第四步:启动mysql容器,并做端口和目录映射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 3307:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7docker run  -di -v /home/mysql1/data/:/var/lib/mysql -v /home/mysql1/conf.d:/etc/mysql/conf.d -v /home/mysql1/my.cnf:/etc/mysql/my.cnf -p 3306:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7第五步:连接主库mysql -uroot -P 3307 -h 192.168.200.100 -p-输入密码-在主库创建用户并授权-创建test用户create user 'test'@'%' identified by '123';-授权用户grant all privileges on *.* to 'test'@'%' ;-刷新权限flush privileges;-查看主服务器状态(显示如下图三)show master status; 第六步:连接从库mysql -uroot -P3306 -h 192.168.200.100 -p-输入密码-配置change master to master_host='192.168.200.100',master_port=3307,master_user='test',master_password='123',master_log_file='mysql-bin.000003',master_log_pos=0;'''配置详解change master to master_host='MySQL主服务器IP地址', master_user='之前在MySQL主服务器上面创建的用户名', master_password='之前创建的密码', master_log_file='MySQL主服务器状态中的二进制文件名', master_log_pos='MySQL主服务器状态中的position值';'''-启用从库start slave;-查看从库状态(如下图四)show slave status\G; # 保证IO和sql线程是yes的 \G是以json形式展示,不写默认以列表展示(列表展示有点乱)第七步:在主库创建库,创建表,插入数据,看从库(本地看和远端看,图五六)

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


二、Django中实现MySQL读写分离

1.使用sqlite实现读写分离

	'这里先使用sqlite实现'第一步:配置文件配置多数据库DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3','NAME': BASE_DIR / 'db.sqlite3',},'slave': {'ENGINE': 'django.db.backends.sqlite3','NAME': BASE_DIR / 'db.sqlite3_slave',}}第二步:(配置models.py),然后迁移表时,可以指定迁到哪个库中'models.py'class User(models.Model):name = models.CharField(max_length=32)password = models.CharField(max_length=32)python manage.py makemigrationspython manage.py migratemigrate --database=配置文件中数据库配置的名字 # 不写默认迁移到defaultpython manage.py migrate --database=slave第三步:配置视图,创建表数据(下图一)  手动读写分离版'view.py'from django.shortcuts import render,HttpResponsefrom .models import Userdef create_user(request):# 默认不写,会创建到default库中# User.objects.create(name='jack',password='123')# 手动读写分离,(也可以做分库分表)# using里面填写数据库名字# User.objects.using('default').create(name='oscar',password='123')User.objects.using('slave').create(name='jack1',password='123')res = User.objects.filter().all()  # 查数据默认也是default库print(res)res1 = User.objects.using('slave').all() # 使用using指定查某个库print(res1)return HttpResponse('创建用户成功')第四步:自动读写分离版'写一个py文件,db_router.py(命名随便),然后在其中写一个类'class DBRouter(object):# 读def db_for_read(self, model, **hints):# 如果有多个从库就可以做负载 ['db1','db2','db3',],随机抽一个(random)return 'slave'# 写def de_fore_write(self, model, **hints):return 'default''然后在配置文件中配置一下,就是上面写的db_router.py的路径'DATABASE_ROUTERS = ['app01.db_router.DBRouter', ]这样之后就可以自动读写分离了(看图二)

在这里插入图片描述

在这里插入图片描述

2.MySQL实现读写分离

	'使用上面搭建的MySQL主从来做'第一步:在配置文件中配置MySQL数据库'''使用MySQL做读写分离(远端)'''DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'userv','USER': 'root','HOST': '192.168.200.100','PORT': 3307,'PASSWORD': '123456',},'slave': {'ENGINE': 'django.db.backends.mysql','NAME': 'userv','USER': 'root','HOST': '192.168.200.100','PORT': 3306,'PASSWORD': '123456',}}第二步:迁移表python manage.py makemigrationspython manage.py migrate第三步:直接在视图层查询或添加数据测试'''MySQL版读写分离'''def create_user(request):# 写# User.objects.create(name='jack66',password='123')# 读res = User.objects.filter(id=1).first()print(res)print(res.name)return HttpResponse('创建用户成功')

在这里插入图片描述

三、Django中使用连接池

1.使用池的目的

	使用池的目的	--->为了控制链接数量-线程池-redis连接池-自带连接池 redis.ConnectionPool-mysql连接池-pymysql:dbutils模块-sqlalchemy:自带的-django:没有连接池-一个请求就是一个链接,用完就释放-第三方连接池

2.Django中使用MySQL连接池

	1.安装pip install django-db-connection-pool2.在配置文件中配置(用上面案例的修改一下即可,把ENGINE修改一下,添加POOL_OPTIONS)DATABASES = {'default': {'ENGINE': 'dj_db_conn_pool.backends.mysql','NAME': 'userv','USER': 'root','HOST': '192.168.200.100','PORT': 3307,'PASSWORD': '123456','POOL_OPTIONS': {'POOL_SIZE': 2,'MAX_OVERFLOW': 2}},'slave': {'ENGINE': 'dj_db_conn_pool.backends.mysql','NAME': 'userv','USER': 'root','HOST': '192.168.200.100','PORT': 3306,'PASSWORD': '123456','POOL_OPTIONS': {'POOL_SIZE': 2,'MAX_OVERFLOW': 2}}}2.1.起一个脚本,弄1000个线程执行from threading import Threadimport requestsdef task():res = requests.get('http://127.0.0.1:8000/app01/create_user/')print(res.text)if __name__ == '__main__':l = []for i in range(1000):t = Thread(target=task)t.start()l.append(t)for i in l:i.join()3.查看MySQL有多少链接数:show status like 'Threads%';'下图一是,配置连接池的效果,下图二是没有配置连接池的效果'

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/288608.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spark 参数

spark.yarn.executor.memoryOverhead 默认值是384M Configuration - Spark 3.5.1 Documentation

openGauss增量备份恢复

openGauss 增量备份恢复 openGauss 数据库自 2020 年 6 月 30 日发布以来,很多小伙伴都提到“openGauss 数据库是否有增量备份工具?“这么一个问题。 在 openGauss 1.0.0 版本的时候,关于这个问题的回答往往是:“Sorry…”&…

Unity中如何实现草的LOD

1)Unity中如何实现草的LOD 2)用Compute Shader处理图像数据后在安卓机上不能正常显示渲染纹理 3)关于进游戏程序集加载的问题 4)预制件编辑模式一直在触发自动保存 这是第379篇UWA技术知识分享的推送,精选了UWA社区的热…

STM32启动文件命名方式说明以及启动过程分析

1、启动文件的路径 cl:互联型产品,stm32f105/107系列 vl:超值型产品,stm32f100系列 xl:超高密度产品,stm32f101/103系列 flash容量大小: ld:小容量产品, 小于64KB md…

利用Python进行数据可视化Plotly与Dash的应用【第157篇—数据可视化】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 利用Python进行数据可视化Plotly与Dash的应用 数据可视化是数据分析中至关重要的一环&…

数字身份的革命:解锁 Web3 的身份验证技术

引言 随着数字化时代的到来,个人身份认证成为了日常生活和商业活动中不可或缺的一部分。传统的身份验证方式存在着安全性低、易伪造、不便利等问题,因此,人们迫切需要一种更安全、更便捷的身份验证技术。在这样的背景下,Web3的身…

Axure中后台系统原型模板,B端页面设计实例,高保真高交互54页

作品概况 页面数量:共 50 页(长期更新) 兼容版本:Axure RP 9/10,不支持低版本 应用领域:网页模板、网站后台、中台系统、B端系统 作品特色 本品为「web中后台系统页面设计实例模板」,默林原创…

Linux的启动流程、模块管理与Loader

文章目录 Linux的启动流程BIOS、boot loader与kernel加载 内核与内核模块内核模块与依赖性:depmod查看内核模块:lsmod、modinfo内核模块的加载与删除:insmod、rmmod、modprobe内核模块的额外参数设置:/etc/modprobe.d/*.conf Linu…

如何处理Flutter应用程序中的内存泄漏

大家好,我是咕噜铁蛋!今天,我想和大家分享一下如何处理Flutter应用程序中的内存泄漏问题。在Flutter开发中,内存泄漏是一个常见且需要重点关注的问题,它可能会导致应用程序性能下降,甚至引发崩溃。因此&…

PASSL代码解读[01] readme

介绍 PASSL 是一个基于 PaddlePaddle 的视觉库,用于使用 PaddlePaddle 进行最先进的视觉自监督学习研究。PASSL旨在加速自监督学习的研究周期:从设计一个新的自监督任务到评估所学的表征。 PASSL 主要特性: 自监督前沿算法实现 PASSL 实现了…

嵌入式开发——基础电路知识

1. 电路知识 1.1. 驱动能力 IC是数字逻辑芯片,其输出的是逻辑电平。逻辑电平0表示输出电压低于阈值电压,逻辑1表示输出电压高于阈值电压。负载则是被驱动的电路或元件,负载大小则指负载的电阻大小。 驱动能力主要表现在几个方面&#xff1…

基于Pytorch的验证码识别模型应用

前言 在做OCR文字识别的时候,或多或少会接触一些验证码图片,这里收集了一些验证码图片,可以对验证码进行识别,可以识别4到6位,纯数字型、数字字母型和纯字母型的一些验证码,准确率还是相当高,需…

Self-Consistency Improves Chain of Thought Reasoning in Language Models阅读笔记

论文链接:https://arxiv.org/pdf/2203.11171.pdf 又到了读论文的时间,内心有点疲惫。这几天还是在看CoT的文章,今天这篇是讲如何利用self-consistency(自我一致性)来改进大语言模型的思维链推理过程。什么是self-cons…

设置asp.net core WebApi函数输入和返回类型中的属性名称开头大小写格式

以下列类型定义为例创建简单的ASP.NET Core的WebApi函数,此时输入参数和返回结果的属性名称开头默认为小写,如下图所示。 public class UserInfo { public string UserName { get; set; }public string UserSex { get; set; }public string UserP…

班级综合测评管理系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW,文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文(设计)学生选题参考合集推荐收藏(包含Springboot、jsp、ssmvue等技术项目合集) 目录 1. …

【pytest、playwright】allure报告生成视频和图片

目录 1、修改插件pytest_playwright 2、conftest.py配置 3、修改pytest.ini文件 4、运行case 5、注意事项 1、修改插件pytest_playwright pytest_playwright.py内容如下: # Copyright (c) Microsoft Corporation. # # Licensed under the Apache License, Ver…

PL/SQL概述

oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 PL/SQL概述 PL/SQL(Procedural Language extension to SQL)是 Oracle 对标准 SQL语言的扩充,是专门用于各种环境下对 Oracle 数据库进行访问和开发的语言。 由…

服务器呀服务器,一个虚拟专用服务器的使用教程

目前刚接触服务器这一块的学习,这里记录一下解如何获取自己的第一台虚拟云服务器,给刚入行服务器开发的小伙伴做一个参考。 具体的步骤如下: 一、服务器的注册和获取 1、打开bwg88服务器平台地址:点击进入 https://bwh88.net/a…

基于云计算的前端资源管理系统的设计与实现

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 随着互联网的快速发展,前端资源管理成为了一个重要的课题。本文旨在设计并实…

新书速递——《可解释AI实战(PyTorch版)》

本书旨在帮助你实施最新的可解释AI技术,以构建公平且可解释的AI系统。可解释AI是当今AI研究中的热门话题,但只有少数资源和指南涵盖了所有重要技术,这些技术对实践者来说非常有价值。本书旨在填补这一空白。 本书读者对象 本书既适合那些有兴…