上周我们介绍了关于数据库的备份与恢复,大家也差不多可以在日常生产中做到数据的保障,但是如果我们的数据库服务器真的宕机或者各种问题崩溃,等我们恢复过来也会损失很多的用户或者交易额,这是生产中可以避免就避免的问题,所以今天我们来介绍数据库的主从复制,实现数据库的高可用和备份效果,减少时间库的维护时间,增加可用时间!
一般的生产环境中,都是一个主库加一个从库,还有一个远程的灾备库,当我们由于各种原因宕机崩溃时,还可以至少有一个库对外提供服务,不至于全盘over。
我们首先提供三台机器,分别为一主两从,分别安装mariadb-server。
修改主数据库的配置文件:vim /etc/my.cnf
[mysqld]
server-id=1 #给数据库指定唯一id
log-bin=mysql-bin #开启mysql的二进制日志
skip-name-resolve #跳过名词解析,非必须
systemctl restart mariadb
mysql < show master stauts; #查看二进制日志状态,写哪个File,从那个Position开始
mysql < grant replication slave,replication client on *.* to [email protected]‘slave_server_ip‘ identified by ‘centos‘; #建立一个备份使用的用户,给予复制的权限
修改从数据库的配置文件:vim /etc/my.cnf
[mysqld]
server-id=2
log-bin=mysql-bin
read-only=1 #开启只读,双写会问题
relay-log=mysql-relay-log #开启中继日志
log-slave-updates=1 #开启从跟随主二进制日志更新
systemctl restart mariadb
mysql < change master to master_host = ‘master_server ip‘, #指定主库的ip
< change master_user=‘slave‘ #上面定义的用户
< change master_password=‘centos‘ #上面定义的密码
< change master_log_file=‘File‘
< change master_log_pos=‘Position‘;
start slave;
show slave status\G;
Slave_IO_Running: Yes #I/O线程正常运行
Slave_SQL_Running: Yes #SQL线程正常运行
当我们配置完成后我们可以使用数据的各种的SQL语句,测试一下是否会自动复制同步!
这里的好多有人要问了,为什么这么配置?从库的不可写是因为当两个数据库同时写到一个block块上是,文件系统会因此崩溃,这个问题是困扰我们的双写的最大问题之一;当我们的数据库发生改变时,会先写入二进制日志,二进制日志等满足条件时写入硬盘中去,当我们的在从上开启两个线程:I/O线程和SQl线程。其中I/O线程是当发现二进制日志数据更新时,自动拉取日志,写入到中继日志,中继日志又通过SQL线程,写入本机的mysql数据库中,此时,两个库的操作同步,但有个问题诞生了,如果我们的二进制日志被拉取走,主数据库是等待二进制回来,再返回用户写入操作ok,还是不等待直接返回ok呢?这里就牵涉到我们的mysql的同步异步机制了。
mysql的默认为异步机制,也就是当用户的写入操作完成后,记入二进制日志,我们就返回ok,不管从服务器的是否拉取,是否完成,这样就诞生了一个问题,如果我们此时的数据库崩溃,当我们的数据库从主数据库切换到从数据库时,数据会丢失,导致主从数据不一致。
而同步机制呢,是我们的主数据在被写入后,等待后端的所有从数据库复制完成,而我们的从数据库有时不只有一个,加上网络的消耗,服务时间上很漫长,而客户不会有那么多的耐心去等待该过程的完成,由此会导致客户流失。
但是解决的方法也很简单,就是二者取中,半同步机制应运而生,它只要有一个从数据复制完成,就立即返回客户写入ok,即强化了安全性,又减少了等待时间,而且半同步机制还可以设置超时时间,如果一定的时间内没有复制完成,就不管直接返回给客户结果。
那么我们如何切换到mysql的半同步呢?
我们的mysql中支持的多种插件在/usr/lib64/mysql/plugins/下,我们在其中可以看到有两个semisync_master.so和semisync_slave.so库,所以我们直接在数据库中安装即可。
主库:
mysql < install plugin rpl_semi_sync_master soname ‘semisync_master.so‘;
mysql < show global variables like ‘rpl_semi%‘;
mysql < set global rpl_semi_sync_master_enabled =1 #开启主半同步
从库:
mysql < install global rpl_semi_sync_slave soname ‘semisync_slave.so‘;
mysql < show global varialbes like ‘rpl_semi%‘;
mysql < set global rpl_semi_sync_slave_enabled=1 #开启从半同步
mysql < stop slave;
mysql < start slave;
查看mysql的错误日志会看到改变的信息,mysql的错误日志一般在/var/log/mariadb/mariadb.log
Slave I/O thread: Start semi-sync replication to master ‘[email protected]:3306‘ in log ‘mysql-bin.000003‘ at position 809
看到这时我们的半同步就算是完成了。
今天的主从复制就到此结束,你们学到了吗?