自学内容网 自学内容网

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
46name="server1"---->name="master"
49"ipAddress">127.0.0.1---->"ipAddress">192.168.100.17
# 确定主master以及master的ip地址

53name="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行
59name="slave1"---->name="slave2"
62"ipAddress">192.168.100.18---->"ipAddress">192.168.100.19

66name="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)!