1. 程式人生 > >mysql-mmm架構深度詳解

mysql-mmm架構深度詳解

Mysql-mmm架構深度解讀:

主機名:            ip:           vip

mysql_monitor     172.18.3.183    

mysql_master01    172.18.3.185        172.18.3.189(write)

mysql_master02    172.18.3.186        172.18.3.190 (read)

mysql_slave01      172.18.3.187                 172.18.3.191 (read)

 

(1)在所有主機上配置/etc/hosts中新增:

172.18.3.185    mysql_master01

172.18.3.186    mysql_master02

172.18.3.187    mysql_slave01

172.18.3.183    mysql_monitor

(2)首先在3臺主機上安裝mysql和搭建複製(185和186互為主從,187為185的從)

vi/etc/my.cnf 修改兩處地方

log-bin=mysql-bin     去掉註釋
server-id = 2         每個主機的id不能重複

將186設定為185的從:

 登入資料庫,在172.18.3.185上新建授權使用者:
MySQL> grant replication slave on *.* to 'epel'@'%' identified by '123456';
MySQL>flush privileges;
MySQL> show master status;(得出一下結果)
+------------------+----------+--------------+------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| MySQL-bin.000003 |      374|             |                 |
+------------------+----------+--------------+------------------+
mysql-bin.00003就是我們要開始同步的檔案,374就是初始位置。


登入到172.18.3.186,把172.18.3.185設定成自己的主伺服器
MySQL>Change master to master_host='172.18.3.185',master_user='replication',master_password='replication',master_log_file='MySQL-bin.000003',master_log_pos=374;(注意Mysql-bin.000003的大小寫)
MySQL> start slave;

MySQL> show slave status/G; 檢視同步狀態(Slave_IO_Running:Yes和Slave_SQL_Running: Yes一定要為YES)

如果做簡單的一主一從的話,到這裡就可以了,已經完成了;如果要兩個伺服器互為主從的話,要在172.18.3.185上做相同的設定

如果主資料庫有資料的話

資料庫鎖表操作,不讓資料再進行寫入動作。mysql> FLUSH TABLES WITH READ LOCK ;

至此,mysql雙機互為主從設定完畢。

 (3)配置my.cnf

172.18.3.185上:

 server-id       = 1

log_slave_updates = 1

auto-increment-increment = 2

auto-increment-offset = 1

172.18.3.186上:

 server-id       = 2

log_slave_updates = 1

auto-increment-increment = 2

auto-increment-offset = 2

 172.18.3.187上:

 server-id       = 3

log_slave_updates = 1

(4)安裝mysql-mmm 及相關依賴

執行如下指令碼install.sh

 #!/bin/bash

yum install gcc -y           #安裝gcc

yum install perl* -y         #安裝perl依賴包

wget http://xrl.us/cpanm --no-check-certificate  

mv cpanm/usr/bin

chmod 755 /usr/bin/cpanm

cat >/root/list << EOF

install Algorithm::Diff

install Class::Singleton

install DBI

install DBD::mysql

install File::Basename

install File::stat

install File::Temp

install Log::Dispatch

install Log::Log4perl

install Mail::Send

install Net::ARP

install Net::Ping

install Proc::Daemon

install Thread::Queue

install Time::HiRes

EOF

for package in `cat /root/list`

do

cpanm $package

done

#安裝mysql-mmm

wget http://mysql-mmm.org/_media/:mmm2:mysql-mmm-2.2.1.tar.gz

mv :mmm2:mysql-mmm-2.2.1.tar.gz mysql-mmm-2.2.1.tar.gz

tar xf mysql-mmm-2.2.1.tar.gz

 cd  mysql-mmm-2.2.1

make install

到這裡已經完成了MMM的基本需求,接下來需要配置具體的配置檔案,其中mmm_common.conf,mmm_agent.conf為agent端的配置檔案,mmm_mon.conf為monitor端的配置檔案。

(5)配置mmm檔案

[[email protected]_master01 ~]# cat  /etc/mysql-mmm/mmm_common.conf

active_master_role      writer

<host default>

        cluster_interface               br0

       pid_path                               /var/run/mmm_agentd.pid

        bin_path                               /usr/lib/mysql-mmm/

    replication_user        epel

    replication_password    123456

        agent_user                              mmm_agent

        agent_password                  mmm_agent

</host>

<host mysql_master01>

        ip                                             172.18.3.185

        mode                                    master

        peer                                   mysql_master02

</host>

<host mysql_master02>

        ip                                             172.18.3.186

        mode                                    master

        peer                                    mysql_master01

</host>

<host mysql_slave01>

        ip                                             172.18.3.187

        mode                                    slave

</host>

<role writer>

        hosts                                  mysql_master01,mysql_master02

        ips                                            172.18.3.189

        mode                                    exclusive

