sql-主从同步
主从同步
1. 介绍:
复制允许将来自一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)。默认情况下,复制是异步的 从站不需要永久连接以接收来自主站的更新。根据配置,您可以复制数据库中的所有数据库,所选数据库甚至选定的表。
2. 主从原理
主库一个线程 log dump
从库生成两个线程,一个I/O线程,一个SQL线程;
i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;
3. 异步复制与半同步复制区别
主设备将事件写入其二进制日志,但不知道从设备是否或何时检索并处理它们。使用异步复制,如果主服务器崩溃,则它已提交的事务可能尚未传输到任何从服务器。因此,在这种情况下,从主服务器到从服务器的故障转移可能导致故障转移到相对于主服务器丢失事务的服务器。
要了解“ 半同步复制 ”中的 “ 半 ”意味着什么,请将其与异步和完全同步复制进行比较:
通过异步复制,主服务器将事件写入其二进制日志,而从服务器在准备就绪时请求它们。无法保证任何事件都能到达任何奴隶。
使用完全同步复制时,当主服务器提交事务时,所有从服务器也将在主服务器返回执行事务的会话之前提交事务。这样做的缺点是完成交易可能会有很多延迟。
半同步复制介于异步和完全同步复制之间。主设备仅等待至少一个从设备接收并记录事件。它不会等待所有从站确认收到,并且它只需要接收,而不是事件已在从属端完全执行和提交。
缺点:
半同步复制确实会对性能产生一些影响,因为由于需要等待从服务器,提交速度较慢。这是提高数据完整性的权衡。减速量至少是将提交发送到从站并等待从站确认接收的TCP / IP往返时间。这意味着半同步复制最适合通过快速网络进行通信的密切服务器,而对于通过慢速网络进行通信的远程服务器则最差。
4. 配置(更改配置及时重启Mysql)
1. MySQL 5.5及以上版本
2. 变量have_dynamic_loading为YES
mysql> show variables like '%Rpl%';
rpl_semi_sync_master_wait_for_slave_count
MySQL 5.7.3引入的,该变量设置主需要等待多少个slave应答,才能返回给客户端,默认为1。
rpl_semi_sync_master_wait_no_slave
ON
默认值,当状态变量Rpl_semi_sync_master_clients中的值小于rpl_semi_sync_master_wait_for_slave_count时,Rpl_semi_sync_master_status依旧显示为ON。
OFF
当状态变量Rpl_semi_sync_master_clients中的值于rpl_semi_sync_master_wait_for_slave_count时,Rpl_semi_sync_master_status立即显示为OFF,即异步复制。
说得直白一点,如果我的架构是1主2从,2个从都采用了半同步复制,且设置的是rpl_semi_sync_master_wait_for_slave_count=2,如果其中一个挂掉了,对于rpl_semi_sync_master_wait_no_slave设置为ON的情况,此时显示的仍然是半同步复制,如果rpl_semi_sync_master_wait_no_slave设置为OFF,则会立刻变成异步复制。
3. 配置主从服务器
a . 配置主服务器
1. 更改配置文件,首先检查你的主服务器上的my.cnf文件中是否已经在[mysqld]模块下配置了log-bin和server-id
上面的log-bin和server-id的值都是可以改为其他值的,如果没有上面的配置,首先关闭mysql服务器,然后添加上去,接着重启服务器
2.创建用户,每一个从服务器都需要用到一个账户名和密码来连接主服务器,可以为每一个从服务器都创建一个账户,也可以让全部服务器使用同一个账户。下面就为同一个ip网段的所有从服务器创建一个只能进行主从同步的账户。
首先登陆mysql,然后创建一个用户名为rep,密码为123456的账户,该账户192.168.253网段下的所有ip地址使用,且该账户只能进行主从同步
3.获取二进制日志的信息并导出数据库,步骤:
首先登陆数据库,然后刷新所有的表,同时给数据库加上一把锁,阻止对数据库进行任何的写操作
然后执行下面的语句获取二进制日志的信息
如果数据量很大,可以在导出时就压缩为原来的大概三分之一
对数据库解锁,恢复对主数据库的操作
b . 配置从服务器
注意上面的server-id的值都是可以改为其他值的(建议更改为ip地址的最后一个字段),如果没有上面的配置,首先关闭mysql服务器,然后添加上去,接着重启服务器
如果有多个从服务器上,那么每个服务器上配置的server-id都必须不一致。从服务器上没必要配置log-bin,当然也可以配置log-bin选项,因为可以在从服务器上进行数据备份和灾难恢复,或者某一天让这个从服务器变成一个主服务器
如果主服务器导出了数据,下面就导入该文件,如果主服务器没有数据,就忽略这一步
如果从主服务器上拿过来的是压缩文件,就先解压再导入
配置同步参数,登陆mysql,输入如下信息:
启动主从同步进程
检查状态
4. 主从服务器开启半同步复制(默认异步复制)
a . 首先加载插件
因用户需执行INSTALL PLUGIN, SET GLOBAL, STOP SLAVE和START SLAVE操作,所以用户需有SUPER权限。
主:
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
从:
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
查看插件是否加载成功
有两种方式
查看插件是否加载成功
有两种方式
1.
mysql> show plugins;
2.
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';
b . 启动半同步复制
在安装完插件后,半同步复制默认是关闭的,这时需设置参数来开启半同步
主:
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
从:
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
以上的启动方式是在命令行操作,也可写在配置文件中。
主:plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1
从:plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1
5. 重启从上的IO线程
mysql> STOP SLAVE IO_THREAD;
mysql> START SLAVE IO_THREAD;
如果没有重启,则默认还是异步复制,重启后,slave会在master上注册为半同步复制的slave角色。
查看半同步是否在运行
主:
mysql> show status like 'Rpl_semi_sync_master_status';
从:
mysql> show status like 'Rpl_semi_sync_slave_status';
这是之前领导让研究自己找的一些资料有侵权请联系