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 firewalld

setenforce 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



#配置从1

vim /etc/my.cnf
server-id=2
relay-log=relay-log-bin
#从服务器上获取二进制日志的开头,开启从库的二进制日志
relay-log-index=slave-relay-bin.index
#二进制日志的索引文件的名称
relay_log_recovery=1
#配置从服务器在启动时是否执行二进制日志的回复操作(和主库同步),1表示开启


#重启mysql



#配置从2

vim /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 firewalld

setenforce 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,主从都有记录

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值