目录
0.前言
mysql是现在普遍使用的数据库,但是如果宕机了必然会造成数据丢失。为了保证mysql数据库的可靠性。就要会一些提高可靠性的技术。
为什么要主从复制、读写分离
主从复制、读写分离一般是一起使用的。目的很简单,就是为了提高数据库的并发性能。你想,假设是单机,读写都在一台MySQL上面完成,性能肯定不高。如果有三台MySQL,一台mater只负责写操作,两台salve只负责读操作,性能不就能大大提高了吗?
所以主从复制、读写分离就是为了数据库能支持更大的并发。
随着业务量的扩展、如果是单机部署的MySQL,会导致I/O频率过高。采用主从复制、读写分离可以提高数据库的可用性。
1.主从复制的作用
做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的评率,提高单个机器的I/O性能。
读写分离,使数据库能支持更大的并发。在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。1--在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;(主库写,从库读,降压)
2--在从主服务器进行备份,避免备份期间影响主服务器服务;(确保数据安全)
3--当主服务器出现问题时,可以切换到从服务器。(提升性能)
2. 主从复制的原理
当Master节点进行insert、update、delete操作时,会按顺序写入到binlog中。
salve从库连接master主库,Master有多少个slave就会创建多少个binlog dump线程。
当Master节点的binlog发生变化时,binlog dump 线程会通知所有的salve节点,并将相应的binlog内容推送给slave节点。
I/O线程接收到 binlog 内容后,将内容写入到本地的 relay-log。
SQL线程读取I/O线程写入的relay-log,并且根据 relay-log 的内容对从数据库做对应的操作。
3.异步主从复制
原理图
使用二进制日志文件位置进行异步复制
配置server1,2的mysql编辑server1
log-bin=mysql-bin ##启用二进制日志记录 server-id=1 ##复制拓扑中的每个服务器都必须配置一个唯一的服务器ID,用于标识复制拓扑中的各个服务器
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'westos'; ##创建一个单独的用户,供server2连接使用 mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; ##授权 mysql> SHOW MASTER STATUS; ##确定当前的二进制日志文件名和位置
编辑server2
如果server1上已经建立了数据库、表或者写入了数据。那么server2上也需要先存在这些东西,这是因为二进制文件里记录的是执行的动作,从机来复制这些动作。从机里没有被操作的东西,那就无法执行动作。如果server1的mysql是全新的话,则可以直接继续设置server2。
mysql> CHANGE MASTER TO -> MASTER_HOST='172.25.0.1', -> MASTER_USER='repl', -> MASTER_PASSWORD='westos', -> MASTER_LOG_FILE='mysql-bin.000001', ##二进制文件名 -> MASTER_LOG_POS=595; ##二进制文件位置 mysql> start slave; ##开启复制线程slave show slave status\G; ##查看slave日志
IO为no是检查赋予的用户,火墙
SQL为no是检查mysql组是否一致
使用 GTID 事务进行异步复制
gtid_mode=ON ##启用 GTID 模式来启动每个服务器
server2同理
进入mysql
MASTER_AUTO_POSITION = 1; ##使用gtid
测试
创建组
创建表并添加用户查看server2
4.半同步复制
在异步复制已设置完成的前提下,继续配置半同步复制。半同步复制是使用插件实现的,所以插件必须安装到服务器才能使用
master
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; ##安装插件 SET GLOBAL rpl_semi_sync_master_enabled =1; ##启用插件 show status like 'Rpl_semi%'; ##查看插件状态
slave
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; ##安装插件 SET GLOBAL rpl_semi_sync_slave_enabled = 1; ##启动插件 STOP SLAVE IO_THREAD; ##重启IO线程 START SLAVE IO_THREAD; show status like 'Rpl_semi%'; ##查看插件状态
重新启动
server2,1中均已开启
添加信息
5.延迟复制
延迟复制可以设置副本服务器故意落后于源至少指定的时间
STOP SLAVE SQL_THREAD; CHANGE MASTER TO MASTER_DELAY=60; ##延迟60秒 START SLAVE SQL_THREAD;
添加列表信息测试
6.多主复制
多个master多个slave
开启slave服务
将westos组传入server3中 将dump.sql导入到server3mysql的westos组中 server2配置server3配赋予repl用户mysql下的权限将server2设为master 测试
7.组复制
我们以server1、server2和server3为例,演示部署组复制(一个组最少3个成员,最多9个成员)。因为在前面做了一些mysql的实验,所以需要停止服务,并清空数据目录,再进行部署。
server1
plugin_load_add='group_replication.so' ##将 Group Replication 插件添加到服务器在启动时加载的插件列表中 transaction_write_set_extraction=XXHASH64 group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" ##告诉插件它正在加入或创建的组名为“aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa” group_replication_start_on_boot=off ##插件在服务器启动时不自动启动操作 group_replication_local_address= "server1:33061" ##成员用于与组中其他成员进行内部通信的网络地址和端口 group_replication_group_seeds= "server1:33061,server2:33061,server3:33061" ##组成员的主机名和端口 group_replication_bootstrap_group=off
在mysql内修改密码不会添加到日志里,方便做组复制
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery'; ##使用复制通道的给定凭据
mysql> SET GLOBAL group_replication_bootstrap_group=ON; ##引导启动组,引导程序只能由一个服务器完成 mysql> START GROUP_REPLICATION; ##开启 mysql> SET GLOBAL group_replication_bootstrap_group=OFF; mysql> SELECT * FROM performance_schema.replication_group_members; ##查看组成员
注意:引导程序只由一台服务器完成即可,这里server1引导了,所以接下来的server2和server3就不需要这一步了。
server2
修改密码密码必须一致
mysql> SET SQL_LOG_BIN=0; mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password'; ##用户凭证 mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%'; mysql> FLUSH PRIVILEGES; mysql> SET SQL_LOG_BIN=1;
server3 与server2 同理在server1中检查是否为ONLINE 测试
server1添加内容server2查看 server3