首页 > 数据库 >mysql主从,django使用多数据库做读写分离

mysql主从,django使用多数据库做读写分离

时间:2023-04-26 17:47:27浏览次数:62  
标签:主库 db django master mysql 从库 root 主从

mysql主从

mysql主从搭建的目的

1.读写分离

2.单个实例并发量低,提高并发量

3.只在主库写,读数据都去从库

mysql主从原理

步骤一:主库db的更新事件(update,insert,delete)被写道binlog

步骤二:从库发起连接,连接到主库

步骤三:此时主库创建一个binlog dump thread线程,把binlog的内容发送到从库

步骤四:从库启动后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log.

步骤五:还会创建一个sql线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db

搭建步骤:准备两台机器(mysql的docker镜像模拟两台机器)

主库:10.0.0.102 33307

从库:10.0.0.102 33306

第一步:docker拉取mysql5.7的镜像

docker pull mysql:5.7

第二步:创建文件夹,文件(做目录映射)

mkdir /root/mysql
mkdir /root/mysql/conf.d
mkdir /root/mysql/data/
touch /root/mysql/my.cnf

mkdir /root/mysql1
mkdir /root/mysql1/conf.d
mkdir /root/mysql1/data/
touch /root/mysql1/my.cnf

第三步(重要):编写mysql配置文件(主,从)

主的配置文件

/root/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
log-bin=mysql-bin
[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

从配置文件

/root/mysql1/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  
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 /root/mysql/data/:/var/lib/mysql -v /root/mysql/conf.d:/etc/mysql/conf.d -v /root/mysql/my.cnf:/etc/mysql/my.cnf -p 33307:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

从库容器

docker run  -di -v /root/mysql1/data/:/var/lib/mysql -v /root/mysql1/conf.d:/etc/mysql/conf.d -v /root/mysql1/my.cnf:/etc/mysql/my.cnf -p 33306:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

image-20230426161440004

第四步:连接主库

mysql -uroot -P33307 -h 10.0.0.200 -p123456
再主库创建用户并授予所以权限
## 创建test用户
create user 'test'@'%' identified by '123';
## 授权用户
grant all privileges on *.* to 'test'@'%' ;
## 刷新权限
flush privileges;
# 查看主服务器状态(显示如下图)
show master status;

image-20230426161816911

image-20230426161953240

第五步:连接从库

mysql -uroot -P33306 -h 10.0.0.200 -p123456

配置详解

'''
    change master to 
    master_host='MySQL主服务器IP地址', 
    master_user='之前在MySQL主服务器上面创建的用户名', 
    master_password='之前创建的密码', 
    master_log_file='MySQL主服务器状态中的二进制文件名', 
    master_log_pos='MySQL主服务器状态中的position值';
    '''
change master to master_host='10.0.0.200',master_port=33307,master_user='test',master_password='123',master_log_file='mysql-bin.000003',master_log_pos=0;

image-20230426162313593

第六步:再主库创建库,创建表,插入数据,看从库

image-20230426162639601

如果不小心再从库进行了写操作那么,之后在主库进行写操作是会产生冲突,导致主从断开

image-20230426163736701

采用以下方式进行可以再次启动主从解决

stop slave;  # 先停止主从库
set GLOBAL SQL_SLAVE_SKIP_COUNTER=2; # 这里是跳过binlog的命令条数。也就是把错误条数给跳过就行了
start slave;  # 启动主从就ok了

image-20230426164013458

django使用多数据做读写分离

第一步:配置文件配置多数据库

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    },
    'db1': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db1.sqlite3',
    }
}
migrate --database db1 app01

# 迁移指定数据库

image-20230426172550470

第二步:手动读写分离

Book.objects.using('db1').create(name='西游记')

image-20230426172802263

第三步:自动读写分离

写一个py文件,db_router.py,写一个类

