```
【本节主题:MySQL主从复制】
回顾:
备份还原
mysqldump:仅适用于小数据量的场景
XtraBackup:基于数据块的复制,适用于大数据量的场景
两个线程
??线程
io线程
sql进程
从服务器:不需要启用二进制日志
添加read-only:防止从服务器数据被普通用户更改(无法阻止管理员的写操作)
级联复制:降低主服务器的压力
从服务器启用级联复制:log_slave_updates
实验:实现从服务器的级联复制
(一)主服务器
1、修改主服务器配置文件
vim /etc/my.cnf
[mysqld]
server_id=1
log_bin
innodb_file_per_table
datadir = /data/mysql
systemctl restart mariadb
2、授权
--
grant replication slave on *.* to repluser@'192.168.30.%' identified by 'centos' ;
3、
--
show masterid;
(二)级联服务器
1、修改级联服务器配置文件
vim /etc/my.cnf
[mysqld]
server_id=1;
read-only
#
systemctl restart mariadb
2、开启级联服务器中继日志
vim /etc/my.cnf
[mysqld]
server-id=2
log_bin
log_slave_updates
read-only
#
systemctl restart mariadb
#
mysql
3、开启从服务器
--
start slave;
--
show slave status;
4、清除中继日志,重新从头开始复制
--
reset slave all;
(三)从服务器
1、修改从服务器的配置文件
vim /etc/my.cnf
[mysqld]
server_id=2
resd-only
systemctl restart mariadb
建议:
级联服务器和从服务器都添加read-only,
让数据库的更改只发生在主服务器上!
sync_binlog
设为0:先将数据写到buffer,操作系统会找一个空闲的时间,将buffer中的数据批量写入磁盘
设为1:只要数据发生更改(哪怕是一个字节的更改),立即写入磁盘;效率最低,但是可以保证数据安全
先把事务日志写入buffer,等待1s后写入磁盘
1、主
#
mysqldump -A -F --single-transaction --master-data=1 > /backup/all.sql
#
scp /backup/all.sql 192.168.30.27:/backup/
2、从
vim /backup/all.sql
CHANGE MASTER TO
MASTER_HOST='192.168.30.17' ,
MASTER_USER='repluser' ,
MASTER_PASSWORD='centos' ,
MASTER_PORT=3306 ,
MASTER_LOG_FILE='mariadb-bin.000003' ,
MASTER_LOG_POS=245 ;
3、主
-- 删除3之前的二进制日志,即:删除1和2
purge binary log to 'mariadb-bin.000003';
主主复制
半同步复制
实验:实现半同步复制
(一)主
1、安装插件
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so' ;
2、启用变量
set global rpl_semi_master_enable=1;
(二)从
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so' ;
2、启用变量
set global rpl_semi_slave_enable=1;
从库设置过滤
--
show variables like 'replicate_ignore_db';
--
stop slave;
--
set global replicate_ignore_db=1;
服务器选项:
带 -- ;
服务器变量:
不带 -- ;
可以在命令行中设置,也可以在my.cnf配置文件中设置
从库设置过滤器
vim /etc/my.cnf
[mysqld]
binlog_ignore_db=mysql
binlog_format=row
statement-base logging :基于语句的日志记录
row-base logging :基于行的日志记录
默认不启用SSL
--
show variable like '%ssl%';
如果显示DISABLE则表示未启用SSL功能
如果显示NO则表示不支持,需要重新用源码编译安装!
CA证书、CA私钥
Master证书、Master私钥
Slave证书、Slave私钥
【重要】实战:实现主从SSL加密复制
(一)在CA上执行
1、在CA上生成私钥
openssl genrsa 2048 > cakey.pem
2、生成CA自签名证书
openssl req -new -x509 -key cakey.pem -out cacert.pem -days 3650
CN
beijing
beijing
magedu.com
opt
ca.magedu.com
3、生成Master私钥和请求文件
openssl req -newkey rsa:2048 -days 365 -nodes -keyout master.key > master.csr
CN
beijing
beijing
magedu.com
opt
master.magedu.com
4、为Master颁发证书
openssl x509 -req -in master.csr -CA cacert.pem -CAkey cakey.pem -set_serial 01 > master.crt
5、生成Slave私钥和请求文件
openssl req -newkey rsa:2048 -days 365 -nodes -keyout slave.key > slave.csr
CN
beijing
beijing
magedu.com
opt
slave.magedu.com
6、为Slave颁发证书
openssl x509 -req -in slave.csr -CA cacert.pem CAkey cacert.pem -set_serial 02 > slave.crt
7、验证生成的证书
openssl verify -CAfile cacert.pem master.crt slave.crt
8、复制文件
scp -r /etc/my.cnf.d/ssl/ 192.168.30.17:/etc/my.cnf.d
scp -r /etc/my.cnf.d/ssl/ 192.168.30.27:/etc/my.cnf.d
(二)在Master上执行
1、只保留需要的文件
# 在主服务器上
cd /etc/my.cnf.d/ssl/
rm -rf cakey.pem slave.* master.csr
2、修改主库配置文件
# 在主服务器上
vim /etc/my.cnf
[mysqld]
log_bin
server_id=1
innodb_file_per_table
# 在主服务器上
systemctl start mariadb
#
mysql
3、查看ssl变量是否为YES
--
show variables like '%ssl%';
4、创建用户,并强制要求以SSL加密连接
-- 切记:一定要指明 require ssl “强制要求以SSL方式进行连接”!
grant replication slave on *.* to repluser@'192.168.30.%' identified 'centos' require ssl;
(三)在Slave上执行
1、只保留需要的文件
# 在从服务器上
cd /etc/my.cnf.d/ssl/
rm -rf cakey.pem master.* slave.csr
2、修改从库配置文件
# 在从服务器上
vim /etc/my.cnf
[mysqld]
server_id=2
ssl
ssl-ca=/etc/my.cnf.d/ssl/cacert.pem
ssl-cert=/etc/my.cnf.d/ssl/slave.crt
ssl-key=/etc/my.cnf.d/ssl/slave.key
# 在从服务器上
systemctl start mariadb
#
mysql
3、Change Master
--
CHANGE MASTER TO
MASTER_HOST='192.168.30.17' ,
MASTER_USER='repluser' ,
MASTER_PASSWORD='centos' ,
MASTER_PORT=3306 ,
MASTER_LOG_FILE='mariadb-bin.000002' ,
MASTER_LOG_POS=412 ,
MASTER_CONNECT_RETRY=10 ,
MASTER_SSL=1 ,
MASTER_SSL_CA='/etc/my.cnf.d/ssl/cacert.pem' ,
MASTER_SSL_CERT='/etc/my.cnf.d/slave.crt' ,
MASTER_SSL_KEY='/etc/my.cnf.d/ssl/slave.key' ;
4、开启同步
--
start slave;
【重要】实战:实现MHA(Master High Avarible)
(一)准备
1、改主机名
Manager:7
Master:17
Slave1:27
Slave2:37
2、所有服务器保证时间同步
vim /etc/ntp.conf
server 172.20.0.1 iburst
systemctl start ntpd
systemctl enable ntpd
3、关闭SELINUX,清空iptables规则
???
(二)主
1、修改配置文件
vim /etc/my.cnf
[mysqld]
server_id=1
log_bin
binlog_format=row
skip_name_resolve
systemctl start mariadb
mysql
2、建账号
grant replication slave on *.* to repluser
(三)从一
1、修改配置文件
vim /etc/my.cnf
[mysqld]
server_id=2
read_only
relay_log_purge-0
skip_name_resolve=1
log_bin
systemctl start mariadb
mysql
2、CHANGE MASTER
CHANGE MASTER TO
MASTER_HOST='192.168.30.17' ,
MASTER_USER='repluser' ,
MASTER_PASSWORD='centos' ,
MASTER_PORT=3306 ,
MASTER_LOG_FILE='mariadb-bin.000001' ,
MASTER_LOG_POS=245 ;
3、开启slave
--
start slave;
--
show slave status;
(四)从二
1、修改配置文件
vim /etc/my.cnf
[mysqld]
server_id=3
read_only
relay_log_purge-0
skip_name_resolve=1
log_bin
systemctl start mariadb
mysql
2、CHANGE MASTER
CHANGE MASTER TO
MASTER_HOST='192.168.30.17' ,
MASTER_USER='repluser' ,
MASTER_PASSWORD='centos' ,
MASTER_PORT=3306 ,
MASTER_LOG_FILE='mariadb-bin.000001' ,
MASTER_LOG_POS=245 ;
3、开启slave
--
start slave;
--
show slave status;
(五)主
1、导入hellodb.sql脚本生成数据库
mysql < hellodb.sql
2、查看两个从库和主库是否已经同步
???
(六)管理节点
1、生成key
cd
ssh-keygen
2、添加当前主机私钥到key公钥
ssh-copy-id 192.168.30.7
3、将key公钥拷贝分发到三个服务器上(Master、Slave1、Slave2)
#
scp -pr .ssh 192.168.30.17:/root/
#
scp -pr .ssh 192.168.30.27:/root/
#
scp -pr .ssh 192.168.30.37:/root/
(七)主
1、授权账号
mysql
grant all on *.* to mhauser@'192.168.30.%' identified by 'centos';
(八)从一
1、检查账号是否已经复制
select user,host from mysql.user;
2、确认授权
show grants for mhauser@'192.168.30.%' ;
(九)在管理节点上安装MHA
1、下载MHA的rpm包
需要下载两个文件:
(1)mha4mysql-manager-0,56-0.rl6.noarch.rpm
(2)mha4mysql-node-0.56-0.el6.noarch.rpm
2、安装MHA
yum -y install mha4mysql*
注意:安装过程依赖epel源
3、将node包拷贝分发到三个服务器上()
# Master
scp mha4mysql-node-0.56-0.el6.noarch.rpm 192.168.30.17;
# Slave1
scp mha4mysql-node-0.56-0.el6.noarch.rpm 192.168.30.27;
# Slave2
scp mha4mysql-node-0.56-0.el6.noarch.rpm 192.168.30.37;
(十)在三个服务器上安装node包(Master、Slave1、Slave2)
yum -y install mha
(十一)管理节点
1、建目录
#
mkdir /etc/mha/
#
vim /etc/mha/app1.conf
2、修改配置文件
[server default]
user=mhauser
password=centos
manager_workdir=/data/mastermha/app1/
manager_log=/data/mastermha/app1/manager.log
remote_workdir=/data/mastermha/app1/
ssh_user=root
repl_user=repluser
repl_password=centos
ping_interval=1
[server1]
hostname=192.168.30.17
candidate_master=1
[server2]
hostname=192.168.30.27
candidate_master=1
[server3]
hostname=192.168.30.37
candidate_master=1
3、探测(基于key验证)SSL连接是否有问题
masterha_check_ssh --conf=/etc/mha/app1.conf
4、开启MHA
前台执行:可以使用screen或者nohup
masterha_manager --conf=/etc/mha/app1.conf
(十二)
???
实验:实现Gelera Cluster
1、添加yum源【在三个服务器上(7、17、27)】
vim /etc/yum.repos.d/base.repo
[base]
name=CentOS DVD
baseurl=file://misc/cd
gpgcheck=0
[epel]
name=Aliyun EPEL
baseurl=http://mirrors.aliyun.com/epel/$releasever/$basearch
gpgcheck=0
enabled=0
[mariadb]
name=MariaDB
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.60/yum/centos7-amd64/
gpgcheck=0
2、装包【在三个服务器上(7、17、27)】
yum install MariaDB-Galera-server
3、寻找三个文件的位置
#
rpm -ql MariaDB-Galera-server
# (1) /etc/init.d/mysql
# (2) /etc/my.cnf.d/server.cnf
#
rpm -ql galera
# (3) /usr/lib64/galera/libgalera_smm.so
4、修改server配置文件【在三个服务器上(7、17、27)】
vim /etc/my.cnf.d/server.cnf
[galera]
wsrep_provider=/usr/lib64/galera/libgalera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.30.7,192.168.30.17,192.168.30.27"
binlog_format=row
5、在第一个节点上执行
/etc/init.d/mysql start --wsrep-new-cluster
6、其他两个节点的
/etc/init.d/mysql start
7、
???
```