php数据库主从分离 php数据库主从分离怎么用

mysql 如何实现读写分离,用mysql-proxy 或者直接用php连接两个数据库?Mysql主从配置,实现读写分离
原理:主服务器(Master)负责网站NonQuery操作,从服务器负责Query操作,用户可以根据网站功能模特性块固定访问Slave服务器,或者自己写个池或队列,自由为请求分配从服务器连接 。主从服务器利用MySQL的二进制日志文件,实现数据同步 。二进制日志由主服务器产生,从服务器响应获取同步数据库 。
具体实现:
1、在主从服务器上都装上MySQL数据库,windows系统鄙人安装的是mysql_5.5.25.msi版本,Ubuntu安装的是mysql-5.6.22-linux-glibc2.5-i686.tar
windows安装mysql就不谈了,一般地球人都应该会 。鄙人稍微说一下Ubuntu的MySQL安装,我建议不要在线下载安装,还是离线安装的好 。大家可以参考这位不知道大哥还是姐妹,写的挺好按照这个就能装上 。在安装的时候可能会出现几种现象,大家可以参考解决一下:
(1)如果您不是使用root用户登录,建议 su - root 切换到Root用户安装 , 那就不用老是 sudo 了 。
(2)存放解压的mysql 文件夹,文件夹名字最好改成mysql
(3)在./support-files/mysql.server start 启动MySQL的时候 , 可能会出现一个警告,中文意思是启动服务运行读文件时,忽略了my.cnf文件,那是因为my.cnf的文件权限有问题,mysql会认为该文件有危险不会执行 。但是mysql还会启动成功,但如果下面配置从服务器参数修改my.cnf文件的时候,你会发现文件改过了,但是重启服务时,修改过后的配置没有执行,而且您 list一下mysql的文件夹下会发现很多.my.cnf.swp等中间文件 。这都是因为MySQL启动时没有读取my.cnf的原因 。这时只要将my.cnf的文件权限改成my_new.cnf的权限一样就Ok,命令:chmod 644 my.cnf就Ok
(4)Ubuntu中修改文档内容没有Vim , 最好把Vim 装上,apt-get install vim,不然估计会抓狂 。
这时候我相信MySQL应该安装上去了 。
2、配置Master主服务器
(1)在Master MySQL上创建一个用户‘repl’ , 并允许其他Slave服务器可以通过远程访问Master , 通过该用户读取二进制日志,实现数据同步 。
请教关于PHP学习的问题/**
@你这样的情况很普遍的,PHP入门很快也很简单,本身PHP适合做产品 , 不是适合技术研究 。
@我的建议你不要过多的去研究PHP本身的一些东西,你很难研究出一些什么东西 。比如:
@.str_split()这个函数你只需要了解,一些用法就够了 , 没必要去研究更深的东西 。
@我认为你现在应该,去研究PHP一些开源的产品,比如dedecms,phpcms,还有框架 。你知道什么是MVC,CBD架构 , ORM,AOP 。。。(如果觉得陌生,抱歉你算不上真正学习PHP) 。
@你肯定的写过简单的留言板是吧? 你加入会话控制没?验证码 , ajax , 完全oop了没?用了PHP模板?可以生成静态的吗?有没有封装成安装程序没 。。。。
@其次mysql你真正了解多少?你就会CURD的吗?数据库主从分离,读写分离,多表查询,多表优化,你懂多少?
@html , css,js , xml你会多少? jquery会用吗?太多了 。
小兄弟你学习的路很长,学完上面至少半年 。
你不知道,学习PHP去干嘛时候 , 说明你还没有入门 , 只是个门外汉 。想解决你的烦恼 , 只有继续坚持下去,最怕的是半途而废,多去独立思考,多去实践 。
*/
?php
echo '踏实比努力更重要!';
PHP中高级面试题 – 第三天一、简述一下MongoDB的应用场景
mongodb 支持副本集、索引、自动分片,可以保证较高的性能和可用性 。
更高的写入负载
默认情况下,MongoDB 更侧重高数据写入性能 , 而非事务安全 , MongoDB 很适合业务系统中有大量 “低价值” 数据的场景 。但是应当避免在高事务安全性的系统中使用 MongoDB,除非能从架构设计上保证事务安全 。
高可用性
MongoDB 的复副集 (Master-Slave) 配置非常简洁方便 , 此外,MongoDB 可以快速响应的处理单节点故障,自动、安全地完成故障转移 。这些特性使得 MongoDB 能在一个相对不稳定(如云主机)的环境中,保持高可用性 。
【php数据库主从分离 php数据库主从分离怎么用】数据量很大或者未来会变得很大
依赖数据库 (MySQL) 自身的特性,完成数据的扩展是较困难的事 , 在 MySQL 中 , 当一个单达表到 5-10GB 时会出现明显的性能降级 , 此时需要通过数据的水平和垂直拆分、库的拆分完成扩展,使用 MySQL 通常需要借助驱动层或代理层完成这类需求 。而 MongoDB 内建php数据库主从分离了多种数据分片的特性 , 可以很好地适应大数据量的需求 。
基于位置的数据查询
MongoDB 支持二维空间索引,因此可以快速及精确地从指定位置获取数据 。
表结构不明确
在一些传统 RDBMS 中 , 增加一个字段会锁住整个数据库 / 表,或者在执行一个重负载的请求时会明显造成其它请求的性能降级 。通常发生在数据表大于 1G 的时候(当大于 1TB 时更甚) 。因 MongoDB 是文档型数据库,为非结构货的文档增加一个新字段是很快速的操作,并且不会影响到已有数据 。另外一个好处当业务数据发生变化时 , 是将不再需要由 DBA 修改表结构 。
二、数据库设计经验,为什么进行分表?分库?一般多少数据量开始分表?分库?分库分表的目的?
1、为什么要分表
当一张表的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,有可能会死在那儿了 。分表的目的就在于此 , 减小数据库的负担,缩短查询时间 。日常开发中php数据库主从分离我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表 。这样的表过于庞大,导致数据库在查询和插入的时候耗时太长 , 性能低下 , 如果涉及联合查询的情况,性能会更加糟糕 。
分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率 。数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展 , 库中的表会越来越多 , 表中的数据量也会越来越大 , 相应地,数据操作,增删改查的开销也会越来越大;另外,由于无法进行分布式式部署,而一台服务器的资源(CPU、磁盘、内存、IO 等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈 。
2、分表的方案
做 mysql 集群 , 有人会问 mysql 集群,根分表有什么关系吗?虽然它不是实际意义上的分表 , 但是它启到了分表的作用,做集群的意义是什么呢?为一个数据库减轻负担 , 说白了就是减少 sql 排队队列中的 sql 的数量,举个例子:有 10 个 sql 请求,如果放在一个数据库服务器的排队队列中,他要等很长时间,如果把这 10 个 sql 请求,分配到 5 个数据库服务器的排队队列中,一个数据库服务器的队列中只有 2 个,这样等待时间是不是大大的缩短了呢?
linux mysql proxy 的安装 , 配置 , 以及读写分离
mysql replication 互为主从的安装及配置 , 以及数据同步
优点:扩展性好,没有多个分表后的复杂操作(php 代码)
缺点:单个表的数据量还是没有变,一次操作所花的时间还是那么多,硬件开销大 。
三、简述一下数据库主从复制,读写分离
* 什么是主从复制
主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;
* 主从复制的原理:
1.数据库有个bin-log二进制文件,记录了所有的sql语句 。
2.只需要把主数据库的bin-log文件中的sql语句复制 。
3.让其从数据的relay-log重做日志文件中再执行一次这些sql语句即可 。
* 主从复制的作用
1.做数据的热备份,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失 。
2.架构的扩展 。业务量越来越大 , I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问频率,提高单机的I/O性能
3.主从复制是读写分离的基础,使数据库能制成更大 的并发 。例如子报表中,由于部署报表的sql语句十分慢 , 导致锁表,影响前台的服务 。如果前台服务使用master,报表使用slave,那么报表sql将不会造成前台所,保证了前台的访问速度 。
* 主从复制的几种方式:
1.同步复制:所谓的同步复制,意思是master的变化,必须等待slave-1,slave-2,…,slave-n完成后才能返回 。
2.异步复制:如同AJAX请求一样 。master只需要完成自己的数据库操作即可 。至于slaves是否收到二进制日志,是否完成操作,不用关心 。MYSQL的默认设置 。
3.半同步复制:master只保证slaves中的一个操作成功,就返回,其他slave不管 。
这个功能,是由google为MYSQL引入的 。
* 关于读写分离
在完成主从复制时,由于slave是需要同步master的 。所以对于insert/delete/update这些更新数据库的操作,应该在master中完成 。而select的查询操作,则落下到slave中 。
PHP 数据库设计,用户表数据量大该怎么优化有很多种方法可以优化:
数据库设置主从 , 进行读写分离php数据库主从分离;
数据分表,如按月份分表 , 需要统计数据就查总表php数据库主从分离;
优化查询语句,适当增加索引php数据库主从分离;
字段优化,对不常用或者没有必要php数据库主从分离的字段可以考虑放在另外一张表里,避免单表数据过大 , 字段过多 。
数据库读写分离如何保证主从一致性当我们的数据库压力主键变大的时候,我们会尝试增加一些从节点来分摊主节点的查询压力 。而一般来说,我们是用一主多从的结构来作为读写分离的基本结构 。
而一般来说我们有两种常用的方法来实现读且分离架构:
客户端直接分离
这种方式是由客户端,或者我们的微服务直接进行数据库的读写选择 。将读库选择路由到主库上进行,将查询路由到从主库上进行 。
这种方式的优点在于因为是直连所以性能比较高,但是需要由业务团队了解数据库的实例细节,当数据库做调整的时候就需要业务侧同步改造 。
使用数据中间件代理
这种方式是由一层代理层对数据的读写做分发,业务层将所有的请求都通过代理来实现 。
这种方式的优点在于对于业务层不需要感知到数据库的存在,但问题在于数据中间件的性能要求较高,还需要专人来进行优化和维护,整体架构较为复杂 。
但是我们发现 , 尽管这两种方式各有优劣 。但核心都是通过数据的写入、查询请求的路由而实现的 , 那么这就会引发标题的问题:
主备同步存在延迟,所以在延迟时间内对插入的内容进行查询则无法查询到最新提交的事务 。
那么如何保证主从一致性的问题 , 其实就变成了如何处理主从延迟的问题 。
根据项目的大?。哦拥墓婺R约爸骰牟渴鹉J?。我们处理问题的方法也有很多种 。
最简单强硬的就是强制读主库 。
一般情况下我们在不同的查询中会有不同程度的一致性要求 。我们可以将需要保证数据一致性的请求配置强制查询主库,而对于无强依赖的查询请求仍然查询备库 。
尽管这个方案不是很优雅,但是是最简单实现的方法 , 并且在Spring等框架的支持下一般只需要加一个注解就能实现 。但这个方法的问题也是显而易见的 , 如果存在大量的强一致性要求的查询语句,则相当于没有进行读写分离与扩展 。那么这种方法就会导致系统在数据库层面没有有效的扩展手段了 。
由于问题产生的来源是主从延迟,所以在下一次查询的时候进行一段时间的等待以弥补这种延迟即可 。
所以在进行主库的数据插入之后,让数据库数据连接或者对应的执行线程等待一段时间后返回 。通过等待时间来消化掉主从备份的延迟时间 。但是这个方法也有一些问题比如:这个等待时间一般是固定的 , 即便主从已经无延迟了也会继续等待到时间结束;如果在服务高峰时期,有可能数据在等待时间结束后仍然没有完成同步则仍然会存在一致性问题 。
但这种方法优雅的地方是可以配合业务来进行实现 , 举例来说当用户下单之后,通过下单送卷或者下单抽奖的方式从前端拖住用户,从而当用户在一次连续操作中再次查询自己订单的时候中间必然会间隔一定时间,也就让需要再次查询数据的时候保证了数据的一致性 。
上述两种方案看起来可能不那么“技术”,感觉有点投机取巧 。那么下面咱们可以分两种情况来讨论用更高技术的方法如何实现一致性 。
对于主从复制来说,是当主库完成一个事务后,通知给从库 , 当从库接受到后,则主库完成返回客户端 。所以当主库完成事务后,仅能确保从库已经接受到了,但是不能保证从库执行完成,也就是导致了主从备份延迟 。
但是从库执行数据是有进度的,而这个进度是可以通过show slave status语句中的seconds_behind_master来进行描述,这个参数描述从库落后了主库数据多少秒,当这个参数为0时,我们可以认为从库和主库已经基本上没有延迟了,那么这时候就可以查询请求 。
但seconds_behind_master是秒级的 , 所以只能大概地判断,由于精度较低,所以还是可能出现不一致的情况 。
如果要求精准执行的话 , 我们可以比较同步文件的执行记录 , 具体来说是:
所以当Relay_Master_Log_File和Exec_Master_Log_Pos和其一致的时候 , 就说明从库的已执行数据已经追上主库了,那么这时就可以说保证了主从一致性了
但是比较同步文件的执行记录方法的问题在于,如果当前的这个事务的binlog尚未传入到从库,即Master_Log_File和Read_Master_Log_Pos未更新,也就无法保证从库已经包含最新的主库事务了 。
而为了保证在一主一备的情况下,从库里一定接受到数据了 , 也就是Master_Log_File和Read_Master_Log_Pos中的数据是和主库一致的,我们可以开启semi-sync replication半同步复制 。
半同步复制的原理是在主库提交事务前先将binlog发送给从库,然后当从库接受后返回一个应答 , 主库只有在接受到这个应答之后才返回事务执行完成 。这样就可以保证从库的Master_Log_File和Read_Master_Log_Pos与主库是一致的,从而解决了主从一致的问题 。
半同步复制可以解决一主一备的情况,但是当一主多备的时候 , 只要主库接受到一个从库的应答,就会返回事务执行完成 。而这时当请求打到未完成同步的从库上时就会发生主从延迟 。
所以针对一主多备的情况,我们可以将目光集中在执行查询的从库上 , 即确保我们即将查询的备库已经执行了我们预期的事务 。那么我们的问题就变成两部分:1. 确认主库事务,2. 查询数据条件 。
确认主库事务
当我们提交完一个事务后,可以通过执行show master status来得到主库中的数据事务文件(File)和位置记录(Position) 。
查询数据条件
当我们要查询从库数据的时候 , 我们可以通过语句select master_pos_wait(File, Position, 1);来查询当前是否已经执行到了该记录(当返回值=0的时候说明已经执行过了) 。其中最后的数字1表示阻塞时长 。
通过先确认主库事务记录,再判确认备库是否已经执行了了主库对应的事务 。
但是可以发现,这种方法要求查询的时候知道主库的事务信息,对场景有很大的限制 。
主从一致的问题源自主从延迟,所以我们就是从如何消除延迟来解决问题 。简单点的方案我们可以不走备库、或者直接等待一段时间来忽略延迟的影响 。在一主一备的情况下我们可以粗力度的用seconds_behind_master来判断或者用Relay_Master_Log_File和Exec_Master_Log_Pos来判断 。而当一主多从的情况下我们则需要在查询前传入主库执行的事务记录才能保证数据一致性 。
可以看出,当数据规模和部署方式变更的时候,好的解决方案将会越来越多 。我认为根据实际业务情况选择最合适的方法才是最重要的 。
现在php技术要学习哪些内容?基础php数据库主从分离:搭建lamp环境php数据库主从分离,php语言(函数php数据库主从分离,结构 , 数据库Drivers)
中级php数据库主从分离:缓存(redis、memcache等),数据库设计(主从分离) , 服务器配置(linux系统学习、动静分离、负载均衡等)
高级php数据库主从分离:熟练运用各大框架(thinkphp、CI、YII、laravel等)建议:thinkphp最简单,可以由此入门
骨灰级:研究php语言核心,加入php核心团队 , 做文档,拓功能,推动php发展(膜拜鸟哥)
php数据库主从分离的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于php数据库主从分离怎么用、php数据库主从分离的信息别忘了在本站进行查找喔 。

    推荐阅读