Docker搭建MySQL5.7主从复制的实现

目录
  • 1、新建mysql-master主服务器容器实例3307
  • 2、新建mysql-master主服务器配置文件my.cnf
  • 3 重启master实例
  • 4 进入mysql-master容器
  • 5 master容器实例内创建数据同步用户
  • 6 新建mysql-slave从服务器实例3308
  • 7 进入/usr/local/mysql-slave/conf目录下新建my.cnf
  • 8 修改完配置后重启slave实例
  • 9 在主数据库中查看主从同步状态
  • 10 进入mysql-slave容器
  • 11 在从数据库中配置主从复制
  • 12 在从数据库中查看主从同步状态
  • 13 在从数据库中开启主从同步
  • 14 查看从数据库状态发现已经同步
  • 15 主从复制测试

1、新建mysql-master主服务器容器实例3307

 docker run -p 3307:3306 --name mysql-master \
  -v /usr/local/mysql-master/log:/var/log/mysql \
  -v /usr/local/mysql-master/data:/var/lib/mysql \
  -v  /usr/local/mysql-master/conf:/etc/mysql \
  -e MYSQL_ROOT_PASSWORD=root \
  -d mysql:5.7

将日志、数据、配置文件都使用数据卷方式挂载

首先新建日志存放文件夹: /usr/local/mysql-master/log

数据存放文件夹:/usr/local/mysql-master/data

配置存放文件夹:/usr/local/mysql-master/conf

mkdir -p /usr/local/mysql-master/log /usr/local/mysql-master/data /usr/local/mysql-master/conf

2、新建mysql-master主服务器配置文件my.cnf

进入/usr/local/mysql-master/conf目录下新建my.cnf(上面启动容器实例指定的路径)

文件内容如下:

 [mysqld]
 ## 设置server_id,同一局域网中需要唯一
 server_id=101
 ## 指定不需要同步的数据库名称
 binlog-ignore-db=mysql
 ## 开启二进制日志功能
 log-bin=mall-mysql-bin
 ## 设置二进制日志使用内存大小(事务)
 binlog_cache_size=1M
 ## 设置使用的二进制日志格式(mixed,statement,row)
 binlog_format=mixed
 ## 二进制日志过期清理时间。默认值为0,表示不自动清理。
 expire_logs_days=7
 ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
 ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
 slave_skip_errors=1062

3 重启master实例

修改完配置之后重启master实例

docker restart mysql-master

4 进入mysql-master容器

进入mysql-master容器并登录数据库,密码是容器启动的时候我们在命令行指定的。

docker exec -it mysql-master /bin/bash

mysql -uroot -proot

5 master容器实例内创建数据同步用户

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

6 新建mysql-slave从服务器实例3308

 docker run -p 3308:3306 --name mysql-slave \
 -v /usr/local/mysql-slave/log:/var/log/mysql \
 -v /usr/local/mysql-slave/data:/var/lib/mysql \
 -v /usr/local/mysql-slave/conf:/etc/mysql \
 -e MYSQL_ROOT_PASSWORD=root \
 -d mysql:5.7

将日志、数据、配置文件都使用数据卷方式挂载

首先新建日志存放文件夹: /usr/local/mysql-slave/log

数据存放文件夹:/usr/local/mysql-slave/data

配置存放文件夹:/usr/local/mysql-slave/conf

mkdir -p /usr/local/mysql-slave/log /usr/local/mysql-slave/data /usr/local/mysql-slave/conf

7 进入/usr/local/mysql-slave/conf目录下新建my.cnf

my.cnf文件内容如下:

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1

8 修改完配置后重启slave实例

docker restart mysql-slave

9 在主数据库中查看主从同步状态

show master status;

10 进入mysql-slave容器

docker exec -it mysql-slave /bin/bash

mysql -uroot -proot

11 在从数据库中配置主从复制

change master to master_host='192.168.43.10', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;

主从复制参数说明:

master_host:主数据库的IP地址;
master_port:主数据库的运行端口;
master_user:在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码;
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
master_connect_retry:连接失败重试的时间间隔,单位为秒。

