Docker部署MySql主从详细教程

2024年 3月 19日 111.3k 0

👩🏽‍💻个人主页:阿木木AEcru

🔥 系列专栏:Docker容器化部署系列

💹每一次技术突破,都是对自我能力的挑战和超越。

一、前言

1.1 什么是Mysql主从?

MySQL主从复制是一种数据库复制技术,用于在多个MySQL数据库之间同步数据。在主从复制中,一个MySQL服务器(称为主服务器或主节点)作为数据源,将其数据库的更改传播到一个或多个MySQL服务器(称为从服务器或从节点)。从服务器接收主服务器的更改并将其应用到本地数据库,从而实现数据的复制和同步。

1.2 Mysql主从的好处是什么?

  • 提高性能和可伸缩性: 主从复制可以分担主服务器的负载,从而提高系统的整体性能。从服务器可以处理读取请求,减轻主服务器的负担,并允许系统更轻松地扩展以处理更多的读取操作。
  • 实现数据备份和灾难恢复: 通过在从服务器上复制主服务器的数据,可以实现数据备份和灾难恢复。如果主服务器发生故障或数据损坏,可以快速切换到一个从服务器来继续提供服务,同时保留数据的完整性。
  • 提高可用性和容错能力: 通过在多个从服务器上复制主服务器的数据,可以提高系统的可用性和容错能力。如果主服务器出现故障,可以自动将一个从服务器提升为新的主服务器,从而确保系统的连续性和可用性。
  • 实现读写分离: 主从复制允许在从服务器上执行只读操作,从而实现读写分离。这可以进一步提高系统的性能和吞吐量,同时减少主服务器的负载。
  • 1.3 Mysql主从的实现原理是什么?

    MySQL主从复制的实现原理基于一种称为二进制日志(binary log)的机制。

    MySQL主从复制的基本实现原理:

  • 主服务器记录二进制日志: 当在主服务器上执行写入操作时,MySQL会将这些更改记录到二进制日志中。二进制日志包含了主服务器上执行的所有更改操作的详细信息,包括对数据库表的插入、更新和删除操作。
  • 从服务器连接到主服务器并请求日志: 从服务器连接到主服务器,并请求获取主服务器上的二进制日志。从服务器通过与主服务器建立连接,并发送请求来获取主服务器上的二进制日志。
  • 从服务器将日志应用到本地数据库: 从服务器获取到主服务器的二进制日志后,将其应用到本地数据库。从服务器会按照主服务器上操作的顺序,逐条执行二进制日志中的操作,从而在本地数据库中复制主服务器的更改操作。
  • 从服务器定期轮询获取新日志: 从服务器会定期轮询主服务器,检查是否有新的二进制日志可用。如果有新的二进制日志生成,从服务器会下载并应用这些新的日志,从而保持与主服务器的同步。
  • 处理主从服务器之间的复制延迟: 由于网络延迟和服务器负载等因素的影响,从服务器复制主服务器的数据可能存在一定的延迟。为了确保从服务器与主服务器之间的数据同步,通常需要采取一些措施来处理复制延迟,例如调整复制线程的参数或增加从服务器的性能。
  • image.png

    这里需要注意的是,如果是在生产中使用,建议使用二进制文件进行安装部署,性能会更加好一些,也会更稳定。使用二进制部署的话 配置文件什么的都一样的,只是安装mysql的步骤不一样。

    好了,话不多说,开始部署!

    二、 Mysql-Master 部署

    2.1 拉取镜像

    docker pull mysql:5.7.35
    

    2.2 创建持久化文件目录

    mkdir -p /usr/local/mysql-master/log 
    mkdir -p /usr/local/mysql-master/data 
    mkdir -p /usr/local/mysql-master/conf 
    touch /usr/local/mysql-master/conf/my.cnf
    

    log 目录主要用于存放日志信息

    data 目录主要用于存放数据库中的大部分数据,包括表结构、表数据、索引等信息。

    conf 目录主要用于存放mysql的配置文件

    my.cnf 文件主要用于编写mysql相关配置

    2.3 编写mysql配置文件

    vim /usr/local/mysql-master/conf/my.cnf
    

    内容如下:

    [mysqld]
    sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    binlog_cache_size = 32K
    thread_stack = 256K
    join_buffer_size = 256K
    query_cache_type = 0
    max_heap_table_size = 128M
    lower_case_table_names = 1
    port = 3306
    default_storage_engine = InnoDB
    performance_schema_max_table_instances = 400
    table_definition_cache = 400
    skip-external-locking
    key_buffer_size = 256M
    table_open_cache = 1024
    sort_buffer_size = 4096K
    net_buffer_length = 4K
    read_buffer_size = 4096K
    read_rnd_buffer_size = 256K
    myisam_sort_buffer_size = 64M
    thread_cache_size = 128
    query_cache_size = 0M
    tmp_table_size = 128M
    
    explicit_defaults_for_timestamp = true
    #skip-name-resolve
    max_connections = 500
    max_connect_errors = 100
    open_files_limit = 65535
    
    skip-ssl
    
    log_bin = ON
    server_id = 2
    sync_binlog = 1
    binlog_format = ROW
    expire-logs-days=10
    binlog-ignore-db = mysql
    binlog_ignore_db = information_schema
    binlog_ignore_db = performation_schema
    
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links=0
    

    内容解读:

    sql_mode:设置MySQL的SQL模式,这里指定了一系列严格模式和错误处理模式,例如禁止日期字段中的零值、禁止自动创建用户等。

    binlog_cache_size:指定了二进制日志缓存的大小,这是MySQL服务器用于存储二进制日志事件的缓冲区大小。

    thread_stack:设置线程栈的大小,即每个MySQL线程的栈空间大小。

    join_buffer_size:设置连接缓冲区的大小,用于执行连接操作时的中间结果缓存。

    query_cache_type:设置查询缓存的类型,这里将其设置为0,表示禁用查询缓存。

    max_heap_table_size:设置最大的堆表(内存表)大小限制。

    lower_case_table_names:设置表名的大小写规则,这里设置为1表示表名不区分大小写。

    port:指定MySQL服务器监听的端口号。

    default_storage_engine:设置默认的存储引擎,这里设置为InnoDB。

    performance_schema_max_table_instances:设置性能模式中表实例的最大数量。

    table_definition_cache:设置表定义缓存的大小。

    skip-external-locking:禁用外部锁定,不再支持旧式的外部锁定。

    key_buffer_size:设置MyISAM索引缓冲区的大小。

    table_open_cache:设置表打开缓存的大小,用于存储表的打开实例。

    sort_buffer_size:设置排序缓冲区的大小,用于执行排序操作时的中间结果缓存。

    net_buffer_length、read_buffer_size、read_rnd_buffer_size:分别设置网络缓冲区、读取缓冲区和随机读取缓冲区的大小。

    myisam_sort_buffer_size:设置MyISAM排序缓冲区的大小。

    thread_cache_size:设置线程缓存的大小,用于存储已经分配但未被使用的线程。

    query_cache_size:设置查询缓存的大小,这里将其设置为0,表示禁用查询缓存。

    tmp_table_size:设置临时表的最大大小。

    explicit_defaults_for_timestamp:设置是否启用了显式的时间戳默认值。

    max_connections:设置最大连接数。

    max_connect_errors:设置最大连接错误数。

    open_files_limit:设置打开文件的限制数。

    skip-ssl:禁用SSL连接。

    log_bin:启用二进制日志功能。

    server_id:设置服务器的ID。

    sync_binlog:设置二进制日志的同步方式。

    binlog_format:设置二进制日志的格式,这里设置为ROW格式。

    expire-logs-days:设置二进制日志文件的过期时间。

    binlog-ignore-db:设置要忽略的数据库,这里分别忽略了mysql、information_schema和performance_schema数据库。

    symbolic-links:设置是否允许符号链接,这里设置为0,禁用符号链接以防止安全风险。

    2.4 运行mysql主节点镜像

    docker run -p 3306: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.35  
    

    内容解读:

    -p 3306:3306:将容器的3306端口映射到主机的3306端口,允许通过主机的3306端口访问MySQL服务。

    --name mysql-master:给容器指定一个名称,这里命名为mysql-master。

    -v /usr/local/mysql-master/log:/var/log/mysql:将主机上的/usr/local/mysql-master/log目录挂载到容器内的/var/log/mysql目录,用于存放MySQL日志文件。

    -v /usr/local/mysql-master/data:/var/lib/mysql:将主机上的/usr/local/mysql-master/data目录挂载到容器内的/var/lib/mysql目录,用于存放MySQL数据文件。

    -v /usr/local/mysql-master/conf:/etc/mysql/:将主机上的/usr/local/mysql-master/conf目录挂载到容器内的/etc/mysql/目录,用于存放MySQL的配置文件。

    -e MYSQL_ROOT_PASSWORD=root:设置MySQL的root用户密码为root。-e选项用于设置环境变量。

    -d mysql:5.7.35:指定要运行的Docker镜像为MySQL 5.7.35版本。-d选项表示以后台模式运行容器。

    image.png

    2.5 开启端口权限

    开启防火墙访问端口权限
    firewall-cmd --zone=public --add-port=3306/tcp --permanent 
    重启防火墙生效
    systemctl restart firewalld.service
    注:如果是云服务器还需要开放对应的安全组
    

    image.png

    测试能够正常连接即可

    三、Mysql-slave 部署

    由于我这里是用的同一台服务器做的演示,所以我这里就不再去拉取镜像了

    3.1 创建持久化文件目录

    mkdir -p /usr/local/mysql-slave/log 
    mkdir -p /usr/local/mysql-slave/data 
    mkdir -p /usr/local/mysql-slave/conf 
    
    
    touch /usr/local/mysql-slave/conf/my.cnf
    

    3.2 编写mysql配置文件

    [mysqld]
    binlog_cache_size = 32K
    thread_stack = 256K
    join_buffer_size = 256K
    query_cache_type = 0
    max_heap_table_size = 128M
    lower_case_table_names = 1
    port = 3306
    default_storage_engine = InnoDB
    performance_schema_max_table_instances = 400
    table_definition_cache = 400
    skip-external-locking
    key_buffer_size = 256M
    table_open_cache = 1024
    sort_buffer_size = 4096K
    net_buffer_length = 4K
    read_buffer_size = 4096K
    read_rnd_buffer_size = 256K
    myisam_sort_buffer_size = 64M
    thread_cache_size = 128
    query_cache_size = 0M
    tmp_table_size = 128M
    
    explicit_defaults_for_timestamp = true
    #skip-name-resolve
    max_connections = 500
    max_connect_errors = 100
    open_files_limit = 65535
    
    skip-ssl
    
    log_bin = ON
    server_id = 1
    sync_binlog = 1
    binlog_format = ROW
    binlog-ignore-db = mysql
    binlog_ignore_db = information_schema
    binlog_ignore_db = performation_schema
    
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links=0
    

    内容解释:

    binlog_cache_size = 32K:设置二进制日志缓存的大小为32KB。

    thread_stack = 256K:设置线程栈的大小为256KB,即每个MySQL线程的栈空间大小。

    join_buffer_size = 256K:设置连接缓冲区的大小为256KB,用于执行连接操作时的中间结果缓存。

    query_cache_type = 0:设置查询缓存的类型为0,表示禁用查询缓存。

    max_heap_table_size = 128M:设置最大的堆表(内存表)大小限制为128MB。

    lower_case_table_names = 1:设置表名的大小写规则,这里设置为1表示表名不区分大小写。

    port = 3306:指定MySQL服务器监听的端口号为3306。

    default_storage_engine = InnoDB:设置默认的存储引擎为InnoDB。

    performance_schema_max_table_instances = 400:设置性能模式中表实例的最大数量为400。

    table_definition_cache = 400:设置表定义缓存的大小为400。

    skip-external-locking:禁用外部锁定,不再支持旧式的外部锁定。

    key_buffer_size = 256M:设置MyISAM索引缓冲区的大小为256MB。

    table_open_cache = 1024:设置表打开缓存的大小为1024,用于存储表的打开实例。

    sort_buffer_size = 4096K:设置排序缓冲区的大小为4096KB,用于执行排序操作时的中间结果缓存。

    net_buffer_length = 4K、read_buffer_size = 4096K、read_rnd_buffer_size = 256K:分别设置网络缓冲区、读取缓冲区和随机读取缓冲区的大小。

    myisam_sort_buffer_size = 64M:设置MyISAM排序缓冲区的大小为64MB。

    thread_cache_size = 128:设置线程缓存的大小为128,用于存储已经分配但未被使用的线程。

    query_cache_size = 0M:设置查询缓存的大小为0MB,表示禁用查询缓存。

    tmp_table_size = 128M:设置临时表的最大大小为128MB。

    explicit_defaults_for_timestamp = true:设置是否启用了显式的时间戳默认值为true。

    max_connections = 500:设置最大连接数为500。

    max_connect_errors = 100:设置最大连接错误数为100。

    open_files_limit = 65535:设置打开文件的限制数为65535。

    skip-ssl:禁用SSL连接。

    log_bin = ON:启用二进制日志功能。

    server_id = 1:设置服务器的ID为1。

    sync_binlog = 1:设置二进制日志的同步方式为每次提交事务。

    binlog_format = ROW:设置二进制日志的格式为ROW格式。

    binlog-ignore-db = mysql、binlog_ignore_db = information_schema、binlog_ignore_db = performance_schema:分别设置要忽略的数据库为mysql、information_schema和performance_schema。

    symbolic-links=0:设置是否允许符号链接为0,禁用符号链接以防止安全风险。

    3.3 启动运行mysql从节点镜像

    docker run -p 3307: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.35  
    

    由于在同一台服务器部署,主节点已经占用了3306端口,这里的子节点就使用了3307端口,避免端口冲突。

    3.5 开启端口权限

    开启防火墙访问端口权限
    firewall-cmd --zone=public --add-port=3307/tcp --permanent 
    重启防火墙生效
    systemctl restart firewalld.service
    注:如果是云服务器还需要开放对应的安全组
    

    image.png

    四、配置主从同步

    4.1 配置主节点访问账号

    # 查看正在运行的docker容器 
    docker ps 
    # 进入到指定id的容器中 
    docker exec -it <容器id> /bin/bash
    

    image.png

    进到容器之后,访问数据库 mysql -uroot -p 回车 ,然后输入密码。

    进入到mysql后执行以下语句:

    ## 创建从节点的访问账号
    CREATE USER 'slave'@'%' IDENTIFIED BY 'slave';
    GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
    
    
    ## 查看master状态
    show master status; 
    

    image.png

    退出mysql 执行 exit即可;

    退出容器执行 exit即可;

    4.2 配置从节点同步

    如上一样,进入到从节点容器的mysql中。执行以下指令

    CHANGE MASTER TO
    MASTER_HOST='126.32.92.61',
    MASTER_USER='slave',
    MASTER_PASSWORD='slave',
    MASTER_LOG_FILE='ON.000004',
    MASTER_LOG_POS=617;
    
    执行完成后,开启同步
    start slave;
    
  • MASTER_HOST='126.32.92.61':指定主节点的IP地址或主机名,这里设置为126.32.92.61。
  • MASTER_USER='slave':指定用于连接主节点的用户名,这里设置为slave。
  • MASTER_PASSWORD='slave':指定用于连接主节点的密码,这里设置为slave。
  • MASTER_LOG_FILE='ON.000004':指定从哪个二进制日志文件开始复制数据。这里设置为ON.000004。
  • MASTER_LOG_POS=617:指定从二进制日志文件的哪个位置开始复制数据。这里设置为617。
  • image.png

    最后测试一下,创建数据库,表,增删改查能够同步到从节点表示成功,多个从节点也是一样的部署方法,只要server_id不同即可。

    image.png

    五、结尾

    感谢您的观看! 如果本文对您有帮助,麻烦用您发财的小手点个三连吧!您的支持就是作者前进的最大动力!再次感谢!

    相关文章

    Oracle如何使用授予和撤销权限的语法和示例
    Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
    下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
    社区版oceanbase安装
    Oracle 导出CSV工具-sqluldr2
    ETL数据集成丨快速将MySQL数据迁移至Doris数据库

    发布评论