复制的功用:
数据同步、负载均衡读、数据备份、高可用和故障切换、MySQL升级测试等。
接下来将依次实践MySQL的主从复制,主主复制,半同步复制,复制过滤器,基于SSL的复制。
一、主从复制
主从复制中,主节点的dump thread为每个从节点的I/O thread 启动一个dump线程,用于向其发送Binary Log Events
从节点的I/O thread向主节点请求二进制日志事件,并将其保存在本地的中继日志中
SQL thread从本地的中继日志中读取事件,完成replay
主从复制的特点:异步复制,且数据不一致较常见
主从复制配置过程:
1.Master:开启Master的二进制日志,并为其设置一个全局唯一的server_id和一个有复制权限的MySQL用户账号。
①编辑mysql配置文件,写入:
②在主节点授权一个有复制权限(REPLICATION SLAVE,REPLICATION CLIENT)的用户
MariaDB [(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repluser'@'192.168.1.%' IDENTIFIED BY 'replpass';
③为了保证主从复制的事务安全,根据实际需要还有以下参数值得注意:
sync_binlog=ON sync_master_info=ON //会增加I/O压力,根据情况是否开启 /*InnoDB专用参数*/ innodb_flush_logs_at_trx_commit=ON //在事务提交时,将内存中与事务相关的数据立即写入磁盘上的事务日志中 innodb_support_xa=ON //是否支持分布式事务提交
2.Slave:开启slave的中继日志,并为其设置一个全局唯一的server_id,使用在主节点创建的有相关权限的用户连接至主节点并启动复制线程
①编辑mysql配置文件,写入:
②连接至主节点,并启动复制线程
/*连接至主节点*/ MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.1.102',MASTER_USER='repluser',MASTER_PASSWORD='replpass',MASTER_LOG_FILE='master-bin.000001',MASTER_LOG_POS=422; /*开启复制线程*/ MariaDB [(none)]> START SLAVE;
③从节点需要注意的问题:
/*需要限制从节点对数据只有读权限*/ read_only=1 //在配置文件中加入此项,但对拥有SUPER权限的用户无效 mysql > FLUSH TABLES WITH READ LOCK; //施加读锁,阻止所有用户
/*下面的参数根据实际情况选择是否开启*/
skip_slave_start
sync_relay_log
sync_relay_log_info
二、主主复制
主主复制与主从复制类似,不同点在于双方互为对方的主节点。
配置过程:各节点都开启二进制日志和中继日志,各自创建拥有复制权限的用户账号和设置全局唯一的server_id,均把对方设为主节点,并开启复制线程。
具体配置过程与主从复制大体一致,不再赘述,需要注意的是自增长列的id冲突问题,貌似mariadb5.5+以后的版本自动解决了这个问题,因为本人自己操作时,未遇上过id冲突问题,但是为了稳妥起见,还是记下解决此问题的方法:即两个节点,一个用奇数id,一个用偶数id即可。
/*一个节点使用奇数id:*/ auto_increment_offset=1 auto_increment_increment=2 /*一个节点使用偶数id:*/ auto_increment_offset=2 auto_increment_increment=2
三、半同步复制(semi_synchronous_replication)
介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是
一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。
配置过程:同主从复制,区别是在主节点安装semisync_master.so插件,在从节点安装semisync_slave.so插件。
/*主节点*/ MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_enabled=1; /*从节点*/ MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; MariaDB [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled=1;
配置好后,可在主节点使用:
SHOW GLOBAL STATUS LIKE '%semi%'; //查看半同步复制状态 SHOW GLOBAL VARIABLES LIKE '%semi%'; //查看相关服务器变量
四、复制过滤器
让从节点复制指定的数据库或指定数据库的指定表。
有两种实现方式:
1.在主节点实现:仅向二进制日志中记录与特定数据库(特定表)相关的事件;但其存在问题:时间点还原无法实现,不建议使用此方式;
如需强行使用,需要以下几个参数:
binlog_do_db= 数据库白名单
binlog_ignore_db= 数据库黑名单
(两者不能同时使用)
2.在从节点实现:从服务器SQL_THREAD在replay中继日志中的事件时,仅读取与特定数据库(特定表)相关的事件并应用于本地;其也存在问题:会造成网络及磁盘I/O浪费;
replicate_do_db=
replicate_ignore_db=
replicate_do_table=
replicate_ignore_table=
replicate_wild_do_table= 基于通配符匹配表
replicate_wild_ignore_table=
五、基于SSL的复制
前提,MySQL要支持SLL,出现以下参数则证明当前MySQL支持SSL,否则则需要自己重新编译。
配置过程:与主从复制大体一致,只需要将证书放入即可。
创建证书过程不再赘述,主节点配置文件示例:
从节点配置文件,与主节点类似,证书换成自己的就可以。
需要注意的是:证书的属主属组必须设置成mysql运行时的用户,否则ssl不能成功。
以下步骤与主从复制类似:授权一个账号有复制权限,
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'ssl_user'@'192.168.1.%' IDENTIFIED BY 'sslpass' REQUIRE SSL;
从节点开启复制线程:
CHANGE MASTER TO MASTER_HOST='192.168.1.102',MASTER_USER='ssl_user',MASTER_PASSWORD='sslpass',MASTER_LOG_FILE='master-bin.000010',MASTER_LOG_POS=245,MASTER_SSL=1,MASTER_SSL_CA='/usr/local/mysql/ssl/cacert.pem',MASTER_SSL_CERT='/usr/local/mysql/ssl/slave.crt',MASTER_SSL_KEY='/usr/local/mysql/ssl/slave.key';