>  기사  >  데이터 베이스  >  MySQL 데이터베이스를 기반으로 MySQL 고가용성 운영 및 유지관리에 대해 이야기해 보세요.

MySQL 데이터베이스를 기반으로 MySQL 고가용성 운영 및 유지관리에 대해 이야기해 보세요.

php是最好的语言
php是最好的语言원래의
2018-07-25 15:52:281877검색

이 기사에서는 MySQL을 위한 또 다른 고가용성 구현 솔루션, 즉 MHA(Master 고가용성). 하 선생님. MySQL의 마스터-슬레이브 아키텍처에 대한 자동 장애 복구 기능을 제공하는 오픈소스 고가용성 프로그램입니다.

1. 기본 지식 소개

1. MHA 정의

마스터 HA. MySQL의 마스터-슬레이브 아키텍처에 대한 자동 장애 복구 기능을 제공하는 오픈소스 고가용성 프로그램입니다. 마스터-슬레이브 복제 중에 MHA가 MySQL 마스터 노드 오류를 감지하면 복제 클러스터의 슬레이브 노드를 자동으로 승격하여 새 마스터 노드가 됩니다. 전환 중에 다른 노드에서 추가 정보를 얻어 데이터 일관성 문제도 방지됩니다. 또한 MHA는 필요에 따라 마스터/슬레이브 노드를 전환할 수 있는 마스터 노드에 대한 온라인 장애 조치 기능도 제공합니다.

2. MHA 구조

MHA의 모든 노드에는 주로 관리 노드와 데이터 노드라는 두 가지 역할이 있습니다.
관리 노드(MHA Manager): 일반적으로 단일 머신에 배포되며 여러 마스터 및 슬레이브 클러스터를 관리하는 데 사용되며 마스터와 슬레이브로 구성된 각 클러스터를 애플리케이션이라고 합니다.
데이터 노드(MHA 노드): 각 MySQL 서버에서 실행되며 로그 구문 분석 및 정리 기능으로 스크립트를 모니터링하여 노드 장애 조치를 가속화합니다.

3. HMA 컴포넌트
(1) 매니저 컴포넌트

masterha_check_sh:MHA依赖的ssh环境监测工具
masterha_check_repl:MySQL复制环境监测工具
masterha_manager:MHA服务主程序
masterha_check_status:MHA运行状态探测工具
masterha_master_monitor:MySQL master节点可用性监测工具
masterha_master_switch:master节点切换工具
masterha_conf_host:添加或删除配置的节点
masterha_stop:关闭MHA服务的工具

(2) 노드 컴포넌트

save_binary_logs:保存和赋值master的二进制日志
apply_diff_relay_logs:识别差异的中继日志并应用于其他slave
filter_mysqlbinlog:去除不必要的ROLLBACK事件(MHA已经不再使用这个工具)
purge_relay_logs:清除中继日志(不会阻塞SQL线程)

(3) 커스텀 확장

secondary_check_script:通过多条网络路由监测master的可用性
master_ip_failover_script:更新application使用的masterip
shutdown_script:强制关闭master节点
report_script:发送报告
init_conf_load_script:加载初始配置参数
master_ip_online_change_script:更新master节点ip地址

2. MHA 구축

1 운영체제: CentOS6.9_X86_64
MySQL 버전: MySQL5.6.39 범용 바이너리
서버 계획:
마스터 노드 마스터: 192.168.199.104(mysql-master, master)

슬레이브 노드 1: 192.168.199.105(mysql-slave01,slave01)

슬레이브 노드 2: 192.168. 106 (mysql-slave02,slave02)
관리 노드 : 192.168.199.107(mysql-manager,manager)

2.Setup

(1) 각 노드의 호스트를 따로 작성하지 않고도 나중에 사용하기 더 편리합니다. IP

[root@mysql-master ~]# vim /etc/hosts
#添加如下内容:
127.0.0.1  localhost localhost.localdomain localhost4 localhost4.localdomain4
::1        localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.199.104 mysql-master master
192.168.199.105 mysql-slave01 slave01
192.168.199.106 mysql-slave02 slave02
192.168.199.107 mysql-manager manager

