第一部分:主从复制介绍
MySQL的二进制日志(binglog)会记录所有对数据库进行更改的操作,也就是说只要是会对数据库产生修改的操作都会被记录到二进制日志中去。
记录二进制日志的主要目的有两方面:
1. 恢复
2. 复制
MySQL的复制就是基于二进制日志而完成的,其工作原理如下:
当MySQL的Master节点的数据有更改的时候,Master会主动通知Slave,让Slave主动来Master获取二进制日志,于是Slave开启一个I/O thread,向Master请求二进制日志中记录的语句;Master将二进制日志中记录的语句发给Slave,Slave则将这些语句存到中继日志中,进而从中继日志中读取一句,执行一句,直到所有的语句被执行完。而经SQL语句从中继日志中读取出来,再一一执行的进程叫做SQL thread;将这些语句执行完之后,从节点的数据就和主节点的数据相同了,这就是所谓的MySQL主从复制。
由MySQL的主从复制原理可知:
1 Master节点必须开启二进制日志功能
2 Slave节点必须开启中继日志功能
3 Slave节点需关闭二进制日志功能(默认不配置即可)
4 Master和Slave节点需要配置不同的server-id
5 Slave节点需连接到Master节点
半同步复制介绍:
默认情况下,MySQL 5.5/5.6/5.7和MariaDB 10.0/10.1的复制功能都是异步的,异步复制的情况下可以提供最佳的性能。但是如果从节点没有接收到主节点发送过来的binlog日志时,会造成主从节点的数据不一致,甚至在恢复时造成数据丢失。
为了解决异步复制的数据丢失的问题,MySQL 5.5引入一种半同步复制模式,该模式可以确保从节点接收完主节点发送的binlog日志文件并写入自己的中继日志(relay log)里,然后会给主节点一个反馈,告诉对方已经接收完毕,这时主库线程才返回给当前session告知操作完成。当出现超时情况时,源主节点会暂时切换到异步复制模式,直到至少有一个设置为半同步复制模式的从节点及时收到信息为止。
注:半同步复制模式必须在主从节点同时启用,否则主节点默认使用异步复制模式。
上面提到了半同步复制和异步复制的切换,这里再详细描述一下:
它的工作原理是当Slave从库的io_thread线程将binlog日志接收完毕后,应给主库一个确定的信号,如果rpl_semi_sync_master_timeout=10000(10秒)超过10秒未收到Slave从库的接收确认信号,那么就自动切换为传统的异步复制模式。
第二部分:Mariadb环境安装
MariaDB 主: 10.1.19-MariaDB 47.244.48.255
MariaDB 从: 10.1.19-MariaDB 47.244.48.254
Centos: 7.4
配置yum源:
[root@iZj6c7wi1korz5hl5k0vf8Z yum.repos.d]# cat MariaDB-219.repo
# MariaDB 10.2 RedHat repository list - created 2019-01-16 11:43 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2.19/rhel7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
清除yum缓存:
Yum clean all
Yum list
查看yum 源的mariadb的版本是否正确:
yum list | grep mariadb
安装:mariadb
yum install MariaDB-server MariaDB-client –y
我们这里的主从架构使用半复制模式,而半同步复制模式需要插件,默认的MariaDB部署包(MariaDB-server)中已经包含半同步复制插件
find / -name semisync*
第三部分:Mariadb配置
启动服务并安全设置:
systemctl start mariadb
mysql_secure_installation 安全设置 密码 和删除 测试表和用户(一路Y)
更改数据存储目录:
systemctl stop mariadb
mkdir /data/mariadb 创建数据存储目录
cp -a /var/lib/mysql/* /data/mariadb 拷贝相关文件
修改配置文件:
vim /etc/my.cnf.d/server.cnf
[root@iZj6c7wi1korz5hl5k0vf8Z ~]# cat /etc/my.cnf.d/server.cnf | grep -v '^#'
[server]
[mysqld]
datadir=/data/mariadb
socket=/var/lib/mysql/mysql.sock
character_set_server=utf8
slow_query_log=on
slow_query_log_file=/data/mariadb/logs/slow_query_log.log 慢查询日志
long_query_time=2
log-error = /data/mariadb/logs/error.log error日志
创建相关日志文件:
cd /data/mariadb/
mkdir logs
touch logs/slow_query_log.log
touch logs/error.log
数据目录授予mysql用户:
chown mysql.mysql -R /data/mariadb/
启动Marriadb:systemctl start mariadb
第四部分:Mariadb半步同步配置
设置Master节点:
进入到数据安装插件并开启半部同步复制:
install plugin rpl_semi_sync_master soname 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled =1;
在初次加载插件后,MySQL会将该插件记录到系统表mysql.plugin中,下次启动系统则会自动加载该插件,无需再次执行上面的命令。
查看插件是否安装:
MariaDB [(none)]> show plugins;
查看 半部复制是否开启
show variables like 'rpl%';
修改配置主文件:
[root@iZj6c7wi1korz5hl5k0vf8Z ~]# cat /etc/my.cnf.d/server.cnf | grep -v '^#'
[server]
[mysqld]
datadir=/data/mariadb
socket=/var/lib/mysql/mysql.sock
character_set_server=utf8
slow_query_log=on
slow_query_log_file=/data/mariadb/logs/slow_query_log.log
long_query_time=2
log-error = /data/mariadb/logs/error.log
skip_name_resolve = ON
innodb_file_per_table = ON
server-id = 100
log-bin=master-bin
log-bin-index=master-bin.index
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
expire_logs_days = 5
binlog_format = row
binlog_row_image = minimal
[galera]
[embedded]
[mariadb]
[mariadb-10.2]
创建同步用户: 用于从节点连接使用
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'fuzhiuser'@'47.244.55.84' IDENTIFIED BY '123456';
查看:binlog日志:
show master status;
File 和 position 是在从库 连接主库的时候会用到,会从343 以后开始做数据同步
设置Master节点:
进入到数据安装插件并开启半部同步复制:
install plugin rpl_semi_sync_master soname 'semisync_master.so';
SET GLOBAL rpl_semi_sync_slave_enabled =1;
配置主配置文件:
[root@iZj6c4vks3kjsy7sa8b4l4Z mariadb]# cat /etc/my.cnf.d/server.cnf | grep -v '^#'
[server]
[mysqld]
datadir=/data/mariadb
socket=/var/lib/mysql/mysql.sock
character_set_server=utf8
slow_query_log=on
slow_query_log_file=/data/mariadb/logs/slow_query_log.log
long_query_time=2
log-error = /data/mariadb/logs/error.log
skip_name_resolve = ON
innodb_file_per_table = ON
server_id=101 #(ID号不能和主库相同)
relay_log_index = slave_relay_bin.index
relay_log = slave_relay_bin
rpl_semi_sync_slave_enabled =1
[galera]
[embedded]
[mariadb]
[mariadb-10.2]
连接主库:
change master to master_host='47.244.48.255',master_user='fuzhiuser',master_password='123456',master_log_file='master-bin.000007',master_log_pos=343;
参数说明:
半同步复制的配置参数较少,其中在Master主库上有4个相关参数,说明如下:
rpl_semi_sync_master_enabled=ON 表示在master上开启半同步复制模式。
rpl_semi_sync_master_timeout=10000 该参数默认为10000毫秒,即10秒。不过,这个参数是动态可调的,它用来表示如果主库在某次事务中的等待时间超过10秒,则降级为异步复制模式,不再等待slave从库。如果主库再次探测到slave从库恢复,则会自动回到半同步复制模式。
rpl_semi_sync_master_wait_no_slave 表示是否允许master每个事务提交后都要等待slave的接收确认信号。默认为on,即每一个事务都会等待。如果为off,则slave追赶上后,也不会开启半同步复制模式,需要手工开启。
rpl_semi_sync_master_trace_level=32 表示用于开启半同步复制模式时的调试级别,默认为32。
在Slave从库上共有2个配置参数,如下:
rpl_semi_sync_slave_enabled=ON 表示在Slave上已经开启半同步复制模式。
rpl_semi_sync_slave_trace_level=32 表示用于开启半同步复制模式时的调试级别,默认为32。
第五部分:验证Mariadb半步同步
查看主从节点的配置
Master节点:
show variables like 'rpl%';
Slave节点:
show variables like 'rpl%';
查看主从半同步服务状态
Master节点:show global status like 'rp%';
Slave节点: show global status like 'rp%';
3 如果有数据可将主服务器的数据全部导入到从库,如果没有数据则直接启动slave 然后手动创建数据测试
4 启动主从复制:
在从节点数据库中运行:
Start slave
5 查看slave 状态 两个yes说明已经成功
6 查看 master 和 slave的启动进程
Master节点进程:
show processlist;
slave节点进程:
show processlist;
7 创建数据验证是否能够进行数据同步
在master创建新数据:
create database semi_repl_db;
use semi_repl_db;
create table test(id int,name text);
insert into testvalues(1,'mariadb');
insert into test values(2,'duke');
insert into test values(3,'q');
查看数据:select * from test;
8 从库验证数据:
use semi_repl_db;
select * from test;
至此已经同步成功。
第六部分:补充
基于上面的半同步复制配置复制的过滤器,复制过滤最好在从服务器上设置,步骤如下
从服务器配置
1 关闭服务
systemctl stop mariadb.service
2 编辑主配置文件
增加 :
replicate-do-db = mydb (只复制mydb数据库的内容)
补充:常用的过滤选项如下
Replicate_Do_DB=
Replicate_Ignore_DB=
Replicate_Do_Table=
Replicate_Ignore_Table=
Replicate_Wild_Do_Table=
Replicate_Wild_Ignore_Table=
3 重启服务
systemctl start mariadb.service
4重启mariadb server后,半同步复制功能将被关闭,因此要重新启动
set global rpl_semi_sync_slave_enabled = ON;
stop slave 先关闭在
start slave 在启动
5 测试方法
在主库上面已有的测试库创建新数据(表) 然后在从库查看有没有(设置成功应该没有)
然后创建mydb 库,并写入数据 然后在从库查看(设置成功应该会看得到数据)