美文网首页
MySQL主从复制 - 延时

MySQL主从复制 - 延时

作者: 诺之林 | 来源:发表于2018-11-29 20:20 被阅读23次

    本文的示例代码参考replication/delay.py

    目录

    容器

    docker run --name mysql-master -p 4406:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.17
    
    docker run --name mysql-slave -p 4407:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.17
    
    docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-master
    # 172.17.0.2
    
    docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-slave
    # 172.17.0.3
    

    主从

    主数据库

    docker cp mysql-master:/etc/mysql/mysql.conf.d/mysqld.cnf ~/Downloads/mysqld-master.cnf
    
    vim ~/Downloads/mysqld-master.cnf
    
    [mysqld]
    pid-file    = /var/run/mysqld/mysqld.pid
    socket      = /var/run/mysqld/mysqld.sock
    datadir     = /var/lib/mysql
    #log-error  = /var/log/mysql/error.log
    # By default we only accept connections from localhost
    #bind-address   = 127.0.0.1
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links=0
    
    ## 设置server_id,一般设置为IP,同一局域网内注意要唯一
    server_id=100
    ## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
    binlog-ignore-db=mysql
    ## 开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)
    log-bin=edu-mysql-bin
    ## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
    binlog_cache_size=1M
    ## 主从复制的格式(mixed,statement,row,默认格式是statement)
    binlog_format=mixed
    ## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
    expire_logs_days=7
    ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
    ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
    slave_skip_errors=1062
    
    docker cp ~/Downloads/mysqld-master.cnf mysql-master:/etc/mysql/mysql.conf.d/mysqld.cnf
    
    docker restart mysql-master
    
    docker exec -i mysql-master mysql -uroot -p123456  <<< "CREATE USER 'slave'@'%' IDENTIFIED BY '123456';"
    
    docker exec -i mysql-master mysql -uroot -p123456  <<< "GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';"
    

    从数据库

    docker cp mysql-slave:/etc/mysql/mysql.conf.d/mysqld.cnf ~/Downloads/mysqld-slave.cnf
    
    vim ~/Downloads/mysqld-slave.cnf
    
    [mysqld]
    pid-file    = /var/run/mysqld/mysqld.pid
    socket      = /var/run/mysqld/mysqld.sock
    datadir     = /var/lib/mysql
    #log-error  = /var/log/mysql/error.log
    # By default we only accept connections from localhost
    #bind-address   = 127.0.0.1
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links=0
    
    ## 设置server_id,一般设置为IP,注意要唯一
    server_id=101  
    ## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
    binlog-ignore-db=mysql  
    ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
    log-bin=edu-mysql-slave1-bin  
    ## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
    binlog_cache_size=1M  
    ## 主从复制的格式(mixed,statement,row,默认格式是statement)
    binlog_format=mixed  
    ## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
    expire_logs_days=7  
    ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
    ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
    slave_skip_errors=1062  
    ## relay_log配置中继日志
    relay_log=edu-mysql-relay-bin  
    ## log_slave_updates表示slave将复制事件写进自己的二进制日志
    log_slave_updates=1  
    ## 防止改变数据(除了特殊的线程)
    read_only=1
    
    docker cp ~/Downloads/mysqld-slave.cnf mysql-slave:/etc/mysql/mysql.conf.d/mysqld.cnf
    
    docker restart mysql-slave
    

    主从复制

    docker exec -i mysql-master mysql -uroot -p123456  <<< "SHOW master status;"
    # File  Position    Binlog_Do_DB    Binlog_Ignore_DB    Executed_Gtid_Set
    # edu-mysql-bin.000002  617     mysql
    
    docker exec -i mysql-slave mysql -uroot -p123456  <<< "change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='edu-mysql-bin.000002', master_log_pos=617, master_connect_retry=30;"
    
    docker exec -i mysql-slave mysql -uroot -p123456  <<< "start slave"
    
    docker exec -i mysql-slave mysql -uroot -p123456  <<< "SHOW slave status \G;" | grep "Running:"
    #             Slave_IO_Running: Yes
    #            Slave_SQL_Running: Yes
    

    延时

    docker exec -i mysql-master mysql -uroot -p123456  <<< "CREATE DATABASE test;"
    
    docker exec -i mysql-master mysql -uroot -p123456  <<< "SHOW DATABASES;" | grep test
    # test
    
    docker exec -i mysql-slave mysql -uroot -p123456  <<< "SHOW DATABASES;" | grep test
    # test
    
    vim delay.py
    
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    
    import pymysql
    import time
    
    create_table_sql = """
    CREATE TABLE users(
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255) UNIQUE,
    nickname VARCHAR(255) NOT NULL
    )
    """
    
    insert_table_sql = """
    INSERT INTO users(username, nickname)
     VALUES(%s,%s)
    """
    
    query_table_sql = """
    SELECT COUNT(*) FROM users
    """
    
    master = pymysql.connect(host='127.0.0.1', user='root',
                           passwd='123456', db='test', port=4406, charset='utf8')
    master_cursor = master.cursor()
    
    slave = pymysql.connect(host='127.0.0.1', user='root',
                           passwd='123456', db='test', port=4407, charset='utf8')
    slave_cursor = slave.cursor()
    
    master_cursor.execute('DROP TABLE IF EXISTS users')
    master_cursor.execute(create_table_sql)
    master.commit()
    
    # 等待主从同步表
    time.sleep(5)
    
    # 主数据库插入数据
    master_cursor.execute(insert_table_sql, ('username1', 'nickname1'))
    master.commit()
    
    # # 从数据库读取数量
    slave_cursor.execute(query_table_sql)
    print('count = ' + str(slave_cursor.fetchone()))
    
    python --version # Python 3.5.2
    
    python delay.py # count = (0,)
    

    结论: 主从复制有一定的数据延时

    参考

    相关文章

      网友评论

          本文标题:MySQL主从复制 - 延时

          本文链接:https://www.haomeiwen.com/subject/zqpmqqtx.html