赞
踩
通过搭建MySQL主从集群,可以缓解MySQL的数据存储以及访问的压力。
注意:我们不能对备份的的节点进行写操作只能进行读,我们写入一定是写入主节点
具体流程如下:
注意:
1 一主一从
2 主主复制
存在数据一致性问题,可以提高读写能力。
3 一主多从
4 多主一从(mysql5.7以后)
主一从的MySQL主从同步集群,具有了数据同步的基础功能。而在生产环境中,通常会以此为基础,根据业务情况以及负载情况,搭建更大更复杂的集群,掌握了一主一从的搭建方式,其它的方式就好弄了。
互主集群:我们也可以扩展出互为主从的互主集群甚至是环形的主从集群,实现多活部署。
5 联级复制
降低主从同步的延迟,降低主服务器的压力,因为同步也是要消耗资源的。
首先配置主服务器
[mysqld] # binlog刷盘策略 sync_binlog=1 # 需要备份的数据库 binlog-do-db=hello # 不需要备份的数据库 binlog-ignore-db=mysql # 启动二进制文件 log-bin=mysql-bin # 服务器ID server-id=132 #设置错误日志输出路径 log-error=/var/lib/logs/log-err.log log_warnings=1 #慢查询相关日志 log_output=FILE slow_query_log=1 long_query_time=10 slow_query_log_file=/var/lib/logs/slow_query_log.log #记录没有使用到索引的sql语句 log_queries_not_using_indexes=ON
创建用于同步的用户
#需要保证mysql-slave 主机名能够被解析
CREATE USER 'slave' @'mysql-slave' IDENTIFIED BY '654321';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave' @'mysql-slave';
docker run -d -p 3306:3306 -v $(pwd)/logs:/var/lib/logs -v $(pwd)/conf:/etc/mysql/conf.d -v $(pwd)/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=654321 --name mysql-master mysql:5.7
show master status;
创建从数据库
[mysqld]
server-id=133
#设置错误日志输出路径
log-error=/var/lib/logs/log-err.log
log_warnings=1
#慢查询相关日志
log_output=FILE
slow_query_log=1
long_query_time=10
slow_query_log_file=/var/lib/logs/slow_query_log.log
#记录没有使用到索引的sql语句
log_queries_not_using_indexes=ON
#--link 这样从数据库可以直接和主数据库通信 原理就是在从数据库hosts文件里加了容器的端口映射并且和容器进行绑定
docker run -d -p 13306:13306 --link=mysql:msql-master -v $(pwd)/logs:/var/lib/logs -v $(pwd)/conf:/etc/mysql/conf.d -v $(pwd)/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=654321 --name mysql-slave mysql:5.7
change master to
master_host='myql-master',
master_port=3306,
master_user='slave',
master_password='654321',
master_log_file='mysql-bin.000004',
#这个值一定要填我上面 show master status 中的偏移值
master_log_pos=6316,
MASTER_AUTO_POSITION=0;
start slave;
show slave status \G;
验证这个时候我们去主库间插入数据,就会被同步到从库。
基于主从复制有这样几个问题:
1 如果我们部署的是一主多从,这个时候如果主节点挂掉了,需要从节点变为主节点是一件麻烦的事情,并且丢失了很多数据。
2 同步有延迟或者同步丢失。
什么是GTID?
从 MySQL 5.6.5 开始新增了一种基于 GTID 的复制方式。GTID即全局事务ID (Global TransactionIdentifier),其保证每个主节点上提交的事务,在从节点可以一致性的复制。
这种方式强化了数据库的主备一致性,故障恢复以及容错能力。GTID在一主一从情况下没有优势,对于两主以上的结构优势异常明显,可以在数据不丢失的情况下切换新主
GTID实际上是由UUID+TID (即transactionId)组成的,其中UUID(即server_uuid) 产生于auto.conf文件,是一个MySQL实例的唯一标识。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增,所以GTID能够保证每个MySQL实例事务的执行。GTID在一组复制中,全局唯一
。 通过GTID的UUID可以知道这个事务在哪个实例上提交的。
GTID的优势
set global SQL_SLAVE_SKIP_COUNTER=1;
start slave sql_thread;
GTID 主从复制原理
在使用GTID的时候如果这个时候一主多从,切换从节点为主节点非常的方便,我们可以找到数据较为完整的Server。由于MASTER_AUTO_POSITION功能的出现,我们都不需要知道GTID的具体值,直接使用
CHANGE MASTER TO MASTER_HOST=‘xxx’,MASTER_AUTO_POSITION命令就可以直接完成failover的工作。
注意:在我们切换完Master以后不要在这个数据库上进行一些操作,例如更新和删除数据,因为这部分事务到时候会同步到从节点,万一操作错了,从节点的数据也被刷新了,容易导致数据出问题。
下面我们基于上面的一主一从来搭建GTID主从(直接搭建一主多从,需要重启):
主节点的配置
[mysqld] server-id=133 #设置错误日志输出路径 log-error=/var/lib/logs/log-err.log log_warnings=1 #开启gtid gtid_mode=on enforce_gtid_consistency=on # 做级联复制的时候,再开启。允许下端接入slave log_slave_updates=1 #慢查询相关日志 log_output=FILE slow_query_log=1 long_query_time=10 slow_query_log_file=/var/lib/logs/slow_query_log.log #记录没有使用到索引的sql语句 log_queries_not_using_indexes=ON
#查看服务器的UUID
cat /var/lib/mysql/auto.cnf
#可以才看到GTID 是UUID + 事务ID
show master status;
从服务器
由于我们之前已经有数据了所以我们要,先把数据迁移过来。
#备份
mysqldump -u root -p --all-databases > backup.sql
#导入
mysql -uroot -p < backup.sql
[mysqld] # binlog刷盘策略 sync_binlog=1 # 需要备份的数据库 binlog-do-db=hello # 不需要备份的数据库 binlog-ignore-db=mysql # 启动二进制文件 log-bin=mysql-bin # 服务器ID server-id=132 #设置错误日志输出路径 log-error=/var/lib/logs/log-err.log log_warnings=1 #慢查询相关日志 log_output=FILE slow_query_log=1 long_query_time=10 slow_query_log_file=/var/lib/logs/slow_query_log.log #记录没有使用到索引的sql语句 log_queries_not_using_indexes=ON gtid_mode=on enforce_gtid_consistency=on # 强烈建议,其他格式可能造成数据不一致 binlog_format=row
change master to
master_host='mysql-master',
master_port=3306,
master_user='slave',
master_password='654321',
MASTER_AUTO_POSITION=1;
另一个服务器一样的操作,记得一定要修改server-id。接着去验证是否同步即可。
1)异步复制
MySQL主从集群默认采用的是一种异步复制的机制。
主服务在执行用户提交的事务后,写入binlog日志,然后就给客户端返回一个成功的响应了。而binlog
会由一个dump线程异步发送给Slave从服务。由于这个发送binlog的过程是异步的。主服务在向客户端
反馈执行结果时,是不知道binlog是否同步成功了的。这时候如果主服务宕机了,而从服务还没有备份
到新执行的binlog,那就有可能会丢数据。
2)半同步复制
半同步复制机制是一种介于异步复制和全同步复制之前的机制。
主库在执行完客户端提交的事务后,并不是立即返回客户端响应,而是等待至少一个从库接收并写到relaylog中,才会返回给客户端。
MySQL在等待确认时,默认会等 10 秒,如果超过10秒没有收到ack,就会降级成为 异步复制 。
这种半同步复制相比异步复制,能够有效的提高数据的安全性。但是这种安全性也不是绝对的,他只保证事务提交后的binlog至少传输到了一个从库,且并不保证从库应用这个事务的binlog是成功的。另一方面,半同步复制机制也会造成一定程度的延迟,这个延迟时间最少是一个TCP/IP请求往返的时间。整个服务的性能是会有所下降的。而当从服务出现问题时,主服务需要等待的时间就会更长,要等到从服务的服务恢复或者请求超时才能给用户响应。
我们基于上面的GTID一主两从来搭建,只需要在这个基础上加上半同步机制就行。
#查看当前数据库是否支持 版同步机制
select @@have_dynamic_loading;
#查看插件的位置
show variables like 'plugin_dir';
安装插件
主机节点
install plugin rpl_semi_sync_master soname 'semisync_master.so';
#查看半同步机制的参数
show global variables like 'rpl_semi%';
#开半同步机制
set global rpl_semi_sync_master_enabled=ON;
# 单位是毫秒,可动态调整,表示主库事务等待从库返回commit成功信息超过30秒就降为异步模式,
set global rpl_semi_sync_master_timeout=30000;
#查看插件是否搭建成功了
select * from mysql.plugin;
#监控状态
show status like 'rpl_semi_sync%';
半同步复制有两种方式,rpl_semi_sync_master_wait_point通过这个参数指定:
安装从节点的插件
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
#开启半同步
set global rpl_semi_sync_slave_enabled = on;
#监控状态
show status like 'rpl_semi_sync%';
验证停止其中的一个节点
stop slave io_thread;
#下面插入一条数据然后看半同步状态
#恢复
start slave;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。