当前位置: 首页 > article >正文

Mac M2基于MySQL 8.4.3搭建(伪)主从集群

前置准备工作

安装MySQL 8.4.3

  • 参考博主之前的文档,在本地Mac安装好MySQL:Mac M2 Pro安装MySQL 8.4.3
  • 安装目录:/usr/local/mysql,安装好的MySQL都处于运行状态,需要先停止MySQL服务
  • 最快的方式:系统设置 → \rightarrow MySQL → \rightarrow Stop MySQL Server

设置环境变量

  • ~/.zshrc添加如下内容,

    export MYSQL_BASE=/usr/local/mysql
    # 在用户目录下创建mysql主从集群目录
    export MYSQL_CLUSTER=/Users/xxx/tmp/mysql
    # 3306端口对应master, 3307端口对应slave, 这里只创建两个节点
    export MYSQL_MASTER=${MYSQL_CLUSTER}/3306
    export MYSQL_SLAVE=${MYSQL_CLUSTER}/3307
    
  • 执行source ~/.zshrc让环境变量生效

创建集群目录

  • 创建 “主/从节点” 对应的目录
    # -p: 自动创建缺失的父目录, -v: 显示创建好的目录名
    mkdir -pv $MYSQL_MASTER $MYSQL_SLAVE
    mkdir -pv $MYSQL_MASTER/data $MYSQL_MASTER/log
    mkdir -pv $MYSQL_SLAVE/data $MYSQL_SLAVE/log
    
  • 如果环境变量生效,将在/Users/xxx/tmp/mysql 创建出33063307端口的对应目录
    # 以master为例
    cd $MYSQL_MASTER 
    ls -al # 将显示创建好的data log目录
    

启动master

新建cnf文件

  • $MYSQL_MASTER目录下新建3306.cnf文件,内容如下:

    [mysqld]
    # mysql启动用户
    user=mysql
    # 服务字符集
    character-set-server=utf8
    # 端口
    port=3306
    bind-address = 0.0.0.0
    # 用于通讯的套接字,由于是一机多实例,所以区分开
    socket=/Users/xxx/tmp/mysql/3306/mysql.sock
    # mysql安装目录
    basedir=/usr/local/mysql
    # 数据存放目录
    datadir=/Users/xxx/tmp/mysql/3306/data
    # master节点唯一标识
    server-id=1
    gtid_mode=ON
    enforce-gtid-consistency=true
    # master-info-repository=TABLE
    # relay-log-info-repository=TABLE
    # bin-log前缀
    log-bin=master-bin
    # bin-log-index前缀
    log-bin-index=master-bin.index
    binlog_format=ROW
    # 开启 mysql_native_password 认证
    mysql_native_password=ON
    
    [mysqld_safe]
    # 启动错误日志输出地址(可以改成自己的目录)
    log-error=/Users/xxx/tmp/mysql/3306/log/err.log
    
  • 修改上述文件为可执行文件:

    chmod 0755 $MYSQL_MASTER/3306.cnf
    

初始化master

  • 初始化master

    ${MYSQL_BASE}/bin/mysqld --defaults-file=${MYSQL_MASTER}/3306.cnf --initialize-insecure --explicit_defaults_for_timestamp --user=mysql --basedir=${MYSQL_BASE} --datadir=${MYSQL_MASTER}/data
    
  • 如果初始化成功,会有如下提示信息
    在这里插入图片描述

启动master进程

  • 启动master

    ${MYSQL_BASE}/bin/mysqld_safe --defaults-file=${MYSQL_MASTER}/3306.cnf &
    
  • 启动成功后,ps -ef | grep "mysql" | grep "3306" 命令查看,将新增两个进程
    在这里插入图片描述

  • 同时,在$MYSQL_MASTER目录将新增两个套接字相关的文件

  • 此时,可以通过root用户、以空密码的方式登录mysql:mysql -h 127.0.0.1 -u root -p

启动slave

