vlambda博客
学习文章列表

一、Mysql主从复制(一主多从)搭建


怀梦想 致远方
没有谁的生活会一直完美,但无论什么时候,都要看着前方,满怀希望就会所向披靡。——《撒野》


一、Mysql主从复制(一主多从)搭建
  1. 介绍

      在实际生产中,数据的重要性不言而喻如果我们的数据库只有一台服务器,那么很容易产生单点故障的问题,比如这台服务器访问压力过大而没有响应或者奔溃,那么服务就不可用了,再比如这台服务器的硬盘坏了,那么整个数据库的数据就全部丢失了,这是重大的安全事故.为了避免服务的不可用以及保障数据的安全可靠性,我们至少需要部署两台或两台以上服务器来存储数据库数据,也就是我们需要将数据复制多份部署在多台不同的服务器上,即使有一台服务器出现故障了,其他服务器依然可以继续提供服务.
      MySQL提供了主从复制功能以提高服务的可用性与数据的安全可靠性.主从复制是指服务器分为主服务器和从服务器,主服务器负责读和写,从服务器只负责读,主从复制也叫 master/slave,master是主,slave是从,但是并没有强制,也就是说从也可以写,主也可以读,只不过一般我们不这么做。
      主从复制可以实现对数据库备份和读写分离
  2. 架构

    一主多从

    一、Mysql主从复制(一主多从)搭建

    双主多从

    一、Mysql主从复制(一主多从)搭建

    二、主从复制原理

一、Mysql主从复制(一主多从)搭建

  • 当 master 主服务器上的数据发生改变时,则将其改变写入二进制事件日志文件中

  • salve 从服务器会在一定时间间隔内对 master 主服务器上的二进制日志进行探测,探测其是否发生过改变,如果探测到 master 主服务器的二进制事件日志发生了改变,则开始一个 I/O Thread 请求 master 二进制事件日志

  • 同时 master 主服务器为每个 I/O Thread 启动一个dump  Thread,用于向其发送二进制事件日志

  • slave 从服务器将接收到的二进制事件日志保存至自己本地的中继日志文件中

  • salve 从服务器将启动 SQL Thread 从中继日志中读取二进制日志,在本地重放,使得其数据和主服务器保持一致;

  • 最后 I/O Thread 和 SQL Thread 将进入睡眠状态,等待下一次被唤醒

    注意:主从复制的过程会有很小的延迟,基本没有影响

