Linux运维学习之数据库的主从的复制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux运维学习之数据库的主从的复制相关的知识,希望对你有一定的参考价值。

     上周我们介绍了关于数据库的备份与恢复,大家也差不多可以在日常生产中做到数据的保障,但是如果我们的数据库服务器真的宕机或者各种问题崩溃,等我们恢复过来也会损失很多的用户或者交易额,这是生产中可以避免就避免的问题,所以今天我们来介绍数据库的主从复制,实现数据库的高可用和备份效果,减少时间库的维护时间,增加可用时间!

    一般的生产环境中,都是一个主库加一个从库,还有一个远程的灾备库,当我们由于各种原因宕机崩溃时,还可以至少有一个库对外提供服务,不至于全盘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

     看到这时我们的半同步就算是完成了。

      今天的主从复制就到此结束,你们学到了吗?

以上是关于Linux运维学习之数据库的主从的复制的主要内容,如果未能解决你的问题,请参考以下文章

Linux云计算运维学习之NFS的工作原理

Linux运维学习之LAMP搭建个人博客网站

Linux运维学习之如何进行Rsync排错?

Linux运维学习之数据库备份与恢复

Linux运维学习之数组

运维学习之lvm(逻辑卷管理)