文章目录
数据库集群主从复制及高可用相关问题
1、如果主节点已经运行了一段时间,且有大量数据时,如何配置并启动slave节点?
- 当一个集群在运行一段时间后,因为面临性能瓶颈需要在加入slave节点需要如下操作:
- 在不影响业务的情况下建议保证在访问量少的时候操作。在不停止master主服务器,对所需要同步的数据库做全备份
mysqldump -uroot -p -A -F --single-transation --master-data=1 --default-character-set=utf8mb4 |gzip >all_database-`date +%F-%T`.sql.gz
- 将备份好的数据库通过scp拷贝至所要添加的slave节点上去并解压
scp all_database-date.sql.gz user@ip:/data/mysql
#并在slave节点上解压
gzip -d all_database-date.sql.gz
- 在slave节点上安装与master节点相同版本的数据库并提供好配置文件启动
- 修改备份数据库的all_database-date.sql文件将如下内容
#修改sql语句中的此行
CHANGE MASTER TO MASTER_LOG_FILE='hostname.0000##', MASTER_LOG_POS=###;
#添加master的主从复制信息如下
CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repluser',
MASTER_PASSWORD='replpasswd',
MASTER_LOG_FILE='hostname.0000##',
MASTER_LOG_POS=###;
- 启动slave上的数据库并将备份的数据库导入后在mysql中执行 并查看slave状态信息确保主从同步正常
Mysql [(none)]>start slave;
Mysql [(none)]>show slave status;
至此在运行一段时间的主从复制集群中不停机添加一个slave就完成了。
2、当master服务器宕机,提升一个slave成为新的master
- 在主从复制中但master服务器宕机后,需要立刻提升一个slave服务器作为主服务器确保业务能正常进行
- 查看各节点上的中继日志数据位置 将二进制位置最新的确定所要提升为master节点的服务器
cat /var/lib/mysql/relay-log.info
5
./hostname-relay-bin.0000##
#####
mysql-bin.0000##
#####
0 #
- 在确定所需提升的slave服务器后 需要确保改服务器上用于主从同步的账号 以及是否开启二进制日志 并关闭只读配置
#开启二进制日志可以在my.cnf文件中添加该项
log-bin=/path/hostname
reda_only=off
#在mysql 8.0一下和mariadb可以执行下面命令
mysql>grant replication slave on *.* to 'user'@'ip' identified by 'passwd';
#在mysql 8.0上需使用以下命令
mysql>CREATE USER 'user'@'ip' IDENTIFIED BY 'passwd';
mysql>GRANT ALL ON *.* TO 'user'@'ip';
- 确保上述功能开启后停止该服务器上的主从复制线程并将该服务器数据进行全备份
#停止主从同步线程并清空主从同步信息
mysql>stop slave;
mysql>reset slave all;
#将该服务器的所有数据库备份
mysqldump -uroot -p -A -F --single-transation --master-data=1 --default-character-set=utf8mb4 |gzip >all_database-`date +%F-%T`.sql.gz
- 分析宕机的master服务器上的二进制日志 尽可能的将未同步的数据恢复出来
- 将修复后的数据库文件拷贝到每个服务器上并还原数据库(新master数据库也需要还原)
scp backup.sql user@ip:/data/mysql
- 将其他服务器的主从复制master节点指向新master节点
#还原数据库
mysql>source <backup.sql
#指向新服务器并重启主从复制线程
mysql>CHANGE MASTER TO
MASTER_HOST='ip',
MASTER_USER='repluser',
MASTER_PASSWORD='replpasswd',
MASTER_PORT=3306,
MASTER_LOG_FILE='hostname-bin.0000##', MASTER_LOG_POS=###;
mysql>stop slave;
mysql>reset slave all;
3、构建 MHA 0.58 搭建一个高可用数据库集群
MHA 是备受欢迎的实现主从复制节点高可用的解决方案。在集群中一旦master主节点宕机,能迅速从其他slave节点中选出事先定义好的节点或者是当前数据最新的节点作为新的master节点。建议让服务器自动选择避免数据的丢失,同时平时要做好备份工作避免数据损失。目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从。
- 试验规划
节点 | ip |
---|---|
manage | 10.0.0.7 |
master | 10.0.0.8 |
node1 | 10.0.0.18 |
node2 | 10.0.0.28 |
试验采用一主两从架构 加上MHA管理节点 并在CentOS 8上实现
说明: mha4mysql-manager-0.56-0.el6.noarch.rpm 不支持CentOS 8,只支持CentOS7 以下版本
说明: mha4mysql-manager-0.58-0.el7.centos.noarch.rpm ,支持MySQL 5.7 ,但和CentOS8版本上的Mariadb -10.3.17不兼容
2. 下载MHA 0.58版本的manage包和node包
#在所有服务器安装node包在MHA管理节点上先安装manage包才能安装node包
yum -y install mha4mysql-manage-0.58-0.el7.centos.noarch.rpm
yum -y install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
- 在所有节点之间之间实现ssh key认证 确保MHA可以通过SSH免密通信
[root@mha-manager ~]#ssh-keygen
[root@mha-manager ~]#ssh-copy-id 10.0.0.7
[root@mha-manager ~]#rsync -av .ssh 10.0.0.8:/root/
[root@mha-manager ~]#rsync -av .ssh 10.0.0.18:/root/
[root@mha-manager ~]#rsync -av .ssh 10.0.0.28:/root/
- 实现三台机器的主从复制
#在master节点安装mariadb-server
yum install -y mariadb-server
vim /etc/my.cnf
#添加以下行
server-id=7
log-bin
#启动主节点并查看二进制文件位置 记录下来并添加主从同步账号和mha账号
systemctl start mariadb
mysql>show master logs;
mysql>grant replication slave on *.* to 'repluser'@'10.0.0.%' identified by
'passwd';
mysql>grant all on *.* to 'mhauser'@'10.0.0.%' identified by 'passwd';
#在slave节点安装mariadb-server并编辑配置文件
vim /etc/my.cnf
#添加以下行
server_id=## #不同节点此值各不相同
log-bin=
read_only
relay_log_purge=0
#slave节点配置主从同步信息
msyql>CHANGE MASTER TO MASTER_HOST='10.0.0.7',
MASTER_USER='repluser',
MASTER_PASSWORD='passwd',
MASTER_LOG_FILE='master-bin-log.000001',
MASTER_LOG_POS=###;
mysql>start slave;
mysql>show slave status;
- 提供mha配置文件
mkdir /etc/mastermha/
vim /etc/mastermha/app.cnf
[server default]
user=mhauser #用于远程连接MySQL所有节点的用户,需要有管理员的权限
password=passwd
manager_workdir=/data/mastermha/app/ #目录会自动生成,无需手动创建
manager_log=/data/mastermha/app/manager.log
remote_workdir=/data/mastermha/app/
ssh_user=root #用于实现远程ssh基于KEY的连接,访问二进制日志
repl_user=repluser #主从复制的用户信息
repl_password=passwd
ping_interval=1 #健康性检查的时间间隔
report_script=/usr/local/bin/sendmail.sh #当执行报警脚本
check_repl_delay=0 #默认如果slave中从库落后主库relaylog超过100M,主库不会选择这个从库为新的master,因为这个从库进行恢复需要很长的时间.通过这个参数,mha触发主从切换的时候会忽略复制的延时,通过check_repl_delay=0这个参数,mha触发主从切换时会忽略复制的延时,对于设置candidate_master=1的从库非常有用,这样确保这个从库一定能成为最新的master
master_binlog_dir=/data/mysql/ #指定二进制日志存放的目录,mha4mysql-manager-0.58必须指定,之前版本不需要指定
[server1]
hostname=10.0.0.7
candidate_master=1
[server2]
hostname=10.0.0.17
candidate_master=1 #设置为优先候选master,即使不是集群中事件最新的slave,也会优先当master
[server3]
hostname=10.0.0.27
- 检查mha环境
masterha_check_ssh --conf=/etc/mastermha/app.cnf
masterha_check_repl --conf=/etc/mastermha/app.cnf #查看状态
masterha_check_status --conf=/etc/mastermha/app.cnf
- 启动MHA
#开启MHA,默认是前台运行
nohup masterha_manager --conf=/etc/mastermha/app.cnf &> /dev/null
#查看状态
masterha_check_status --conf=/etc/mastermha/app.cnf
- 模拟master节点宕机
systemctl stop mariadb
#可以收到报警邮箱
#查看slave节点信息 可以看到其中预先定义slave节点成为主节点提供服务
- 下次运行MHA需要删除以下文件
ls /data/mastermha/app1/app1.failover.complete -l
/data/mastermha/app1//app1.failover.complete
rm -f /data/mastermha/app1/app1.failover.complete
- MHA一般结合keepalive使用实现地址漂移具体配置参考keepalive
4、实战案例:Percona XtraDB Cluster(PXC 5.7)
- 配置pxc的yum仓库
#vim pxc.repo
[pxc]
name=pxc repo
baseurl=https://mirrors.tuna.tsinghua.edu.cn/percona/release/$releasever/RPMS/$basearch
gpgchecl=0
- 在centos7上需要安装XtraBackup2.4以上版本。三台机器上都用yum安装pxc
#下载并安装xtrabackup2.4
wget https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.20/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.20-1.el7.x86_64.rpm
yum install -y percona-xtrabackup-24-2.4.20-1.el7.x86_64.rpm
#安装pxc5.7版本
yum install Percona-XtraDB-Cluster-57 -y
- 修改配置文件
#修改数据库配置文件
vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
#修改server-id为不同值 并启用二进制日志
server-id=1
log-bin
#修改pxc配置文件 参考如下
vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_address=gcomm://10.0.0.7,10.0.0.17,10.0.0.27 #三个节点的IP
wsrep_node_address=10.0.0.7 #各个节点,指定自已的IP
wsrep_cluster_name=pxc-cluster #按实际情况修改
wsrep_node_name=pxc-cluster-node-1 #各个节点,指定自已节点名称
wsrep_sst_auth="sstuser:s3cretPass" #取消本行注释
- 启动第一个节点
systemctl start mysql@bootstrap
- 获取随机密码并尝试登陆 授权配置文件中的用户账号
grep "temporary password" /var/log/mysqld.log
mysql -uroot -p'passwd'
#修改密码授权用户账号
alter user 'root'@'localhost' identified by 'passwd';
create user 'sstuser'@'localhost' identified by 's3cretPass';
grant all on *.* to 'sstuser'@'localhost';
- 启动pxc
#启动第一个节点
systemctl start mysq
#查看第一个节点上的状态信息
mysql> show status like 'wsrep%';
- 查看集群信息
#查看集群名字
mysql> SHOW VARIABLES LIKE 'wsrep_node_name';
#查看集群状态信息
mysql>SHOW VARIABLES LIKE 'wsrep_on';
#查看集群节点数量
mysql>SHOW STATUS LIKE 'wsrep_cluster_size';
- 可以看到集群节点个数为所部署的机器个数 集群就部署成功了