(2) 구성된 호스트 파일을 다른 3개의 노드에 복사합니다

[root@mysql-master ~]# scp /etc/hosts slave01:/etc/
[root@mysql-master ~]# scp /etc/hosts slave02:/etc/
[root@mysql-master ~]# scp /etc/hosts manager:/etc/

(3) 마스터-슬레이브 동기화를 구성합니다. Slave01 및 Slave02는 마스터의 슬레이브 라이브러리입니다

마스터의 바이너리 로그를 활성화합니다

[root@mysql-master ~]# vim /etc/my.cnf
#在[mysqld]下面添加如下内容:
server-id = 104
skip-name-resolve
log_bin=/mysql_data/mysql-bin
log_bin_index=/mysql_data/mysql-bin.index
binlog_format = mixed

마스터에서 현재 바이너리 로그 포인트 위치를 보고 복제 계정을 생성합니다

[root@mysql-master ~]# mysql -uroot –proot
#查看当前二进制日志点的位置
mysql> SHOW MASTER STATUS \G
*************************** 1. row ***************************
             File: mysql-bin.000090
         Position: 120
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)
#创建从库的复制账户
mysql> GRANT REPLICATION SLAVE ,REPLICATION CLIENT ON *.* TO 'repl'@'192.168.199.%' IDENTIFIED BY 'repl';
#刷新权限
mysql> FLUSH PRIVILEGES;

slave01에서 바이너리 로그 및 릴레이 로그를 활성화하고 마스터의 슬레이브 라이브러리로 구성합니다

[root@mysql-slave01 ~]# vim /etc/my.cnf
#在[mysqld]下添加如下内容:
server-id = 105
log_bin = /mysql_data/mysql-bin
log_bin_index = /mysql_data/mysql-bin.index
relay_log = /mysql_data/mysql-relay
relay_log_index = /mysql_data/mysql-relay.index
read_only
relay_log_purge = 0

매개변수 설명:

relay_log_purge:该参数表示不自动清理中继日志,因为MHA需要根据slave的中继日志判断slave同步master的binlog到什么位置了
read_only:表示是只读,MHA需要根据这个参数来识别主从库
bin_log:开启从库的二进制日志,因为在主节点出现故障时,需要将其中某个从库提升为主库,所以需要开启从库的二进制日志

시작 슬레이브01 노드가 필요하며 동기화된 마스터 노드 정보는 마스터 노드를 가리킵니다.

[root@mysql-slave01 ~]# service mysqld restart
[root@mysql-slave01 ~]# mysql -uroot –proot
#使用change master命令将主库指向master节点
mysql> CHANGE MASTER TO MASTER_HOST = '192.168.199.104',MASTER_PORT=3306,MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_LOG_FILE='mysql-bin.000090',MASTER_LOG_POS=120;
mysql> START SLAVE;
#查看是否同步成功
mysql> SHOW SLAVE STATUS \G
看到如下信息表示同步成功:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

두 번째 슬레이브 라이브러리를 동일한 방식으로 구성합니다. 두 번째 슬레이브에 슬레이브01의 구성 파일을 직접 복사한 후 수정할 수 있습니다.

[root@mysql-slave01 ~]# scp /etc/my.cnf slave02:/etc/
[root@mysql-slave02 ~]# vim /etc/my.cnf
#修改server-id即可:
server-id = 106

수정이 완료되면 저장하고 종료하고 mysql을 다시 시작한 다음,slave02를 마스터의 슬레이브 라이브러리로 구성합니다

[root@mysql-slave02 ~]# mysql -uroot –proot
mysql> CHANGE MASTER TO MASTER_HOST = '192.168.199.104',MASTER_PORT=3306,MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_LOG_FILE='mysql-bin.000090',MASTER_LOG_POS=120;
mysql> START SLAVE;
#查看是否同步成功
mysql> SHOW SLAVE STATUS \G
看到如下信息表示同步成功:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

(4) 관리 권한이 있는 사용자 계정을 생성합니다

#在主节点master上创建管理账号,使其可以同步到其他连个从节点,注意:这个管理账号需要能够远程连接MySQL
mysql> GRANT ALL ON *.* TO 'mha'@'192.168.199.%' IDENTIFIED BY 'mha';
mysql> FLUSH PRIVILEGES;

