mysql 主从,django操作读写分离

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 配置好
posted @ 2023-04-23 16:04  李阿鸡  阅读(24)  评论(0编辑  收藏  举报
Title