MySQL/MariaDB基于MMM實現讀寫分離及高可用

前言

MMM(Master-Master replication managerfor Mysql,Mysql主主復制管理器)是一套靈活的腳本程序,基于perl實現,用來對mysql replication進行監控和故障遷移,并能管理mysql Master-Master復制的配置(同一時間只有一個節點是可寫的)。

MMM

優缺點

優點:高可用性,擴展性好,出現故障自動切換,對于主主同步,在同一時間只提供一臺數據庫寫操作,保證的數據的一致性。

缺點:Monitor節點是單點,可以結合Keepalived實現高可用。

工作原理

mysql-mmm的監管端會提供多個虛擬IP(VIP),包括一個可寫VIP,多個可讀VIP,通過監管的管理,這些IP會綁定在可用服務器之上,當某一臺服務器宕機時,監管會將VIP遷移至其他服務器。

實現過程

實驗拓撲

MariaDB-基于MMM實現讀寫分離及高可用.jpg

#注:系統環境CentOS6.6
#VIP172.16.10.30為可寫VIP,其他三組為可讀VIP
#可寫VIP只能在Master之間切換,可讀VIP可在Master和Slave之間切換
#前端應用可連接任意可讀VIP進行數據讀取,連接可寫VIP進行數據寫入

雙主一從配置

DB1配置

[root@node1 ~]# vim /etc/mysql/my.cnf 

datadir = /mydata/data
log-bin=/mydata/binlogs/master-bin       #二進制文件位置
relay-log=/mydata/relaylogs/relay-bin    #中繼日志位置
binlog_format=mixed
server-id       = 1
auto_increment_offset=1        #雙主復制中自增長字段的起始值
auto_increment_increment=2     #雙主復制中自增長字段的步長
log_slave_updates = 1          #開啟從庫更新操作寫入二進制日志功能
sync_binlog = 1                #可保證事務日志及時寫入磁盤文件
skip-name-resolve              #禁用DNS反向解析,如不寫此項,則需要在各節點基于主機名通信
read_only       = 1  

[root@node1 ~]# service mysqld start

授權可用復制用戶記錄二進制日志位置

1.jpg

DB2配置

[root@node2 ~]# vim /etc/mysql/my.cnf 

datadir = /mydata/data
log-bin=/mydata/binlogs/master-bin       
relay-log=/mydata/relaylogs/relay-bin    
binlog_format=mixed
server-id       = 11
auto_increment_offset=2          
auto_increment_increment=2      
log_slave_updates = 1            
sync_binlog = 1  
skip-name-resolve
read_only       = 1

[root@node2 ~]# service mysqld start

授權可用復制用戶記錄二進制日志位置

1.jpg

#因為實驗之前都做了完整初始化,這里二進制文件位置一致

DB3配置

[root@scholar ~]# vim /etc/mysql/my.cnf 

datadir = /mydata/data
relay-log=/mydata/relaylogs/relay-bin
server-id       = 111
read_only       = 1
skip-name-resolve

[root@scholar ~]# service mysqld start

連接各服務器

DB1連接DB2

2.jpg

DB2連接DB1

3.jpg

DB3連接DB1

4.jpg

主從測試

#DB1創建數據庫
MariaDB [(none)]> create database testdb;
Query OK, 1 row affected (0.14 sec)

#DB2創建表
MariaDB [(none)]> create table testdb.tb1(name char(20) not null);
Query OK, 0 rows affected (0.19 sec)

#DB3查看數據
MariaDB [(none)]> show tables in testdb;
+------------------+
| Tables_in_testdb |
+------------------+
| tb1              |
+------------------+
1 row in set (0.13 sec)

數據一致,主從復制部分完成

MMM配置

安裝所需程序包

[root@node1 ~]# yum install mysql-mmm* -y

#在所有節點安裝mysql-mmm包組

授權監控及代理用戶

5.jpg

#DB節點全部需要授權,在一個節點授權即可

Monitor配置

[root@scholar ~]# vim /etc/mysql-mmm/mmm_common.conf 

active_master_role      writer

<host default>
    cluster_interface       eth0
    pid_path                /var/run/mysql-mmm/mmm_agentd.pid
    bin_path                /usr/libexec/mysql-mmm/
    replication_user        repluser        #復制用戶
    replication_password    replpass        #復制用戶密碼
    agent_user              mmm_agent       #代理用戶
    agent_password          agent_passw     #代理用戶密碼
</host>

<host db1>
    ip      172.16.10.123
    mode    master
    peer    db2
</host>

<host db2>
    ip      172.16.10.124
    mode    master
    peer    db1
</host>

<host db3>
    ip      172.16.10.125
    mode    slave
</host>

<role writer>           #可寫節點
    hosts   db1, db2
    ips     172.16.10.30
    mode    exclusive   #互斥角色只有一個ip,同一時間只能分配給一個主機
</role>

<role reader>           #可讀節點
    hosts   db1, db2, db3
    ips     172.16.10.31,172.16.10.32,172.16.10.33
    mode    balanced    #負載均衡角色可以有多個IP,這些IP被均衡的分配給多個主機