(5) MHA로 인해 아키텍처상 각 노드는 서로 통신이 가능해야 하며, 상호 신뢰 통신을 위해서는 각 노드가 비밀키 없이 로그인할 수 있도록 구성해야 하기 때문에 하나하나 생성하고 복사하는 것이 번거롭다. . 마스터 노드에서 비밀 키 쌍을 생성한 다음 각 호스트가 동일한 개인 키 쌍을 갖도록 할 수 있습니다. Key

#在master上生成秘钥对
[root@mysql-master ~]# ssh-keygen -t rsa -P ''
#首先保存到本机的秘钥文件中,使得本机可以无秘钥使用ssh方式登陆本机
[root@mysql-master ~]# cat .ssh/id_rsa.pub >> .ssh/authorized_keys
#使用ssh登陆本机测试,发现可以无密码登陆
[root@mysql-master ~]# ssh 192.168.199.104
#修改authorized_keys文件的权限,只能属主查看,同组用户和其他用户不可查看
[root@mysql-master ~]# chmod go= .ssh/authorized_keys

비밀 키 쌍과 개인 키 파일을 다른 세 노드에 복사하세요.

[root@mysql-master ~]# scp -p .ssh/id_rsa .ssh/authorized_keys slave01:/root/.ssh/
[root@mysql-master ~]# scp -p .ssh/id_rsa .ssh/authorized_keys slave02:/root/.ssh/
[root@mysql-master ~]# scp -p .ssh/id_rsa .ssh/authorized_keys manager:/root/.ssh/
#测试无密码登陆,在主节点上执行如下命令,查看slave01节点的ip地址
[root@mysql-master ~]# ssh slave01 'ifconfig eth0'
#能够查看到slave01的ip地址表示无秘钥登陆配置成功,其他俩节点可以自己验证

(6) mha4mysql-manager 및 mha4mysql-node 설치 패키지를 다운로드합니다.

여기에 사용된 소프트웨어 패키지 버전은 다음과 같습니다.

管理节点:mha4mysql-manager-0.56.tar.gz
数据节点:mha4mysql-node-0.56.tar.gz

(7) 일부 mha4mysql 패키지는 base에서 제공되고 일부 패키지는 base에서 제공되므로 epel을 구성합니다. epel

[root@mysql-master ~]# rpm –ivh  http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

(8) 압축을 풀고 perl 명령을 사용하여 Makefile.PL 스크립트

[root@mysql-master ~]# tar xf mha4mysql-manager-0.56.tar.gz
[root@mysql-master ~]# cd mha4mysql-manager-0.56
[root@mysql-master mha4mysql-manager-0.56]# perl Makefile.PL

를 실행합니다. 참고: Makefile.PL 실행 중에 다음과 유사한 오류가 발생하면 해당 라이브러리 파일을 설치해야 합니다. Perl 프로그램은 다음 항목에 따라 달라집니다.

Can't locate ExtUtils/MakeMaker.pm in @INC (@INC contains: inc /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at inc/Module/Install/Makefile.pm line 4.
BEGIN failed--compilation aborted at inc/Module/Install/Makefile.pm line 4

위 오류가 발생하면 종속성을 설치해야 합니다.

[root@mysql-master ~]# yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker cpan perl-Time-HiRes perl-DBI perl-DBD-MySQL

(9) "perl MakeFile.PL"이 올바르게 실행되었는지 확인한 후 make 명령을 사용하여 설치. 참고: "echo $?"를 사용하면 이 명령의 실행 결과를 보고 이전 명령이 올바르게 실행되었는지 확인할 수 있습니다. 일반적으로 0은 올바르게 수행되었음을 의미합니다.

[root@mysql-master mha4mysql-manager-0.56]# make
[root@mysql-master mha4mysql-manager-0.56]# make install

(10) 마스터에 매니저 설치가 완료되면 같은 방법으로 mha4mysql-node를 컴파일하고 설치한다.