</role>

<role reader>

        hosts                                    mysql_master02,mysql_slave01

        ips                                            172.18.3.190,172.18.3.191

        mode                                    balanced

</role>

[[email protected]_master01 ~]#

其中replication_user用於檢查複製的使用者,agent_user為agent的使用者,mode標明是否為主或者備選主,或者從庫。mode exclusive主為獨佔模式,同一時刻只能有一個主,<role write>中hosts表示目前的主庫和備選主的真實主機ip或者主機名,ips為對外提供的虛擬機器ip地址,<role readr>中hosts代表從庫真實的ip和主機名,ips代表從庫的虛擬ip地址。

由於其他主機也要配置agent配置檔案,我們直接把mmm_common.conf從185拷貝到186和187兩臺主機的/etc/mysql-mmm下。

配置172.18.3.185:

[[email protected]_master01 ~]# cat /etc/mysql-mmm/mmm_agent.conf

include mmm_common.conf

this mysql_master01

配置172.18.3.186:

[[email protected]_master02 tmp]# cat /etc/mysql-mmm/mmm_agent.conf

include mmm_common.conf

this mysql_master02

配置172.18.3.187:

[[email protected]_slave01 tmp]# cat /etc/mysql-mmm/mmm_agent.conf

include mmm_common.conf

this mysql_slave01

配置172.18.3.183:

[[email protected]_monitor mysql-mmm]# cat /etc/mysql-mmm/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.18.3.185,172.18.3.186,172.18.3.187

        auto_set_online                         10

</monitor>

<host default>

        monitor_user                    mmm_monitor

        monitor_password                mmm_monitor

</host>

debug 0

[[email protected]_monitor mysql-mmm]#

(6)建立監控使用者,這裡需要建立3個監控使用者,具體描述如下:

使用者名稱         描述                                                   許可權

monitor user       MMM的monitor端監控所有的mysql資料庫的狀態使用者           REPLICATION CLIENT

agent user              主要是MMM客戶端用於改變的master的read_only狀態使用者      SUPER,REPLICATION CLIENT,PROCESS

repl                    用於複製的使用者                                         REPLICATION SLAVE

在3臺伺服器進行授權,因為我之前的主主複製,以及主從已經是ok的,所以我在其中一臺伺服器執行就ok了。用於複製的賬號之前已經有了,所以這裡就授權兩個賬號。

複製程式碼

mysql> GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO'mmm_agent'@'%'   IDENTIFIED BY'mmm_agent';

Query OK, 0 rows affected (0.08 sec)

mysql> GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'%'IDENTIFIED BY 'mmm_monitor';

Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.03 sec)

mysql>

到此安裝基本完畢

分別在185 ,186,187 上執行/etc/init.d/mysql-mmm-agent start
開啟agent,在183上執行/etc/init.d/mysql-mmm-monitor start
如果一切正常,即可在monitor上執行命令檢視監控資料
檢查整體狀態:
[[email protected]_monitor monitor]# mmm_control checks all
mysql_slave01   ping         [last change: 2016/10/16 20:31:54]  OK
mysql_slave01   mysql        [last change: 2016/10/17 16:01:01]  OK
mysql_slave01   rep_threads  [last change: 2016/10/17 15:14:49]  OK
mysql_slave01   rep_backlog  [last change: 2016/10/16 20:31:54]  OK: Backlog is null
mysql_master02  ping         [last change: 2016/10/16 20:31:54]  OK
mysql_master02  mysql        [last change: 2016/10/17 16:34:33]  OK
mysql_master02  rep_threads  [last change: 2016/10/17 15:13:25]  OK
mysql_master02  rep_backlog  [last change: 2016/10/16 20:31:54]  OK: Backlog is null
mysql_master01  ping         [last change: 2016/10/17 16:26:56]  OK
mysql_master01  mysql        [last change: 2016/10/17 16:28:20]  OK
mysql_master01  rep_threads  [last change: 2016/10/17 15:16:34]  OK
mysql_master01  rep_backlog  [last change: 2016/10/16 20:31:54]  OK: Backlog is null
顯示伺服器狀態:
[[email protected]_monitor monitor]# mmm_control show
  mysql_master01(172.18.3.185) master/ONLINE. Roles: writer(172.18.3.189)
  mysql_master02(172.18.3.186) master/ONLINE. Roles: reader(172.18.3.190)
  mysql_slave01(172.18.3.187) slave/ONLINE. Roles: reader(172.18.3.191)
