1. 程式人生 > >Mysql MHA的搭建

Mysql MHA的搭建

mha

使用環境:

實驗環境 兩從一主

四臺centos 6.7

mha manager 192.168.2.32

master 192.168.2.36

slave 192.168.2.38

slave 192.168.2.40

MAH用的用到的軟件版本號是: (註意:裝這兩個包的時候會有很多依賴包的,需要提前把epel源裝上,然後用yum 來安裝)

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo 阿裏雲的epel源

mha4mysql-manager-0.56-0.el6.noarch.rpm

mha4mysql-node-0.56-0.el6.noarch.rpm

鏈接:https://pan.baidu.com/s/1nvta8Ut 密碼:fv3b

MAH:

HA是一位日本MySQL大牛用Perl寫的一套MySQL故障切換方案,來保證數據庫系統的高可用.在宕機的時間內(通常10—30秒內),完成故障切換,部署MHA,可避免主從一致性問題,節約購買新服務器的費用,不影響服務器性能,易安裝,不改變現有部署。


先在master 和slave 做好主從,最好在其中一臺slave上做半同步!


在實驗環境裏面配置之前記得一定要把防火墻和selinux先關閉!

如果在真實環境中在iptables裏把相對應的端口開啟,否則因為這個導致你實驗不成功!

master 配置

編輯/etc/my.cnf

[mysqld]

server_id = 1

log_bin = master-bin

relay_log = realy-bin


配置好之後重啟mysqld服務

# service mysqld restart


在master上安裝半同步

mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';

開啟半同步模式;

mysql> set global rpl_semi_sync_master_enabled=1;

查看是否開啟:

mysql> show global variables like '%semi%';

+------------------------------------+-------+

| Variable_name | Value |

+------------------------------------+-------+

| rpl_semi_sync_master_enabled | ON |

| rpl_semi_sync_master_timeout | 10000 |

| rpl_semi_sync_master_trace_level | 32 |

| rpl_semi_sync_master_wait_no_slave | ON |

+------------------------------------+-------+

查看狀態

mysql> show global status like '%semi%';

+--------------------------------------------+-------+

| Variable_name | Value |

+--------------------------------------------+-------+

| Rpl_semi_sync_master_clients | 0 |

| Rpl_semi_sync_master_net_avg_wait_time | 0 |

| Rpl_semi_sync_master_net_wait_time | 0 |

| Rpl_semi_sync_master_net_waits | 0 |

| Rpl_semi_sync_master_no_times | 0 |

| Rpl_semi_sync_master_no_tx | 0 |

| Rpl_semi_sync_master_status | ON |

| Rpl_semi_sync_master_timefunc_failures | 0 |

| Rpl_semi_sync_master_tx_avg_wait_time | 0 |

| Rpl_semi_sync_master_tx_wait_time | 0 |

| Rpl_semi_sync_master_tx_waits | 0 |

| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |

| Rpl_semi_sync_master_wait_sessions | 0 |

| Rpl_semi_sync_master_yes_tx | 0 |

+--------------------------------------------+-------+

創建主從復制用到的帳號,及MHA管理用到的帳號密碼

mysql> grant replication slave, replication client on *.* to 'repluser'@'192.168.2.%' identified by '123456';

mysql> grant all on *.* to 'mhauser'@'192.168.2.%' identified by '123456';


Slave 配置 (192.168.2.38)

在/etc/my.cnf

[mysqld]

server_id = 2

relay_log = relay-bin

read_only = 1

relay_log_purge = 0

log_bin = master-bin


重啟mysqld服務

# service mysqld restart

Shutting down MySQL. [ OK ]

Starting MySQL.. [ OK ]


配置半同步slave端:

mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';

開啟半同步:

mysql> set global rpl_semi_sync_slave_enabled=1;

mysql> show global variables like '%semi%';

+---------------------------------+-------+

| Variable_name | Value |

+---------------------------------+-------+

| rpl_semi_sync_slave_enabled | ON |

| rpl_semi_sync_slave_trace_level | 32 |

+---------------------------------+-------+

連接master端的配置

mysql> change master to master_host='192.168.2.36',master_user='repluser',master_password='123456',master_log_file='master-bin.000001',master_log_pos=107;


啟動以及查看是否正常工作

mysql> start slave;

mysql> show slave status\G

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.2.36

Master_User: repluser

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: master-bin.000001

Read_Master_Log_Pos: 499

