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。下面在主库上进行备份。

-- 先删除以前历史备份
[[email protected] base]# rm -rf /data/backups/base
 -- 完整备份
[[email protected] 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,按下面脚本顺序操作
-- 停掉从库服务
[[email protected] mysql]# systemctl  stop mysqld
-- 将mysql文件重命名为mysqlbak文件(备份)
[[email protected] mysql]# mv /var/lib/mysql /var/lib/mysqlbak
-- 数据还原到从库
[[email protected] 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
[[email protected] lib]# chown -R mysql.mysql /var/lib/mysql
[[email protected] 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
-- 启动服务
[[email protected] 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 ‘[email protected]:3306‘ - retry-time: 60  retries: 10

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

[[email protected] 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, 结果连接成功
[[email protected] 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查看数据是否已经同步, 结果已同步

原文地址:https://www.cnblogs.com/MrHSR/p/9854524.html

时间: 2024-10-13 02:04:27

mysql 架构篇系列 2 复制架构一主一从搭建(异步复制)的相关文章

MySQL基础篇(05):逻辑架构图解和InnoDB存储引擎详解

本文源码:GitHub·点这里 || GitEE·点这里 一.MySQL逻辑架构 1.逻辑架构图 基于下面的逻辑架构图,可以大致熟悉MySQL各个架构组件之间的协同工作关系. 很经典的C/S架构风格,即客户端/服务端模式. 2.分层描述 客户端连接 通常会进行连接池管理,连接用户权限认证,安全管理等操作. 可以通过如下命令查看连接配置信息:SHOW VARIABLES LIKE '%connect%';可以看到最大连接和每个连接占用的内存等相关配置. 核心功能 第二层架构封装MySQL一系列核心

我的架构经验系列文章 - 后端架构 - 框架层面

框架层面: SOA 在这一篇中会逐个介绍一下自己对这些XXX的理解,其实每一个理念都不是莫名其妙产生的而是有产生背景的,这些时髦的名词不是用来炫耀的,而是真正要理解它们是干什么的,并且框架千万不能乱用理念也千万不能乱用,并不是把所有的这些都用上你的系统才是一个牛逼的系统,一定要适合才是最好的,并且要保持简单可靠的原则.所谓SOA,字面上来说是面向服务的架构.有的人不说SOA其实他已经SOA了,有的人大谈SOA但其实只是在用Web服务,SOA可大可小.你可以认为服务调用就是SOA了,也可以认为服务

我的架构经验系列文章 - 后端架构 - 架构层面

架构层面: 日志集中 所谓日志集中就是把程序的所有日志和异常信息的记录都汇总到一起,在只有一台服务器的时候我们记录本地文件问题也不是最大,但是在负载均衡环境下再记录本地日志的话就出现问题了.在想查看网站日志的时候到哪台机器去查都不知道,难道有100台机器就100台机器逐一远程连上去看?因此,把这些数据汇总在一起保存对于大型网站系统来说是很必要的,这样我们就可以直接进行查看.搜索,也很明确可以知道是哪台机器的业务出了问题.至于这种日志数据是写到RDBMS还是NOSQL甚至是搜索引擎这就看需要了,总

我的架构经验系列文章 - 前端架构

框架层面:近几年前端发展很快,前端之所以叫前端因为前端是已经可以独立成为一种职业了,js也不再是十年前的玩具了,以前富客户端RIA的应用可能会用flash/flex或是silverlight,现在可以使用js来完成大部分的功能,因此js作为一门前端的支撑语言也不仅仅是进行的简单的编码,越来越多框架性的东西出现了.越来越多的开发模式转变为后端只是吐json的数据源,而前端做所有UI的事情. MVC MVC实现职责分离是很好的,大多数网站在后端都会引入MVC框架,对于一个前端负责所有呈现和前端业务逻

我的架构经验系列文章 - 后端架构 - 设计层面

设计层面: 分层架构 分层架构是项目设计中很重要的一点,从根本的目的上来说就是为了职责的分离.最经典的三层架构,到四层五层六层,甚至有人开玩笑说十八层的分层,根据项目的需要可以分不同的层.这里说的层其实是逻辑层,从物理层的角度来说也有三层.四层五层的分层架构.之所以三层架构这么流行是因为它的分层把大的关注点进行了分离,层数恰到好处,表现层.业务逻辑层和数据访问层,分别处理面向用户呈现的.面向逻辑处理的和面向数据库存取数据的三大关注点.UI前端框架最新力作!有奖试读! 在分层架构中除了分层之外还需

我的架构经验系列文章 - 后端架构 - 系统层面

系统层面: 高可用性 所谓高可用性也就是通过避免单独故障加上快速故障转移实现一旦某台物理服务器出现故障能实现故障快速恢复.一般来说,可以采用两种方式,如果可以做业务可以做负载均衡则通过负载均衡实现集群,然后针对每一台服务器进行监控,一旦发生故障则从集群中移除:如果业务只能有单点入口那么可以通过实现Standby机加上虚拟IP机制,实现Active机在出现故障之后虚拟IP转移到Standby的快速故障转移.一般可以使用KeepAlived或HeartBeat实现高可用(当然,硬件手段实现也可以,这

我的架构经验系列文章 - 后端架构 - 安全层面

安全层面: SQL注入 SQL注入是一个古老的安全问题,现在任何程序都不应该再出现这样的问题了,其原理非常简单,在过去大多数程序都是直肠子通数据库的,因此如果拼接SQL并且在参数上没有做好过滤或者没有使用参数形式来生成SQL语句的话可能会导致用户在页面上输入的恶意代码直接在数据库中执行.SQL注入的危害点在于整个网站有1000个数据点,如果其中有1个点有漏洞那么整站的数据其实都有危险了,很多开发会注重资金相关的模块但是忽略新闻相关的模块,如果都是使用一套数据库的话那么一个不重要模块的漏洞就会影响

我的架构经验系列文章 - 后端架构 - 性能层面

性能层面: 性能分析 我觉得性能分析的话要注意几个要点: 不要去猜:对于自己写的代码你是否知道你的代码要执行多久,是不是还在用时间相减来测试代码执行时间?现在有很多自动化的工具可以在程序运行的时候,测试代码中每一句语句的执行时间,可以有效分析出代码的性能瓶颈.对于比较重要的业务逻辑建议采用类似的工具来进行性能分析,有的时候性能慢的代码不一定是自己写的还可能是框架内提供的,如果没有一个丰富的编码经验是不太可能知道这些点的,但是通过这样的分析工具你就能知道这个地方会慢,虽然框架的代码我们不能改,但是

我的架构经验系列文章 - 后端架构 - 语言层面

语言层面: 运行时元数据获取 所谓运行时元数据获取也就是在程序 运行的时候通过代码动态 获得类型.方法.属性的信息,然后可以动态获得属性的值,执行方法等等,在有的语言中称为反射.反射不一定是高效的,但是在写框架程序的时候反射是一种很有用的技术 ,并且反射的性能开销往往是可以通过诸如缓存等手段来最小化的.比如在ORM中,根据实体类的信息动态获得所有的属性,然后取得其值,生成要到数据库 中执行的SQL语句.理解反射熟练掌握反射的使用以及性能优化是编写框架类代码很重要的一点. 错误处理 任何后端语言都