class DBRouter(object):
    def db_for_read(self, model, **hints):
        # 多个从库 ['db1','db2','db3']
        # model是哪个模型表
        return 'db1'

    def db_for_write(self, model, **hints):


        return 'default'

配置文件配置

DATABASE_ROUTERS = ['utils.db_router.DBRouter', ]

以后自动读写分离

image-20230426173239589

标签:主库,db,django,master,mysql,从库,root,主从
From: https://www.cnblogs.com/clever-cat/p/17356820.html

相关文章

  • Django进阶:事务操作、悲观锁和乐观锁
    Django进阶:事务操作、悲观锁和乐观锁参考网址https://zhuanlan.zhihu.com/p/372957129事务处理(transaction)对于Web应用开发至关重要,它可以维护数据库的完整性,使整个系统更加安全。比如用户A通过网络转账给用户B,数据库里A账户中的钱已经扣掉,而B账户在接收过程中服务器......
  • MySQL是什么
    DB哥MySQL高级教程-系统学习MySQL共149课时关注微信公众号免费学:DB哥文末有MySQL高级课程目录MySQL是什么?随着时间的推移,开源数据库在中低端应用中逐渐流行起来,占据了很大的市场份额。开源数据库具有免费使用、配置简单、稳定性好、性能优良等特点,而MySQL数据库正是开源数据库中......
  • mysql面试题
    DB哥MySQL高级教程-系统学习MySQL共149课时关注微信公众号免费学:DB哥文末有MySQL高级课程目录什么是MySQLMySQL是一个关系型数据库,它采用表的形式来存储数据。你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列)。行代表每一行数据,列代表该行中的每个值。列上......
  • mysql单服务器配置多实例运行
    mysql版本5.7在my.cnf配置文件中增加下面的配置信息:[mysqld_multi]#mysqld=/usr/local/mysql/bin/mysqld_safemysqladmin=/usr/local/mysql/bin/mysqladminuser=rootpassword=123456[mysqld3307]server-id=3307port=3307log-bin=mysql-binlog-error=/Users/......
  • Linux 系统导入MySQL的sql脚本
    1、使用mysql-uroot-p命令连接数据库 2、将数据库文件上传到/root目录下 3、使用use命令打开数据库 4、设置编码格式:setnamesutf8; 5、使用命令source/root/+文件名,屏幕上就会不断的滚,直到最后提示导入成功。 ......
  • Mysql数据库
    数据库1.什么是数据库数据库(DataBase,简称DB)概念:长期存放在计算机内,有组织,可共享的大量数据的集合,是一个数据“仓库”作用:保存,并能安全管理数据(如:增删改查等),减少冗余…数据库分类关系型数据库(SQL)MySQL,Oracle,SQLServer,SQLite,DB2,......
  • MySQL 安装及配置
     1、准备工作mysql-installer-community-5.7.34.0.msiVisualC++2013Framework4.5.2补丁说明:安装MySQL5.7之前,先安装VisualC++2013和Framework4.5.2补丁。 2、开始安装服务器部署,选择“ServerOnly” 准备就绪 检查完成  选择配置类型和端口 选择“S......
  • Django4全栈进阶之路19 项目实战(用户管理):user_delete.html用户删除画面设计
    1、模块:<tbody>{%foruserinuser_list%}<tr><td>{{user.username}}</td><td>{{user.email}}</td>......
  • MySQL(二)备份与还原
    一.MySQL备份1.本地备份1.win+r后输入cdm2.命令行界面输入命令mysqldump-uroot-p 数据库名>存放备份sql文件的全目录,eg:  mysqldump-uroot-pbooksystem> D:\backup\booksystem.sql3.控制台没有输出~等待~结束完成2.异......
  • Django4全栈进阶之路18 项目实战:登录模块设计
    1、编写函数视图,判定用户名密码,验证通过进入home主页,不通过返回登录页面deflogin_view(request):ifrequest.method=='POST':username=request.POST.get('username')password=request.POST.get('password')print(username)......