MySQL-MMM實現MySQL高可用讀寫分離

實驗環境

實驗拓撲

2016-06-01_155200.png

主機配置環境說明

主機名 IP地址 角色/用途 MySQL Server_ID
master1 192.168.80.101 MySQL主節點,可讀寫操作 11
master2 192.168.80.102 MySQL備節點,可讀寫操作 12
slave1 192.168.80.103 MySQL從節點,僅能讀 13
slave2 192.168.80.104 MySQL從節點,僅能讀 14
monitor 192.168.80.105 MMM管理端

虛擬IP環境說明

虛擬IP地址 用途 說明
192.168.80.200 寫操作 有點類似VIP,該IP會在正常主節點上使用,那么此時只有主節點能寫操作
192.168.80.201 讀操作 將多個具有讀操作的讀虛擬IP應用到各從節點及主、備節點,能分擔讀操作??梢酝ㄟ^LVS、HAProxy對讀VIP進行負載均衡
192.168.80.202 讀操作 將多個具有讀操作的讀虛擬IP應用到各從節點及主、備節點,能分擔讀操作??梢酝ㄟ^LVS、HAProxy對讀VIP進行負載均衡
192.168.80.203 讀操作 將多個具有讀操作的讀虛擬IP應用到各從節點及主、備節點,能分擔讀操作??梢酝ㄟ^LVS、HAProxy對讀VIP進行負載均衡
192.168.80.204 讀操作 將多個具有讀操作的讀虛擬IP應用到各從節點及主、備節點,能分擔讀操作。可以通過LVS、HAProxy對讀VIP進行負載均衡

MySQL部署工作

安裝MySQL

各節點部署MySQL 5.5.36 
下面演示master1節點部署MySQL

