mysql双主热备集群搭建

  1. 安装前清理

    • 由于centos7中使用mariadb代替了MySQL,所以需要先清理mariadb

      rpm -qa|grep mariadb

      rpm -e mariadb-libs-5.5.68-1.el7.x86_64 --nodeps

    • 下载并安装mysql

      下载并安装MySQL官方的 Yum Repository

      wget -i -c https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm

      yum -y install mysql80-community-release-el7-1.noarch.rpm

      安装MySQL服务器

      yum -y install mysql-community-server

    • 启动MySQL

      systemctl start mysqld.service

      systemctl status mysqld.service

    • Mysql****初始化配置

      cat /var/log/mysqld.log | grep password

      mysql在安装后会创建一个root@locahost账户,并且把初始的密码放到了/var/log/mysqld.log文件中;

在这里插入图片描述

  • 登录并修改密码

    mysql -u root -p

    mysql -h192.168.88.52 -P3306 -ucp -pMyNewPass4!

    ALTER USER ‘root’@‘localhost’ IDENTIFIED with mysql_native_password BY ‘MyNewPass4!’;

    update user set host =’%’ where user =‘root’;

  • 防火墙设置

    关闭防火墙:systemctl stop firwalld

    禁止防火墙开机启动:systemctl disable firealld

    防火墙开放3306端口:firewall-cmd --zone=public --add-port=3306/tcp --permanent

    防火墙重新载入设置:firewall-cmd --reload

  • 使用navicat连接

    如果提示 Host XXX is not allowed to connect to this MySQL server

    use mysql;

    select host from user where user =‘root’;

    update user set host =’%’ where user =‘root’;

    alter user ‘root’@‘localhost’ identified with mysql_native_password by ‘MyNewPass4!’;
    在这里插入图片描述

    如果出现 MySQL 连接出现 Authentication plugin caching_sha2_password cannot be loaded

    ALTER USER ‘root’@’%’ IDENTIFIED WITH mysql_native_password BY ‘MyNewPass4!’;

    flush privileges;

  • 关闭

    vi /etc/selinux/config

    SELINUX=disabled

  1. 双机热备

    A服务器:192.168.88.52服务器,

    B服务器:192.168.88.179服务器

    1. 配置由A—>B的主从同步

      A服务器操作:

      • 创建用户备份的用户

        CREATE USER ‘cp_user’@‘192.168.88.179’ IDENTIFIED WITH mysql_native_password BY ‘MyNewPass4!’;

        GRANT REPLICATION SLAVE ON . TO ‘cp_user’@‘192.168.88.179’;

      • 修改 MySQL配置文件:vim /etc/my.cnf,配置内容如下:

        port=3306
        datadir=/var/lib/mysql
        socket=/var/lib/mysql/mysql.sock
        log-error=/var/log/mysqld.log
        pid-file=/var/run/mysqld/mysqld.pid
        #开始binlog日志
        log-bin=mysql-bin
        #设置binlog日志模式, 
        #STATEMENT:记录的是数据库上执行的原生SQL语句
        #ROW:记录的是数据表的行是怎样被修改的。
        #MIXED:混合模式,
        #如果设置了这种格式,MariaDB / MySQL 会在一些特定的情况下自动从 STATEMENT 格式切换到 ROW 格式。
        #例如,包含 UUID 等不确定性函数的语句,引用了系统变量的语句等等。
        binlog_format=mixed
        #=================开启binlog
        #设置该数据库是否为只读库 0否1是
        read-only=0
        #服务器唯一表示,每台服务器必须配置不一样,最好不要为0
        server-id=5
        #需要备份的数据库名称(可选)
        binlog-do-db=test_db
        #表示自增字段每次递增的量
        auto-increment-increment=2
        #表示自增字段初始值,从1开始,不能超过auto-increment-increment
        auto-increment-offset=1
        
      • 修改完毕保存后,重新启动mysql

        service mysqld restart

      • 登录mysql后,查询master状态

        mysql -uroot -pMyNewPass4!

        show master status

在这里插入图片描述

记住mysql-bin.000001和1554 这两个值,后续配置从服务器时会用到,这两个值可能会不一样

mysql-bin.000001:binlog文件的名称

1554:从文件什么位置开始读取

