网站友情链接查询,网站首页设计有限公司,适合在家做的电商,设计师网站推荐家装主从复制#xff1a;主mysql的数据#xff0c;新增#xff0c;修改#xff0c;表里的数据都会同步到从mysql上
主从复制的模式#xff1a;
1 异步复制
mysql 的最常用的复制#xff0c;只要执行完#xff0c;客户端提交事务#xff0c;主mysql 会立即把结果返回给从…主从复制主mysql的数据新增修改表里的数据都会同步到从mysql上
主从复制的模式
1 异步复制
mysql 的最常用的复制只要执行完客户端提交事务主mysql 会立即把结果返回给从服务器主服务器并不关心从mysql是否接收是否处理主一旦崩溃主mysql的事务可能没有传到从MySQL,这个时候强行把从提升为主可能到新mysql的数据不完整
2全同步复制
主库完成一个事务所有的从库执行了该事物才会返回给客户端因为要等待所有从库全部执行完成性能必须下降适用于对数据一致性和数据完整性很好的场景
3 半同步复制
介于异步和全同步复制之后主库执行完一个客户端的事务之后至少等待一个库的接收完成之后才会返回给客户端半同步在一定程度上提高了数据的安全性也会有一定的延迟延迟一般是个tcp、IP的往返时间从发送到接收的时间单位是是毫秒半同步复制用在网络电视上时间1ms:round-trip time RTT 实验架构
主从复制 和读写分离
Mysql1 主192.168.233.21
Mysql2 从 192.168.233.22
Mysql3 从192.168.233.23
Test1读写分离的服务器 amoeba 192.168.233.10
Test5 客户端 192.168.233.20
#关闭防火墙和安全机制 systemctl stop firewalld setenforce 0 #设置主从服务器的时间同步工具 yum -y install ntp #主服务器上本地设置时钟源注意网段修改
#设置时间层级为8限制在15秒内
#数字越小表示时钟源越精确。通常 本地时钟源被设置为较高的 stratum 等级例如8以表示它不是通过网络获取的 而是本地的。 vim /etc/ntp.conf systemctl restart ntpd #从服务器设置 systemctl restart ntpd #2台从服务器分别指向源服务器 /usr/sbin/ntpdate 192.168.233.21 #2台从服务器分别新建一个定时任务 crontab -e -u root #3台主机的时间同时查看是否一致 date #主mysql主服务器开启二进制日志允许从服务器复制数据时可以从主的二进制写到自己的二进制日志当中 vim /etc/my.cnf systemctl restart mysqld #进入主服务器的mysql的数据库 mysql -u root -p123456 ##新建一个用户授权给从服务器授权 grant replication slave on *.* to myslave192.168.233.% indendified by 123456; #查看主服务器的状态查看position是多少 show master status; ##修改从服务器的的mysqld ,注意id master 和两个slave的id 也要不同 vim /etc/my.cnf systemctl restart mysqld Server-id 2 Relay-logrelay-log-bin Relay-log-indexslave-relay-bin.index Relay_log_recovery1 默认是0 1开启中继日志的服务器从服务器出现异常或者崩溃时从服务器会从主服务器的二进制争取和应用中继日志同步 Server-id 3 Relay-logrelay-log-bin Relay-log-indexslave-relay-bin.index Relay_log_recovery1 第一台从id 是 2 第二台id是3 ##2台服务器进入musql数据库
mysql -u root -p123456
#配置同步注意 master_log_file 和 master_log_pos 的值要与Master查询的一致 CHANGEmastertomaster_host192.168.233.21,master_usermyslave,master_password123456,master_log_filemaster-bin.000001,master_log_pos604; 2台从服务器操作
#启动同步如有报错执行reset slave; start slave; #查看slave 状态 Slave_io_running:yes 负责和主库的io通信 Slave_sql running:yes 负责自己的slave mysql进程 ##这里 如果报错显示是 slave io running:no
1 网络问题
2 my.cnf 配置文件写错了
3 密码、file文件名、pos偏移量不对 4 防火墙没有关闭
##验证主从复制是否成功
在主服务器上创建一个表两个从也有表 mysql 的主从复制延迟
原因 网络延迟 主从硬件设备导致CPU主频内存IO,硬盘IO 同步复制而不是异步复制 解决方案
1硬件方面
从库配置更好的硬件提升随机写的性能比如原本是机械盘可以考虑更换为ssd固态。升级核心数更强的cpu加大内存避免使用虚拟云主机使用物理机 2 网络方面
将从库分布在相同局域网内或者网路延迟较小的中尽量避免夸机房扩网域进行主从服务器的配置
3 架构方面
在事务中尽量对主库读写其他事物的读在从库中消除一部分延迟带来的数据库不一致增加缓存降低一些从库的负载。
4 mysql 的服务配置方面
该配置针对mysql主从复制性能优化最大化安全性并不高如果从安全的角度考虑的话就要设置双一设置
追求安全性的双一设置
innodb_flush_log_at_trx_commit1
0: 事务提交时不刷新事务日志而是每秒进行一次日志刷新这可以提高性能但在发生故障时可能会导致数据丢失
1默认值 每次事务提交都会刷新日志确保事务的持久性这提供了最高级别的数据安全性但可能会影响性能
2 事务提交时将四五日志写入操作系统缓存中但不进行物理刷新这提供了一定的数据安全性和性能
sync_binlog1
0 二进制日志写入操作系统缓存但不进行物理刷新这提高了最高性能但在发生故障时可能会导致数据丢失
1 默认值每次提交事务都会二进制日志刷新到磁盘以确保日志的持久性这提供了较高级别的数据安全性
N每次事务提交时将二进制日志刷新到磁盘但是最多每N个事务执行一次物理刷新这在某些情况下可以提高性能但是在发生故障时可能会导致少量数据丢失
追求性能化设置
sync_binlog0:
设置为0表示二进制日志binary log写入操作系统缓存但不进行物理刷新。
这提供了较高的性能但在系统崩溃或断电时可能会导致未刷新的二进制日志数据的丢失。 innodb_flush_log_at_trx_commit2:
设置为2表示事务提交时将事务日志写入操作系统缓存但不进行物理刷新。
这提供了一定的性能提升但在系统崩溃或断电时可能会导致未刷新的事务日志数据的丢失。 logs-slave-updates0:
如果设置为0表示不将从库的更新写入二进制日志。
这对于避免在主从复制中引入循环复制circular replication很有用。 增大 innodb_buffer_pool_size:
innodb_buffer_pool_size 控制 InnoDB 存储引擎的缓冲池大小。增大这个值可以提高 InnoDB 的性能
因为更多的数据和索引可以缓存在内存中减少了对磁盘的访问次数。但要注意
设置得太大可能导致系统内存不足。 主从复制的工作过程
1 主节点的数据记录发生变化都会记录到二进制日志
2 slave节点会在一定时间内对主库的二进制文件进行探测看是否发生 变化开启一个I/O的线程请求到主库的二进制事件
3 主库会把每一个I/O的线程启动一个dump用于发送二进制事件给从库从库通过I/O线程获取更新slave sql 负责更新写入到从库本地实现主从一致
主从复制问题
1 只能在主库发生变化然后同步到从
2 复制过程是串行化过程在从库上时复制串行的主库的更新不能从从库上操作。
3 主从涉及的目的就是为了在主库上写在从库上查读写分离实现高可用
读写分离
要实现读写分离必须要实现主从复制
读写分离所有的写入操作都在主库从库只负责读selectr如果有更新是从主库到从库
为什么要有读写分离
1 数据库在写入数据时比较耗时
2 但是读的速度很快
读写分离之后数据库的写入和读取是分开哪怕写入的数据量比较大也不影响查询的效率。
什么场景下需要读写分离
数据库不是一定要读写分离的只有在某些程序的使用数据库中 更新少查询的较多或者读写读写需求差不多的情况下会考虑读写分离
生产中一般都会读写分离
测试库一般不用
在工作中数据库都会做读写分离数据库的读写不在同一个库完成否则不能实现高可用高并发
mysql读写分离的原理
1 根据脚本实现在代码中实现路由分类select insert 进行路由分类这种方式最多的性能好在代码中可以实现不需要额外的设备
缺点开发实现的和我们无关如果是大型复杂的应用涉及改动的代码非常多
2 基于中间代理层实现
mysql-proxy自带的开源项目基于自带的java脚本这些脚本不是现成的要自己写不熟悉他的内置变量写不出来
atlas 360 内部多自己使用的代理工具每天的读写请求载量可以达到几十亿条支持事务支持存储的过程
amoeba 陈思儒是由Java开发的一个开源团建不支持事务也不支持存储过程 搭建MySQL读写分离
注做读写分离实验之前必须有一主两从环境
Mysql1 主192.168.233.21
Mysql2 从 192.168.233.22
Mysql3 从192.168.233.23
Test1读写分离的服务器 amoeba 192.168.233.10
Test5 客户端 192.168.233.20
jdk1.5开发的官方推荐我们使用1.5.1.6
amoeba 服务器配置
##安装java环境
因为amoeba是基于jdk1.5开发的所有官方推荐使用jdk1.5/jdk1.6版本高版本不建议使用
cd /opt/
cp jdk-6u14-linux-x64.bin /usr/local/
cd /usr/local/
chmod x jdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.bin
//按yes按enter
mv jdk1.6.0_14/ /usr/local/jdk1.6
vim /etc/profile
export JAVA_HOME/usr/local/jdk1.6
export CLASSPATH$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
export AMOEBA_HOME/usr/local/amoeba
export PATH$PATH:$AMOEBA_HOME/bin
source /etc/profile
java -version ##安装 Amoeba软件##
mkdir /usr/local/amoeba
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
chmod -R 755 /usr/local/amoeba/
/usr/local/amoeba/bin/amoeba
//如显示amoeba start|stop说明安装成功 ##配置 Amoeba读写分离两个 Slave 读负载均衡##
#先在Master、Slave1、Slave2 的mysql上开放权限给 Amoeba 访问 grant all on *.* to amoeba192.168.233.% identified by 123456; flush privileges; ###再回到amoeba服务器配置amoeba服务
cd /usr/local/amoeba/conf/ cp amoeba.xml amoeba.xml.bak
vim amoeba.xml #修改amoeba配置文件
--30行--
property nameuseramoeba/property --32行--
property namepassword123456/property --115行--
property namedefaultPoolmaster/property --117-去掉注释-
property namewritePoolmaster/property
property namereadPoolslaves/property cp dbServers.xml dbServers.xml.bak
vim dbServers.xml #修改数据库配置文件
--23行--注释掉 作用默认进入test库 以防mysql中没有test库时会报错
!-- property nameschematest/property -- --26--修改
property nameuseramoeba/property --28-30--去掉注释
property namepassword123456/property --45--修改设置主服务器的名Master
dbServer namemaster parentabstractServer --48--修改设置主服务器的地址
property nameipAddress192.168.233.21/property --52--修改设置从服务器的名slave1
dbServer nameslave1 parentabstractServer --55--修改设置从服务器1的地址
property nameipAddress192.168.233.22/property --58--复制上面6行粘贴设置从服务器2的名slave2和地址
dbServer nameslave2 parentabstractServer
property nameipAddress192.168.233.23/property --65行--修改
dbServer nameslaves virtualtrue --71行--修改
property namepoolNamesslave1,slave2/property /usr/local/amoeba/bin/amoeba start #启动Amoeba软件按ctrlc 返回
netstat -anpt | grep java #查看8066端口是否开启默认端口为TCP 8066 配置用户信息 少个图
----测试读写分离 ----
yum install -y mariadb-server mariadb
systemctl start mariadb.service #在主从服务器上开启查询日志
general_logON
general_log_file/usr/local/mysql/data/mysql_general.log 在客户端服务器上测试
mysql -u amoeba -p123456 -h 192.168.233.10 -P8066
//通过amoeba服务器代理访问mysql 在通过客户端连接mysql后写入的数据只有主服务会记录然后同步给从--从服务器 在主服务器上
use db_test;
create table test (id int(10),name varchar(10),address varchar(20)); 在两台从服务器上
stop slave; #关闭同步
use db_test;
//在slave1上
insert into test values(1,zhangsan,this_is_slave1); //在slave2上
insert into test values(2,lisi,this_is_slave2); //在主服务器上
insert into test values(3,wangwu,this_is_master); //在客户端服务器上
use db_test;
select * from test; //客户端会分别向slave1和slave2读取数据显示的只有在两个从服务器上添加的数据没有在主服务器上添加的数据 insert into test values(4,qianqi,this_is_client); //只有主服务器上有此数据 //在两个从服务器上执行 start slave; 即可实现同步在主服务器上添加的数据
start slave; 少了个图 面试题
1 主从复制的原理
2 读取分离的实现方式 脚本amoeba实现mycat实现
通过amoeba代理服务器实现只在主服务器上写只在从服务器上读
主数据库处理事务性查询从数据库处理select 查询
数据库复制被用来把事务查询导致的变更同步的集群中的从数据库
3如何查看主从复制时候否成功
在从服务器上内输入 show slave status\G 查看主从信息查看里面有IO线程的状态信息还有master服务器的IP地址、端口事务开始号。
当 Slave_IO_Running和Slave_SQL_Running都是YES时 表示主从同步状态成功 4 如果slave_IO_running no 排查思路
大概率是配置文件出错
首先排查网络问题使用ping 命令查看从服务器是否能与主服务器通信
再查看防火墙和核心防护是否关闭增强功能
接着查看从服务slave是否开启
两个从服务器的server-id 是否相同导致只能连接一台
master_log_file master_log_pos的值跟master值是否一致
5 show slave status\G能看到的信息有哪些
IO和sql的线程状态信息
MASTER服务的ip 地址端口事务开始的位置
最近一次的错误信息和错误的位置
最近一次IO 报错信息
最近i一次sql的报错信息 6 主从复制的延迟如何解决 主服务器的负载过大被多个睡眠或 僵尸线程占用 导致系统负载过大从库硬件比主库差导致复制延迟
主从复制单线程如果主库写作并发太大来不及传送到从库就会到导致延迟
慢sql语句过多
网络延迟