MySQL的复制


 复制的功用:

  • 数据分布;     

  • 负载均衡读;

  • 备份;

  • 高可用和故障切换;

  • MySQL升级测试;


主从复制:

  • 从节点

    • I/O Thread:从Masteroid请求二进制日志时间,并保存于中继日志中;

    • SQL Thread:从中继日志中读取日志事件,在本地完成重放;

  • 主节点:

    • dump Thread:为每个slave的I/O Thread启动一个dump线程,用于向其发送Binary log events

  • 特点:

  1. 异步复制;

  2. 主从数据不一致比较常见;


复制架构:

  1. M/S(主从),M/M(主主)

  2. 一主多从;

  3. 一从多主;


主从配置过程:

  • 主节点:

  1. 启动二进制日志

  2. 为当前节点设置一个全局唯一的ID号;

  3. 创建有复制权限的用户帐号;

从节点:

  1. 启动中继日志

  2. 为当前节点设置一个全局ID;

  3. 使用有复制权限的用户帐号连接至主服务器,并启动复制线程;



  • 主节点配置:

log-bin=mysql-bin    #在mariadb配置文件中加入此项打开二进制日志;
server-id       = 1   #设置主节点的server-id为1;
MariaDB [(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repluser'@'172.16.61.8' IDENTIFIED BY 'replpass';
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> FLUSH PRIVILEGES;        #创建有复制权限的用户帐号
Query OK, 0 rows affected (0.00 sec)
  • 从节点配置:

server_id=2         #设置从节点server_id为2
relay_log=relay-log   #开启从节点中继日志;
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='172.16.61.6',MASTER_USER='repluser',MASTER_PASSWORD='replpass',MASTER_LOG_FILE='mysql-bin.000006',MASTER_LOG_POS=497;
Query OK, 0 rows affected (0.09 sec)  #配置为从服务器,从主节点当前位置开始复制

MariaDB [(none)]> SHOW SLAVE STATUS\G;       #从服务器状态
*************************** 1. row ***************************
           Slave_IO_State: 
           Master_Host: 172.16.61.6
           Master_User: repluser
           Master_Port: 3306
           Connect_Retry: 60
           Master_Log_File: mysql-bin.000006
            Read_Master_Log_Pos: 497
           Relay_Log_File: relay-log.000001
           Relay_Log_Pos: 4
              Relay_Master_Log_File: mysql-bin.000006
           Slave_IO_Running: No
           Slave_SQL_Running: No
           Replicate_Do_DB: 
            Replicate_Ignore_DB: 
           Replicate_Do_Table: 
               Replicate_Ignore_Table: 
                Replicate_Wild_Do_Table: 
                    Replicate_Wild_Ignore_Table: 
           Last_Errno: 0
           Last_Error: 
           Skip_Counter: 0
            Exec_Master_Log_Pos: 497
           Relay_Log_Space: 245
           Until_Condition: None
           Until_Log_File: 
           Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
           Master_SSL_Cert: 
           Master_SSL_Cipher: 
           Master_SSL_Key: 
              Seconds_Behind_Master: NULL
                      Master_SSL_Verify_Server_Cert: No
           Last_IO_Errno: 0
           Last_IO_Error: 
           Last_SQL_Errno: 0
           Last_SQL_Error: 
                    Replicate_Ignore_Server_Ids: 
           Master_Server_Id: 0
            
MariaDB [(none)]> START SLAVE;              #开启复制线程,不指明线程,默认为I/O和SQL线程都开启
 
MariaDB [(none)]> SET GLOBAL read_only=ON;    #设置从服务器只读,该操作对所有拥有super权限的用户都无效,也可使用全局写锁,对所有写操作阻塞;

主从复制缺点:

  • 数据不一致;

  • 自动增长id的字段需要额外配置一个节点使用奇数另一个节点使用偶数;




主主复制:

  • 各节点使用一个惟一的server_id;

  • 都得启用binary log和relay log;

  • 创建拥有复制权限的用户帐号;

  • 定义自动增长id字段的数值范围为奇偶;

  • 均把对方指定为主节点,并启动复制线程;

  • 在最初状态进行配置,避免数据相差太多;

[root@node6 ~]# rm /data/mysql/* -fr    #为了效果删除两个节点所有数据
[root@node8 ~]# rm -fr /var/lib/mysql/*


log-bin=mysql-bin                  #两边都需要开启二进制日志
relay_log=relat-log                #两边都需要开启中继日志
auto_increment_offset=1            #配置该节点自动增长id为奇数;
auto_increment_increment=2
server-id       = 1                #该节点server_id为1


server_id=2                       #该节点server_id为2
relay_log=relay-log
relay_log_index=relay-log.index
log_bin=mysql-bin
auto_increment_offset=2            #配置该节点自动增长id为偶数;
auto_increment_increment=2


MariaDB [(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repluser'@'172.16.61.8' IDENTIFIED BY 'replpass';  #在两个节点上都授权复制账号
MariaDB [(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repluser'@'172.16.61.6' IDENTIFIED BY 'replpass';

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='172.16.61.8',MASTER_USER='repluser',MASTER_PASSWORD='replpass',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=427;  #使用复制权限的帐号连接服务器
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='172.16.61.8',MASTER_USER='repluser',MASTER_PASSWORD='replpass',MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=427;
Query OK, 0 rows affected (0.04 sec)

MariaDB [(none)]> START SLAVE;   #两边同时开启复制线程


半同步复制:

plugin_dir=/usr/local/mysql/lib/plugin   #在主节点配置文件中加入此项(此处为编译安装的插件目录)

MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';   #在主节点上安装此插件
MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_enabled=1; #在主节点上开启此选项
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';    #从节点安装该插件
Query OK, 0 rows affected (0.04 sec)
MariaDB [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled=1;   #从节点上开启此选项;
MariaDB [(none)]> START SLAVE;      #开启从复制线程















你可能感兴趣的:(mariaDB,mysql主从复制,主主复制,半结构复制)