主从模式的优点:
- 负载均衡
通常情况下,会使用 主服务器 对数据进行 更新、删除 和 新建 等操作,而将 查询 工作落到 从库 头上。 - 异地容灾备份
可以将主服务器上的数据同步到 异地从服务器 上,极大地提高了 数据安全性。 - 高可用
数据库的复制功能实现了 主服务器 与 从服务器间 的数据同步,一旦主服务器出了 故障,从服务器立即担当起主服务器的角色,保障系统持续稳定运作。 - 高扩展性
主从复制 模式支持 2 种扩展方式:
scale-up
向上扩展或者 纵向扩展,主要是提供比现在服务器 性能更好 的服务器,比如 增加 CPU 和 内存 以及 磁盘阵列等,因为有多台服务器,所以可扩展性比单台更大。
scale-out
向外扩展或者 横向扩展,是指增加 服务器数量 的扩展,这样主要能分散各个服务器的压力。
主从模式的缺点
- 成本增加
搭建主从肯定会增加成本,毕竟一台服务器和两台服务器的成本完全不同,另外由于主从必须要开启 二进制日志,所以也会造成额外的 性能消耗。 - 数据延迟
从库 从 主库 复制数据肯定是会有一定的 数据延迟 的。所以当刚插入就出现查询的情况,可能查询不出来。当然如果是插入者自己查询,那么可以直接从 主库 中查询出来,当然这个也是需要用代码来控制的。 - 写入更慢
主从复制 主要是针对 读远大于写 或者对 数据备份实时性 要求较高的系统中。因为 主服务器 在写中需要更多操作,而且 只有一台 可以写入的 主库,所以写入的压力并不能被分散。
主从复制的前提条件
- 主从服务器 操作系统版本 和 位数 一致。
- 主数据库和从数据库的 版本 要一致。
- 主数据库和从数据库中的 数据 要一致。
- 主数据库 开启 二进制日志,主数据库和从数据库的
server_id
在局域网内必须 唯一。
容器安装
基于日志binlog 的 主从配置
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
| services: mysql-master: image: mysql:5.7.22 volumes: - /etc/localtime:/etc/localtime - /home/mysql/master-data:/var/lib/mysql - /home/config/mysql/master/my.cnf:/etc/mysql/my.cnf command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci environment: TZ: Asia/Shanghai MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: zentao MYSQL_USER: zentao MYSQL_PASSWORD: zentao123 depends_on: - mysql-slave deploy: replicas: 1 restart_policy: condition: on-failure ports: - "3306:3306" networks: - *default-network mysql-slave: image: mysql:5.7.22 volumes: - /etc/localtime:/etc/localtime - /home/mysql/slave-data:/var/lib/mysql - /home/config/mysql/slave/my.cnf:/etc/mysql/my.cnf command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci environment: TZ: Asia/Shanghai MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: zentao MYSQL_USER: zentao MYSQL_PASSWORD: zentao123 deploy: replicas: 1 restart_policy: condition: on-failure ports: - "3307:3306" networks: - *default-network
|
docker-compose up -d 后用工具连接主从数据库。
检查从库的起始状态
记录 主数据库 binary-log
的 文件名称 和 数据同步起始位置。
- File: replicas-mysql-bin.000003
- Position: 154
在 从数据库 上运行 主数据库 的相关配置 sql
进行主从关联
1 2 3 4 5 6
| CHANGE MASTER TO MASTER_HOST='mysql-master', MASTER_USER='root', MASTER_PASSWORD='root123', MASTER_LOG_FILE='replicas-mysql-bin.000003', MASTER_LOG_POS=154;
|
在从库命令行里面重新启动 slave
服务
进一步检查 从数据库 的状态信息,两者已经进行 数据同步 关联。
创建目标表
在 主数据库 中创建一张测试数据表 course
1 2 3 4 5 6 7 8 9
| SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for course -- ---------------------------- DROP TABLE IF EXISTS `course`; CREATE TABLE `course` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `lesson_period` double(5,0) DEFAULT NULL, `score` double(10,0) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
主数据库 和 从数据库 的 数据处于 同步状态,那么恭喜你主从复制mysql集群搭建完成。