1.1 准备6台虚拟机,并按照本节规划配置好IP参数
在这些虚拟机之间实现SSH免密登录
在相应节点上安装好MHA相关的软件包
IP规划,如表-2所示:
1、MHA两部分组成
MHA 由两部分组成: MHA Manager(管理节点)和 MHA Node(数据节点)。 MHA Manager可以单独部署在一台独立的机器上管理多个 master-slave 集群,也可以部署在一台 slave 节点上。
原理:
MHA(Master High Availability)是现在解决mysql高可用的一个相对成熟的方案
它是由两部分组成,管理端(master manager)和节点端(node manager),管理端可以单独布置在一台机器上,整个mysql主从集群就是它的各个节点,
管理端对所有节点进行监控,当master宕机之后,管理端会根据自己配置文件里的设定,将某一个从节点升为主节点,(如果没有设置,它会自己比对,将最新数据的节点升为主节点),然后将其他节点自动指向提升上来的新的主节点,在提升的过程中,所有结点之间必须可以无密码ssh连接,管理端可以对所有的节点ssh无密码连接.
在MHA自动故障切换的过程中,如果宕掉的 master 无法ssh连接上,则无法同步最新的二进制日志,也就无法获得最新的数据,造成数据丢失,因此,为了避免这中情况发生,MHA一般配合半同步复制.可以最大程度的保存数据.
为了避免在更换主节点时同步日志出错(pos模式下更换节点,日志同步会出错),我们开启GTID模式
目前MHA支持一主多从,整个MHA架构最少有三个节点,一台主服务器, 一台slave做备用主服务器, 一台slave只做同步,当然,为了充分利用资源,集群可以做读写分离(master做写操作,slave做读操作)
#连接到域
Red Hat Enterprise Linux Server 7.4 (Maipo)
Kernel 3.10.0-693.el7.x86_64 on an x86_64
localhost login: root #用root用户登入
密码: #输入密码
Last login: Tue Jan 30 12:29:01 on :0
[root@localhost ~]# hostnamectl set-hostname mysql51 #修改主机名
[root@localhost ~]# nmcli connection modify eth0 ipv4.method manual ipv4.addresses “192.168.4.51/24” connection.autoconnect yes #配置网卡eth0 IP地址
[root@localhost ~]# nmcli connection up eth0 #激活网卡eth0
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)
按CTRL键+ ] #退出域
在mysql51中生成key
[root@mysql51 ~]# ssh-keygen -t rsa -P ’ ’ #生成密钥,用于ssh无密码远程连接其他主机,一路回车就可以了
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:juz3qDODDnUnuyfr8qc6cIVAb+/dnvRREe+b3QZVreo root@mysql51
The key’s randomart image is:
±–[RSA 2048]----+
| … . o|
| … oo|
| .o. …o|
| … .+ |
| …+ S .o .|
| …+ B . … .=|
| .o .= o o… o+|
| .+.=.++ oE. . |
| .o*O%…+ . |
±—[SHA256]-----+
所有节点之间可以互相以ssh密钥对方式认证登陆以(以51为例)
[ ]> [root@mysql51 ~]# for i in 51 52 53 54 55 56
#用for循徊拷贝密钥给其他主机,其他每台主机都要做。
> do
> ssh-copy-id 192.168.4.$i
> done
链接: https://pan.baidu.com/s/19VHYWENm61UDlOvp_vmUQg 提取码: wvph #红帽rhel-server-7.4-x86_64-dvd.iso镜像
链接: https://pan.baidu.com/s/1VimRUtMeJVNWNRLrzCgfFg 提取码: jdu7 #perl依赖用软件包
链接: https://pan.baidu.com/s/1UBuAqRGrE5tkrTs9HVavXw 提取码: 5i2i #mysql-5.7.17软件包
[root@mysql51 ~]# yum -y install perl-* #yum源是红帽rhel-server-7.4-x86_64-dvd.iso镜像
安装 183 软件包 (+22 依赖软件包)
[root@mysql51 ~]# cd mha-soft-student/
[root@mysql51 mha-soft-student]# ls
master_ip_failover perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
mha4mysql-manager-0.56.tar.gz perl-Mail-Sendmail-0.79-21.el7.art.noarch.rpm
mha4mysql-node-0.56-0.el6.noarch.rpm perl-MIME-Lite-3.030-1.el7.noarch.rpm
perl-Config-Tiny-2.14-7.el7.noarch.rpm perl-MIME-Types-1.38-2.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm
[root@mysql51 mha-soft-student]# yum -y install perl-*.rpm #用yum安装软件包
已安装:
perl-Config-Tiny.noarch 0:2.14-7.el7 perl-Email-Date-Format.noarch 0:1.002-15.el7
perl-Log-Dispatch.noarch 0:2.41-1.el7.1 perl-MIME-Lite.noarch 0:3.030-1.el7
perl-MIME-Types.noarch 0:1.38-2.el7 perl-Mail-Sender.noarch 0:0.8.23-1.el7
perl-Mail-Sendmail.noarch 0:0.79-21.el7.art perl-Parallel-ForkManager.noarch 0:1.18-2.el7
作为依赖被安装:
perl-Class-Load.noarch 0:0.20-3.el7 perl-Data-OptList.noarch 0:0.107-9.el7
perl-IO-Socket-IP.noarch 0:0.21-4.el7 perl-IO-Socket-SSL.noarch 0:1.94-6.el7
perl-List-MoreUtils.x86_64 0:0.33-9.el7 perl-MailTools.noarch 0:2.12-2.el7
perl-Module-Implementation.noarch 0:0.06-6.el7 perl-Module-Runtime.noarch 0:0.013-4.el7
perl-Net-LibIDN.x86_64 0:0.12-15.el7 perl-Net-SMTP-SSL.noarch 0:1.01-13.el7
perl-Net-SSLeay.x86_64 0:1.55-6.el7 perl-Package-DeprecationManager.noarch 0:0.13-7.el7
perl-Package-Stash.noarch 0:0.34-2.el7 perl-Package-Stash-XS.x86_64 0:0.26-3.el7
perl-Params-Util.x86_64 0:1.07-6.el7 perl-Params-Validate.x86_64 0:1.08-4.el7
perl-Sub-Install.noarch 0:0.926-6.el7 perl-Sys-Syslog.x86_64 0:0.33-3.el7
perl-TimeDate.noarch 1:2.30-2.el7 perl-Try-Tiny.noarch 0:0.12-2.el7
[root@mysql51 mha-soft-student]# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm #rpm升级安装MHA Node数据节点
错误:依赖检测失败:
perl(DBD::mysql) 被 mha4mysql-node-0.56-0.el6.noarch 需要 #错误提示没安装软件包依赖
[root@mysql51 ~]# tar -xf mysql-5.7.17.tar #在当前目录下tar解包
[root@mysql51 ~]# yum -y install mysql-community-*.rpm #在当前目录下用yum安装依赖软件包
[root@mysql51 ~]# systemctl restart mysqld #安装完mysql数据库,重启mysql服务,服务名mysqld,服务默认的端口是3306,可以用netstat -utnlp | grep mysqld 查看监听的端口
[root@mysql51 ~]# systemctl enable mysqld #设置开机自启
[root@mysql51 ~]# grep password /var/log/mysqld.log #查看错误日志,修改登入密码
2019-05-17T08:31:16.432099Z 1 [Note] A temporary password is generated for root@localhost: efXayanCj9_i
[root@mysql50 ~]# mysql -uroot -p"efXayanCj9_i" #用错误日志里的密码,第一次登入数据库,-u用户 -p密码 但是要注意随机密码有特殊符号要用双引号引起来。
mysql [-h服务器 -u用户名 -p密码 数据库]
用该密码登录到服务端后,必须马上修改密码,不然会报如下错误:
mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> alter user root@“localhost"identified by"123qqq…A”; #修改密码,密码必须符合四分之三原则
Query OK, 0 rows affected (0.00 sec)
这个其实与validate_password_policy的值有关,默认为1,所以刚开始设置的密码必须符合长度,且必须含有数字,小写或大写字母,特殊字符。如果我们不希望密码设置的那么复杂,需要修改两个全局参数:
validate_password_policy与validate_password_length。validate_password_length默认值为8,最小值为4,如果你显性指定validate_password_length的值小于4,尽管不会报错,但validate_password_length的值将设为4。
mysql> show variables like “% password%”; #查看密码策略
±--------------------------------------±-------+
| Variable_name | Value | #变量名
±--------------------------------------±-------+
| default_password_lifetime | 0 | #默认密码的生存期
| disconnect_on_expired_password | ON | #密码过期时断开连接
| log_builtin_as_identified_by_password | OFF | #将内置的日志记录为密码标识的日志
| mysql_native_password_proxy_users | OFF |
| old_passwords | 0 |
| report_password | |
| sha256_password_proxy_users | OFF |
| validate_password_check_user_name | OFF |
| validate_password_dictionary_file | |
| validate_password_length | 8 | #密码长度
| validate_password_mixed_case_count | 1 |
| validate_password_number_count | 1 |
| validate_password_policy | MEDIUM | #密码策略
| validate_password_special_char_count | 1 |
±--------------------------------------±-------+
14 rows in set (0.28 sec)
validate_password_policy 验证密码策略
0 or LOW 长度
1 or MEDIUM(默认) 长度;数字;小写/大写、和特殊字符
2 or STRONG 长度;数字、小写/大写和特殊字符;字典文件
mysql> set global validate_password_policy=0; #只验证长度
mysql> set global validate_password_length=6; #修改密码长度,默认值是8个字符
mysql> alter user user() identified by “123456”; #修改登入密码
上述操作的结果是——更改数据库用户root从本机访问时的密码,设为123456。
[root@dba5 ~]# mysql -uroot -p123456 #用新密码登录
连接MySQL服务器时,最基本的用法是通过 -u 选项指定用户名、-p指定密码。密码可以写在命令行(如果不写,则出现交互,要求用户输入)
默认情况下,msyql命令会连接本机的MySQL服务。但在需要的时候,可以通过 -h 选项指定远程主机
[root@dba5 ~]# mysql -h127.0.0.1 -uroot -p123456
查看/删除/创建库的相关操作
以root用户登入“mysql> ”环境后,可以执行各种MySQL指令、SQL指令。
操作指令不区分大小写(库名/表名、密码、变量值等除外)。
每条SQL指令以 ; 结束或分隔。
不支持 Tab 键自动补齐。
\c 可废弃当前编写错的操作指令。
常用的SQL操作指令
DDL 数据定义语言 (create 、alter、drop desc)
DML 数据操作语言(insert 、update、delete、select)
DCL 数据控制语言 (grant、revoke)
DTL 数据事物语言 (commit、rollback、savepoink)
mysql> show databases; #查看现有的库
±-------------------+
| Database |
±-------------------+
| information_schema | #信息概要库
| mysql | #授权库
| performance_schema | #性能结构库
| sys | #系统元数据库
±-------------------+
mysql> use 库名; #切换到库
mysql> select database(); #确认当前所在的库
mysql> create database nsd1902; #新建名为nsd1902的库
mysql> drop database nsd1902; #删除名为nsd1902的库
mysql> show tables; #显示当前数据库已有的表
show databases; #显示已有的库
user #存放数据库用户的表
数据库的命名规则: 可以使用数字、字母、下划线,但不能使用纯数字 区分大小写,具有唯一性 不可使用指令关键字,特殊字符
/etc/my.cnf #主配置文件
/var/lib/mysql #数据库目录,数据库没起服务之前是空,起完服务才有初始数据,初始数据不能删除,不然服务起不来。
[root@mysql50 ~]# vim /etc/my.cnf #修改配置文件,添加,密码策略,永久生效
4 [mysqld]
5 validate_password_policy=0
6 validate_password_length=6
在所有主机上安装Perl依赖包(51-56操作)
[root@mysql51 ~]# yum -y install perl-* #安装系统镜像yum源自带perl软件包
[root@mysql51 ~]# tar -xf mha4mysql-manager-0.56.tar.gz
[root@mysql51 ~]# cd mha4mysql-manager-0.56 #cd切换到解压的目录里去
[root@mysql51 mha-soft-student]# ls
master_ip_failover
mha4mysql-manager-0.56.tar.gz
mha4mysql-node-0.56-0.el6.noarch.rpm
perl-Config-Tiny-2.14-7.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm
perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
perl-Mail-Sendmail-0.79-21.el7.art.noarch.rpm
perl-MIME-Lite-3.030-1.el7.noarch.rpm
perl-MIME-Types-1.38-2.el7.noarch.rpm
perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
[root@mysql51 mha-soft-student]# yum -y install perl-* #安装共享解压目录里perl软件包
首先mysql56要可以无密码ssh 51-55
[root@mysql56 ~]# cd mha-soft-student/ #切换到共享目录里去
[root@mysql56 mha-soft-student]# tar -xf mha4mysql-manager-0.56.tar.gz #解压管理用压缩文件
[root@mysql56 mha-soft-student]# cd mha4mysql-manager-0.56/ #切换到解压目录里去
[root@mysql51 mha4mysql-manager-0.56]# perl Makefile.PL #perl语言编译安装,后面跟上Makefile.PL文件,相当于配置,配置的时候会提示依赖,这些软件依赖前面以经安装括号里面有数字就表示前面已经安装
*** Module::AutoInstall version 1.03
*** Checking for Perl dependencies…
[Core Features]
#配置完成
[root@mysql56 mha4mysql-manager-0.56]# make && make install #编译安装
配置主服务器51
[root@mysql51 ~]# vim /etc/my.cnf #进入配置文件
[mysqld]
validate_password_policy=0
validate_password_length=6
server_id=51 #设置服务器ID为51
log-bin=master51 #设置日志名为master51
plugin-load = “rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so” #加载master模块和slave模块
rpl-semi-sync-master-enabled = 1 #启用半同步模块
rpl-semi-sync-slave-enabled = 1 #加载半同步模块
relay_log_purge=off #不自动删除本机的中继日志文件
[root@mysql51 ~]# systemctl restart mysqld #配置完重起服务
[root@mysql51 ~]# mysql -uroot -p123qqq…A #登入数据库
mysql> grant replication slave on . to plj@"%"
-> identified by “123456”; #添加主从同步授权用户
Query OK, 0 rows affected, 1 warning (0.20 sec)
mysql> show master status; #查看日志文件名称,和偏移量
mysql> set global relay_log_purge=off; #不自动删除本机的中继日志文件
配置从服务器52(备用主库)
[root@mysql52 ~]# vim /etc/my.cnf #vim编辑数据库配置文件
[mysqld]
validate_password_policy=0
validate_password_length=6
server_id=52 #设置服务器ID为52
log-bin=master52 #设置日志名为master52
plugin-load = “rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so” #加载master模块和slave模块
rpl-semi-sync-master-enabled = 1 #启用半同步模块
rpl-semi-sync-slave-enabled = 1 #加载半同步模块
relay_log_purge=off #不自动删除本机的中继日志文件
[root@mysql51 ~]# systemctl restart mysqld #配置完重起服务
[root@mysql51 ~]# mysql -uroot -p123456 #登入数据库
mysql> grant replication slave on . to plj@"%"
-> identified by “123456”; #添加主从同步授权用户
Query OK, 0 rows affected, 1 warning (0.20 sec)
mysql> show master status; #查看日志文件名称,和偏移量
mysql> set global relay_log_purge=off; #不自动删除本机的中继日志文件
mysql> change master to
-> master_host=“192.168.4.51”, #设置主机51为52的主库
-> master_user=“plj”, #51主机上主从同步授权用户为plj
-> master_password=“123456”, #授权用户密码为123456
-> master_log_file=“master51.000001”, #51主服务器上日志文件名为master51.000001,一定要跟主服务上一样
-> master_log_pos=962; #主服务器上偏移量
mysql> start slave; #配置完重起服务
mysql> show slave status\G; #查看是否同步
Slave_IO_Running: Yes #IO线程yes表示同步
Slave_SQL_Running: Yes #SQL线程yes表示同步
配置从服务器53(备用主库)
[root@mysql53 ~]# vim /etc/my.cnf #vim编辑数据库配置文件
[mysqld]
validate_password_policy=0
validate_password_length=6
server_id=53 #设置服务器ID为53
log-bin=master53 #设置日志名为master53
plugin-load = “rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so” #加载master模块和slave模块
rpl-semi-sync-master-enabled = 1 #启用半同步模块
rpl-semi-sync-slave-enabled = 1 #加载半同步模块
relay_log_purge=off #不自动删除本机的中继日志文件
[root@mysql51 ~]# systemctl restart mysqld #配置完重起服务
[root@mysql51 ~]# mysql -uroot -p123456 #登入数据库
mysql> grant replication slave on . to plj@"%"
-> identified by “123456”; #添加主从同步授权用户
Query OK, 0 rows affected, 1 warning (0.20 sec)
mysql> show master status; #查看日志文件名称,和偏移量
mysql> set global relay_log_purge=off; #不自动删除本机的中继日志文件
mysql> change master to
-> master_host=“192.168.4.51”, #设置主机51为53的主库
-> master_user=“plj”, #51主机上主从同步授权用户为plj
-> master_password=“123456”, #授权用户密码为123456
-> master_log_file=“master51.000001”, #51主服务器上日志文件名为master51.000001,一定要跟主服务上一样
-> master_log_pos=962; #主服务器上偏移量
mysql> start slave; #配置完重起服务
mysql> show slave status\G; #查看是否同步
Slave_IO_Running: Yes #IO线程yes表示同步
Slave_SQL_Running: Yes #SQL线程yes表示同步
配置从服务器54(纯从库)
[root@mysql54 ~]# vim /etc/my.cnf
[mysqld]
validate_password_length=6
validate_password_policy=0
server_id=54 #设置服务器ID为54
plugin-load = “rpl_semi_sync_slave=semisync_slave.so” #加载slave功能模块
rpl-semi-sync-slave-enabled = 1 #启用半同步模块
relay_log_purge=off #不自动删除本机的中继日志文件
[root@mysql54 ~]# systemctl restart mysqld #配置完重起服务
mysql> change master to
-> master_host=“192.168.4.51”, #设置主机51为54的主库
-> master_user=“plj”, #51主机上主从同步授权用户为plj
-> master_password=“123456”, #授权用户密码为123456
-> master_log_file=“master51.000001”, #51主服务器上日志文件名为master51.000001,一定要跟主服务上一样
-> master_log_pos=962; #主服务器上偏移量
mysql> start slave; #配置完重起服务
mysql> show slave status\G; #查看是否同步
Slave_IO_Running: Yes #IO线程yes表示同步
Slave_SQL_Running: Yes #SQL线程yes表示同步
配置从服务器55(纯从库)
[root@mysql55 ~]# vim /etc/my.cnf
[mysqld]
validate_password_length=6
validate_password_policy=0
server_id=55 #设置服务器ID为55
plugin-load = “rpl_semi_sync_slave=semisync_slave.so” #加载slave功能模块
rpl-semi-sync-slave-enabled = 1 #启用半同步模块
relay_log_purge=off #不自动删除本机的中继日志文件
[root@mysql54 ~]# systemctl restart mysqld #配置完重起服务
mysql> change master to
-> master_host=“192.168.4.51”, #设置主机51为55的主库
-> master_user=“plj”, #51主机上主从同步授权用户为plj
-> master_password=“123456”, #授权用户密码为123456
-> master_log_file=“master51.000001”, #51主服务器上日志文件名为master51.000001,一定要跟主服务上一样
-> master_log_pos=962; #主服务器上偏移量
mysql> start slave; #配置完重起服务
mysql> show slave status\G; #查看是否同步
Slave_IO_Running: Yes #IO线程yes表示同步
Slave_SQL_Running: Yes #SQL线程yes表示同步
配置管理主机56
[root@mysql56 ~]# mkdir /etc/mha_manager #创建存放管理配置文件用目录
[root@mysql56 ~]# cd /root/mha-soft-student/mha4mysql-manager-0.56 #cd切换到模版目录
[root@mysql56 conf]# cp -r /root/mha-soft-student/mha4mysql-manager-0.56/samples/conf/ app1.cnf /etc/mha_manager #拷贝模版配置文件到自己创建的目录下
[root@mysql56 conf]# vim /etc/mha_manager/app1.cnf #修改配置文件
[server default]
manager_workdir=/etc/mha_manager #管理服务的工作目录,根据前面创建存放配置文件的目录去修改
manager_log=/etc/mha_manager/manager.log #管理文件服务启动后存放日志文件路径和名称
master_ip_failover_script=/etc/mha_manager/master_ip_failover #指定故障切换脚本
ssh_user=root #指定ssh服务无密码连接时的用户名
ssh_port=22 #指定ssh服务无密码连接时的端口号
repl_user=plj #主库上授权从库连接时同步数据的用户名
repl_password=123456 #主库上授权从库连接时同步数据的密码
user=root #管理主机服务器56连接[51-55]时数据库的监控用户
password=123456 #管理主机服务器56连接[51-55]时数据库的监控用户的密码
[server1]
hostname=192.168.4.51 #数据库服务器IP地址
candidate_master=1 #等于1竞选主库
[server2]
hostname=192.168.4.52 #数据库服务器IP地址
candidate_master=1 #等于1竞选主库
[server3]
hostname=192.168.4.53 #数据库服务器IP地址
candidate_master=1 #等于1竞选主库
[server4]
hostname=192.168.4.54
no_master=1 #不竞选主库
[server5]
hostname=192.168.4.55
no_master=1 #不竞选主库
52mysql> grant replication slave on
*.*
to plj@"%"
identified by “123456”53ysql> grant replication slave on
*.*
plj@"%"
identified by “123456”
mysql> select host,user from mysql.user;
±----------±----------+
| host | user |
±----------±----------+
| % | plj |
| % | root |
| localhost | mysql.sys |
| localhost | root |
±----------±----------+
4 rows in set (0.00 sec)
- 51mysql> grant all on
*.*
to root@’%’ identified by “123456”#51主服务器上添加监控用户其它从服务器全部同步
mysql> select host,user from mysql.user;
±----------±----------+
| host | user |
±----------±----------+
| % | root |
| localhost | mysql.sys |
| localhost | root |
±----------±----------+
3 rows in set (0.00 sec)
#拷贝故障切换脚本到指定目录下
#修改第35行的VIP地址
#给执行权限
#添加VIP地址
#测试成功
#测试成功
#动态测试服务状态
#启动管理服务
#写入表数据
#在51的所有从服务器上都可以看到同样的数据
#在51上关闭数据库服务
数据库主从未同步测试时会提示:
MySQL Replication Health is NOT OK!