[root@mysql-manager ~]# tar xf mha4mysql-node-0.56.tar.gz
[root@mysql-manager ~]# cd mha4mysql-node-0.56
[root@mysql-manager mha4mysql-node-0.56]# perl Makefile.PL
#判断Makefile.PL是否正常执行完成
[root@mysql-manager mha4mysql-node-0.56]# echo $?
0
[root@mysql-manager mha4mysql-node-0.56]# make && make install

(11) 나머지 3개 서버(master,slave01,slave02)에도 mha4mysql-node

[root@mysql-slave01 ~]# tar mha4mysql-node-0.56.tar.gz
[root@mysql-slave01 ~]# cd mha4mysql-node-0.56
[root@mysql-slave01 mha4mysql-node-0.56]# perl Makefile.PL
[root@mysql-slave01 mha4mysql-node-0.56]# make && make install

를 설치한다. ) 나머지 두 노드도 같은 방법으로 설치하는데 여기서는 생략한다.

(12) 설치가 완료되면 /usr/local/bin 아래에 mha4mysql에서 생성된 스크립트 파일인 일부 스크립트가 있는 것을 확인할 수 있습니다.

(13) MHA 초기화

mha의 구성 파일을 편집합니다. 크게 두 가지 범주로 구성됩니다.
글로벌 구성: 각 애플리케이션에 대한 기본 구성을 제공합니다.
애플리케이션 구성: 어떤 서버를 지정하는 데 사용됩니다.

#创建目录并编辑配置文件
[root@mysql-manager ~]# mkdir -pv /etc/masterha/
[root@mysql-manager ~]# vim /etc/masterha/app01.conf

다음 내용을 작성합니다.

[server default]
user=mha  #管理用户的用户名
password=mha  #管理用户密码
manager_workdir=/data/masterha/app01  #manager节点的工作目录,用来存放一些二进制日志,不存在会自动创建
manager_log=/data/masterha/app01/manager.log #日志文件位置
remote_workdir=/data/masterha/app01  #远程的每一个节点的工作目录,没有会自动生成
ssh_user=root  #需要使用ssh来完成一些管理操作
repl_user=repl  #拥有复制权限的用户名
repl_password=repl  #拥有复制权限的密码
ping_interval=1  #每隔多长时间监测一次主节点是否在线,心跳信息监测
#其他主机
[server1]
hostname=192.168.199.104
#ssh_port=3306  #如果MySQL没有使用默认端口号,则此处需要指定,使用默认端口不需要指定
candidate_master=1  #表示该节点是否在主节点故障之后参与成为主节点
master_binlog_dir=/mysql_data/ #指定mysql的binlog日志路径
[server2]
hostname=192.168.199.105
candidate_master=1
master_binlog_dir=/mysql_data/
[server3]
hostname=192.168.199.106
#no_master=1  #表示主节点故障之后,该节点不参与成为主节点
master_binlog_dir=/mysql_data/

(14) 각 노드 간의 통신이 정상적인지 확인

[root@mysql-manager ~]# masterha_check_ssh --conf=/etc/masterha/app01.conf

