搭建说明

  • 两主一从,从本质上说,只不过是机器 master-a 和 master-b 互为主从机(热备),然后通过 keepalived 进行高可用配置,使得在同一时间内只会有一台对外提供服务,实现单写机制,另一个机器 slave 则作为 master-a 的从机存在(冷备)。
  • 从机 slave 无法直接将虚拟IP(VIP)作为主机:正常运行时,slave 绑定了一个主机 master-a, 一旦绑定之后,在 master-a 不可用的时候,无法自动切换到 master-b,因为需要考虑 二进制日志文件名(master_log_file)及位置(master_log_pos)在 master-a 和 master-b 上是不一致的,此时只有在 master-a 恢复可用时,master-a 从 master-b 同步数据之后,slave 数据最终才会和 master-a 保持一致。

环境准备

  1. 三台 centos7 的服务器,服务器ip为 192.168.86.124(master-a)、192.168.86.125(master-b)、192.168.86.126(slave)
  2. 一个虚拟IP(VIP):192.168.86.250
  3. mysql-5.7.24-linux-glibc2.12-x86_64 安装包

数据库安装

  1. 将 mysql 安装包上传到三台服务器上
  2. 解压安装包
    tar -zxvf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
  3. 创建 mysql 安装路径,然后移动刚才解压的文件夹并重命名
    mkdir /data     #创建安装路径
    mv mysql-5.7.24-linux-glibc2.12-x86_64 /data/mysql #移动文件并重命名
  4. 创建 mysql 用户和组、创建mysql运行需要的文件夹及赋权
    groupadd mysql     #创建用户组
    useradd -r -g mysql mysql #创建用户
    cd /data/mysql #切换到安装目录
    mkdir data #创建数据存放目录
    mkdir mysql-log #创建日志存放目录
    mkdir mysql-log/err-log
    mkdir mysql-log/slow-log
    mkdir mysql-log/relay-log
    mkdir mysql-log/bin-log
    chown -R root:mysql . #将当前目录以及子目录,所有者改变为 mysql,所属组修改为 mysql
    chown -R mysql:mysql data
    chown -R mysql:mysql mysql-log
  5. 设置用户操作系统资源限制
    vi /etc/security/limits.conf
    # 在文件中加入以下内容
    mysql soft nproc 2047
    mysql hard nproc 16384
    mysql soft nofile 1024
    mysql hard nofile 65536
  6. 设置链接和服务
    cp /data/mysql/support-files/mysql.server /etc/init.d/mysql  # 可以使用service mysql start
    ln -s /data/mysql/bin/mysql /usr/bin #任何路径可以使用 mysql 命令
  7. 配置 /etc/my.cnf
    vi /etc/my.cnf
    • master-a
      [mysqld]
      port = 3306 #端口
      basedir = /data/mysql #mysql安装路径
      datadir = /data/mysql/data/ #mysql数据存放路径 #日志设置
      log-error = /data/mysql/mysql-log/err-log/db-err.log #错误日志路径
      slow-query-log-file = /data/mysql/mysql-log/slow-log/db-slow.log #慢SQL日志路径
      relay-log=/data/mysql/mysql-log/relay-log/relay-log
      long-query-time = 20 #怎样才算是慢sql,单位是秒 #开启 binlog 同步
      server_id = 0001 #一个集群内的 MySQL 服务器 ID,全局唯一
      log-bin = /data/mysql/mysql-log/bin-log/db-binlog #开启 Binlog 并写明存放日志的位置
      max-binlog-cache_size = 64M #binlog 最大能够使用cache的内存大小
      max-binlog-size = 1G #binlog 日志每达到设定大小后,会使用新的 binlog 日志
      expire_logs_days = 15 #只保留最近15天的bin日志
      binlog-format = mixed #混合模式复制
      innodb_flush_log_at_trx_commit = 1 #和 sync_binlog 控制MySQL磁盘写入策略以及数据安全性
      sync-binlog = 1 #控制数据库的binlog刷到磁盘上去 ## 主主同步配置
      replicate-do-db=db_test #需要从主库-2同步的数据库1
      replicate-do-db=db_dev #需要从主库-2同步的数据库2
      auto-increment-increment=2
      auto-increment-offset=1
      log-slave-updates=1 #性能调优配置
      innodb_buffer_pool_size = 24576M
      max_connections = 5000
      max_connect_errors = 6000
      external-locking = FALSE
      max_allowed_packet = 64M
      join_buffer_size = 64M
      sort_buffer_size = 2M
      read_rnd_buffer_size = 16M #SQL模式
      sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
    • master-b
      [mysqld]
      port = 3306
      basedir = /data/mysql
      datadir = /data/mysql/data #日志设置
      slow-query-log-file=/data/mysql/mysql-log/slow-log/db-slow.log
      log-error=/data/mysql/mysql-log/err-log/db-err.log
      relay-log=/data/mysql/mysql-log/relay-log/relay-log
      long-query-time = 20 #怎样才算是慢sql,单位是秒 #开启 binlog 同步
      server_id = 0002 #一个集群内的 MySQL 服务器 ID,全局唯一
      log-bin = /data/mysql/mysql-log/bin-log/db-binlog #开启 Binlog 并写明存放日志的位置
      max-binlog-cache_size = 64M #binlog 最大能够使用cache的内存大小
      max-binlog-size = 1G #binlog 日志每达到设定大小后,会使用新的 binlog 日志
      expire_logs_days = 15 #只保留最近15天的日志
      binlog-format = mixed #混合模式复制
      innodb_flush_log_at_trx_commit = 1 #和 sync_binlog 控制MySQL磁盘写入策略以及数据安全性
      sync-binlog = 1 #控制数据库的binlog刷到磁盘上去 #主主设置
      replicate-do-db=db_test #需要从主库-1同步的数据库1
      replicate-do-db=db_dev #需要从主库-1同步的数据库2
      auto-increment-increment=2
      auto-increment-offset=2
      log-slave-updates=1 #性能调优设置
      innodb_buffer_pool_size = 24576M
      max_connections = 5000
      max_connect_errors = 6000
      external-locking = FALSE
      max_allowed_packet = 64M
      join_buffer_size = 64M
      sort_buffer_size = 2M
      read_rnd_buffer_size = 16M #SQL模式
      sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
    • slave
      [mysqld]
      port = 3306
      basedir = /data/mysql
      datadir = /data/mysql/data #日志设置
      expire_logs_days = 15
      long-query-time = 3
      slow-query-log-file=/data/mysql/mysql-log/slow-log/db-slow.log
      log-error=/data/mysql/mysql-log/err-log/db-err.log #主从设置
      server_id = 0003 #这里需要在集群中保持唯一
      replicate-do-db=db_test #需要从主库同步的数据库1
      replicate-do-db=db_dev #需要从主库同步的数据库2
      read_only=1 #只读设置 #性能调优设置
      innodb_buffer_pool_size = 24576M
      max_connections = 5000
      max_connect_errors = 6000
      external-locking = FALSE
      max_allowed_packet = 64M
      join_buffer_size = 64M
      sort_buffer_size = 2M
      read_rnd_buffer_size = 16M #SQL模式
      sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

