本博客记录了基于brdkhlog的MySQL主从复制集群的构建过程,留给以后研究。
mysql主从复制集群
MySQL主从机的复制与读写分离
MySQL作为当今世界上应用最广泛的免费数据库,在实际生产环境中,即使使用单个MySQL作为独立数据库,也无法满足安全性、高可用性、高并发性等各个方面的实际需要。
因此,一般在以主从方式同步数据,通过读写分离(MySQL-Proxy )提高数据库的同时负载能力的情况下进行导入和安装。
复制功能的数据分布
负载平衡、数据读取
备份数据
高可用性和故障切换
MySQL升级测试
复制方式
1、主从拷贝
2、主控-主控副本
3、半同步拷贝
复制原理
MySQL有一个称为brdkh日志(二进制日志)的日志,其中包含修改数据库后的所有SQL语句(insert、update、delete、alter、grant等)。 主从复制的原理是通过从数据库服务器运行一次主数据库服务器上的brdkh日志,从数据库服务器
复制流程图
复制过程
1 .主节点必须启用二进制日志以记录更改数据库数据的事件。
2 .从节点打开线程(I/o线程),将其充当mysql的客户端,并通过mysql协议请求主节点二进制日志文件中的事件。
3、主节点启动线程(dump Thread ),检查自己二进制日志中的事件,与对方请求的位置进行比较,如果没有请求位置参数,主节点将从第一个日志文件中的第一个事件开始一个个个地放弃
4 .接收节点从主节点发来的数据,将其置于中继记录(relay log )文件中,记录下一个请求位于二进制记录文件中的哪个位置,如主节点的具体位置。
5、从节点启动另一个线程(sql Thread ),读取中继日志事件,在本地再次运行。
线程在复制过程中的作用
主节点dump Thread对于每个从节点的I/O Thread,调用dump线程将二进制事件发送到从节点。
从节点I/O Thread :从主节点请求二进制日志事件,并保存到中继日志中。
sql Thread :从中继日志读取日志事件,并在本地完成运行。
是否需要从节点创建二进制日志文件?
根据情况,如果从节点需要充当其他节点的主节点,则必须打开二进制日志文件。 这叫做级联拷贝。 如果只用作从节点,则不需要创建二进制文件。
MySQL复制的特点
1、复制异步:主节点用户请求写入时,主节点不需要本地操作写入数据,同时发送到从属服务器,等待服务器反馈,写入完成后再响应用户但是,从节点的数据可能落后于主节点,可以使用一些软件来检查是否延迟。
2、主从数据不一致。
主从配置过程
主节点
1、启用二进制日志。
2 .在当前节点上设置全局唯一的server_id。
3、创建具有复制权限的用户帐户:复制从属端,复制客户端。
从节点
1、启动继电器日志。
2 .在当前节点上设置全局唯一的server_id。
3 .使用具有复制权限的用户帐户连接到主节点并启动复制线程。
主节点配置
1、启用二进制日志文件,在/etc/my.cnf中添加以下内容:
12345[mysqld]
log-brdkh=mysql-brdkh
服务器id=1
innodb-file-per-table=ON
skip_name_resolve=ON
重新启动mysqld服务。
2、查看二进制日志是否打开
1 mysqlshowglobalvariableslike“% log %”;
3、显示主节点二进制日志列表
1mysql show master logs;
4、查看主节点的服务器id
1 mysqlshowglobalvariableslike ' % server % ';
5 .在主节点上创建具有复制权限的用户并更新权限
1grant replication slave,replication clienton *.* to ' replxdhux
c'@'%' identified by '[email protected]';从节点
1、开启中继日志,在 /etc/my.cnf 中添加如下内容:
12345relay-log=relay-log
relay-log-index=relay-log.index
server-id=2
innodb_file_per_table=ON
skip_name_resolve=ON
重启 mysqld 服务。
2、查看中继日志是否开启
1mysql> show global variables like '%log%';
3、查看从节点 server 相关信息
1mysql> show global variables like '%server%';
4、在从节点配置访问主节点的参数信息,添加主节点主机、访问主节点的用户名和密码,主节点二进制文件信息。
注意:主节点的二进制文件一定要是二进制列表中的最后一个二进制文件。
1change master to master_host='172.20.26.149', master_user='replxdhuxc', master_password='[email protected]', master_log_file='mysql-brdkh.000001', master_log_pos=1076;
5、查看从节点的状态信息
1mysql> show slave status G;
由于没有启动从节点的复制线程,I/O 线程和 SQL 线程都为:No
6、启动复制线程,并再次查看从节点状态信息
1mysql> start slave;
start slave 可以指定线程类型:IO_THREAD、SQL_THREAD,如果没有指定,则两个都启动。
到此,mysql 主从复制配置完成。
测试
1、在主节点创建数据库 xdhuxc,并查看主节点二进制日志信息
2、在从节点查看数据库 xdhuxc,并查找二进制日志信息
主从复制架构中应该注意的问题
从节点要设置某些限定使得它不能进行写操作,才能保证复制当中的数据一致。
1、限制从服务器为只读,在从服务器上设置:
1read_only=ON # 设置从服务器为只读,但是此限制对拥有 super 权限的用户均无效。
限制所有用户
1mysql> flush tables with read lock;
2、保证主从复制时的事务安全
1)在主节点
设置参数如下:
1234sync_brdkhlog=1 # 当每进行1次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将brdkhlog_cache中的数据强制写入磁盘。
innodb_flush_logs_at_trx_commit=ON # 在事务提交时,要将内存中跟事务相关的数据立即刷新到事务日志中去。
innodb_support_xa=ON # 分布式事务,基于它来做两段式提交功能
sync_master_info=1 # 每次给从节点 dump 一些事件信息之后,主节点的 master.info 信息会立即同步到到磁盘上,让从服务器中的 master.info 及时更新。
2)在每个从节点上
设置参数如下:
123skip_slave_start=ON # 跳过自动启动,使用手动启动。
sync_relay_log=1 # 每次 sync_relay_log 事件都会刷新到磁盘。
sync_relay_log_info=1 # 每间隔多少事务刷新 relay-log.info,如果是table(innodb)设置无效,每个事务都会更新。
3)其他
在从节点上,master.info 文件中记录着主节点的信息,包括master IP地址,账户名和密码,端口,复制位置等信息
在从节点上,relay-log.info 文件中记录着从节点将来到主节点的哪一个二进制文件中的哪一个位置复制日志,及保存到本地哪一个中继日志的哪一个位置。