数据库MHA部署 一、MHA搭建
(一)四台机器ssh互通
1、在四台服务器上分别执行下面命令,生成公钥和私钥
ssh-keygen -t rsa
cat /root/.ssh/id_rsa.pub
生成的密钥查看
2、在三台MySQL服务器分别执行下面命令,密码输入系统密码,将公钥拷到MHA Manager服务器上
ssh-copy-id 192.168.13.101(mha服务器ip)
备注: 以在MHA Manager服务器上检查下,看.ssh/authorized_keys文件是否包含3个公钥
3、将MHA Manager的公钥添加到authorized_keys文件中(此时应该包含4个公钥)
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
4、MHA Manager服务器执行下面命令,向其他三台MySQL服务器分发公钥信息。
1 2 3 scp /root/.ssh/authorized_keys root@master01:/root/.ssh/authorized_keys scp /root/.ssh/authorized_keys root@slave:/root/.ssh/authorized_keys scp /root/.ssh/authorized_keys root@back:/root/.ssh/authorized_keys
提示【authorized_keys】表示成功,有错误的话会提示具体的报错信息
5、测试四台服务器之间ssh是否配置成功
可以MHA Manager执行下面命令,检测下与三台MySQL是否实现ssh互通
可以正常登陆就表示ssh通了
(二)下载node和manager
上传到相应的服务器
三台MySQL服务器需要安装node
MHA Manager服务器需要安装manager和node
(三)MHA node安装
所有节点都需要安装
下载epel源
\#wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
MHA的Node依赖于perl-DBD-MySQL,所以要先安装perl-DBD-MySQL。
\#yum install perl-DBD-MySQL -y
\#rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
(四)MHA manager安装
MHA的manager又依赖了perl-Config-Tiny、perl-Log-Dispatch、perl-Parallel-ForkManager,也分别进行安装。
1 2 3 # yum install perl-Config-Tiny # yum install perl-Log-Dispatch # yum install perl-Parallel-ForkManager
安装manager
(五)MHA 配置
MHA Manager服务器需要为每个监控的 Master/Slave 集群供一个专用的配置文件,而所有的Master/Slave 集群也可 共享全局配置。
1、初始化配置目录
1 2 3 4 5 6 7 # 目录说明 # /var/log (CentOS目录) # /mha (MHA监控根目录) # /app1 (MHA监控实例根目录) # /manager.log (MHA监控实例日志文件) mkdir -p /var/log/mha/app1 touch /var/log/mha/app1/manager.log
2、在主库创建mha用户
1 2 3 # create user 'mha' @'%' identified by 'mha123' ; # ALTER USER 'mha' @'%' IDENTIFIED WITH mysql_native_password BY 'mha123' ; # flush privileges;
3、配置监控全局配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # vim /etc/masterha_default.cnf [server default] user=mha password=mha123 port=3306 # ssh登录账号 ssh_user=root # 从库复制账号和密码 repl_user=root repl_password=123 port=3306 # ping次数 ping_interval=1 # 二次检查的主机 secondary_check_script=masterha_secondary_check -s 192.168.13.102 -s 192.168.13.103 -s 192.168.13.104 # 一主两从三个库的ip
4、配置监控实例配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 # mkdir -p /etc/mha# vim /etc/mha/app1.cnf app1.cnf配置如下: [server default] user=mha password=mha123 # repl_user=slave repl_password=123 # ssh_user=root # manager_workdir=/var/log/mha/app1 # manager_log=/var/log/mha/app1/manager.log # # # # # [server1] # hostname=master01 hostname=192.168.13.102 port= 3306 candidate_master=1 master_binlog_dir="/data/mysql" # [server2] # hostname=slave hostname=192.168.13.103 port =3307 candidate_master=1 master_binlog_dir="/data/mysql" # [server3] # hostname=back hostname=192.168.13.104 port= 3308 candidate_master=1 master_binlog_dir="/data/mysql"
(六)MHA 配置检测
1、执行ssh通信检测
在MHA Manager服务器上执行:
#masterha_check_ssh --conf=/etc/mha/app1.cnf
2、检测MySQL主从复制
在MHA Manager服务器上执行:
#masterha_check_repl --conf=/etc/mha/app1.cnf
3、MHA Manager启动
\#nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf -- ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
查看监控日志命令如下:
tail -f /var/log/mha/app1/manager.log
测试 二、数据库主从搭建
mysql安装位置:/software/mysql
数据库文件数据位置:/data/mysql
1、在根目录下创建文件夹software和数据库数据文件/data/mysql
#mkdir /software/
#mkdir -p /data/mysql
2、上传mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz文件到/software下或直接下载
1 2 3 4 5 wget https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.19-linux-glibc2.12- x86_64.tar.xz # cd /software/# xz -d mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz # tar -xvf mysql-8.0.19-linux-glibc2.12-x86_64.tar
3、更改解压缩后的文件夹名称
#mv /software/mysql-8.0.19-linux-glibc2.12-x86_64/ /software/mysql
4、创建mysql用户组和mysql用户
#groupadd mysql
#useradd -r -g mysql mysql
5、关联myql用户到mysql用户组中
1 2 3 4 5 # chown -R mysql:mysql /software/mysql/# chown -R mysql:mysql /data/mysql/# chown -R mysql /software/mysql/# chown -R mysql /data/mysql
6、更改mysql安装文件夹mysql/的权限
#chmod -R 755 /software/mysql/
7、安装libaio依赖包,系统自带的有这个依赖包所以不需要安装,不过自带的依赖包会报错查询是否暗转libaio依赖 包
\#yum install libaio
8、初始化mysql命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # cd /software/mysql/bin初始化 ./mysqld --user=mysql --basedir=/software/mysql --datadir=/data/mysql --initialize 环境变量 # echo "export PATH=$PATH :/software/mysql/bin" >> /etc/profile安全连接 # /software/mysql/bin/mysql_ssl_rsa_setup --datadir=/data/mysql/ # source /etc/profile# 在执行上面命令时特别要注意一行内容 [Note] A temporary password is generated for root@localhost: o*s#gqh)F4Ck root@localhost: 后面跟的是mysql数据库登录的临时密码,各人安装生成的临时密码不一样 如果初始化时报错如下: error while loading shared libraries: libnuma.so.1: cannot open shared objec 是因为libnuma安装的是32位,我们这里需要64位的,执行下面语句就可以解决 # yum install numactl.x86_64 执行完后重新初始化mysql命令 ln -s /software/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog 做软链
9、启动mysql服务
1 2 3 4 5 # sh /software/mysql/support-files/mysql.server start 上面启动mysql服务命令是会报错的,因为没有修改mysql的配置文件,报错内容大致如下: ./support-files/mysql.server: line 239: my_print_defaults: command not found ./support-files/mysql.server: line 259: cd: /usr/local/mysql: No such file or directory Starting MySQL ERROR! Couldn't find MySQL server (/usr/local/mysql/bin/mysqld_safe)
10、修改Mysql配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 # vim /software/mysql/support-files/mysql.server 修改前 if test -z "$basedir" then basedir=/usr/local/mysql bindir=/usr/local/mysql/bin if test -z "$datadir" then datadir=/usr/local/mysql/data fi sbindir=/usr/local/mysql/bin libexecdir=/usr/local/mysql/bin else bindir="$basedir/bin" if test -z "$datadir" then datadir="$basedir/data" fi sbindir="$basedir/sbin" libexecdir="$basedir/libexec" fi 修改后 if test -z "$basedir" then basedir=/software/mysql bindir=/software/mysql/bin if test -z "$datadir" then datadir=/data/mysql fi sbindir=/software/mysql/bin libexecdir=/software/mysql/bin else bindir="$basedir/bin" if test -z "$datadir" then datadir="$basedir/data" fi sbindir="$basedir/sbin" libexecdir="$basedir/libexec" fi 保存退出 # cp /software/mysql/support-files/mysql.server /etc/init.d/mysqld# chmod 755 /etc/init.d/mysqld
11、修改my.cnf文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 # vi /etc/my.cnf [client] socket =/software/mysql/mysql.sock # pipe # socket=0.0 port=3306 [mysql] # 原文的utf8指向UTF8MB3,后续版本要改为UTF8MB4,一步到位吧 default-character-set=UTF8MB4 [mysqld] basedir=/software/mysql datadir=/data/mysql port=3306 relay-log=/data/mysql/relaylog log-bin=/data/mysql/binlog pid-file=/software/mysql/mysqld.pid # skip-grant-tables skip-name-resolve socket = /software/mysql/mysql.sock character-set-server=utf8 default-storage-engine=INNODB explicit_defaults_for_timestamp = true # Server Id. server-id=1 #(从库更改id) max_connections=2000 relay_log_purge=0 # query_cache_size在8.0版本已经移除,故注释 # query_cache_size=0 table_open_cache=2000 tmp_table_size=246M thread_cache_size=300 # 限定用于每个数据库线程的栈大小。默认设置足以满足大多数应用 thread_stack = 192k key_buffer_size=512M read_buffer_size=4M read_rnd_buffer_size=32M innodb_data_home_dir = /data/mysql innodb_flush_log_at_trx_commit=0 innodb_log_buffer_size=16M innodb_buffer_pool_size=256M innodb_log_file_size=128M innodb_thread_concurrency=128 innodb_autoextend_increment=1000 innodb_buffer_pool_instances=8 innodb_concurrency_tickets=5000 innodb_old_blocks_time=1000 innodb_open_files=300 innodb_stats_on_metadata=0 innodb_file_per_table=1 innodb_checksum_algorithm=0 back_log=80 flush_time=0 join_buffer_size=128M max_allowed_packet=1024M max_connect_errors=2000 open_files_limit=4161 # query_cache_type在8.0版本已经移除,故注释 # query_cache_type=0 sort_buffer_size=32M table_definition_cache=1400 binlog_row_event_max_size=8K sync_master_info=10000 sync_relay_log=10000 sync_relay_log_info=10000 # 批量插入数据缓存大小,可以有效提高插入效率,默认为8M bulk_insert_buffer_size = 64M interactive_timeout = 120 wait_timeout = 120 log-bin-trust-function-creators=1 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES binlog-ignore-db=performance_schema binlog-ignore-db=information_schema binlog-ignore-db=sys binlog-do-db=lagou # # !includedir /etc/my.cnf.d # rm -f auto.cnf# rsync -av /data/mysql/ slave:/data/mysql/ # rsync -av /data/mysql/ back:/data/mysql/ ④ 更改密码,配置slave同步master数据 service mysqld start #启动数据库 mysql -u root -p #进入数据库 > set password='123' ; > CREATE USER 'slave' @'%' identified by '123' ; master端创建授权用户 > GRANT REPLICATION SLAVE ON *.* TO `slave`@`%`; > GRANT REPLICATION SLAVE ON *.* TO `mha`@`%`; > ALTER USER 'slave' @'%' IDENTIFIED WITH mysql_native_password BY '123' ; > flush privileges; > flush tables with read lock; 先加锁,防止两边数据不一致 > show master status; 查看当前数据库的二进制日志写到什么位置(只有打开二进制日志,这句命令才有结果)
slave上配置同步信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 > change master to master_host='192.168.13.102' , master_user='slave' , master_password='123', master_port=3815, master_log_file='binlog.000012', master_log_pos=1218; 说明: master_host master的IP master_user 复制的用户 master_password 复制用户密码 master_port master的端口号 master_log_file master正在写的二进制文件名,锁表后查看的 master_log_pos master正在写的二进制位置 启动复制线程,开始同步 > start slave; show slave status\G; Slave_IO_Running: Yes 代表成功连接到master并且下载日志 Slave_SQL_Running: Yes 代表成功执行日志中的SQL语句
master上解锁
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
1 2 3 4 5 /sbin/ifconfig ens33:1 192.168.13.199 broadcast 192.168.13.255 netmask 255.255.255.0 /sbin/arping -f -q -c 5 -w 5 -I ens33 -s 192.168.13.100 -U192.168.13.102 secondary_check_script=masterha_secondary_check -s 192.168.13.102 -s 192.168.13.103 -s 192.168.13.104 # 一 主两从三个库的ip