zoukankan      html  css  js  c++  java
  • 数据库主从搭建

    数据库主从搭建

    为什么要搭建数据库主从,因为一个项目一般都是读的操作比写的操作多很多,所以搭建主从,实现读写分离,减轻数据库压力。

    2.1 主从同步原理

    mysql主从配置的流程大体如图:

    1)master会将变动记录到二进制日志里面;

    2)master有一个I/O线程将二进制日志发送到slave;

    1. slave有一个I/O线程把master发送的二进制写入到relay日志里面;

    4)slave有一个SQL线程,按照relay日志处理slave的数据;

    2.2 注意点

    1 咱们用docker模拟了两台服务器,服务器的系统,mysql的版本必须一致

    2.3 具体步骤,启动主库

    docker pull mysql:5.7
    #在home目录下创建mysql文件夹,下面创建data和conf.d文件夹 
    mkdir /home/mysql 
    mkdir /home/mysql/conf.d 
    mkdir /home/mysql/data/
    # 创建my.cnf配置文件
    touch /home/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
    ##主库----start--- 同一局域网内注意要唯一
    server-id=100  
    ## 开启二进制日志功能,可以随便取(关键)
    log-bin=mysql-bin
    ##主库----end--- 
    [client]
    default-character-set=utf8
    
    [mysql]
    default-character-set=utf8
    
    
    #启动主库容器(挂载外部目录,端口映射成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
    

    2.4 启动从库

    #在home目录下创建mysql2文件夹,下面创建data和conf.d文件夹 
    mkdir /home/mysql2
    mkdir /home/mysql2/conf.d 
    mkdir /home/mysql2/data/
    #mkdir /home/mysql2 /home/mysql2/conf.d /home/mysql2/data/
    # 创建my.cnf配置文件
    touch /home/mysql2/my.cnf
    
    [mysqld]
    user=mysql
    character-set-server=utf8
    default_authentication_plugin=mysql_native_password
    secure_file_priv=/var/lib/mysql
    datadir=/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
    
    
    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
             
    
    

    2.5 远程连接到主库和从库

    #主库
    mysql -h 101.133.225.166 -P 33307 -u root -p123456
    ##创建test用户,设置任意ip地址可以访问,密码为123
    create user 'test'@'%' identified by '123';
    ##授权用户,把所有权限授权给test,他就相当于root了
    grant all privileges on *.* to 'test'@'%' ;
    ###刷新权限
    flush privileges;
    #查看主服务器状态(显示如下图)
    show master status; 
    
    
    
    #从库
    mysql -h 101.133.225.166 -P 33306 -u root -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='101.133.225.166',master_port=33307,master_user='test',master_password='123',master_log_file='mysql-bin.000003',master_log_pos=0;
    #启用从库
    start slave;
    #查看从库状态(如下图)
    show slave statusG;
    
    
    
    

    2.6 测试

    #在主库上创建数据库test1
    create database test1;
    use test1;
    #创建表
    create table tom (id int not null,name varchar(100)not null ,age tinyint);
    #插入数据
    insert tom (id,name,age) values(1,'xxx',20),(2,'yyy',7),(3,'zzz',23);
    #在从库上查看是否同步成功
    #查看数据库
    show database;
    use test1;
    #查看表
    show tables;
    #查看数据
    select * from test1;
    

    补充:查看容器启动日志

    docker logs b8bdd9c57f22

    3 django实现读写分离

    makemigrations
    
    #同步数据库
    migrate   #表示同步到default数据库
    migrate app01 --database=db1
    

    3.2 手动控制读写分离

    def index(request):
    
        #向数据表中存条数据
        #写到哪个库中了?默认情况下写到default
        # ret=models.Book.objects.using('default').create(name="xxx")
        # print(ret)
    
    
        #读第一条数据,默认从哪读?default
        #指定去从库读?在queryset对象后加个.using('db1')
    
        # ret=models.Book.objects.all().first()
        ret=models.Book.objects.all().using('db1').first()
        print(ret.name)
        return HttpResponse("ok")
    

    3.3 自动读写分离

    #第一步:在项目根路径下创建一个py文件(database_router.py)
    class DatabaseAppsRouter(object):
        def db_for_read(self, model, **hints):
          	#读可能去db1或者db2中读,
            return 'db1'
        def db_for_write(self, model, **hints):
            print(model)
            return 'default'
    
        def allow_migrate(self, db, app_label, model_name=None, **hints):
            print(db)
            print(app_label)
            print(model_name)
            if app_label=='app01' and db=="db1":
                return False
            return None
     # 第二部,在setting中配置
    DATABASE_ROUTERS = ['mydjangotest.database_router.DatabaseAppsRouter']
    
    

    3.4 allow_migrate的使用

    migrate app01 --database=db1   #不会同步
    
    migrate app01 --database=default #可以同步
    
    #用来控制数据表同步时,不能同步到从库中
    
  • 相关阅读:
    Java 蓝桥杯 算法训练 貌似化学
    Java 蓝桥杯 算法训练 貌似化学
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    JAVA-蓝桥杯-算法训练-字符串变换
    Ceph:一个开源的 Linux PB 级分布式文件系统
    shell 脚本监控程序是否正在执行, 如果没有执行, 则自动启动该进程
  • 原文地址:https://www.cnblogs.com/chanyuli/p/12350142.html
Copyright © 2011-2022 走看看