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

news2024/11/18 10:56:53

文章目录

  • 一、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/mysql
        mkdir /home/mysql/conf.d
        mkdir /home/mysql/data/
        touch /home/mysql/my.cnf
        
        '从库的'
        mkdir /home/mysql1
        mkdir /home/mysql1/conf.d
        mkdir /home/mysql1/data/
        touch /home/mysql1/my.cnf
     
    第三步(重要):编写mysql配置文件(主,从)
    	-主库配置,参照自己本机安装的MySQL配置的my.ini来即可,但是会有区别
    	[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
	    # 搭建主从这下面两句必须加,服务端设置的id号,开启MySQL的binlog日志
	    server-id=100
	    log-bin=mysql-bin
	    [client]
	    default-character-set=utf8
	
	    [mysql]
	    default-character-set=utf8

		-从库配置
		[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
	    # 同上一样,设置服务端的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.7

		docker 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 makemigrations
		python manage.py migrate
		migrate --database=配置文件中数据库配置的名字 # 不写默认迁移到default
			python manage.py migrate --database=slave
	

	第三步:配置视图,创建表数据(下图一)  手动读写分离版
		'view.py'
		from django.shortcuts import render,HttpResponse
		from .models import User
		def 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 makemigrations
		python 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-pool
		
	2.在配置文件中配置(用上面案例的修改一下即可,把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 Thread
		import requests
		def 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.coloradmin.cn/o/1550009.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【vue3学习笔记(一)】vue3简介;使用vue-cli创建工程;使用vite创建工程;分析工程结构;安装开发者工具

尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通 对应课程136-140节 课程 P136节 《vue3简介》笔记 课程 P137节 《使用vue-cli创建工程》笔记 官方文档: https://cli.vuejs.org/zh/guide/creating-a-project.html#vue-create官方文档地址 查看vue-cli版本&#x…

zotero+word优化管理参考文献

写论文,整理参考文献,管理参考文献很麻烦,参考文献格式罗列很麻烦,论文需要修改时,重新调整参考文献顺序很麻烦。 zoteroword可以很好的帮助解决这个问题。 Step1 zotero软件安装 默认word你已经安装好了 step2 安…

HWOD:九键输入法的转换

一、知识点 A的ASCII码是65,Z的ASCII码是90 a的ASCII码是97,z的ASCII码是122 从z到a的反循环,用26求余数 二、题目 1、描述 九键手机键盘上的数字与字母的对应: 1--1, abc--2, def--3, ghi--4, jkl--5, mno--6, …

ubuntu 中安装docker

1 资源地址 进入ubuntu官网下载Ubuntu23.04的版本的镜像 2 安装ubuntu 这里选择再Vmware上安装Ubuntu23.04.6 创建一个虚拟机,下一步下一步 注意虚拟机配置网络桥接,CD/DVD选择本地的镜像地址 开启此虚拟机,下一步下一步等待镜像安装。 3…

自动化面试常见算法题!

1、实现一个数字的反转,比如输入12345,输出54321 num 12345 num_str str(num) reversed_num_str num_str[::-1] reversed_num int(reversed_num_str) print(reversed_num) # 输出 54321代码解析:首先将输入的数字转换为字符串&#xff…

Tensorflow2.0笔记 - 使用compile,fit,evaluate,predict简化流程

本笔记主要用compile, fit, evalutate和predict来简化整体代码,使用这些高层API可以减少很多重复代码。具体内容请自行百度,本笔记基于FashionMnist的训练笔记,原始笔记如下: Tensorflow2.0笔记 - FashionMnist数据集训练-CSDN博…

六、保持长期高效的七个法则(二)Rules for Staying Productive Long-Term(2)

Rule #5 - If your work changes, your system should too. 准则五:如果你的工作变了,你的系统也应该改变。 For some, work will be consistent enough to not need major changes.You simply stick to the same system and you’ll get the results y…

PL/SQL概述

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

HWOD:对n个字符串按照字典序排序

一、知识点 1、pow函数 引用头文件math.h 求x的y次方 2、链接数学库 math.h头文件对应的库名称是libm sudo find / -name libm.so -print ls /usr/lib/x86_64-linux-gnu/ 链接命令:gcc xxx.c -L. -lm 3、52进制 A的ASCII码是65,Z的ASCII…

Ubuntu 配置 kubernetes 学习环境,让外部访问 dashboard

Ubuntu 配置 kubernetes 学习环境 一、安装 1. minikube 首先下载一下 minikube,这是一个单机版的 k8s,只需要有容器环境就可以轻松启动和学习 k8s。 首先你需要有Docker、QEMU、Hyperkit等其中之一的容器环境,以下使用 docker 进行。 对…

OpenCV模块熟悉:点云处理相关

1. 显示--VIZ 曾经基于PCL 做过不少点云相关的开发,采样VTK进行有点云显示。后来基于OpenCV做了不少三维重建工作,总是将点云保存下来,然后借助CloudCompare等查看结果。如果能够将VIZ编译进来,预计会提升开发速度。 …

aws 入门篇 02.区域和可用区

aws入门篇 02.Region和AZ 02.区域和可用区 区域(Region):us-east-1:美东1区可用区(Availability Zones) AWS的区域遍布世界各地 一个区域(Region)是由多个可用区(AZ&am…

从根本上优雅地解决 VSCode 中的 Python 模块导入问题

整体概述: 在我尝试运行 test_deal_file.py 时,我遇到了一个 ModuleNotFoundError 错误,Python告诉我找不到名为 controllers 的模块。这意味着我无法从 deal_file.py 中导入 read_excel 函数。 为了解决这个问题,我尝试了几种方法…

Sublime for Mac 使用插件Terminus

1. 快捷键打开命令面板 commandshiftp2. 选择 Package Control: Install Package,然后会出现安装包的列表 3. 在安装终端插件前,我们先装个汉化包,ChineseLocallization,安装完重启 4. 输入 terminus,选择第一个&am…

Pillow教程06:将图片中出现的黄色和红色,改成绿色

---------------Pillow教程集合--------------- Python项目18:使用Pillow模块,随机生成4位数的图片验证码 Python教程93:初识Pillow模块(创建Image对象查看属性图片的保存与缩放) Pillow教程02:图片的裁…

nvm安装以后,node -v npm 等命令提示不是内部或外部命令

因为有vue2和vue3项目多种,所以为了适应各类版本node,使用nvm管理多种node版本,但是当我按教程安装nvm以后,nvm安装以后,node -v npm 等命令提示不是内部或外部命令 首先nvm官网网址:https://github.com/coreybutler/…

iOS - Runtime-消息机制-objc_msgSend()

iOS - Runtime-消息机制-objc_msgSend() 前言 本章主要介绍消息机制-objc_msgSend的执行流程,分为消息发送、动态方法解析、消息转发三个阶段,每个阶段可以做什么。还介绍了super的本质是什么,如何调用的 1. objc_msgSend执行流程 OC中的…

接口自动化之 + Jenkins + Allure报告生成 + 企微消息通知推送

接口自动化之 Jenkins Allure报告生成 企微消息通知推送 在jenkins上部署好项目,构建成功后,希望可以把生成的报告,以及结果统计发送至企微。 效果图: 实现如下。 1、生成allure报告 a. 首先在Jenkins插件管理中&#x…

sqlite跨数据库复制表

1.方法1 要将 SQLite 数据库中的一个表复制到另一个数据库,您可以按照以下步骤操作: 备份原始表的SQL定义和数据: 使用 sqlite3 命令行工具或任何SQLite图形界面工具,您可以执行以下SQL命令来导出表的SQL定义和数据&#xff1a…

libVLC 视频抓图

Windows操作系统提供了多种便捷的截图方式,常见的有以下几种: 全屏截图:通过按下PrtSc键(Print Screen),可以截取整个屏幕的内容。截取的图像会保存在剪贴板中,可以通过CtrlV粘贴到图片编辑工具…