zoukankan      html  css  js  c++  java
  • mysql主主半同步

    1.半同步概述

    先了解下mysql的几种复制

    异步复制
    MySQL复制默认是异步复制,Master将事件写入binlog,提交事务,自身并不知道slave是否接收是否处理;
    缺点:不能保证所有事务都被所有slave接收。
    同步复制
    Master提交事务,直到事务在所有slave都已提交,才会返回客户端事务执行完毕信息;
    缺点:完成一个事务可能造成延迟。
    半同步复制
    当Master上开启半同步复制功能时,至少有一个slave开启其功能。当Master向slave提交事务,且事务已写入relay-log中并刷新到磁盘上,slave才会告知Master已收到;若Master提交事务受到阻塞,出现等待超时,在一定时间内Master 没被告知已收到,此时Master自动转换为异步复制机制;
    注:半同步复制功能要在Master和slave上开启才会起作用,只开启一边,依然是异步复制。

    下面详细说明主主半同步:

    通过mysql的半同步插件,在两个数据库之间相互设置半同步,实现主主半同步架构。

    这里做相对于半同步的好处在于,两个数据库处于完全对等的地位,可以很方便的做自动切换。

    有一点需要注意的是,推荐设置read-only,让同时只有一个数据库可写。如果两个同时写,如果出现了同步不一致,这时恢复数据需要对比两个数据库。

    自动切换可以使用keepalived做vip的漂移
    同步过程
    1. 在每次准备提交事务完成数据更新前,主库将数据更新的事件记录到二进制日志中。MySQL会按照事务提交的顺序来记录二进制日志。在记录二进制日志后,主库会告诉存储引擎可以提交事务了
    2. 从库会启动一个工作线程,I/O线程跟主库建立一个普通的客户端连接,然后再主库上启动一个特殊的二进制转储(binlog dump)线程,这个二进制转储线程会读取主库上二进制日志中的事件。如果该线程追赶上了主库,就进入睡眠状态,直到主库发送信号通知有新事件产生再次唤醒
    3. 从库SQL线程从中继日志中读取事件,并在从库上执行,完成复制
    半同步相对异步来说,能解决数据不丢失的情况,但是不能很好的解决切换问题
     
    MySQL默认的复制是异步复制
    主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理
    配置了自动切换可能出现的问题:如果主库出现异常,此时主上已经提交的事务可能并没有同步到从库上,此时强行将从提升为主,就会导致新主库上的数据不完整
    推荐的解决方案是,可写数据库切换的时候检查同步状态 

    2.配置主主半同步

    测试环境:数据库mysql 5.7.20,CentOS7.2.1511(dvd)

    1.准备数据库
    yum install mysql-community-server
    mysql-community-server-5.7.20-1.el7.x86_64
    注意:安装server的时候,client也会被自动装上。但是装client,不会装server
     
    使用无密码方式创建数据目录
    目录一定要不存在
    注意:CentOS7中mysql的多实例管理可以直接通过systemctl进行。在my.cnf配置中,section必须有@关键字才能进行管理,所以这里创建数据目录也统一使用实例名字
    mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysqld@3320

    配置my.cnf文件

    [mysqld@3320] #注意section中要有@符号
    datadir = /var/lib/mysqld@3320 #数据目录
    socket = /var/lib/mysqld@3320/mysqld@3320.sock
    port = 3320
    pid-file = /var/run/mysqld@3320/mysqld@3320.pid
    log-error = /var/log/mysqld.log
    skip-name-resolve = 1
    
    # bin-log相关配置
    log-bin = mysql-bin
    binlog_cache_size = 128K
    innodb_flush_log_at_trx_commit = 1
    binlog_format = MIXED
    expire_logs_days = 7
    max_binlog_size = 500M
    log-slave-updates = 0
    slave-skip-errors = 1062,1032
    
    # relay-log配置
    relay_log_recovery = 1
    relay-log = mysqld@3320-relay-bin
    
    # 数据库的配置
    user = mysql
    language = /usr/share/mysql/english
    default-storage-engine = InnoDB
    character-set-server = UTF8
    master_info_repository = TABLE
    relay_log_info_repository = TABLE
    tmpdir = /var/tmp
    
    # 设置read-only为可读可写
    read-only = 0
    
    #mysql5.7后必须要有server-id才能启动
    server-id = 1

    接下来可以启动数据库了

    systemctl start mysqld@3320
     
    2.创建用户
    我们创建数据目录的方式是没有密码的。所以可以直接登陆
    注意:只能使用sock文件方式登录
    mysql -uroot -S /var/lib/mysqld@3320/mysqld@3320.sock
    我们先设置root账户的密码。再创建一个用于配置半同步
    SET password='admin';
    grant all on *.* to 'root'@'127.0.0.1' identified by 'admin' with grant option;
    flush privileges;
    

    退出再登陆,看root密码是否创建成功

    grant replication client, replication slave on *.* to 'SemiSync'@'%' identified by 'admin';
    #远程同步账号需要reload,super权限
    

    3.安装半同步插件

    INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'
    INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'
    通过show plugins可以查看到安装的插件
    安装完插件后修改my.cnf配置文件,在文件中加入下列选项
    #启用binlog,启动半同步
    sync_binlog = 1
    rpl_semi_sync_master_enabled = 1
    rpl_semi_sync_slave_enabled = 1
    另外一个节点重复上述步骤,创建一个相同的实例
    注意:server_id 需要不同,半同步插件也需要安装,因为我们配置的是主主半同步

    4.配置半同步

    设置192.168.184.54为主,192.168.184.40为从
    先在54上执行show master status,查看binlog文件及位置,显示如下
    注意在这一步要确认没有数据写入,不然会导致不同步。通常在这里会锁表防止有新数据产生
    然后在40上设置从

    使用show slave statusG查看半同步状态。

    这里的如果图中(没有截取完整的命令输出)最后两行不是Yes的话,可以在输出命令的Last_IO_Error或者Last_SQL_Error选项中查看错误提示。再根据提示处理
     
    到这里,单向的半同步就配置好了,接下来在另外一个节点设置相同的半同步。这样就组成了主主半同步
    现在就可以测试数据同步了
  • 相关阅读:
    (第二周)效能测试
    (第二周)新小学四则运算
    (第二周)项目点评
    (第二周)通读《构建之法》有感
    (第二周)scrum站立会议
    (第二周) 燃尽图
    (第一周)工作总结
    (第一周)小学四则运算
    软件工程第三次作业
    软件工程第二次作业
  • 原文地址:https://www.cnblogs.com/newguy/p/8847379.html
Copyright © 2011-2022 走看看