复制的功用:
数据分布;
负载均衡读;
备份;
高可用和故障切换;
MySQL升级测试;
主从复制:
从节点
I/O Thread:从Masteroid请求二进制日志时间,并保存于中继日志中;
SQL Thread:从中继日志中读取日志事件,在本地完成重放;
主节点:
dump Thread:为每个slave的I/O Thread启动一个dump线程,用于向其发送Binary log events
特点:
异步复制;
主从数据不一致比较常见;
复制架构:
M/S(主从),M/M(主主)
一主多从;
一从多主;
主从配置过程:
主节点:
启动二进制日志
为当前节点设置一个全局唯一的ID号;
创建有复制权限的用户帐号;
从节点:
启动中继日志
为当前节点设置一个全局ID;
使用有复制权限的用户帐号连接至主服务器,并启动复制线程;
主节点配置:
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; #开启从复制线程