Mysql的主从复制和读写分离
Mysql的主从复制和读写分离
主从复制:面试必问 主从复制的原理
读写分离 MHA
一、主从复制
1、模式
1.1 默认模式
异步模式:主库在更新完事务之后会立即把结果返回给从服务器,并不关心从库是否接收到,以及从库是否处理成功
问题:网络问题可能没有同步,或者其他因素的影响导致同步失败
优点:快、效率高
1.2 全同步模式
主库在更新完事务之后,立即把结果返回到从库,所有的从库执行完毕之后才能继续下一个同步
问题:性能会受到影响
优点:安全
1.3 半同步复制
介乎于异步和全同步之间,主库更新完事务之后,也是同步到从库,同步完成之后有一个等待时间,等待时间是一个tcp/ip的往返时间(5毫秒左右)
既在一定程度上保证了效率,也在一定程度上保证了数据的完整性
2、特点
架构模式:高可用架构一般都是奇数台,一主两从或者两主三从
主可以复制到从,从不可以复制到主
主主模式:都是主,可以互相复制
主从复制的延迟怎么解决?
1.1 网络问题,也包含防火墙的原因
1.2 硬件设备问题,cpu、内存和磁盘出了问题
1.3 配置文件写错了
3、安全性设置
配置文件当中进行设置的方式提高数据的安全性
数据库的存储引擎要是indb是双一设置的前提
双一设置:
innodb_flush_log_at_trx_commit=1
每次提交都会刷新事务日志,确保事务的持久性,但是会影响性能
sync_binlog=1
每次提交事务,将二进制日志的内容保存到磁盘,确保日志的持久性,提高了安全性
4、性能化设置
sync_binlog=10
最多提交几次事务会进行磁盘刷新,提交10次就会把日志内容保存到磁盘
innodb_flush_log_at_trx_commit=2
每次更新都保存在内存中,不进行刷新,不推荐
innodb_buffer_pool_size=60
控制innodb缓冲池的大小,增大可以提高数据库性能,但是占用的是系统的内存,配置的时候要注意合理化时间
5、主从复制如何实现
实现是基于mysql的二进制日志,根据主库的二进制文件的标志位,实现主和从的同步
主从服务器之间,服务器的时间要同步
架构:
三台服务器
192.168.100.17 mysql8.0 主
192.168.100.18 mysql8.0 从
192.168.100.19 mysql8.0 从
# 主从均操作
systemctl stop firewalld
setenforce 0
yum -y install ntpdate -y
date
ntpdata ntp.aliyun.com
# 如果数据不同步
# 主--mysql1-7
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 -p
CREATE USER 'myslave'@'192.168.100.%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.100.%';
flush privileges;
show master status;
# 查看主的position---857(这个不是固定的)
# 从--mysql2-8
vim /etc/my.cnf
#server-id = 1不能相同修改为 2,在下方插入
server-id = 2
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
relay_log_recovery=1
wq!
systemctl restart mysqld
# 从--mysql3-9
vim /etc/my.cnf
#server-id = 1不能相同修改为 3,在下方插入
server-id = 3
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
relay_log_recovery=1
wq!
systemctl restart mysqld
# 从--mysql2-8和mysql3-9
mysql -u root -p
change master to master_host='192.168.100.17',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=857;
start slave;
show slave status\G;
CREATE USER 'myslave'@'192.168.100.%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.100.%';
flush privileges;
二、读写分离
1、原理
原理:在整个主从的架构当中,主库只负责写,从库只负责读
2、方式
2.1 代码 即开发人员纯靠代码完成,涉及数据库的二次开发,性能好,不需要额外的硬件设备
2.2 中间层代理 在客户端和主从架构之间有一个代理服务器,代理服务器收到客户端的请求之后,通过客户端的sql语句来进行判断,读转发到从,写转发到主
Amoeba:读写分离最常用的一种客户端代理软件,java代码开发的一个软件
3、读写分离如何实现
192.168.100.17 mysql8.0 主
192.168.100.18 mysql8.0 从
192.168.100.19 mysql8.0 从
192.160.100.11 jdk1.6 Amoeba
192.168.100.12 maridb 客户端
1.1 在代理服务器和客户端操作
# 代理和客户端
systemctl stop firewalld
setenforce 0
cd /opt
# 把amoeba软件和java的依赖环境包拖进去
1、# 配置java
cp jdk-6u14-linux-x64.bin /usr/local
cd /usr/local
chmod 777 jdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.bin
# 一直空格......最后yes
# 出现Press Enter to continue.....回车,然后点否,出现Done即成功
此时在/usr/local/目录下出现jdk1.6.0_14,修改它的名字如下
mv jdk1.6.0_14 jdk1.6
vim /etc/profile
# 此时在配置文件的最后一行添加java的环境变量如下
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
wq!
source /etc/profile
java -version
# 查看java版本命令 出现则java配置成功
2、# 配置amoeba
cd /opt
# 解压amoeba,注意查看amoeba是否有解压目录,这里没有需要自己创建,cat /etc/profile查看路径,再创建!
mkdir /usr/local/amoeba
tar -xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
chmod -R 755 /usr/local/amoeba
# 此时amoeba安装完毕
/usr/local/amoeba/bin/amoeba
# 此命令是验证amoeba是否安装好,出现amoeba start|stop表示安装好了
1.2 在数据库操作
操作目的:为了给代理服务器amoeba创建连接到主从服务器的用户以及权限,由于我们之前已经搭建好主从复制所以直接在主服务器上操作即可
# mysql7
mysql -u root -p123456
CREATE USER 'amoeba'@'192.168.100.%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'amoeba'@'192.168.100.%';
GRANT ALL PRIVILEGES ON *.* TO 'amoeba'@'192.168.100.%';
flush privileges;
# 注意:从库的表可以在navicate里面查看,打开从库里面的mysql里面的表,拉到最下面点击user,打开user,出现amoeba,即刚刚主库的操作同步到了从库,如果不放心的话,从库可在数据可内执行赋权语句,即上面两个grant命令,不要忘记刷新
# mysql7、8、9
exit
1.3 回到代理服务器:修改amoeba的配置文件
# 代理服务器test1-1
cd /usr/local/amoeba/conf
cp amoeba.xml amoeba.xml.bak.2024.07.23
vim amoeba.xml
# set up 跳行gg
30行 root---->amoeba
33行 添加密码:123456
115行 "defaultPool"后的server1---->master
117和120行 取消注释
118行 "writePool"后的server1---->master
119行 "readPool"后的server1---->slaves
wq!
cd /usr/local/amoeba/conf
cp dbServers.xml dbServers.xml.bak.2024.07.23
vim dbServers.xml
# set up 跳行gg
23行 注释掉23行
操作 #在23行下添加一行把22行后面的注释复制到24行并取消,注意不注释的话会默认进入test库
27行 root---->amoeba
29行 注释掉,操作:即后面添加-->
31行 删除-->
30行 "password"后面的password---->123456
46行 name="server1"---->name="master"
49行 "ipAddress">127.0.0.1---->"ipAddress">192.168.100.17
# 确定主master以及master的ip地址
53行 name="server2"---->name="slave1"
56行 "ipAddress">127.0.0.1---->"ipAddress">192.168.100.18
# 复制以<dbServer开头的53行到以</dbServer>结尾的58行 复制命令:6yy(在53行6yy,58行p),复制成功多出59行至64行
59行 name="slave1"---->name="slave2"
62行 "ipAddress">192.168.100.18---->"ipAddress">192.168.100.19
66行 name="multiPool"---->name="slaves"
72行 server1,server2---->slave1,slave2
wq!
cd /usr/local/amoeba/conf
/usr/local/amoeba/bin/amoeba start &
# 开启amoeba命令,后面加&表示后台运行
# 加载后出现光标,检查一下有没有错误,然后回车即可
netstat -antp | grep java
出现问题:打开的端口仅有java端口,主从的配置java端口未开启
排查问题:配置文件写错
解决问题:
1.1 修改配置文件,因为amoeba已在后台运行
1.2 查看运行端口,netstat -antp | grep java
1.3 查看进程,lsof -i:进程号
1.4 结束进程,kill 进程号
1.5 /usr/local/amoeba/bin/amoeba start &
1.6 netstat -antp | grep java # 成功开启
1.4 客户端
yum -y install mariadb-server mariadb
1.5 主从服务器
# mysql7
vim /etc/my.cnf
# 在log-slave-updates=true下添加
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
wq!
# mysql8、9
vim /etc/my.cnf
# 在relay_log_recovery=1下添加
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
wq!
# mysql7、8、9
systemctl restart mysqld
1.6 客户端
mysql -u amoeba -p123456 -h 192.168.100.11 -P8066
# 在代理服务器的数据库操作,insert写入数据时,查看日志文件,主和从均有日志记录,select数据时,只有从上有数据记录,主上没有记录
原文地址:https://blog.csdn.net/2401_84592402/article/details/140667821
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!