zoukankan      html  css  js  c++  java
  • mysql 架构篇系列 2 复制架构一主一从搭建(异步复制)

    一. 环境准备

      1.1 主库环境(172.168.18.201)

    环境

    说明

    查看脚本

    操作系统版本

    CentOS Linux release 7.4.1708 (Core)

    cat /etc/redhat-release

    操作系统用户名和密码

    root  js*2015

    IP地址

    172.168.18.201

    ip addr

    网关Gateway

    172.168.18.1

    cat /etc/sysconfig/network-scripts

    DNS

    172.168.16.11

    mysql 版本

    Distrib 5.7.23

    mysql --help | grep Distrib

    或者 select version(); 

    mysql 用户名和密码

    root  123456

    mysql 端口

    3306

    grep mysql /etc/services

    或者 HOW GLOBAL VARIABLES LIKE 'port'

      1.2 从库环境(172.168.18.203)

    环境

    说明

    操作系统版本

    CentOS Linux release 7.4.1708 (Core)

    操作系统用户名和密码

    root  js*2015

    IP地址

    172.168.18.203

    网关Gateway

    172.168.18.1

    DNS

    172.168.16.11

    mysql 版本

    Distrib 5.7.20

    mysql 用户名和密码

    root    js*2015% 

    (后面主库数据还原到从库后,密码跟主库的一样“123456”)

    Mysql 端口

    3306

      1.3 主库是用二进制安装,从库是用RPM安装,下面是查看的不同命令,脚本如下所示:

    -- 主库启动mysql服务
    service mysql start
    -- 主库连接到mysql命令
    mysql -uroot -p123456 
    -- 主库查看mysql是否启动
    service mysql  status
    
    -- 从库启动 mysql服务
     systemctl  start mysqld
    -- 从库连接到mysql命令
    mysql -uroot -p js*2015%
    -- 从库查看mysql是否启动
    systemctl  status  mysqld

      1.4 其它
        (1) 主从服务器相互接通对方ip。 例如在主库上拼: ping 172.168.18.203。
        (2) 使用telnet 拼通对方mysql端口。例如在从库上拼: telnet 172.168.18.201 3306

    二. 异步复制搭建(主库)

      主从复制配置步骤比较简单,下面详细介绍,确保主从库上安装了相同版本的数据库,因为复制的功能在持续的改进中。这里一个是5.7.23,一个是5.7.20。二个相近的版本(最好是一个版本)。

      2.1 在主库上,设置一个复制使用的mysql账户,并授予replication slave 权限,创建主库复制用户rep1。(注意:需要把 'rep1'@'172.168.18.201'  改成 'rep1'@'%'   在文章最后,测试复制是否成功会讲到)

    -- 172.168.18.201 主库 创建rep1 用户
    GRANT REPLICATION SLAVE ON *.* TO 'rep1'@'172.168.18.201'  IDENTIFIED BY '123456'

      

      2.2 在主库上修改服务器配置文件my.cnf, 开启binlog, 并设置server-id的值,之后重启数据库服务生效。开启binlog日志,详细说明在:mysql 开发进阶篇系列 33 工具篇(mysqlbinlog日志管理工具) 中讲到,my.cnf配置如下:

    [mysqld]
    server-id=1
    log-bin=/var/lib/mysql/mysql-bin

      2.3 在主库上,设置读锁定,这个操作为了确保没有数据库操作,以便获得一个一致性的快照。

     -- 锁住当前主库, 其它会话增删改等修改操作将会阻塞
    FLUSH TABLES WITH READ LOCK;

      2.4 得到主库当前的二进制日志名和偏移量值,这个操作是为了在从库上启动以后,从这个点开始进行数据的恢复

     SHOW MASTER STATUS

      2.5 现在主数据库已经停止更新操作了,需要生成主数据库的备份,备份可以直接在操作系统下复制全部的数据到从库服务器上,也可以通过mysqldump或xtrabackup 工具进行数据库备份。下面使用xtrabackup来克隆到slave。下面在主库上进行备份。

    -- 先删除以前历史备份
    [root@hsr base]# rm -rf /data/backups/base
     -- 完整备份
    [root@hsr base]# xtrabackup --host=127.0.0.1 --user bkpuser --password=123456 --backup --target-dir=/data/backups/base


      2.6 备份结束后,恢复主库写操作

    UNLOCK TABLES;

      2.7 将备份文件复制到从库上

        可以使用rsync命令来实现文件拷贝,我这里简单起见使用xtfp来传送文件。同样在从库上也建相同的目录,主库数据文件拷贝到从库目录后,如下图所示

    三. 异步复制搭建(从库)

      3.1  数据还原,使主库和从库的数据库和表保持一致,从库是一个相同的副本

        在从库上安装好xtrabackup工具,配置好mysql备份用户,脚本如下,可参照:mysql 开发进阶篇系列 45 物理备份与恢复(xtrabackup 安装,用户权限,配置)

    (1) -- 从库 203配置mysql备份用户脚本如下
    CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY '12345678';
    GRANT RELOAD,LOCK TABLES,REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost';
    GRANT PROCESS,SUPER ON *.* TO 'bkpuser'@'localhost';
    
    (2) -- 数据还原到从库,从库data目录是 /var/lib/mysql,按下面脚本顺序操作
    -- 停掉从库服务
    [root@xuegod64 mysql]# systemctl  stop mysqld
    -- 将mysql文件重命名为mysqlbak文件(备份)
    [root@xuegod64 mysql]# mv /var/lib/mysql /var/lib/mysqlbak
    -- 数据还原到从库
    [root@xuegod64 lib]# xtrabackup  --defaults-file=/etc/my.cnf  --host=127.0.0.1  --user bkpuser --password=12345678 --copy-back 
    --target-dir=/data/backups/base

        此时数据已还原,如下图所示 :

    3-- 下面将mysql文件的属主从root改为mysql
    [root@xuegod64 lib]# chown -R mysql.mysql /var/lib/mysql
    [root@xuegod64 lib]# chmod 770 /var/lib/mysql

      3.2 配置从库 my.cnf

        修改从库配置文件,增加server-id 参数,注意server-id的值必须唯一,不能和主数据库的配置相同,如果有多个从服务器,每个从服务器必须有唯一的server-id值。

     [mysqld]
    server-id=2

      3.3 在从库上,使用skip-slave-start选项启动从数据库,这样不会立即启动从库的复制进程,目的方便下一步配置

    [mysqld]
    server-id=2
    skip-slave-start=true
    -- 启动服务
    [root@xuegod64 lib]# systemctl  start  mysqld

      3.4 对从库做相应的配置,指定复制使用的用户,主数据库服务器ip, 端口,以及开始执行复制的日志文件和位置等,脚本如下:

    CHANGE MASTER TO 
    MASTER_HOST='172.168.18.201',
    MASTER_PORT=3306,
    MASTER_USER='rep1',
    MASTER_PASSWORD='123456',
    MASTER_LOG_FILE='mysql-bin.000070',
    MASTER_LOG_POS=785

      3.5 从库上启动slave线程

    START SLAVE

      3.6 查看是否配置正确(从库上)

    SHOW PROCESSLIST

        如下图所示:表明slave已经连接上master, 并开始接受并执行日志。


    四. 验证测试复制 

      4.1  测试复制服务的正确性。 下面在主数据库上执行一个更新操作,观察是否在从库上同步。

    -- 在主库上更新数据
    SELECT * FROM testbackup WHERE id=12
    UPDATE testbackup SET `name`='小李子' WHERE id=12

      4.2 查看从库testbackup表

    -- 数据没有更新过来,检查从库复制线程状态
    SHOW SLAVE STATUS

        错误提示:在last_io_error中出现: error connecting to master 'rep1@172.168.18.201:3306' - retry-time: 60  retries: 10

      4.3 测试从库203上连接主库201,结果连接失败

    [root@xuegod64 lib]# mysql -urep1 -h 172.168.18.201 -p123456
    mysql: [Warning] Using a password on the command line interface can be insecure.
    ERROR 1045 (28000): Access denied for user 'rep1'@'aca812cb.ipt.aol.com' (using password: YES)
    --解决方法:在主库将rep1的host 值从172.168.18.201改为 %
       UPDATE mysql.user SET `Host`='%' WHERE `User`='rep1'
        FLUSH PRIVILEGES
    -- 再测试从库203上连接主库201, 结果连接成功
    [root@xuegod64 lib]# mysql -urep1 -h 172.168.18.201 -p123456
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 180
    -- 从库203上停止,再重启slave线程。
    STOP SLAVE
    START SLAVE

        最终在从库203查看数据是否已经同步, 结果已同步

  • 相关阅读:
    Django学习过程中遇到的问题
    代理工具WebScarab安装(转载)
    MongoDB安装之window版本的安装
    QT打包
    小工具--串口
    多线程--信号量
    关于多线程
    QQ界面及简单操作实现
    udp通信
    char *p = "abc";char p[] = "abc";两者之间的区别
  • 原文地址:https://www.cnblogs.com/MrHSR/p/9854524.html
Copyright © 2011-2022 走看看