오류 1: @INC에서 Config/Tiny.pm을 찾을 수 없습니다(@INC에는 다음이 포함되어 있으며 인터넷에서 다운로드해야 합니다. http://rpmfind에서 필수 rpm 패키지를 다운로드할 수 있습니다. .net/. 다음 rpm 패키지는 CentOS6.9 X86_64용입니다.

perl-Mail-Sender-0.8.16-3.el6.noarch.rpm 
perl-Log-Dispatch-2.26-1.el6.rf.noarch.rpm 
perl-Parallel-ForkManager-0.7.9-1.el6.noarch.rpm
perl-Config-Tiny-2.12-7.1.el6.noarch.rpm

다운로드가 완료된 후 yum 명령을 사용하세요. 다른 패키지에 따라 달라질 수 있기 때문입니다
.


错误2:master_check_ssh执行中的错误:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
原因:/root/.ssh/下的文件内容不一样或者文件的权限有问题,我遇到的是文件内容有问题。
解决办法:重新将其他主机上的秘钥对和私钥拷贝一份就正常了。


(15)检查主从复制环境是否正常

[root@mysql-manager ~]# masterha_check_repl --conf=/etc/masterha/app01.conf

错误1:

Sat Jun  2 03:07:26 2018 - [error][/usr/local/share/perl5/MHA/ServerManager.pm, ln301] install_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at (eval 27) line 3.
Perhaps the DBD::mysql perl module hasn't been fully installed,
or perhaps the capitalisation of 'mysql' isn't right.

原因:缺少perl-DBD-MySQL依赖库
解决办法:

[root@mysql-manager ~]# yum install -y perl-DBD-MySQL*

错误2:

Sat Jun  2 03:11:06 2018 - [error][/usr/local/share/perl5/MHA/ServerManager.pm, ln188] There is no alive server. We can't do failover

错误3:

Failed to save binary log: Binlog not found from /var/lib/mysql,/var/log/mysql! If you got this error at MHA Manager, please set "master_binlog_dir=/path/to/binlog_directory_of_the_master

原因:mysql的binlog日志目录没有在默认的/var/log/mysql下,而是在其他地方,导致目录找不到。
解决办法:在manager节点的配置文件中每个节点下制定二进制日志的目录路径。

[server1]
hostname=192.168.199.105
candidate_master=1
master_binlog_dir=/mysql_data/  #指定二进制日志文件目录

错误4:

Can't exec "mysqlbinlog": No such file or directory at /usr/local/share/perl5/MHA/BinlogManager.pm line 106.
mysqlbinlog version command failed with rc 1:0, please verify PATH, LD_LIBRARY_PATH, and client options

原因:使用ssh连接之后找不到mysqlbinlog命令
解决办法:将/usr/local/mysql-5.6.39/目录连接到/usr/bin下

[root@mysql-master ~]# ln –s /usr/local/mysql-5.6.39/bin /usr/bin
[root@mysql-slave01 ~]# ln –s /usr/local/mysql-5.6.39/bin /usr/bin
[root@mysql-slave02 ~]# ln –s /usr/local/mysql-5.6.39/bin /usr/bin

(16)启动MHA

#前台启动,日志会直接打印在控制台上
[root@mysql-manager app01]# masterha_manager --conf=/etc/masterha/app01.conf
#后台启动
[root@mysql-manager app01]# nohup masterha_manager --conf=/etc/masterha/app01.conf &

(17)验证高可用故障自动转移

#停止master节点的mysqld服务
[root@mysql-master ~]# killall mysqld mysqld_safe

#查看原来的两个slave节点信息,发现已经有slave01被提升为master了
mysql> SHOW SLAVE STATUS \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.199.105
                  Master_User: repl
                  ...
#查看slave01的read_only属性,发现已经被修改为OFF了
mysql> SHOW VARIABLES LIKE 'read_only';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only     | OFF   |
+---------------+-------+

注意:当某一个master故障之后,从库提升为主库,原来的manager节点上的manager服务会自动退出。需要手动重启。
(18)故障的服务器再次恢复时,需要使用”CHANGE MASTER”命令手动将其加入到从节点中
(19)manager节点启动之后,可以使用masterha_check_status命令查看当前的主节点状态信息

[root@mysql-manager ~]# masterha_check_status --conf=/etc/masterha/app01.conf 
    app01 (pid:20582) is running(0:PING_OK), master:192.168.199.105

MHA的其他用法,如在线主从切换等,可以自行参考官方文档,此处不再介绍。另外还有MHA的manager节点的自动重启功能,报警功能,故障主机彻底摘除功能等可以通过shell脚本实现,后面有时间会继续介绍。

至此,MySQL的MHA高可用基本功能搭建完成。整个过程中有无数的坑,可能读者在搭建过程中,还会遇到其他的深坑,最好能够硬着头皮一个一个去解决!篇幅较长,所有内容都是经过验证一个字一个字敲上去的,但也难免有笔误,如有错误,欢迎在下方评论指出!

相关推荐:

运维角度浅谈MySQL数据库优化

运维角度浅谈MySQL数据库优化(李振良)

위 내용은 MySQL 데이터베이스를 기반으로 MySQL 고가용성 운영 및 유지관리에 대해 이야기해 보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.