什么是 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对应的值;从库中设置好同步地位;启动同步。