文章联动:

Mysql5.7 MHA安装规范

https://blog.51cto.com/u_13482808/5984811

keepalived(VIP)作为MySQL主从高可用架构时的一些建议

https://blog.51cto.com/u_13482808/7410750


1 概述

本手册描述了在LINUX(RHEL 7)操作系统下以二进制编译包方式安装MySQL5.7数据库软件的操作过程。如无明确文字说明,均使用操作系统root用户执行命令。

1.1 文档目的

本手册为在LINUX操作系统环境下安装MySQL数据库提供指导和参考,本文大致会提到Mysql单机版、主从版、高可用版本(MHA),可根据实际情况选择需要对应版本搭建。

1.2 适用范围

本手册适用于在Centos 7环境下安装并创建MySQL 5.7数据库。

1.3 使用对象

本手册的使用对象为安装MySQL数据库的开发、测试、运维及相关人员。

2 安装环境

2.1 版本说明

操作系统版本

Centos 7.6

数据库版本

MySQL5.7

注:实际安装当中,Centos系统以大版本7为准

2.2 安装介质

MySQL安装介质从官方网站(https://dev.mysql.com/downloads/mysql/)下载,Percona安装介质从官方网站(https://www.percona.com/downloads)下载。

安装介质

类型

说明

mysql-5.7.39-el7-x86_64.tar.gz

数据库

尽量选择稳定版本

2.3 系统依赖包

安装MySQL数据库前,操作系统需要安装以下依赖包,检查是否已安装(rpm -qa|grep 包名,例如 libaio-0.3.109-13.el7.x86_64,输入 rpm -qa|grep libaio),如没有安装,请联系系统管理员安装。

#标红具体版本根据实际情况来,也可以用yum命令一次性安装
libaio-0.3.109-13.el7.x86_64
libaio-devel-0.3.109-13.el7.x86_64
lvm2-2.02.187-6.el7_9.5.x86_64
perl-DBI.x86_64
perl-DBD-MySQL.x86_64
perl-IO-Socket-SSL.noarch
perl-Digest-MD5.x86_64
perl-TermReadKey.x86_64
libev-4.15-7.el7.x86_64

yum install -y libaio libaio-devel lvm2 perl-DBI perl-DBD-MySQL \
  perl-IO-Socket-SSL perl-Digest-MD5 perl-TermReadKey libev

2.4 目录规划

软件安装目录的挂载点、文件系统以及大小规划如下表所示(以下目录权限都为mysql:mysql):

目录规划

大小

说明

/data/app

>2G

MySQL软件安装目录

/data/data/mysql/16330

需根据具体数据量规划

MySQL数据存放目录(这里以端口命名一个路径)

/data/log/mysql/16330

需根据具体数据量规划

MySQL的日志存放目录,其中binlog大约50-100G空间大小,根据日志的保留策略决定(这里以端口命名一个路径)

/backup/mysql/16330

建议数据库数据的2倍空间大小

MySQL备份文件存放目录(这里以端口命名一个路径)(可选)

2.5 用户与组规划

根据规划配置用户与组信息:

MySQL数据库服务器用户和组



组名称

备注


mysql



用户名称

用户目录

mysql

mysql

/home/mysql

3 准备工作

3.1 服务器准备

这里根据实际架构选择,这里按照最大的高可用版本(MHA)处理,本文内会提到服务列表如下,由于服务器资源不足,这里将其中一台备库作为MHA安装机

服务IP

角色

备注

10.100.14.40

Master

10.100.14.182

CandicateMaster

主备

10.100.14.243

Slave、Manager

MHA安装机,数据备机

3.1 检查操作系统是否预装MySQL

如果Centos操作系统按照服务器标准安装,默认会自带安装MySQL软件,首先检查是否已装有MySQL,如果系统检测到已经安装了rpm版本的MySQL,则按照步骤手工进行删除。

rpm -qa|grep mysql

#删除系统默认安装mysql

3.2 创建mysql用户和mysql组

groupadd mysql
useradd -g mysql mysql

3.3 修改mysql资源限制

使用vi编辑/etc/security/limits.conf文件在文件末尾增加以下内容并保存退出。

vi /etc/security/limits.conf

mysql soft nproc 65535
mysql hard nproc 65535
mysql soft nofile 65535
mysql hard nofile 65535
mysql soft stack 65535
mysql hard stack 65535

3.4 配置环境变量

使用vi编辑/etc/profile文件,在文件末尾添加以下内容并保存退出。

vi /etc/profile

PATH=$PATH:/data/app/mysql5.7/bin

刷新环境变量信息。

source /etc/profile

4 安装MySQL数据库

4.1 安装MySQL软件

创建安装目录,解压MySQL软件包至安装目录下(提前将Mysql安装包放到/data/app目录下),解压完毕后修改该目录的权限。

mkdir -p /data/app
mkdir -p /data/conf/mysql
mkdir -p /data/data/mysql/16330
mkdir -p /data/log/mysql/16330/{binlog,relaylog}

#这里的备份目录根据实际情况调整
mkdir -p /backup/mysql/16330

#这里将安装报上传至/data/app目录下
cd /data/app
tar -zxvf mysql-5.7.39-el7-x86_64.tar.gz
ln -s mysql-5.7.39-el7-x86_64 mysql5.7

chown mysql:mysql -R /data/app/mysql5.7 /data/app/mysql-5.7.39-el7-x86_64
chown mysql:mysql -R /data/conf/mysql
chown mysql:mysql -R /data/data/mysql/16330
chown mysql:mysql -R /data/log/mysql/16330

4.2 配置MySQL参数文件

拷贝并修改以下配置文件至系统/data/conf/mysql目录下,如果只是单机环境,只需要主库配置就可以
主库:

#主库配置
#16330.my.cnf

[client]
default-character-set=utf8mb4
port=16330
socket=/data/data/mysql/16330/mysql.sock

[mysql]
no-beep
prompt="\u@ \R:\m:\s [\d]> "
##开启命令补全##
auto-rehash
default-character-set=utf8mb4


[mysqld]
##server-id根据实际情况调整,建议用ip后两段##
server-id=1440
port=16330
user=mysql
bind_address=0.0.0.0

basedir=/data/app/mysql5.7
datadir=/data/data/mysql/16330
socket=/data/data/mysql/16330/mysql.sock
pid-file=/data/data/mysql/16330/mysql.pid
character-set-server=utf8mb4
##防止编码不同写入##
skip-character-set-client-handshake=1
autocommit=1
lower_case_table_names=1
max_connections=800
max_connect_errors=1000
default-storage-engine=INNODB
transaction_isolation=READ-COMMITTED
explicit_defaults_for_timestamp=1
sort_buffer_size=32M
join_buffer_size=128M
tmp_table_size=72M
max_allowed_packet=16M
sql_mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"
interactive_timeout=1800
wait_timeout=1800
read_buffer_size=16M
read_rnd_buffer_size=32M

query_cache_type=1
query_cache_size=1M
table_open_cache=2000
##1G * 8计算线程缓存数##
thread_cache_size=128
myisam_max_sort_file_size=10G
myisam_sort_buffer_size=135M
key_buffer_size=32M
read_buffer_size=8M
read_rnd_buffer_size=4M

back_log=1024
open_files_limit=65536
table_definition_cache=1400

##日志相关配置##
log-output=FILE
##SQL记录是否开启,仅在调试时可开启##
general_log = 0
general_log_file=/data/log/mysql/16330/mysql-general.err
slow_query_log = ON
slow_query_log_file=/data/log/mysql/16330/mysql-query.err
long_query_time=10
log-error=/data/log/mysql/16330/mysql-error.err

log_queries_not_using_indexes=1
log_slow_admin_statements=1
log_slow_slave_statements=1
log_throttle_queries_not_using_indexes=10
expire_logs_days=14
min_examined_row_limit=100

log_bin=/data/log/mysql/16330/binlog/mysql-binlog
log_bin_index=/data/log/mysql/16330/binlog/mysql-binlog.index
binlog_format=row
binlog_rows_query_log_events=on

skip_name_resolve=on
innodb_support_xa=1
binlog_cache_size=1M
max_binlog_size=2048M
log_bin_trust_function_creators=1
innodb_flush_log_at_trx_commit=1
sync_binlog=1

gtid_mode=on
enforce-gtid-consistency=true
log-slave-updates=1
binlog_gtid_simple_recovery=1

########innodb settings########
# 根据您的服务器IOPS能力适当调整
# 一般配普通SSD盘的话,可以调整到 10000 - 20000
# 配置高端PCIe SSD卡的话,则可以调整的更高,比如 50000 - 80000
# SAS/SATA:200 SAS*12 raid10:2000 ssd:5000 fusion-io:50000
innodb_io_capacity=200
innodb_io_capacity_max=400
##缓存大小设置,根据服务器实际配置情况调整##
innodb_buffer_pool_size=4G
##根据CPU核心数设置pool_instances##
innodb_buffer_pool_instances=8
innodb_buffer_pool_load_at_startup=1
innodb_buffer_pool_dump_at_shutdown=1
innodb_lru_scan_depth=2000
innodb_lock_wait_timeout=5

innodb_log_file_size=200M
innodb_log_files_in_group=2 
innodb_log_buffer_size=16M

innodb_undo_logs=128
innodb_undo_tablespaces=3
innodb_undo_log_truncate=1
innodb_max_undo_log_size=2G

innodb_flush_neighbors=1
innodb_purge_threads=4
innodb_large_prefix=1
innodb_thread_concurrency=64
innodb_print_all_deadlocks=1
innodb_strict_mode=1
innodb_sort_buffer_size=64M
innodb_flush_log_at_trx_commit=1
innodb_autoextend_increment=64
innodb_concurrency_tickets=5000
innodb_old_blocks_time=1000
innodb_open_files=65536
innodb_stats_on_metadata=0
innodb_file_per_table=1
innodb_data_file_path=ibdata1:200M;ibdata2:200M;ibdata3:200M:autoextend:max:5G
innodb_temp_data_file_path=ibtmp1:200M:autoextend:max:20G

innodb_buffer_pool_dump_pct=40
innodb_page_cleaners=4
innodb_purge_rseg_truncate_frequency=128
binlog_gtid_simple_recovery=1
log_timestamps=system
show_compatibility_56=on

#从库相关配置,主库设置了也没有关系
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log=/data/log/mysql/16330/relaylog/mysql-relay.log
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=4
relay_log_recovery=1
slave_skip_errors=ddl_exist_errors
slave_preserve_commit_order=1

备库:
#主库配置唯一区别是server-id,id必须大于主库
#生产建议备库>=2(如果是MHA情况下),1个做为主备切换使用(MHA框架下使用),1个作为实时备库

#备库配置
#16330.my.cnf

[client]
default-character-set=utf8mb4
port=16330
socket=/data/data/mysql/16330/mysql.sock

[mysql]
no-beep
prompt="\u@ \R:\m:\s [\d]> "
##开启命令补全##
auto-rehash
default-character-set=utf8mb4


[mysqld]
##server-id根据实际情况调整,建议用ip后两段##
server-id=14243
port=16330
user=mysql
bind_address=0.0.0.0

basedir=/data/app/mysql5.7
datadir=/data/data/mysql/16330
socket=/data/data/mysql/16330/mysql.sock
pid-file=/data/data/mysql/16330/mysql.pid
character-set-server=utf8mb4
##防止编码不同写入##
skip-character-set-client-handshake=1
autocommit=1
lower_case_table_names=1
max_connections=800
max_connect_errors=1000
default-storage-engine=INNODB
transaction_isolation=READ-COMMITTED
explicit_defaults_for_timestamp=1
sort_buffer_size=32M
join_buffer_size=128M
tmp_table_size=72M
max_allowed_packet=16M
sql_mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"
interactive_timeout=1800
wait_timeout=1800
read_buffer_size=16M
read_rnd_buffer_size=32M

query_cache_type=1
query_cache_size=1M
table_open_cache=2000
##1G * 8计算线程缓存数##
thread_cache_size=128
myisam_max_sort_file_size=10G
myisam_sort_buffer_size=135M
key_buffer_size=32M
read_buffer_size=8M
read_rnd_buffer_size=4M

back_log=1024
open_files_limit=65536
table_definition_cache=1400

##日志相关配置##
log-output=FILE
##SQL记录是否开启,仅在调试时可开启##
general_log = 0
general_log_file=/data/log/mysql/16330/mysql-general.err
slow_query_log = ON
slow_query_log_file=/data/log/mysql/16330/mysql-query.err
long_query_time=10
log-error=/data/log/mysql/16330/mysql-error.err

log_queries_not_using_indexes=1
log_slow_admin_statements=1
log_slow_slave_statements=1
log_throttle_queries_not_using_indexes=10
expire_logs_days=14
min_examined_row_limit=100

log_bin=/data/log/mysql/16330/binlog/mysql-binlog
log_bin_index=/data/log/mysql/16330/binlog/mysql-binlog.index
binlog_format=row
binlog_rows_query_log_events=on

skip_name_resolve=on
innodb_support_xa=1
binlog_cache_size=1M
max_binlog_size=2048M
log_bin_trust_function_creators=1
innodb_flush_log_at_trx_commit=1
sync_binlog=1

gtid_mode=on
enforce-gtid-consistency=true
log-slave-updates=1
binlog_gtid_simple_recovery=1

########innodb settings########
# 根据您的服务器IOPS能力适当调整
# 一般配普通SSD盘的话,可以调整到 10000 - 20000
# 配置高端PCIe SSD卡的话,则可以调整的更高,比如 50000 - 80000
# SAS/SATA:200 SAS*12 raid10:2000 ssd:5000 fusion-io:50000
innodb_io_capacity=200
innodb_io_capacity_max=400
##缓存大小设置,根据服务器实际配置情况调整##
innodb_buffer_pool_size=4G
##根据CPU核心数设置pool_instances##
innodb_buffer_pool_instances=8
innodb_buffer_pool_load_at_startup=1
innodb_buffer_pool_dump_at_shutdown=1
innodb_lru_scan_depth=2000
innodb_lock_wait_timeout=5

innodb_log_file_size=200M
innodb_log_files_in_group=2 
innodb_log_buffer_size=16M

innodb_undo_logs=128
innodb_undo_tablespaces=3
innodb_undo_log_truncate=1
innodb_max_undo_log_size=2G

innodb_flush_neighbors=1
innodb_purge_threads=4
innodb_large_prefix=1
innodb_thread_concurrency=64
innodb_print_all_deadlocks=1
innodb_strict_mode=1
innodb_sort_buffer_size=64M
innodb_flush_log_at_trx_commit=1
innodb_autoextend_increment=64
innodb_concurrency_tickets=5000
innodb_old_blocks_time=1000
innodb_open_files=65536
innodb_stats_on_metadata=0
innodb_file_per_table=1
innodb_data_file_path=ibdata1:200M;ibdata2:200M;ibdata3:200M:autoextend:max:5G
innodb_temp_data_file_path=ibtmp1:200M:autoextend:max:20G

innodb_buffer_pool_dump_pct=40
innodb_page_cleaners=4
innodb_purge_rseg_truncate_frequency=128
binlog_gtid_simple_recovery=1
log_timestamps=system
show_compatibility_56=on

#从库相关配置,主库设置了也没有关系
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log=/data/log/mysql/16330/relaylog/mysql-relay.log
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=4
relay_log_recovery=1
slave_skip_errors=ddl_exist_errors
slave_preserve_commit_order=1

#备库配置只读
read_only=1

下表为my.cnf配置文件模板中各参数解释说明:

参数

建议值

说明

server_id

不与其他实例重复

MySQL数据库标识符,建议为IP地址的数值形式(如:)

basedir

/data/app/mysql5.7

MySQL软件安装目录

datadir

/data/data/mysql/16330

MySQL数据文件目录

socket

/data/data/mysql/16330/mysql.sock

MySQL socket文件

port

16330

MySQL端口号,默认3306

log-bin

mysql-bin

二进制日志及其文件命名格式

binlog_format

row

设置二进制日志格式

relay-log

mysql-relay

复制下的回放日志文件命名

log-slave-updates

1

将从库sql线程的操作记录到自己的二进制文件中

skip_slave_start

1

再启动mysql时不自动启动slave线程

skip-name-resolve

1

禁止域名解析

replicate_wild_ignore_table

mysql.backup_%

从库忽略主库对这些表的操作

max_allowed_packet

1M

MySQL服务器和客户端之间的任何单个消息的大小的上限

read_only

0

数据库只读,一般从库开启(对具有supper权限的用户无效)

default_storage_engine

InnoDB

默认存储引擎

character_set_server

utf8mb4

服务器默认字符集

skip-external-locking

1

跳过外部锁定

innodb_strict_mode

1

开启严格模式

innodb_buffer_pool_size

内存的65%-75%

数据库占用内存的最大值,多实例情况下,总量不能超过内存的80%,过大会导致系统不稳定

innodb_stats_on_metadata

0

开启时会对INFORMATION_SCHEMA中的一些表进行查询操作,以方便索引统计信息,一般关闭

innodb_file_format

Barracuda

文件格式使用新InnoDB表

innodb_flush_method

O_DIRECT

定义用于将数据刷新到InnoDB数据文件和日志文件的方法

innodb_log_files_in_group

2

Log_file组数

innodb_log_file_size

2G

单个log_file大小

innodb_log_buffer_size

64M

InnoDB 用于写入磁盘上日志文件 的缓冲区大小

innodb_file_per_table

1

开启时,InnoDB存储每个新创建的表数据和索引在一个单独的 .ibd 文件,而不是在系统表空间

innodb_max_dirty_pages_pct

60

脏页占用buffer_pool_size多的最大百分比

innodb_io_capacity

400

后台任务执行的I / O活动的上限

innodb_data_file_path

ibdata1:1G:autoextend

单个InnoDB 数据文件及其大小的路径

key_buffer_size

32M

MyISAM表的索引块的缓冲区的大小

tmp_table_size

32M

内部内存临时表的最大大小

max_heap_table_size

32M

设置用户创建的MEMORY表允许增长的最大大小

table_open_cache

1024

所有线程的打开表数

query_cache_type

0

查询缓存。

0:不缓存;



1:缓存所有看可以缓存的结果;



2:只缓存使用SELECT SQL_CACHE。的语句



query_cache_size

0

分配用于缓存查询结果的内存量

max_connections

1000

客户端同时连接的最大允许数量

thread_cache_size

1024

服务器缓存线程数

open_files_limit

65535

操作系统允许mysqld打开的文件数

log_error

mysql-error.log

错误日志的位置

slow_query_log

1

是否启用慢查询,1为开启

slow_query_log_file

mysql-slow.log

慢查询日志文件的名称

replicate-ignore-table

mysql.ibbackup_binlog_marker

从库SQL线程不复制更新指定表的任何语句

slave-skip-errors

ddl_exist_errors

默认情况下,从库发生错误时会停止复制线程,除非包含所列出的这些值; ddl_exist_errors,相当于错误代码列表 1007,1008,1050,1051,1054,1060,1061,1068,1094,1146。

sync_binlog

1

如果此变量的值大于0,则mysql服务器在将二进制日志写入后将其同步到磁盘

max_binlog_size

250M

二进制文件最大文件大小

relay-log-info-repository

TABLE

中继文件记录格式

relay_log_recovery

1

数据库启动后立即启用中继日志恢复

master_info_repository

TABLE

从库记录主库状态及连接信息的格式

gtid-mode

ON

是否启用GTID

enforce-gtid-consistency

1

启用后,通过只执行可以以事务形式完成的语句来保障GTID的一致性

4.3 初始化MySQL数据库

执行下列命令完成数据库初始化:

mysqld --defaults-file=/data/conf/mysql/16330.my.cnf --initialize --user=mysql \
--basedir=/data/app/mysql/16330 --datadir=/data/data/mysql/16330

#查看初始密码,这里自个记录下
MYSQL_INITPASS=`grep 'temporary password' /data/log/mysql/16330/mysql-error.err | awk '{print $NF}' | tail -n 1`
echo $MYSQL_INITPASS

5 启动与安全性检查

5.1 配置数据库启动脚本

使用vi编辑/etc/systemd/system/mysql@.service文件在增加以下内容并保存退出。

vi /etc/systemd/system/mysql@.service

#文件内容如下
[Unit]
Description=MySQL Server
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
PartOf=mysql.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
Type=forking
RuntimeDirectory=mysql
RuntimeDirectoryMode=755
PIDFile=/data/data/mysql/%i/mysql.pid
# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0

# Start main service
ExecStart=/data/app/mysql5.7/bin/mysqld --defaults-file=/data/conf/mysql/%i.my.cnf --daemonize --pid-file=/data/data/mysql/%i/mysql.pid

# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/%i.mysql

LimitNOFILE=65535
Restart=on-failure
RestartPreventExitStatus=1
PrivateTmp=false

使用vi编辑/etc/systemd/system/mysql.target 文件在增加以下内容并保存退出。

vi /etc/systemd/system/mysql.target

[Unit]
Description=mysql target allowing to start/stop all mysql@.service instances at once

最后记得重载下启用配置

systemctl daemon-reload

5.2 启动数据库并初始root密码

启动数据库,主从机都需要执行

systemctl start mysql@16330.service

#检查启动是否正常,如有异常根据报错处理
systemctl status mysql@16330.service

#这里做下sock映射,根据实际需求增加
ln -s /data/data/mysql/16330/mysql.sock /tmp/mysql.sock

#修改mysql密码
mysql -uroot -p${MYSQL_INITPASS}
mysql> alter user root@localhost identified by 'mysql@root@16330';

Mysql5.7 MHA安装规范_keepalived


注:Mysql并不建议自动启动,尤其是生产,不要做自启,容易造成异常重启后数据无法恢复情况

5.3 主从创建

如果只是单机环境,可直接忽略本步骤,从机只需要之上前面修改初始密码即可,不用继续往下执行

#登陆主执行以下操作

#这里输入登陆密码
mysql -uroot -p

mysql> create user 'repuser'@'%' identified by 'mysql@repuser@16330';
mysql> grant replication slave on *.* to 'repuser'@'%';
mysql> flush privileges;

#从机执行
mysql> change master to master_host='10.100.14.40',master_port=16330,
master_user='repuser',master_password='mysql@repuser@16330',master_auto_positinotallow=1;
mysql> start slave;

#主从继续执行,检查主从状态,检查Slave_IO_Running、Slave_SQL_Running是否为Yes
mysql> show slave status \G

如果执行失败,从机执行回滚

#停止slave进程
mysql> stop slave;
mysql> reset master;

5.4 运维数据库及用户创建

登录MySQL创建数据及运维用户,根据需要建立(建议),注意这些只能在主上执行。

#回车后输入密码
#这里创建一个dba管理账号,一个只读账号
mysql -uroot -p

mysql> create user `dbadm`@'%' identified by 'mysql@dbadm@16330';
mysql> grant all privileges on `*`.`*` to `dbadm`@`localhost` with grant option;
mysql> grant all privileges on *.* to 'dbadm'@"%";

mysql> create user `readonly`@`%` identified by 'mysql@readonly@16330';
mysql> grant select on *.* to 'readonly'@"%";
mysql> grant process on *.* to 'readonly'@"%";

mysql> flush privileges;

注:不要给到root能够异机登陆权限,尤其是主备,备机上面!不然容易造成误登陆操作,导致主从异常。

5.6 核心参数配置验证

登录MySQL数据库验证核心参数配置正确

|

mysql>show variables like 'sync_binlog%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog | 1 |
+---------------+-------+
mysql>show variables like 'innodb_flush_log_at_trx_commit';
+--------------------------------+-------+
| Variable_name | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1 |
+--------------------------------+-------+
mysql>show variables like '%info_repository';
+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| master_info_repository | TABLE |
| relay_log_info_repository | TABLE |
+---------------------------+-------+
mysql>show variables like 'lower_case_table_names';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_table_names | 1 |
+------------------------+-------+
mysql>show variables like 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |

6 Keepalived和VIP

为保障主自动切换这里需要用到VIP,这里使用Keepalived做到

6.1 Keepalived安装

在主和主备上执行

yum -y install keepalived

6.2 配置Keepalived

俩个配置是差不多的,只有mcast_src_ip、priority不一样

#主Keepalive配置,原始内容直接删除就行
#vi /etc/keepalived/keepalived.conf

vrrp_script chk_mysql_port {
    script "/data/conf/keepalive/chk_port.sh 16330"
    interval 2
    weight -5
    fall 2
    rise 1
}

vrrp_instance VI_1 {
    state BACKUP
    nopreempt
    interface ens192
    mcast_src_ip 10.100.14.40
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass Aa123456
    }
    virtual_ipaddress {
        10.100.14.199
    }
    track_script {
        chk_mysql_port
    }
}

