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/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%';
	'下图一是,配置连接池的效果,下图二是没有配置连接池的效果'

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据分析面试】1. 计算年度收入百分比(SQL)

题目 你需要为公司的营收来源生成一份年度报告。计算截止目前为止,在表格中记录的第一年和最后一年所创造的总收入百分比。将百分比四舍五入到两位小数。 示例: 输入: annual_payments 表 列名类型amountINTEGERcreated_atDATETIMEstatusV…

通过PandasAI使用自然语言进行数据分析

通过PandasAI使用自然语言进行数据分析 介绍 ​ PandasAI是一个Python库,可以很容易地用自然语言向数据提问。它可以帮助您使用生成人工智能来探索、清理和分析数据。 使用PandasAI 这里使用Anaconda和Jupyter使用PandasAI 进入一个文件目录 创建一个 Notebook …

一个基于.NET Core构建的简单、跨平台、模块化的商城系统

商城后台管理端功能 商品:分类、品牌、单位、选项(销售属性)、属性、属性模板、属性组。 销售:订单、物流。 内容:首页配置、评论、回复。 配置:国家、用户、仓库、运费、高级设置。 系统:系…

简单了解C++线程库

thread类简单介绍 在C11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接 口,这使得代码的可移植性比较差。C11中最重要的特性就是对线程进行支持了,使得C在 并行编程时不需要依赖第三方库…

golang 在多线程中避免 CPU 指令重排

发布日期:2024-03-26 16:29:39 起因 golang 的发明初衷便是多线程,是一门专门用于多线程高并发的编程语言。其独创的 GMP 模型在多线程的开发上提供了很大的便利。 现代计算机基本上都是多核 CPU 的结构。CPU 在进行指令运行的时候,为了提高…

开源AI引擎:文本自动分类在公安及消防执法办案自动化中的应用

一、实际案例介绍 通过文本分类算法自动化处理文本数据,快速识别案件性质和关键特征,极大地提高了案件管理和分派的效率。本文将探讨这两种技术如何帮助执法机构优化资源分配,确保案件得到及时而恰当的处理,并增强公共安全管理的…

“约瑟夫环”问题的四种方法及详解注释(c++或c语言实现)

Ⅰ.故事背景 据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈&…

笔记本作为其他主机显示屏(HDMI采集器)

前言: 我打算打笔记本作为显示屏来用,连上工控机,这不是贼方便吗 操作: 一、必需品 HDMI采集器一个 可以去绿联买一个,便宜的就行,我的大概就长这样 win10下载 PotPlayer 软件 下载链接:h…

VTK 示例 基本的流程-事件交互、球体、

流程可以总结如下: 导入所需的头文件: 首先,导入了一系列 VTK 头文件,这些文件包含了所需的类和函数声明。 创建对象: 创建了两个球体(一个较大,一个较小),一个平面&…

JS-16-标签函数

一、模版字符串 模版字符串,可以非常方便地引用变量,并合并出最终的字符串。 它允许你嵌入表达式,并通过${expression}语法来执行这些表达式。模板字符串使用反引号()而不是普通的单引号或双引号。 模板字符串有几个…

【git】git使用手册

目录 一 初始化 1.1 账号配置 1.2 ssh生成 1.2.1 配置ssh 1.2.2 测试SSH 1.3 初始化本地仓库并关联远程仓库 二 使用 2.1 上传 2.2 拉取 三 问题 3.1 关联失败 一 初始化 git的安装很简单,下载后大部分进行下一步完成即可----->地址: git工具下载 1.1 账号配置…

HCIP —— 链路聚合

链路聚合 背景 随着网络规模不断扩大,用户对骨干链路的带宽和可常性提出越来越高的要求,在传统技术中,常用更换高速率的设备的方式来增加带宽,但这种方案需要付出高额的费用,而且不够灵活。 而采用链路聚合技术可以在…

记录关于智能家居的路程的一个bug___Segmentation fault(段错误)

前言 其实发生段错误的情况有很多: 其实在项目的开发中最有可能的错误就是①和②,考虑到本项目数组用的比较少,所以主要是考虑错误①指针的误用。 有时候错误就是那么离谱,声音也算是一种设备??&#xff…

Dockerfile:自定义镜像

Dockerfile 是一个文本文件,其中包含了一系列用于自动化构建Docker镜像的指令。通过编写Dockerfile,开发者能够明确地定义一个软件应用及其运行环境应该如何被封装进一个可移植、可重复构建的Docker镜像中。 第一步:在/tmp文件下新建docker…

GEE:将分类特征和标签提取到样本点,并以(csv/shp格式)下载到本地

作者:CSDN @ _养乐多_ 本文将介绍在Google Earth Engine(GEE)平台上,下载用于机器学习分类或者回归的样本点数据,样本点数据携带了分类特征和标签信息,可以以csv格式或者SHP格式。 结果如下图所示, 文章目录 一、核心函数1.1 采样1.2 下载函数二、代码链接三、完整代码…

Machine Learning机器学习之K近邻算法(K-Nearest Neighbors,KNN)

目录 前言 背景介绍: 思想: 原理: KNN算法关键问题 一、构建KNN算法 总结: 博主介绍:✌专注于前后端、机器学习、人工智能应用领域开发的优质创作者、秉着互联网精神开源贡献精神,答疑解惑、坚持优质作品共…

Python入门练习 - 学生管理系统

Python 实现读书管理系统 """ 实现一个命令行版的读书管理系统 """ import os.path import sys# 使用这个全局变量,来管理所有的学生信息 # 这个列表的每个元素都是一个‘字典’,每 个 字典就分别表示了一个同学students …

电脑访问网页获取路由器WAN口内网IP

因为运维过程中容易出现路由器配置了固定IP但是没人知道后台密码,不确定这个办公室的IP地址,且使用tracert路由追踪也只会出现路由器的LAN口网关并不会出现WAN口IP。 今日正好遇到了个好方法,经过测试可以正常使用。 方法如下: 内…

机器视觉矿山安全生产风险预警系统

一、简介 十四五规划和2035年远景目标纲要针对企业安全生产提出了多项要求。其中,提高安全生产水平要求完善和贯彻执行安全生产责任制,建立公共安全隐患排查和安全预防控制体系,要求将安全生产提升至预防和控制阶段。 目前,矿山…

0DAY漏洞是什么,如何进行有效的防护

零日漏洞,指的是软件或系统中未被公开的、未被厂商知晓的安全漏洞。这些漏洞未被修复,因此黑客可以利用它们进行攻击,而受害者往往无法防范。由于这些漏洞的存在时间很短,因此称之为“零日漏洞”,也称为“0day漏洞”。…