半同步复制
默认情况下,MySQL的复制功能是异步的,异步复制可以提供最佳的性能,主库把binlog日志发送给从库即结束,并不验证从库是否接收完毕。这意味着当主服务器或从服务器端发生故障时,有可能从服务器没有接收到主服务器发送过来的binlog日志,这就会造成主服务器和从服务器的数据不一致,甚至在恢复时造成数据的丢失
半同步复制实现:
实验准备准备环境
- 主服务器:192.168.32.7
vim /etc/my.cnf
[mysqld]
server=1
log_bin
skip_name_reslove
innodb_file_per_table
vim master.sql
grant replication slave on *.* to repluser@'192.168.32.%' identified by 'centos';
mysql < master.sql
mysql -e 'show master logs' 查看日志位置
- 从服务器1:192.168.32.17 从服务器2:192.168.32.27
vim salve.sql
CHANGE MASTER TO
MASTER_HOST='192.168.32.7',
MASTER_USER='repluser',
MASTER_PASSWORD='centos',
MASTER_PORT=3306,
MASTER_LOG_FILE='mariadb-bin.000001',
MASTER_LOG_POS=400;
start slave;
show slave status\G
mysql < salve.sql
mysql -e 'show slave status\G'
scp slave.sql 192.168.32.27:
开启半同步配置
- 主服务器配置:
mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; 安装插件
mysql>SET GLOBAL rpl_semi_sync_master_enabled=1; 开启半同步
mysql>SET GLOBAL rpl_semi_sync_master_timeout = 1000; 超时长为1s
mysql>SHOW GLOBAL VARIABLES LIKE '%semi%';
mysql>SHOW GLOBAL STATUS LIKE '%semi%‘;
- 从服务器配置:
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; 安装插件
mysql> SET GLOBAL rpl_semi_sync_slave_enabled=1; 开启半同步
注意:若需长期有效需写入配置文件,
查看是否开启,如未生效可stop slave后start slave重新开启进程
## 关闭进程后 测试:
insert teachers values(6,'d',30,'F');
真实环境:
master—slave(半同步)—slave1,2,3
MySQL复制 复制指定库和表
让从节点仅复制指定的数据库,或指定数据库的指定表
###两种实现方式:
(1) 基于服务器选项
binlog_do_db = 数据库白名单列表,多个数据库需多行实现
binlog_ignore_db = 数据库黑名单列表
- 用法:写入配置文件 binlog_do_db=hellodb
- 原理:主服务器仅向二进制日志中记录与特定数据库相关的事件
- 问题:基于二进制还原将无法实现;不建议使用
- 注意:此项和binlog_format相关
- 参看:https://mariadb.com/kb/en/library/mysqld-options/#-binlog-ignore-db
(2)基于变量复制
- 从服务器上的复制过滤器相关变量:
replicate_do_db= 指定复制库的白名单
replicate_ignore_db= 指定复制库黑名单
replicate_do_table= 指定复制表的白名单
replicate_ignore_table= 指定复制表的黑名单
replicate_wild_do_table= foo%.bar% 支持通配符
replicate_wild_ignore_table=
- 用法:set global replicate_do_db='hellodb'
- 注意:需要切库后插入测试
- 原理:从服务器SQL_THREAD在replay中继日志中的事件时,仅读取与特定数据库(特定表)相关的事件并应用于本地
- 问题:会造成网络及磁盘IO浪费
MySQL复制加密
-
基于SSL复制:
在默认的主从复制过程或远程连接到MySQL/MariaDB所有的链接通信中的数据都是明文的,外网里访问数据或则复制,存在安全隐患。通过SSL/TLS加密的方式进行复制的方法,来进一步提高数据的安全性 -
配置实现:
参看:https://mariadb.com/kb/en/library/replication-with-secure-connections/ -
流程步骤:
1.主服务器开启SSL:[mysqld] 加一行ssl
2.主服务器配置证书和私钥;并且创建一个要求必须使用SSL连接的复制账号
3.从服务器使用CHANGER MASTER TO 命令时指明ssl相关选项
- Master服务器配置
[mysqld]
log-bin
server_id=1
ssl
ssl-ca=/etc/my.cnf.d/ssl/cacert.pem
ssl-cert=/etc/my.cnf.d/ssl/master.crt
ssl-key=/etc/my.cnf.d/ssl/master.key
- Slave服务器配置
mysql>
CHANGE MASTER TO
MASTER_HOST='MASTERIP',
MASTER_USER='rep',
MASTER_PASSWORD='centos',
MASTER_LOG_FILE='mariadb-bin.000001',
MASTER_LOG_POS=245,
MASTER_SSL=1,
MASTER_SSL_CA = '/etc/my.cnf.d/ssl/cacert.pem',
MASTER_SSL_CERT = '/etc/my.cnf.d/ssl/slave.crt',
MASTER_SSL_KEY = '/etc/my.cnf.d/ssl/slave.key';
完整实验:
生成证书准备流程:
192.168.32.7为主服务器
192.168.32.17为从服务器
192.168.32.27做CA并申请证书,之后scp给主从服务器
cd /etc/my.cnf.d/
mkdir ssl
cd ssl
openssl genrsa 2048 >cakey.pem 生成2048位ca私钥文件
openssl rep -new -x509 -key cakey.epm -out cacert.pem -days 3650 给自己生成一个证书
CN
beijing
beijing
dushan
opt
ca.dushan.com
ll
openssl req -newkey rsa:1024 -days 100 -nodes -keyout master.key > master.csr 生成证书并签名
CN
beijing
beijing
dushan
opt
master.dushan.com
ll
openssl x509 -req -in master.csr -days 100 -CA cacert.pem -CAkey cakey.pem -set_serial 01 > master.crt 颁发主服务器证书
ll
openssl req -newkey rsa:1024 -days 100 -nodes -keyout slave.key > slave.csr 生成证书并签名
CN
beijing
beijing
dushan
opt
slave.dushan.com
ll
openssl x509 -req -in slave.csr -days 100 -CA cacert.pem -CAkey cakey.pem -set_serial 02 > slave.crt 颁发从服务器证书
ll
scp cacert.pem master.crt master.key 192.168.32.7:/etc/my.cnf.d/ssl/
scp cacert.pem slave.crt slave.key 192.168.32.17:/etc/my.cnf.d/ssl/
查看ssl是否开启
show variables like '%ssl%';
建立强制加密账号
grant replication slave on *.* to ssluser@'192.168.32.%' identified by 'centos' require ssl;
Master服务器配置
[mysqld]
log-bin
server_id=1
ssl
ssl-ca=/etc/my.cnf.d/ssl/cacert.pem
ssl-cert=/etc/my.cnf.d/ssl/master.crt
ssl-key=/etc/my.cnf.d/ssl/master.key
在从服务器登录测试
mysql --ssl-ca=cacert.pem --ssl-cert=slave.crt --ssl-key=slave.key -ussluser -pcentos -h192.168.32.7
在主服务器上查看位置信息
show master logs;
mariadb-bin.00005 412
清空从服务器之前同步信息
mysql>stop slave;
reset slave all;
cd /var/lib/mysql
ll 进入数据库文件夹查看master.info信息是否被清空
在从服务器重新配置同步配置
mysql>
CHANGE MASTER TO
MASTER_HOST='192.168.32.7',
MASTER_USER='ssluser',
MASTER_PASSWORD='centos',
MASTER_LOG_FILE='mariadb-bin.00005',
MASTER_LOG_POS=412,
MASTER_SSL=1,
MASTER_SSL_CA = '/etc/my.cnf.d/ssl/cacert.pem',
MASTER_SSL_CERT = '/etc/my.cnf.d/ssl/slave.crt',
MASTER_SSL_KEY = '/etc/my.cnf.d/ssl/slave.key';
start slave;
show slave status\G
复制的监控和维护
(1) 清理日志
PURGE { BINARY | MASTER } LOGS { TO ‘log_name’ | BEFORE datetime_expr }
RESET MASTER
RESET SLAVE
(2) 复制监控
SHOW MASTER STATUS
SHOW BINLOG EVENTS
SHOW BINARY LOGS
SHOW SLAVE STATUS
SHOW PROCESSLIST
(3) 从服务器是否落后于主服务
Seconds_Behind_Master: 0
(4) 如何确定主从节点数据是否一致
percona-tools
(5) 数据不一致如何修复
删除从数据库,重新复制