2-22 Django商城数据库读写分离

2-22 Django商城数据库读写分离
本章知识点
1、mysql主从备份介绍
2、Linux下的mysql安装,oralce mysql sqlserver
3、基于mysql的Django读写分离
知识点讲解
1、mysql主从备份介绍
备份:安全。
目的:Django网站数据库读写分离设置。在我们工作当中,发现有的数据表经常查询,有的表 经常写入。同时交给一个数据库,效率不高。

在这里插入图片描述

2、Linux下的mysql安装
2台Centos7 虚拟机,并且记住每一台的ip地址。
Server 主Ip 10.10.16.229
Client 从Ip 10.10.16.141
关闭防火墙
在这里插入图片描述
测试ping
在这里插入图片描述
3、基于mysql的Django读写分离
在Linux安装mariadb数据库
Mysql本身是开源的,大家用的很开心,但是有一家数据库大户,oracle公司看上了mysql,觉得收购,并且答应mysql我们依然开源。果然,后来收费了。Mysql的团队,不忿,然后从新写了mysql的妹妹:mariadb,mariadb和mysql相识度到99%。并且免费。所以,centos7系统,我们使用mariadb。
针对免费mariadb,官方有很多和oracle解释,但是没有和我们解释的特征。
Mariadb 默认yum安装之后,只是一个测试版本。最大的特征,即使设置了数据库用户密码,无密码任然能够登录,我们在授权的过程当中,产生的新用户,即使配置了密码,也可以无密码登录,但是有密码会报错。
Centos7下mariadb生成环境安装
命令:yum -y install mariadb mariadb-server (mariadb 是客户端,mariadb-server是服务端)
在这里插入图片描述
启动mariadb (服务)
命令:systemctl restart mariadb
在这里插入图片描述
进入生产环境配置
命令:mysql_secure_installation

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

Server:

创建测试的数据库
登录数据库
mysql -u root -p123
在这里插入图片描述
create database DB1;
在这里插入图片描述
赋予DB1连接权限
GRANT REPLICATION SLAVE ON . TO “root”@"%" IDENTIFIED BY ‘123’ with grant option;
在这里插入图片描述
flush privileges;
在这里插入图片描述
选中数据库
在这里插入图片描述
创建测试表:
create table test(name varchar(20),gender char(1),birth date,birthaddr varchar(20));
在这里插入图片描述
添加测试数据
在这里插入图片描述
导出数据库
mysqldump -h localhost -u root -p123 DB1 > 1.sql
在这里插入图片描述
Sftp传输
当前server 10.10.16.205
Client 10.10.16.128
从205 传到 128
scp 1.sql root@10.10.16.128:/root

在这里插入图片描述
Client:
进入数据库
在这里插入图片描述
创建DB1
create database DB1;
在这里插入图片描述
导入数据
mysql -h localhost -u root -p123 DB1 < 1.sql
在这里插入图片描述

配置:
/etc/my.cnf
server:
在这里插入图片描述
配置配置文件
在这里插入图片描述
重启服务器
systemctl restart mariadb
在这里插入图片描述
查看一下主服务器状态
Show master status;
在这里插入图片描述
server:
配置配置文件
在这里插入图片描述
重启服务
在这里插入图片描述
红色:一定要关防火墙,一定要关防火墙,一定要关防火墙,
连接服务器
在这里插入图片描述
重启服务
先退出
在这里插入图片描述
再重启
在这里插入图片描述
再次进入数据库,查看状态
在这里插入图片描述
启动备份
Slave start;
在这里插入图片描述
查看状态在这里插入图片描述

show slave status\G;

然后查看日志
cat /var/log/mariadb/mariadb.log
在这里插入图片描述
为了下次查看日志方便
Echo “” > /var/log/mariadb/mariadb.log
在这里插入图片描述
清空日志
停止备份
退出数据库
重启数据库
重启备份
Mysql 数据库读写分离
3、基于mysql的Django读写分离
Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过。
但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。
因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离来提升数据库的并发负载能力 这样的方案来进行部署与实施的。

