建设厅网站修改密码,作业3 主题资源网站建设,网站开发 私活,网站建设第一步怎么弄MySQL主从复制和读写分离相关知识 1.什么是读写分离
读写分离#xff0c;基本的原理是让主数据库处理事务性增、改、删操作( INSERT、UPDATE、DELETE) #xff0c;而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 2.为什么要… MySQL主从复制和读写分离相关知识 1.什么是读写分离
读写分离基本的原理是让主数据库处理事务性增、改、删操作( INSERT、UPDATE、DELETE) 而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 2.为什么要读写分离
1.数据库在写入数据的时候比较耗时10000条数据 大概要4分钟
2.数据库在读写的时候速度很快10000条 大概5 秒左右
读写分离之后数据的写入和读取是分开的哪怕写入的数据量比较大但是不影响查询的效率 3.什么场景下需要读写分离
数据库不是一定需要读写分离。只是在某些程序在使用数据库过程中更新少但是查询较多这种情况可以考虑读写分离。
生产库一般都会做读写分离。
测试库一般不管。
在工作中数据库的读写不会在同一个库中完成这样既不安全也不能满足高可用也不能实现高并发。工作中都会做读写分离。 4.主从复制的优点 数据分布通过复制将数据分布到不同地理位置 负载均衡读写分离以及将读负载到多台从库 备份可作为实时备份 高可用性利用主主复制实现高可用
5. mysql支持的复制类型
1 STATEMENT基于语句的复制。在服务器上执行sql语句在从服务器上执行同样的语句mysql默认采用基于语句的复制5.7版本之前执行效率高。高并发的情况可能会出现执行顺序的误差事务的死锁。
2ROW基于行的复制。把改变的内容复制过去而不是把命令在从服务器上执行一 遍。精确但效率低保存的文件会更大。5.7版本之后默认采用ROW模式
3MIXED混合类型的复制。默认采用基于语句的复制一旦发现基于语句无法精确复制时就会采用基于行的复制。更智能所以大部分情况下使用MIXED。
三者区别
1.STATEMENT基于sql高并发会导致数据丢失顺序有误
2.ROW基于行精准匹配但恢复数据时效率低
3.MIXED一般情况用sql高并发自动切换row 6.mysql主从复制的过程
主从复制基于主mysql服务器和从mysql服务器的三个线程和两个日志展开进行的
两个日志二进制日志bin log 、中继日志Relay log
三个线程I/O线程、dump线程、SQL线程 7.主从复制的工作过程
1、 主节点的数据记录发生变化都会记录在二进制日志
2、 slave节点会在一定时间内对主库的二进制文件进行探测。探测是否发生变化。如果有变化从库会开启一个IO的线程。请求主库的二进制事件。
3、 主库会给每一个I/O的线程启动一个dump线程用于发送二进制事件给从库。从库通过I/O线程获取跟新slave_sql负责将更新写入到从库本地实现主从一致。 8.主从复制的问题
1、 只能在主库上发生变化然后同步到从。从库的更新不会同步到主
2、复制的过程是串行化过程在从库上复制是串行的。主库的并行更新不能在从库上并行操作。
3、 主从复制的设计目的就是为了在主库上写在从库上查。读写分离实现高可用。 MySQL主从复制的模式 1.异步复制
MySQL的默认复制就算异步复制。只要执行完之后客户端提交事务主MySQL会立即把结果返回给服务器主MySQL并不关心从MySQL是否已经接受并且处理。
异步不用等待返回结果udp
主一旦崩溃主MySQL的事务可能没有传到从MySQL这个时候强行把从提升为主可能到新的主MySQL数据不完整很少见
2.全同步复制
主库执行完成一个事务所有的从库都执行了该事务之后才会返回客户端。因为需要等待所有从库全部执行完成性能必然下降。对数据一致性和数据完整要求很好的场景
3.半同步复制
介于异步复制和全同步复制之间。主库执行完一个客户端提交的事务之后至少等待一个从库接受并处理完成之后才会返回给客户端。半同步在一定程度上提高了数据的安全性。也会有一定的延迟。
这个延迟一般是一个tcp/ip的往返时间从发送到接受的时间单位是毫秒。半同步复制最好在电视的网络中使用。
时间1msround-trip-time RTT 如何实现主从复制 mysql 1 主 20.0.0.100
MySQL 2 从 20.0.0.110
MySQL 3 从 20.0.0.10
test1 读写分离的服务器 20.0.0.140
test2 客户端关闭防火墙
systemctl stop firewalld
setenforce 0MySQL1
yum -y install ntp
vim /etc/ntp.conf末
server 127.127.233.0
fudge 127.127.233.0 stratum 8
//数字越小。时间精确度越高。设置fudge 8时间层级是8最高为15设在中间即可从本地获取时间源同步不从网络获取systemctl restart ntpd
mysql2,3
systemctl restart ntpdmysql2,3
/usr/sbin/ntodate 192.168.233.21crontab -e -u root
*/30 * * * * /usr/sbin/ntpdate 192.168.233.21date 查看时间MySQL1
vim /etc/my.cnfserver-id 1
log-binmaster-bin
//打开二进制日志
binlog_formatMIXED
//处理方式
log_slave-updatestrue
//允许从服务器复制数据时可以从主的二进制日志写到自己的二进制日止当中
wqsystemctl restart mysqldmysql -uroot -p123456
grant replication slave on *.* to mysqlslave20.0.0.% identified by 123456;flush privilieges;show master status;从库MySQL2
vim /etc/my.cnf
server-id 2
relay-logrelay-log-bin
relay-log-indexslave-relay-bin.index
// 设置索引文件
relay_log_recovery1
//默认是01开启中继日志的护肤从服务器出现异常或者崩溃时systemctl restart mysqldmysql3
vim /etc/my.cnf
server-id 3
relay-logrelay-log-bin
relay-log-indexslave-relay-bin.index
relay_log_recovery1
wq
systemctl restart mysqldmysql2
mysql -uroot -p123456CHANGE master to master_host20.0.0.100,master_usermyslave,master_password123456,master_log_filemaster-bin.000001,master_log_pos599;
//同步start slave;
show slave status\G;mysql3
mysql -u root -p 123456CHANGE master to master_host20.0.0.100,master_usermyslave,master_password123456,master_log_filemaster-bin.000001,master_log_pos599;
//同步
start slave;打开终端
MySQL1
create database kgcMySQL23查看是否有kgc的库MySQL1
create table test ();
给表插入数据
Slave_IO_Running:Yes 负责和主库的IO通信
//位置偏移量不对防火墙没关配置文件不对
Slave SQL Running:Yes
//负责自己的slave MySQL进程 slave io running no 的原因
1.网络问题
2.my.cnf 配置文件写错了
3.CHANGE master to master_host192.168.233.21,master_usermyslave,master_password123456,master_log_filemaster-bin.000001,master_log_pos604; 文件名写错了位置偏移量不对
4.防火墙和安全机制的问题
**位置偏移量要和主服务器上 show master status;中内容一致 主从复制延迟的问题
1.网络延迟
2.主从硬件设备CPU主频内存I/O硬件I/O
3.同步复制而不是异步复制 解决方案
1.硬件方面主库一般来说不需要动的太多从库的硬件配置变更好。提升随机写的性能硬盘可以考虑缓存固态。升级cpu的核数扩展一下内存。尽量使用物理机不要使用云服务器。四核8G硬盘
2.网络层面主从服务器都配置在一个局域网内尽量避免跨网段跨机房。
架构方面做读写分离把写入控制在主库从库负责读降低从库的压力
4.配置方面mysql配置从配置文件的角度实现性能最大化 追求安全性配置
innodb flush_log_at_trx_commit1
//每次啊hi去提交时都会刷新事务日志已确保持久性最高级别的数据安全性但是会影响性能默认是1
0 就是事务提交是不会立即刷新而是每秒刷新。可以提高性能但是发送故障会导致数据丢失
2 事务提交时事务日志不会写入硬盘而是保存在系统缓存不会进行刷新一定的安全性和性能内存要求比较高。
sunc_binlog1
1 也是默认值每次提交事务之后直接把二进制刷新到硬盘以确保日志的持久性占用比较高的性能但是安全 0 二进制日志写入缓存也不会刷新日志文件。故障发送也会发发 读写分离配置 要实现读写分离首先必须要实现主从复制。 读写分离所有的写入操作都在主库从库只负责读。select。如果有更新是从主库复制到从库。 Mysql读写分离的原理
1.根据脚本实现。在代码中实现路由分类。select insert进行路由分类。这种方式是最多的。
特点性能号在代码中就能实现不需要额外的硬件设备
缺点门槛高开发实现。如果大型的复制的应用设计改动的代码非常多。 2.基于中间层代理实现
mysql-proxy自带的开源项目。基于自带的lua脚本不是现成的要自己写不熟悉他的内置变量是写不出来的 atlas 360内部自己使用的代理工具。每天的读写请求承载量可以到几十亿条支持事务支持存储过程
Amoeba 陈思儒之前在阿里就职。是由java开发的一个开源软件不支持事务也不支持存储过程。但是Amoeba也是用的最广
mycat也可以实现
安装部署mycat
1主机上安装javamycat基于java
#yum安装java
[rootlocalhost ~]#yum install java -y
#确认安装成功
[rootlocalhost ~]#java -version
openjdk version 1.8.0_131
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)2切换至opt目录下载mycat安装包
[rootlocalhost ~]#cd /opt
[rootlocalhost ~]#wget http://dl.mycat.org.cn/1.6.7.6/20210303094759/Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz3创建/apps文件夹并解压mycat包至/apps下
[rootlocalhost ~]#mkdir /apps
[rootlocalhost ~]#tar zxvf Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz -C /apps/4设置变量环境
[rootlocalhost ~]#echo PATH/apps/mycat/bin:$PATH /etc/profile.d/mycat.sh
[rootlocalhost ~]#source /etc/profile.d/mycat.sh5启动mycat查看日志文件最后可以看到启动成功
[rootlocalhost ~]#mycat start
#注意内存小于2G 起不来
Starting Mycat-server...[rootlocalhost ~]#tail -f /apps/mycat/logs/wrapper.log
#启动成功日志末尾会出现successfully
STATUS | wrapper | 2021/12/09 21:04:10 | -- Wrapper Started as Daemon
STATUS | wrapper | 2021/12/09 21:04:10 | Launching a JVM...
INFO | jvm 1 | 2021/12/09 21:04:11 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
INFO | jvm 1 | 2021/12/09 21:04:11 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
INFO | jvm 1 | 2021/12/09 21:04:11 |
INFO | jvm 1 | 2021/12/09 21:04:12 | MyCAT Server startup successfully. see logs in logs/mycat.log(6)客户端连接数据库
#这里密码初始为123456 需要加端口
[rootlocalhost bin]#mysql -uroot -p123456 -h 192.168.59.114 -P8066 修改 mycat 配置文件 /apps/mycat/conf/server.xml
[rootlocalhost ~]#vim /apps/mycat/conf/server.xml#去掉44行行注释对应的在51行行末注释删除50行行末注释5 * 60 * 1000L; //连接空 闲检查#修改45行端口号为3306
45 property nameserverPort3306/property#配置Mycat的连接信息(账号密码)在110 和111行 可以修改这边不修改了 修改 mycat 配置文件/apps/mycat/conf/schema.xml
[rootlocalhost ~]#vim /apps/mycat/conf/schema.xml
#删除所有内容重新写入以下
?xml version1.0?
!DOCTYPE mycat:schema SYSTEM schema.dtd
mycat:schema xmlns:mycathttp://io.mycat/schema nameTESTDB checkSQLschemafalse sqlMaxLimit100 dataNodedn1#schema标签数据库设置此数据库为逻辑数据库name与server.xml中schema对应。#name:逻辑数据库名与server.xml中的schema对应#checkSQLschema: 数据库前缀相关设置这里为false#sqlMaxLimit: select时默认的limit避免查询全表否则可能会遇到查询量特别大的情况造成卡 死#dataNode:表存储到哪些节点多个节点用逗号分隔。节点为下文dataNode设置的name
/schemadataNode namedn1 dataHostlocalhost1 databasehellodb /#dataNode标签: 定义mycat中的数据节点也是通常说的数据分片也就是分库相关配置#name: 定义数据节点的名字与table中dataNode对应#datahost: 物理数据库名与datahost中name对应该属性用于定义该分片属于哪个数据库实例#database: 物理数据库中数据库名该属性用于定义该分片属性哪个具体数据库实例上的具体库dataHost namelocalhost1 maxCon1000 minCon10 balance1#dataHost标签 物理数据库真正存储数据的数据库#name: 物理数据库名与dataNode中dataHost对应#maxCon属性指定每个读写实例连接池的最大连接。也就是说标签内嵌套的writeHost、readHost标 签都会使用这个属性的值来实例化出连接池的最大连接数#minCon属性指定每个读写实例连接池的最小连接初始化连接池的大小#balance: 均衡负载的方式writeType0 dbTypemysql dbDrivernative switchType1 slaveThreshold100#writeType: 写入方式#dbType: 数据库类型#dbDriver指定连接后端数据库使用的 Driver目前可选的值有 native 和 JDBC。用 native 的话因为这个值执行的是二进制的 mysql 协议所以可以使用 mysql 和maridb。其他类型的数据库则需要使用 JDBC 驱动来支持。#switchType: “-1” 表示不自动切换 “1” 默认值自动切换 “2” 基于 MySQL主从同步的状态决定是否切换心跳语句为 show slave status “3” 基于 MySQL galary cluster 的切换机制适合集群1.4.1心跳语句为 show status like ‘wsrep%’.heartbeatselect user()/heartbeat#heartbeat: 心跳检测语句注意语句结尾的分号要加writeHost hosthost1 url192.168.59.113:3306 userroot password123456#host用于标识不同实例一般 writeHost 我们使用*M1readHost 我们用*S1。#url后端实例连接地址。Native地址端口 JDBCjdbc的url#user后端存储实例需要的用户名字#password:后端存储实例需要的密码readHost hosthost2 url192.168.59.112:3306 userroot password123456//writeHost/dataHost
/mycat:schema dataNode name主服务器的主机名
database指定主服务器的数据库名
writeHost hosthost1 url主服务器的IP
readHost hosthost1 url从服务器的IP 主服务器上授权
[rootlocalhost ~]#mysql -uroot -p123123
#授权
GRANT ALL ON *.* TO root192.168.59.% IDENTIFIED BY 123456;
flush privileges;#查看创建成功
use mysql;
select user,host from user;
GRANT ALL ON *.* TO root192.168.59.% IDENTIFIED BY 123456;
flush privileges;
此处一定要刷新权限否则接下来配置无法成功启动 重启mycat服务客户机连接mycat
在mycat服务器上重启mycat服务,查看启动日志文末出现successfully[rootlocalhost ~]#mycat restart [rootlocalhost ~]#tail -f /apps/mycat/logs/wrapper.logINFO | jvm 1 | 2021/12/09 21:15:40 |
INFO | jvm 1 | 2021/12/09 21:15:40 | MyCAT Server startup successfully. see logs in logs/mycat.log
STATUS | wrapper | 2021/12/09 21:16:38 | TERM trapped. Shutting down.
STATUS | wrapper | 2021/12/09 21:16:39 | -- Wrapper Stopped
STATUS | wrapper | 2021/12/09 21:16:40 | -- Wrapper Started as Daemon
STATUS | wrapper | 2021/12/09 21:16:40 | Launching a JVM...
INFO | jvm 1 | 2021/12/09 21:16:40 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
INFO | jvm 1 | 2021/12/09 21:16:40 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
INFO | jvm 1 | 2021/12/09 21:16:40 |
INFO | jvm 1 | 2021/12/09 21:16:41 | MyCAT Server startup successfully. see logs in logs/mycat.l
查看3306端口可以监听到主从服务器
ss -antp|grep 3306
此处必须得是 user:((java.......))
才算成功。同时如果本机有mysql一定得关闭mysql服务否则会因为端口被占从而服务搭建失败 在客户机上登录mycat这时可以不加端口直接进入数据库了 如何实现完全同步 完全同步其实就是主主同步。