mysql主从复制
MySQL 主从复制是一种基于日志的复制机制,用于将主服务器(Master)上的数据实时复制到一个或多个从服务器(Slave)。主从复制的原理如下:
- 主服务器将所有修改操作记录在二进制日志(Binary Log)中。这些修改可以是插入、更新或删除数据的操作。
- 从服务器连接到主服务器,并发送一个请求,请求成为主服务器的从服务器。主服务器收到请求后,将记录从服务器的信息,并开始与从服务器建立复制连接。
- 主服务器将二进制日志中的内容发送给从服务器。从服务器接收并执行这些日志中的操作,将数据修改操作反映到自己的数据库上。
- 从服务器还会定期向主服务器发送心跳信息以维持连接。如果主服务器长时间没有收到从服务器的心跳信息,就认为从服务器宕机,不再向其发送日志。
- 如果主服务器发生故障,导致无法提供服务,可以将一个从服务器提升为新的主服务器,以继续提供服务。此时,其他从服务器将切换到新的主服务器上进行复制。
- 通过主从复制,可以实现数据的实时复制和分布式读取,提高数据库的可用性和读取性能。此外,主从复制还可以用于备份数据,当主服务器发生故障时,可以快速切换到从服务器,减少服务停机时间。
- 需要注意的是,主从复制是异步的,从服务器的数据可能稍有延迟。而且主从复制只复制数据修改操作,不复制表结构的变更。如果需要同步表结构的变更,可以使用主从复制搭配其他工具,如 GTID(Global Transaction Identifier)或者基于触发器的解决方案。
创建对应的文件夹
mkdir -p /home/mysql/{cnf,logs,mysql}
mkdir -p /home/mysql-slave/{cnf,logs,mysql}
在cnf文件夹下创建my.cnf文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #写入下面配置 [mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql
default-time_zone='+8:00' skip-name-resolve
log-bin=mysql-bin binlog-format=ROW # 每个服务不一样 server_id=1
symbolic-links=0 expire_logs_days=7
max_connections = 2000 max_user_connections = 1900 max_connect_errors = 100000 max_allowed_packet = 50M lower_case_table_names=0 sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
|
编写docker-compose.yml文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| version: '3.5' networks: mysql-network: driver: bridge ipam: config: - subnet: 10.1.20.0/24
services: mysql-master: image: mysql:8.0.32 container_name: mysql-3124 privileged: true restart: always ports: - 3124:3306 environment: - TZ=Asia/Shanghai - MYSQL_ROOT_PASSWORD=L3z5uLD@rB1y - character-set-server=utf8mb4 - collation-server=utf8mb4_general_ci volumes: - /home/mysql/cnf:/etc/mysql/conf.d - /home/mysql/logs:/logs - /home/mysql/mysql:/var/lib/mysql networks: mysql-network: ipv4_address: 10.1.20.2
mysql-slave: image: mysql:8.0.32 container_name: mysql-3125 privileged: true restart: always ports: - 3125:3306 environment: - TZ=Asia/Shanghai - MYSQL_ROOT_PASSWORD=L3z5uLD@rB1y - character-set-server=utf8mb4 - collation-server=utf8mb4_general_ci volumes: - /home/mysql-slave/cnf:/etc/mysql/conf.d - /home/mysql-slave/logs:/logs - /home/mysql-slave/mysql:/var/lib/mysql networks: mysql-network: ipv4_address: 10.1.20.3
|