docker建立mysql8的主备,详细过程及踩坑

本文档详细介绍了如何在Docker环境下配置MySQL8.0的主从复制,包括拉取镜像、运行容器、建立数据库、配置主从、启动复制,并分享了在过程中可能遇到的问题及其解决方法。通过这个教程,读者将能够掌握在容器化环境中实现数据库的高可用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

序言

最近老被问起mysql主备怎么搭建,所以手把手做一个教程,介于机器有限,所以永docker实现。

环境

  1. 操作系统Windows11
  2. docker 4.4.4
  3. MySQL8.0.19

主从搭建

mysql安装

拉取镜像

拉取

docker pull mysql:8.0.19

查看

docker images

如果有docker 桌面版管理器则直接查看
在这里插入图片描述

利用镜像运行两个mysql

master:对外端口3306,容器名称mysql-master,root密码:12345678

docker run -p 3306:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=12345678 -d mysql:8.0.19

slave:对外端口3307,容器名称mysql-slave,root密码:12345678

docker run -p 3307:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=12345678 -d mysql:8.0.19

检查是否运行正常

通过命令查看容器进程
docker ps -a
或者通过docker桌面管理器查看

在这里插入图片描述

通过客户端连接测试

在这里插入图片描述
在这里插入图片描述

建立一个库待同步使用

利用图形客户端建立一个测试库,待同步的时候使用
主库建立:
在这里插入图片描述
从库建立:
在这里插入图片描述

主从配置

配置主库

通过docker ps -a 查看容器id
在这里插入图片描述
通过docker exec进入容器内部

docker exec -it 4c /bin/bash

4c为master容器id:4ca9405ee48f的缩写
切换到/etc/mysql目录下,修改my.cnf
在这里插入图片描述
修改my.cnf
安装vim

apt-get update
apt-get install vim

编辑my.cnf
在这里插入图片描述

server-id=100 // 同一个局域网要唯一
log-bin=master-bin //开启二进制日志功能,名字可以自定义
binlog-format=ROW //二进制日志格式,row、statement,mixed
binlog-do-db=wh-test //同步的数据库名称,不配置则同步所有的

配置好重启

docker restart mysql-master

配置从库

通过docker exec 进入容器

docker exec -it a9 /bin/bash

a9为slave容器id:a93069941737的缩写,id获取方式docker ps -a
同主库一样进入后找到my.cnf文件
在这里插入图片描述
编辑my.cnf
在这里插入图片描述

server-id=101 #局域网唯一,和master不一样就可以
log-bin=mysql-slave-bin #开启二进制日志功能,
relay_log=mysql-relay-bin 
read_only=1 #设置只读,不设置则读写皆可以

配置完成后重启容器

docker restart mysql-slave

开启主从复制

获取file和position

进入master库的mysql客户端,查看master状态
进入master库

docker exec -it 4c /bin/bash

mysql -uroot -p12345678

show master status

在这里插入图片描述
记录下来file:master-bin.000001,position:38492

获取master的独立ip
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-master

在这里插入图片描述
获取ip地址:172.17.0.2

进入slave库的mysql客户端
docker exec -it 4c /bin/bash

mysql -uroot -p12345678

change master to master_host='172.17.0.2', master_user='root', master_password='12345678', master_port=3306, master_log_file='master-bin.000001', master_log_pos=38492, master_connect_retry=30;

master_host :Master库的地址,通过 docker inspect --format=‘{{.NetworkSettings.IPAddress}}’ 容器名称 | 容器id查询容器的IP进行查询
master_port:Master的端口号,指的是容器的端口
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 Slave从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position开始读,即上文中提到Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒

启动slave

在slave的MySQL客户端下执行

#启动
start slave;
#查看状态
show slave status \G;

在这里插入图片描述
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
这两个参数必须是yes才算同步开启了。
如果有错误,在这个命令窗口也能看到错误原因

主从同步测试

在主库表里写入一条记录,在从库表里能够查询到。

踩坑

1.从库的只读是指非超级用户,如果是root权限的用户,是可以读写的。
2.如果主从没有同步成功,可以通过show slave status \G;命令查看下错误原因。
3.在主库中添加用户后,导致同步失败。