数据库初始化

  1. 初始化数据库
     cd /data/mysql/bin/
    ./mysqld --defaults-file=/etc/my.cnf --user=mysql --initialize #初始化
  2. 查看密码(初始化数据库之后会生成一个 root 账户的默认密码)
    cat /data/mysql/mysql-log/err-log/db-err.log
  3. 启动 mysql
    service mysql start
  4. 登录并修改 root 密码
    mysql -u root -p
    set password = password('root');
    flush privileges; #如果需要使用 root 进行远程连接,执行以下语句
    use mysql;
    update user set host = '%' where user = 'root';
    flush privileges;
  5. 创建用户并赋权
    • 主机 master-a、master-b
      #创建一个用于和从机“通信”的用户,具有同步权限
      grant replication slave on *.* to 'copy'@'%' identified by 'copy'
      flush privileges; #创建一个用于访问和操作某些特定的库的用户,不应该让应用直接使用 root 用户.
      grant all privileges on db_test.* to "app_user"@'%' identified by "app_user";
      flush privileges;
    • 从机 slave
      #创建一个用于访问和操作某些特定的库的用户,不应该让应用直接使用 root 用户.
      grant all privileges on db_test.* to "app_user"@'%' identified by "app_user";
      flush privileges;

主从同步启动

  1. 主机 master-a

    1. 在 master-b 中获得二进制日志文件名(master_log_file)及位置(master_log_pos)
      show master status

    2. 在 master-a 中执行以下命令
      stop slave;     #暂停
      reset slave; #重置
      change master to master_host="master-b 的IP", master_user="copy",master_password="copy",master_log_file="db-binlog.000002",master_log_pos=2532; #设置和主机同步的用户信息,日志文件信息
      start slave; #启动
      show slave status \G #查看从机状态,主要是看 Slave_IO_Running Slave_SQL_Running 上是否都是 yes

  2. 主机 master-b、从机 slave
    1. 在 master-a 中获得二进制日志文件名(master_log_file)及位置(master_log_pos)
      show master status
    2. 在 master-b和 slave 中执行以下命令
      stop slave;     #暂停
      reset slave; #重置
      change master to master_host="master-a 的IP", master_user="copy",master_password="copy",master_log_file="db-binlog.000002",master_log_pos=2532; #设置和主机同步的用户信息,日志文件信息
      start slave; #启动
      show slave status \G #查看从机状态,主要是看 Slave_IO_Running Slave_SQL_Running 上是否都是 yes

