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.41 | mysql 5.7 |
---|---|---|
slave 1 | 192.168.146.10 | mysql 5.7 |
slave 2 | 192.168.146.11 | mysql 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.41 | mysql 5.7 |
---|---|---|
slave 1 服务器 | 192.168.146.10 | mysql 5.7 |
slave 2 服务器 | 192.168.146.11 | mysql 5.7 |
Amoeba 服务器 | 192.168.146.12 | jdk 1.6 ,Amoeba |
客户端服务器 | 192.168.146.13 | mysql |
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主从复制和读写分离的主要内容,如果未能解决你的问题,请参考以下文章