首页 > 数据库 >数据库主从

数据库主从

时间:2022-12-27 08:55:34浏览次数:40  
标签:bin log 数据库 master mysql home docker 主从

1 mysql主从搭建

# 项目只有一个数据库服务端
    -无论写还是读,请求都压在这个mysql服务器上
    -连接数过高,mysql顶不住
    -假设做成两台,一台只用来写数据,另一台用来读数据  -必须要保证两个服务的数据实时同步
    -主库和从库
        -主库用来写,从库用来读,只需要做好主从同步,就能保证数据的准确
        -一主一从
        -一主多从
    -项目中最多,最影响效率的其实是查,把查分散出去,压力小很多
    
    
    
# 主从配置原理
    1)master(主库)会将变动记录到二进制日志(binlog)里面;
    2)slave有一个I/O线程将二进制日志拉取;
    3)slave有一个I/O线程把master的二进制写入到relay日志里面;
    4)slave有一个SQL线程,按照relay日志回放自己的库中

1.1 搭建步骤

# 1 准备两台机器  ----》docker 容器模拟
    -docker pull mysql:5.7
# 2 配置两台机器环境---》创建两个文件夹,做目录映射,一个给主,一个给从
    mkdir /home/mysql
    mkdir /home/mysql/conf.d
    mkdir /home/mysql/data
    touch /home/mysql/my.cnf
    
    mkdir /home/mysql2
    mkdir /home/mysql2/conf.d
    mkdir /home/mysql2/data
    touch /home/mysql2/my.cnf
    
    
