目录
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
一、编码安装mysql 5.7
1.下载安装包
下载mysql 5.7的编码安装包(可以在官网下载),并解压
2.安装编译所需要的环境
yum install -y cmake
yum install -y ncurses-devel
yum install -y gcc-c++
yum install -y bison
3.编译安装
cd /root/mysql-5.7.31
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DSYSCONFDIR=/etc -DENABLED_LOCAL_INFILE=1 -DWITH_EXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_BOOST=/root/mysql-5.7.31/boost/boost_1_59_0
make ##时间较长
make install
4.更改配置文件、建立数据目录、建立mysql用户、复制启动脚本
vim /etc/my.cnf ##编辑主配置文件
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
collation-server=utf8mb4_general_ci
[mysqld_safe]
log-error=/data/mysql/mariadb.log
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
mkdir -p /data/mysql
useradd -M -d /data/mysql/ -s /sbin/nologin mysql
chown mysql.mysql /data/mysql ##更改权限
5.复制启动脚本、设置全局变量
cp /root/mysql-5.7.31/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
cd
vim .bash_profile
PATH=$PATH:$HOME/bin:/usr/local/php/bin/:/usr/local/mysql/bin/
source .bash_profile
6.mysql初始化、开启mysql、更改root用户的密码
mysqld --initialize --user=mysql ##初始化
/etc/init.d/mysqld start ##启动
mysql_secure_installation
初始化后会随机给root一个密码
启动数据后更改密码
更改完毕后即可用自己设置的密码登陆
二、利用php实现mysql的图形化操作
先在官万下载phpMyAdmin的压缩包
unzip phpMyAdmin-5.0.2-all-languages.zip ##解压
cp -r phpMyAdmin-5.0.2-all-languages /usr/local/nginx/html/phpmyadmin ##复制到nginx的默认发目录
vim /usr/local/php/etc/php.ini ##编辑php-fpm的配置文件
[Pdo_mysql]
; Default socket name for local MySQL connects. If empty, uses the built-in
; MySQL defaults.
pdo_mysql.default_socket=/data/mysql/mysql.sock ##添加mysql路径
; Default socket name for local MySQL connects. If empty, uses the built-in
; MySQL defaults.
; http://php.net/mysqli.default-socket
mysqli.default_socket = /data/mysql/mysql.sock ##添加mysql路径
nginx ##开启nginx,须确保nginx可php,并且默认发文件是index.php
systemctl enable --now php-fpm.service ##开启php-fpm,并设置开机自启
用浏览器访问172.25.0.1/phpmyadmin即可管理数据库 :
三、mysql 主从复制
配置一下所要用的实验环境,给server2和server3也都安装mysql
在server1中,将mysql所需要的文件给server2和server3都复制一遍:
scp -r /usr/local/mysql server2:/usr/local/
scp /etc/my.cnf server2:/etc/
scp /etc/init.d/mysqld server2:/etc/init.d/
scp -r /usr/local/mysql server3:/usr/local/
scp /etc/my.cnf server3:/etc/
scp /etc/init.d/mysqld server3:/etc/init.d/
在server2和server3中,准备启动mysql :
mkdir -p /data/mysql
useradd -M -d /data/mysql -s /sbin/nologin mysql
chown mysql.mysql /data/mysql/
vim .bash_profile
PATH=$PATH:$HOME/bin:/usr/local/mysql/bin
source .bash_profile
mysqld --initialize --user=mysql
/etc/init.d/mysqld start
mysql_secure_installation
1.异步复制
1)使用二进制日志文件位置进行异步复制
a.我们先来实现server2复制server1的数据。即server1是主,server2是从
server1中:
vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
collation-server=utf8mb4_general_ci
log-bin=mysql-bin ##启用二进制日志记录
server-id=1 ##复制拓扑中的每个服务器都必须配置一个唯一的服务器ID,用于标识复制拓扑中的各个服务器
/etc/init.d/mysqld restart ##重启服务
mysql -pwestos
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'westos'; ##创建一个单独的用户,供server2连接使用
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; ##授权
mysql> SHOW MASTER STATUS; ##确定当前的二进制日志文件名和位置
如果server1上已经建立了数据库、表或者写入了数据。那么server2上也需要先存在这些东西,这是因为二进制文件里记录的是执行的动作,从机来复制这些动作。从机里没有被操作的东西,那就无法执行动作。如果server1的mysql是全新的话,则可以直接继续设置server2。
server2中:
vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
collation-server=utf8mb4_general_ci
server-id=2
/etc/init.d/mysqld restart
mysql -pwestos
mysql> CHANGE MASTER TO
-> MASTER_HOST='172.25.0.1',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='westos',
-> MASTER_LOG_FILE='mysql-bin.000001', ##二进制文件名
-> MASTER_LOG_POS=595; ##二进制文件位置
mysql> start slave; ##开启复制线程slave
show slave status\G; ##查看slave日志
查看slave日志,两项为yes,则设置成功
b.实现server2复制server1后,再实现server3复制server2。让server2作为一个节点
server2中:
vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
collation-server=utf8mb4_general_ci
log-bin=mysql-bin
server-id=2
log_slave_updates=ON
/etc/init.d/mysqld restart
mysql -pwestos
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'westos';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
mysql> SHOW MASTER STATUS;
server3中:
vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
collation-server=utf8mb4_general_ci
server_id=3
/etc/init.d/mysqld restart
mysql -pwestos
mysql> CHANGE MASTER TO
-> MASTER_HOST='172.25.0.2',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='westos',
-> MASTER_LOG_FILE='mysql-bin.000001',
-> MASTER_LOG_POS=595;
mysql> start slave;
mysql> show slave status\G;
查看server2和server3的slave日志
server2:
server3:
2)使用 GTID 事务进行异步复制
使用GTID的复制不需要处理日志文件或这些文件中的位置,这大大简化了许多常见的复制任务。
在server1、server2和server3的/etc/my.cnf 中添加以下参数,并重启服务;并修改从机的复制策略。
server1中:
vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
collation-server=utf8mb4_general_ci
log-bin=mysql-bin
server-id=1
gtid_mode=ON ##启用 GTID 模式来启动每个服务器
enforce-gtid-consistency=ON
/etc/init.d/mysqld restart
server2中:
vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
collation-server=utf8mb4_general_ci
log-bin=mysql-bin
server-id=2
log_slave_updates=ON
gtid_mode=ON ##启用 GTID 模式来启动每个服务器
enforce-gtid-consistency=ON
/etc/init.d/mysqld restart
mysql -pwestos
mysql> stop slave;
mysql> CHANGE MASTER TO
-> MASTER_HOST = '172.25.0.1',
-> MASTER_USER = 'repl',
-> MASTER_PASSWORD = 'westos',
-> MASTER_AUTO_POSITION = 1; ##使用gtid
mysql> start slave;
mysql> show slave status\G;
server3中:
vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
collation-server=utf8mb4_general_ci
server_id=3
gtid_mode=ON ##启用 GTID 模式来启动每个服务器
enforce-gtid-consistency=ON
/etc/init.d/mysqld restart
mysql -pwestos
mysql> stop slave;
mysql> CHANGE MASTER TO
-> MASTER_HOST = '172.25.0.1',
-> MASTER_USER = 'repl',
-> MASTER_PASSWORD = 'westos',
-> MASTER_AUTO_POSITION = 1;
mysql> start slave;
mysql> show slave status\G;
2.半同步复制
在异步复制已设置完成的前提下,继续配置半同步复制。半同步复制是使用插件实现的,所以插件必须安装到服务器才能使用。
master:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; ##安装插件
SET GLOBAL rpl_semi_sync_master_enabled =1; ##启用插件
show status like 'Rpl_semi%'; ##查看插件状态
slave:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; ##安装插件
SET GLOBAL rpl_semi_sync_slave_enabled = 1; ##启动插件
STOP SLAVE IO_THREAD; ##重启IO线程
START SLAVE IO_THREAD;
show status like 'Rpl_semi%'; ##查看插件状态
server2从server1,server3从server1,所以server2既是master也是slave。
server1:
server2:
server3:
3.延迟复制
延迟复制可以设置副本服务器故意落后于源至少指定的时间
STOP SLAVE SQL_THREAD;
CHANGE MASTER TO MASTER_DELAY=60; ##延迟60秒
START SLAVE SQL_THREAD;
四、多主模式配置(组复制)
我们以server1、server2和server3为例,演示部署组复制(一个组最少3个成员,最多9个成员)。因为在前面做了一些mysql的实验,所以需要停止服务,并清空数据目录,再进行部署。
server1:
/etc/init.d/mysqld stop
rm -fr /data/mysql/*
vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
collation-server=utf8mb4_general_ci
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
plugin_load_add='group_replication.so' ##将 Group Replication 插件添加到服务器在启动时加载的插件列表中
transaction_write_set_extraction=XXHASH64
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" ##告诉插件它正在加入或创建的组名为“aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa”
group_replication_start_on_boot=off ##插件在服务器启动时不自动启动操作
group_replication_local_address= "server1:33061" ##成员用于与组中其他成员进行内部通信的网络地址和端口
group_replication_group_seeds= "server1:33061,server2:33061,server3:33061" ##组成员的主机名和端口
group_replication_bootstrap_group=off
保存退出
mysqld --initialize-insecure --user=mysql ##初始化,root不设置密码
/etc/init.d/mysqld start
mysql
mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password'; ##用户凭证
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery'; ##使用复制通道的给定凭据
mysql> SET GLOBAL group_replication_bootstrap_group=ON; ##引导启动组,引导程序只能由一个服务器完成
mysql> START GROUP_REPLICATION; ##开启
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
mysql> SELECT * FROM performance_schema.replication_group_members; ##查看组成员
注意:引导程序只由一台服务器完成即可,这里server1引导了,所以接下来的server2和server3就不需要这一步了。
server2:
/etc/init.d/mysqld stop
rm -fr /data/mysql/*
vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
collation-server=utf8mb4_general_ci
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
server_id=2
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
plugin_load_add='group_replication.so' ##将 Group Replication 插件添加到服务器在启动时加载的插件列表中
transaction_write_set_extraction=XXHASH64
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" ##告诉插件它正在加入或创建的组名为“aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa”
group_replication_start_on_boot=off ##插件在服务器启动时不自动启动操作
group_replication_local_address= "server2:33061" ##成员用于与组中其他成员进行内部通信的网络地址和端口
group_replication_group_seeds= "server1:33061,server2:33061,server3:33061" ##组成员的主机名和端口
group_replication_bootstrap_group=off
保存退出
mysqld --initialize-insecure --user=mysql
/etc/init.d/mysqld start
mysql
mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password'; ##用户凭证
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery'; ##使用复制通道的给定凭据
mysql> START GROUP_REPLICATION; ##开启
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
mysql> SELECT * FROM performance_schema.replication_group_members; ##查看组成员
server3:
/etc/init.d/mysqld stop
rm -fr /data/mysql/*
vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
collation-server=utf8mb4_general_ci
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
server_id=3
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
plugin_load_add='group_replication.so' ##将 Group Replication 插件添加到服务器在启动时加载的插件列表中
transaction_write_set_extraction=XXHASH64
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" ##告诉插件它正在加入或创建的组名为“aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa”
group_replication_start_on_boot=off ##插件在服务器启动时不自动启动操作
group_replication_local_address= "server3:33061" ##成员用于与组中其他成员进行内部通信的网络地址和端口
group_replication_group_seeds= "server1:33061,server2:33061,server3:33061" ##组成员的主机名和端口
group_replication_bootstrap_group=off
保存退出
mysqld --initialize-insecure --user=mysql
/etc/init.d/mysqld start
mysql
mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password'; ##用户凭证
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery'; ##使用复制通道的给定凭据
mysql> START GROUP_REPLICATION; ##开启
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
mysql> SELECT * FROM performance_schema.replication_group_members; ##查看组成员
五、mysql 路由器
MySQL Router 是轻量级中间件,可在应用程序和任何后端 MySQL 服务器之间提供透明路由。它可用于各种用例,例如通过有效地将数据库流量路由到适当的后端 MySQL 服务器来提供高可用性和可扩展性。可插拔架构还使开发人员能够为自定义用例扩展 MySQL 路由器。
我们在server4上安装MySQL Router,让server4作为一个路由。它连接着3台后端服务器,分别是:server1、server2和server3。
server4:
rpm -ivh mysql-router-community-8.0.21-1.el7.x86_64.rpm
vim /etc/mysqlrouter/mysqlrouter.conf
[routing:ro]
bind_address = 0.0.0.0
bind_port = 7001
destinations = 172.25.0.1:3306,172.25.0.2:3306,172.25.0.3:3306
routing_strategy = round-robin
[routing:rw]
bind_address = 0.0.0.0
bind_port = 7002
destinations = 172.25.0.1:3306,172.25.0.2:3306,172.25.0.3:3306
routing_strategy = first-available
保存退出
systemctl start mysqlrouter.service
server4上MySQL Router已开启
路由列表中的server1、server2和server3是组复制模式
测试效果:
先在server1授权一个用户
mysql> grant all on *.* to 'wy'@'%' identified by 'westos'; ##因为server123三台主机是组复制,所以都会执行
用server5通过7001端口(读)访问路由,每次访问到的都是不同的主机
[root@server5 ~]# mysql -h 172.25.0.4 -P 7001 -uwy -pwestos -e "select @@hostname;"
用server5通过7002端口(写)访问路由,访问的总是第一个
[root@server5 ~]# mysql -h 172.25.0.4 -P 7002 -uwy -pwestos -e "select @@hostname;"
把server1关闭再访问,访问的是第二个主机
六、MHA高可用
1.MHA简介
MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
MHA里有两个角色一个是MHA Node(数据节点)另一个是MHA Manager(管理节点)。 MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台
MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。
在MHA自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失,但这并不总是可行的。例如,如果主服务器硬件故障或无法通过ssh访问,MHA没法保存二进制日志,只进行故障转移而丢失了最新的数据。使用MySQL 5.5的半同步复制,可以大大降低数据丢失的风险。MHA可以与半同步复制结合起来。如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性。
2.配置实验环境
目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当slave,所以至少需要三台服务器。
上个实验我们将server123设置为组复制,现在需要将三台主机设置为一主两从,server1为master。为了方便可以使用GTID。
server1:
/etc/init.d/mysqld stop
rm -fr /data/mysql/*
vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
collation-server=utf8mb4_general_ci
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
mysqld --initialize --user=mysql
/etc/init.d/mysqld start
mysql_secure_installation
mysql -pwestos
mysql> grant replication slave on *.* to repl@'%' identified by 'westos';
server2:
/etc/init.d/mysqld stop
rm -fr /data/mysql/*
vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
collation-server=utf8mb4_general_ci
server_id=2
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
mysqld --initialize --user=mysql
/etc/init.d/mysqld start
mysql_secure_installation
mysql -pwestos
mysql> change master to master_host='172.25.0.1',master_user='repl',master_password='westos',master_auto_position=1;
mysql> start slave;
mysql> show slave status\G;
server3中的操作与server2全部一致,除了 my.cnf 中的server_id要改成3。
3.安装并配置MHA
将server5作为Manager,先下载MHA的所有所需资源,并安装所需的软件
编辑高可用的配置文件
mkdir /etc/masterha
vim /etc/masterha/app1.conf
[server default]
manager_workdir=/etc/masterha ##manager工作目录
manager_log=/etc/masterha/mha.log ##manager日志文件
master_binlog_dir=/date/mysql ##mysql主服务器的binlog目录
#master_ip_failover_script=/etc/masterha/master_ip_failover ##failover自动切换脚本
#master_ip_online_change_script= /usr/local/bin/master_ip_online_change ##手动切换脚本
user=root ##mysql主从节点的管理员用户密码,确保可以从远程登陆
password=westos
ping_interval=3 ##发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行failover
remote_workdir=/tmp ##远端mysql在发生切换时binlog的保存位置
repl_user=repl ##主从复制用户密码
repl_password=westos
secondary_check_script=/usr/bin/masterha_secondary_check -s 172.25.0.2 -s 172.25.0.3
ssh_user=root ##ssh用户名
[server1]
hostname=172.25.0.1
port=3306
#candidate_master=1
#check_repl_delay=0
[server2]
hostname=172.25.0.2
port=3306
candidate_master=1 ##指定failover时此slave会接管master,即使数据不是最新的
check_repl_delay=0
[server3]
hostname=172.25.0.3
port=3306
no_master=1 ##始终是slave
将node 的安装包传给server123,并安装
server5:
cd /root/MHA-7/
scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server1:/root/
scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server2:/root/
scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server3:/root/
server123:
yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y
因为server5作为manager,对其他三台主机的操作是通过ssh来实现的,所以这四台机器都需要互相进行免密认证
ssh-keygen ##生成密钥
ssh-copy-id server1
ssh-copy-id server2
ssh-copy-id server3
scp -r .ssh/ server1:
scp -r .ssh/ server2:
scp -r .ssh/ server3:
给root设置远程登陆的密码
mysql -pwestos
mysql> grant all on *.* to root@'%' identified by 'westos';
mysql> flush privileges;
再server5检测ssh和主从情况
masterha_check_ssh --conf=/etc/masterha/app1.conf ##检测ssh
masterha_check_repl --conf=/etc/masterha/app1.conf ##检测主从是否正常
两项无误则设置完成
4.手动切换
当前master是server1
在server5中进行手动切换
masterha_master_switch --conf=/etc/masterha/app1.conf --master_state=alive --new_master_host=172.25.7.2 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000
再次查看主从,master变为server2
将master切换为server1
现在由恢复为master是server1,slave是server2和server3。当server1宕掉时,手动切换备用机server2为master
masterha_master_switch --master_state=dead --conf=/etc/masterha/app1.conf --dead_master_host=172.25.0.1 --dead_master_port=3306 --new_master_host=172.25.0.2 --new_master_port=3306 --ignore_last_failover
切换成功。现在重启server1,server1不会是slave,更不会是master,所以需要重新输入策略
5.自动切换
在server5中开启自动切换
masterha_manager --conf=/etc/masterha/app1.conf & ##开启自动切换,并打入后台
当前master为server2,slave为server1和server3。此时,直接宕掉server2,则会自动切换master
master以自动切换成立server1。
进行了一次自动切换后,/etc/masterha/下会自动生成两个文件:app1.failover.complete、mha.log。app1.failover.complete是锁定文件,自动切换时会先查看有没有锁定文件,如果有则不切换。如果需要自动切换,需要先把这俩文件删除。或者使用手动切换,加上–ignore_last_failover参数,跳过查看锁定文件。
6.VIP设定
当MySQL的master节点发生更换时,它的主机ip也是会改变的,但是对于外部访问来说,这样的改变用户是不知道的,所以就会导致无法正常访问从而破坏用户的体验感。对于这种情况,我们可以设置vip来保证不管内部的MySQL服务服务器如何变化,外部访问都没有变化。
设定vip需要两个脚本:master_ip_failover、master_ip_online_change。可以在mha4mysql-manager-0.58.tar.gz 这个压缩包里找到,并把他们复制到/etc/masterha/下。
编辑 master_ip_failover ,添加参数,注释掉98行(设备的名称要正确)
vim master_ip_failover
my $vip = '172.25.0.100/24'; ##设置的vip的ip
my $ssh_start_vip = "/sbin/ip addr add $vip dev eth0"; ##添加vip的方法
my $ssh_stop_vip = "/sbin/ip addr del $vip dev eth0"; ##删除vip的方法
#FIXME_xxx;
编辑 master_ip_online_change ,添加参数
vim master_ip_online_change
my $vip = '172.25.0.100/24';
my $ssh_start_vip = "/sbin/ip addr add $vip dev eth0";
my $ssh_stop_vip = "/sbin/ip addr del $vip dev eth0";
my $exit_code = 0;
编辑配置文件,删掉脚本那两行的注释。(要保证两个脚本的路径正确)
检测主从配置是否健康:
masterha_check_repl --conf=/etc/masterha/app1.conf
配置完毕
使用vip:
现在,master是server1,slave是server2和server3。
在server1上添加vip
ip addr add 172.25.0.100/24 dev eth0
在server5上开启自动切换(先删除标记文件)
宕掉server1上的服务,master自动切换为备用机server2,vip也随之转移。