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

     上周咱们介绍了关于数据库的备份与恢复,你们也差很少能够在平常生产中作到数据的保障,可是若是咱们的数据库服务器真的宕机或者各类问题崩溃,等咱们恢复过来也会损失不少的用户或者交易额,这是生产中能够避免就避免的问题,因此今天咱们来介绍数据库的主从复制,实现数据库的高可用和备份效果,减小时间库的维护时间,增长可用时间!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

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

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

相关文章
相关标签/搜索