环境准备
准备四台机器
角色 | 虚机IP | 服务类型 | 资源规格 |
manager | 88.4.34.63 | manager | 2C / 4GiB / 200GiB |
master | 88.4.34.60 | node | 4C / 8GiB / 200GiB |
slave | 88.4.34.61 | node | 4C / 8GiB / 200GiB |
slave | 88.4.34.62 | node | 4C / 8GiB / 200GiB |
配置数据库(一台master、两台slave)
1. 在/usr/local/mysql中解压mysql的数据库包( 注:/usr/loacl下无mysql文件夹,自己创建,mkdir -p mysql,数据库tar包自备)
#: tar -xvf mysql-XXX.tar
2. 解压完成后,会生成多个rpm包,需要安装以下rpm包即可
#: yum remove mysql-libs
#: rpm -ivh mysql-community-common-xxx.el7.x86_64.rpm
#: rpm -ivh mysql-community-libs-xxx.el7.x86_64.rpm
#: rpm -ivh mysql-community-client-xxx.el7.x86_64.rpm
#: rpm -ivh mysql-community-server-xxx.el7.x86_64.rpm
#: rpm -ivh mysql-community-devel-xxx.el7.x86_64.rpm
#: rpm -ivh mysql-community-libs-compat-xxx.el7.x86_64.rpm
3. 启动数据库:
#: systemctl start mysqld
#: systemctl enable mysqld
4. 查看状态
#: systemctl status mysqld
5. 查看mysql默认密码
#: cat /var/log/mysqld.log | grep password
查看到密码后,复制默认密码
6. 登录mysql
#: mysql -u root -p
这时,需要将复制的密码粘贴即可进入mysql数据库
7. 修改密码
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('password');
8. 修改安全级别
mysql> set global validate_password_policy=0;//0最低,1中级,2最强验证级别
9. 授权远程登录(MHA必须配置项目)
//root、password即为数据库root角色登陆用户名及密码
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
//授权*(主库授权指定从库)
mysql> grant replication slave on *.* to root@'%' identified by 'password' with grant option;
//刷新权限
mysql> FLUSH PRIVILEGES;
10. 建立数据库fit2cloud、keycloak
根据APP应用中/opt/fit2cloud/bin/mysql中init.sql中的数据库,进入mysql中直接粘贴复制即可。(注:这里APP指的是安装云管的虚机)
11. 修改/etc/my.cnf,新增如下配置
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIO
lower_case_table_names=1
依次将一台master、两台slave均按以上步骤搭建mysql数据库。
数据库主从配置
数据一致化
此处注意,若是新的机器未和云管APP建立联系,也即是数据库中没有数据时,可忽略数据一致化步骤。
#: ssh 88.4.34.60
#: mysql -u root -p
mysql> use fit2cloud
mysql> flush tables with read lock
4. 将主服务器数据库中数据导出(以下命令是退出数据库执行,)
#: mysqldump -u root -p fit2cloud> fit2cloud.sql
#: ssh 88.4.34.61
#: mysql -u root -p
mysql> create database fit2cloud;
mysql> use fit2cloud;
#: source fit2cloud.sql;
#: ssh 88.4.34.62
#: mysql -u root -p
mysql> create database fit2cloud;
mysql> use fit2cloud;
#: source fit2cloud.sql;
注:有多少库就得同步多少库,例如云管的fit2cloud、keycloak都得同步以下,以确保主从数据库数据一致性。
主数据库配置
#: vi /etc/my.cnf
#主数据库端ID号,每个数据库机器的配置文件数据库端ID不同
server_id = 1
#开启二进制日志
log-bin = mysql-bin
#需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可
binlog-do-db = fit2cloud
binlog-do-db = keycloak
#指定slave要复制哪个库
replicate-do-db = fit2cloud
replicate-do-db = keycloak
#以上标红是MHA搭建必须配置的
#将从服务器从主服务器收到的更新记入到从服务器自己的二进制日志文件中
log-slave-updates
#控制binlog的写入频率。每执行多少次事务写入一次(这个参数性能消耗很大,但可减小MySQL崩溃造成的损失)
sync_binlog = 1
#这个参数一般用在主主同步中,用来错开自增值, 防止键值冲突
auto_increment_offset = 1
#这个参数一般用在主主同步中,用来错开自增值, 防止键值冲突
auto_increment_increment = 1
#二进制日志自动删除的天数,默认值为0,表示“没有自动删除”,启动时和二进制日志循环时可能删除
expire_logs_days = 7
#将函数复制到slave
log_bin_trust_function_creators = 1
#: systemctl restart mysqld
记下File 以及 Position 字段的值 ,后续会用到该值
从数据库配置(有几台配几台)
#: vi /etc/my.cnf
#两台slave,所以另一台slave的server_id可以设置为3,类推
server_id = 2
log-bin = mysql-bin
log-slave-updates
sync_binlog = 0
#log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行。该模式下在事务提交的时候,不会主动触发写入磁盘的操作
innodb_flush_log_at_trx_commit = 0
#需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可
binlog-do-db = fit2cloud
binlog-do-db = keycloak
#指定slave要复制哪个库
replicate-do-db = fit2cloud
replicate-do-db = keycloak
#以上标红是MHA搭建必须配置的
#MySQL主从复制的时候,当Master和Slave之间的网络中断,但是Master和Slave无法察觉的情况下(比如防火墙或者路由问题)。Slave会等待slave_net_timeout设置的秒数后,才能认为网络出现故障,然后才会重连并且追赶这段时间主库的数据
slave-net-timeout = 60
expire_logs_days = 7
log_bin_trust_function_creators = 1
#: systemctl restart mysql
mysql> change master to master_host='88.4.34.60',master_user='root',master_password='password',master_log_file='mysql-bin.000001',master_log_pos=1062; (最后两个参数的值同主服务器状态中的File及Position值)
mysql> start slave ;(若是报错则先reset slave,再执行同步命令,再start slave即可)
Slave_IO_Running及Slave_SQL_Running进程必须正常运行,即Yes状态,否则说明同步失败
到此,主从配置完成。
安装包准备
https://github.com/yoshinorim/mha4mysql-manager/releases/tag/v0.58
https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58
注:下面依赖包中也有这两个包。
https://pan.baidu.com/s/1ZmUIOK1BReEQ6-s5eBnapQ 提取码:43z1
配置node
在三台机器(一台master,两台slave)上统一配置如下rpm包,安装步骤必须按以下顺序来:
#: rpm -ivh /mnt/Packages/perl-Net-Daemon-0.48-5.el7.noarch.rpm
#: rpm -ivh /mnt/Packages/perl-PlRPC-0.2020-14.el7.noarch.rpm
#: rpm -ivh /mnt/Packages/perl-DBI-1.627-4.el7.x86_64.rpm
#: rpm -ivh /mnt/Packages/perl-DBD-MySQL-4.023-6.el7.x86_64.rpm(前提是必须安装rpm -ivh mysql-community-libs-compat-5.7.26-1.el7.x86_64.rpm)
#: rpm -ivh /opt/mha_node/mha4mysql-node-0.58-0.el7.centos.noarch.rpm(node包)
除了mha4mysql-node-0.58-0.el7.centos.noarch.rpm包是node包以外,其他rpm包均是node包所需依赖包。
配置manager
在manager机器上配置如下rpm包,安装步骤必须按以下顺序来:
#: rpm -ivh /mnt/Packages/perl-Net-Daemon-0.48-5.el7.noarch.rpm
#: rpm -ivh /mnt/Packages/perl-PlRPC-0.2020-14.el7.noarch.rpm
#: rpm -ivh /mnt/Packages/perl-DBI-1.627-4.el7.x86_64.rpm
#: rpm -ivh /mnt/Packages/perl-DBD-MySQL-4.023-6.el7.x86_64.rpm(前提是必须安装rpm -ivh mysql-community-libs-compat-5.7.26-1.el7.x86_64.rpm)
#: rpm -ivh /opt/mha_node/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
#: rpm -ivh /opt/mha_manager/perl-Config-Tiny-2.14-7.el7.noarch.rpm
#: rpm -ivh /mnt/Packages/perl-Module-Runtime-0.013-4.el7.noarch.rpm
#: rpm -ivh /mnt/Packages/perl-Try-Tiny-0.12-2.el7.noarch.rpm
#: rpm -ivh /mnt/Packages/perl-Module-Implementation-0.06-6.el7.noarch.rpm
#: rpm -ivh /mnt/Packages/perl-Params-Validate-1.08-4.el7.x86_64.rpm
#: rpm -ivh /opt/mha_manager/perl-Log-Dispatch-2.41-1.of.el7.noarch.rpm
#: rpm -ivh /opt/mha_manager/perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
#: rpm -ivh /mnt/Packages/perl-Params-Util-1.07-6.el7.x86_64.rpm
#: rpm -ivh /mnt/Packages/perl-Sub-Install-0.926-6.el7.noarch.rpm
#: rpm -ivh /mnt/Packages/perl-Data-OptList-0.107-9.el7.noarch.rpm
#: rpm -ivh /mnt/Packages/perl-List-MoreUtils-0.33-9.el7.x86_64.rpm
#: rpm -ivh /mnt/Packages/perl-Package-DeprecationManager-0.13-7.el7.noarch.rpm
#: rpm -ivh /mnt/Packages/perl-Package-Stash-XS-0.26-3.el7.x86_64.rpm
#: rpm -ivh /mnt/Packages/perl-Package-Stash-0.34-2.el7.noarch.rpm
#: rpm -ivh /opt/mha_manager/perl-Class-Load-0.20-3.el7.noarch.rpm
#: rpm -ivh /opt/mha_manager/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm(manager包)
除了mha4mysql-manager-0.58-0.el7.centos.noarch.rpm包是manager包以外,其他rpm包均是manager包所需依赖包。
另外推荐各版本依赖包下载网址:
https://centos.pkgs.org/7/openfusion-x86_64/perl-Log-Dispatch-2.41-1.of.el7.noarch.rpm.html
注:若机器提供yum源也可直接yum源下载安装以上依赖包,或者通过光盘亦可。
免登陆验证
#: ssh-keygen
步骤:回车、回车、回车。结果如下:
使用ssh-copy-id将秘钥拷贝到各个机器上,包括当前(自己)机器,每个机器器都要拷贝三次 我这里拿mah服务举例。上述生成秘钥的是manager机器如下,则需如下配置:
#: ssh-copy-id -i /root/.ssh/id_rsa.pub -p 22 root@88.4.34.60
#: ssh-copy-id -i /root/.ssh/id_rsa.pub -p 22 root@88.4.34.61
#: ssh-copy-id -i /root/.ssh/id_rsa.pub -p 22 root@88.4.34.62
另外三台node机器也如上配置,将自己的秘钥拷贝到其他机器上。
配置MHA
集群中各个机器建立一个mha工作目录,这里是四台(配置文件需要用)
#: mkdir -p /opt/mysql_mha/
#: mkdir -p /opt/mhaconfig/
创建mysql_mha.cnf文件,并放置/opt/mhaconfig中,内容如下:
[server default]
#用户,这里我们用的是数据库root角色,也可自己创建角色
user=root
password=password
#工作目录
manager_workdir=/opt/mysql_mha
manager_log=/opt/mysql_mha/manager.log
remote_workdir=/opt/mysql_mha
#SSH
ssh_user=root
#复制用户
repl_user=root
repl_password=password
ping_interval=1
#binlog地址
master_binlog_dir=/var/lib/mysql
[server1]
hostname=88.4.34.60
#表示可成为主库
candidate_master=1
[server2]
hostname=88.4.34.61
#表示不可成为主库
no_master=1
[server3]
hostname=88.4.34.62
candidate_master=1
MHA检查
#: masterha_check_ssh --conf=/opt/mhaconfig/mysql_mha.cnf
如上图所示即为成功。
#: masterha_check_repl --conf=/opt/mhaconfig/mysql_mha.cnf
如上图所示即为成功。
3. 后台启动
#: nohup masterha_manager -conf=/opt/mhaconfig/mysql_mha.cnf &> /opt/mysql_mha/log/manager.log &
4. 查看状态
#: masterha_check_status --conf=/opt/mhaconfig/mysql_mha.cnf
这里的master我经过故障演示,所以转为62那台了,本身应为60那台。
故障演示
- 模拟主库故障
可直接关闭主库的mysql服务来模拟故障。
#: systemctl stop mysqld
2. 开启manager机器实施MHA日志
关闭主库的mysql服务之前操作。
#: tail -f /opt/mysql_mha/manager.log
随即可看到相关log日志打印,例如这里便会提示60机器down掉,并且62机器成为master,成为主库。这里日志较多,只展示new master和report部分。(提示:下面展示的是62机器down,60机器转为master,原因是我之前转过60机器了,不用纠结)
日志如上述所示即为集群master自动转换,到这就是模拟故障成功了。
故障恢复
如上述所示60机器数据库停止服务后,master转为62机器,那么后面故障机器60恢复了,重新集群。
1. 模拟故障修复
#: systemctl start mysqld
2. 获取新master的file和position
#: grep -i "change master to" /opt/mysql_mha/manager.log | tail -1
如下图所示:
3. 恢复机器执行同步命令
mysql> change master to master_host='88.4.34.62',master_user='root',master_password='password',master_log_file='mysql-bin.000008',master_log_pos=154; (最后两个参数的值同主服务器状态中的File及Position值)
mysql> start slave;
mysql> show slave status \G;
如上图所示即同步成功。
4. 重复MHA检查流程
按照MHA检查流程走一遍即可,可省略第一步ssh检查。
IP漂移
待定。