實驗環境
實驗拓撲
主機配置環境說明
主機名 | 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;
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、查看從節點的狀態
主要留意”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;
再各節點使用命令“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
5、查看集群運行狀態
[root@monitor ~]# mmm_control checks all
集群節點的狀態有以下幾種
-
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上
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;
5、查看此時連入的mysql主機名稱
mysql> SHOW VARIABLES LIKE "%hostname%";
#可以看到,Write IP對應的VIP是主節點master1上
6、在其他從節點上查看數據庫列表,可以看到此時其他的從節點能復制主節點新創建的數據庫。
測試讀操作
1、使用客戶端mysql-client連接讀權限的VIP
[root@mysql-client ~]# mysql -u pangxie1 -h 192.168.80.201 –p
2、查看數據庫表
3、查看當前mysql主機名
mysql> SHOW VARIABLES LIKE "%hostname%";
4、測試寫操作
mysql> CREATE DATABASE testdb1;
#可以看到是無法寫操作的
模擬主節點故障
1、在主節點master1關閉mysql服務
[root@master1 ~]# service mysqld stop
2、在monitor上查看各節點狀態
[root@monitor ~]# mmm_control show
# 可以看到主節點master1已經檢測到為OFFLINE
3、在從節點slave1上查看從節點狀態
MariaDB [(none)]> SHOW SLAVE STATUS\G
#可以看到從節點已經將主服務器指向備節點
4、在備節點master2查看IP地址
[root@master2 ~]# ip addr
5、在備節點master2創建MS2db數據庫,然后再次查看數據庫列表
6、使用mysql-client使用上面的方法,再次測試讀寫操作,結果和預想一致。
模擬故障恢復
1、在主節點master1啟動mysqld服務
[root@master1 ~]# service mysqld start
Starting MySQL.. SUCCESS!
2、在monitor重新查看節點狀態
[root@monitor ~]# mmm_control show
#經過一段時間后,master1節點恢復ONLINE狀態。
至此,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
可以方便指導下么,我做mysql主從+讀寫分離遇到點問題? 留個QQ
@Net20_赤羽:大家互相學習,我QQ是 835387292