复习电商笔记-19-mysql主从复制接受和操作

 

第五天:MySQL主从复制+Amoeba读写分离

思考:

序号

知识点

类型

难度系数

掌握程度

  1.  

读写分离使用mysql proxy/mycat/amoeba

技术

1

熟练

  1.  

主从复制、读写分离实现流程

论述

1

熟练

  1.  

一主多从实现

技术

1

熟练

  1.  

主从时,设置从为只读,会发生什么现象

技术

1

了解

  1.  

代理实现分库分表、规则

技术

3

熟练

知识点:

序号

知识点

类型

难度系数

掌握程度

  1.  

MySQL主从复制,主从配置实现

技能

1

熟练

  1.  

MySQL读写分离

代码

1

熟练

  1.  

Amoeba实现读写分离

代码

1

熟练

拓展作业:

序号

知识点

类型

难度系数

掌握程度

  1.  

SpringAOP实现读写分离

代码

1

熟练

  1.  

mycat实现读写分离

代码

1

熟练

  1.  

主从从结构实现,找出失败原因

代码

1

熟练

*MySQL主从复制读写分离

原理

mysql主(称master)从(称slave)复制的原理:

1、 master将数据改变记录到二进制日志(binary log)中,也即是配置文件log-bin指定的文件(这些记录叫做二进制日志事件,binary log events)

2、 slave将master的binary log events拷贝到它的中继日志(relay log)

3、 slave重做中继日志中的事件,将改变反映它自己的数据(数据重演)

4、默认1分钟同步一次

*时间差

在数据同步时总是会存在时间差,哪怕这个时间差非常小也是存在的。那如何处理呢?在主库写数据时在一个事务中,那就写完就从主库直接读数据。写完就可以从从库中读取数据了。

解决之道:分布式集群

2016年8月30号腾讯开源了PhxSQL产品。

PhxSQL是由微信后台团队自主研发的一款服务高可用、数据强一致的分布式数据库服务。该服务基于Percona5.6搭建,目标在于解决MySQL在容灾和数据一致性方面的不足,并大幅简化了MySQL容灾切换的运维操作。

PhxSQL具有服务高可用、数据强一致、高性能、运维简单、和MySQL完全兼容的特点。服务高可用:PhxSQL集群内只要多数派节点存活就能正常提供服务;出于性能的考虑,集群会选举出一个Master节点负责写入操作;当Master失效,会自动重新选举新的Master。数据强一致:PhxSQL采用多节点冗余部署,在多个节点之间采用paxos协议同步流水,保证了集群内各节点数据的强一致。

下载地址:https://github.com/tencent-wechat/phxsql

 

主从配置需要注意的地方

1、 主DB server和从DB server数据库的版本一致。

2、 主DB server和从DB server数据库数据一致[ 这里就会可以把主的备份在从上还原,也可以直接将主的数据目录拷贝到从的相应数据目录]。

3、 主DB server开启二进制日志,主DB server和从DB server的server_id都必须唯一。

主从复制Window版本

安装两个MySQL数据库

不影响现有安装的MySQL数据库。

执行mysql-installer-community-5.6.22.0.msi安装文件,

按下图选择安装路径

这样基础的文件都放在一个目录下,这里不要改变data目录。目录手工创建。

安装完成后,关闭服务。

拷贝数据文件

复制C:\Documents and Settings\All Users\MySQL\MySQL Server 5.6\下的data目录到D:\javaenv\mysql5.6\3308下。

修改D:\javaenv\mysql5.6\3308\my.ini的60行的端口和96行的数据文件路径。

datadir=D:/javaenv/mysql5.6/3308/data

第二个MYSQL:复制整个3308目录,改名为3309目录。

修改下面的my.ini,如上,修改端口和数据文件路径。

注册服务:

3308的服务已经注册,只需注册3309的。

在3309/bin/目录下执行

mysqld –install MYSQL3309

修改注册表:

运行服务时要指定对应的my.ini文件

运行regedit,打开注册表,找到

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\下的MYSQL

编辑ImagePath键

"D:\javaenv\mysql5.6\3309\bin\mysqld.exe" --defaults-file="D:\javaenv\mysql5.6\3309\my.ini" MySQL56-3309

启动时按对应的启动文件启动。

服务中启动这两个服务。两个MYSQL就可以同时运行了。

主从复制配置

必须两个MYSQL的版本一致。配置主从后,从库不要变更数据、结构等,容易造成异常,导致不能再同步数据。

主Master 3308,从Slave 3309

停掉服务。

service-id

3308 my.ini 126行 server-id=1

3309 my.ini 126行 server-id=2

开启二进制日志记录,这样才可以实现主从复制:

在 3308 my.ini 最后加:

log-bin=mysql-bin		#启用二进制日志;

启动3308

SHOW MASTER STATUS;	查看MASTER状态(注意这两个值)

启动3309

执行下面配置语句,注意master_log_file和master_log_pos就是上面值。如果发生异常,重新启动slave时,就可以按此配置。

CHANGE MASTER TO MASTER_HOST='localhost', MASTER_PORT=3308, MASTER_USER='root',MASTER_PASSWORD='root',
	master_log_file='mysql-bin.000007', 
	master_log_pos=609;

启动从服务

START SLAVE;
SHOW SLAVE STATUS		查看SLAVE状态

如果出错,可以看后面的错误信息。如果正常,上面两个都应该是YES。这样当主库创建数据库、创建表、插入数据。从库都会立刻同步。这样就实现了主从复制。

 

常见错误

错误:提示uuid重复:

由于data拷贝是全目录拷贝,将auto.cnf也拷贝,它里面记录了对数据库的一个uuid标识,随便产生个新的uuid,替换掉新目录中的auto.cnf中的uuid串即可。

可以用select uuid()来产生新值,手工黏贴到auto.cnf文件中。

 

错误:error connecting to master 'forslave@localhost:3308' - retry-time: 60  retries: 1

权限不够。

错误:Error 'Table 'jtdb.a' doesn't exist' on query. Default database: ''. Query: 'insert into `jtdb`.`a`(`a`) values ( '123')'

故障造成从库不能同步。

停止从库stop slave;然后SHOW MASTER STATUS;查询主库的文件和位置,更新配置

CHANGE MASTER TO MASTER_HOST='localhost', MASTER_PORT=3308, MASTER_USER='root',MASTER_PASSWORD='root',
	MASTER_LOG_FILE='mysql-bin.000007', 

MASTER_LOG_POS=609;(按主库的当前文件和位置)

猜你喜欢

转载自blog.csdn.net/qq_40680190/article/details/84073462