首页 > 数据库 >mysql 主从,django操作读写分离

mysql 主从,django操作读写分离

时间:2023-04-23 16:12:17浏览次数:43  
标签:log db django master mysql home 从库 主从

目录

mysql主从

目的: 主要做读写分离,单个数据库并发量太低,提高并发量。

一定要开启binlog日志,是mysql的一个日志机制,只要有变化binlog就会执行
# 原理:
主库db的更新事件会被写到binlog中
从库发起链接连接主库
主库有个binlog线程 把binglog的内容发送到从库
从库有个io线程从读取binlog内容,写到自己的relay log里面
从库还有一个sql线程,读relay log写到从库的db

搭建步骤

1.准备两台机器

拉取mysql5.7的镜像

2.创建文件夹,文件(目录映射)

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

3 编写mysql配置文件(主,从)重要

主的配置

[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

从的

    [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 /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 33306: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 33306:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

连接主库修改新建用户

cmd命令行
mysql -uroot -h 10.0.0.200 -P33306 -p

#在主库创建用户并授权
create user 'test'@'%' identified by '123';
grant all privileges on *.* to 'test'@'%' ;

#刷新权限
flush privileges;

查看主服务器状态
show master status;   # 文件名在从库中需要用到

image

连接从库修改配置

mysql -uroot -P33306 -h 10.0.0.201 -p
    #配置详解
    '''
    change master to 
    master_host='MySQL主服务器IP地址', 
    master_user='之前在MySQL主服务器上面创建的用户名', 
    master_password='之前创建的密码', 
    master_log_file='MySQL主服务器状态中的二进制文件名', 
    master_log_pos='MySQL主服务器状态中的position值';
    '''
# 根据主服务器查出来的状态填写mysql-bin文件名
    change master to master_host='10.0.0.200',master_port=33306,master_user='test',master_password='123',master_log_file='mysql-bin.000004',master_log_pos=0;

#启用从库
start slave;

#查看从库状态(如下图)
show slave status\G;

image

django操作多数据库方法

这里使用sqlite 来做示范

1.配置文件

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    },
    'db1': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db1.sqlite3',
    }
}
"可以配多个数据库"

mysql:
    DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  
        'NAME': 'lxj',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '10.0.0.200',
        'PORT': '33306'
    },
    'db1': {
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'lxj',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '10.0.0.201',
        'PORT': '33306'
    }
}

2.手动读写分离

using() 指定数据库

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

3.自动读写分离

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

class DBRouter(object):
    def db_for_read(self, model, **hints):
        # 多个从库 ['db1','db2','db3'] 可以使用random_choice 随机拿从库
        return 'db1'

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


        return 'default'

4.配置文件添加

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

新点

python38 manage.py makemigrations app01  # 后面可以指定迁移的app
python38 manage.pu migrate --databases=db1  # 指定迁移到哪个数据库中,前提是配置文件中DATABASES 配置好

标签:log,db,django,master,mysql,home,从库,主从
From: https://www.cnblogs.com/LiaJi/p/17346826.html

相关文章

  • Django全栈进阶之路3 Django4项目APP
    Django4项目APPdjango-adminstartappapp01或pythonmanage.pystartappapp01 #app01是app名称    PyCharm的样子:  ......
  • sqlserver视图 to mysql表
    sqlserver视图tomysql表有两台服务器,是同一个内网。sqlserver这台只能内网访问mysql这台可内可外现在需要将sqlserver的一个视图数据,每天凌晨同步到另外一台服务器的mysql数据库里共参考:安装sqlserverhttps://www.linuxprobe.com/centos7-instal-mssql-2019.html创......
  • redis,持久化RDB,AOF,混合(AOF),主从复制原理和方案,哨兵高可用
    内容回顾#悲观乐观锁: django中如何实现 -悲观锁:mysql行锁表锁-乐观锁:真正修改时,加入限制条件django中事务如何开启 -原生sql如何开启事务:begin;commit; -django中如何开事务:atomic()commit()for_update是锁表还是锁行如果查......
  • 一篇文章教会你进行Mysql数据库和数据表的基本操作
    前言NaicatforMysql使用通常情况下,我们都是通过mysql.exe(客户端),连接mysql服务的。但是有个问题。第一个问题就是太丑了。第二个问题是因为这不会自动提示啊...,早都习惯了各种自动提示工具,在用这么Low的安装下一步下一步就可以了!!!管理员运行PatchNavicat打开之后,游览到安装N......
  • 1 python操作哨兵 、2 python操作集群、3 缓存优化、4 mysql 主从 、5 django使用多数
    目录1python操作哨兵2python操作集群3缓存优化3.1redis缓存更新策略3.2缓存击穿,雪崩,穿透4mysql主从5django使用多数据库做读写分离1python操作哨兵#高可用架构后---》不能直接连某一个主库了---》主库可能会挂掉,后来它就不是主库了#之前学的连接redis的操作,就用不......
  • Django静态文件,链接数据库,DRM操作
    目录配置文件的介绍静态文件的配置request对象form表单Django链接数据库(MySQL)(掌握)Django的ORM操作ORM基本语句数据的增查模板变量的分配配置文件的介绍SECRET_KEY='0yge9t5m9&%=of**qk2m9z^7-gp2db)g!*5dzb136ys0#)*%*a'#盐DEBUG=True#调试模式,等项目上线的时候......
  • Mysql查询语句进阶知识集锦
    前言上次咱们简单的学习了一下select的用法,一篇文章教会你进行Mysql数据库和数据表的基本操作,对数据库大概有了一些基本的了解。咱们接着上次继续来看叭!查询数据如下or查询我们在上学时,会听到这样的话,某某某,你把谁谁谁或者谁谁谁叫过来。这样子的话,我们我们要查询的,就是一个或......
  • mysql主从-day1——mysql主从搭建、django中使用多数据库做读写分离
    目录一、mysql主从5django使用多数据库做读写分离一、mysql主从#之前做过redis的主从,很简单#mysql稍微复杂一些,搭建mysql主从的目的是? -读写分离-单个实例并发量低,提高并发量-只在主库写,读数据都去从库#mysql主从原理步骤一:主库db的更新事件......
  • Django配置mysql数据库
    今天跟大家分享Django配置python的mysql数据库链接工具pymysql。系统环境:windows11x64,pycharm专业2022.3版本,python11,Django4.0。第一步:pip安装pymysql库,在当前django的python环境中用pip install pymysql进行安装。如下图: 我已经安装好,所以不用重新安装,这里需要注意的是有......
  • ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run
      今天执行mysql操作的时候出现了错误:ERROR2002(HY000):Can'tconnecttolocalMySQLserverthroughsocket'/var/run/mysqld/mysqld.sock'问题1:首先检查是否安装了mysql-server了 sudoapt-getinstallmysql-servertoinstallmysqlonubuntu  sudoapt-getin......