生产环境搭建主从

一个跑了很长时间的数据库给他做主从,要保证数据一样

  1. 做一台服务器两个数据库的主从
  2. 首先带全备一下主库,指定master-data用于定义二进制主从的开始点

在一台服务器上装两个mysql

二进制安装,上传mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz到服务器上

  1. #解压
  2. tar -zxvf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
  3. mv mv mysql-5.7.24-linux-glibc2.12-x86_64 mysql-5.7.24
  4. #创建相应的目录
  5. mkdir -p /data/app
  6. mkdir -p /data/{3306,3307}/data
  7. mkdir -p /data/socket
  8. ln -s /data/mysql-5.7.24 /data/app/mysql-5.7.24
  9. #3306实例配置
  10. cat > /data/3306/my.cnf <<cao
  11. [mysqld]
  12. user=mysql
  13. basedir=/data/app/mysql-5.7.24
  14. datadir=/data/3306/data
  15. socket=/data/socket/mysql_3306.sock
  16. port=3306
  17. server_id=6
  18. log_bin=/data/3306/mysql-bin
  19. cao
  20. #3307实例配置
  21. cat > /data/3307/my.cnf <<cao
  22. [mysqld]
  23. user=mysql
  24. basedir=/data/app/mysql-5.7.24
  25. datadir=/data/3307/data
  26. socket=/data/socket/mysql_3307.sock
  27. port=3307
  28. server_id=7
  29. log_bin=/data/3306/mysql-bin
  30. cao
  31. #创建mysql用户并授权
  32. useradd -s /sbin/nologin mysql
  33. chown -R mysql:mysql /data
  34. #初始化
  35. /data/app/mysql-5.7.24/bin/mysqld --initialize-insecure --user=mysql --basedir=/data/app/mysql-5.7.24 --datadir=/data/3306/data
  36. /data/app/mysql-5.7.24/bin/mysqld --initialize-insecure --user=mysql --basedir=/data/app/mysql-5.7.24 --datadir=/data/3307/data
  37. #编写systemd的启动脚本
  38. --3306
  39. cat > /etc/systemd/system/mysqld3306.service <<cao
  40. [Unit]
  41. Description=MySQL Server
  42. Documentation=man:mysqld(8)
  43. Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
  44. After=network.target
  45. After=syslog.target
  46. [Install]
  47. WantedBy=multi-user.target
  48. [Service]
  49. User=mysql
  50. Group=mysql
  51. ExecStart=/data/app/mysql-5.7.24/bin/mysqld --defaults-file=/data/3306/my.cnf
  52. LimitNOFILE = 5000
  53. cao
  54. --3307
  55. cat > /etc/systemd/system/mysqld3307.service <<cao
  56. [Unit]
  57. Description=MySQL Server
  58. Documentation=man:mysqld(8)
  59. Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
  60. After=network.target
  61. After=syslog.target
  62. [Install]
  63. WantedBy=multi-user.target
  64. [Service]
  65. User=mysql
  66. Group=mysql
  67. ExecStart=/data/app/mysql-5.7.24/bin/mysqld --defaults-file=/data/3307/my.cnf
  68. LimitNOFILE = 5000
  69. cao
  70. #启动测试
  71. systemctl start mysqld{3306,3307}
  72. yum -y install net-tools
  73. netstat -tnlp
  74. #写入环境变量,修改mysql密码
  75. echo 'export PATH=$PATH:/data/app/mysql-5.7.24/bin' >> /etc/profile
  76. source /etc/profile
  77. mysqladmin -uroot -p password 123 -S /data/socket/mysql_3306.sock
  78. mysqladmin -uroot -p password 123 -S /data/socket/mysql_3307.sock

配置主从

  1. #主库创建授权用户
  2. mysql -S /data/socket/mysql_3306.sock -e "grant replication slave on *.* to repl@'172.16.0.0' identified by '123'"
  3. #主库全量备份,恢复到从库
  4. mysqldump -S /data/socket/mysql_3306.sock -A --master-data=2 --single-transaction -R -E --triggers > /tmp/full.sql
  5. #从库恢复
  6. mysql -S /data/socket/mysql_3307.sock
  7. mysql> set sql_log_bin=0;
  8. mysql> source /tmp/full.sql;
  9. #指定恢复的节点
  10. 查看具体用法 help change master to ,下列的参数需要跟全量备份的节点对照
  11. [root@localhost ~]# cat /tmp/full.sql | sed -n 22p
  12. -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=446;
  13. mysql> CHANGE MASTER TO
  14. MASTER_HOST='172.16.0.14',
  15. MASTER_USER='repl',
  16. MASTER_PASSWORD='123',
  17. MASTER_PORT=3306,
  18. MASTER_LOG_FILE='mysql-bin.000005',
  19. MASTER_LOG_POS=154,
  20. MASTER_CONNECT_RETRY=10;
  21. #开启slave线程(IO,SQL)
  22. start slave;
  23. show slave status \G