创建cnf文件

  • $MYSQL_SLAVE目录下新建3307.cnf文件,内容如下:

    [mysqld]
    # mysql启动用户
    user=mysql
    # 服务字符集
    character-set-server=utf8
    # 端口
    port=3307
    # 用于通讯的套接字,由于是一机多实例,所以区分开
    socket=/Users/bytedance/tmp/mysql/3307/mysql.sock
    # mysql安装目录
    basedir=/usr/local/mysql
    # 数据存放目录
    datadir=/Users/bytedance/tmp/mysql/3307/data
    # master节点唯一标识
    server-id=2
    gtid_mode=ON
    enforce-gtid-consistency=true
    log_slave_updates=ON
    skip-slave-start=1
    #master-info-repository=TABLE
    #relay-log-info-repository=TABLE
    # bin-log前缀
    log-bin=master-bin
    # bin-log-index前缀
    log-bin-index=master-bin.index
    binlog_format=ROW
    
    mysql_native_password=ON
    
    [mysqld_safe]
    # 启动错误日志输出地址(可以改成自己的目录)
    log-error=/Users/bytedance/tmp/mysql/3307/log/err.log
    
  • 修改上述文件为可执行文件:

    chmod 0755 $MYSQL_SLAVE/3307.cnf
    

初始化slave

  • 初始化slave

    ${MYSQL_BASE}/bin/mysqld --defaults-file=${MYSQL_SLAVE}/3307.cnf --initialize-insecure --explicit_defaults_for_timestamp --user=mysql --basedir=${MYSQL_BASE} --datadir=${MYSQL_SLAVE}/data
    
  • slave初始化成功的信息同初始化master,参考上面的截图即可

启动slave进程

  • 启动slave

    ${MYSQL_BASE}/bin/mysqld_safe --defaults-file=${MYSQL_SLAVE}/3307.cnf  &
    
  • 启动成功后,ps -ef | grep "mysql" | grep "3307" 命令查看,将新增两个进程
    在这里插入图片描述

  • 同时,在$MYSQL_SLAVE目录将新增两个套接字相关的文件

  • 此时,可以通过root用户、以空密码的方式登录mysql:mysql -h127.0.0.1 -P3307 -uroot -p(截图省略,同master)

开启主从复制

master上的操作

创建主从复制用户

  • (可跳过)为root用户设置密码

    alter user 'root'@'localhost' IDENTIFIED WITH mysql_native_password by '123456';
    flush privileges;
    
  • 创建主从复制用户

    create user 'replica'@'%' identified with 'mysql_native_password' by '123456';
    grant replication client,replication slave on *.* to 'replica'@'%'; 
    flush privileges;
    
  • 查看用户信息,查询结果中将包含replica用户

    SELECT User, Host FROM mysql.user;
    

查看主节点的binlog信息

  • 执行如下SQL,查看主节点的binlog信息。主要是获取如下两个坐标,后续设置slave节点时需要使用

    mysql>  SHOW BINARY LOG STATUS\G;
    *************************** 1. row ***************************
                 File: master-bin.000003 # 坐标1: 日志文件
             Position: 1311 # 坐标2: 日志文件位置
         Binlog_Do_DB:
     Binlog_Ignore_DB:
    Executed_Gtid_Set: 8b52fb06-ca82-11ef-a11f-04d82f6466d3:1-5
    1 row in set (0.00 sec)
    

slave上的操作

创建主从复制用户

  • (可跳过)为root用户设置密码

    alter user 'root'@'localhost' IDENTIFIED WITH mysql_native_password by '123456';
    flush privileges;
    
  • 创建主从复制用户

    CREATE USER 'replica'@'%' IDENTIFIED WITH 'mysql_native_password' BY '123456';
    grant replication slave on *.* to 'replica'@'%';
    FLUSH PRIVILEGES;
    
  • 查看用户信息,查询结果中将包含replica用户(截图省略)

    SELECT User, Host FROM mysql.user;
    

设置主机节点信息

  • 执行如下SQL,设置主节点信息

    CHANGE REPLICATION SOURCE TO
     SOURCE_HOST='127.0.0.1',
     SOURCE_PORT = 3306,
     SOURCE_USER='replica',
     SOURCE_PASSWORD='123456', -- 填写master节点的基本信息
     SOURCE_LOG_FILE='master-bin.000003',
     SOURCE_LOG_POS=1311; -- 使用之前SHOW BINARY LOG STATUS展示的坐标信息
    