Relay_Log_File: relay-bin.000002

Relay_Log_Pos: 646

Relay_Master_Log_File: master-bin.000001

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno: 0

Last_Error:

Skip_Counter: 0

Exec_Master_Log_Pos: 499

Relay_Log_Space: 796

Until_Condition: None

Until_Log_File:

Until_Log_Pos: 0

Master_SSL_Allowed: No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

Last_IO_Errno: 0

Last_IO_Error:

Last_SQL_Errno: 0

Last_SQL_Error:

Replicate_Ignore_Server_Ids:

Master_Server_Id: 1

1 row in set (0.00 sec)


在master上查看半同步是否已經接受到客戶端了

mysql> show global status like '%semi%';

+--------------------------------------------+-------+

| Variable_name | Value |

+--------------------------------------------+-------+

| Rpl_semi_sync_master_clients | 1 |

| Rpl_semi_sync_master_net_avg_wait_time | 0 |

| Rpl_semi_sync_master_net_wait_time | 0 |

| Rpl_semi_sync_master_net_waits | 0 |

| Rpl_semi_sync_master_no_times | 0 |

| Rpl_semi_sync_master_no_tx | 0 |

| Rpl_semi_sync_master_status | ON |

| Rpl_semi_sync_master_timefunc_failures | 0 |

| Rpl_semi_sync_master_tx_avg_wait_time | 0 |

| Rpl_semi_sync_master_tx_wait_time | 0 |

| Rpl_semi_sync_master_tx_waits | 0 |

| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |

| Rpl_semi_sync_master_wait_sessions | 0 |

| Rpl_semi_sync_master_yes_tx | 0 |

+--------------------------------------------+-------+


第二臺slave配置主從復制;(192.168.2.40)

在/etc/my.cnf

[mysqld]

server_id = 2

relay_log = relay-bin

read_only = 1

relay_log_purge = 0

log_bin = master-bin

連接master端

mysql> change master to master_host='192.168.2.36',master_user='repluser',master_password='123456',master_log_file='master- bin.000001',master_log_pos=107;

查看連接信息:

mysql> show slave status\G

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.2.36

Master_User: repluser

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: master-bin.000001

Read_Master_Log_Pos: 499

Relay_Log_File: relay-bin.000003

Relay_Log_Pos: 646

Relay_Master_Log_File: master-bin.000001

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB:


在MAH manager端啟用ssh無密鑰連接各臺服務器;

# ssh-keygen -t rsa -P ''

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa):

Your identification has been saved in /root/.ssh/id_rsa.

Your public key has been saved in /root/.ssh/id_rsa.pub.

The key fingerprint is:

87:fb:6d:2e:f8:f7:72:5d:28:41:01:54:f4:48:7c:12 [email protected]

The key's randomart image is:

+--[ RSA 2048]----+

| .o=Eo |

| .+o. |

| ..o. |

| . . |

| S . . . |

| o . . .|

| .. . ..|

| ....+ . .|

| .o=o+. |

+-----------------+


本機也要一份密鑰

# cat .ssh/id_rsa.pub > .ssh/authorized_keys


修改.ssh/authorized_keys 為600權限

chmod go= .ssh/authorized_keys

把密鑰復制給其它幾個節點

# scp -p .ssh/id_rsa .ssh/authorized_keys [email protected]:/root/.ssh

# scp -p .ssh/id_rsa .ssh/authorized_keys [email protected]:/root/.ssh

# scp -p .ssh/id_rsa .ssh/authorized_keys [email protected]:/root/.ssh


然後驗證每個節點是否能正常登錄

# ssh [email protected] 'ifconfig eth0'

eth0 Link encap:Ethernet HWaddr 00:0C:29:16:44:84

inet addr:192.168.2.39 Bcast:192.168.2.255 Mask:255.255.255.0

inet6 addr: fe80::20c:29ff:fe16:4484/64 Scope:Link

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

# ssh [email protected] 'ifconfig eth0'

eth0 Link encap:Ethernet HWaddr 00:0C:29:16:44:84

inet addr:192.168.2.38 Bcast:192.168.2.255 Mask:255.255.255.0

inet6 addr: fe80::20c:29ff:fe16:4484/64 Scope:Link

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

# ssh [email protected] 'ifconfig eth0'

eth0 Link encap:Ethernet HWaddr 00:0C:29:16:44:84

