MySql高可用集群搭建方案

简单的MySql主从已经不能满足线上项目了

准备工作

xxx.224.185.172正式库

xxx.224.185.52  测试库

xxx.224.185.169  从库

xxx.224.177.163  从库

xxx.224.185.53 控制台

工具

Xtrabackup:数据备份工具

MHA:高可用主从切换

Nginx:数据库代理,固定主从IP(主从切换不用重启微服务)

监控工具待定,MySQLMTOP,Navicat Monitor



工具安装

MySql调整

虚拟机linux搭建MySql集群(以及自己踩的坑) - 简书 (jianshu.com)

跳过mysql安装和配置主从,如果是docker安装mysql

需要挂载配置文件和日志文件

docker run --name mysqlmaster -e MYSQL_ROOT_PASSWORD=my-secret-pw -p3307:3306 -v /usr/local/mysql/conf/my.cnf:/etc/mysql/my.cnf -v /var/lib/mysql:/var/lib/mysql -d zudp/mysqlmaster:5.7


配置半同步复制

Master节点 

登录MySQL,在MySQL命令行执行下面命令安装插件

install plugin rpl_semi_sync_master soname 'semisync_master.so'; 

show variables like '%semi%';

使用vi /etc/my.cnf,修改MySQL配置文件

# 自动开启半同步复制

rpl_semi_sync_master_enabled=ON

rpl_semi_sync_master_timeout=1000 

重启MySQL服务

systemctl restart mysqld 

Slave节点 

两台Slave节点都执行以下步骤。

登录MySQL,在MySQL命令行执行下面命令安装插件

install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; 

使用vi /etc/my.cnf,修改MySQL配置文件

# 自动开启半同步复制

rpl_semi_sync_slave_enabled=ON 

重启服务

systemctl restart mysqld

测试半同步状态

首先通过MySQL命令行检查参数的方式,查看半同步是否开启。

show variables like '%semi%';

然后通过MySQL日志再次确认。

cat /var/log/mysqld.log

可以看到日志中已经启动半同步信息,例如:

Start semi-sync binlog_dump to slave (server_id: 2), pos(mysql-bin.000005, 154)

MHA安装


4台机器互通

防火墙设置

xxx.224.185.53是MHA Manager服务器

在四台服务器上分别执行下面命令,生成公钥和私钥(注意:连续按换行回车采用默认值)

ssh-keygen -t rsa 

在三台MySQL服务器分别执行下面命令,密码输入系统密码,将公钥拷到MHA Manager服务器上

ssh-copy-id xxx.224.185.53

之后可以在MHA Manager服务器上检查下,看看.ssh/authorized_keys文件是否包含3个公钥

cat /root/.ssh/authorized_keys 

执行下面命令,将MHA Manager的公钥添加到authorized_keys文件中(此时应该包含4个公钥)

cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys 

从MHA Manager服务器执行下面命令,向其他三台MySQL服务器分发公钥信息。

scp /root/.ssh/authorized_keys root@xxx.224.185.172:/root/.ssh/authorized_keys

scp /root/.ssh/authorized_keys root@xxx.224.185.169:/root/.ssh/authorized_keys

scp /root/.ssh/authorized_keys root@xxx.224.177.163:/root/.ssh/authorized_keys

可以MHA Manager执行下面命令,检测下与三台MySQL是否实现ssh互通。

ssh xxx.224.185.172 

exit

ssh xxx.224.185.169 

exit

ssh xxx.224.177.163 

exit

MHA下载和安装

MySQL5.7对应的MHA版本是0.5.8,下载地址

https://github.com/yoshinorim/mha4mysql-manager/releases/tag/v0.58

https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58

三台MySQL服务器需要安装node

MHA Manager服务器需要安装manager和node

MHA node安装

在四台服务器上安装mha4mysql-node。

MHA的Node依赖于perl-DBD-MySQL,所以要先安装perl-DBD-MySQL。

yum install perl-DBD-MySQL -y

rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

MHA manager安装

在MHA Manager服务器安装mha4mysql-node和mha4mysql-manager。

MHA的manager又依赖了perl-Confifig-Tiny、perl-Log-Dispatch、perl-Parallel-ForkManager,也分别进行安装。

wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

rpm -ivh epel-release-latest-7.noarch.rpm

yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager -y

rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

MHA 配置文件