檢視詳細日誌:
[[email protected]_monitor monitor]# tail -f /var/log/mysql-mmm/mmm_mond.log
實現效果:
mysql_master01(172.18.3.185) master/ONLINE. Roles:writer(172.18.3.189)
mysql_master02(172.18.3.186) master/ONLINE. Roles:reader(172.18.3.190)
mysql_slave01(172.18.3.187) slave/ONLINE. Roles: reader(172.18.3.191)
按照配置完成後,預設狀態應該是這樣,如果出現如下狀態
db2(192.168.0.32) master/AWAITING_RECOVERY. Roles:
可以執行mmm_control set_online db2開啟。
當我們的master01(185)資料庫宕機之後,在monitor上檢視日誌,
[[email protected]_monitor monitor]# tail -7f /var/log/mysql-mmm/mmm_mond.log 
2016/10/17 17:06:18  WARN Check 'rep_backlog' on 'mysql_master01' is in unknown state! Message: UNKNOWN: Connect error (host = 172.18.3.185:3306, user = mmm_monitor)! Can't connect to MySQL server on '172.18.3.185' (111)
2016/10/17 17:06:20  WARN Check 'rep_threads' on 'mysql_master01' is in unknown state! Message: UNKNOWN: Connect error (host = 172.18.3.185:3306, user = mmm_monitor)! Can't connect to MySQL server on '172.18.3.185' (111)
2016/10/17 17:06:30 ERROR Check 'mysql' on 'mysql_master01' has failed for 10 seconds! Message: ERROR: Connect error (host = 172.18.3.185:3306, user = mmm_monitor)! Can't connect to MySQL server on '172.18.3.185' (111)
2016/10/17 17:06:31 FATAL State of host 'mysql_master01' changed from ONLINE to HARD_OFFLINE (ping: OK, mysql: not OK)
2016/10/17 17:06:31  INFO Removing all roles from host 'mysql_master01':
2016/10/17 17:06:31  INFO     Removed role 'writer(172.18.3.189)' from host 'mysql_master01'
2016/10/17 17:06:31  INFO Orphaned role 'writer(172.18.3.189)' has been assigned to 'mysql_master02'
[[email protected]_monitor monitor]# mmm_control show
  mysql_master01(172.18.3.185) master/HARD_OFFLINE. Roles: 
  mysql_master02(172.18.3.186) master/ONLINE. Roles: reader(172.18.3.190), writer(172.18.3.189)
  mysql_slave01(172.18.3.187) slave/ONLINE. Roles: reader(172.18.3.191)
此時,write vip漂移到master02上,同時slave01也修改為同步master02的資料,當master01故障修好後,開啟master01,但是write vip依然不會漂移到master01,而且slave01也是依然slave於master02,因為vip一直在master02上。master01只是可以同步master02的資料,只有當master02宕機後,write vip才會漂移到master01.

相關推薦

mysql-mmm架構深度

Mysql-mmm架構深度解讀: 主機名:            ip:           vip mysql_monitor     172.18.3.183     mysql_master01    172.18.3.185        172.18.3.18

MySQL 高可用叢集架構 MHA

MHA(Master HighAvailability)目前在MySQL高可用方面是一個相對成熟的解決方案,它由日本DeNA公司youshimaton(現就職於Facebook公司)開發,是一套優秀的作為MySQL高可用性環境下故障切換和主從提升的高可用軟體。在MySQL故障

高併發架構系列:Redis快取和MySQL資料一致性方案

一、需求起因 在高併發的業務場景下,資料庫大多數情況都是使用者併發訪問最薄弱的環節。所以,就需要使用redis做一個緩衝操作,讓請求先訪問到redis,而不是直接訪問MySQL等資料庫。 這個業務場景,主要是解決讀資料從Redis快取,一般都是按照下圖的流程來進行業務操作。 讀取快取步驟

MySQL之SELECT 語句

限制 right ont 定義 過程 lar load avg sel 本文參考實驗樓的SELECT 語句詳解結合自己操作部分而寫成。 註意:大多數系統中,SQL語句都是不區分大小寫的,但是出於嚴謹和便於區分保留字和變量名,在書寫的時,保留字應大寫,而變量名應小寫。所謂的保

MySql表結構修改

參數 詳解 增加 not des reat fault sign charset 修改表的語法=========================增加列[add 列名]=========================①alter table 表名 add 列名 列類型 列參

mysql數據庫 之 自學成才1

