在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。有点类似于rsync,但是不同的是rsync是对磁盘文件做备份,而mysql主从复制是对数据库中的数据、语句做备份。
- 基于语句的复制(STATEMENT):在主服务器上执行的 SQL 语句,在从服务器上执行同样的语句。MySQL 默认采用基于语句的复制,效率比较高。(基于sql语句复制,效率高,但在高并发高负债的情况下,可能会出现复制误差)
- 基于行的复制(ROW):把改变的内容复制过去,而不是把命令在从服务器上执行一遍。(精确度较高,效率较低,日志占用的空间比较大)
- 混合类型的复制(MIXED):默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。
就是对数据库的二进制日志中的数据、做备份复制
(1) Master节点将数据的改变记录成二进制日志(bin log),当Master上的数据发生改变时,则将其改变写入二进制日志中。
(2) slave节点会在一定时间间隔内对Master的二进制日志进行探测其是否发生改变,如果发生改变,则开始一个T/o线程请求Master的二进制事件。
(3)同时Master节点为每个T/o线程启动一个dump线程,用于向其发送二进制事件,并保存至slave节点本地的中继日志.(Relaylog)中(中继日志是缓存中的),Slave节点将启动sQL线程从中继日志中读取二进制日志,在本地重放,即解析成sql语句逐一执行,使得其数据和Master节点的保持一致,最后I/o线程和sQL线程将进入睡眠状态,等待下一次被唤醒。注:
1.中继日志通常会位于os缓存中,所以中继日志的开销很小。
2.复制过程有一个很重要的限制,即复制在slave.上是串行化的,也就是说Master上的并行更新操作不能在 slave上并行操作。
主节点需要先开启二进制日志,从节点开启中继日志,主节点的数据发生更新会记录到二进制文件里面,从节点会探测到主节点的二进制文件发生改变,从节点会启动IO线程请求主节点的二进制数据,主节点会开启dump线程,把二进制数据发送给从节点,从节点会写入到自己的中继日志当中,从节点这时候会开启一个sql线程读取中继日志中的二进制数据,在本地重放。从而保证主从两台服务器的数据保持一致。
读写分离是基于主从复制实现的
什么时候需要读写分离呢?
数据库不一定要读写分离,如果程序使用数据库较多时,而更新少的时候才会使用读写分离。利用数据库主从同步,在通过读写分离可以分担数据库的压力,从而提高性能。
准备三台服务器
192.168.195.100 (主)
192.168.195.200(从)
192.168.195.50(从)
关闭防火墙
时间同步(如果有桌面的话是有的,但是现在没有)
修改ntp.cof配置文件
最后一行添加
启动ntp
如果是联网的话可以
修改数据库配置文件/etc/my.cof
其中log-slave-updates=true写错了
重启数据库
授权
刷新
跟主服务器做对接
修改/etc/my.cnf
重启数据库
设置从数据库
开启同步
show slave status\G 查看一下两个线程状态必须为yes才算成功
跟主服务器做对接时间
修改/etc/my.cnf
重启数据库
登陆数据库
(主节点)
从节点
从节点2
因为Amoeba是基于jdk1.5开发的,不推荐太新的安装
环境
192.168.195.100 (主)
192.168.195.200(从)
192.168.195.50(从)
192.168.195.101(Amoeba)
192.168.195.250(安装mysql的客户端)
第一步:把安装包传进/opt
执行的时候需要按空格进行,然后在根据提示进行
修改/etc/profile 加入环境变量
并且source /etc/profile ##刷新文件
java -version 查看版本
安装 Amoeba
解压安装包
把amoeba添加到环境变量
修改etc/profile
检查Amoeba是否安装好(图上就说明安装好了)
mysql数据库需要给Amoeba服务器做相关的授权(一主两从都需要修改)(192.168.195.100/200/50)
到/usr/local/amoeba/cnf 修改amoeba.xml
可以修改amoeba的用户名密码
defaultpool 是amoeba默认找的服务器
到/usr/local/amoeba/cnf 修改dbServers.xml
设置amoeba连接数据库的用户名密码
设置master服务器池
设置slaves服务器池,和slaves的调度策略
进入/usr/local/amoeba/bin 启动amoeba
./amoeba start &
检查端口是否开启(amoeba的端口号默认是8066)
测试这台机器需要安装mysql数据库,mariadb数据库也可以
yum install -y mariadb-server mariadb #安装mariadb数据库
systemctl start mariadb.service #启动mariadb
mysql -u amoeba -p -h 192.168.195.101 -P 8066
关闭防火墙 向客户端服务器插入数据客户端192.168.195.250
查看两主一从是否数据已经插入
主 192.168.195.100 :成功
从 192.168.195.200 :成功
从 192.168.195.50 :成功