# 3 编写mysql 主库的配置文件   ---》重点:server-id 不能重复,开启bin-log日志
[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

# 4 编写mysql 从库配置文件  server-id不能重复,开启log-bin开启 relay_log
[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


# 5 启动主库和从库
#启动主库容器(挂载外部目录,端口映射成33307,密码设置为123456)
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 33307:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
#启动从库容器(挂载外部目录,端口映射成33306,密码设置为123456)
docker run  -di -v /home/mysql2/data/:/var/lib/mysql -v /home/mysql2/conf.d:/etc/mysql/conf.d -v /home/mysql2/my.cnf:/etc/mysql/my.cnf -p 33306:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7



# 6 远程链接主库 cmd要执行命令
    mysql -h 10.0.0.200 -P 33307 -uroot -p
    #在主库创建用户并授权
    ##创建test用户
    create user 'test'@'%' identified by '123';
    ##授权用户
    grant all privileges on *.* to 'test'@'%' ;
    ###刷新权限
    flush privileges;
    #查看主服务器状态(显示如下图)   bin log日志的位置
    show master status; 
# 7 远程链接从库 cmd要执行命令
    mysql -h 10.0.0.200 -P 33306 -uroot -p
    #配置详解
       '''
        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;
    #启用从库
    start slave;
    #查看从库状态(如下图)
    show slave status\G;
    
    
    
 # 8 测试 
    -主库写
    -从库读

2 django实现读写分离

#1 修改配置文件
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    },
    'db01': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db1.sqlite3',
    }
}

# 2 在models.py 中创建表
    class Books(models.Model):
        name = models.CharField(max_length=32)
        price = models.CharField(max_length=32)
        
# 3 迁移
    makemigrations   # makemigrations app01    不写表示迁移所有
    migrate          # migrate --database=db01 把变化迁移到哪些库中,默认迁移到defalut中
    
    
# 4 写代码,测试
    -新增数据,修改,删除   都是写操作
    -查询数据             读操作
    
    -方式一:手动操作,指定哪个库
        Books.objects.using('db01')
        
    -方式二:自动方式
        -在项目路径下编写 app_router.py
        class DatabaseAppsRouter(object):
            # 读数据的时候,返回哪个库,它就用哪个库
            def db_for_read(self, model, **hints):
                # 分库分表  id大于10000 写到哪个库中,
                # 通过model判断是操作哪个表
                print(model._meta)
                return 'db01'

            def db_for_write(self, model, **hints):
                return 'default'
            
        -配置文件配置,自动读写分离
        DATABASE_ROUTERS = ['django_databases.app_router.DatabaseAppsRouter']

3 远程链接linux开发

# 开发用win,上线基本都用linux
# 有的模块,在win用好好的,linux装不了

# 使用pycharm开发,写代码在win上,但是运行代码,在linux上,运行的结果再返回回来
    -本质:win中得pycharm上的python解释器,使用的是虚拟机上的解释器

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4 远程链接docker开发

 

 

 

 4.1 搭建步骤

# 运行客户端[pycharm]远程链接docker服务器 

# 1 配置运行远程客户端连接docker
    vim /lib/systemd/system/docker.service
    # 原来是
    # ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
    #改成
    ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock
# 2 /etc/profile 写入
    将管理地址写入 /etc/profile
    执行命令:echo 'export DOCKER_HOST=tcp://0.0.0.0:2376' >> /etc/profile
    执行命令:source /etc/profile
    
    
#3 重启docker
    systemctl daemon-reload && systemctl restart docker
    
# 4 测试
    # 虚拟机执行
    curl 127.0.0.1:2376/version
    # win执行
    http://10.0.0.205:2376/version

 

标签:bin,log,数据库,master,mysql,home,docker,主从
From: https://www.cnblogs.com/shangxin-bai/p/17007319.html

相关文章

  • 数据库工具类封装(Pymysql)-python编写
    importpymysql#封装数据库工具类classDBUtil(object):#添加类属性conn=None@classmethoddef__get_conn(cls):#判断conn是否......
  • 在今年的数字生态大会上,云原生数据库前进了一大步
    云计算时代,数据库上云已成为产业数字化转型的重要动力。近期,在2022腾讯全球数字生态大会云原生数据库技术探索专场上,腾讯云分享了在云原生数据库领域的技术演进与探索,并就......
  • 数据库之元数据
    1、概述数据库元数据(DatabaseMetaData):是由Connection对象通过getMetaData方法获取而来,主要封装了是对数据库本身的一些整体综合信息,例如数据库的产品名称,数据库的版本号,......
  • 11g rac数据库节点1启动异常,告警ORA-16188
    问题描述:11grac数据库节点1启动异常,告警ORA-16188,如下所示:环境介绍:该rac环境此前搭建过dg,将dg拆除后,一次系统重启便出现节点1数据库无法正常启动,告警ORA-16188.1、异常重现......
  • 数据库系统原理——SQL数据查询语言(DQL)
    一.内容概述二.单表查询SQL查询语句的基本结构包括3个子句:select、from、where,其中select子句对应于关系代数中的投影运算,用来指定查询结果中所需的属性表达式from子句对......
  • 数据库系统原理——数据库建模
    一.数据库设计过程的概述1.基本概念(1).数据库设计定义数据库设计就是根据各种应用处理的要求、硬件环境及操作系统特性等,将现实世界中的数据进行合理组织,并利用已有的数......
  • 数据库 -- 基础操作
    不知道少了什么,总觉得没有以前快乐,不后悔遇见谁,只后悔变成现在的模样。。。---- 网易云热评一、环境安装PHPstudy下载地址,一路下一步,安装的时候路径不要有中文或者空格​......
  • SQL Server—分离和附加数据库
    目录 ​​一、分离数据库​​​​二、附加数据库​​​​总结​​一、分离数据库什么是分离数据库?指将数据库从SQLServer的实例中删除,使它不在被SQLServer管理和使用,但不......
  • SQL Server——备份与恢复数据库
    为什么要进行备份?不管是任何系统都不可避免的发生一些故障、错误,而为了防止数据丢失找不到的情况,防患于未然,养成备份的好习惯是很有必要的。可以根据自己的实际情况采取具体......
  • express的使用:数据库相关(三)
    1.定义:用来组织,存储和管理数据的仓库2.分类a.MySQL(最广泛,流行度最高,community+enterprise),关系数据库,SQL数据库b.Oracle(收费),关系数据库,SQL数据库c.SQLS......