MHA非root用户搭建测试
最近一直在瞎搬砖,最大的感触是运维工作难做。不过废话不多说,最近被分配了一项比较有意思的task,尝试着非root用户搭建MHA并测试下能否成功漂移,以下是两天测试和文档编写的成果,分享给各位看客,欢迎交流学习。
测试的目的:
现行的主流搭建MHA使用的用户是root来传递公钥以及进行一些切换、摘除、添加VIP的工作,但root用户的权限过大,在生产上存在安全漏洞的风险,可以尝试使用一个普通的用户以较小的权限角色实现MHA的各项功能。
测试的环境:
1、两台CentOS服务器,iptables关闭,配置为8核8G内存,系统CentOS release 6.8 (Final)。服务器IP三个分别是172.16.3.190/22、172.16.3.189/22以及VIP:172.16.3.123/22
2、数据库实例两台,版本保持一致为5.7.18-log MySQL Community Server (GPL)。
测试的步骤:
1、配置MHA复制集(master-slave-manager),GTID+Semi-Sync+并行复制
2、安装MHA及基本环境配置
3、MHA健康检查
4、MHA切换测试(手动+自动)
测试摘要:
1、传递公钥的用户都需要设置密码且与MySQL用户要同一组
2、传递公钥的用户要有sudo权限且能通过某一端口进行文件的传递
3、传递公钥的用户要有摘除、添加VIP的权限,且在线切换的脚本要更改root为传递公钥的用户
4、MHA的配置文件、目录的属主属组要更改为传递公钥的用户而不是root用户
测试的具体搭建过程:
一、配置MHA复制集
1、MHA各角色和IP划分
MHA-Master:172.16.3.190/22,VIP:172.16.3.123/22
MHA-Backup:172.16.3.189/22
MHA-Manager:172.16.3.189/22
2、MHA的GTID+Semi-Sync +Slave-parallel
搭建复制集的过程省略,需要注意的问题是master必须确保所有的slave都能连接,包括切换后新主与旧主之间的同步连接。
GRANT SUPER, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'172.16.%.%' identified by ‘repl’;
2.1、GTID参数配置
gtid_mode=on //开启GTID,否则就是普通的复制类型
enforce_gtid_consistency=true //强制GTID的一致性
log_slave_updates=true //slave更新是否记录日志
master_info_repository=table //将日志存储为表形式,更加安全,防止日志信息破损
relay_log_info_repository=table //将日志存储为表形式,更加安全,防止日志信息破损
2.2、Semi-Sync配置
1、在MHA的master上安装半同步插件并开启半同步功能
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
mysql> set global rpl_semi_sync_master_enabled=on ;
.2、在MHA的slave或者manager节点上安装插件并开启slave的半同步
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
mysql> set global rpl_semi_sync_slave_enabled=on ;
3、Slave-paralle配置
在MySQL实例的配置文件中都添加slave_parallel_workers=N,此处根据机器的配置使用了4个应用线程
二、安装MHA及基本环境配置
1、在所有的节点上安装node数据包,在manager节点上安装manager数据包
2、编辑/etc/hosts文件,添加如下几行内容,指定各机器在MHA的角色。
#mha config
172.16.3.190 mha_master
172.16.3.189 mha_backup
172.16.3.189 mha_manager
3、给传递公钥、配置SSH登录使用的端口,编辑SSH服务的server端、client端的配置文件,分别是/etc/ssh/sshd_config、/etc/ssh/ssh_config,修改如下行的端口为22222。server端的配置文件不要修改行PermitRootLogin no为yes,区别于传统的搭建方法,不是用root账号登录。
Port 22222 #此处端口配置为传递互信使用的端口,预传递公钥的端口是多少这里修改为多少。
4、给传递公钥的用户设置密码,这里我们使用的就是mysql用户,如果使用其他用户还需要将这个配置互信使用的用户加入到mysql用户组;这个用户还需要有sudo权限,因为MHA的切换过程中有VIP的摘除和添加过程,这个步骤要有类似root的权限进行操作,且每台机器上都要执行。
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
liyingxiao ALL=NOPASSWD: ALL
mysql ALL=NOPASSWD: ALL
5、切换用户模式为mysql并配置机器之间的互信,可以通过id username判断用户行为是否是传递公钥使用的用户mysql
#mha_master上配置到mha_backup、mha_manager的无密码登录
[root@172-16-3-190 we_ops_admin]# su - mysql
[mysql@172-16-3-190 ~]$ ssh-keygen -t rsa
[mysql@172-16-3-190 home]$ cd /home/mysql/.ssh/[mysql@172-16-3-190 .ssh]$ cat id_rsa.pub >> authorized_keys #这里角色复用,因此需要允许多角色自身登录
[mysql@172-16-3-190 .ssh]$ chmod 700 /home/mysql/.ssh/
[mysql@172-16-3-190 .ssh]$ chmod 600 /home/mysql/.ssh/authorized_keys
[mysql@172-16-3-190 .ssh]$ ssh-copy-id -i id_rsa.pub '-p22222 mysql@172.16.3.189'
#mha_backup、mha_manager配置到mha_master的无密码登录
[mysql@172-16-3-189 .ssh]$ id
uid=502(mysql) gid=502(mysql) groups=502(mysql)
[mysql@172-16-3-189 .ssh]$ ssh-keygen -t rsa
[mysql@172-16-3-189 ~]$ cd /home/mysql/.ssh/
[mysql@172-16-3-189 .ssh]$ cat id_rsa.pub >> authorized_keys
[mysql@172-16-3-189 .ssh]$ chmod 700 /home/mysql/.ssh/
[mysql@172-16-3-189 .ssh]$ chmod 600 /home/mysql/.ssh/authorized_keys
[mysql@172-16-3-189 .ssh]$ ssh-copy-id -i id_rsa.pub '-p22222 mysql@172.16.3.190'
6、验证互信,无密码远程登录其他机器
#172.16.3.190验证互信
[mysql@172-16-3-190 .ssh]$ ssh mha_backup
[mysql@172-16-3-190 .ssh]$ ssh mha_manager
#172.16.3.189验证互信
[mysql@172-16-3-189 .ssh]$ ssh mha_master
[mysql@172-16-3-189 .ssh]$ ssh mha_backup
[mysql@172-16-3-189 .ssh]$ ssh mha_manager
7、配置manager节点的服务
7.1创建manager节点的监控用户,确保从manager节点可以连接master、slave
mysql> grant all privileges on *.* to 'mha_monitor'@'172.16.%.%' identified by 'mha_monitor';
Query OK, 0 rows affected, 1 warning (10.12 sec)
7.2编辑MHA的配置文件,以及建立对应的工作目录,并将这些目录的属主属组更改为MySQL。如果不做更改SSH/同步检查不会报错,但使用其他命令和切换会报权限错误,建议更改属主属组便于后续的维护配置。
[root@172-16-3-189 ~] mkdir ‐p /etc/masterha
[root@172-16-3-189 masterha]# mkdir -p /var/log/masterha/app_3306
[root@172-16-3-189 masterha]# mkdir /opt/shells/masterha
[root@172-16-3-189 we_ops_admin]# chown -R mysql:mysql /var/log/masterha/
[root@172-16-3-189 masterha]# chown -R mysql:mysql /etc/masterha/
[root@172-16-3-189 masterha]# chown -R mysql:mysql /opt/shells/masterha/
[root@172-16-3-189 masterha]# cat /etc/masterha/app_3306.cnf #编辑MHA的配置文件
[root@172-16-3-189 masterha]# cat app_3306.cnf
[server default]
# mysql user and password
user=mha_monitor
password=mha_monitor
repl_user=repl
repl_password=repl
ssh_user=mysql
ssh_port=22222
# working directory on the manager
manager_workdir=/var/log/masterha/app_3306
# working directory on MySQL servers
remote_workdir=/var/log/masterha/app_3306
ping_interval=1
master_ip_failover_script=/opt/shells/masterha/master_ip_failover_3306
master_ip_online_change_script=/opt/shells/masterha/master_ip_online_change_script_3306
[server1]
hostname=172.16.3.190
port=3306
master_binlog_dir=/opt/app/mysql_3306/data
[server2]
hostname=172.16.3.189
port=3306
master_binlog_dir=/opt/app/mysql_3306/data
7.3编辑自动漂移和手动漂移的脚本文件并授予可执行权限,以及VIP漂移处给予sudo的权限,这里将用户设置为可sudo,是给予摘除和添加VIP的权限
[root@172-16-3-189 we_ops_admin]# chmod +x /opt/shells/masterha/master_ip_failover_3306
[root@172-16-3-189 we_ops_admin]# chmod +x /opt/shells/masterha/master_ip_online_change_script_3306
编辑脚本文件master_ip_failover_3306,修改如下行为:
my $ssh_start_vip = "sudo /sbin/ifconfig eth0:$key $vip;sudo /sbin/arping -I eth0:0 -c 5 -s 172.16.3.123 172.16.0.1 >/dev/null 2>&1"
编辑master_ip_online_change_script_3306修改如下行为:
my $ssh_start_vip = "sudo /sbin/ifconfig eth0:$key $vip;sudo /sbin/arping -I eth0:0 -c 5 -s 172.16.3.123 172.16.0.1 >/dev/null 2>&1"
`ssh mysql\@${new_master_host} \" $ssh_start_vip \"`; #将root用户替换为MySQL用户,这里会进行SSH添加VIP
`ssh mysql\@${orig_master_host} \" $ssh_stop_vip \"`; #讲root用户替换为MySQL用户,这里会进行SSH摘除VIP
三、MHA健康检查(传递公钥的用户模式下进行检查)
1、检查SSH免密码登录
[mysql@172-16-3-189 ~]$ masterha_check_ssh --conf=/etc/masterha/app_3306.cnf
2、检查同步状态
[mysql@172-16-3-189 ~]$ masterha_check_repl --conf=/etc/masterha/app_3306.cnf
3、检查manager自动漂移服务是否开启
[mysql@172-16-3-189 ~]$ masterha_check_status --conf=/etc/masterha/app_3306.cnf
四、切换测试(漂移过程及结果不做赘述,传递公钥的用户模式下进行漂移)
1、手动切换,并检查同步状态是否正常
[mysql@172-16-3-189 ~]$ masterha_master_switch --conf=/etc/masterha/app_3306.cnf --master_state=alive --orig_master_is_new_slave -interactive=0
2、自动切换,并查看VIP是否成功漂移
关闭master实例,发现VIP成功从master摘除并漂移到slave上
五、遇到的问题总结
1、MHA的工作目录公钥用户对此没有权限
2、摘除、添加VIP需要有sudo权限
3、在线切换的用户要使用公钥用户而不是不用的root用户
4、手动切换的过程中,使用公钥用户进行,不必进行sudo -s给予sudo权限,否则会多余输入密码
MHA非root用户搭建测试的更多相关文章
- 非root用户搭建hadoop伪分布式
0.安装软件列表 jdk-7u25-linux-x64.tar.gz hadoop-2.5.0.tar.gz hadoop-native-64-2.5.0.tar 1.准备Linux环境(root ...
- linux非root用户下安装软件,搭建生产环境
之前的用实验室的服务器,因为某些原因,使用的用户没有root权限.linux的非root用户很多软件无法安装,非常的不方便.我的方法是使用brew来代替系统的包管理工具.brew是最先用在mac上的包 ...
- 非root用户安装软件
下面简要说一下Linux下非root用户安装软件的一般流程: 1. 获取源代码,一般是wget方式,ubuntu可以使用apt-get source来获取源代码. 2. 解压源代码,一般使用tar - ...
- Linux 下非root用户使用docker
Linux 下非root用户使用docker 通常我们使用linux系统的时候,最好是不要直接使用root账号,但是使用Docker的时候,默认又是不能使用非root用户的,关于原因,官方说法如下: ...
- 非root用户ssh 执行 sudo远程机器免密钥
非root用户ssh 执行 sudo远程机器免密钥 # 1.登陆192.168.1.10 ssh-keygen -t rsa # 一路回车 # 将公钥添加到认证文件中 cat ~/.ssh/id_rs ...
- 非root用户sudo_ssh免密钥
非root用户sudo_ssh免密钥 目标:从服务器上ssh登陆后sudo免密钥执行相应的命令 环境介绍: 192.168.65.130 web224 # 步骤一: # 每个节点执行(不是必须,但是建 ...
- 一个带bash,带glibc,中国时区,非root用户可运行crond命令的基于alpine镜像的Dockerfile
这个镜像现在说起来简单, 带bash(增加执行脚本的兼容性,带GLIBC,中国时区,非root用户可运行crond命令-安全) 但让我开始陷入时,真的让我有段时间有点爆了. 比如,将filebeat文 ...
- linux安装mongodb(设置非root用户和开机启动)
官网地址:https://www.mongodb.com/ 在官网上选择不同的linux系统得到不同的下载地址,我们用的下载地址是:https://fastdl.mongodb.org/linux/m ...
- Linux环境(服务器)下非root用户安装Python3.6
Linux环境(服务器)下非root用户安装Python3.6 在管理实验室集群时候,遇到的问题--非root用户在搭建自己环境时候,如何搭建. 注意: root用户的根目录是root,非root用户 ...
随机推荐
- centos6.5使用LVM
1.添加硬盘 centos6以前的版本用kudzu来不重启识别新硬件. [root@xen01 ~]# /etc/init.d/kudzu start -bash: /etc/init.d/kudzu ...
- Java是值传递还是引用传递?
Java的值传递和引用传递在面试中一般都会都被涉及到,今天我们就来聊聊这个问题.这个问题一般是相对函数而言的,也就是Java中所说的方法参数,那么我们先来回顾一下在程序设计语言中有关参数传递给方法的两 ...
- C++入门笔记(一)零碎基础知识
零碎基础知识 一.创建和运行程序 1.使用文本编辑器编写程序,保存为文件,该文件就叫源代码. 2.编译源代码:运行一个程序,将源代码翻译为主机使用的内部语言----机器语言.包含了 编译后程序的文件就 ...
- 数据分析 大数据之路 四 numpy 2
NumPy 数学函数 NumPy 提供了标准的三角函数:sin().cos().tan(import numpy as np a = np.array([0,30,45,60,90])print (' ...
- 微信跳转,手机WAP浏览器一键超级跳转微信指定页面
微信跳转,手机WAP浏览器一键超级跳转微信指定页面 这篇文章主要介绍了如何在手机浏览器wap网页中点击链接跳转到微信界面,需要的朋友可以参考下 先说第一种,最简单的唤起微信协议,weixin://主流 ...
- python多版本管理工具(pyenv)
在学习和利用python开发的很多情况下,需要多版本的Python并存.此时需要在系统中安装多个Python,但又不能影响系统自带的 Python.pyenv 就是这样一个 Python 版本管理器. ...
- 【react】---17新增的生命周期
一.废除的生命周期 官网文档指出使用这些生命周期的代码会在未来版本的react中更容易产生bug,尤其是对于异步渲染的版本 由于未来采用异步渲染机制,所以即将在17版本中去掉的生命周期钩子函数 com ...
- html+css手机端自动适应
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scal ...
- MVC是什么
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码 ...
- SSIS - 11.For循环容器
一.For循环容器中的3个循环变量 For循环容器,类似于编程语言中的For,用于重复执行容器内的任务,直到条件返回为False.与编程语言类似,For循环容器也需要定义以下3种循环属性: 注: 必须 ...