MySQL+MMM 高可用集群部署(一)
一、MMM的功能特点
MMM 即(Master-Master replication manager for MySQL)的简称,它是一套支持双主故障切换和双主日常管理的脚本程序,而MMM是用 Perl 语言所开发,其主要功能是:
第一、用来监控和管理 MySQL 数据库 主主复制(Master-Master),虽然是主主结构,但是由于数据库自身特性,在业务逻辑中,同一时刻,仅允许有一个主库写入,而另一个主库充当备份角色,一旦当前所使用的主库出现故障,将立马切换到另一个主库
第二、用来监控和管理 MySQL 数据库 主从复制(Master-Slave),而这里的主从复制,首先、从库的主要作用是进行 Read 负载均衡,其次,也充当备份角色。
MMM的优点:
1、开源免费、从产品面世到成型,经历了很长一段时间,有前辈们的成熟的技术支持
2、来源于 MySQL 内部,属于MySQL自己的技术
3、使用脚本控制管理,简单方便,易于理解
4、功能比较完善,自带各种牛X工具及套件
MMM的缺点:
1、由于 MMM 自身建构的局限性,只能有一个写入点,其扩展性在大型企业中将会是一个瓶颈。
2、对于读写分离、Read 负载均衡,其不能通过自身完成,需要企业自己手动处理,或者借助第三方软件完成。
二、MMM 架构解析
如上图拓扑
1、箭头方向代表数据流向
2、对于主主结构,我们需要在两台主数据库(主A 和 主B)中配置互为主从,当其中任意一台主库(比如主A)处于可写入状态时,另外一台主库(比如主B)将同步到它(主A)刚写入的数据,反之亦然。
3、对于主从结构,当前,主B属于主库,则需要配置 从A 和 从B 两台数据库做为 主B 的从库即可,无论是 主A 还是 主B ,有数据写入时,都会同步到 从A 和 从B 。如果,当前,主A 处于可写入状态,它首先会向 主B 进行数据同步,再由 主B 向 从A 和 从B 进行数据同步。这种结构在进行数据同步时,如果数据量较大(大型企业),将可能存在一定延时。
4、由 Monitor 监控服务器同时对 主A、主B、从A、从B 4台数据库进行监控及管理,这里指的是监控4台数据库的状态(服务可达、服务不可达状态,在生产环境中,数据库一旦出现故障,那将是灾难性的,影响企业命运的。所以,生产环境中,假如有4台数据库服务器:双主双从,4台数据库服务器不可能同时出现故障,亦或者说2台主数据库同样不可能同时出现故障。),如果说,当前正在写入的主数据库(主A)由于硬件故障或者服务奔溃出现故障,Monitor 服务器将会立马将虚拟 IP 192.168.20.254 切换到另外一台主数据库(主B),这期间的时间,十分短暂,客户基本不会有任何察觉,从库亦是如此。
5、对于读写分离,我们在进行应用服务部署过程中,会进行手动配置(或者借助第三方软件实现),虚拟写 IP :192.168.20.254,在单独配置虚拟 读IP:192.168.20.252、192.168.20.253,做读写分离,其主要目的是负载均衡,降低服务器压力。
三、主从同步配置详解
1、环境安装
a、数据库规划,这里我们安装4台MySQL数据库和1台Monitor服务器,配置如下:
b、虚拟IP规划:
c、修改服务器 hosts 文件,将下面的内容粘贴进去(注意,每台服务器都要添加):
192.168.20.134 masterA
192.168.20.128 masterB
192.168.20.129 slaveA
192.168.20.130 slaveB
192.168.20.131 cluster-proxy
[root@cluster-mysqla ~]# vim /etc/hosts
d、关闭firewalld:
[root@cluster-mysqla ~]# systemctl stop firewalld
[root@cluster-mysqla ~]# systemctl disable firewalld
e、关闭selinux
[root@cluster-mysqla ~]# setenforce 0
f、配置yum源和epel源
根据自己的需要进行配置,这里不进行赘述
g、服务器做时间同步
同步网络时间或者自己的时间服务器,这里不进行赘述
2、安装MySQL
关于MySQL的安装,请参考小弟我的另一篇文章:https://blog.51cto.com/4746316/2313577
3、配置MySQL
[root@cluster-mysqla ~]# vim /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /wdata/mysql/data
tmpdir = /wdata/mysql/temp
plugin-dir = /usr/local/mysql/plugin
server_id = 1
socket = /wdata/mysql/data/mysql.sock
pid-file = /wdata/mysql/data/mysql.pid
explicit_defaults_for_timestamp = true
lower_case_table_names = 1
open_files_limit = 65535
event_scheduler = 1
log_slave_updates = 1
[root@cluster-mysqlb ~]# vim /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /wdata/mysql/data
tmpdir = /wdata/mysql/temp
plugin-dir = /usr/local/mysql/plugin
server_id = 2
socket = /wdata/mysql/data/mysql.sock
pid-file = /wdata/mysql/data/mysql.pid
explicit_defaults_for_timestamp = true
lower_case_table_names = 1
open_files_limit = 65535
event_scheduler = 1
log_slave_updates = 1
[root@cluster-mysqlc ~]# vim /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /wdata/mysql/data
tmpdir = /wdata/mysql/temp
plugin-dir = /usr/local/mysql/plugin
server_id = 3
socket = /wdata/mysql/data/mysql.sock
pid-file = /wdata/mysql/data/mysql.pid
explicit_defaults_for_timestamp = true
lower_case_table_names = 1
open_files_limit = 65535
event_scheduler = 1
log_slave_updates = 1
[root@cluster-mysqld ~]# vim /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /wdata/mysql/data
tmpdir = /wdata/mysql/temp
plugin-dir = /usr/local/mysql/plugin
server_id = 4
socket = /wdata/mysql/data/mysql.sock
pid-file = /wdata/mysql/data/mysql.pid
explicit_defaults_for_timestamp = true
lower_case_table_names = 1
open_files_limit = 65535
event_scheduler = 1
log_slave_updates = 1
切记,在修改配置文件时,一定要加入级联复制选项(即:log_slave_updates = 1)
4、重启4台服务器的MySQL数据库
[root@cluster-mysqla ~]# service mysqld restart
5、配置MySQL主从同步
a、配置主主结构
在mastera、masterb数据库中创建主从同步所需要的用户
mysql> grant replication slave on *.* to slaveuser@"192.168.20.%" identified by "123456";
mastera
(1)、查看master状态
mysql> show master status;
(2)、设置主数据库信息,包括主数据库IP、主数据库用户名、主数据库密码、主数据库日志文件、主数据库日志文件偏移量
mysql> change master to master_host="192.168.20.128",master_user="slaveuser",master_password="123456",master_log_file="mysql-bin.000007",master_log_pos=3766631;
(3)、启动从库
mysql> start slave;
(4)、查看从库状态
mysql> show slave status\G;
说明:
1、master_host:主数据库IP地址,这里设置问masterb的IP地址
2、master_log_file:主数据库的日志文件名称,通过在 masterb 中使用 show master status; 查询获得。
3、master_log_file:著数据库的日志文件偏移量,也通过在 masterb 中使用 show master status; 查询获得。
masterb
(1)、查看master状态
mysql> show master status;
(2)、设置主数据库信息,包括主数据库IP、主数据库用户名、主数据库密码、主数据库日志文件、主数据库日志文件偏移量
mysql> change master to master_host="192.168.20.134",master_user="slaveuser",master_password="123456",master_log_file="mysql-bin.000005",master_log_pos=3766317;
(3)、启动从库
mysql> start slave;
(4)、查看从库状态
mysql> show slave status\G;
说明:
在执行完 show slave status\G; 命令时,我们会看到从库当前的详细信息,但是又三个地方需要特别注意,如下图:
1、Slave_IO_Running 和 Slave_SQL_Running 的值必须为 Yes ,否则将无法进行主从同步
Slave_IO_Running:I/O线程监控
Slave_SQL_Running:SQL线程监控
2、Master_UUID:这个值必须是唯一的,主数据库、从数据库的UUID不能相同,如果是克隆的服务器,这个UUID的值应该是相同的,此时,需要在MySQL数据目录下修改 auto.cnf 中的内容即可(不知 道怎么修改的,可随便改一位就行),如图:
[root@cluster-mysqlc data]# vim auto.cnf
3、Slave_SQL_Running_State 记录SQL线程的状态,一般当SQL线程为 NO 或者 Connecting 时,这里会提示出详细的错误原因,可根据这里的提示,进行排错。
4、Slave_IO_Running 值为 NO 时,一般为主数据库的 IP地址,用户名、密码设置有误,重新设置并重启 slave 可恢复正常。而 Slave_SQL_Running 值为 NO 或者为 Connecting 时,其出错原因比较丰富, 需要根据提示进行排错。
b、配置主从结构
按照前面主主结构的配置模式,分别在 slavea 和 slaveb 中MySQL命令行中执行下面语句:
mysql> change master to master_host="192.168.20.128",master_user="slaveuser",master_password="123456",master_log_file="mysql-bin.000007",master_log_pos=3766631;
mysql> start slave;
mysql> show slave status\G;
c、验证主从同步
1、在 mastera 中创建games数据库,在其他数据库服务器中查看是否存在。
mysql> create database games;
2、在其他三台服务器中查看刚创建的数据库是否存在
masterb
slavea
slaveb
上三图表示,由mastera向其他三台数据库同步正常
3、在masterb 中创建用户mmmagent、monitor、discuz,在其他三台数据库服务器中查看是否存在
mysql> grant all privileges on *.* to mmmagent@"192.168.20.%" identified by "123456";
mysql> grant all privileges on *.* to monitor@"192.168.20.%" identified by "123456";
4、在其他三台服务器中查看刚创建的账号是否存在
mastera
slavea
slaveb
上三图表示,由masterb向其他三台数据库同步正常
主从同步到此,部署完成,下期,我们开始本章核心环节,MMM配置。
未完待续,下期再见,敬请期待。。。。。。