搭建本地和容器版MySQL主从集群

本文详细介绍了如何在本地和使用Docker环境下搭建MySQL主从集群,包括安装配置、权限设置、主从同步等关键步骤。

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


【首先】关闭防火墙:

[root@s1 master]# setenforce 0
[root@s1 master]# systemctl stop firewalld; iptables –F

1. 搭建本地mysql主从集群

  • 安装mysql,分别在master节点和node1和node2节点操作。

    [root@s1 mysql]# wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
    

    在这里插入图片描述

  • 创建mysql系统用户和组。

    [root@s1 mysql]# groupadd mysql
    [root@s1 mysql]# useradd -r -g mysql mysql 
    [root@s1 mysql]# passwd mysql 
    Changing password for user mysql.
    New password: 
    BAD PASSWORD: The password is shorter than 8 characters
    Retype new password: 
    passwd: all authentication tokens updated successfully.
    
  • 解压和迁移mysql安装包至/usr/local

    [root@s1 mysql]# mv mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz /usr/local/
    [root@s1 mysql]# cd /usr/local/
    [root@s1 local]# ls
    bin  etc  games  include  lib  lib64  libexec  mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz  sbin  share  src
    [root@s1 local]# tar xvf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
    

    在这里插入图片描述

    [root@s1 local]# tar zxvf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
    

    在这里插入图片描述
    移除mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz

    在这里插入图片描述

  • 修改mysql-5.7.22-linux-glibc2.12-x86_64为mysql,并在mysql/support-files下创建my.cnf配置文件,修改文件内容,将其复制到/etc/my.cnf,复制mysql.server至/etc/init.d/mysql。

    [root@s1 local]# mv mysql-5.7.22-linux-glibc2.12-x86_64/ mysql
    [root@s1 local]# cd ./mysql/support-files/
    [root@s1 support-files]# vi my.cnf
    

    在这里插入图片描述

    [root@s1 support-files]# cp my.cnf /etc/my.cnf
    cp: overwrite ‘/etc/my.cnf’? y
    [root@s1 support-files]# cp mysql.server /etc/init.d/mysql
    
  • 配置参数并初始化

    [root@s1 mysql]# bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
    

    在这里插入图片描述
    记住最后一行的临时密码bbTBKTdoL4!K。
    指定数据位置:
    在这里插入图片描述

    [root@s1 mysql]# bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data
    
  • 启动mysql,并修改密码为123456,输入的密码即为之前的临时密码,查看user数据。

    [root@s1 bin]# ./mysql -uroot -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 2
    Server version: 5.7.22-log
    Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
    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> set password=password('123456');
    Query OK, 0 rows affected, 1 warning (0.01 sec)
    mysql> use mysql
    Database changed
    mysql> select host,user from user;
    +-----------+---------------+
    | host      | user              |
    +-----------+---------------+
    | localhost  | mysql.session      |
    | localhost  | mysql.sys          |
    | localhost  | root              |
    +-----------+---------------+
    3 rows in set (0.00 sec)
    mysql> exit
    Bye	
    
  • 配置mysql自动启动

    # chmod 755 /etc/init.d/mysql
    # chkconfig --add mysql
    # chkconfig --level 345 mysql on
    

    启动mysql:service mysql start。

    至此,mysql安装基本完成。

  • 配置主从同步数据库。

    系统: centOS 7
    Master:192.168.5.101(主) node1:192.168.5.102(从) node2:192.168.5.103(从)
    (1)配置主数据库,修改master的mysql配置文件my.cnf,在mysqlId下添加以下字段。

    #保证唯一
    server_id=1          
    # 开启二进制日志
    log-bin=mysql-bin
    

    (2)给从服务器创建访问用户slave,密码为123456,并刷新权限。

    mysql> grant replication slave on *.* to 'slave'@'%' identified by '123456';
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    	mysql>  flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    显示用户:
    mysql> use mysql;
    Database changed
    mysql> select host,user from user;
    +---------------+---------------+
    | host            | user            |
    +---------------+---------------+
    | %               | slave           |
    | localhost        | mysql.session    |
    | localhost        | mysql.sys        |
    | localhost        | root            |
    +---------------+---------------+
    7 rows in set (0.00 sec)
    

    (3)重启mysql服务

    service mysql restart
    

    (4)配置从服务器,node1的server-id为2,node2的server-id为3。
    登录mysql执行以下步骤:

    mysql> CHANGE MASTER TO
        -> Master_Host='192.168.5.101',    #master主机IP
        -> Master_User='slave',            #创建的user用户
        -> Master_Password='123456',
        -> Master_Port=3306;
    Query OK, 0 rows affected, 2 warnings (0.12 sec)
    

    查看slave状态:mysql>show slave status\G
    重点看slave_io_running和 slave_sql_runnin两项都为yes
    (5)在master处创建新的数据库db1,在node1和node2处查看是否同步。
    主数据库:
    在这里插入图片描述
    从数据库:
    在这里插入图片描述
    本地mysql主从数据库搭建完成。

