十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
一.mysql主从库与读写分离的实现理论
目前创新互联已为超过千家的企业提供了网站建设、域名、网站空间、网站托管维护、企业网站设计、献县网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
二.mysql配置
1.准备两台服务器安装mysql(也可以在一台中装两个mysql修改端口号避免冲突)
2.分别连接mysql
3.配置mysql
1.配置主库 monster
打开binary log
2.配置从库
主库授权
账号repl后面的是从库的ip地址 mysql是账号repl的密码
刷新
后面master_log_pos=0 表示从零开始同步 master_log_file 是上面SHOW MASTER STATUS 下面的file文件
在从库中开启主从跟踪
查看从库状态
从库中终止主从同步 stop slave
查看 my.cnf 文件 把 server -id=1 的字段删除 保留server-id=2 修改后保存 重启mysql 重新连接 开启主从同步start slave
查看从库状态 发现没有错误 到此主从同步配置已经完成.
为了保障数据的安全与稳定性,我们常用数据库的主从复制与主主复制来实现。主从复制为从机实时拷贝一份主机的数据,当主机有数据变化时,从机的数据会跟着变,当从机数据有变化时,主机数据不变;同样地,主主复制就是,多个主机之间,只要有一个主机的数据变化了,其它主机数据也会跟着变化。
添加以下内容
如果你是使用我之前那种方式启动的MySQL,那么你只需要去你相关联的宿主机的配置文件夹里面去建立一个 my.cnf 然后写入上面的类容就好了。
比如:我的启动命令如下(不应该换行的,这里为了方便查看,我给它分行了)
那么我只需要在 /docker/mysql_master/conf 这个目录下创建 my.cnf 文件就好了。
这个命令是需要在容器里面执行的
docker重启mysql会关闭容器,我们需要重启容器。
确保在主服务器上 skip_networking 选项处于 OFF 关闭状态, 这是默认值。 如果是启用的,则从站无法与主站通信,并且复制失败。
我的命令如下
在从服务器配置连接到主服务器的相关信息 (在容器里面的mysql执行)
上面代码的xxxxx你需要换成你的IP,docker 查看容器 IP 的命令如下:
启动的那个从服务器的线程
测试的话,你可以在主服务器里面,创建一个数据库,发现从服务器里面也有了,就成功了。
如果你还想要一个从服务器,那么你只需要按照上面配置从服务器再配置一个就行了,新建的从服务器,会自动保存主服务器之前的数据。(测试结果) 如果你上面的主从复制搞定了,那么这个主主复制就很简单了。我们把上面的从服务器也改成主服务器
1)、修改上面的从服务器的my.cnf文件,和主服务器的一样(注意这个server-id不能一样)然后重启服务器 2)、在从服务器里面创建一个复制用户创建命令一样(这里修改一下用户名可以改为 repl2) 3)、在之前的主服务器里面运行下面这个代码
上面主要是教你怎么搭建一个MySQL集群,但是这里面还有很多其它的问题。也是我在学习过程中思考的问题,可能有的小伙伴上来看到文章长篇大论的看不下去,只想去实现这样一直集群功能,所以我就把问题写在下面了。
1)、MySQL的replication和pxc MySQL的集群方案有replication和pxc两种,上面是基于replication实现的。
replication: 异步复制,速度快,无法保证数据的一致性。 pxc: 同步复制,速度慢,多个集群之间是事务提交的数据一致性强。
2)、MySQL的replication数据同步的原理 我们在配置的时候开启了它的二进制日志,每次操作数据库的时候都会更新到这个日志里面去。主从通过同步这个日志来保证数据的一致性。
3)、可否不同步全部的数据 可以配置,同步哪些数据库,甚至是哪些表。
4)、怎么关闭和开始同步
5)、我就我的理解画出了,主从、主从从、主主、复制的图。
往期推荐:
利用Docker仅花1分钟时间安装好MySQL服务
Linux下MySQL 5.7的离线与在线安装(图文)
Linux下安装MySQL8.0(收藏!)
系统优化:假如现在用户反映系统太卡
1:如果是请求太多,判断web服务器压力过大,增加前端的web服务器,做负载均衡
2:如果请求静态页面不卡了,但是请求动态数据还是卡,说明MySQL处理的请求太多了,在应用层增加缓存
3:如果请求激增,还是有大量的查询到MySQL,想办法处理MySQL ,在一个应用中,大量的消耗MySQL的还是查询,就可以把MySQL拆开,就像公路分道 公交车道,小轿车道,把MySQL做成主从
1,就算MYSQL拆成了多个,也必须分出主和从,所有的写操作都必须要在主MYSQL 上完成;
2,所有的从MYSQL的数据都来自于(同步于)主MYSQL;
3,既然涉及到同步,那一定有延迟;有延迟,就一定可能在读的时候产生脏数据;所以,能够在从MYSQL上进行的读操作,一定对实时性和脏数据有一定容忍度的数据;比如,登陆日志,后台报表,首页统计信息来源;文章;资讯;SNS消息;
4,[注意]:在MYSQL主从时,如果一个业务(service中的一个方法)中,如果既有R操作,又有W操作,因为W操作一定要在主MYSQL上,所以在一个事务中所有的数据来源都只能来自于一个MYSQL
1,要完成主从同步,就必须让在Master上执行的所有的DML和DDL能够正确的在Salve上再执行一遍;MYSQL选择使用文件来记录SQL;
2,要完成主从同步,第一个事情就是把在主服务器上的bin-log(二进制文件)打开,bin-log文件就可以记录在MYSQL上执行的所有的DML+DDL+TCL;
3,MYSQL使用被动注册的方式来让从MYSQL请求同步主MYSQL的binlog;原因:被动请求的方式,主的MYSQL不需要知道有哪些从的MYSQL,我额外添加/去掉从MYSQL服务器,对主MYSQL服务器的正常运行没有任何影响;
4,第二步,从MYSQL后台一个线程发送一个请求,到主服务器请求更新数据;最重要的数据(我这次请求,请求你bin-log的哪一行数据之后的数据)
5,第三步,主MYSQL后台一个线程接收到从MYSQL发送的请求,然后读取bin-log文件中指定的内容,并放在从MYSQL的请求响应中;
6,第四步,从MYSQL的请求带回同步的数据,然后写在从MYSQL中的relay-log(重做日志)中;relay-log中记录的就是从主MYSQL中请求回来的哪些SQL数据;
7,第五步,从MYSQL后台一个线程专门用于从relay-log中读取同步回来的SQL,并写入到从MYSQL中,完成同步;
8,MYSQL的主从同步是经过高度优化的,性能非常高;