mysql的安装与部署

目录

一、编码安装mysql 5.7

二、利用php实现mysql的图形化操作

三、mysql 主从复制

            1.异步复制

            2.半同步复制

            3.延迟复制

四、多主模式配置(组复制)

五、mysql 路由器

六、MHA高可用

1.MHA简介

          2.配置实验环境

3.安装并配置MHA

4.手动切换

5.自动切换

6.VIP设定


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也随之转移。

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值