2. 使用docker搭建mysql主从集群

  • 使用docker将mysql:5.7.22下载到本地。

    pull mysql到本地,命令如下:docker pull mysql:5.7.22

  • 在主机下面新增master.cnf和slave.cnf配置文件

    主要字段为:log-bin = mysql-bin server-id = 1(server-id = 2)

  • 运行容器

    启动master容器:

        [root@s1 ~]# docker run -p 3306:3306 --name master -v /root/master.cnf:/etc/mysql/conf.d /master.cnf -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.22
        fe5dd2ab42ee4d27958f6dfc0b6db77d12011902c6d26e16b6f08e4efac53316
    

    启动slave容器:

    [root@s1 ~]# docker run -p 3307:3306 --name slave -v /root/slave.cnf:/etc/mysql /conf.d/slave.cnf -e MYSQL_ROOT_PASSWORD=123456-d mysql:5.7.22
    Initializing database
    2019-03-20T08:53:58.237323Z 0 [Warning] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode.
    ……
    

    查看运行中的容器
    在这里插入图片描述

  • 进入容器中,命令如下:

    进入到slave容器中:[root@s1 ~]# docker exec -i -t 84cda6591a7e /bin/bash
    进入到master容器中:[root@s1 ~]# docker exec -i -t fe5dd2ab42ee /bin/bash

  • 进入master的mysql,查看数据库状态。
    在这里插入图片描述
    在这里插入图片描述
    创建用户slave1并赋予权限,密码为123456。

    mysql> GRANT ALL PRIVILEGES ON *.* TO slave1@'%' IDENTIFIED BY 123456; FLUSH PRIVILEGES;
    

    在这里插入图片描述

  • 进入slave数据库中配置主从关系关联:

    mysql> change master to
        -> master_host='192.168.5.101',
        -> master_port=3306,
        -> master_user='slave1',
        -> master_password='123456';
    Query OK, 0 rows affected, 2 warnings (0.03 sec)
    

    并查看同步状态:
    在这里插入图片描述
    可以看到Slave_IO_Running和Slave_SQL_Running选项都为yes。

  • 测试是否搭建成功:

    Master创建db1数据库,查看slave节点是否同步。
    在这里插入图片描述
    搭建成功。


3. 注意

  • 不同步原因,master_host需要使用master节点的IP,master_user使用赋予权限的user名。
  • 配置文件server-id不能相同
  • 配置文件的同步数据库不用指定,可以不加指定库。
