第五天:MySQL主从复制+Amoeba读写分离
思考:
序号 |
知识点 |
类型 |
难度系数 |
掌握程度 |
|
读写分离使用mysql proxy/mycat/amoeba |
技术 |
1 |
熟练 |
|
主从复制、读写分离实现流程 |
论述 |
1 |
熟练 |
|
一主多从实现 |
技术 |
1 |
熟练 |
|
主从时,设置从为只读,会发生什么现象 |
技术 |
1 |
了解 |
|
代理实现分库分表、规则 |
技术 |
3 |
熟练 |
知识点:
序号 |
知识点 |
类型 |
难度系数 |
掌握程度 |
|
MySQL主从复制,主从配置实现 |
技能 |
1 |
熟练 |
|
MySQL读写分离 |
代码 |
1 |
熟练 |
|
Amoeba实现读写分离 |
代码 |
1 |
熟练 |
拓展作业:
序号 |
知识点 |
类型 |
难度系数 |
掌握程度 |
|
SpringAOP实现读写分离 |
代码 |
1 |
熟练 |
|
mycat实现读写分离 |
代码 |
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;(按主库的当前文件和位置)