MySQL复制:
Mysql的扩展
复制:每个节点都要相同的数据集;
向外扩展;
二进制日志;
单向;
复制的功用:
数据分布;
负载均衡(读);
备份
高可用和故障切换;
MySQL升级测试
主从复制:
从节点:
I/O 线程:从master请求二进制日志事件,并保存在中继日志中
SQL 线程:从中继日志读取日志事件,在本地完成重发
主节点:
dump 线程:为每个Slave的I/O线程启动一个dump线程,用于向其发送binary log event.
特点:
异步复制:
主从数据不一致比较常见
复制架构:M/S,M/M
二进制日志事件记录格式:
STATEMEN(语句)
ROW
MIXED
主从配置过程:
主节点:
1、启动二进制日志;
log-bin=master-bin
2、为当前节点设置一个全局唯一的ID号;
server-id=1
3、创建有复制权限的用户账号;
grant replication slave,replication client on *.* to 'repluser'@'10.10.%.%' identified by 'replpass';
从节点:
1、启动中继日志;
relay-log=relay-log
relay-log.index=relay-log.index
2、为当前节点设置一个全局唯一的ID号 ;
server-id=3
3、使用有复制权限的用户账号连接至主服务器,启动复制线程;
change master to master_host='10.10.x.x',master_user='repluser',master_password='replpass',master_log_file='master-bin.000001',master_log_pos=495;
sql>start slave;
如果主节点已经运行一段时间,且有大量数据,如何配置并启动slave节点?
通过备份恢复数据至从服务器;
复制起始位置为备份时,二进制日志文件及其pos.
复制架构中应该注意的问题:
1、限制从服务器为只读;
在从服务器设置为read_only=ON;此限制对拥有SUPER权限的用户均无效;
阻止所以用户:
sql>flush tables with read lock;
2、如何保证主从复制事务安全?
在master节点启用参数:
sync_binlog=ON
如果用到为InnoDB存储引擎:
innodb_flush_log_at_trx_commit=ON
innodb_support_xa=ON
在slave节点:
skip_slave_start=ON
master节点:
sync_master_info 1
slave节点:
sync_relay_log
sync_relay_log_info
主主复制
互为主从:
1、数据不一致;因此,慎用;
2、自动增长ID:
配置一个节点使用奇数id
auto_increment_offset=1
auto_increnent_increment=2
另一个节点为偶数id
auto_increment_offset=2
auto_increnent_increment=2
半同步复制
master:
sql>install plugin rpl_semi_sync_master soname 'semisync_master.so';
sql>set global rpl_semi_sync_master_enabled=1;
sql>show global status like '%semi%';
sql>show global variables like '%semi%'
slave:
sql>install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
sql>set global rpl_semi_sync_slave_enabled=1;
sql>show global variables like '%semi%';
复制过滤器:
让从节点仅复制指定的数据库,或指定的数据库的指定表;
有两种实现方式:
1)主服务器仅向二进制日志中记录与特定数据库(特定表)相关的事件;
时间还原无法实现;不建议使用;
2)从服务器在replay中继日志中的事件中,仅读取与特定数据库(特定表)相关的事件应用本地;
问题:会造成网络及磁盘IO浪费
replicate_do_db 设置白名单(数据库)
replicate_ignore_db 设置黑名单
replicate_ignore_table 设置白名单(表)
sql>set global replicate_do_db='xx'
复制的监控和维护
1、清理日志:
sql> purge binary logs to 'bin.xxxxxx';
2、监控日志:
sql>show master status;show processlist;
3、从服务器是否落后主服务器:
Seconds_Behind_Master:0
4、数据库不一致如何修复?
重新复制;
MySQL Replication:
MMM:Multi Master MySQL
MHA:Master HA
对节点进行监控,可实现自动故障转移至其他节点,提升某一从节点为新主节点;
Galera Cluster:wresp
通过wresp协议在全局实现复制,任何一节点都可读写;
MHA:
架构如下:
manager:192.168.1.151
master:192.168.1.152
slave:192.168.1.153
slave:192.168.1.154
一. Master配置:
1、 mysql配置文件:
innodb_file_per_table = 1
skip_name_resolve = 1
log-bin = master-bin
relay-log = relay-bin
server_id=1
2、建立同步账号及管理账号
sql> show master status;
sql> grant replication slave,replication client on *.* to 'repluser'@'192.168.1.%' identified by 'replpass';
sql> flush privileges;
sql> grant all on *.* to 'mhauser'@'192.168.1.%' identified by 'mhapass';
sql> flush privileges;
二. slave配置:
1、 mysql配置文件:
innodb_file_per_table = 1
skip_name_resolve = 1
relay-log = relay-bin
log-bin = master-bin
server_id = 2
read_only = 1
relay_log_purge = 0
2、使用同步账号连接到主节点,并启动服务:
sql> change master to master_host='192.168.1.152',master_user='repluser',master_password='replpass',master_log_file='master-bin.000001',master_log_pos=245;
sql> start slave;
sql> show slave status\G;
三. 建立服务器互信
在其中一台服务器制作公钥及私钥并拷贝到其他服务器:
ssh-keygen -t rsa -P '' 制作公钥
cd .ssh
cat id_rsa.pub >authorized_keys 制作私钥
chmod 600 authorized.keys
mkdir .ssh
scp -p id_rsa authorized_keys 192.168.1.152:/root/.ssh 拷贝到其他服务器
四. 安装MHA软件包
下载并上传MHA安装包
yum install mha4mysql-* -y
五. MHA配置文件:
global配置,为各application 提供默认配置;
application配置:
server:
# mkdir -p /etc/masterha;新建目录
# vim /etc/masterha/app1.cnf; app集群1配置文件
[server default]
user=mhauser
password=mhapass
manager_workdir=/data/masterha/app1
manager_log=/data/masterha/app1/manager.log
remote_workdir=/data/masterha/app1
ssh_user=root
repl_user=repluser
repl_password=replpass
ping_interval=1
[server1]
hostname=192.168.1.152
candidate_master=1
[server2]
hostname=192.168.1.153
candidate_master=1
[server3]
hostname=192.168.1.154
# masterha_check_ssh --conf=/etc/masterha/app1.cnf 检测服务器SSH互
[info] All SSH connection tests passed successfully. 正常
# masterha_check_repl --conf=/etc/masterha/app1.cnf
MySQL Replication Health is OK! 主从复制正常
# masterha_manager --conf=/etc/masterha/app1.cnf 启动管理节点,默认是前台显示
# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:2953) is running(0:PING_OK), master:192.168.1.152
注意事项:
1、每个服务器关闭防火墙:
systemctl stop firewalld
2、repluser可能没有同步过去,需要重新同步一次。
User repluser does not exist or does not have REPLICATION SLAVE privilege! Other slaves can not start replication from this host.
3、如果主节点宕机,拷贝新主节点的二进制文件,按照时间点进行恢复:
MYSQL按二进制方式备份:
mysqdump -uroot --all-databases --lock-all-tables --master-data=2 >/backup/all.sql;
MYSQL还原数据库按二进制时间节点;
mysqlbinlog --start-position=245 /var/lib/mysql/mysql-bin.000001 >incre.sql;
Galera Cluster
1、安装galera分支的mysql版本:
# vim /etc/yum.repos.d/mariadb.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/5.5.56/centos7-amd64/
enabled = 1
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
# yum install MariaDB-Galera-server -y
2、修改mysql配置文件
# vim /etc/my.cnf.d/server.cnf
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.1.151,192.168.1.152,192.168.1.153"
wsrep_cluster_name='mycluster'
wsrep_node_name='node1'
wsrep_node_address='192.168.1.151'
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
3、首次启动,需要初始化集群,在其中一个节点执行如下命令
# /etc/rc.d/init.d/mysql start --wsrep-new-cluster
Starting MySQL..... SUCCESS!
# 关闭SELinux(很重要)
# setenforce 0
# getenforce
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@test152 mysql]# service mysql start
Starting MySQL.170828 16:36:00 mysqld_safe Logging to '/var/lib/mysql/test152.err'.
170828 16:36:00 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
...SST in progress, setting sleep higher....... SUCCESS!
转载于:https://blog.51cto.com/12542133/1959408