mysql的主从复制有:
1、单向一主多从:
Master===>Slave
或者
Master===>Slave1(2)(3)…
2、双向主主同步:
Master(1)<====>Master(2)
双向主主同步是指两台服务器都分别是对方的主服务器,不管在哪一台服务器上写东西,都会同步到另一台服务器上。
双主服务器会有一些问题,我们假设两台服务器同时在写入一个相同的记录,这样就会导致出现阻塞,一般我们采用的分配id的方式避免出现这种问题。
所谓的分配id方式是指,如果一共存在6条记录,那么将1、3、5分配为从Master(1)写入数据,2、4、6从Master(2)写入数据,这样就不会出现两边同时记录一条数据的情况
3、线性级联单向双主同步
Master(1)===>Master(2)===>Slave(1)
是指写入Master(1)的数据会同步给Master(2),再由Master(2)同步给Slave(1)。这种模式一般用的不多,偶尔在高可用的时候会采用
4、环状级联单向多主同步
三个Master成环形,不管写入哪一个,都会按照方向同步给下一个,再同步给最后一个!这种模式同样需要分配id
5、环状级联单向多主多从同步
异步传输和同步传输
1、同步传输
同步传输是实时传输,举个例子,当我们伸手将物品递给对方,对方伸手取走物品的那一刻,一个同步传输就完成了。如果对方没有接受,我们就要一直等待,就会造成阻塞。
2、异步传输
异步传输是指我们与对方约定一个时间地点。我们将物品放在某个地方,对方每隔X分钟后就来取走,这样的传输称为异步传输。
毫无疑问,异步传输的发送速率要远快于同步传输。他能很好的解决传输过程中接收方速度缓慢造成的阻塞,大部分的mysql主从复制也采用的是异步传输
如何防止从库记录数据
当主从复制配置好之后,所有的数据更改都要在主服务器上,从而避免因为从主服务器上的更新与从服务器的更新不一致而发生的冲突。那么如何避免往从服务器上写数据呢?我们下面来介绍
我们的思路是从技术手段上禁止从服务器上写入数据
第一种方法,采用忽略授权表的方式同步,再在从库上给用户仅授权select读的权限,这条记录并不同步mysql数据库,这样我们就保证了同样的用户在主库和从库拥有不同的权限。
案例说明:这里表示给ip为172.25.254.62的用户westos一个管理westos数据库的所有表(*表示所有表)的只读权限(SELECT),密码为redhat。
生产环境主库授权:
GRANT SELECT,INSET,UPDATE,DELETE ON `westos`.* TO'westos'@'172.25.254.%' identified by 'redhat';
##给定查询,插入,更新,删除的权限
生产环境从库授权:
GRANT SELECT ON `westos`.* TO 'westos'@'172.25.254.%' identified by 'redhat'
##给从库一个查询的权限
另外再在主库配置:binlog-ignore-db=mysql
这条命令使数据不写入日志,这样从库就没有这个用户的信息,不再自动更新执行用户的权限,而是手动执行
第二种方法
除了上面在从库仅做SELECT的授权外,还可以在slave服务器启动选项增加参数或者在my.cnf配置文件中加入read-only参数来确保从库只读。当然用户授权和read-only两种方式同时操作更佳,这也是我们生产环境中使用的方案
主从复制的应用场景
1、主从服务器互为备份
主从服务器架构的设置,当主服务器出现问题的时候,可以手工或自动的切换到从服务器上继续提供服务。
2、主从服务器读写分离分担网站压力
主从服务器可通过代理软件或程序对用户的请求实施读写分离,即来自用户select(查询)的申请全部交给从服务器,从而降低用户的查询响应时间,和读写都在主服务器所带来的压力。更新数据仍然交给主服务器,确保主服务器和从服务器的数据同步
3、根据服务器拆分业务独立并分担压力
可以把几个不同的服务器,通过业务不同而进行划分。比如说,在一主五从的架构中,我们将三个服务器做LB并交给用户访问,一个服务器给后台人员提供服务,一个服务器给DBA进行增量备份。
怎样实现读写分离
1、通过程序实现
php和java都可以设置多个连接点实现读写分离,检查到如果是update,insert,delete的时候就连接写库,select就连接查库
2、通过软件实现
恩恩,可以的!自行百度!
Mysql生产场景常用架构
1、
如图所示,客户端的访问首先通过一个LB分发给web服务器,再由web服务器分发给从库或者主库。
2、
当客户端访问的时候,先通过一个LB分发给web端,web再通过一个LB分发给各个从库
MySQL的原理
1、MySQL主从复制包含有两个IO线程,一个SQL线程。其中,master端含有一个IO线程,SLAVE端含有一个IO线程,一个SQL线程。
2、主库更新之后,会利用参数将所使用的update,delete等改变数据库数据的sql语句放入bin-log000X之中。
3、MYSQL从库开启复制开关,从库IO线程向主库发起请求,主库验证之后同意请求,从bin-Log000X中取出sql语句,并且记录位置信息以告诉从库下一次更新时的位置起点,再通过IO线程发送给从库,从库的IO线程将sql语句放入Relay log(中继日志),把主库中的bin-log000X的位置信息放入Master-info里。
4、之后从库的SQL线程读取Relay log获取到与主库相同的sql语句信息并且执行,这样就完成了一次更新。
5、再后进行下一次更新,从库的IO线程读取Master-info得到上一次更新的截至地址,再从上一次的截至地址开始获取到如今最新的sql语句并通过IO线程发送给从库。
注意事项:第一个位置信息点之前的数据,需要锁表将数据打包发送给从库并且记录第一个位置信息点,保证进行主从复制的时候,主从库完全相同。