二、一主多从搭建
  1. 节点规划

    系统centos7.3

    master  node02  192.168.147.111

    slave1  node03   192.168.147.112

    slave2  node04  192.168.147.113

  2. 软件下载

  3. 解压到本地

    tar -zxvf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
    mv mysql-5.7.24-linux-glibc2.12-x86_64 /usr/local/mysql-5.7.24
  4. 在node01,node02,node03分别建立存放数据的目录

    cd /usr/local/mysql-5.7.24/
    mkdir /usr/local/mysql-5.7.24/data
  5. 在node01,node02,node03执行数据库初始化

    cd /usr/local/mysql-5.7.24/bin
    ./mysqld --initialize-insecure --basedir=/usr/local/mysql-5.7.24 --datadir=/usr/local/mysql-5.7.24/data/3306 --user=mysql

    initialize-insecure 表示不生成MySQL数据库root用户的随机密码,即root密码为空

  6. 修改node01,node02,node03的my.cnf文件

    node01

    vi /usr/local/mysql-5.7.24/data/3306/my.cnf

    [client]
    port=3306
    socket=/usr/local/mysql-5.7.24/data/3306/mysql.sock
    default-character-set=utf8

    [mysqld]
    port=3306
    socket=/usr/local/mysql-5.7.24/data/3306/mysql.sock
    datadir=/usr/local/mysql-5.7.24/data/3306
    log-error=/usr/local/mysql-5.7.24/data/3306/error.log
    pid-file=/usr/local/mysql-5.7.24/data/3306/mysql.pid

    character-set-server=utf8
    lower_case_table_names=1
    autocommit=1
    log-bin=mysql-bin
    server-id=1

    node02

    [client]
    port=3306
    socket=/usr/local/mysql-5.7.24/data/3306/mysql.sock
    default-character-set=utf8

    [mysqld]
    port=3306
    socket=/usr/local/mysql-5.7.24/data/3306/mysql.sock
    datadir=/usr/local/mysql-5.7.24/data/3306
    log-error=/usr/local/mysql-5.7.24/data/3306/error.log
    pid-file=/usr/local/mysql-5.7.24/data/3306/mysql.pid

    character-set-server=utf8
    lower_case_table_names=1
    autocommit=1
    server-id=2

    node03

    [client]
    port=3306
    socket=/usr/local/mysql-5.7.24/data/3306/mysql.sock
    default-character-set=utf8

    [mysqld]
    port=3306
    socket=/usr/local/mysql-5.7.24/data/3306/mysql.sock
    datadir=/usr/local/mysql-5.7.24/data/3306
    log-error=/usr/local/mysql-5.7.24/data/3306/error.log
    pid-file=/usr/local/mysql-5.7.24/data/3306/mysql.pid

    character-set-server=utf8
    lower_case_table_names=1
    autocommit=1

    server-id=3


  7. node01,ode02,node03切换到/usr/local/mysql-5.7.24/bin目录下,使用 msyqld_safe 命令指定配置文件并启动MySQL服务:

    ./mysqld_safe --defaults-file=/usr/local/mysql-5.7.24/data/3306/my.cnf &


  8. 登录每个节点node01,node02,node03都执行

    方式一:使用用端口、主机登录(推荐使用该方式)

    ./mysql -uroot -p -P3306 -h127.0.0.1

    方式二:使用socket文件

    ./mysql -uroot -p -S /usr/local/mysql-5.7.24/data/3306/mysql.sock

    -p 是指定密码,如果没有密码则可以不写 -p,-S是指定sock文件,mysql.sock文件是服务器与本机客户端进行通信的ip与端口文件

  9. 修改密码node01,node02,node03都执行

    alter user 'root'@'localhost' identified by 'mysql@!QAZ';
  10. 授权远程访问(这样远程客户端才能访问)node01,node02,node03都执行

    grant all privileges on *.* to root@'%' identified by 'mysql@!QAZ';

    刷新配置

    flush privileges;
三、主从复制配置
  1. 登录主节点node01,在主服务器上创建复制数据的账号并授权

    grant replication slave on *.* to 'copy'@'%' identified by 'mysql@!QAZ';
    flush privileges;

    注意:该语句可完成授权、创建用户、修改密码操作

  2. 查看主服务器状态

    show master status;

    mysql主服务器默认初始值:

    如果不是初始值需要进行初始化

    reset master;
  3. 登录从节点node02,node03查看状态

    show slave status;

    初始状态:Empty set ,如果不是建议重置

    stop slave; #停止复制,相当于终止从服务器上的IO和SQL线程
    reset slave;
  4. 设置从服务器的master

    在从服务器客户端执行node02,node03

    change master to master_host='192.168.147.111',master_user='copy',
    master_port=3306,master_password='mysql@!QAZ',
    master_log_file='mysql-bin.000001',master_log_pos=154;
  5. 在从机器上执行开始复制命令

    start slave;
四、验证
  1. 检查从服务器复制功能状态

    show slave status \G

 如果 Slave_IO_Running 和 Slave_SQL_Running 均为 YES,则表示主从关系正常

 2.在主服务器上创建数据库、表、数据,然后在从服务器上查看是否已经复制

五、关闭集群
  1. 方式一:使用端口、主机关闭 (推荐)

./mysqladmin -uroot -p -P3306 -h127.0.0.1 shutdown
  1. 方式二:使用socket文件
./mysqladmin -uroot -p -S /usr/local/mysql-5.7.24/data/3307/mysql.sock shutdown