• django3.2.14之docker下主从分离【亲测可用】


    mysql安装:pip3 install mysqlclient

    如果安装出错,请到百度查询mysqlcilent wheel,找到mysqlclient.PyPI这个网站,然后根据Python版本进行下载安装。

    1、创建数据库

    (1)在命令行里输入mysql -uroot -p,然后输入你的Mysql密码

    (2)create database TestMysqlDate charset=utf8;查询所有库:show databases;删除库:drop database 数据库名;

    2、Django连接数据库,去项目下面的settings.py文件里的DATABASES进行修改。

    DATABASES = {
        # 'default': {
        #     'ENGINE': 'django.db.backends.sqlite3',
        #     'NAME': BASE_DIR / 'db.sqlite3',
        # }
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'demo_db',
            'USER': 'root',
            'PASSWORD': 'Newmysql55..',
            'HOST': '127.0.0.1',
            'PORT': '3306',
        }
    }

    3、建立Mysql链接出现的所有错误

    (1)Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezon'

    解决方法如下:在mysql命令模式下输入:set global time_zone='+8:00';就可以了。

    (2)执行python manage.py migrate 命令进行文件迁移,这时控制台会报以下错误:

    django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3

    按照下面两个方法进行解决(2.0-2.2.7需要按照A、B方法改,3.0.3只需要修改A)

    A:找到控制台的base.py文件或找到以下目录:

    /venv/lib/site-packages/django/db/backends/mysql/base.py

    把一下代码进行注释:

    if version < (1, 3, 13):

    raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)

    B:找到控制台的operations.py文件,或找到以下目录:

    venv\lib\site-packages\django\db\backends\mysql\operations.py

    把query = query.decode(errors='replace')改成query = query.encode(errors='replace')

    (3)如果出现版本身份验证错误就是下面的错误提示:

    RuntimeError: cryptography is required for sha256_password or caching_sha2_password

    就去安装这个:pip3 install cryptography

    4、主从架构搭建(setting.py文件下配置)

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'StoreHouse_Data',
            'USER': 'root',
            'PASSWORD': 'Newmysql55..',
            'HOST': '127.0.0.1',
            'PORT': '3306',
        },
        'slave': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'storeHouse_data',
            'USER': 'root',
            'PASSWORD': 'Newmysql55..',
            'HOST': '192.168.170.1',
            'PORT': '3306',
        }
    }
    
    # 在最下面配置自动读写分离数据库
    class DefaultRouter:
        # 写数据
        def db_for_write(self, model, **hints):
            return 'default'
    
        # 读数据
        def db_for_read(self, model, **hints):
            return 'slave'

    (1)数据迁移文件

    1、生成迁移文件:python3 manage.py makemigrations

    2、迁移文件生成表:python3 manage.py migrate --database default

    3、迁移文件生成表:python3 manage.py migrate --database slave

    如在迁移从数据库在控制台出现:is not allowed to connect to this MySQL server。就要去你的从数据库把数据库远程访问进行开启:

    方法1:找到mysql数据库找到user表,把root用户那行的localhost更改为“%”后重启你的数据库即可,然后再进行迁移从数据库。

    方法2:在控制台下进行登录:mysql -u root -p

    创建远程登录用户:CREATE USER 'root'@'%' IDENTIFIED BY '你的密码';

    授权用户远程登录权限:grant all on *.* to 'root'@'%';

    刷新配置:flush privileges;

    (2)读写分离

    手动读写分离
    在使用ORM 调用数据库时,通过.using(db_name)来手动指定要使用的数据库

    StoreHouse_Manager.objects.using('default'):写入

    StoreHouse_Manager.objects.using('slave1'):读取

    (3)自动读写分离

    通过配置数据库路由,来自动实现,这样就不需要每次读写都手动指定数据库了。数据库路由中提供了四个方法。这里这里主要用其中的两个:def db_for_read()决定读操作的数据库,def db_for_write()决定写操作的数据库。

    (4)进入从数据库删除auto.cnf文件

    因为两个数据库的UUID不能一致:

    cd /var/lib/mysql/

    rm -f auto.cnf

    重启mysql:docker restart 8ba41c8eae9c

    (5)进入数据库操作读写分离mysql数据库配置

    查看状态:docker ps

    进入容器:docker exec -it 63eb1e8eb75f /bin/bash

    进入mysql:mysql -uroot -p

    输入密码

    进入mysql控制台,创建用于复制操作的账户

    mysql> CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'repl';
    mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
    mysql> flush privileges;
    mysql> SHOW MASTER STATUS;

    从库配置:

    编辑my.ini配置文件,添加如下代码:

    (linux在etc\mysql\my.cnf文件里,windows在C:\ProgramData\MySQL\MySQL Server 8.0\my.ini文件里进行修改)

    [mysqld]

    log-bin=mysql-bin

    server-id=2

    重启MySQL 服务

    mysql> CHANGE MASTER TO
     MASTER_HOST='192.168.184.130',
     MASTER_USER='repl',
     MASTER_PASSWORD='repl',
     '这里的名称一定要和上面的File里的文件名一致'
     MASTER_LOG_FILE='binlog.000006', (在linux下必须是这样写mysql-bin.000006)
     MASTER_LOG_POS=856;

    这里的000006和856对应上面的图片,必须是一样的数据

    参数说明:master_host =主库地址, master_user= 主库创建同步账户,master_password=主库创建同步账户密码,master_log_file=日志文件名称,master_log_pos=日志文件位置

    开启主从同步:mysql>start slave;

    查看主从同步状态:mysql>show slave status\G

    只需要关注这两个参数是否为Yes,其他状态No,connecting均代表有错误!

    mysql文件默认地址:

    windows:C:\ProgramData\MySQL\MySQL Server 8.0

    linux:var/lib/mysql/

    如出现错误解决方法如下:

    1、Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not open log file'

    解决方法:主库:

    mysql> flush logs; (记住file和position这两个选项)

    show master status;

    从库:

    mysql> stop slave;

    mysql> change master to master_log_file ='dbmaster-bin.000005',master_log_pos=120;(对应上面file和position的值)

    mysql> start slave;

    mysql>show slave status\G

    2、Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'

    解决方法:主库:

    mysql> flush logs;

    show master status\G

    从库:

    mysql> stop slave;

    mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000005',MASTER_LOG_POS=154;

    start slave;

    查看主从同步状态:mysql>show slave status\G

  • 相关阅读:
    电装入股Coherent子公司SiC晶圆制造企业Silicon Carbide LLC
    乘积尾零(Java详解)
    浅谈Rob Pike的五条编程规范
    【三维目标检测】Part-A2(一)
    基于DF中继的协作MIMO通信系统matlab仿真
    AI艺术创作之MidJourney 的新 V4 算法太疯狂了
    虚拟内存 & I/O & 零拷贝总结
    第4章 系统管理员模块功能实现
    python淘宝商品数据抓取之后数据解析出错怎么办
    MATLB|哈里斯鹰算法HHO在电力系统中的应用
  • 原文地址:https://blog.csdn.net/vlking/article/details/126821702