上周咱们介绍了关于数据库的备份与恢复,你们也差很少能够在平常生产中作到数据的保障,可是若是咱们的数据库服务器真的宕机或者各类问题崩溃,等咱们恢复过来也会损失不少的用户或者交易额,这是生产中能够避免就避免的问题,因此今天咱们来介绍数据库的主从复制,实现数据库的高可用和备份效果,减小时间库的维护时间,增长可用时间!mysql
通常的生产环境中,都是一个主库加一个从库,还有一个远程的灾备库,当咱们因为各类缘由宕机崩溃时,还能够至少有一个库对外提供服务,不至于全盘over。sql
咱们首先提供三台机器,分别为一主两从,分别安装mariadb-server。数据库
修改主数据库的配置文件:vim /etc/my.cnfvim
[mysqld]后端
server-id=1 #给数据库指定惟一id
centos
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 slave@'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 'slave@172.17.254.111:3306' in log 'mysql-bin.000003' at position 809
看到这时咱们的半同步就算是完成了。
今天的主从复制就到此结束,大家学到了吗?