簡化 註意 可能 方法 after 字符型 專題 mar 建議 一、學習目錄 1.認識數據庫和mysql 2.mysql連接 3.入門語句 4.詳解列類型 5.增刪改查 INSERT INTO 表名(列1,…… 列n) VALUES(值 1,…… 值 n); *(列

mysql慢查詢功能

mysql 慢查詢 優化有人的地方就有江湖,數據庫也是,sql優化這個問題,任重道遠,我們總是禁不住有爛sql。怎麽辦呢,還好各大數據庫都有相關爛sql的收集功能,而mysql的慢查詢收集也是異曲同工,配合分析sql的執行計劃,這個優化就有了搞頭了。開啟mysql慢查詢日誌1.查看當前慢查詢設置情況#查看慢查

MySQL配置文件mysql.ini參數MySQL性能優化

說明 select 磁盤 addition sock 硬盤 並發連接 查詢緩存 show my.ini(Linux系統下是my.cnf),當mysql服務器啟動時它會讀取這個文件,設置相關的運行環境參數。 my.ini分為兩塊:Client Section和Serv

15年資深架構:一個大型互聯網公司的微服務轉型實踐

微服務 架構 單片服務 微服務是一個比較大的話題,基於我的過往經歷,本文將以 Netflix 為例,分享一個大型互聯網公司如何從一個 Monolithic 的 APP 成功轉型到微服務。文章主要涉及微服務的產生歷史,應用場景,與單片服務區別,微服務帶來的技術、企業組織結構等方面挑戰,以及如何合

Dubbo架構設計

交換 所有 關心 設計 系統 約定 cep 靜態 directory Dubbo架構設計詳解 Dubbo是Alibaba開源的分布式服務框架,它最大的特點是按照分層的方式來架構,使用這種方式可以使各個層之間解耦合(或者最大限度地松耦合)。從服務模型的角度來看,Dubbo采用

mysql explain執行計劃

xtend ble 根據 order 其他 重復記錄 計劃 現在 中間 1)、id列數字越大越先執行,如果說數字一樣大,那麽就從上往下依次執行,id列為null的就表是這是一個結果集,不需要使用它來進行查詢。 2)、select_type列常見的有: A

Mysql加鎖過程

插入記錄 控制 uniq null 詳細 server 讀者 index 理論知識 1、背景   MySQL/InnoDB的加鎖分析,一直是一個比較困難的話題。我在工作過程中,經常會有同事咨詢這方面的問題。同時,微博上也經常會收到MySQL鎖相關的私信,讓我幫助解決一些死

Mysql加鎖過程(4)-select for update/lock in share mode 對事務並發性影響

per inno targe 允許 evel transacti 修改 not null warn select for update/lock in share mode 對事務並發性影響 事務並發性理解 事務並發性,粗略的理解就是單位時間內能夠執行的事務數量,常見的單

MySQL事務隔離級別

默認 多少 bcf 結構 有一個 個數 ref tle eat 轉載自: MySQL事務隔離級別詳解 SQL標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低級別的隔離級一般支持更高的並發處理,並擁有更低的系統開銷。Read

mysql優化專題」引擎(InnoDB,MyISAM)的內存優化攻略?(9)

區域 order by 順序 重做日誌 浪費 變量 效率 攻略 分區 註意:以下都是在MySQL目錄下的my.ini文件中改寫(技術文)。 一、InnoDB內存優化 InnoDB用一塊內存區域做I/O緩存池,該緩存池不僅用來緩存InnoDB的索引塊,而且也用來緩存InnoD

Mysql加鎖過程(9)-innodb下的記錄鎖,間隙鎖,next-key鎖

ans 唯一索引 crazy cimage -h insert tran 存在 gin Mysql加鎖過程詳解(1)-基本知識 Mysql加鎖過程詳解(2)-關於mysql 幻讀理解 Mysql加鎖過程詳解(3)-關於mysql 幻讀理解 Mysql加鎖過程詳解(4)-

Java動態代理 深度

實現 接下來 href 新建 結構 str 如果 cat 子類 代理模式是設計模式中非常重要的一種類型,而設計模式又是編程中非常重要的知識點,特別是在業務系統的重構中,更是有舉足輕重的地位。代理模式從類型上來說,可以分為靜態代理和動態代理兩種類型。 今天我將用非常簡單易懂的

MySQL集群搭建

F12 存在 protect 失敗 處理 大小 error 裏的 組件 概述MySQL Cluster 是MySQL 適合於分布式計算環境的高實用、可拓展、高性能、高冗余版本,其研發設計的初衷就是要滿足許多行業裏的最嚴酷應用要求,這些應用中經常要求數據庫運行的可靠性要達到9

MySQL show processlist;命令

order by 檢查 否則 操作 locked 等待 inf 可能 增加 SHOW PROCESSLIST顯示哪些線程正在運行,如果您有SUPER權限,您可以看到所有線程,否則,您只能看到您自己的線程(也就是,與您正在使用的MySQL賬戶相關的線程),如果您不使用FULL

Python-Web框架之 - 利用SQLALchemy創建與數據庫MySQL的連接, 用Flask時會遇到的一些大坑 !

mysqld 找到 兩個 數據庫增刪改查 紅色 -c 固定 web connector 經過這個小項目算是對Django與Flask這兩個web框架有了新的認識 , Django本身的輪子非常齊全 , 套路也很固定 , 新手在接觸Django框架時 , 不會陷入到處找輪子的