之前的同步异步,就是,两个数据库同步复制,异步复制
远程客户端发送写操作,首先发给调度器,调度器看见时写操作,就发送给master服务器,主服务器就对数据进行更改。更改之后需要后面把更改的数据传送给从服务器,这里面需要花一点时间,如果 是同步复制,必须等更新全部复制过去,到达从服务器数据库,也更新了从服务器数据库,两边都更新好了,才会告诉用户 修改成功,(主从复制有时候间隔特别长,1小时,不可能等1个小时去结束写操作)
默认用的是异步方式,客户端发送请求到调度器,主要在主服务器上发生变化成功,就立即告诉客户端成功 了,不需要等待复制到从服务器。
异步复制就可能造成数据丢失
为了避免丢失,就一般利用半同步,
就是必须有一台从服务器和主服务器都修改成功了才会返回成功给用户,这个从服务器后期再把它的数据,同步给其他从服务器
这个就是级联复制
也可以另外拓补,只有一个从服务器同步了就认为成功了
半同步想要实现,就需要利用插件
如何实现半同步,先需要安装半同步的插件
主服务上需要装半同步插件,从服务器也需要安装半同步插件
实际就等于基于原来的主从复制实现
安装插件,系统默认其实就已经安装好了,只要启用就可以
master在主服务器上去安装,从服务器安装slave
需要在数据库里启动起来
具体命令
按照格式写就可以了
查看插件列表,现在未安装,还没有
必须要叫这个名字
现在插件已经安装好
查看变量,现在还没启用的
系统变量和状态变量,都没有启用
可以设置全局变量开启
这个状态变量已经变成ON了
在另外的从服务器上也安装插件
slave客户端的安装插件和启用
查看状态变量还是off的
停止同步,再开始同步,就显示状态了
到此半同步应该就成功了
主服务器开始生成数据
从服务器开始同步了
同步完以后还能去查看其它信息
平均等待时长(微秒为单位)
在客户端有也可以看变量,到底有没有启用
服务端可以看到花的时间
生产中一般主从复制到需要半同步复制,确保服务器至少有一个得到最新的数据,所以每个从服务器上都需要装这个插件
从服务器启用半同步,先要把复制的线程先停止,stop slave
复制的过滤,简单来说,就是让两个主从服务器之间,进行复制的时候,可以选择性 的来进行复制
如果不想记录第2个数据库的操作,可以让它的操作不写进二进制日志,也就意味着将来第2个数据出现问题,数据就缺失了
第二种是在从服务器上设置sqlthread这样的线程,让它去读取相关特定的数据库进行还原
中间主服务把数据传到relaylog里,然后经过io线程写到磁盘里
sql线程负责把relaylog整理给io线程,可以设置只要第2个数据库,就不放到本地
明明2数据库不需要复制过去,但是白白复制了一份,不仅浪费了带宽还浪费了磁盘空间
如何实现
replicate_do_db只挑哪些数据库复制
replicate_ignore_db忽略哪些数据库复制
在不进行忽略之前,db1的内容都会进行复制
查看另外的从服务器应该是复制过去的,因为没有过滤
现在要进行过滤
定义之前查看相关变量值
全局的还需要停止复制才能设置
设置成功
查看slave 状态里有没有显示
在主服务器插入记录,查看是否生效
从服务器不复制了
在db2应该能复制成功
从服务器复制成功
所以只是针对db1做的过滤
这个可以用来复制用户数据库,而不复制系统数据库,就可以把数据库过滤掉
还有一种设置就是binlog_do_db,这个不是变量,而是一个服务器选项
用二进制的方法来过滤db2的 复制(思路就是针对这个数据库,不生成二进制日志)
有多个数据,只能单写一行,一行的写,不能连续写,用,号隔开
因为是服务器选项,所以用命令修改应该不支持
f
服务器选项,选项是配置文件里 –
服务器变量,变量是不带–,要写就是命令行set或者写道my.cnf
是跟我们二进制格式是密切相关的
是基于语句型的,就有很多bug
不想复制db2
再去插入数据,查看复制过去没有
没有
加了两条记录都没有起作用,说明没有问题
再另外过滤一个数据库,mysql
mysql是系统数据库,比如用户账号
现在主从是一样的
创建一个用户
从服务器可以同步,但是刚才命名设置不能同步了
为什么可以复制,是因为二进制日志格式的问题
如果是语句型的,数据库将不记录任何语句,(默认的数据库不用use来使用的话,是不记录日志的
写命令的时候,不在任何数据库,没有指定数据库所以基于语句型的就记不住,如何解决问题,改成基于行的二进制日志类型
对于行的记录格式,将记录任何更改
修改成行的
再次创建一个新账号,正常是应该不复制过去,因为有过滤器(刚才是复制成功了
在服务器查还是有
再尝试一次
从服务器又复制过去了
二进制格式修改正常
重新启动一下主服务器,
主服务器再次做尝试
查看从服务器是否也删除
有疑问,没有起到过滤作用
可能因为刚才开启了半同步,两个都是主
从服务器不起用插件,
两边都删除,恢复干净
主服务器创建用户
让从服务器同步
从245复制,是否能把账号创建过来
start slave同步成功,账号复制过来了
没有起作用,试试添加表会不会同步
从服务器,表就没复制过来
但是用户账号复制过来了
试试跨数据库
从服务器又有了,t1没复制过来,t2复制过来了
一般不建议用,因为会造成数据丢失,要用也是用下面的方法,因为不会影响二进制生成,而且功能比较强,支持过滤表,过滤通配符
mysql的复制加密
一般来讲,数据库服务器都是在安全的地方,都在自己的机房里,离的也不太远
但是又部分情况下,主服务器和从服务器离的还挺远,有的企业为了安全,异地来实现主从,但是跨机房通讯,中间的线路可能不安全,而mysql数据库复制走的通讯是不加密的,很有可能被第三方截获数据,SSL,还需要搭建CA
假设已经申请到CA,现在查看服务器该怎么设置
ssl是启用加密,默认是不启用的
disabled是默认目前禁用了ssl加密,如果是NO,不是不启用,而是mysql不支持,不支持的情况下,还得自己编译(如果源码编译没有加这个选项,这个有可能是不支持的,那就只能从头编译了)
ca的证书文件,
ca给master颁发的证书文件
以及master的私钥文件
这三个放在那里无所谓,只有找个文件夹放一下就好了
客户端配置
ca的证书
ca给从服务器的证书
从服务器的私钥