MySQL主从复制和读写分离

Posted 敲击岁月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL主从复制和读写分离相关的知识,希望对你有一定的参考价值。

mysql主从复制和读写分离

mysql主从复制

mysql复制类型

statement基于语句的复制。在服务器上执行sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制,执行效率高
row基于行的复制,把改变的内容复制过去,而不是把命令在从服务器上执行一遍
mixed混合类型的复制,默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制

主从复制的工作过程

主服务器进行数据更新,写入二进制日志,从服务器上的I/O线程会读取二进制日志,并将其写入缓存中的中继日志,同时SQL线程会读取中继日志,并进行重写,从而保持主从服务器数据的一致性

mysql主从复制延迟

1.主服务器高并发,形成大量事务
2.网络延迟
3.主从硬件设备导致(CPU主频,内存IO,硬盘IO)
4.本来就不是同步复制,而是异步复制

解决办法:
1.从库优化mysql参数。比如增大innodb_buffer_pool_size,让更多操作在mysql内存中完成,减少磁盘操作。
2.从库使用高性能主机,包括cpu强悍,内存加大。避免使用虚拟云主机,使用物理主机,这样提升了i/o方面性
3.从库使用SSD磁盘
4.网络优化,避免跨机房实现同步

搭建mysql主从复制

master服务器192.168.146.41mysql 5.7
slave 1192.168.146.10mysql 5.7
slave 2192.168.146.11mysql 5.7
主服务器设置
yum install -y ntp

vim /etc/ntp.conf
末尾添加
server 127.127.146.0    #设置本地时钟源,注意修改网段
fudge 127.127.146.0 stratum 8  #设置时间层级为8(限制在15内)
server ntpd start

从服务器设置
yum -y install ntp ntpdate

/usr/sbin/natdate 192.168.146.41  #进行时间同步
crontab -e
*/30 * * * * /usr/sbin/ntpdate 192.168.146.41

主服务器的mysql配置
vim /etc/my.conf
server-id = 11
log-bin=master-bin  #添加,主服务器开启二进制日志
binlog_format = MIXED
log-slave-updates=true  #添加,允许从服务器更新二进制日志

systemctl restart mysqld

mysql -uroot -pabc123
grant replication slave on *.* to 'myslave'@'192.168.146.%' identified by '123456';
flush privileges;
show master status;  #file列显示日志名,position列显示偏移量


从服务器的mysql配置
vim /etc/my.cnf
server-id = 22           #修改,注意id与master的不同,两个slave的id也要不同
relay-log=relay-log-bin  #添加,开启中继日志,主从服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index  #添加,定义中继日志文件的位置和名称

systemctl restart mysqld

mysql -uroot -p123456
CHANGE master to master_host='192.168.146.41',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=604;   #配置同步

start slave;           #启动同步,如有报错执行reset slave
show slave status\\G    #查看slave状态
slave_IO_Running:yes   #负责与主机的IO通信
slave_SQL_Runing:yes  #复制自己的slave mysql进程






MySQL读写分离

mysql读写分离原理

只在主服务器上写,只在从服务器上读
主数据库处理事务性查询,从数据库处理select查询
数据库复制用于将事务性查询的变更同步到集群中的从数据库

搭建mysql读写分离

master服务器192.168.146.41mysql 5.7
slave 1 服务器192.168.146.10mysql 5.7
slave 2 服务器192.168.146.11mysql 5.7
Amoeba 服务器192.168.146.12jdk 1.6 ,Amoeba
客户端服务器192.168.146.13mysql
systemctl stop firewalld
systemctl disable firewalld
seteforce 0
安装java环境
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


安装 Amoeba软件
mkdir /usr/local/amoeba
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
chmod -R 755 /usr/local/amoeba
/usr/local/amoeba/bin/amoeba 显示amoeba start|stop 说明安装成功

配置amoeba读写分离,两个slave读负载均衡
在master,slave1,slave2的mysql上开放权限给amoeba访问
grant all on *.* to test@'192.168.146.%' identified by '123.com';

再回到amoeba服务器配置服务
cd /usr/local/amoeba/conf
cp amoeba.xml amoeba.xml.bak
vim amoeba.xml #修改amoeba配置文件








以上是关于MySQL主从复制和读写分离的主要内容,如果未能解决你的问题,请参考以下文章

主从复制和读写分离

主从复制和读写分离

主从复制和读写分离

MySQL主从复制和读写分离

MySQL主从复制和读写分离

Mysql主从复制和读写分离