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修改完成