企业多语言网站开源,牌子网官网,销售管理系统业务处理流程,云平台网站建设MySQL 主从复制和读写分离#xff1a;
主从复制#xff1a;主MySQL上的数据#xff0c;新增#xff0c;修改库#xff0c;表#xff0c;表里的数据#xff0c;都会同步到从MySQL上。 MySQL的主从复制的模式#xff1a;#xff08;面试题#xff09;
1#xff0c;异…MySQL 主从复制和读写分离
主从复制主MySQL上的数据新增修改库表表里的数据都会同步到从MySQL上。 MySQL的主从复制的模式面试题
1异步复制MySQL的默认复制就是异步复制最常用。只要执行完之后客户端提交事务主MySQL会立即把结果返回给从服务器主服务器并不关心从服务器是否已经接受并且处理。
问题主一旦崩溃主MySQL的事务可能没有传到从MySQL这个时候强行的把从提升为主可能到新的主服务器数据不完整。很少见。
2全同步复制主库执行完成一个事务所有的从库都执行了该事务之后才会返回客户端。
因为需要等待所有从库全部执行完成性能必然下降。对数据一致性和数据完整性要求很好的场景。
3半同步复制介于异步和全同步复制之间。主库执行完一个客户端提交的事务之后至少等待一个从库接受并处理完成之后才会返回给客户端。半同步在一定程度上提高了数据的安全性。也会有一定延迟。
这个延迟一般是一个tcp/ip的时间从发送到接受的时间单位是毫秒ms
时间1ms: round-trip time RTT 架构主从复制和读写分离
mysql1 主
mysql2 从
mysql3 从
test1 读写分离的服务器
test2 客户端 实验
主从复制
主从服务器之间的时间也要同步
安装 ntp工具
yum -y install ntp
改ntp配置文件 数字越小时间的精确度越高设置fudge 8 时间层级是8 最高到15。
从本地获取时间源不从网络获取 从服务器执行同步命令 生成中会加一个定时任务 每30分钟同步一次
查看时间 改主配置文件
log-binmaster-bin #添加主服务器开启二进制日志
binlog_format MIXED
log-slave-updatestrue
#添加允许slave从master复制数据时可以写入到自己的二进制日志 进入服务器新建一个用户并授权
GRANT REPLICATION SLAVE ON . TO myslave192.168.176.% IDENTIFIED BY 123456;
FLUSH PRIVILEGES;
show master status; 靠位置点进行同步 修改从数据库配置文件
每个id不能一样
server-id 2
relay-logrelay-log-bin
relay-log-indexslave-relay-bin.index
relay_log_recovery 1 relay_log_recovery1
默认是01开启中继日志的复制。从服务器出现异常或者崩溃时从服务器会从主服务器的二进制
server-id 3
relay-logrelay-log-bin
relay-log-indexslave-relay-bin.index
relay_log_recovery 1 重启数据库 从服务器分别进入数据库
mysql -u root -p123456
和主进行同步
CHANGE master to master_host192.168.176.30,master_usermyslave,master_password123456,master_log_filemaster-bin.000001,master_log_pos604; 启动同步
start slave;
查看
show slave status\G; Slave_IO_Running: Yes #负责与主机的io通信
Slave_SQL_Running: Yes #负责自己的slave mysql进程 在主数据库创建库表 从库也会跟着改变 面试题如果slave io running no
1,网络问题
2my.cnf 配置文件写错了
3 4防火墙和安全机制。
主从复制是单向的只能从主复制到从服务器。 面试题主从复制的延迟问题
1网络延迟
2主从硬件设备CPU主频内存IO硬件IO。
3同步复制而不是异步复制。 解决方案
1硬件方面主库一般来说不需要动的太多从库硬件配置要更好。提升随机写的性能。硬盘可以换成固态的升级cpu的核数扩容内存。尽量使用物理机不要用云服务器。4核8G硬盘。
2网络层面主从服务器配置在一个局域网内尽量避免跨网段和跨机房。
3架构方面读写分离把写入控制在主库从库负责读降低从库的压力
4配置方面 mysql配置。从配置文件的角度实现性能最大化
追求安全性的配置
innodb_flush_log_at_trx_commit1
每次事务提交时都会刷新事务日志。已确保持久性最高级别的数据安全性但是会响应性能默认就是1
0就是事务提交时不会立刻刷新而是每秒刷新一次。可以提高性能但是发生故障会导致数据丢失。
2 事务提交时事务日志不会写入硬盘而是保持在系统缓存不会进行刷新。一定的安全性和性能。内存要求比较高。 sync_binlog1
1也是默认值每次提交事务之后直接把二进制日志刷新以确保日志的持久性。占用比较高的性能。但是安全性高。
0二进制日志写入到缓存也不会刷新日志。故障发生也会丢失数据内存的要求也提高了
3每3个事务执行一次刷新磁盘。提高性能但是一旦崩溃数据会大量丢失。 追求性能化
sync_binlog0
innodb_flush_log_at_trx_commit2
logs-slave-updates0
从库的更新不会写入二进制日志不建议
innodb_buffer_pool_size 300M 500G
innodb存储引擎的缓冲池大小设置的s值越高可以提高innodb的性能。
更多的数据和索引都可以缓存在内存中。减少磁盘的访问次数。对系统内存要求比较高。 主从复制的一个工作过程
1主节点是数据记录发生变化都会记录在二进制日志。
2slave节点会一定时间内对主库的二进制文件进行探测看其是否发生变化如果有变化从库会开启一个I/O线程请求主库的二进制事件。
3主库会给每一个I/O的线程启动一个dump。用于发送二进制事件给从库从库通过I/O线程获取更新slave_sql负责将更新写入到从库本地。实现主从一致。 主从复制的问题
1只能在主库上发生变化任何同步到从。
2复制过程是串行化过程在从库上复制是串行的主库的并行更新不能在库上并行操作。
3主从复制的设计目的就是为在主库上写在从库上查看。读写分离实现高可用 mysql主从复制
若主从版本不一致从的版本一定要高于主保证可以向下兼容
因为若主的版本更新低版本的从无法兼容的 读写分离 要实现读写分离必须要实现主从复制。
读写分离所有的写入操作在主库从库只负责读。select。如果有更新是从主库复制到从库。
为什么要有读写分离
1数据库在写入数据时比较耗时mysql写一万条数据 3分钟
2数据库在读的时候速度很快读一万5秒
读写一旦分离数据库的写入和读取是分开的哪怕写入的数据量比较大但是不影响查询的效率。
在什么场景下需要读写分离
只有在某些程序在使用数据库过程中更新少但是查询比较多这种情况可用考虑读写分离。
读和查的需求差不多也可以考虑读写分离。
生产库一般都会做读写分离
测试库一般不管。
在工作中数据库的读写不会在同一个库中完成。即不安全也不能满足高可用也不能实现高并发。工作中读会做读写分离。 mysql读写分离的原理
1根据脚本实现。在代码中实现路由分类。select insert 进行路由分类。这种方式是最多的。
性能好在代码中可用实现不需要额外的硬件设备
缺点开发实现的跟我们无关。如果大型的复制的应用设计改动的代码非常多。 2基于中间代理层实现
mysql-proxy自带的开源项目基于自带的lua脚本。这些lua脚本不是现成的要自己写不熟悉他的内置变量写不出来的 atlas 360内部做自己代理工具。每天的读写请求承载量可用到几十亿条。支持事务支持存储过程。 3Amoeba 陈思儒之前在阿里就职。是由java开发的一个开源团建。不支持事务也不支持存储过程。但是Amoeba还是用的最多的功能比较强大的软件。 实验
mysql1 主
mysql2 从
mysql3 从
test1 读写分离的服务器 Amooeba
test2 客户端
修改java环境
查看java环境java -version
基于 jdk1.5开发的官方推荐的
更换java环境
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
在opt目录下创建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赋权
grant all on *.* to amoeba192.168.176.% identified by 123456;
flush privileges;
在amoeba服务器修改配置文件
cd /usr/local/amoeba/conf/
配置用户信息 配置数据库信息 备份
cp amoeba.xml amoeba.xml.bak
改配用户信息
vim amoeba.xml
--30行--
amoeba
--32行--
123456
--115行--
master
--117-去掉注释-
master
slaves 修改数据库信息
cp dbServers.xml dbServers.xml.bak
vim dbServers.xml
--23行--注释掉 作用默认进入test库 以防mysql中没有test库时会报错 --26--修改
amoeba
--28-30--去掉注释
123456
--45--修改设置主服务器的名Master
--48--修改设置主服务器的地址
192.168.233.21
--52--修改设置从服务器的名slave1
--55--修改设置从服务器1的地址
192.168.233.22
--58--复制上面6行粘贴设置从服务器2的名slave2和地址
192.168.233.23
--65行--修改
--71行--修改
slave1,slave2 启动Amoeba软件
/usr/local/amoeba/bin/amoeba start
查看8066端口是否开启
netstat -anpt | grep java 测试读写分离
客户端安装 mariadb
yum install -y mariadb-server mariadb
systemctl start mariadb.service 修改三台mysql生成日志文件
最后一行添加
general_logON
general_log_file/usr/local/mysql/data/mysql_general.log
三台库打开日志
tail -f /usr/local/mysql/data/mysql_general.log
在客户端对表进行写入时三个日志都会有显示
查看表只有一台从库有记录而且会轮询记录