keepalived 安装启动(master-a、master-b)

  1. keepalived 安装
    yum install -y keepalived
  2. keepalived 配置
    vi /etc/keepalived/keepalived.conf

    文件内容为:

    global_defs {
    router_id LVS_DEVEL
    } vrrp_sync_group VG_1 {
    group {
    VI_1
    }
    } vrrp_instance VI_1 {
    state BACKUP #两个机器都是这个值,不要设置为 MASTER,使用下面的 priority 来控制
    interface ens33 #通过 ifconfig 查看
    virtual_router_id 51
    priority 100 #优先级,另一台机器设置为 90
    advert_int 1
    nopreempt # 另一台优先级低的机器不设置此参数!
    authentication {
    auth_type root
    auth_pass root
    }
    virtual_ipaddress {
    192.168.86.250 # 这个是VIP
    }
    } virtual_server 192.168.86.250 3306 { # 这个是VIP
    delay_loop 2
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP real_server 192.168.86.124 3306 { # 这是机器的IP地址
    weight 3
    notify_down /data/mysql/bin/mysql.sh
    TCP_CHECK {
    connect_timeout 5
    nb_get_retry 3
    delay_before_retry 3
    connect_port 3306
    }
    }
    }
  3. 创建一个关闭 keepalived 的脚本,用于在 mysql 无法访问时,关闭 keepalived 以释放 VIP
    vi /data/mysql/bin/mysql.sh

    文件内容为:

    #!/bin/sh
    pkill keepalived

    将文件设置为可执行文件:

    chmod +x /data/mysql/bin/mysql.sh
  4. keepalived 启动
    systemctl start keepalived
  5. keepalived 其它相关命令
    systemctl enable keepalived # 开机自启动
    systemctl start keepalived # 启动
    systemctl stop keepalived # 暂停
    systemctl restart keepalived # 重启
    systemctl status keepalived # 查看状态
    tail -f /var/log/messages

测试

  1. 首先,所有机器、软件都正常运行

    • 通过各个 IP和VIP 连接数据库查看均能正常连接到数据库

    • master-a 获得了 vip
      ip addr

  2. 通过 VIP 连接数据库,之后创建一个 db_test 库以及 tb_user表
    • master-a、master-b、slave 均存在创建的库和表
  3. 连接 master-a 的数据库,并新增一条数据
    • master-b、slave 均有新增的数据
  4. 连接 master-b 的数据库,并新增一条数据
    • master-a、slave 均有新增的数据
  5. 关闭 master-a 的mysql
    service  mysql stop  #关闭 mysql
    
    systemctl status keepalived #查看 keepalived 状态
    • master-a 的 keepalived 自动关闭了,原因是 mysql 关闭会触发 keepalived 配置的 notify_down 脚本
    • master-b 获得了 vip
  6. 通过 VIP 连接数据库,并插入一条数据
    • master-a(无法连接)
    • master-b (存在新增数据)
    • slave(不存在新增数据,因为 master-a 挂掉了)
  7. 重启 master-a 的 mysql 和 keepalived
    • vip 仍然在 master-b ,因为 master-a keepalived 配置了非抢占模式 nopreempt,因此若是主机故障排除后需要将主机的keepalived重启,然后重启从机的keepalived,需要让主机获取到 VIP
    • master-a、master-b 同步了刚刚新增的数据
  8. 关闭 master-b、slave 的mysql,通过 master-a 新增一条数据,之后重启 master-b、slave 的 mysql,以及 master-b 的 keepalived
    • master-b存在新增数据
    • slave 存在新增数据
    • vip 仍然在 master-a

常见问题