</role>
#將以上文件同步到DB1-DB3節點
[root@scholar ~]# scp /etc/mysql-mmm/mmm_common.conf 172.16.10.123:/etc/mysql-mmm/
mmm_common.conf                                          100%  776     0.8KB/s   00:00 
[root@scholar ~]# scp /etc/mysql-mmm/mmm_common.conf 172.16.10.124:/etc/mysql-mmm/
mmm_common.conf                                          100%  776     0.8KB/s   00:00 
[root@scholar ~]# scp /etc/mysql-mmm/mmm_common.conf 172.16.10.125:/etc/mysql-mmm/
mmm_common.conf                                          100%  776     0.8KB/s   00:00
[root@scholar ~]# vim /etc/mysql-mmm/mmm_mon.conf

include mmm_common.conf

<monitor>
    ip                  127.0.0.1
    pid_path            /var/run/mysql-mmm/mmm_mond.pid
    bin_path            /usr/libexec/mysql-mmm
    status_path         /var/lib/mysql-mmm/mmm_mond.status
    ping_ips            172.16.10.123,172.16.10.124,172.16.10.125 #監控主機
    auto_set_online     60

    # The kill_host_bin does not exist by default, though the monitor will
    # throw a warning about it missing.  See the section 5.10 "Kill Host
    # Functionality" in the PDF documentation.
    #
    # kill_host_bin     /usr/libexec/mysql-mmm/monitor/kill_host
    #
</monitor>

<host default>
    monitor_user        mmm_monitor    #監控用戶
    monitor_password    monitor_pass   #監控密碼
</host>

debug 0

DB1-DB3配置

[root@node1 ~]# vim /etc/mysql-mmm/mmm_agent.conf

include mmm_common.conf

# The 'this' variable refers to this server.  Proper operation requires 
# that 'this' server (db1 by default), as well as all other servers, have the 
# proper IP addresses set in mmm_common.conf.
this db1

#DB1-DB3根據自身實際角色修改此配置文件(db1,db2,db3)

啟動服務

#在各監控節點啟動mmm-agent服務
[root@node1 ~]# service mysql-mmm-agent start
Starting MMM Agent Daemon:                                 [  OK  ]
#在Monitor上啟動mmm-monitor服務
[root@scholar ~]# service mysql-mmm-monitor start
Starting MMM Monitor Daemon:                               [  OK  ]

查看當前狀態

6.jpg

查看各節點VIP狀態

#以db1為例

7.jpg

高可用測試

模擬db1故障,查看節點狀態

8.jpg

再看db1的VIP狀態

9.jpg

VIP已被轉移到其他節點,其他方面有興趣請自行測試,這里就不一一展示了

The end

MySQL/MariaDB基于MMM實現讀寫分離及高可用實驗就先說到這里了,有興趣的朋友可以繼續探究基于Keepalived實現Monitor的高可用,這里就不做深究了,實驗過程中遇到問題可留言交流。以上僅為個人學習整理,如有錯漏,大神勿噴~~~

原創文章,作者:書生,如若轉載,請注明出處:http://www.www58058.com/5598

(0)
書生書生
上一篇 2015-06-23
下一篇 2015-06-24

相關推薦

  • Python

    Python中os和shutil模塊
    csv文件和ini文件簡介

    Linux干貨 2017-10-30
  • 利用DNS和SAMBA實現web站點的簡單高可用

    本文通過DNS綁定兩臺主機的IP地址到一個URL,然后后臺samba服務器提供站點文件,此處以wordpress為例。這樣當有一臺服務器httpd服務出現故障的時候不至于造成站點無法訪問,而且站點數據和mysql數據庫數據位于后臺samba服務器,另一臺服務器直接從samba服務器獲取站點文件和數據庫數據,不會造成數據的不一致。 一、實驗環境: 三臺主機ip…

    2017-06-06
  • 第十七周作業

    1、結合圖形來描敘LVS的工作原理; 工作原理 LVS分為兩個組件:ipvs和ipvsadm         ipvs:工作于內核空間,主要用于使用戶定義的策略生效;         ipvsadm : 工作于用戶空間,主要用于用戶定義和管理集群服務…

    2017-06-27
  • Java中的Map List Set等集合類

    Map List Set等集合類: 一、概述 在JAVA的util包中有兩個所有集合的父接口Collection和Map,它們的父子關系: +Collection 這個接口extends自 –java.lang.Iterable接口 ├+List(接口 代表有序,可重復的集合。列表) │├ ArreyList   &…

    Linux干貨 2015-04-07
  • http加速器varnish

    一、web緩存概述       緩存,又稱加速器,用于加速運行速度較快的設備與較慢設備之間的通信。基于程序的運行具有局部性特征其能實現加速的功能:       時間局部性:一個數據被訪問之后,在隨后較短的時間內有可能被訪問。   &nbsp…

    2016-11-18
  • python分支循環和列表

    if語句 if condition: 代碼塊 condition必須是一個bool類型,這個地方有一個隱式轉換bool(condition) if 1<2: print(‘1 less than 2’)   循環——while語句 while condition: block 當條件滿足即condition為True,…

    2018-03-27

評論列表(1條)

  • hjqjk
    hjqjk 2015-11-30 16:02

    寫的很詳細,我說一下我在配置的過程中遇到的一個很低級的問題吧:
    配置文件中:
    mode exclusive
    mode balanced
    monitor_user mmm_monitor
    monitor_password monitor_pass

    這些參數后邊不能加“#”做注釋的,否則會有問題,可以用 mmm_control checks 檢查一下。

欧美性久久久久