#主备Keepalive配置,原始内容直接删除就行
#vi /etc/keepalived/keepalived.conf

vrrp_script chk_mysql_port {
    script "/data/conf/keepalive/chk_port.sh 16330"
    interval 2
    weight -5
    fall 2
    rise 1
}

vrrp_instance VI_1 {
    state BACKUP
    nopreempt
    interface ens192
    mcast_src_ip 10.100.14.182
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass Aa123456
    }
    virtual_ipaddress {
        10.100.14.199
    }
    track_script {
        chk_mysql_port
    }
}

注:
interval:检查间隔,单位秒
fall:连续检查次数失败才判定为有问题
rise:连续检查次数成功判断为成功,但不会触发修改优先级
state:两个都设置为BACKUP,这样防止VIP切回
nopreempt:非抢占模式
interface:主机网卡
mcast_src_ip:主机IP地址
virtual_router_id:虚拟id,两台机器都必须一样
priority:主库需要大于备机
virtual_ipaddress:虚拟ip,根据实际需求修改

6.3 创建所需目录

mkdir -p /data/conf/keepalive

6.4 增加端口检查脚本

#vi /data/conf/keepalive/chk_port.sh

#!/bin/bash

port=$1
count=`netstat -antl4|awk 'NR>2{print}'|grep LISTEN|awk '{print $4}'|grep ":${port}"|wc -l`

