zoukankan      html  css  js  c++  java
  • MySQL5.5 Master/Slave配置 枯木

    原文地址:http://wubolu.iteye.com/blog/721131

      在MySQL5.5版本中,引入了半同步复制模式(Semi-synchronous Replication)能够成功避免上述数据丢失的隐患。在这种模式下:master会等到binlog成功传送并写入至少一个slave的delay log之后才会提交,否则一直等待,直到timeout(默认10s)。当出现timeout的时候,master会自动切换半同步为异步,直到至少有一个slave成功收到并发送Acknowledge,master会再切换回半同步模式。结合这个新功能,我们可以做到,在允许损失一定的事务吞吐量的前提下来保证同步数据的绝对安全,因为当你设置timeout为一个足够大的值的情况下,任何提交的数据都会安全抵达slave。 

             半同步模式其实是作为MySQL5.5的一个plugin实现的,master和slave使用不同的plugin。默认情况下没有安装该plugin,官方提供的MySQL Server RPM包默认安装后,会在/usr/lib(64)/mysql/plugin/下面找到该插件。安装完插件之后,还需要手动设置系统参数以开启半同步复制模式。


    ------------------------------------------------------------------------------------------------------------------------------------------------------------------

    Master 服务器:

    vi my.cnf
     [mysqld]
     log-bin=NEW_NAME
     server-id=1     #配一个唯一的ID编号,1至32。

    #设置要进行或不要进行主从复制的数据库名,同时也要在 Slave 上设定。

      binlog-do-db=数据库名

      binlog-ignore-db=数据库名

    安装插件

    mysql>install plugin rpl_semi_sync_master soname 'semisync_master.so';

      删除插件是:uninstall plugin PLUGIN_NAME;

    mysql>show status;

    Rpl_semi_sync_master_clients       0      ##表示有多少slave设置了半同步模式。

    Rpl_semi_sync_master_no_tx         0      ##表示没有成功接收slave回执的提交次数

    Rpl_semi_sync_master_status        OFF    ##表示当前是异步模式还是半同步模式,设成ON状态,set global rpl_semi_sync_master_enabled=1;

     mysql> SET GLOBAL rpl_semi_sync_master_timeout=1000; (1s, 默认是 10s)

     mysql> grant replication slave on *.* to NEW_NAME@Slave服务器IP identified by '**';

     mysql> flush tables with read lock;
     mysql> show master status;   #记下现在的日志文件位置。
         显示: saturn-bin.002  106



    Slave服务器:

    vi my.cnf
     [mysqld]
     server-id=2     #也是要唯一。

    #设置要进行或不要进行主从复制的数据库名,同时也要在 Master 上设定。

     replicate-do-db=数据库名

     replicate-ignore-db=数据库名

    安装插件

    mysql>install plugin rpl_semi_sync_slave soname ‘semisync_slave.so’;
    mysql> change master to master_host='Master服务器IP',master_user='授权用户(不可以是root)',master_password='',master_log_file='saturn-bin.002',master_log_pos=106;

    设置rpl_semi_sync_slave_enabled =ON,重启才生效 mysql>slave stop;slave start 


    检查设置没有问题后,Master服务器:mysql> unlock tables;

    mysql>show master status \G  #查看Master状态

    mysql>show slave status \G   #查看Slave状态

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------


    问题处理记录:


    1、Slave服务器宕机,导致Slave服务器启动后 show slave status \G 后提示错误

           Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'binlog truncated in the middle of event'


    解决:

         Master: show master status \G    #记录 Master 以下信息

                      File: mysql-MasterSlave.000006
                      Position: 174367


         Slave: slave stop;

                      reset slave;

                      change master to master_host='192.168.1.126',master_user='USER',master_password='PW',master_log_file='mysql-MasterSlave.000006',master_log_pos=174367;


         提示:从 Mysql 5.5 开始 Mysql 加入半同步复制,取消了 load data from master 之类的用法,MySQL Slave/Master实例在异常终止恢复之后,MySQL Slave可以处理未完成的或丢弃Master写如log失败数据,从而重新从master上获取源数据,同样,Master 实例重启不会使 Slave 丢失数据。

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------


    Master 同步线程状态


    以下列出了master的 Binlog Dump 线程 State 字段中最常见的几种状态。如果在master上没有 Binlog Dump 线程,那么同步就没有在运行。也就是说,没有slave连接上来。
    Sending binlog event to slave
        事件是由二进制日志构成,一个事件通常由更新语句加上其他信息。线程读取到一个事件并正发送到slave上。
    Finished reading one binlog; switching to next binlog
        读取完了一个二进制日志,正切换到下一个。
    Has sent all binlog to slave; waiting for binlog to be updated
        已经读取完全部未完成更新日志,并且全部都发送到slave了。它处于空闲状态,正等待在master上执行新的更新操作以在二进制日志中产生新的事件,然后读取它们。
    Waiting to finalize termination
        当前线程停止了,这个时间很短。
       
    Slave的线程状态
    以下列出了slave的I/O线程 State 字段中最常见的几种状态。从MySQL 4.1.1开始,这个状态在执行 SHOW SLAVE STATUS 语句结果的 Slave_IO_State 字段也会出现。这意味着可以只执行 SHOW SLAVE STATUS 语句就能了解到更多的信息。
    Connecting to master
        该线程证尝试连接到master上。
    Checking master version
        确定连接到master后出现的一个短暂的状态。
    Registering slave on master
        确定连接到master后出现的一个短暂的状态。
    Requesting binlog dump
        确定连接到master后出现的一个短暂的状态。该线程向master发送一个请求,告诉它要请求的二进制文件以及开始位置。
    Waiting to reconnect after a failed binlog dump request
        如果二进制日志转储(binary log dump)请求失败了(由于连接断开),该线程在休眠时进入这个状态,并定期重连。重连的时间间隔由 --master-connect-retry 选项来指定。
    Reconnecting after a failed binlog dump request
        该线程正尝试重连到master。
    Waiting for master to send event
        已经连接到master,正等待它发送二进制日志。如果master闲置时,这个状态可能会持续较长时间,如果它等待超过 slave_read_timeout 秒,就会发生超时。这时,它就会考虑断开连接,然后尝试重连。
    Queueing master event to the relay log
        已经读取到一个事件,正把它拷贝到中继日志中以备SQL线程处理。
    Waiting to reconnect after a failed master event read
        读日志时发生错误(由于连接断开)。该线程在重连之前休眠 master-connect-retry 秒。
    Reconnecting after a failed master event read
        正尝试重连到master。当连接确定后,状态就变成 Waiting for master to send event。
    Waiting for the slave SQL thread to free enough relay log space
        relay_log_space_limit 的值非零,中继日志的大小总和超过这个值了。I/O线程等待SQL线程先处理中继日志然后删除它们以释放足够的空间。
    Waiting for slave mutex on exit
        当前线程停止了,这个时间很短。
    Reading event from the relay log
        从中继日志里读到一个事件以备执行。
    Has read all relay log; waiting for the slave I/O thread to update it
        已经处理完中继日志中的全部事件了,正等待I/O线程写入更新的日志。
    Waiting for slave mutex on exit
        当前线程停止了,这个时间很短。

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------

    附 Last_SQL_Errno 错误代码说明:

    1005:创建表失败
    1006:创建数据库失败
    1007:数据库已存在,创建数据库失败
    1008:数据库不存在,删除数据库失败
    1009:不能删除数据库文件导致删除数据库失败
    1010:不能删除数据目录导致删除数据库失败
    1011:删除数据库文件失败
    1012:不能读取系统表中的记录
    1020:记录已被其他用户修改
    1021:硬盘剩余空间不足,请加大硬盘可用空间
    1022:关键字重复,更改记录失败
    1023:关闭时发生错误
    1024:读文件错误
    1025:更改名字时发生错误
    1026:写文件错误
    1032:记录不存在
    1036:数据表是只读的,不能对它进行修改
    1037:系统内存不足,请重启数据库或重启服务器
    1038:用于排序的内存不足,请增大排序缓冲区
    1040:已到达数据库的最大连接数,请加大数据库可用连接数
    1041:系统内存不足
    1042:无效的主机名
    1043:无效连接
    1044:当前用户没有访问数据库的权限
    1045:不能连接数据库,用户名或密码错误
    1048:字段不能为空
    1049:数据库不存在
    1050:数据表已存在
    1051:数据表不存在
    1054:字段不存在
    1065:无效的SQL语句,SQL语句为空
    1081:不能建立Socket连接
    1114:数据表已满,不能容纳任何记录
    1116:打开的数据表太多
    1129:数据库出现异常,请重启数据库
    1130:连接数据库失败,没有连接数据库的权限
    1133:数据库用户不存在
    1141:当前用户无权访问数据库
    1142:当前用户无权访问数据表
    1143:当前用户无权访问数据表中的字段
    1146:数据表不存在
    1147:未定义用户对数据表的访问权限
    1149:SQL语句语法错误
    1158:网络错误,出现读错误,请检查网络连接状况
    1159:网络错误,读超时,请检查网络连接状况
    1160:网络错误,出现写错误,请检查网络连接状况
    1161:网络错误,写超时,请检查网络连接状况
    1062:字段值重复,入库失败
    1169:字段值重复,更新记录失败
    1177:打开数据表失败
    1180:提交事务失败
    1181:回滚事务失败
    1203:当前用户和数据库建立的连接已到达数据库的最大连接数,请增大可用的数据库连接数或重启数据库
    1205:加锁超时
    1211:当前用户没有创建用户的权限
    1216:外键约束检查失败,更新子表记录失败
    1217:外键约束检查失败,删除或修改主表记录失败
    1226:当前用户使用的资源已超过所允许的资源,请重启数据库或重启服务器
    1227:权限不足,您无权进行此操作
    1235:MySQL版本过低,不具有本功能


  • 相关阅读:
    菜根谭#77
    菜根谭#76
    菜根谭#75
    菜根谭#74
    菜根谭#73
    python迭代器
    python爬取网页数据
    yii2验证规则
    python装饰器的理解
    php中多图上传采用数组差集处理(array_diff,array_map)
  • 原文地址:https://www.cnblogs.com/kumulinux/p/2808718.html
Copyright © 2011-2022 走看看