12 在从数据库中查看主从同步状态

show slave status\G;

13 在从数据库中开启主从同步

start slave;

14 查看从数据库状态发现已经同步

show slave status \G;

15 主从复制测试

主库新建库、新建表、插入数据

从库查看库、查看记录,看主从同步是否成功

主从复制相关问题排查

使用start slave开启主从复制过程后,如果SlaveIORunning一直是Connecting,则说明主从复制一直处于连接状态,这种情况一般是下面几种原因造成的,我们可以根据 Last_IO_Error提示予以排除。

1、网络不通
        检查ip,端口和防火墙是否开启
2、密码不对
        检查是否创建用于同步的用户和用户密码是否正确
3、pos不对
        检查Master的 Position

造成我无法正常访问数据库的原因,是本地的防火墙服务没有关闭造成。

[root@localhost conf]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since 五 2022-06-17 23:54:33 CST; 1h 38min ago
     Docs: man:firewalld(1)
 Main PID: 30715 (firewalld)
    Tasks: 2
   Memory: 416.0K
   CGroup: /system.slice/firewalld.service
           └─30715 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid

6月 18 00:04:01 localhost.localdomain firewalld[30715]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -D OUTPUT -m addrtype -...ectory
                                                         Try `iptables -h' or 'iptables --help' for more information....
6月 18 00:04:01 localhost.localdomain firewalld[30715]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -D PREROUTING' failed: ...ain?).
6月 18 00:04:01 localhost.localdomain firewalld[30715]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -D OUTPUT' failed: ipta...ain?).
6月 18 00:04:01 localhost.localdomain firewalld[30715]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -F DOCKER' failed: ipta... name.
6月 18 00:04:01 localhost.localdomain firewalld[30715]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -X DOCKER' failed: ipta... name.
6月 18 00:04:01 localhost.localdomain firewalld[30715]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -F DOCKER' failed: i... name.
6月 18 00:04:01 localhost.localdomain firewalld[30715]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -X DOCKER' failed: i... name.
6月 18 00:04:01 localhost.localdomain firewalld[30715]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -F DOCKER-ISOLATION'... name.
6月 18 00:04:01 localhost.localdomain firewalld[30715]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -X DOCKER-ISOLATION'... name.
6月 18 00:04:01 localhost.localdomain firewalld[30715]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i docker0 -o docke...ain?).
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost conf]# systemctl stop firewalld
[root@localhost conf]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since 六 2022-06-18 01:33:04 CST; 3s ago
     Docs: man:firewalld(1)
  Process: 30715 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=exited, status=0/SUCCESS)
 Main PID: 30715 (code=exited, status=0/SUCCESS)
6月 18 00:04:01 localhost.localdomain firewalld[30715]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -D OUTPUT' failed: ipta...ain?).
6月 18 00:04:01 localhost.localdomain firewalld[30715]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -F DOCKER' failed: ipta... name.
6月 18 00:04:01 localhost.localdomain firewalld[30715]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -X DOCKER' failed: ipta... name.
6月 18 00:04:01 localhost.localdomain firewalld[30715]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -F DOCKER' failed: i... name.
6月 18 00:04:01 localhost.localdomain firewalld[30715]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -X DOCKER' failed: i... name.
6月 18 00:04:01 localhost.localdomain firewalld[30715]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -F DOCKER-ISOLATION'... name.
6月 18 00:04:01 localhost.localdomain firewalld[30715]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -X DOCKER-ISOLATION'... name.
6月 18 00:04:01 localhost.localdomain firewalld[30715]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i docker0 -o docke...ain?).
6月 18 01:33:02 localhost.localdomain systemd[1]: Stopping firewalld - dynamic firewall daemon...
6月 18 01:33:04 localhost.localdomain systemd[1]: Stopped firewalld - dynamic firewall daemon.
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost conf]# docker exec -it mysql-slave /bin/bash
root@7d98a59a8012:/# mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 14
Server version: 5.7.38-log MySQL Community Server (GPL)

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.43.10
                  Master_User: slave
                  Master_Port: 3307
                Connect_Retry: 30
              Master_Log_File: mall-mysql-bin.000001
          Read_Master_Log_Pos: 769
               Relay_Log_File: mall-mysql-relay-bin.000002
                Relay_Log_Pos: 477
        Relay_Master_Log_File: mall-mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

2、MYSQL镜像服务器因错误停止的恢复 —Slave_SQL_Running: No

先stop slave,然后执行了一下提示的语句,再
 > stop slave;
 > set global sql_slave_skip_counter=1;
 > start slave;
 > show slave status\G ;

3、从MYSQL服务器Slave_IO_Running: No的解决2

master节点执行,获取日志文件和post

mysql > show master status;

slave节点进行重新绑定

mysql > stop slave;
mysql > CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000008', MASTER_LOG_POS=519086591;
mysql > start slave;

造成这类问题的原因一般是在主从复制的时候,基于创建表,然后又去删除和操作了数据表或者表。

到此这篇关于Docker搭建MySQL5.7主从复制的实现的文章就介绍到这了,更多相关Docker搭建MySQL主从复制内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL主从复制之半同步semi-sync replication

    目录 一.半同步简介 二.两种模式介绍 三.两种方式比较 四.如何开启半同步 五.查看插件开启情况 六.开启半同步功能 七.查看半同步是否运行 八.半同步参数信息 九.半同步状态信息 十.测试一下半同步的同步情况 1.从节点暂时先关掉IO线程 2.主节点写入几条测试数据 3.等待10s后查看复制状态,半同步已经关掉了 4.从节点开启IO线程 5.再次查看复制状态,半同步复制自动开启了 一.半同步简介 MASTER节点在执行完客户端提交的事务后不是立刻返回结果给客户端,而是等待至少一个SLAVE节

  • MySQL主从复制原理详情

    目录 前言: 一.为什么需要主从复制? 二.什么是mysql的主从复制? 三.mysql复制原理 具体步骤 四.mysql主从同步延时分析 五.主从复制的配置 1.基础设置准备 2.安装mysql数据库 3.在两台数据库中分别创建数据库 4.在主(node1)服务器进行如下配置: 5.配置从(node2)服务器登录主服务器的账号授权 6.从(node2)服务器的配置 7.重启主服务器的mysqld服务 8.重启从服务器并进行相关配置 前言: 对于现在的系统来说,在业务复杂的系统中,数据库往往是应

  • MySQL数据库主从复制与读写分离

    目录 一.主从复制 主从复制三线程 主从复制的过程: 主从复制的策略: 主从复制高延迟 二.读写分离 读写分离概念 读写分离原因与场景 总结 一.主从复制        主从复制:在实际的生产中,为了解决Mysql的单点故障以及提高MySQL的整体服务性能,一般都会采用主从复制.即:对数据库中的数据.语句做备份. 主从复制三线程        Mysql的主从复制中主要有三个线程:master(binlog dump thread).slave(I/O thread .SQL thread),M

  • MySQL 配置主从复制实践分享

    目录 一.检测通信 二.master配置 1. 开启二进制日志 2. 创建一个用于主从库通信用的账号 3. 获取binlog的日志文件名和position 三.slave配置 1. 配置全局唯一的server-id 2. 使用master创建的账户读取binlog同步数据 3. 开启slave服务 四.配置中可能出现的问题 1. 网络连接问题 2. binlog的position问题 3. SQL线程出错 一.检测通信 查看主库(master)和从库(slave)的ip地址,并检测是否可以通信

  • MySQL的主从复制原理详细分析

    目录 前言 一.主从复制概念 二.读写分离的概念 三.主库和从库 1. 主库 2. 从库 四.主从复制的流程 五.主从复制效果展示 前言 在实际生产环境中,如果对mysql数据库的读和写都在一台数据库服务器中操作,无论是在安全性.高可用性,还是高并发等各个方面都是不能满足实际需求的,一般要通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力. 一.主从复制概念 主从复制是MySQL提供的基本的技术,主从复制的流程:binlog二进制日志(除了查询其他的更改相关的操作都会记录在b

  • MySQL主从复制之GTID模式详细介绍 

    目录 一.GTID概述 二.GTID相较与传统复制的优势 三.GTID自身存在哪些限制 四.GTID工作原理简单介绍 五.如何开启GTID复制 六.查看GTID相关参数 七.GTID与传统模式建立复制时候语句的不同点 八.GTID同步状态简单解析 一.GTID概述 MySQL5.6 在原有主从复制的基础上增加了一个新的复制方式,即基于GTID的复制方式,它由UUID和事务ID两个部分组成,具有如下特点. GTID事务是全局唯一性的,并且一个事务对应一个GTID值. 一个GTID值在同一个MySQ

  • MySQL 主从复制数据不一致的解决方法

    目录 1. 准备工作 1.1 主机配置 1.2 从机配置 2. 数据不一致问题 3. 原因分析 4. 问题解决 5. 小结 今天来说说 MySQL 主从复制数据不一致的问题,通过几个具体的案例,来向小伙伴们展示 binlog 不同 format 之间的区别. 1. 准备工作 以下配置基于 Docker. 我这里有一张简单的图向大伙展示 MySQL 主从的工作方式: 这里,我们准备两台机器: 主机:10.3.50.27:33061 从机:10.3.50.27:33062 1.1 主机配置 主机的配

  • MySQL主从复制问题总结及排查过程

    目录 一.概述 二.mysql主从复制原理 1.MYSQL主从复制过程 三.问题及解决方法 1.show slave status \G 显示如下报错信息 2.根据提示信息定位报错位置 四.通用解决方法 1. 跳过指定数量的事务 2. 跳所有错误或指定类型的错误 一.概述 mysql主从是常用的高可用架构之一,也是使用最广泛的的系统架构.在生产环境中mysql主从复制有时会出现复制错误问题.MySQL主从复制中的问题(Coordinator stopped beacause there were

  • MySQL实现配置主从复制项目实践

    目录 一.检测通信 二.master配置 1. 开启二进制日志 2. 创建一个用于主从库通信用的账号 3. 获取binlog文件名和position 三.slave配置 1. 配置全局唯一的server-id 2. 使用master创建的账户读取binlog同步数据 3. 开启slave服务 四.配置中可能出现的问题 1. 网络连接问题 2. binlog的position问题 3. SQL线程出错 一.检测通信 查看master(centos7)和slave(win10)的ip地址,并检测是否

  • Docker搭建MySQL5.7主从复制的实现

    目录 1.新建mysql-master主服务器容器实例3307 2.新建mysql-master主服务器配置文件my.cnf 3 重启master实例 4 进入mysql-master容器 5 master容器实例内创建数据同步用户 6 新建mysql-slave从服务器实例3308 7 进入/usr/local/mysql-slave/conf目录下新建my.cnf 8 修改完配置后重启slave实例 9 在主数据库中查看主从同步状态 10 进入mysql-slave容器 11 在从数据库中配

  • 使用Docker搭建Redis主从复制的集群

    在主从复制模式的集群里,主节点一般是一个,从节点一般是两个或多个,写入主节点的数据会被复制到从节点上,这样一旦主节点出现故障,应用系统能切换到从节点去读写数据,这样能提升系统的可用性.而且如果再采用主从复制模式里默认的读写分离的机制,更能提升系统的缓存读写性能.所以对性能和实时性不高的系统而言,主从复制模式足以满足一般的性能和安全性方面的需求. 1 概述主从复制模式 在实际应用中,如果有相应的设置,在向一台Redis服务器里写数据后,这个数据可以复制到另外一台(或多台)Redis服务器,这里数据

  • 基于Docker搭建Redis一主两从三哨兵的实现

    这段时间正在学习Redis和容器相关的内容,因此想通过docker搭建一套redis主从系统来加深理解.看这篇文章可能你需要一定的docker基础,以及对redis主从和哨兵机制有所了解. 这次实验准备了三台云主机,系统为Debian,ip分别为: 35.236.172.131 , 35.201.200.251, 34.80.172.42. 首先分别在这三台主机上安装docker,然后每台主机上启动一个redis容器,运行redis-server服务,其中35.236.172.131作为mast

  • Docker 搭建集群MongoDB的实现步骤

    前言 由于公司业务需要,我们打算自己搭建 MongoDB 的服务,因为 MongoDB 的云数据库好贵,我们这次采用副本集的方式来搭建集群,三台服务器,一主.一副.一仲裁 基本概念 Replica Set 副本集:一个副本集就是一组 MongoDB 实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成 主节点(master):主节点接收所有写入操作.主节点将对其数据集所做的所有更改记录到其 oplog. 副节点(secondary):复制主节点的 oplog

  • 使用docker搭建一套开发环境全家桶的详细教程

    DNMP介绍 DNMP(Docker + Nginx + MySQL + PHP7/5 + Redis)是一款全功能的LNMP一键安装程序.支持的服务丰富.功能强大.使用简单.兼容多平台.是适用于多端的一款docker开发与生产环境的PHP环境全家桶. DNMP项目特点: 100%开源 100%遵循Docker标准 支持多版本PHP共存,可任意切换(PHP5.4.PHP5.6.PHP7.1.PHP7.2.PHP7.3) 支持绑定任意多个域名 支持HTTPS和HTTP/2 PHP源代码.MySQL

  • CentOS7环境下使用Docker搭建PHP运行环境的过程详解

    相关文章: CentOS7下使用yum安装Docker Win10环境下使用Docker搭建PHP运行环境 1.创建私有网络 docker network create lnmp 私有网络创建成功: 2.安装Nginx 镜像地址:https://hub.docker.com/_/nginx?tab=tags 可以安装最新版Nginx,这里通过搜索标签,拉取 Nginx1.18.0 镜像: docker pull nginx:1.18.0 使用 docker images 命令查看 安装Nginx

  • Docker搭建MySQL并挂载数据的全过程

    目录 一.Docker搭建MySQL并挂载数据 二.挂载是否生效 其他 总结 记录 Docker 搭建 MySQL 并挂载数据过程,搭建过程参考自 Docker Hub. 一.Docker搭建MySQL并挂载数据 1.首先安装好 Docker,不知道怎么安装的可以看下 CentOS7安装Docker初体验. 2.下载 MySQL5.7 镜像. docker pull mysql:5.7 3.创建容器并挂载数据. docker run -d --restart=always --name mysq

  • docker搭建redis主从哨兵集群的实现步骤

    目录 1:获取redis镜像 2:创建redis主从+哨兵docker-compose文件 3:redis配置和哨兵配置说明 4:启动docker-compose 5:查看启动情况 6:进入主节点查看集群情况 本文以docker-compose 搭建高可用Redis 主从.哨兵集群为例子 关于redis主从,哨兵集群原理参见:Redis 单机安装/ 哨兵模式集群安装 1:获取redis镜像 docker pull redis:6.2.7 2:创建redis主从+哨兵docker-compose文

  • Docker上部署mysql8主从复制的实现

    目录 环境准备 简易版本安装 设置密码 配置 MySQL 主从复制 创建 bridge 网络并指定 IP 区间 创建数据和配置存放目录 准备配置文件 启动数据库 远程访问配置(主从) 主库创建复制用户 从库设置 master 的信息 环境准备 需要一个 MySQL8 版本的 MySQL,因为我个人没有用过 mysql5,不知道二者是否会有一些特性上的偏差. 默认你与我的环境是一样的. 简易版本安装 先仅仅安装一个 MySQL,一上来就主从的话很多细节都会杂糅在一起. docker run -d

  • 使用 Docker 搭建 Laravel 本地环境的教程详解

    Laravel 官方提供 Homestead 和 Valet 作为本地开发环境,Homestead 是一个官方预封装的 Vagrant Box,也就是一个虚拟机,但是跟 docker 比,它占用体积太大,启动速度慢,同时响应速度很慢,现在有了 docker 这种更好的方式,可以轻松方便的搭建整套 PHP 开发环境. 本文就介绍如何使用 docker 搭建 Laravel 本地环境. 安装 docker 首先安装 docker. 克隆 laradock laradock 官方文档: http://

随机推荐