B服务器操作:

  • 修改 MySQL配置文件:vim /etc/my.cnf,配置内容如下:

    
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    
    log-error=/var/log/mysqld.log
    pid-file=/var/run/mysqld/mysqld.pid
    log-bin=mysql-bin
    binlog_format=mixed
    server-id=12
    
    #开启中继日志
    replicate-do-db=test_db
    relay-log=mysql.relay.bin
    log-slave-updates=ON
    
    • 登录MySQL后,执行同步命令

      - CHANGE MASTER TO  MASTER_HOST='192.168.88.52',MASTER_USER='cp_user',MASTER_PASSWORD='MyNewPass4!', master_log_file='mysql-bin.000001',master_log_pos=857;
      

      重启mysql,查询slave状态

      service mysql restart

      mysql -uroot -pMyNewPass4!

      Show slave status\G
      在这里插入图片描述

      Last Error 为0 即可认为配置正确。

      如果出现connection error 考虑关闭A服务器防火墙或清空iptables (iptables -F)

    • 测试

      在A和B服务器上登陆MySQL运行如下脚本创建数据库test_db;

      CREATE DATABASE IF NOT EXISTS test_db default charset utf8 COLLATE utf8_general_ci;
      

      单独在A服务器上创建表,并插入数据

      USE test_db;
      
      CREATE TABLE user(
      	id int not null auto_increment,
      	user_name VARCHAR(50),
      	password VARCHAR(10) ,
      	name VARCHAR(50),
      	status VARCHAR(10) ,
      	constraint pk__person primary key(id)
      );
      INSERT INTO user (`user_name`,`password`,`name`,`status`) VALUES('admin','admin','admin','1');
      

      到B服务器上test_db中查看是否同步了相同的表和数据

      已同步,则配置A—>B 的主从复制完成

  1. 配置由B—>A的主从同步

    B服务器操作:

    • 创建同步A服务器的用户

      CREATE USER ‘cp_user’@‘192.168.88.52’ IDENTIFIED WITH mysql_native_password BY ‘MyNewPass4!’;

      GRANT REPLICATION SLAVE ON . TO ‘cp_user’@‘192.168.88.52’;

    • 开启binlog

      vim /etc/my.cnf 插入如下内容

      #开启binlog
      read-only=0
      binlog-do-db=test_db
      auto-increment-increment=1
      auto-increment-offset=1
      
    • 显示master状态

      show master status

    A服务器操作:

    • 开启中继日志,添加如下配置

      #开启中继日志
      replicate-do-db=test_db
      relay-log=mysqld-relay-bin
      log-slave-updates=ON
      
    • 执行同步命令

      CHANGE MASTER TO  MASTER_HOST='192.168.88.52',MASTER_USER='cp_user',MASTER_PASSWORD='MyNewPass4!', master_log_file='mysql-bin.000001',master_log_pos=857;
      

      master_log_file和master_log_pos填入B服务器对应的master的值

    • 查看slave状态

      show slave status\G;
      在这里插入图片描述

      此时A—>B 和B—>A的同步均已完成

  2. 定时备份数据库
    • 创建本分目录

      mkdir /var/backups/mysql

    • 创建备份脚本并赋予可执行权限

      touch mysqlback.sh

      vim mysqlback.sh

      #获取当前时间
      date_now=$(date "+%Y%m%d-%H%M%S")
      backUpFolder=/var/backups/mysql
      username="root"
      password="MyNewPass4!"
      db_name="test_db"
      #定义备份文件名
      fileName="${db_name}_${date_now}.sql"
      #定义备份文件目录
      backUpFileName="${backUpFolder}/${fileName}"
      echo "starting backup mysql ${db_name} at ${date_now}."
      /usr/bin/mysqldump -u${username} -p${password}  --lock-all-tables --flush-logs ${db_name} > ${backUpFileName}
      #进入到备份文件目录
      cd ${backUpFolder}
      #压缩备份文件
      tar zcvf ${fileName}.tar.gz ${fileName}
      
      # use nodejs to upload backup file other place
      #NODE_ENV=$backUpFolder@$backUpFileName node /home/tasks/upload.js
      date_end=$(date "+%Y%m%d-%H%M%S")
      echo "finish backup mysql database ${db_name} at ${date_end}."
      
      

      chmod 751 mysqlback.sh

    • 进入linux crontab 定时任务编辑界面

      crontab -e

    • 添加命令

      */5 * * * * sh /var/backups/mysql/mysqlback.sh
      
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值