<think>嗯,用户之前问过如何搭建项目框架,现在又想知道怎么完成后端项目的搭建。我需要先回顾之前的对话,看看他们之前的需求是什么。之前的回答要是关于技术文档、Web应用、LaTeX学术文档的框架,以及质量保障和工具推荐。现在用户可能是在进行一个毕业设计项目,需要完成后端部分的搭建。 首先,用户可能对后端开发不太熟悉,需要一步步指导。我需要考虑常见的后端技术栈,比如Spring Boot、Django、Node.js等,根据用户可能的背景选择适合的框架。可能还需要数据库设计、API接口规范、安全措施、测试部署等方面。 然后,用户可能希望后端能够支持数学公式的处理,比如存储和渲染。之前的项目涉及到MathJax或KaTeX,所以在后端可能需要处理这些公式的存储,比如转义特殊字符,或者生成LaTeX内容。同时,可能需要考虑数据验证,确保用户输入的公式符合格式要求。 另外,用户可能关心如何保证项目的规范性和可维护性,所以需要提到代码结构、日志管理、配置文件处理等。还有自动化测试和持续集成,比如用GitHub Actions或Jenkins来部署。 还要注意用户提到的系统级指令,比如使用中文回答,结构清晰,分步骤解决问题。需要避免使用用户不可见的术语,保持口语化,但又要专业。 可能需要分几个部分来介绍:技术选型、项目结构、核心模块实现、接口规范、安全措施、测试部署等。每个部分给出具体例子,比如代码片段或配置示例,帮助用户理解。同时推荐一些工具和库,比如Swagger生成API文档,JWT用于身份验证,Postman测试接口。 还要考虑用户可能的开发环境,比如使用IntelliJ IDEA或VS Code,如何配置依赖管理工具,比如Maven或npm。数据库方面可能需要MySQL或MongoDB,根据项目需求选择关系型或非关系型。 最后,确保整个流程逻辑清晰,用户能够按照步骤一步步搭建后端项目。可能还需要提醒一些常见问题,比如依赖冲突、环境变量配置、跨域处理等,帮助用户避免。</think>以下是针对毕业设计项目后端搭建的详细实施方案,包含技术选型、架构设计和关键实现步骤: --- ### 一、技术选型建议 **基础框架选择**(根据项目需求任选其一): ```text 1. Java技术栈:Spring Boot 3.x + MyBatis-Plus + MySQL - 优势:生态完善、企业级验证 - 适用场景:高并发需求、复杂事务处理 2. Python技术栈:Django 4.x + DRF + PostgreSQL - 优势:开发效率高、数学计算库丰富 - 适用场景:快速原型开发、科学计算集成 3. Node.js技术栈:NestJS + TypeORM + MongoDB - 优势:全栈统一语言、非阻塞IO - 适用场景:实时数据处理、微服务架构 ``` **数学公式处理模块**: ```javascript // 公式存储方案(JSON示例) { "content": "\\int_{a}^{b} x^2 dx", "formatType": "latex", "variables": ["a", "b"], "sanitized": true // 标识是否经过安全处理 } ``` --- ### 二、项目结构规范 **标准MVC分层架构**: ``` backend/ ├── src/ │ ├── main/ │ │ ├── java/com/yourproject/ │ │ │ ├── controller/ # API接口层 │ │ │ ├── service/ # 业务逻辑层 │ │ │ ├── dao/ # 数据访问层 │ │ │ └── model/ # 数据实体类 │ │ └── resources/ │ │ ├── application.yml # 配置文件 │ │ └── static/ # 数学符号映射表 ├── test/ # 单元测试 └── pom.xml # Maven依赖管理 ``` --- ### 三、核心模块实现 **1. 公式处理服务**(以Spring Boot为例): ```java @Service public class FormulaService { // LaTeX特殊字符转义 private static final Pattern LATEX_SPECIAL_CHARS = Pattern.compile("[&%$#_{}]"); public String sanitizeLatex(String rawFormula) { return LATEX_SPECIAL_CHARS.matcher(rawFormula).replaceAll("\\\\$0"); } // 公式语法校验 public boolean validateFormula(String formula) { return formula.matches("^\\$.*\\$$"); // 检查$符号匹配 } } ``` **2. API接口示例**(RESTful设计): ```java @RestController @RequestMapping("/api/formulas") public class FormulaController { @Autowired private FormulaService formulaService; @PostMapping public ResponseEntity<?> createFormula(@RequestBody FormulaDTO dto) { if (!formulaService.validateFormula(dto.getContent())) { return ResponseEntity.badRequest().body("公式格式错误"); } String safeContent = formulaService.sanitizeLatex(dto.getContent()); // 存储到数据库... return ResponseEntity.ok().build(); } } ``` --- ### 四、接口规范设计 **OpenAPI 3.0 文档示例**: ```yaml paths: /api/formulas: post: summary: 创建数学公式 requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/Formula' responses: '201': description: 公式创建成功 components: schemas: Formula: type: object properties: content: type: string example: "\int_{a}^{b} x^2 dx" description: LaTeX格式公式 variables: type: array items: type: string example: ["a", "b"] ``` --- ### 五、安全防护措施 **1. 输入校验增强**: ```java // 防御公式注入攻击 public void checkFormulaInjection(String input) { if (input.contains("\\usepackage") || input.contains("\\include")) { throw new IllegalFormulaException("禁止使用外部包引入"); } } ``` **2. JWT鉴权集成**: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() .antMatchers("/api/public/**").permitAll() .anyRequest().authenticated() .and() .addFilterBefore(jwtFilter(), UsernamePasswordAuthenticationFilter.class); } } ``` --- ### 六、测试与部署 **1. 分层测试策略**: ```text ├── 单元测试(JUnit 5) │ └── 公式校验逻辑、业务服务 ├── 集成测试(Testcontainers) │ └── 数据库操作、API端点 └── E2E测试(Postman) └── 完整业务流程验证 ``` **2. 容器化部署**: ```dockerfile # Dockerfile 示例 FROM openjdk:17-jdk-slim COPY target/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java","-jar","/app.jar"] ``` **3. CI/CD流水线**(GitHub Actions): ```yaml name: Backend CI on: [push] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Build with Maven run: mvn clean package - name: Docker Build run: docker build -t yourproject-backend . ``` --- ### 七、开发辅助工具 ```text 1. API测试:Postman(接口调试)、Swagger UI(文档生成) 2. 数据库管理:DBeaver(多数据库支持)、Liquibase(迁移工具) 3. 性能监控:Prometheus + Grafana(指标可视化) 4. 日志分析:ELK Stack(日志集中管理) ``` --- ### 关键注意事项: 1. **公式存储策略**: - 原始公式与渲染结果分离存储 - 建立数学符号白名单机制 - 使用`text`类型字段存储LaTeX代码 2. **版本控制规范**: ```text feat/ # 新功能开发 fix/ # Bug修复 docs/ # 文档更新 refactor/ # 代码重构 ``` 3. **环境配置管理**: ```properties # application-dev.yml spring: datasource: url: jdbc:mysql://localhost:3306/dev_db ``` 建议从最小可行性版本(MVP)开始迭代开发,优先实现核心公式处理功能,再逐步扩展用户系统、权限管理等模块。每周进行代码评审,保持技术债务可控。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值