开启主从复制

  • 开启主动复制

    start replica;
    
  • 查看主动复制开启是否成功

    mysql> show replica status\G;
    *************************** 1. row ***************************
                 Replica_IO_State: Waiting for source to send event
                      Source_Host: 127.0.0.1
                      Source_User: replica
                      Source_Port: 3306
                    Connect_Retry: 60
                  Source_Log_File: master-bin.000003
              Read_Source_Log_Pos: 1311 // 以上显示的信息, 能跟master节点对上
                   Relay_Log_File: F177XMTP97-relay-bin.000002
                       ... // 其他信息省略
                       Last_Errno: 0
                       Last_Error:  // 这里未显示错误, 代表主从复制开启成功
                       ... // 其他信息省略
    

验证主从复制

  • 上面只是从基本信息看,主从复制开启成功了,还需要具体地验证才靠谱

master上的操作

  • 在master节点上新建测试库

    create database test;
    
  • 并创建一个测试表

    use test;
    create table t(id int primary key ,name varchar(10));
    insert into t(id, name) values(1,'hello');
    
  • 查询新插入的数据

slave上的操作

  • 登录slave节点,查看刚在master创建的库表

    show database;
    # 查询测试库中的数据
    use test;
    select * from t;
    
  • 能查询到,表示主从复制工作正常

  • 库表信息都没有任何问题,主从复制创建成功 😄

一些问题的解决办法

主动复制开启失败

  • 虽然通过show replica status未看到错误信息,但是验证主从复制时,发现slave节点上未同步master上的库
  • 可能是跟笔者一样,中途为了重新设置master的信息,关闭了replica
    • 中途想通过 CHANGE REPLICATION SOURCE TO 重新设置master的信息

    • MySQL报错,提示

      ERROR 3021 (HY000): This operation cannot be performed with a running replica io thread; run STOP REPLICA IO_THREAD FOR CHANNEL '' first.
      
    • 执行 STOP REPLICA IO_THREAD FOR CHANNEL '';停止了replica

  • 此时,可以通过 start replica;重新开启主从复制。如无意外,再次查询slave节点,能查到来自master节点的库表信息
  • 如果还不行,可以试试参考博客。注意:需要将博客中的start slave改成 start replica:mysql8.0的主从集群架构搭建教程,主从复制原理详解

主从节点的关闭

  • 如果遇到初始化失败,或想关闭服务了,最好通过如下方式完整的关闭MySQL服务
    ps -ef | grep "mysqld" | grep "3306" | grep -v grep |  awk '{print $2}' | xargs kill -9
    # 查看对应端口是否存在tcp监听
    lsof -i:3306
    kill -9 $PID
    

后记

  • 超级感谢博客,里面使用的各种命令都符合MySQL 8.4.3的规则:mysql 8.0 搭建主从集群注意事项
  • 其次,感谢博客给的主从复制未开启的解决思路:mysql8.0的主从集群架构搭建教程,主从复制原理详解

http://www.kler.cn/a/474235.html

相关文章:

  • Python入门教程 —— 网络编程
  • uniapp获取安卓与ios的唯一标识
  • Kubernetes集群架构
  • React+redux项目搭建流程
  • 黄仁勋演讲总结(2种显卡,1个开源大模型,1个数据采集平台)
  • 除了RAII和智能指针,还有哪些资源管理机制?
  • 【Go】:全面掌握 Sentinel — 构建高可用微服务的流量控制、熔断、降级与系统防护体系
  • [Unity] 【图形渲染】Unity Shader光照基础2-标准光照模型
  • Android - NDK :JNI实现异步回调
  • 我用Ai学Android Jetpack Compose之TextField
  • Spring MVC详细介绍
  • 如何查看本地sql server数据库的ip地址
  • oracle创建dblink
  • element(vue2)表格插槽
  • 第十一届蓝桥杯Scratch05月stema选拔赛真题—报数游戏
  • 滑动窗口——串联所有单词的子串
  • Linux好用软件
  • C++ 入门第26天:文件与流操作基础
  • 记录一次MySQL:caching_sha2_password报错
  • Linux中增加swap分区
  • 比QT更高效的一款开源嵌入式图形工具EGT-Ensemble Graphics Toolkit
  • 【gRPC】对称与非对称加解密和单向TLS与双向TLS讲解与go案例
  • vue 点击按钮复制文本功能(同时解决http不安全问题)
  • c# readonly 和 const的区别和使用场景
  • Android配件应用默认启动与USB权限申请区别
  • CODESYS MODBUS TCP通信(禾川Q1 PLC作为MODBUS TCP从站)