if [ "${count}" -eq 0 ];then
    systemctl stop keepalived.service
fi

6.5 启动Keepalive并自启

systemctl enable keepalived.service
systemctl start keepalived.service

#检查启动
systemctl status keepalived.service

#检查VIP,这个时候应该只有一台机器上存在VIP
ip addr

Mysql5.7 MHA安装规范_MySQL_02

7 MHA安装

7.1 安装包下载

下载版本为0.58,文件下载好放到/data/app目录下

#总共需要下载两个包,manager包只需要在控制机上安装
https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

#这里额外下载一个包,需要用到包内的脚本
https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz

7.2 服务器免密

三台服务器创建root用户SSH免密(这里不做多介绍),生产上面使用建议mha单独创建系统用户(Manager可以这样),其余所有node节点都需要是root用户。

7.3 创建所需目录和文件

mkdir -p /data/conf/mha_master/scripts
mkdir -p /data/log/mha_master/work

#控制节点执行创建出supervisor日志目录
mkdir -p /data/log/supervisor

#创建本次管理所需目录和文件
mkdir -p /data/log/mha_master/work/10.100.14.40—16330

touch /data/log/mha_master/10.100.14.40—16330.log

7.4 安装包安装

cd /data/app
#被管理mysql和控制机都需要安装
yum install -y mha4mysql-node-0.58-0.el7.centos.noarch.rpm

