mysql的主从复制和读写分离
1、主从复制的模式
1.1mysql的默认模式
异步模式,主库在更新完事务之后会立即把结果返回给从服务器,并不关心从库是否接收到,以及从库是否处理成功
网络问题可能没有同步,或者是其他因素的影响导致同步失败
特点:快,效率高
1.2全同步模式
主库在更新完事务之后,立即把结果返回到从库,所有的从库执行完毕之后才能继续下一个同步
特点:安全,但是性能受到影响
1.3半同步复制
介乎于异步和全同步之间,主库更新完事务之后,也是同步到从库。同步完成之后有一个等待时间,等待时间是一个tcp/ip的往返时间,在5毫秒左右
既在一定程度上保证了效率,也在一定程度上保证了数据的完整
2、主从复制的特点
架构模式:高可用架构一般都是奇数台。小架构
一般是一主两从,大一点的是二主三从
主可以复制到从,从不可以复制到主
主主模式:都是主,可以互相复制
3、主从复制的延迟
3.1如何解决
1、网络问题,防火墙的原因
2、硬件设备的问题,cpu、内存和磁盘出了问题
3、配置文件写错了
配置文件当中进行设置的方式提高数据的安全性
数据库的存储引擎要是innodb
查看:vim /etc/my.cnf
3.2双一设置
innodb_flush_log_at_trx_commit=1
每次提交都会刷新事务日志,确保事务的持久性,但是会影响性能
sync_binlog=1
每次提交事务将二进制日志的内容保存在磁盘,确保日志的持久性,提高了安全性
3.3性能化设置
sync_binlog=N
N表示最多提交几次事务会进行磁盘刷新,日志内容保存到磁盘
innodb_flush_log_at_trx_commit=2
每次更新都保存在内存中,不进行刷新
innodb_buffer_pool_size=60m
控制innodb缓冲池的大小,增大可以提高数据库的性能,但是占用的是系统内存,配置时要注意合理化使用
4、主从复制如何实现
实现是基于mysql二进制日志,根据主库的二进制文件的标志位,实现主和从的分布
主从服务器之间,服务器的时间要同步
架构
三台服务器:192.168.230.21 mysql8.0主
192.168.230.22 mysql8.0从
192.168.230.23 mysql8.0从
systemctl stop firewalldsetenforce 0#安装ntpdate
yum -y install ntpdate#date查看时间是否同步
如果不同步 ntpdate ntp.aliyun.com#配置主vim /etc/my.cnf
log-bin=master-bin
binlog_format=MIXED
log-slave-updates=true
#允许从服务器从主库复制数据时,可以写入从库自己的二进制日志当中#重启mysqld,进入数据库mysql -u root -p123456
CREATE USER 'myslave'@'192.168.230.%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.230.%';
FLUSH PRIVILEGES;show master status;查看position#配置从1vim /etc/my.cnf
server-id=2
relay-log=relay-log-bin
#从服务器上获取二进制日志的开头,开启从库的二进制日志
relay-log-index=slave-relay-bin.index
#二进制日志的索引文件的名称
relay_log_recovery=1
#配置从服务器在启动时是否执行二进制日志的回复操作(和主库同步),1表示开启#重启mysql#配置从2vim /etc/my.cnf
server-id=3
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
relay_log_recovery=1#重启mysql#进入从数据库mysql -u root -p123456
CREATE USER 'myslave'@'192.168.230.%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.230.%';
FLUSH PRIVILEGES;
change master to master_host='192.168.230.21',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=857;start slave;
show slave status\G;
#查看主从是否同步Slave_IO_Running: Yes
#从库和主机的读写通信是否正常
Slave_SQL_Running: Yes
#slave mysql进程状态是否正常
5、读写分离
5.1原理
主从架构中,主库只负责写,从库只负责读
5.2读写分离的方式
1、代码,开发人员纯靠代码完成,设计数据库的二次开发。性能好,不需要额外的硬件设备
2、中间层代理,在客户端和主从架构之间有一个代理服务器,代理服务器收到客户端的请求之后通过客户端的sql语句来进行判断,读转发到从,写转发到主
Amoeba:读写分离最常见的客户端代理软件,java代码开发的一个软件
5.3实现读写分离
架构:
192.168.230.21 mysql8.0主
192.168.230.22 mysql8.0从
192.168.230.23 mysql8.0从
192.168.230.20 jdk1.6 amoeba 代理服务器
192.168.230.30 mysql maridb 客户端
实验步骤:
systemctl stop firewalldsetenforce 0#安装java
[root@localhost opt]# cp jdk-6u14-linux-x64.bin /usr/local
[root@localhost opt]# cd /usr/local#给执行权限
[root@localhost local]# chmod 777 jdk-6u14-linux-x64.bin#执行
[root@localhost local]# ./jdk-6u14-linux-x64.bin#改名
[root@localhost local]# mv jdk1.6.0_14/ 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[root@localhost local]# source /etc/profile#查看版本号
[root@localhost local]# java -version#创建目录,解压amoeba
[root@localhost opt]# mkdir /usr/local/amoeba
[root@localhost opt]# tar -xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba#赋权
[root@localhost local]# chmod -R 755 /usr/local/amoeba#查看是否安装成功
[root@localhost local]# /usr/local/amoeba/bin/amoeba
amoeba start|stop#进入主库
[root@localhost ~]# mysql -u root -p123456#创建用户
mysql> CREATE USER 'amoeba'@'192.168.230.%' IDENTIFIED WITH mysql_native_passwword BY '123456';#赋权
mysql> GRANT REPLICATION SLAVE ON *.* TO 'amoeba'@'192.168.230.%';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'amoeba'@'192.168.230.%';#刷新
mysql> flush privileges;#进入代理服务器
[root@localhost ~]# cd /usr/local/amoeba/conf#复制
[root@localhost conf]# cp amoeba.xml amoeba.xml.bak.2024.07.23#打开主配置文件vim amoeba.xml
30行
<property name="user">amoeba</property> <property name="password">123456</property> 115行
<property name="defaultPool">master</property>117行取消注释
<property name="writePool">master</property>
<property name="readPool">slaves</property>#复制
[root@localhost conf]# cp dbServers.xml dbServers.xml.bak.2024.07.23#进入配置文件vim dbServers.xml
23行注释掉
<!-- mysql schema <property name="schema">test</property>
-->27行
<property name="user">amoeba</property>29行取消注释
30行
<property name="password">123456</property>46行
<dbServer name="master" parent="abstractServer">
49行
<property name="ipAddress">192.168.230.21</ property>53行
<dbServer name="slave1" parent="abstractServer">
56行
<property name="ipAddress">192.168.230.22</property>添加一个dbserver
<dbServer name="slave2" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.230.23</property>
</factoryConfig>
</dbServer>66行
<dbServer name="slaves" virtual="true">72行
<property name="poolNames">slave1,slave2</p roperty>#开启服务
[root@localhost conf]# /usr/local/amoeba/bin/amoeba start &#查看端口8066是否开启
[root@localhost conf]# netstat -antp | grep java#客户端安装mariadb
[root@localhost ~]# yum -y install mariadb-server mariadb#回到数据库,打开主从的日志vim /etc/my.cnf
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log#重启mysql主从库访问日志
[root@localhost data]# tail -f mysql_general.log#代理服务器登录数据库
[root@localhost ~]# mysql -u amoeba -p123456 -h 192.168.230.20 -P8066#创建一个表test01,查看日志此时主从库都有记录
查询test01,主库没有记录,从库有
插入数据1000,主从都有记录