文章联动:
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';
注: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
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倒是不需要执行
修改下master_ip_online_change脚本,搜索FIXME_xxx_drop_app_user,注释掉这行(大概是152行)
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
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已显示关闭
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