分库分表就是把数据打散,减小单库的压力
主从为了读写分离,大部分读多写少,单纯的主从的单一从多,
分库分表 主多从多
show slave status;为空 意味着不是从库,是不是主库不知道
show master status;
例如 91:3301 和 91:3308作为主库
#无限扩充的架构(数据库)
##大网站数据库会遇到什么问题
**大网站的大指什么?**
数据量大
访问量高
**两者必然有联系吗?**
博客、新闻
抢购、社交
**如何处理才能无限扩充?**
只需要运维添加机器和设备,软件架构不用修改
**单机性能**
提高机器性能
换用更强大的db类型
**无限扩充**
分表:纵向与横向分表
分表:业务分库与数据分库
扩充:只需要添加数据库与表的数量
讨论:如何无缝过渡扩充?
分散访问:多库读取
集中写入:数据一致性
多主库:写入比访问多的场景
扩充:只需要添加从库机器
讨论:写入过多在业务上如何处理?
#MySql的binlog与备份还原
##多实例运行
多个端口 mysqld_multi
步骤:
配置 mysqld_multi.cnf
~~~
/var/lib/mysql56/bin/mysqld_multi ‐‐defaults‐extra‐file=/etc/my_multi.cnf report
/var/lib/mysql56/bin/mysqld_multi ‐‐defaults‐extra‐file=/etc/my_multi.cnf start ‐‐log=./test.log
~~~
##binlog作用
**数据恢复**
**主从同步**
**log-bin
log-slave-updates**
##binlog限制
性能慢1%
loaddata不能恢复
##MySQL启用binlog
##启用binlog
my.cnf 添加 log_bin = mysql_bin
其他参数:
max_binlog_size 分割文件,但一个事物不会写入2个日志文件 binlog-do-db、binlog-ignore-db 选择特定数据库写入binlog
##查看是否启用
a) 查看数据文件,mysql-bin.index
b) mysql> show global variables like 'sql_log_bin';
##MySQL处理binlog
###sql查看
~~~
mysql> show binlog events in ‘mysql-bin.000002’;
~~~
###mysqlbinlog查看
~~~
mysqlbinlog mysql-bin.000006 --start-position=120 --stop-position=280
mysqlbinlog mysql-bin.000006 --start-datetime='2014-7-2 8:10:00' --stop-
datetime='2014-07-03 00:00:00’
~~~
###处理binlog
~~~
mysql> flush logs; 产生新的binlog文件,什么情况下使用?
mysql> reset master; 重置binlog,会删除所有的binlog
mysql> PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 2 DAY); 删除指定
~~~
##利用binlog恢复数据库
###恢复流程
禁用binlog(为什么) -> 利用mysqlbinlog导出恢复(管道或文件) -> 启用binlog mysql> set global sql_log_bin=0
在新的会话中,才生效,当前会话不生效
###增量恢复场景
恢复全备 -> 确定恢复点 -> 导入binlog到指定时间或位置
###删除数据恢复场景
恢复全备 -> 查找删除位置 -> 导入binlog到删除位置前 -> 从删除位置后恢复余下的
###乱码问题及解决方案
大多数情况下,binlog 直接导出成 SQL 语句文件,再入库即可 但是在有中文字符的情况下,会出错。
办法:
1、set global sql_log_bin=0 先关闭 binlog 写入。
2、得到想要用的 SQL 语句
mysql -uroot -S /tmp/mysql_3303.sock -e "show binlog events in 'mysql- bin.000002'"|cut -f 6 > quanzhan.sql
3、去掉前面两行,Info 和 Server ver: 5.6.20-log, Binlog ver: 4
4、再 cat quanzhan.sql |awk '{printf "%s;\n",$0}' > quanzhan.sql.ok 这样为每个 SQL 语句最后都加上了 ; 号
5、再导入
mysql -uroot -S /tmp/mysql_3303.sock --default-character-set=utf8 < quanzhan.sql.ok 这样可以完成恢复。
###通过 mysqldump 导出备份
注意 mysqldump 会锁表,当然可以加 参数消除锁 mysqldump备份不锁表:加上--lock-tables=false参数,如果是innodb,则加上--single- transcation比较好。
但是?
在备份时,不仅仅备份,留下当时的时间点和状态点
~~~
mysql -uroot -S /tmp/mysql_3303.sock -e "stop slave; show slave status\G" > status.txt mysqldump --single-transaction --flush-logs --master-data=2 -uroot -S /var/lib/mysql56/data/mysql.sock -d quanzhan -p
~~~
###数据恢复场景
恢复适合的地方,出了问题重建
还原做扩容
做切库
#单主多从架构实践
##主从配置步骤
###所有服务器启用binlog,配置server-id, 在my.cnf 中开启 log-bin
###主库创建同步账号,配置同步位置
~~~
grant ALL PRIVILEGES on db.* to ‘user’@‘ip' identified by ‘ pass' with grant option;
~~~
###从库设置同步信息,启用从库,并查看同步状态
~~~
CHANGE MASTER TO XXX
~~~
###测试数据库,注意防火墙
###程序需要处理的问题:数据同步有时间差!!!
##主从配置
###所有服务器
启用binlog,配置文件设置log-bin=mysql_bin
每台服务器设置server-id,所有机器不能重复 配置文件里设置server-id=1,2,3....
###主库
创建同步账号:
`GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* to repl@'%' IDENTIFIED by 'replpass';`
记录同步位置:
`show master status;` 记下File和Position,从库从这个位置开始同步
###创建同步账号:
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* to repl@'%' IDENTIFIED by 'replpass';
记录同步位置:
show master status; 记下File和Position,从库从这个位置开始同步
###每台从库
设置同步信息:
`change master to master_host='192.168.2.110', master_user='repl', master_password='replpass',MASTER_LOG_FILE='mysql- bin.000003',MASTER_LOG_POS=338;`
启用同步:
`start slave;`
查看同步状态(Slave_IO_Running和Slave_SQL_Running都为yes即正常):
`show slave status\G`
###从库再做主库
1、从库再做主库,可以做扩容
2、可以更大规模地扩充节点
3、开启 log_slave_updates
###切库扩容
1、第一步,规划好扩容,要分成几组
2、第二步,通过备份,恢复数据库
3、第三步,导入备份的修改时间节点,导入数据
4、第四步,同步数据,跟上数据库
5、第五步,修改配置库
6、第六步,重新加载配置
###数据测试
在主库写入数据,查看每个从库的数据有没有同步过来
如果同步状态有问题,注意防火墙,打开3306等端口
注意通过show slave status 、show master status 查看状态
#多主多从
![](https://box.kancloud.cn/2016-05-12_5733fe835e08b.png)
##环形多点配置(node A)
![](https://box.kancloud.cn/2016-05-12_5733fe8397c25.png)
~~~
# node A - water
[mysqld]
server-id = 10 log-bin = mysql-bin log-slave-updates replicate-same-server-id auto_increment_increment auto_increment_offset
master-host
master-user
master-password
report-host
= 0
= 10
= 1
= earth.stardata.it = nodeAuser
# node D
= nodeApass = nodeA
~~~
##环形多点配置(node B)
~~~
# Node B - air
[mysqld]
server-id = 20 log-bin = mysql-bin log-slave-updates replicate-same-server-id auto_increment_increment auto_increment_offset
master-host
master-user
master-password
report-host
= 0
= 10
= 2
= water.stardata.it = nodeBuser
# node A
= nodeBpass = nodeB
~~~
##环形多点特点
###优点:
适合写入量特别大的情况
服务器均衡压力
故障处理简单,只需要当机的下一个环点切换到上一个环点,不影响其他机器
###缺点
机器多时,同步时间慢
只适合少部分情况,大部分网站都是读取为主的
![](https://box.kancloud.cn/2016-05-12_5733fe83d0eea.png)
- SWOOLE及php网络编程
- LNMP架构与Socket,http协议
- 如何高效学习
- 开发工具箱
- 编写高效的js
- js闭包编写全功能的购物车
- JSON和JSONP
- 多级分类的开发与应用
- 设计安全的登录注册流程
- 前端性能优化
- 前端架构优化
- 使用第三方云服务加速产品开发
- 移动互联网之API开发
- php分层
- 全文检索的实践与部署
- webIM的原理及前后端实现
- 如何配置高效的数据库以及MySQL的代码及插件开发
- NoSql.队列,任务队列
- 构建本机缓存,构建分布式缓存池
- 数据库分库分表的设计
- Nginx原理及模块开发初步
- 无限扩充的数据库架构
- php构建分库分表分布式数据库连接池
- 静态文件上传、分布式存储与分发
- MySQL Cluster,Proxy分析与实践
- 架构解密