复制的功用:


  • 数据分布;     

  • 负载均衡读;

  • 备份;

  • 高可用和故障切换;

  • 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为2relay_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=2server-id       = 1                #该节点server_id为1server_id=2                       #该节点server_id为2relay_log=relay-logrelay_log_index=relay-log.indexlog_bin=mysql-binauto_increment_offset=2            #配置该节点自动增长id为偶数;auto_increment_increment=2MariaDB [(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;      #开启从复制线程