mysql的主从复制和读写分离

mysql的主从复制和读写分离

先有主从复制才有读写分离,高可用...

主从复制

特点:主从复制的模式,主可以复制到从,从不可以复制到主

高可用架构,小的一般都是一主两从,大的两主三从

延迟怎么解决::

1.网络问题,防火墙的原因

2.硬件设备问题,cpu,内存和磁盘出了问题也会导致这个问题.

3.配置文件写错了

主从复制的模式

mysql默认模式

异步模式,主库在更新完事务之后,会立即把结果返回给从服务器,并不关心从库是否接受到,以及从库是否处理成功

快,效率高

如果没有成功,可能是网络问题没有同步,或者是其他因素的影响导致同步失败

全同步模式

主库在更新完事务之后,立即把结果返回到从库,所有的从库执行完毕之后,才能继续下一个同步.

安全,但是性能低

半同步复制

介乎于异步和全同步之间,主库更新完事务之后,也是同步到从库,同步完成之后,有一个等待时间,等待时间是一个tcp/ip的往返时间

5毫秒左右.

既在一定程度上保证了效率,也在一定程度上保证了数据的完整性

主主模式

都是主,可以互相复制

双一设置

配置文件当中进行设置的方式提高数据的安全性,也就是双一设置

前提是:数据库的存储引擎要是innodb

#查看
vim /etc/my.cnf

#工具
#每次提交都会刷新事务日志,确保事务的是持久性,但是会影响性能.
innodb_flush_log_at_trx_commit=1
#每次提交事务,将二进制日志的内容保存到磁盘,确保日志的持久性,也是提高安全性.
sync_binlog=1
性能化设置
#最多提交几次事务会进行磁盘刷新,日志内容保存到磁盘
sync_binlog=10

#每次更新都保存到内存中,不进行刷新,不建议设置
innodb_flush_log_at_trx_commit=2

#控制innodb缓冲池的大小,增大可以提高数据库的性能,但是占用的是系统内存,配置的时候要注意合理化时间.
inddodb_buffer_pool_size

如何实现

前提:

1.基于mysql的二进制日志,根据主库的二进制文件的标志位,实现主和从的同步

2.主从服务器之间,服务器的时间要同步.

架构:

三台服务器

#192.168.118.10	主
systemctl stop firewalld
setenforce 0
yum -y install ntpdate -y
date
ntpdate ntp.aliyun.com

vim /etc/my.cnf
server-id = 1
log-bin = master-bin
binlog_format = MIXED
#允许从服务器从主主库复制数据时可以写入自己的二进制日志当中
log-slave-updates = true
:wq
systemctl restart mysqld
mysql -u root -p123456
CREATE USER 'myslave'@'192.168.118.%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.118.%';
FLUSH PRIVILEGES;
show master status;

#192.168.118.20	从
systemctl stop firewalld
setenforce 0
yum -y install ntpdate -y
date
ntpdate ntp.aliyun.com

vim /etc/my.cnf
server-id = 2
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
relay_log_recovery = 1
:wq

systemctl restart mysqld
mysql -u root -p123456

CREATE USER 'myslave'@'192.168.118.%' IDENTIFIED WITH mysql_native_password BY '123456';

GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.118.%';

FLUSH PRIVILEGES;

change master to 

master_host='192.168.118.10',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=559;

start slave;
show slave status\G;
#查看slave_IO_Running:yes,Slave_SQL_Running:yes
#IO就是读写,从库和主机的读写通信是否正常,sql是slavemysql进程状态是否正常.
#stop slave;
#reset slave;
#star slave;

#192.168.118.30	从

systemctl stop firewalld
setenforce 0
yum -y install ntpdate -y
date
ntpdate ntp.aliyun.com
vim /etc/my.cnf
server-id = 3
relay-log = relay-log-bin
#二进制日志的索引文件的名称
relay-log-index = slave-relay-bin.index
配置从服务器在启动时是否执行二进制日志的回复操作(和主库同步),1表示开始
relay_log_recovery = 1
:wq

systemctl restart mysqld
mysql -u root -p123456

CREATE USER 'myslave'@'192.168.118.%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.118.%';
FLUSH PRIVILEGES;

change master to master_host='192.168.118.10',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
#IO就是读写,从库和主机的读写通信是否正常,sql是slavemysql进程状态是否正常.

#stop slave;
#reset slave
#star slave;

读写分离

主从架构当中,主库只负责写,从库只负责读.

读写分离的方式:

1.代码 开发人员纯靠代码完成,涉及到数据库的二次开发,性能好,不需要额外的硬件设备

2.中间层代理,代理服务器,在客户端和主从架构之间有一个代理服务器,代理服务器收到客户端的请求之后,通过客户端的sql语句来进行判断,读转到从,写转到主.

Ameoeba:读写分离最常见的客户端代理软件,java代码开发的一个软件.

#192.168.118.40 jdk1.6 Amoeba 代理服务器
systemctl stop firewalld
setenforce 0
cd /opt
#将amoeba-mysql-binary-2.2.0.tar.gz扔进xshell
#将jdk-6u14-linux-x64.bin扔进xshell里
chmod 777 jdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.bin
#一直空格,最后yes

#192.168.118.50 mysql MariaDB 客户端
systemctl stop firewalld
setenforce 0
cd /opt

修改数据库uuid流程

启动MySQL服务

bash 复制代码
systemctl restart mysqld

进入数据库

bash 复制代码
mysql -u root -p123456

我们的数据库都一样,用户root,密码123456

bash 复制代码
#进入数据库操作
select uuid();
#adb47ee3-4966-11ef-b53c-000c2985c62d
#e1e89d7e-4966-11ef-b53c-000c29177a3d
#090271c2-4967-11ef-b53c-000c29ca8eb8

#使用uuid函数生成新的uuid,在下方框里会生成新的uuid,把它复制下来保存,就是很长的那一段

show variables like 'datadir';
#查看auto.cnf文件存放的目录,在下方框里显示
#这一步可以不用做,因为我们源码安装的MySQL
#我们的auto.cnf存放的目录都是/usr/local/mysql/data/
quit
#退出数据库

修改auto.cnf文件

bash 复制代码
vim /usr/local/mysql/data/auto.cnf
server-uuid=(填入刚才生成的新的uuid)

重启MySQL服务

bash 复制代码
systemctl restart mysqld

数据库uuid修改完成

相关推荐
远歌已逝2 小时前
维护在线重做日志(二)
数据库·oracle
qq_433099403 小时前
Ubuntu20.04从零安装IsaacSim/IsaacLab
数据库
内核程序员kevin3 小时前
TCP Listen 队列详解与优化指南
linux·网络·tcp/ip
Dlwyz3 小时前
redis-击穿、穿透、雪崩
数据库·redis·缓存
工业甲酰苯胺5 小时前
Redis性能优化的18招
数据库·redis·性能优化
没书读了6 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
i道i6 小时前
MySQL win安装 和 pymysql使用示例
数据库·mysql
小怪兽ysl6 小时前
【PostgreSQL使用pg_filedump工具解析数据文件以恢复数据】
数据库·postgresql
wqq_9922502777 小时前
springboot基于微信小程序的食堂预约点餐系统
数据库·微信小程序·小程序
爱上口袋的天空7 小时前
09 - Clickhouse的SQL操作
数据库·sql·clickhouse