MHA Manager服务器需要为每个监控的 Master/Slave 集群提供一个专用的配置文件,而所有的Master/Slave 集群也可共享全局配置。(只要再manager配置即可

创建目录

#目录说明

#/var/log (CentOS目录)

# /mha (MHA监控根目录)

# /app1 (MHA监控实例根目录)

# /manager.log (MHA监控实例日志文件)

mkdir -p /var/log/mha/app1

touch /var/log/mha/app1/manager.log


配置监控全局配置文件


vim /etc/masterha_default.cnf


[server default]

#主库用户名,在master mysql的主库执行下列命令建一个新用户

#create user 'mha'@'%' identified by '123123';

#grant all on *.* to mha@'%' identified by '123123';

#flush privileges;

user=mha

password=123123

port=3306

#ssh登录账号

ssh_user=root

#从库复制账号和密码

repl_user=root

repl_password=’数据库密码’ 

port=3306

#ping次数

ping_interval=1

#二次检查的主机

secondary_check_script=masterha_secondary_check -s xxx.224.185.172 -s

xxx.224.185.169 -s xxx.224.177.163 


配置监控实例配置文件

先使用mkdir -p /etc/mha命令创建目录,然后使用vim /etc/mha/app1.cnf 命令编辑文件


[server default]

#MHA监控实例根目录

manager_workdir=/var/log/mha/app1

#MHA监控实例日志文件

manager_log=/var/log/mha/app1/manager.log

#[serverx] 服务器编号

#hostname 主机名

#candidate_master 可以做主库

#master_binlog_dir binlog日志文件目录

[server1]

hostname=xxx.224.185.172 

candidate_master=1

master_binlog_dir="/var/lib/mysql"

[server2]

hostname=xxx.224.185.169 

candidate_master=1

master_binlog_dir="/var/lib/mysql"

[server3]

hostname=xxx.224.177.163 

candidate_master=1

master_binlog_dir="/var/lib/mysql"


MHA 配置检测

执行ssh通信检测

在MHA Manager服务器上执行: 

masterha_check_ssh --conf=/etc/mha/app1.cnf 

检测MySQL主从复制

在MHA Manager服务器上执行:

masterha_check_repl --conf=/etc/mha/app1.cnf

出现“MySQL Replication Health is OK.”证明MySQL复制集群没有问题。

MHA Manager启动

在MHA Manager服务器上执行:

nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --

ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

查看监控状态命令如下:

masterha_check_status --conf=/etc/mha/app1.cnf

查看监控日志命令如下:

tail -f /var/log/mha/app1/manager.log


Xtrabackup安装

每台数据库服务器安装Xtrabackup,控制台服务器不用装Xtrabackup。

1、下载地址:

https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.21/binary/redhat/7/x86_64/Percona-XtraBackup-2.4.21-r5988af5-el7-x86_64-bundle.tar

2、登录服务器:

cd  /usr/local/src,通过Xftp上传下载好的包到src目录下

3、解压:

tar xf Percona-XtraBackup-2.4.21-r5988af5-el7-x86_64-bundle.tar

4、安装:

yum install percona-xtrabackup-24-2.4.21-1.el7.x86_64.rpm -y

5、执行:

which xtrabackup

6、执行:

innobackupex -v


Nginx安装

略过


高可用实现


Nginx配置(例)

Nginx的作用是主从切换后,微服务不需要修改配置文件来更换主从ip,通过nginx代理的方式保证数据库连接ip固定。

stream{

server {

listen 8010;

proxy_connect_timeout 100s;

proxy_timeout 3000s;

proxy_pass masterdb ;

}

upstream masterdb {

server xxx.224.185.172:3306 weight=5 max_fails=10 fail_timeout=30000s;

}

    server {

listen 8011;

proxy_connect_timeout 100s;

proxy_timeout 3000s;

proxy_pass slavedb ;

}

upstream slavedb {

server xxx.224.185.169:3306 weight=5 max_fails=10 fail_timeout=30000s;

server xxx.224.185.163:3306 weight=5 max_fails=10 fail_timeout=30000s;

}

}

在nacos配置的是1主1从,单实际上从库在nginx做了负载是1主2从。

主库宕机处理

主库宕机后MHA Manager会将一个从库升级为主库,

查看MHA Manager日志

tail -200f /var/log/mha/app1/manager.log

例:


查看MHA日志,可以看到哪台slave切换成了master

show master status;

打开nginx配置文件,修改代理的主库和从库地址;将新主库ip写到主库位置,从库删除新主库ip。

stream{

server {

listen 8010;

proxy_connect_timeout 100s;

proxy_timeout 3000s;

proxy_pass masterdb ;

}

upstream masterdb {

server xxx.224.185.169:3306 weight=5 max_fails=10 fail_timeout=30000s;

}

    server {

listen 8011;

proxy_connect_timeout 100s;

proxy_timeout 3000s;

proxy_pass slavedb ;

}

upstream slavedb {

server xxx.224.185.163:3306 weight=5 max_fails=10 fail_timeout=30000s;

}

}

再手动将原主库启动,作为从库加入。

从库加入

传统从库加入需要主库停止写入,使用xtrabackup后可以在不影响主库的情况下加入从库


通过Xtrabackup工具热备主库数据

innobackupex --defaults-file=/usr/local/mysql/conf/my.cnf--user=root --password=*密码* --port=3306 --host=xxx.224.185.172 /home/xhr/onlineback/

应用日志到备份文件,确保在线热备数据处于一致性状态

innobackupex --apply-log /home/xhr/onlineback/2023-03-12_23-07-10(最新)/

将备份好的文件,传送到从库所在服务器

scp -r /home/xhr/onlineback/* root@xxx.224.185.169:/home/xhr/onlineback

在主库中对待处理的从库进行主从授权

就是主从的授权

create user 'zudp'@'%' identified by 'zudp';

grant replication slave on *.* to 'zudp'@'%';

flush privileges;

主库操作结束。


从库mysql配置要加上

#要复制数据库的名称(必要)

replicate-do-db=zudp-telecom=dev

备份从库一数据目录下的所有文件,同时将接收的备份文件拷贝到从库数据目录

\cp-rf /home/xhr/onlineback/2023-03-12_23-07-10/* /var/lib/mysql

chown -R mysql:mysql /var/lib/mysql/*

就是datadir全替换


查看binlog版本

cat /home/xhr/onlineback/2023-03-12_23-07-10/xtrabckup_binlog_info


mysql-bin.000055   154(查看到的信息)

从库同步,就是从备份的binlog位置开始同步

change master to master_host='xxx.224.185.172',master_user='root', master_password='*密码*',master_port=3306,master_log_file='mysql-bin.000055',master_log_pos=154;


start slave;

在nginx配置中加上从库负载。


操作记录

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容