什么是 Mysql 主从

主从是蕴含一个主库和一个或多个从库,主库中的数据会同步到各个从库当中。

主从复制原理

  • 1、当 master 节点进行 insert、update、delete 操作时,会按程序写入到 binlog 中。
  • 2、salve 从库连贯 master 主库,master 有多少个 slave 就会创立多少个 binlog dump 线程。
  • 3、当 Master 节点的 binlog 发生变化时,binlog dump 线程会告诉所有的 salve 节点,并将相应的 binlog 内容推送给slave节点。
  • 4、I/O 线程接管到 binlog 内容后,将内容写入到本地的 relay-log。
  • 5、SQL 线程读取 I/O 线程写入的 relay-log,并且依据 relay-log 的内容对从数据库做对应的操作。

主从的作用

  • 实现读写拆散
  • 读写拆散可进步数据库的并发能力
  • 当备份数据
  • 应用适当中间件能够实现数据库的高可用

搭建主从环境

主库搭建

  • 拉取数据库镜像,这里应用的是 Mysql5.7镜像
  • 创立主库容器

    docker run -d --name master -p 3307:3306 -v /www/m2/master/conf/:/etc/mysql/conf.d -v /www/m2/master/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql:5.7
  • 主库配置 my.conf

    # mysql 配置项[client]port=3306user=mysqldefault-character-set=utf8mb4[mysql]default-character-set=utf8mb4[mysqld]port=3306user=mysqlcharacter-set-server = utf8mb4default-time_zone = '+8:00'server_id=1log_bin=mysql-binbinlog_format=ROWslow-query-log-file=/logs/slow-query.loglong_query_time=1
  • 进入容器链接上mysql并新增test用户用于从库同步

    docker exec master -it /bin/bashmysql -uroot -proot# 配置test用户和权限(明码也为test)grant replication slave on *.* to 'test'@'%' identified by 'test';flush privileges;#这里的grant replication slave是一个命令格局,示意赋予前面的账户以复制的权限。
  • 查看master节点的binlog状态

    show master status\G;#记住File和Position的值,在从库配置中会应用。

从库搭建

  • 创立镜像

    docker run -d --name slave --privileged=true --link master:master -p 3308:3306 -v /www/m2/salve/conf/:/etc/mysql/conf.d -v /www/m2/salve/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql:5.7
  • 从库配置 my.conf

    # mysql 配置项[client]port=3306user=mysqldefault-character-set=utf8mb4[mysql]default-character-set=utf8mb4[mysqld]port=3306user=mysqlcharacter-set-server = utf8mb4default-time_zone = '+8:00'server_id=2log-bin=mysql-slave-binrelay_log=mysql-relay-bin
  • 进入容器并链接主库

    docker exec slave -it /bin/bashmysql -uroot -proot# mysql 命令# 链接主库配置change master to master_host='172.17.0.4', master_user='test', master_password='test', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=313, master_connect_retry=30;# 启动从库start slave;# 查看从库状态show slave status\G;
    • 上述change命令中,master_user,master_password 为配置主库时为从库设置的账号和明码;master_port 为主库容器中 mysql 的端口,不要写成主机映射到主库容器的端口了;master_log_file,master_log_pos 这两项为配置主库时查问的值,指定同步地位。
    • show slave status 状态阐明

      mysql> show slave status\G;*************************** 1. row ***************************         Slave_IO_State: Waiting for master to send event            Master_Host: 172.17.0.4            Master_User: test            Master_Port: 3306          Connect_Retry: 30        Master_Log_File: mysql-bin.000001    Read_Master_Log_Pos: 622         Relay_Log_File: edu-mysql-relay-bin.000003          Relay_Log_Pos: 320  Relay_Master_Log_File: mysql-bin.000001       Slave_IO_Running: Yes      Slave_SQL_Running: Yes        Replicate_Do_DB:     Replicate_Ignore_DB:      Replicate_Do_Table:  Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table:              Last_Errno: 0             Last_Error:            Skip_Counter: 0    Exec_Master_Log_Pos: 622        Relay_Log_Space: 1006        Until_Condition: None         Until_Log_File:           Until_Log_Pos: 0     Master_SSL_Allowed: No     Master_SSL_CA_File:      Master_SSL_CA_Path:         Master_SSL_Cert:       Master_SSL_Cipher:          Master_SSL_Key:   Seconds_Behind_Master: 0Master_SSL_Verify_Server_Cert: No          Last_IO_Errno: 0          Last_IO_Error:          Last_SQL_Errno: 0         Last_SQL_Error: Replicate_Ignore_Server_Ids:        Master_Server_Id: 1            Master_UUID: 1cdd11f9-a256-11eb-8d55-0242ac110004       Master_Info_File: /var/lib/mysql/master.info              SQL_Delay: 0    SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for more updates     Master_Retry_Count: 86400            Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp:          Master_SSL_Crl:      Master_SSL_Crlpath:      Retrieved_Gtid_Set:       Executed_Gtid_Set:           Auto_Position: 0   Replicate_Rewrite_DB:            Channel_Name:      Master_TLS_Version: 

      当 Slave_IO_Running , Slave_SQL_Running 均为YES时,示意启动胜利。在主库中的操作可胜利同步到从库。

遇到过的问题

  • 从库链接主库提醒失败
    show slave status中提醒:

    Last_IO_Error: error connecting to master 'test@172.17.0.4:3307' - retry-time: 30  retries: 1

    次要起因:host 谬误;账号密码谬误;端口谬误,之前有写成3307主机映射端口导致链接失败;

  • Slave_SQL_Running:NO 同步数据中断

    办法一:跳过引起中断的谬误mysql> stop slave ;mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;mysql> start slave ;办法二:从新设置同步地位首先停掉Slave服务:mysql> slave stop;到主服务器上查看主机状态,记录File和Position对应的值;从库中设置好同步地位;启动同步。