新博客网站1
新博客网站2
一,MySQL复制
(1).复制
1.每个节点都有相同的数据集
2.向外拓展
3.二进制日志
4.单向
(2).功用
1.数据分布
2.负载均衡读
3.备份
4.高可用和故障
5.MySQL升级测试
(3).实现
1.Master 必须要开启二进制日志
2.slave扮演为mysql客户端,启动一个线程,请求读取master的二进制日志
3.slave请求时如果携带二进制日志文件的位置,则master会从该位置之后的返回
4.slave请求时如果没有携带位置,master则从第一个二进制文件,最开始的位置开始返回
5.slave每接收到一个事件都会保存在中继日志中
6.master启动一个dump线程,来响应请求者,该线程复制读取二进制日志文件,并返回
7.slave节点负责与master通信的线程为io线程,负责从中继日志中重放到从数据库中,为sql线程
(4).基本流程
1.slave节点
2.I/O Thread:从master请求二进制日志事件,并保存于中继日志中;
3.SQL Thread:从中继日志中读取到的事件,在本地完成重放
4.主节点,为每个I/O线程启动一个dump线程,用于向其发送binary log events
(5).特点
1.异步复制
2.主从数据库不一致
(6).架构
1.主从模型(需要读写分离器,从可能会落后)
2.主主模型(可能会导致数据不一致) (serverID)
3.第三方多主方案 MMM,MHA,Galera-Cluster(percona)
4.环状复制
二,实战
(1).主从
1.主节点
2.启动二进制日志
3.为当前节点设置一个全局的ID号
4.创建有复制权限的用户账号
5.从节点
6.启动中继日志
7.为当前节点设置一个全局的ID号
8.使用有复制权限的用户连接主服务器,并启动复制线程
#开启二进制日志
vim /etc/my.cnf
[mysqld]
log_bin=master-bin
server_id=1
innodb_file_per_table=ON
skip_name_resolve=ON
#查看是否生效
MariaDB [(none)]> show global variables like '%log%';
MariaDB [(none)]> show master logs;
+-------------------+-----------+
| Log_name | File_size |
+-------------------+-----------+
| master-bin.000001 | 329 |
+-------------------+-----------+
MariaDB [(none)]> show global variables like '%server%';
+---------------------------------+-----------------+
| Variable_name | Value |
+---------------------------------+-----------------+
| character_set_server | utf8 |
| collation_server | utf8_general_ci |
| innodb_ft_server_stopword_table | |
| server_id | 1 |
+---------------------------------+-----------------+
#创建有复制权限的用户
MariaDB [(none)]>grant replication slave,replication client on *.* to 'repluser'@'192.168.%.%' identified by 'replpass';
MariaDB [(none)]> flush privileges;
确保 iptables没有拦截3306
#slave服务器
#开启二进制日志
vim /etc/my.cnf
[mysqld]
relay-log=relay-log
server_id=2
innodb_file_per_table=ON
skip_name_resolve=ON
#重启mysqld
#同上检查
#开启复制
MariaDB [(none)]> change master to master_host='192.168.66.129',master_user='repluser',master_password='replpass',master_log_file='master-bin.000001',master_log_pos=329
-> ;
#查看从状态
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.66.129
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001
Read_Master_Log_Pos: 329
Relay_Log_File: relay-log.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: master-bin.000001
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: 329
Relay_Log_Space: 256
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
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:
Replicate_Do_Domain_Ids:
Replicate_Ignore_Domain_Ids:
Parallel_Mode: conservative
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State:
1 row in set (0.00 sec)
#启动复制线程
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)
ps:复制架构应该注意的问题
1.限制从服务器为只读,在从服务器上设置为read_only=on ,对于super无效,可以启一个线程获取read lock,不释放锁
2.在master节点启动sync_binlog=on 保证主从服务的事务安全,如果用到innodb,开启innodb_flush_logs_at_trx_commit=ON,innodb_support_xa=ON,在slave节点上,skip_slave_start=on
3.在master节点应该开启sync_master_onfo,slave节点 sync_relay_log,sync_relay_log_info
4.slave master.info文件记录主服务器信息,reloy_log.info保存从服务器重放到的位置,在master中
ps:如果主节点已经运行一段时间了,并且有大量的数据,如果配置并启动slave节点
1.通过备份恢复数据至从服务器
2.复制起始位置为备份是,二进制文件及POS
(2).主主
1.互为主从 (1).数据不一致,选择其中一个,删了另外一个,慎用!(2).自动增长id,一个节点使用奇数,一个为偶数(auto_increment_offset=2,auto_increment_increment=2)(新版本不用设置增长长度)
2.配置步骤
3.各个节点使用一个server_id
4.都启动binary log 和 relay log
5.创建有复制权限的账号
6.有必要时要定义自动增长
7.均指定对方为主节点,并启动复制线程
#操作几乎同主从,只是要配置自动增长id,在每个节点创建拥有复制权限的账号,每个节点开始二进制日志和中继日志
(3).半同步复制
1.只要有一个从节点复制数据,就返回成功
2.超时时间,如果超过此时间,则自动降级为异步模式,不再等待回复
在主从基础上,先关闭复制线程
在master安装插件
MariaDB [mydb]> install plugin rpl_semi_sync_master SONAME 'semisync_master.so';
在slave
MariaDB [mydb]> install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';
set global rpl_semi_sync_master_enabled=1;开启master
set global rpl_semi_sync_slave_enabled=1; 开启slave
MariaDB [t]> show global status like '%semi%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_net_avg_wait_time | 1414 |
| Rpl_semi_sync_master_net_wait_time | 2828 |
| Rpl_semi_sync_master_net_waits | 2 |
| Rpl_semi_sync_master_no_times | 0 |
| Rpl_semi_sync_master_no_tx | 0 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 1536 |
| Rpl_semi_sync_master_tx_wait_time | 3072 |
| Rpl_semi_sync_master_tx_waits | 2 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 2 |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)
(4).复制过滤器
1.让从节点仅复制指定数据库或者指定表
2.有两种实现方式 (1).主服务器仅向二进制文件中记录与特定数据库相关的事件(时间点还原无法使用,不建议binlog_do_db,binlog_ignore_db),(2).在从服务器在sql线程在重放时只读取需要的数据(replicate_do_db,replicate_ignore_db可以精确到table)
(5).基于SSL复制
1.实现参考
三,补充资料
5、基于SSL的复制
前提:支持SSL
(1) 主服务器端配置证书和私钥,并创建一个要求必须使用SSL连接的复制账号(REQUIRE SSL);
(2) SLAV端连接master时,使用MASTER_SSL相关的选项来配置证书等信息;
6、跟复制功能相关的文件:
master.info:用于保存slave连接至master时的相关信息;
relay-log.info:保存了当前slave节点上已经复制的当前二进制日志和本地relay log日志对应关系;
7、复制的监控和维护
(1) 清理日志:PURGE
(2) 复制监控
SHOW MASTER STATUS
SHOW BINLOG EVENTS
SHOW BINARY LOGS
SHOW SLAVE STATUS
(3) 如何判断slave是否落后于master
Seconds_Behind_Master: 0
(4) 如何确定主从节点数据是否一致?
通过表自身的CHECKSUM检查
使用percona-tools中pt-table-checksum
(5) 数据不一致的修复方法:
丢弃一个,重复复制;