[root@master1 local]# groupadd -r mysql    # 創建mysql組
[root@master1 local]# useradd -g mysql -r mysql  #創建mysql用戶
[root@master1 ~]# tar xf mariadb-5.5.36-linux-x86_64.tar.gz -C /usr/local/  # 將程序包解壓至對應的路徑下
[root@master1 ~]# cd /usr/local/
[root@master1 local]# ln -s mariadb-5.5.36-linux-x86_64/ mysql  #創建軟連接
[root@master1 local]# chown -R root.mysql mysql/*    #將mysql目錄下所有的文件及文件夾賦權
[root@master1 local]# cd mysql/
[root@master1 mysql]# mkdir /etc/mysql/
[root@master1 mysql]# cp support-files/my-large.cnf /etc/mysql/my.cnf  #拷貝配置文件至指定路徑
[root@master1 mysql]# vim /etc/mysql/my.cnf  #修改配置文件,在mysqld字段下修改和增加下面參數
datadir=/mydata/data   #mysql 的數據目錄
read_only = 1         #設置所有的mysql都只是只讀模式
#備注:read_only參數對超級管理權限的用戶無效
log-bin=/mydata/binlogs/master1-bin  #設置二進制日志路徑(建議)
server-id       = 11    #設置不同的server-id,目的是為了防止環回復制
relay-log       = /mydata/relaylogs/relay-log  # 設置中繼日志路徑
[root@master1 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld  #復制腳本文件至指定的路徑
[root@master1 mysql]# chmod +x /etc/rc.d/init.d/mysqld # 為腳本文件賦執行權限
[root@master1 mysql]# chkconfig mysqld on   #設置開機自動啟動
[root@master1 ~]# mkdir -pv /mydata/{data,relaylogs,binlogs}  #創建數據文件、中繼日志、二進制日志文件的文件夾
[root@master1 ~]# chown mysql.mysql /mydata/*  # 為每個文件夾賦權
[root@master1 mysql]# ./scripts/mysql_install_db --datadir=/mydata/data  #初始化mysql
[root@master1 mysql]# service mysqld start  #啟動服務
[root@master1 mysql]# vim /etc/profile.d/mysql.sh   #由于默認PATH環境沒有mysql客戶端腳本,所以修改環境變量
export PATH=/usr/local/mysql/bin:$PATH
[root@master1 mysql]# source /etc/profile.d/mysql.sh  #讓配置的環境變量立即生效

使用相同的二進制安裝mysql的方式安裝 master2、slave1、slave2服務器,注意,mysql配置文件中的my.cnf中的“server-id”一定要修改,否則造成環回復制。Slave1和slave2中的二進制日志可以關閉,因為從節點無需被其他從節點復制,所以關閉可以節省I/O壓力。

創建復制賬號權限

在master1和master2創建擁有復制的權限的賬號和密碼

MariaDB [(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO repluser@'192.168.80.%' IDENTIFIED BY 'replp@ss';

設置各節點復制指向主節點

1、查看主節點master1的二進制日志的位置

MariaDB [(none)]> SHOW MASTER STATUS;

1464768995471.png

2、將復制的主節點指向master1,包括master2,slave1,slave2。而將master1復制主節點指向master2。

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.80.101',MASTER_USER='repluser',MASTER
_PASSWORD='replp@ss',MASTER_LOG_FILE='master1-bin.000004',MASTER_LOG_POS=421;

3、上述配置在每個節點配置完成后,每個節點開啟復制進程

MariaDB [(none)]> START SLAVE;

4、查看從節點的狀態

1464769119568.png

主要留意”Slave_IO_Running”和“Slave_IO_Running” 是否處于“Yes”狀態

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

測試復制功能

在主節點master1上創建testdb數據庫,用于測試各節點復制功能是否正常

MariaDB [(none)]> CREATE DATABASE testdb;
MariaDB [(none)]> SHOW DATABASES;

1464769170939.png

再各節點使用命令“SHOW DATABASES”查看,是否已經復制成功。如果各節點均能查看到此數據庫,表示復制正常。

在MMM服務器安裝MMM套件

1、配置好epel源

[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
[epel-debuginfo]
name=Extra Packages for Enterprise Linux 6 - $basearch - Debug
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch/debug
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-6&arch=$basearch
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

2、monitor安裝所有mmm套件

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

3、安裝完后的配置文件說明

默認配置文件目錄為/etc/mysql-mmm

  • mmm_mon.conf:定義監控參數,只需在服務器端配置

  • mmm_common.conf: 設置讀、寫節點的IP及配置虛擬,每個節點均需一樣

  • mmm_agent.conf:設置每個節點的標識

4、修改mmm_common.conf配置文件

[root@monitor mysql-mmm]# vim mmm_common.conf
active_master_role      writer   #前面安裝mysql時,設定read_only=1參數,而這里的參數是MMM是判斷某個節點狀態,會自動在可寫的節點上設置“set global read_only=0”,那么此時就打開了寫的權限,而其他還是只讀的狀態
<host default>                  #定義默認主機信息
   cluster_interface       eth0   #配置的網絡接口
   pid_path                /var/run/mysql-mmm/mmm_agentd.pid   #pdi文件路徑
   bin_path                /usr/libexec/mysql-mmm/     # MMM可執行文件路徑
   replication_user        repluser    # 擁有復制權限的賬號
   replication_password    replp@ss   # 擁有復制權限的密碼
   agent_user              mmm_agent   # 更改只讀操作用戶的賬號
   agent_password          agent_password  #更改只讀操作用戶的密碼
</host>
<host db1>                  #設置db1的配置信息,該名字在mmm_agent.conf中間中定義
   ip      192.168.80.101    # db1的物理IP地址
   mode    master          # db1角色,可選有master 和 slave
   peer    db2             # 設置與db1對等的主機名,表示db1和db2均為master角色
</host>
<host db2>
   ip      192.168.80.102
   mode    master
   peer    db1
</host>
<host db3>
   ip      192.168.80.103
   mode    slave        # 設置db3的角色為 slave
</host>
<host db4>
   ip      192.168.80.104
   mode    slave
</host>
<role writer>                   #設置具有可寫mysql操作的角色模式
   hosts   db1, db2          # 指定可具有寫操作的主機
   ips     192.168.80.200    # 具有寫操作的虛擬IP地址
   mode    exclusive        # 設置角色的模式為互斥,表示同一時間,只有一臺主機具有此IP
</role>
<role reader>                   # 設置具有可讀操作的角色模式
hosts   db1,  db2,  db3, db4  # 指定可讀操作的主機
ips     192.168.80.201, 192.168.80.202, 192.168.80.203, 192.168.80.204.   #指定可讀操作的虛擬IP地址
mode    balanced            # 負載均衡模式,上面指定的虛擬IP地址會均衡廢品到各只讀操作的主機上。這類表示輪訓
</role>

5、將mmm_common.conf配置文件拷貝到各節點上

[root@monitor mysql-mmm]# scp mmm_common.conf 192.168.80.101:/etc/mysql-mmm/
[root@monitor mysql-mmm]# scp mmm_common.conf 192.168.80.102:/etc/mysql-mmm/
[root@monitor mysql-mmm]# scp mmm_common.conf 192.168.80.103:/etc/mysql-mmm/
[root@monitor mysql-mmm]# scp mmm_common.conf 192.168.80.104:/etc/mysql-mmm/

6、配置mmm_mon.conf配置文件

[root@monitor mysql-mmm]# vim mmm_mon.conf
include mmm_common.conf
<monitor>
   ip                  127.0.0.1    # 僅在本地監聽,為了使安全,mmm_mond默認監聽的端口是99988
   pid_path            /var/run/mysql-mmm/mmm_mond.pid  #PDI文件位置
   bin_path            /usr/libexec/mysql-mmm              # 可執行文件位置
   status_path         /var/lib/mysql-mmm/mmm_mond.status   # 集群狀態文件
ping_ips            192.168.80.101, 192.168.80.102, 192.168.80.103, 192.168.80.104, 192.168.80.1
#用于測試可用性的IP地址清單
   auto_set_online     60      # 是否自動上線,如果此值大于0,表示抖動的主機在抖動范圍后,會自動上線。抖動時間范圍是3600s
   # 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 user的賬號
   monitor_password    monitor_password    # monitor password密碼
</host>
debug 0

安裝MySQL MMM 客戶端

1、 使用上面的方法各節點配置好epel源 
2、各節點安裝mysql-mmm-agent

[root@slave2 mysql]# yum -y install mysql-mmm-agent

3、在各節點上創建下列兩個賬號

  • Monitor user賬號:用于MMM管理服務器對MySQL服務器做健康狀態檢查

  • Monitor agent賬號:用于切換只讀模式和同步master信息

MariaDB [(none)]> GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.80.%' IDENTIFIED BY 'monitor_password';
MariaDB [(none)]> GRANT SUPER,REPLICATION CLIENT,PROCESS ON *.* TO 'mmm_agent'@'192.168.80.%' IDENTIFIED BY 'agent_password';

4、配置mysql-mmm-agent

[root@master1 ~]# vim /etc/default/mysql-mmm-agent
# mysql-mmm-agent defaults
ENABLED=1       # 表示agent是否啟用狀態

5、配置mmm_agent.conf

[root@master1 mysql-mmm]# vim mmm_agent.conf
include mmm_common.conf
this db1      # mmm_common.conf中標識的名稱,那么剩余的節點名稱分別為db2,db3,db4,請根據要求再各節點上進行修改,這里不再詳細列舉。

啟動MMM服務,并查看MMM集群狀態

1、MMM服務端的服務為 mysql-mmm-monitor,在服務端啟動服務,并設置開機自動啟動

[root@monitor ~]# service mysql-mmm-monitor start
[root@monitor ~]# chkconfig mysql-mmm-monitor on

2、MMM客戶端的服務為 mysql-mmm-agent,再各節點啟動服務,并設置開機自動啟動

[root@master1 mysql-mmm]# service mysql-mmm-agent start
[root@master1 ~]# chkconfig mysql-mmm-agent on

3、mmm_control命令介紹

在安裝MMM后,可以通過mmm_contril管理MMM集群,MMM集群的運行日志一般保存在/var/log/mysql_mmm目錄下,下面介紹mmm_control使用

[root@monitor ~]# mmm_control mode
   help                              #顯示幫助信息
   ping                              #測試網絡運行狀態
   show                             #顯示MMM節點的狀態
   checks [<host>|all [<check>|all]] - show checks status  #顯示MMM集群中指定節點/所有節點的狀態
   set_online <host>                 # 將某個節點設置為online狀態
   set_offline <host>                 # 將某個節點設置為offline狀態
   mode                           #顯示MMM運行模式
   set_active                        #切換MMM集群為active模式.
   set_manual                       #切換MMM集群為manual模式.
   set_passive                       #切換MMM集群為passive模式.
   move_role [--force] <role> <host> - move exclusive role <role> to host <host>
                                   # 在互斥模式下切換角色  
   set_ip <ip> <host>                #在被動模式下操作角色

4、mmm_control checks all顯示所有節點詳細運行狀態

[root@monitor ~]# mmm_control checks all

 1464769998007.png5、查看集群運行狀態

[root@monitor ~]# mmm_control checks all

1464770127661.png

集群節點的狀態有以下幾種

  • ONLINE:表示節點運行正常,處于在線狀態

  • ADMIN_OFFLINE:表示節點是管理員關閉的

  • HARD_OFFLINE:表示節點處于離線狀態,有可能是因為MMM集群測試ping時失敗或檢測MySQL失敗而切換的一種狀態

  • AWAITING_RECOVERY:表示等待恢復狀態,若集群mode設置是active運行模式,那么此狀態會自動回復到ONLINE狀態

  • REPLICATION_FAIL:表示主從復制失敗狀態,一般是復制主線程(IO線程)沒有運行

  • REPLICATION_DELAY:表示復制日志有延時,一般由于檢查日志失敗導致。

創建允許mysql用戶

在主節點上創建mysql用戶,允許讓客戶端能允許訪問mysql

MariaDB [(none)]> CREATE USER pangxie1@192.168.80.107 IDENTIFIED BY 'redhat';
MariaDB [(none)]> GRANT CREATE ON *.* TO pangxie1@192.168.80.107;

測試MMM實現MySQL高可用

測試寫操作

1、在主節點master1上查看IP地址

[root@master1 ~]# ip addr
#可以看到write IP位于主節點master1上

1464770871972.png

2、使用客戶端mysql-client連接寫節點的VIP

[root@mysql-client ~]# mysql -u pangxie1 -h 192.168.80.200 -p

3、創建數據庫

mysql> CREATE DATABASE pangxiedb;
Query OK, 1 row affected (0.01 sec)

4、查看創建完成后的數據庫列表

mysql> SHOW DATABASES;

1464770923463.png

5、查看此時連入的mysql主機名稱

mysql> SHOW VARIABLES LIKE "%hostname%";
#可以看到,Write IP對應的VIP是主節點master1上

1464770943342.png

6、在其他從節點上查看數據庫列表,可以看到此時其他的從節點能復制主節點新創建的數據庫。

測試讀操作

1、使用客戶端mysql-client連接讀權限的VIP

[root@mysql-client ~]# mysql -u pangxie1 -h 192.168.80.201 –p

2、查看數據庫表

1464771034716.png

3、查看當前mysql主機名

mysql> SHOW VARIABLES LIKE "%hostname%";

1464771160108.png

4、測試寫操作

mysql> CREATE DATABASE testdb1;
#可以看到是無法寫操作的

1464771184468.png

模擬主節點故障

1、在主節點master1關閉mysql服務

[root@master1 ~]# service mysqld stop

2、在monitor上查看各節點狀態

[root@monitor ~]# mmm_control show
# 可以看到主節點master1已經檢測到為OFFLINE

1464771226859.png

3、在從節點slave1上查看從節點狀態

MariaDB [(none)]> SHOW SLAVE STATUS\G
#可以看到從節點已經將主服務器指向備節點

1464771280112.png

4、在備節點master2查看IP地址

[root@master2 ~]# ip addr

1464771302070.png

5、在備節點master2創建MS2db數據庫,然后再次查看數據庫列表

1464771313881.png

6、使用mysql-client使用上面的方法,再次測試讀寫操作,結果和預想一致。

模擬故障恢復

1、在主節點master1啟動mysqld服務

[root@master1 ~]# service mysqld start
Starting MySQL.. SUCCESS!

2、在monitor重新查看節點狀態

[root@monitor ~]# mmm_control show
#經過一段時間后,master1節點恢復ONLINE狀態。

1464771357841.png

至此,MySQL-MMM實現MySQL的高可用就配置完成。

需要注意地方及建議

1、 在配置MySQL時,需要留意Server-id,一定要保證各節點的Server-id不一致,否則會導致出現環回復制的情況,這種情況一般是在實現雙主模型時出現 
2、 數據文件、二進制日志文件、中繼日志文件建議最好是分開存放,或者說是獨立存放,不使用默認路徑。二進制日志在MySQL復制中尤為重要。 
3、 為保證數據不出現腦裂情況,要在mysql配置文件中my.cnf的mysqld中配置“read_only=1”,設置此項目的就是為了防止腦裂。 
4、如果使用到iptables,請記得放行mysql的端口,以及IO進程訪問主服務器端的端口。

原創文章,作者:螃蟹,如若轉載,請注明出處:http://www.www58058.com/17323

(0)
螃蟹螃蟹
上一篇 2016-06-01
下一篇 2016-06-03

相關推薦

  • 面授20-1班 0805課間練習與課后作業

    課間練習 第一階段 新學的命令文本命令cat tac rev more less head tail cut paste wc sort dif patch 1 、找出ifconfig 命令結果中本機的所有IPv4 地址 [root@IP70-CentOS7 ~]# >>ifconfig | tr&nbsp…

    Linux干貨 2016-08-07
  • 初識Linux

                              初認識Linux 1.1 Linux的登錄界面 在虛擬機安裝CentOS 7中有提到,我在安裝Linux操作系統的時候,采用的是命令行界面的登錄方式,當然也有像Windows那樣…

    Linux干貨 2016-10-27
  • LB Cluster:lvs

    Linux Cluster: Cluster:計算機集合,為解決某個特定問題組合起來形成的單個系統; Linux Cluster類型: LB:Load Balancing,負載均衡; HA:High Availiablity,高可用; A=MTBF/(MTBF+MTTR) (0,1):90%, 95%, 99%, 99.5%, 99.9%, 99.99%, …

    Linux干貨 2017-06-24
  • Linux用戶和組管理(第三周)

    第三周作業 1.列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可 [root@localhost ~]# who | cut -d" " -f1 | sort | uniq 2.取出最后登錄到當…

    Linux干貨 2016-09-15
  • 編程語言編年史

          我們都知道,編程語言是一組用來定義計算機程序的語法規則。它是一種被標準化的交流語言,用來向計算機發出指令。一種計算機語言讓程序員能夠準確地定義計算機所需要使用的數據,并精確地定義在不同情況下所應當采取的行動。盡管人們多次試圖創造一種通用的程序設計語言,卻沒有一次嘗試是成功的。之所以有那么多種不同的編程語言存在的原因是…

    Linux干貨 2017-03-30
  • Bashe Shell之數組及bash配置文件解析

    數組   數據結構,數據序列,保存了連續的多個數據,可以使用索引獲取相關元素,相當于多個變量的集合   §數組名和索引 索引:編號從0開始,屬于數值索引   注意:所以可支持使用自定義的格式,而不僅是數值格式,即關聯索引,bash4.0版本之后開始支持,bash的數組支持稀疏格式(索引不連續)   §聲明數組 &nbs…

    Linux干貨 2016-08-24

評論列表(2條)

  • Net20_赤羽
    Net20_赤羽 2016-06-16 11:00

    可以方便指導下么,我做mysql主從+讀寫分離遇到點問題? 留個QQ

欧美性久久久久