什么是 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=3306 user=mysql default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] port=3306 user=mysql character-set-server = utf8mb4 default-time_zone = '+8:00' server_id=1 log_bin=mysql-bin binlog_format=ROW slow-query-log-file=/logs/slow-query.log long_query_time=1
-
进入容器链接上 mysql 并新增 test 用户用于从库同步
docker exec master -it /bin/bash mysql -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=3306 user=mysql default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] port=3306 user=mysql character-set-server = utf8mb4 default-time_zone = '+8:00' server_id=2 log-bin=mysql-slave-bin relay_log=mysql-relay-bin
-
进入容器并链接主库
docker exec slave -it /bin/bash mysql -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: 0 Master_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: NULL Slave_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 对应的值;从库中设置好同步地位;启动同步。