mysql 两主一从环境搭建(5.7.24)的更多相关文章

  1. centos7 + Nginx+ HTTPS + uwsgi + python3.6 + Docker + Django1.11 + mysql 5.6 + virtualenv 环境搭建

    环境搭建: 系统: ​ centos7.2 x64 开发环境: ​ python3.6 ​ Django 1.11 虚拟环境: [Docker](https://www.runoob.com/dock ...

  2. 自学php的几个例子(包含AMP(Apache、MySQL、PHP)环境搭建链接)

    学习PHP之前需要先搭建PHP运行的环境(即服务器+PHP+数据库)来使PHP成功运行,具体环境搭建教程可参考pharen(http://www.cnblogs.com/pharen/archive/ ...

  3. Ubuntu下(Linux+Apache+MYSQL+PHP, LAMP)环境搭建

    近期開始玩PHP,于是试着搭建一下开发环境并做个记录,以备日后再使用起来方便可查. 第一步 确保软件包是最新的 sudo apt-get update 第二步 安装Apache2 sudo apt-g ...

  4. CentOS6.5+nginx+mysql+php(laravel)服务器环境搭建

    公司准备迭代会员中心项目,要上laravel框架,替代以前的Ecshop框架,PHP工程师将部分功能页面代码提交,自己也准备着手搭建一个测试环境将项目跑起来: 一. 环境依赖安装设置 关闭防火墙 [r ...

  5. Kettle ETL 来进行mysql 数据同步——试验环境搭建(表中无索引,无约束,无外键连接的情况)

    今天试验了如何在Kettle的图形界面(Spoon)下面来整合来mysql 数据库中位于不同数据库中的数据表中的数据. 试验用的数据表是customers: 第三方的数据集下载地址是:http://w ...

  6. SpringMVC+Mybatis+Mysql实战项目学习--环境搭建

    1.开发IDE:Spring Tool Suite(自带maven插件) 下载地址https://spring.io/tools/sts/all 在STS.ini配置信息中加下面一行 保证编码格式为u ...

  7. LNMP(Linux+Nginx+Mysql+PHP---源码)环境搭建

    LNMP(Linux+Nginx+Mysql+PHP(Perl)) Linux:[root@dep5 mysql]# cat /etc/issueRed Hat Enterprise Linux Se ...

  8. mysql master master slave 环境搭建

    master1:192.168.128.47 master2:192.168.128.96 slave:192.168.128.97   master1与master2互备,master2作为slav ...

  9. MySQL双机热备环境搭建

    一.    前期准备 准备两台服务器(电脑),接入到同一局域网中,能够使双方可以ping通: 安装MySQL数据库,具体安装方法网上很全面,但是安装的版本需保持一致: 服务器IP地址设置. l  A服 ...

随机推荐

  1. Python练习题 002:奖金计算

    [Python练习题 002]企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成 ...

  2. 在C++中使用libuv时对回调的处理 (2)

    前情简介 在完成了第一版的<在C++中使用libuv时对回调的处理>之后,在对项目进行开发的时候,还是感觉有一些难受. 因为在实际操作的时候,需要构建一个结构体,并且需要对这个结构体的内存 ...

  3. 这就是小学生也会用的四则计算练习APP吗?- by软工结对编程项目作业

    结对编程项目 软件工程 这就是链接 作业要求 这就是链接 作业目标 熟悉在未结对情况下如何结对开发项目 Github与合作者 合作者(学号): 区德明:318005422 虚左以待 Github链接: ...

  4. layui+tp5表单提交回调

    layui 前段页面form表单提交数据如果监听表单提交 ,tp5后台操作完成后使用 $this->success('success'); 后前端的页面不会出现layui的layer弹窗提示su ...

  5. MeteoInfoLab脚本示例:读取文本文件绘制散度图

    MeteoInfoLab中读取文本文件数据的函数是asciiread,获取文本文件行.列数的函数是numasciirow和numasciicol,和NCL中函数名一致,但都是小写字母.本例中的示例数据 ...

  6. MeteoInfo脚本示例:读取FY3A AOD HDF文件

    FY3A卫星有AOD产品数据,HDF格式,这里示例用MeteoInfo脚本程序读取和显示该类数据. 脚本程序如下: #----------------------------------------- ...

  7. pytest文档49-命令行参数--tb的使用

    前言 pytest 使用命令行执行用例的时候,有些用例执行失败的时候,屏幕上会出现一大堆的报错内容,不方便快速查看是哪些用例失败. --tb=style 参数可以设置报错的时候回溯打印内容,可以设置参 ...

  8. spring boot:用spring security加强druid的安全(druid 1.1.22 / spring boot 2.3.3)

    一,druid的安全保障有哪些环节要注意? 1,druid ui的访问要有ip地址限制 2,用户必须要有相应的权限才能访问druid 3,关闭重置功能 说明:stat-view-servlet.url ...

  9. go 数组指针 指针数组

    package main import "fmt" func test() { var p *int // 定义指针 var a = 10 p = &a // 将a的地址赋 ...

  10. centos8使用timedatectl管理时间

    一,centos8中默认使用chronyd来做时间服务 1,查看chronyd服务的状态 [root@blog ~]# systemctl status chronyd ● chronyd.servi ...