mysql读写分离
mysql的读写分离的前提是要有主从复制
主从复制
主从复制,在一个mysql的集群当中,至少要3台,主1台,从2台,当有数据写入时,主负责写入本库,然后把数据同步到从服务器,一定是在主服务器写入数据,从服务器的写入不会同步到集群
主从复制的模式
1、异步复制,mysql的默认复制方式就是异步,主在执行客户端提交的数据之后,结果会立即返回给客户端,主库不关心数据是否被从库接受或处理。
主库如果崩溃,主库的未提交数据可能不能同步到从库,可能导致数据的不完整。
MHA进行故障切换
2、全同步复制,主库执行完客户端提交的数据,从所有的从库也处理完该数据,才会提交给客户端,需要等到所有的库都完成写入,才能进行下一步操作
3、半同步复制,介乎于全同步模式和异步模式之间,主库接受到写入操作,会等待至少一个从库完成写入之后才会返回给客户端
主从复制当中的延迟问题**
1、网络延迟,数据库尽量部署在同一数据中心之间的相同的内网局域网
2、硬件原因:磁盘的l/o性能,cpu的核心数等等,加大内存,尽量使用物理主机来部署数据库
3、架构方面:我们在配置好主从模式,尽量的保证所有的写入都是从主库完成
4、mysql的配置:
mysql的双一设置:
- innodb_flush_log_at_trx_commit=1
写在/etc/my.cnf文件中,每次提交事务时,都会刷新事务的日志,确保事务的持久性,提高数据的安全性
0:事务提交时,不刷新日志,而是每秒钟进行依次刷新,性能提高了,安全相对低
2:事务在提交时,事务的日志写入操作系统的内存,不进行物理刷新(不保存硬盘) - sync_binglog=1
每次提交事务时,二进制日志都会刷新到磁盘,确保日志的持久性
0:二进制日志写入操作系统的内存,不进行物理刷新
N:每提交N次事务,就进行刷新。 - log_slave_updates=0
不将从库的更新写入二进制日志,避免在主从复制陷入死循环 - innodb_buffer_pool_size
存储引擎的缓冲池的大小,增大空间可以提高整个数据库的性能
这个空间是占用内存的,大小的设置是内存的一般,或者是3分之一
mysql主从复制配置
mysql1 192.168.42.23 主
mysql2 192.168.42.24 从1
mysql3 192.168.42.25 从2
1、开启主的二进制日志
2、log-slave-updates=true, 让从库可以从主库当中获取二进制目的更新写入到自动的二进制日志。
3、主从服务器的server-id不能保持一致
relay-log=relay-log-bin
指定了从服务器上中继日志的文件
relay-log-index=slave-relay-bin.index
中继日志索引文件的名称
relay_log_recovery=1
指定了从服务器在启动时,是否执行中继日志的恢复操作
4、Slave_IO_Running: Yes 和主库之间的读写的通信
Slave_SQL_Running: Yes 从库自己的sql进程
面试题:
slave_IO_running 是 no,表示从库的I/O线程没有运行。
可能的原因包括:
网络不通(防火墙)
my.cnf 的配置文件有问题
没有配置权限
CHANGE MASTER 语句配置错误:
CHANGE MASTER TO master_host=‘192.168.233.21’,
master_user=‘myslave’,
master_password=‘123456’,
master_log_file=‘master-bin.000001’,
master_log_pos=857;
文件名不对,位置不对
如果同步出现问题,可以执行以下命令:
stop slave; 停止从库复制
reset slave; 重置从库复制
重新上面的步骤
start slave; 启动从库复制
主从3台数据库
ntpdate ntp.aliyun.com
#校时主数据库
vim /etc/my.cnfgeneral_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.loglog-bin=master-binbinlog_format=MIXEDlog-slave-updates=truerelay_log_recovery=1保存退出
systemctl restart mysql
mysql -u root -p123456
CREATE USER 'myslave'@'192.168.42.%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.42.%';
FLUSH PRIVILEGES;
show master status; 从数据库1
vim /etc/my.cnfserver-id=2general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.logrelay-log=relay-log-binrelay-log-index=slave-relay-bin.indexrelay_log_recovery = 1保存退出
systemctl restart mysql
mysql -u root -p123456
change master to master_host='192.168.42.23',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=855;
start slave;
show slave status\G; 从数据库2
vim /etc/my.cnfserver-id=3general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.logrelay-log=relay-log-binrelay-log-index=slave-relay-bin.indexrelay_log_recovery = 1保存退出
systemctl restart mysql
mysql -u root -p123456
change master to master_host='192.168.42.23',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=855;
start slave;
show slave status\G; 主从3台数据库
mysql -u root -p123456
CREATE USER 'amoeba'@'192.168.42.%' IDENTIFIED WITH mysql_native_password BY '123456';GRANT REPLICATION SLAVE ON *.* TO 'amoeba'@'192.168.42.%';GRANT ALL PRIVILEGES ON *.* TO 'amoeba'@'192.168.42.%';flush privileges;
主从复制的工作工程:
1、master节点开启二进制日志,master上的数据发生改变时,数据会写入二进制日志
2、从节点会在一定时间的间隔内对从库的二进制日志进行探测,是否发生变化,有变化,开启一个l/o的线程,请求主库二进制日志的时间
3、主库为每个从库的l/o线程开启一个dump线程,向从库发送二进制日志的时间,从库保存到自己的中继日志,从库再启动sql的线程读取中继日志中的二进制日志,保存到本地,然后获取内容,写入到自己的库中
读写分离
读写分离是建立在主从复制的基础上的
读写分离的方法
1、mysql-proxy
2、atlas 360内部自己研发的工具(AMOEBA)不对外公开
3、Amoeba (陈思儒开发)
cd /opt
jdk源码包和java安装包拖进来
cp jdk-6u14-linux-x64.bin /usr/local
cd /usr/local/
chmod 777jdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.binvim /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
保存退出
cd /opt
mkdir /usr/local/amoeba
tar -xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
cd /usr/local/amoeba/conf
cp amoeba.xml amoeba.xml.bak.2024.12.24
vim amoeba.xml
第30行
<property name="user">amoeba</property>
第32行
<property name="password">123456</property>
第115行
<property name="defaultPool">master</property>
第117行删掉注释
第118行-119行
<property name="writePool">master</property>
<property name="readPool">slaves</property>
保存退出
cp dbServers.xml dbServers.xml.bak.2024.12.24
vim dbServers.xml
第23行注释掉
第26行
<property name="user">amoeba</property>
第29行去掉注释
<property name="password">123456</property>
第45行-第65行
<dbServer name="master" parent="abstractServer"><factoryConfig><!-- mysql ip --><property name="ipAddress">192.168.42.23</property></factoryConfig></dbServer><dbServer name="slave1" parent="abstractServer"><factoryConfig><!-- mysql ip --><property name="ipAddress">192.168.42.24</property></factoryConfig></dbServer><dbServer name="slave2" parent="abstractServer"> <factoryConfig> <!-- mysql ip --> <property name="ipAddress">192.168.42.25</property> </factoryConfig></dbServer>
第67行
<dbServer name="slaves" virtual="true">
第73行
<property name="poolNames">slave1,slave2</property
保存退出
/usr/local/amoeba/bin/amoeba start &
netstat -antp | grep java客户端
apt -y install mariadb-server
mysql -u amoeba -p123456 -h 192.168.42.20 -P8066```