读写分离,基本的原理是让主数据库处理增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。
那么为什么要读写分离呢?
因为数据库的“写”(写10000条数据到oracle可能要3分钟)操作是比较耗时的。
但是数据库的“读”(从oracle读10000条数据可能只要5秒钟)。
所以读写分离,解决的是,数据库的写入,影响了查询的效率。
3、什么时候要读写分离?
数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用,利用数据库 主从同步 。可以减少数据库压力,提高性能。
主从复制以及读写分离
在实际的生产环境中,对数 都在同一个数据库服务器中,是不能满足实际需求的。
无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。
因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。
具体在django项目中的应用
二、在项目中的settings文件中配置数据库
DATABASES = {
‘default’: {
‘ENGINE’: ‘django.db.backends.mysql’,
‘NAME’: ‘QShop’,
‘USER’:‘root’,
‘PASSWORD’:‘123456’,
‘PORT’:‘3306’,
‘HOST’:‘localhost’
},
‘slave’: {
‘ENGINE’: ‘django.db.backends.mysql’,
‘NAME’: ‘QShop1’,
‘USER’: ‘root’,
‘PASSWORD’: ‘123456’,
‘HOST’: ‘localhost’,
‘PORT’: ‘3306’

},

}
三、在Navicat软件中中创建qshop1数据库

四、将qshop数据库表同步到qshop1数据库中
利用数据迁移语句
migrate --database slave 将主数据库中的数据表迁移到从数据库
五、mysql的读写分离在django框架中有两种方式设置
5-1 手动方式
在使用数据库时,通过.using(db_name)来手动指定要使用的数据库
例如:
GoodInfo.object.using(‘default’).all() 说明default这个设置下的数据库是用来专门读取数据的
Usermessage.object.using(‘slave’).create() 说明slave这个设置下的数据库是专门来写入数据的
5-2 自动方式
通过配置数据库路由,来自动实现,这样就不需要每次读写都手动指定数据库了。数据库路由中提供了四个方法。
这里主要用其中的两个:
def db_for_read()决定读操作的数据库
def db_for_write()决定写操作的数据库
具体操作:
定义路由类
在项目的根目录创建myrouter.py脚本,定义Route类

class DBRouter(object):

def db_for_read(self, model, **hints):
    return 'default'

def db_for_write(self, model, **hints):
    return 'slave'

在项目中的配置文件加上数据库路由相关配置
DATABASE_ROUTERS = [‘myrouter.DBRouter’]

可以指定多个数据库路由,比如对于读操作,Django将会循环所有路由中的db_for_read()方法,直到其中一个有返回值,然后使用这个数据库进行当前操作。
保存或者删除也可以指定数据库
对象名.save(using=’default’) 或者.using(‘default’).update()
对象名.delete(using=’slave’)
拓展知识:
一主多从方案
网站的读的性能通常更重要,因此,可以多配置几个数据库,并在读取时,随机选取,比如:
class Router:
def db_for_read(self, model, **hints):
" “” 读取时随机选择一个数据库 “”"
import random
return random.choice([‘db2’, ‘db3’, ‘db4’])

def db_for_write(self, model, **hints): 
	""" 写入时选择主库 """ 
	return 'default'

分库分表
在大型web项目中,常常会创建多个app来处理不同的业务,如果希望实现app之间的数据库分离,比如app01走数据库db1,app02走数据库db2
class Router:
def db_for_read(self, model, **hints):
if model._meta.app_label == ‘goods’:
return ‘default’
if model._meta.app_label == ‘trade’:
return ‘default’
def db_for_write(self, model, **hints):
if model._meta.app_label == ‘app01’:
return ‘db1’
if model._meta.app_label == ‘app02’:
return ‘db2’
本章总结
mysql主从备份介绍
Linux下的mysql安装
基于mysql的Django读写分离

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值