inet addr:192.168.2.40 Bcast:192.168.2.255 Mask:255.255.255.0

inet6 addr: fe80::20c:29ff:fe16:4484/64 Scope:Link

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1


192.168.2.32 MAH manager :

上傳mha4mysql-manager和mha4mysql-node包 之前說過 裝這兩個會有依賴包的而且都在epel源裏面

]# yum -y install mha4mysql-*

已安裝:

mha4mysql-manager.noarch 0:0.56-0.el6 mha4mysql-node.noarch 0:0.56-0.el6


作為依賴被安裝:

perl-Config-Tiny.noarch 0:2.12-7.1.el6 perl-DBD-MySQL.x86_64 0:4.013-3.el6 perl-Email-Date-Format.noarch 0:1.002-5.el6 perl-Log-Dispatch.noarch 0:2.27-1.el6

perl-MIME-Lite.noarch 0:3.027-2.el6 perl-MIME-Types.noarch 0:1.28-2.el6 perl-Mail-Sender.noarch 0:0.8.16-3.el6 perl-Mail-Sendmail.noarch 0:0.79-12.el6

perl-MailTools.noarch 0:2.04-4.el6 perl-Parallel-ForkManager.noarch 0:0.7.9-1.el6 perl-Params-Validate.x86_64 0:0.92-3.el6 perl-TimeDate.noarch 1:1.16-13.el6

master 安裝node 包 和 slave 安裝node包 都是一樣的 這裏就寫一條就行了

]# yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm

Installed:

mha4mysql-node.noarch 0:0.56-0.el6

Dependency Installed:

perl-DBD-MySQL.x86_64 0:4.013-3.el6

Complete!


在manager創建相關的目錄以及配置文件

# mkdir /etc/masterha

# vim /etc/masterha/app1.cnf

[server default]

user=mhauser

password=123456

manager_workdir=/data/masterha/app1

manager_log=/data/masterha/app1/manager.log

remote_workdir=/data/masterha/app1

ssh_user=root

repl_user=repluser

repl_password=123456

ping_interval=1


[server1]

hostname=192.168.2.36

candidate_master=1

master_binlog_dir = "/mydata/data"


[server2]

hostname=192.168.2.38

candidate_master=1

master_binlog_dir = "/mydata/data"


[server3]

hostname=192.168.2.40

在manager上檢查ssh連接是否正常

# masterha_check_ssh --conf=/etc/masterha/app1.cnf

Tue Jun 7 05:51:30 2016 - [debug] ok.

Tue Jun 7 05:51:30 2016 - [info] All SSH connection tests passed successfully.

檢查腳本是否有誤

# masterha_check_repl --conf=/etc/masterha/app1.cnf

Tue Jun 7 05:53:23 2016 - [info] Slaves settings check done.

Tue Jun 7 05:53:23 2016 - [info]

192.168.2.36(192.168.2.36:3306) (current master)

+--192.168.2.38(192.168.2.38:3306)

+--192.168.2.40(192.168.2.40:3306)

Tue Jun 7 05:53:23 2016 - [info] Checking replication health on 192.168.2.38..

Tue Jun 7 05:53:23 2016 - [info] ok.

Tue Jun 7 05:53:23 2016 - [info] Checking replication health on 192.168.2.40..

Tue Jun 7 05:53:23 2016 - [info] ok.

Tue Jun 7 05:53:23 2016 - [warning] master_ip_failover_script is not defined.

Tue Jun 7 05:53:23 2016 - [warning] shutdown_script is not defined.

Tue Jun 7 05:53:23 2016 - [info] Got exit code 0 (Not master dead).

MySQL Replication Health is OK.

這裏沒有問題 可以啟動mha了,註意它是在前臺顯示的然後如果master掛了之後 它會自動切換到一臺從服務器來充當master,然後它mha 也會停止 然後修好掛掉的服務器之後配置好 然後在啟動mha 也可以寫個腳本在後臺自動檢測。

# masterha_manager --conf=/etc/masterha/app1.cnf

Tue Jun 7 05:56:42 2016 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.

Tue Jun 7 05:56:42 2016 - [info] Reading application default configuration from /etc/masterha/app1.cnf..

Tue Jun 7 05:56:42 2016 - [info] Reading server configuration from /etc/masterha/app1.cnf..

然後測試的話 把master停止掉 就行 看mha自動切換從庫為主!這裏我就不測試了

Mysql MHA的搭建