<think>我们正在讨论如何搭建MySQL主从复制集群。根据引用内容,主从复制的基本原理是主服务器(Master)将数据更改记录到二进制日志(binlog)中,从服务器(Slave)通过读取并执行这些日志来复制数据。配置步骤主要分为主服务器配置从服务器配置。主服务器配置步骤:1.修改主服务器的MySQL配置文件(如my.ini或my.cnf),设置server-id(唯一)并启用二进制日志。2.重启MySQL服务使配置生效。3.创建用于复制的用户并授予复制权限。4.查看主服务器的二进制日志状态,记录FilePosition值。从服务器配置步骤:1.修改从服务器的MySQL配置文件,设置唯一的server-id,启用中继日志(relay-log)并设置只读模式(可选)。2.重启从服务器的MySQL服务。3.配置从服务器连接到主服务器,使用主服务器记录的FilePosition值。4.启动从服务器的复制进程。接下来,我们将详细说明每一步的操作。注意:在开始之前,请确保主从服务器上的MySQL本兼容,并且网络互通。详细步骤:一、主服务器(Master)配置1.修改配置文件:在[mysqld]部分添加或修改以下参数(以Linux系统为例,配置文件通常为/etc/my.cnf或/etc/mysql/my.cnf):```[mysqld]server-id=1#服务器唯一ID,主库建议设置为1,从库设置为其他非1且唯一的数字log-bin=mysql-bin#启用二进制日志,指定日志文件前缀binlog-do-db=your_database#可选,指定要复制的数据库,多个则重复此配置行;如果不指定,则复制所有数据库#其他配置...```2.重启MySQL服务:Linux系统:`systemctl restartmysqld`Windows系统:通过服务管理器重启MySQL服务3.创建复制用户:登录主服务器MySQL,执行:```sqlCREATEUSER 'repl'@'%' IDENTIFIEDBY 'password';GRANT REPLICATIONSLAVEON *.* TO'repl'@'%';FLUSH PRIVILEGES;```4.查看主服务器状态:```sqlSHOWMASTERSTATUS;```记录下返回结果中的File(例如mysql-bin.000001)Position(例如107),从服务器连接时需要用到。二、从服务器(Slave)配置1.修改配置文件:在[mysqld]部分添加或修改以下参数:```[mysqld]server-id=2#必须唯一,不能主服务器相同relay-log=mysql-relay-bin#启用中继日志read-only=1#设置为只读模式(可选,根据需求)#如果只想复制特定的数据库,可以使用以下配置(可选)replicate-do-db=your_database```2.重启MySQL服务(同上)。3.配置复制参数:登录从服务器MySQL,执行:```sqlCHANGE MASTER TOMASTER_HOST='master_ip',--主服务器的IP地址MASTER_USER='repl',--主服务器上创建的复制用户MASTER_PASSWORD='password',--复制用户的密码MASTER_LOG_FILE='mysql-bin.000001', --主服务器上SHOWMASTERSTATUS得到的FileMASTER_LOG_POS=107;--主服务器上SHOW MASTER STATUS得到的Position```4.启动复制:```sqlSTARTSLAVE;```5.检查复制状态:```sqlSHOW SLAVE STATUS\G```查看输出中的`Slave_IO_Running``Slave_SQL_Running`是否为Yes,以及`Seconds_Behind_Master`是否正常(表示复制延迟)。注意事项: -如果主服务器已有数据,需要先将主服务器的数据导出并导入到从服务器,以保证数据一致。可以使用mysqldump工具。 -配置过程中,确保防火墙允许MySQL端口(默认3306)的通信。以上是搭建MySQL主从复制集群的基本步骤。根据实际环境,可能还需要考虑其他配置,如复制过滤、SSL加密等。相关问题:1.如何监控MySQL主从复制的状态延迟?2. MySQL主从复制出现中断时,如何排查修复?3.除了主从复制,MySQL还有哪些高可用方案?</think>### MySQL主从复制集群搭建指南 MySQL主从复制通过二进制日志实现数据同步,主库(Master)处理写操作并将变更记录到binlog,从库(Slave)读取并重放这些日志实现数据复制[^1]。以下是详细配置步骤: --- #### 一、主库配置(Master) 1. **修改配置文件** 编辑`my.cnf`(Linux)或`my.ini`(Windows): ```ini [mysqld] server-id=1 # 主库唯一ID log-bin=mysql-bin # 启用二进制日志 binlog-do-db=your_db # 需复制的数据库(可选) binlog-ignore-db=mysql # 忽略系统库 ``` 重启MySQL服务:`systemctl restart mysqld`(Linux)或服务管理器重启(Windows)[^2]。 2. **创建复制账户** 登录MySQL执行: ```sql CREATE USER 'repl'@'%' IDENTIFIED BY 'SecurePass123!'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES; ``` 3. **查看主库状态** ```sql SHOW MASTER STATUS; ``` 记录`File`(如`mysql-bin.000002`)`Position`(如`154`),从库连接需使用[^1]。 --- #### 二、从库配置(Slave) 1. **修改配置文件** ```ini [mysqld] server-id=2 # 从库唯一ID(≠主库) relay-log=mysql-relay-bin # 启用中继日志 read-only=1 # 设为只读模式 replicate-do-db=your_db # 指定复制数据库(主库一致) ``` 2. **配置主库连接** 登录MySQL执行: ```sql CHANGE MASTER TO MASTER_HOST='192.168.1.100', -- 主库IP MASTER_USER='repl', MASTER_PASSWORD='SecurePass123!', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=154; ``` 3. **启动复制** ```sql START SLAVE; SHOW SLAVE STATUS\G ``` 验证关键字段: - `Slave_IO_Running: Yes` - `Slave_SQL_Running: Yes` - `Seconds_Behind_Master: 0`(无延迟)[^3] --- #### 三、数据一致性初始化(可选) 若主库已有数据: ```bash # 主库导出数据 mysqldump -u root -p --single-transaction your_db > master_db.sql # 从库导入数据 mysql -u root -p your_db < master_db.sql ``` *注:导出时加`--single-transaction`确保一致性[^1]。* --- #### 四、验证复制 1. 主库插入数据: ```sql USE your_db; INSERT INTO test_table VALUES (1, 'replica_test'); ``` 2. 从库查询: ```sql SELECT * FROM test_table; # 应显示相同数据 ``` --- ### 关键注意事项 1. **防火墙**:确保3306端口互通 2. **本兼容**:主从MySQL本需兼容(建议主≥从) 3. **数据冲突**:从库设为`read-only`避免写入冲突 4. **监控命令**: - 主库:`SHOW MASTER STATUS` - 从库:`SHOW SLAVE STATUS` --- ### 相关问题 1. MySQL主从复制延迟过高有哪些优化方法? 2. 如何实现MySQL主从故障自动切换? 3. GTID复制模式相比传统复制有哪些优势? [^1]: MySQL高可用性攻略:快速搭建MySQL主从复制集群 [^2]: Windows系统搭建MySQL主从复制集群 [^3]: MySQL主从复制集群搭建配置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值