主从复制(过程)原理

MySQL 主从问题详解 - 图1

涉及到的文件

  1. 主库:
  2. binlog
  3. 从库:
  4. relaylog 中继日志
  5. master.info 主库的信息文件
  6. relaylog.info relaylog应用的信息

涉及到的线程

  1. 主库:
  2. binlog_dump thread : dump_t
  3. 从库:
  4. slave_io_thread : io_t
  5. slave_sql_thread : sql_t

主从复制监控

show slave status \G

参数详情

  1. 主库的有关信息(master.info):
  2. Master_Host: 172.16.0.14
  3. Master_User: repl
  4. Master_Port: 3306
  5. Connect_Retry: 10
  6. ***********************************
  7. Master_Log_File: mysql-bin.000006
  8. Read_Master_Log_Pos: 154
  9. ***********************************
  10. 从库中继日志信息有关(relay.info):
  11. Relay_Log_File: localhost-relay-bin.000002
  12. Relay_Log_Pos: 320
  13. Relay_Master_Log_File: mysql-bin.000006
  14. 从库的线程运行状态:
  15. Slave_IO_Running: Yes
  16. Slave_SQL_Running: Yes
  17. Last_IO_Errno: 0
  18. Last_IO_Error:
  19. Last_SQL_Errno: 0
  20. Last_SQL_Error:
  21. 过滤复制有关的信息:
  22. Replicate_Do_DB:
  23. Replicate_Ignore_DB:
  24. Replicate_Do_Table:
  25. Replicate_Ignore_Table:
  26. Replicate_Wild_Do_Table:
  27. Replicate_Wild_Ignore_Table:
  28. 从库延迟的时间:
  29. Seconds_Behind_Master: 0
  30. 人为延时从库:
  31. SQL_Delay: 0
  32. SQL_Remaining_Delay: NULL
  33. gtid复制有关的:
  34. Retrieved_Gtid_Set:
  35. Executed_Gtid_Set:
  36. Auto_Position: 0

主从故障分析

io故障

  1. --线程故障(connect
  2. 网络、防火墙、连接信息不对、用户没权限、连接数上限
  3. 排查:手动mysql -urepl -p123 -P3306测试
  4. --请求binlogno
  5. master节点做了reset操作、master节点binlog损坏、master节点没开binlog日志
  6. 解决:
  7. 从库停止slave同步,reset slave,重新change master to,启动slave
  8. --存储binlogrelaylog

sql故障

  1. 造成原因:
  2. 对象已存在,无法执行dml,主键冲突,约束冲突等
  3. 解决:
  4. 重建主从,把握一个原则,一切以主库为主
  5. 避免方法:
  6. 1、从库只读
  7. read_only
  8. super_read_only
  9. 2、使用读写分离中间件
  10. mycat
  11. proxysql
  12. maxscale

主从延时问题以及监控

主从延时的估算时间值

mysql> show slave status \G

Seconds_Behind_Master: 0

该结果只做参考,具体还需查看binlog和relay_log定位问题

主库的原因

  1. 1binlog写入不及时
  2. 解决:sync_binlog=1 实时同步
  3. 2、默认情况下 dump_t 是串行挨个传输binlog的,并发事务量大或者大事物
  4. 解决:必须GTID,使用group commit方式,可以支持dump_t的并行模式
  1. #主库的binlog位置
  2. mysql> show master status \G
  3. *************************** 1. row ***************************
  4. File: mysql-bin.000005
  5. Position: 154

从库原因

  1. 1、传统复制(classic)中,从库的sql线程是单线程
  2. 解决,使用GTID5.6版本基于库的多线程单库还是串行,5.7版本是基于事务的多线程(MTS
  3. 2、主从的参数配置不一样
  4. 3、主从的索引不一样
  5. 4、版本差异
  1. mysql> show slave status \G
  2. *************************** 1. row ***************************
  3. #从库的binlog位置
  4. Master_Log_File: mysql-bin.000005
  5. Read_Master_Log_Pos: 154
  6. #从库的sql线程回放relay_log的位置
  7. Relay_Log_File: localhost-relay-bin.000002
  8. Relay_Log_Pos: 320
  9. Relay_Master_Log_File: mysql-bin.000005
  10. #从库的sql线程回放relay_log的位置对应的binlog位置
  11. Exec_Master_Log_Pos: 154
  12. Relay_Log_Space: 531
  13. #也可以通过查看数据库data目录下的 relay_log.info 来对照relay_log和bin_log的位置关系