#控制机安装
yum install -y mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

#这里将mha4mysql-manager-0.58.tar.gz解压,将脚本文件复制到/data/conf/mha_master/scripts下
#这里只需要控制机这样操作
tar -zxvf mha4mysql-manager-0.58.tar.gz
cp /data/app/mha4mysql-manager-0.58/samples/scripts/* /data/conf/mha_master/scripts/

#这里额外装下supervisor,方便管理mha,只需要在控制机上操作
yum -y install supervisor

7.5 配置半同步

所有数据库都需要执行

#回车后输入密码
mysql -uroot -p

#检查是否支持动态库载入
mysql> show variables like '%have_dynamic%';

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

#查看半同步状态
mysql> show variables like '%rpl_semi_sync%';

7.6 创建mha用户

主库执行

#回车后输入密码
mysql -uroot -p

mysql> grant all privileges on *.* to mha@'%' identified by 'mysql@mha@16330';
mysql> flush privileges;

7.7 配置mha server

这里配置文件命名方面建议根据IP+端口来

vi /data/conf/mha_master/10.100.14.40—16330.cnf

[server default]
# MHA管理账号
user=mha
password=mysql@mha@16330
# mysql同步账号
repl_user=repuser
repl_password=mysql@repuser@16330
# 免密登录的账户
ssh_user=root

# 检查间隔
ping_interval=2
master_binlog_dir=/data/log/mysql/16330/binlog

manager_workdir=/data/log/mha_master/work/10.100.14.40—16330
manager_log=/data/log/mha_master/10.100.14.40—16330.log
master_ip_failover_script=/data/conf/mha_master/scripts/master_ip_failover
master_ip_online_change_script=/data/conf/mha_master/scripts/master_ip_online_change
report_script=/data/conf/mha_master/scripts/send_report
remote_workdir=/tmp
secondary_check_script=/usr/bin/masterha_secondary_check -s 10.100.14.40 -s 10.100.14.182 -s 10.100.14.243
shutdown_script=""

[server1]
hostname=10.100.14.40
port=16330

[server2]
hostname=10.100.14.182
port=16330
candidate_master=1
check_repl_delay=0

[server3]
hostname=10.100.14.243
port=16330
no_master=1

7.8 修改脚本

这里需要修改下master_ip_failover脚本,搜索FIXME_xxx,将这一行(大概是93行)注释掉

#如果不是数据库某台服务器上安装mha倒是不需要执行

Mysql5.7 MHA安装规范_perl_03

修改下master_ip_online_change脚本,搜索FIXME_xxx_drop_app_user,注释掉这行(大概是152行)

Mysql5.7 MHA安装规范_MHA_04

7.9 验证mha连接情况

masterha_check_ssh -cnotallow=/data/conf/mha_master/10.100.14.40—16330.cnf
masterha_check_repl -cnotallow=/data/conf/mha_master/10.100.14.40—16330.cnf

7.10 增加本次mah supervisor配置

vi /etc/supervisord.d/mha-10.100.14.40—16330.ini

[program:mha_10_100_14_40_16330]
process_name=%(program_name)s
command=masterha_manager --cnotallow=/data/conf/mha_master/10.100.14.40—16330.cnf
autostart=true
autorestart=false
user=root
numprocs=1
redirect_stderr=true
stdout_logfile=/data/log/supervisor/mha-10.100.14.40—16330.log

7.11 启动supervisor并设置自启

systemctl enable supervisord.service
systemctl start supervisord.service

#查看启动状态
systemctl status supervisord.service

#查看程序启动状态
supervisorctl status

Mysql5.7 MHA安装规范_perl_05

8 测试验证

8.1 主备切换测试

1)关闭主库10.100.14.40

#10.100.14.40上执行

systemctl stop mysql@16330.service

2)查看mha manager状态和VIP状态

大约就10秒内就会切换完成,这个时候mha manager会进程挂掉,这个时候是立马启动不了的。

VIP已经飘逸到另外一台服务器上,原有主Keepalive已显示关闭

Mysql5.7 MHA安装规范_MySQL_06


Mysql5.7 MHA安装规范_perl_07


Mysql5.7 MHA安装规范_MHA_08


Mysql5.7 MHA安装规范_MHA_09

3)重启原主服务器
需要注意,如果生产还需要从现主上面拉取数据恢复到原主服务器上

#在10.100.14.40上执行

systemctl restart mysql@16330.service

4)重新加回主从

#在10.100.14.40上执行

#登陆密码输入
mysql -uroot -p

mysql> reset master;
mysql> change master to master_host='10.100.14.182',master_port=16330,
master_user='repuser',master_password='mysql@repuser@16330',master_auto_position=1;
mysql> start slave;

#检查状态
mysql> show slave status \G

5)重启mha manager

#manager机上执行

cd /data/log/mha_master/work/10.100.14.40—16330
rm -f 10.100.14.40—16330.failover.complete

supervisorctl start mha_10_100_14_40_16330

6)重启原主Keepalive

systemctl restart keepalived.service

7)最后检查
这个时候VIP应该是不会飘逸过来的,如果回到原主上面估计Keepalive配置的时候原主配置了MASTER,需要改成BACKUP

9 日常运行维护

9.1 数据库相关操作

#查看启动状态
systemctl status mysql@16330.service

#启动数据库
systemctl start mysql@16330.service

#重启数据库
systemctl restart mysql@16330.service

#关停数据库
systemctl stop mysql@16330.service

9.2 mha查看状态

需要在mha manager启动状态下

masterha_check_status -conf=/data/conf/mha_master/10.100.14.40—16330.cnf

9.3 手动切换mha主

需要在mha manager关闭状态下,并且mha work目录下需要为空

masterha_master_switch --conf=/data/conf/mha_master/10.100.14.40—16330.cnf   \
  --master_state=alive --new_master_host=10.100.14.182 \
  --new_master_port=16330 --orig_master_is_new_slave

9.4 mha manager相关操作

#启动mha manager
supervisorctl start mha_10_100_14_40_16330

#关停mha manager
supervisorctl start mha_10_100_14_40_16330

#重启mha manager
supervisorctl restart mha_10_100_14_40_16330

#查看mha manager状态
supervisorctl status mha_10_100_14_40_16330

9.6 Keepalive相关操作

#查看keepalive状态
systemctl status keepalived.service

#启动keepalive
systemctl start keepalived.service

#停止keepalive
systemctl start keepalived.service

#重启keepalive
systemctl restart keepalived.service