一、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 架构解析

图片.png

如上图拓扑

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服务器,配置如下:

        图片.png

        b、虚拟IP规划:

        图片.png

        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

             [[email protected] ~]# vim /etc/hosts

             图片.png

        d、关闭firewalld:

             [[email protected] ~]# systemctl stop firewalld

             [[email protected] ~]# systemctl disable firewalld

        e、关闭selinux

             [[email protected] ~]# setenforce 0

        f、配置yum源和epel源

             根据自己的需要进行配置,这里不进行赘述

        g、服务器做时间同步

             同步网络时间或者自己的时间服务器,这里不进行赘述

    2、安装MySQL

        关于MySQL的安装,请参考小弟我的另一篇文章:http://www.javashuo.com/article/p-stbwdeok-cp.html

    3、配置MySQL

        [[email protected] ~]# 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

        [[email protected] ~]# 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

        [[email protected] ~]# 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

        [[email protected] ~]# 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数据库

            [[email protected] ~]# service mysqld restart

        5、配置MySQL主从同步

            a、配置主主结构

            在mastera、masterb数据库中创建主从同步所需要的用户

            mysql> grant replication slave on *.* to [email protected]"192.168.20.%" identified by "123456";

            mastera

            (1)、查看master状态

            mysql> show master status;

            图片.png

            (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;

            图片.png

            (3)、启动从库

            mysql> start slave;

            图片.png

            (4)、查看从库状态

            mysql> show slave status\G;

            图片.png

            说明:

            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;

            图片.png

            (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;

            图片.png

            (3)、启动从库

            mysql> start slave;

            图片.png

            (4)、查看从库状态

            mysql> show slave status\G;

            图片.png

            说明:

                在执行完 show slave status\G; 命令时,我们会看到从库当前的详细信息,但是又三个地方需要特别注意,如下图:

                图片.png

                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 中的内容即可(不知                                                    道怎么修改的,可随便改一位就行),如图:

                     [[email protected] data]# vim auto.cnf

                     图片.png

                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;

            图片.png

        c、验证主从同步

        1、在 mastera 中创建games数据库,在其他数据库服务器中查看是否存在。

        mysql> create database games;

        图片.png

        2、在其他三台服务器中查看刚创建的数据库是否存在

                                    masterb

        图片.png

                                             slavea

        图片.png

                                                slaveb

        图片.png

        上三图表示,由mastera向其他三台数据库同步正常

        3、在masterb 中创建用户mmmagent、monitor、discuz,在其他三台数据库服务器中查看是否存在

        mysql> grant all privileges on *.*  to [email protected]"192.168.20.%" identified by "123456";

        mysql> grant all privileges on *.*  to [email protected]"192.168.20.%" identified by "123456";

        图片.png

        4、在其他三台服务器中查看刚创建的账号是否存在

                                                mastera

        图片.png

                                                slavea

        图片.png

                                                slaveb

        图片.png

        上三图表示,由masterb向其他三台数据库同步正常

        主从同步到此,部署完成,下期,我们开始本章核心环节,MMM配置。


未完待续,下期再见,敬请期待。。。。。。