编译安装MMM
我们是使用的MySQL的容器镜像来启动的MySQL集群,而这个从docker hub上面拉取的MySQL5.7官方版本的镜像是基于Debian系统来制作的,所以我们此次安装MMM软件需要基于Debian系统来安装。
下载好的mysql-mmm
如下所示:
root@test:~# ls -lstr total 60 56 -rw-r--r-- 1 root root 55278 Feb 21 16:22 mysql-mmm_2.2.1.orig.tar.gz 4 drwxr-xr-x 2 root root 4096 Feb 21 16:24 deb root@test:~#
解压并且安装,但是在安装MMM之前,先安装一下它的依赖包,使用如下命令来安装:
apt-get install liblog-log4perl-perl libmailtools-perl liblog-dispatch-perl libclass-singleton-perl libproc-daemon-perl libalgorithm-diff-perl libdbi-perl libdbd-mysql-perl -y
安装MMM的命令和过程如下:
root@test:~# tar -zxf mysql-mmm_2.2.1.orig.tar.gz root@test:~# ls -lstr total 64 4 drwxr-xr-x 6 root root 4096 May 7 2010 mysql-mmm-2.2.1 56 -rw-r--r-- 1 root root 55278 Feb 21 16:22 mysql-mmm_2.2.1.orig.tar.gz 4 drwxr-xr-x 2 root root 4096 Feb 21 16:24 deb root@test:~# cd mysql-mmm-2.2.1/ root@test:~/mysql-mmm-2.2.1# make install mkdir -p usr/share/perl5/MMM usr/lib/mysql-mmm usr/sbin var/log/mysql-mmm etc etc/mysql-mmm etc/init.d/ cp -r lib/Common/ usr/share/perl5/MMM \[ -f etc/mysql-mmm/mmm_common.conf \] || cp etc/mysql-mmm/mmm_common.conf etc/mysql-mmm/ mkdir -p usr/lib/mysql-mmm/agent/ cp -r lib/Agent/ usr/share/perl5/MMM cp -r bin/agent/* usr/lib/mysql-mmm/agent/ cp -r etc/init.d/mysql-mmm-agent etc/init.d/ cp sbin/mmm_agentd usr/sbin \[ -f etc/mysql-mmm/mmm_agent.conf \] || cp etc/mysql-mmm/mmm_agent.conf etc/mysql-mmm/ mkdir -p usr/lib/mysql-mmm/monitor/ cp -r lib/Monitor/ usr/share/perl5/MMM cp -r bin/monitor/* usr/lib/mysql-mmm/monitor/ cp -r etc/init.d/mysql-mmm-monitor etc/init.d/ cp sbin/mmm\_control sbin/mmm\_mond usr/sbin \[ -f etc/mysql-mmm/mmm_mon.conf \] || cp etc/mysql-mmm/mmm_mon.conf etc/mysql-mmm/ mkdir -p usr/lib/mysql-mmm/tools/ cp -r lib/Tools/ usr/share/perl5/MMM cp -r bin/tools/* usr/lib/mysql-mmm/tools/ cp sbin/mmm\_backup sbin/mmm\_clone sbin/mmm_restore usr/sbin \[ -f etc/mysql-mmm/mmm_tools.conf \] || cp etc/mysql-mmm/mmm_tools.conf etc/mysql-mmm/ root@test:~/mysql-mmm-2.2.1#
如果在安装mmm
的时候,提示没有make
命令,则需要先安装make
命令,安装的时候如果是Debian或Ubuntu系统,使用如下apt-get命令安装:
apt-get install make cmake -y
如果是CentOS或Redhat系统,则使用如下的yum命令来安装:
yum install make cmake -y
以上编译安装MMM需要在每一个节点都执行,包括两个master节点和两个slave节点,还有monitor监控节点也要安装。
安装完MMM之后,我们需要注意一下几个目录,这是我们使用MMM服务的基础。
# MMM各种配置文件所在目录 /etc/mysql-mmm # MMM服务日志文件所在目录 /var/log/mysql-mmm/mmm_mond.log # MMM的monitor服务的日志文件 /var/log/mysql-mmm/mmm_agentd.log # MMM的agent服务的日志文件 # 各种perl脚本所在目录 /usr/lib/mysql-mmm/agent # agent客户端各种脚本所在目录 /usr/lib/mysql-mmm/monitor # monitor监控端各种脚本所在目录 /usr/lib/mysql-mmm/tools # 工具包脚本所在目录 # 启动和关闭MMM服务的脚本文件 /etc/init.d/mysql-mmm-agent /etc/init.d/mysql-mmm-monitor
创建MMM使用的MySQL用户
监控用和客户端用户,在所有的节点上都要创建这两个用户。如果已经配置组从同步,在master1上创建就OK,其他节点会自动同步这两个创建好的用户到其他节点。
create user 'mmm_monitor'@'172.20.0.%' identified by 'mmm_monitor'; grant replication client on *.* to 'mmm_monitor'@'172.20.0.%'; create user 'mmm_agent'@'172.20.0.%' identified by 'mmm_agent'; grant super, replication client, process on *.* to 'mmm_agent'@'172.20.0.%';
需要注意的是这两个用户的权限不同,结合前面我们配置组从同步的哪一个用户,我们来对比一下:
- monitor:MMM监控使用的用户,拥有replication client权限就可以。
- agent:MMM客户单使用的用,拥有super、replication client、process权限。
- replication:组从同步使用的用户,拥有replication slave权限即可。
最后的用户在四个节点上面的结果如下图所示:
修改MMM的配置文件
MMM所有的配置文件都在如下目录中:
root@master1:/etc/mysql-mmm# ls -lstr etc/mysql-mmm/* 4 -rw-r----- 1 root root 321 Feb 22 21:46 etc/mysql-mmm/mmm_mon.conf 4 -rw-r----- 1 root root 1293 Feb 22 21:46 etc/mysql-mmm/mmm_tools.conf 4 -rw-r----- 1 root root 37 Feb 22 22:21 etc/mysql-mmm/mmm_agent.conf 4 -rw-r----- 1 root root 789 Feb 22 23:20 etc/mysql-mmm/mmm_common.conf root@master1:/etc/mysql-mmm#
「mmm_comm.conf配置文件」
所有5个节点中的/etc/mysql-mmm/mmm_common.conf
配置文件都修改为如下所示的内容。
root@master1:/etc/mysql-mmm# cat mmm_common.conf active\_master\_role writer <host default> # 网卡的名称,各个主机上面网络设备的名称 cluster_interface eth0 pid\_path /var/run/mmm\_agentd.pid bin_path /usr/lib/mysql-mmm/ # 主从复制用户名和密码 replication\_user repl\_user replication\_password repl\_user # MMM服务使用的anget用户名和密码 agent\_user mmm\_agent agent\_password mmm\_agent </host> # master1的配置信息 <host master1> ip 172.20.0.11 mode master peer master2 </host> # master2的配置信息 <host master2> ip 172.20.0.21 mode master peer master1 </host> # slave1的配置信息 <host slave1> ip 172.20.0.12 mode slave </host> # slave2的配置信息 <host slave2> ip 172.20.0.22 mode slave </host> # 写虚拟IP的配置信息,指定可写的主机名称 <role writer> hosts master1, master2 ips 172.20.0.100 mode exclusive </role> # 读虚拟IP的配置信息,指定可以提供读服务的主机名称。下面的VIP和主键名称不一定是一一对应的,VIP是随机分布到各个可读节点的。 # 如果提供多个VIP,有可能一个节点被分配多个VIP,这样也是支持的。 <role reader> hosts master1, master2, slave1, slave2 ips 172.20.0.111, 172.20.0.211, 172.20.0.122, 172.20.0.222 mode balanced </role> root@master1:/etc/mysql-mmm#
上面的role reader
中配置的可读节点,可以根据自己的需求来配置,这里我把master1, master2, slave1, slave2
都作为可读的节点,当然可以把主节点master1
去掉,只配置master2, slave1, slave2
三个节点。这里的ips
也是我们指定的VIP的值,我们可以配置多个VIP,最好是VIP的个数和上面的host的数目一致,表示每一个提供读的节点分配一个VIP。
「mmm_agent.conf配置文件」
每一个节点上面的/etc/mysql-mmm/mmm_agent.conf
配置文件中,都在第2行中,修改一下主机名称。下面给出master1节点的配置如下:
root@master1:/etc/mysql-mmm# cat mmm_agent.conf include mmm_common.conf this master1 root@master1:/etc/mysql-mmm#
其他master2、slave1、slave2各个节点也需要作出对应的修改。只要把master1改为对应的主机名称即可。
「mmm_mon.conf配置文件」
在monitor节点上,修改/etc/mysql-mmm/mmm_mon.conf
配置文件,修改内容如下所示,其他四个节点不需要对这个文件做修改。
root@monitor:/etc/mysql-mmm# cat mmm_mon.conf include mmm_common.conf <monitor> ip 127.0.0.1 pid\_path /var/run/mmm\_mond.pid bin_path /usr/lib/mysql-mmm/ status\_path /var/lib/misc/mmm\_mond.status ping_ips 172.20.0.1, 172.20.0.11, 172.20.0.21, 172.20.0.12, 172.20.0.22 # 网关IP地址,和各个节点的物理IP地址,用于监控各个节点的状态是否可用 </monitor> # MMM服务使用MySQL中的monitor用户名称和密码 <host default> monitor\_user mmm\_monitor monitor\_password mmm\_monitor </host> # debug值为0非debug模式,为1的时候表示debug模式,debug模式下,会在/var/log/mysql-mmm/mmm_mond.log日志文件中生成更多日志信息。 debug 0 root@monitor:/etc/mysql-mmm#
启动MMM服务
客户端agent服务相关命令如下,客户端agent启动后日志存放在/var/log/mysql-mmm/mmm_agentd.log
文件中。
/etc/init.d/mysql-mmm-agent start /etc/init.d/mysql-mmm-agent status /etc/init.d/mysql-mmm-agent stop /etc/init.d/mysql-mmm-agent restart
监控端monitor服务相关命令如下,监控端monitor启动后日志存放在/var/log/mysql-mmm/mmm_mond.log
文件中。
/etc/init.d/mysql-mmm-monitor start /etc/init.d/mysql-mmm-monitor status /etc/init.d/mysql-mmm-monitor stop /etc/init.d/mysql-mmm-monitor restart
MMM监控状态有一个管理命令mmm_control
,它的使用帮助如下所示:
root@monitor:/# mmm_control --help Invalid command '--help' Valid commands are: help \- show this message ping \- ping monitor show - show status checks \[<host>|all \[<check>|all\]\] - show checks status set_online <host> \- set host <host> online set_offline <host> \- set host <host> offline mode - print current mode. set_active - switch into active mode. set_manual - switch into manual mode. set_passive - switch into passive mode. move_role \[--force\] <role> <host> \- move exclusive role <role> to host <host> (Only use --force if you know what you are doing!) set_ip <ip> <host> \- set role with ip <ip> to host <host> root@monitor:/#
常用的维护节点状态的命令如下:
mmm_control show mmm_control checks all mmm\_control set\_online master1 mmm\_control set\_online master2 mmm\_control set\_online slave1 mmm\_control set\_online slave2
「下面分别在四个MySQL节点上执行如下命令启动并查看MMM的客户端服务」
- master1主节点上,启动和查看MMM的客户端服务如下:
root@master1:/etc/mysql-mmm# etc/init.d/mysql-mmm-agent start Daemon bin: '/usr/sbin/mmm_agentd' Daemon pid: '/var/run/mmm_agentd.pid' Starting MMM Agent daemon... Ok root@master1:/etc/mysql-mmm# etc/init.d/mysql-mmm-agent status Daemon bin: '/usr/sbin/mmm_agentd' Daemon pid: '/var/run/mmm_agentd.pid' Checking MMM Agent process: running. root@master1:/etc/mysql-mmm#
- master2主节点上,启动和查看MMM的客户端服务如下:
root@master2:/etc/mysql-mmm# etc/init.d/mysql-mmm-agent start Daemon bin: '/usr/sbin/mmm_agentd' Daemon pid: '/var/run/mmm_agentd.pid' Starting MMM Agent daemon... Ok root@master2:/etc/mysql-mmm# etc/init.d/mysql-mmm-agent status Daemon bin: '/usr/sbin/mmm_agentd' Daemon pid: '/var/run/mmm_agentd.pid' Checking MMM Agent process: running. root@master2:/etc/mysql-mmm#
- slave1主节点上,启动和查看MMM的客户端服务如下:
root@slave1:/etc/mysql-mmm# etc/init.d/mysql-mmm-agent start Daemon bin: '/usr/sbin/mmm_agentd' Daemon pid: '/var/run/mmm_agentd.pid' Starting MMM Agent daemon... Ok root@slave1:/etc/mysql-mmm# etc/init.d/mysql-mmm-agent status Daemon bin: '/usr/sbin/mmm_agentd' Daemon pid: '/var/run/mmm_agentd.pid' Checking MMM Agent process: running. root@slave1:/etc/mysql-mmm#
- slave2主节点上,启动MMM的客户端服务如下:
root@slave2:/etc/mysql-mmm# etc/init.d/mysql-mmm-agent start Daemon bin: '/usr/sbin/mmm_agentd' Daemon pid: '/var/run/mmm_agentd.pid' Starting MMM Agent daemon... Ok root@slave2:/etc/mysql-mmm# etc/init.d/mysql-mmm-agent status Daemon bin: '/usr/sbin/mmm_agentd' Daemon pid: '/var/run/mmm_agentd.pid' Checking MMM Agent process: running. root@slave2:/etc/mysql-mmm#
「下面在监控节点上执行如下命令启动并查看MMM的监控服务」
- monitor节点上,启动和查看MMM的监控端服务如下:
root@monitor:/etc/mysql-mmm# etc/init.d/mysql-mmm-monitor start Daemon bin: '/usr/sbin/mmm_mond' Daemon pid: '/var/run/mmm_mond.pid' Starting MMM Monitor daemon: Ok root@monitor:/etc/mysql-mmm# etc/init.d/mysql-mmm-monitor status Daemon bin: '/usr/sbin/mmm_mond' Daemon pid: '/var/run/mmm_mond.pid' Checking MMM Monitor process: running. root@monitor:/etc/mysql-mmm#
- 在monitor节点,查看监控的状态:
root@monitor:/etc/mysql-mmm# mmm_control show master1(172.20.0.11) master/AWAITING_RECOVERY. Roles: master2(172.20.0.21) master/AWAITING_RECOVERY. Roles: slave1(172.20.0.12) slave/AWAITING_RECOVERY. Roles: slave2(172.20.0.22) slave/AWAITING_RECOVERY. Roles: root@monitor:/etc/mysql-mmm# mmm\_control set\_online master1; OK: State of 'master1' changed to ONLINE. Now you can wait some time and check its new roles! root@monitor:/etc/mysql-mmm# mmm\_control set\_online master2 OK: State of 'master2' changed to ONLINE. Now you can wait some time and check its new roles! root@monitor:/etc/mysql-mmm# mmm\_control set\_online slave1 OK: State of 'slave1' changed to ONLINE. Now you can wait some time and check its new roles! root@monitor:/etc/mysql-mmm# mmm\_control set\_online slave2 OK: State of 'slave2' changed to ONLINE. Now you can wait some time and check its new roles! root@monitor:/etc/mysql-mmm# mmm_control show master1(172.20.0.11) master/ONLINE. Roles: reader(172.20.0.111), writer(172.20.0.100) master2(172.20.0.21) master/ONLINE. Roles: reader(172.20.0.211) slave1(172.20.0.12) slave/ONLINE. Roles: reader(172.20.0.122) slave2(172.20.0.22) slave/ONLINE. Roles: reader(172.20.0.222) root@monitor:/etc/mysql-mmm#
「问题排查1:monitor服务不能正常启动?」
当在monitor节点启动监控服务后,监控服务一会就异常退出了。原因是在使用docker启动集群节点的时候没有使用--cap-add NET_ADMIN
参数,没有这个参数就没有办法在容器只用使用虚拟VIP的功能。在删除容器后,增加参数重新运行后,才运行起来。
后来,又发现monitor节点启监控服务器仍然失败,查看日志/var/log/mysql-mmm/mmm_mond.log
,如下所示:
root@monitor:/etc/mysql-mmm# tail -f var/log/mysql-mmm/mmm_mond.log 2021/02/22 23:26:27 INFO Waiting for network connection... 2021/02/22 23:26:27 INFO Spawning checker 'ping_ip'... 2021/02/22 23:26:27 INFO Shutting down checker 'ping_ip'... 2021/02/22 23:26:27 INFO Network connection is available. 2021/02/22 23:26:27 FATAL Child exited with exitcode 255, restarting after 10 second sleep
修改/etc/mysql-mmm/mmm_mon.conf
配置文件中的debug
的值为1
,表示以debug
的模式运行monitor服务,此时我们再重新启动monitor服务,查看输出的详细错误日志如下:
root@monitor:/etc/mysql-mmm# etc/init.d/mysql-mmm-monitor start Daemon bin: '/usr/sbin/mmm_mond' Daemon pid: '/var/run/mmm_mond.pid' Starting MMM Monitor daemon: 2021/02/22 23:30:17 INFO STARTING... 2021/02/22 23:30:17 DEBUG Created pid file '/var/run/mmm_mond.pid' with pid 5330 2021/02/22 23:30:17 INFO Waiting for network connection... 2021/02/22 23:30:17 INFO Spawning checker 'ping_ip'... 2021/02/22 23:30:17 DEBUG IP '172.20.0.1' is reachable: OK 2021/02/22 23:30:17 INFO Shutting down checker 'ping_ip'... 2021/02/22 23:30:17 INFO Network connection is available. Use of uninitialized value $old_state in string ne at usr/share/perl5/MMM/Monitor/Agent.pm line 42. 2021/02/22 23:30:17 FATAL Child exited with exitcode 255, restarting after 10 second sleep
于是去修改了/usr/share/perl5/MMM/Monitor/Agent.pm
文件,在第41行增加如下内容,保存退出,重新启动monitor服务。
if (! defined($old\_state)) { $old\_state = 'certinally not new_state'; }
然后再次重启monitor服务,启动成功。然后把/etc/mysql-mmm/mmm_mon.conf
配置文件中的debug
的值再次修改为0
,关闭debug
模式再次重启monitor服务。此时查看monitor服务的日志内容如下:
root@monitor:/# tail -f var/log/mysql-mmm/mmm_mond.log 2021/02/22 23:42:43 INFO Check 'rep_backlog' on 'slave1' is ok! 2021/02/22 23:42:43 INFO Check 'rep_backlog' on 'master2' is ok! 2021/02/22 23:42:43 INFO Check 'rep_threads' on 'master1' is ok! 2021/02/22 23:42:43 INFO Check 'rep_threads' on 'slave2' is ok! 2021/02/22 23:42:43 INFO Check 'rep_threads' on 'slave1' is ok! 2021/02/22 23:42:43 INFO Check 'rep_threads' on 'master2' is ok! 2021/02/22 23:42:43 INFO Check 'ping' on 'master1' is ok! 2021/02/22 23:42:43 INFO Check 'ping' on 'slave2' is ok! 2021/02/22 23:42:43 INFO Check 'ping' on 'slave1' is ok! 2021/02/22 23:42:43 INFO Check 'ping' on 'master2' is ok!
「问题排查2:虚拟IP不能再各个节点生成?」
启动MMM后,发现不能通过VIP访问MySQL数据库,去各个节点使用ifconfig -a
或者ip addr
命令查看发现没有对应的VIP生成。查看了各个节点MMM agent服务的日志文件/var/log/mysql-mmm/mmm_agent.log
,发现如下错误信息:
root@master1:/# tail -f var/log/mysql-mmm/mmm_agentd.log 2021/02/23 17:16:19 FATAL Couldn't configure IP '172.20.0.111' on interface 'eth0': undef 2021/02/23 17:16:19 FATAL Couldn't allow writes: undef 2021/02/23 17:16:22 FATAL Couldn't configure IP '172.20.0.111' on interface 'eth0': undef 2021/02/23 17:16:22 FATAL Couldn't allow writes: undef
经过排查发现是在设置VIP的时候失败,设置客户端VIP的脚本如下:
/usr/lib/mysql-mmm/agent/configure_ip
执行上面的脚本发现如下错误:
提示我们,需要在perl中安装arp.pm包。安装的时候,为了提高速度,我们修改一下perl安装模块的时候使用的镜像源。
修改perl安装包的时候使用的镜像源,参考如下方式修改:
root@master1:/# perl -MCPAN -e shell cpan\[5\]> o conf urllist urllist 0 \[http://www.cpan.org/\] Type 'o conf' to view all configuration items cpan\[6\]> o conf urllist push http://mirrors.aliyun.com/CPAN/ Please use 'o conf commit' to make the config permanent! cpan\[7\]> o conf commit commit: wrote '/root/.cpan/CPAN/MyConfig.pm' cpan\[8\]> o conf urllist urllist 0 \[http://www.cpan.org/\] 1 \[http://mirrors.aliyun.com/CPAN/\] Type 'o conf' to view all configuration items cpan\[9\]> install Net::ARP cpan\[10\]>
其中各个命令的含义如下:
o conf urllist
:查看的当前的镜像源o conf urllist push http://mirrors.aliyun.com/CPAN/
:添加阿里的perl镜像源o conf commit
:提交对镜像源的修改install Net::ARP
:安装arp.pm包。
经过上面的安装方式,发现安装失败。于是下载源码自己编译安装这个包。参考如下命令顺序来编译安装。
# 下载源码文件 wget http://cpan.metacpan.org/authors/id/C/CR/CRAZYDJ/Net-ARP-1.0.11.tgz # 解压下载后的文件 tar -zxvf Net-ARP-1.0.11.tgz # 进入下载目录 cd Net-ARP-1.0.11 # 执行编译 perl Makefile.PL # 执行安装 make install
上面安装Net-ARP包的操作,需要在除了monitor节点的四个节点上都执行安装一下。
最后所有节点的IP地址和VIP地址如下所示: