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

1、實驗環境

1.1、實驗拓撲

2016-06-01_155200.png

1.2、主機配置環境說明

主機名IP地址角色/用途MySQL Server_ID
master1192.168.80.101MySQL主節點,可讀寫操作11
master2192.168.80.102MySQL備節點,可讀寫操作12
slave1192.168.80.103MySQL從節點,僅能讀13
slave2192.168.80.104MySQL從節點,僅能讀14
monitor192.168.80.105MMM管理端

1.3、虛擬IP環境說明

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

2、MySQL部署工作

2.1、安裝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壓力。

2.2、創建複製賬號權限

在master1和master2創建擁有複製的權限的賬號和密碼

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

2.3、設置各節點複製指向主節點

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

2.4、測試複製功能

在主節點master1上創建testdb數據庫,用於測試各節點複製功能是否正常

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

1464769170939.png

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

3、在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

4、安裝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,請根據要求再各節點上進行修改,這裏不再詳細列舉。

5、啓動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:表示複製日誌有延時,一般由於檢查日誌失敗導致。

6、創建允許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;

7、測試MMM實現MySQL高可用

7.1、測試寫操作

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、在其他從節點上查看數據庫列表,可以看到此時其他的從節點能複製主節點新創建的數據庫。

7.2、測試讀操作

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

7.3、模擬主節點故障

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使用上面的方法,再次測試讀寫操作,結果和預想一致。

7.4、模擬故障恢復

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的高可用就配置完成。

8、需要注意地方及建議

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章