MySQL5.7MHA+MaxScale2.0构建高可用环境

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
传统型负载均衡 CLB,每月750个小时 15LCU
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介:


环境介绍

Part1:写在最前

看了某大牛的文章,讲述了一下MaxScale比LVS的好处多多,那您倒是放出来配置文件啊~~大牛说:

需要的单独找我吧,太长了配置文件……

看到这我心中久久不能平静啊。。。联系不上您呐 = =,于是各种资料各种找啊~各种坑各种血崩啊!~~~

由于不知道大牛的配置文件是什么样子,本文仅以随笔的形式,记录下实施过程。也欢迎您和我探讨您在实施MaxScale时遇到的各种问题和心得体会。


Part2:环境

MySQL5.7 MHA + MaxScale2.0

192.168.1.248 HE1 slave1

192.168.1.249 HE2 slave2

192.168.1.250 HE3 master

192.168.1.251 HE4 MHA-manager

192.168.1.100 MHA-vip


Part3:MHA

MHA的优点不作赘述,看下原理图吧

wKiom1gcNACS7VgfAADRIe97uls710.jpg

从宕机崩溃的Master保存二进制日志事件(binlogevent)

识别含有最新更新的Slave

应用差异的中继日志(relaylog)到其他Slave

应用从Master保存的二进制日志事件

提升一个Slave为新的Master

使其他的Slave连接新的Master进行复制



构建MySQL5.7MHA

Part1:写在最前

MHA的部署不是本文的叙述重点,网上比比皆是。这里只记录下MySQL5.7的MHA搭建时的一些坑


Part2:

mha4mysql-manager-0.57.tar.gz

mha4mysql-node-0.57.tar.gz

Warning:这两个包首先你要搞到,虽然说0.56什么的不代表支持的mysql版本,但经过测试,想要在MySQL5.7上部署MHA,少走坑,请用0.57的。


Part3:安装包的位置

请在所有的节点包括Manager节点安装好你的mha4mysql-node-0.57.tar.gz,以保证后期在管理节点执行perl Makefile.PL的时候,你能如愿以偿的看到如下信息

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@HE4 mha4mysql-manager-0.57] # perl Makefile.PL 
*** Module::AutoInstall version 1.06
*** Checking  for  Perl dependencies...
[Core Features]
- DBI                   ...loaded. (1.609)
- DBD::mysql            ...loaded. (4.013)
- Time::HiRes           ...loaded. (1.9721)
- Config::Tiny          ...loaded. (2.12)
- Log::Dispatch         ...loaded. (2.26)
- Parallel::ForkManager ...loaded. (0.7.5)
- MHA::NodeConst        ...loaded. (0.57)
*** Module::AutoInstall configuration finished.
Writing Makefile  for  mha4mysql::manager


Part4:一些常见错误记录

如果遇到

这样

1
2
3
4
5
6
7
8
9
[root@HE2 bin] # masterha_check_repl --conf=/etc/mha/mha.conf 
Tue Apr  5 22:09:32 2016 - [warning] Global configuration  file  /etc/masterha_default .cnf not found. Skipping.
Tue Apr  5 22:09:32 2016 - [info] Reading application default configuration from  /etc/mha/mha .conf..
Tue Apr  5 22:09:32 2016 - [info] Reading server configuration from  /etc/mha/mha .conf..
Tue Apr  5 22:09:32 2016 - [info] MHA::MasterMonitor version 0.57.
Tue Apr  5 22:09:32 2016 - [error][ /usr/local/lib64/perl5/MHA/ServerManager .pm, ln188] There is no alive server. We can't  do  failover
Tue Apr  5 22:09:32 2016 - [error][ /usr/local/lib64/perl5/MHA/MasterMonitor .pm, ln424] Error happened on checking configurations.  at  /usr/local/lib64/perl5/MHA/MasterMonitor .pm line 326
Tue Apr  5 22:09:32 2016 - [error][ /usr/local/lib64/perl5/MHA/MasterMonitor .pm, ln523] Error happened on monitoring servers.
Tue Apr  5 22:09:32 2016 - [info] Got  exit  code 1 (Not master dead).

解决方案

用的不是默认端口3306,请修改你的配置文件


这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
[root@HE4 ~] #
masterha_check_repl --conf= /etc/mha/mha .conf
Tue Apr  5 22:36:33 2016 - [warning] Global
configuration  file  /etc/masterha_default .cnf not found. Skipping.
Tue Apr  5 22:36:33 2016 - [info] Reading application
default configuration from  /etc/mha/mha .conf..
Tue Apr  5 22:36:33 2016 - [info] Reading server
configuration from  /etc/mha/mha .conf..
Tue Apr  5 22:36:33 2016 - [info] MHA::MasterMonitor
version 0.57.
Tue Apr  5 22:36:34 2016 - [info] GTID failover mode =
0
Tue Apr  5 22:36:34 2016 - [info] Dead Servers:
Tue Apr  5 22:36:34 2016 - [info] Alive Servers:
Tue Apr  5 22:36:34 2016 - [info]   192.168.1.250(192.168.1.250:4008)
Tue Apr  5 22:36:34 2016 - [info]   192.168.1.248(192.168.1.248:4008)
Tue Apr  5 22:36:34 2016 - [info]   192.168.1.249(192.168.1.249:4008)
Tue Apr  5 22:36:34 2016 - [info] Alive Slaves:
Tue Apr  5 22:36:34 2016 - [info]   192.168.1.248(192.168.1.248:4008)  Version=5.6.16-log (oldest major version
between slaves) log-bin:enabled
Tue Apr  5 22:36:34 2016 - [info]     Replicating from
192.168.1.250(192.168.1.250:4008)
Tue Apr  5 22:36:34 2016 - [info]     Primary candidate  for  the new Master
(candidate_master is  set )
Tue Apr  5 22:36:34 2016 - [info]   192.168.1.249(192.168.1.249:4008)  Version=5.6.16-log (oldest major version
between slaves) log-bin:enabled
Tue Apr  5 22:36:34 2016 - [info]     Replicating from
192.168.1.250(192.168.1.250:4008)
Tue Apr  5 22:36:34 2016 - [info]     Not candidate  for  the new Master
(no_master is  set )
Tue Apr  5 22:36:34 2016 - [info] Current Alive
Master: 192.168.1.250(192.168.1.250:4008)
Tue Apr  5 22:36:34 2016 - [info] Checking slave
configurations..
Tue Apr  5 22:36:34 2016 - [warning]  relay_log_purge=0 is not  set  on slave
192.168.1.248(192.168.1.248:4008).
Tue Apr  5 22:36:34 2016 - [warning]  relay_log_purge=0 is not  set  on slave
192.168.1.249(192.168.1.249:4008).
Tue Apr  5 22:36:34 2016 - [info] Checking replication
filtering settings..
Tue Apr  5 22:36:34 2016 - [info]  binlog_do_db= , binlog_ignore_db=
Tue Apr  5 22:36:34 2016 - [info]  Replication filtering check ok.
Tue Apr  5 22:36:34 2016 - [info] GTID (with auto-pos)
is not supported
Tue Apr  5 22:36:34 2016 - [info] Starting SSH
connection tests..
Tue Apr  5 22:36:35 2016 - [info] All SSH connection
tests passed successfully.
Tue Apr  5 22:36:35 2016 - [info] Checking MHA Node
version..
Tue Apr  5 22:36:36 2016 - [info]  Version check ok.
Tue Apr  5 22:36:36 2016 - [info] Checking SSH
publickey authentication settings on the current master..
Tue Apr  5 22:36:36 2016 - [info] HealthCheck: SSH to
192.168.1.250 is reachable.
Tue Apr  5 22:36:36 2016 - [info] Master MHA Node
version is 0.57.
Tue Apr  5 22:36:36 2016 - [info] Checking recovery
script configurations on 192.168.1.250(192.168.1.250:4008)..
Tue Apr  5 22:36:36 2016 - [info]   Executing  command : save_binary_logs
-- command = test  --start_pos=4 --binlog_dir= /log/mysql
--output_file= /usr/local/mha/save_binary_logs_test  --manager_version=0.57
--start_file=mysql-bin.000009
Tue Apr  5 22:36:36 2016 - [info]   Connecting to
root@192.168.1.250(192.168.1.250:22)..
   Creating  /usr/local/mha  if  not exists..
Creating directory  /usr/local/mha ..  done .
    ok.
   Checking output directory is accessible or
not..
    ok.
   Binlog found at  /log/mysql , up to
mysql-bin.000009
Tue Apr  5 22:36:36 2016 - [info] Binlog setting check
done .
Tue Apr  5 22:36:36 2016 - [info] Checking SSH
publickey authentication and checking recovery script configurations on all
alive slave servers..
Tue Apr  5 22:36:36 2016 - [info]   Executing  command  : apply_diff_relay_logs
-- command = test  --slave_user= 'root'  --slave_host=192.168.1.248
--slave_ip=192.168.1.248 --slave_port=4008 --workdir= /usr/local/mha
--target_version=5.6.16-log --manager_version=0.57
--relay_log_info= /data/mysql/relay-log .info 
--relay_dir= /data/mysql/ 
--slave_pass=xxx
Tue Apr  5 22:36:36 2016 - [info]   Connecting to
root@192.168.1.248(192.168.1.248:22)..
Can't  exec
"mysqlbinlog" : No such  file  or directory at
/usr/local/lib64/perl5/MHA/BinlogManager .pm line 106.
mysqlbinlog version
command  failed with rc 1:0, please verify PATH, LD_LIBRARY_PATH, and client
options
  at  /usr/local/bin/apply_diff_relay_logs  line
493
Tue Apr  5 22:36:36 2016 -
[error][ /usr/local/lib64/perl5/MHA/MasterMonitor .pm, ln205] Slaves settings
check failed!
Tue Apr  5 22:36:36 2016 -
[error][ /usr/local/lib64/perl5/MHA/MasterMonitor .pm, ln413] Slave configuration
failed.
Tue Apr  5 22:36:36 2016 -
[error][ /usr/local/lib64/perl5/MHA/MasterMonitor .pm, ln424] Error happened on
checking configurations.  at
/usr/local/bin/masterha_check_repl  line 48
Tue Apr  5 22:36:36 2016 -
[error][ /usr/local/lib64/perl5/MHA/MasterMonitor .pm, ln523] Error happened on
monitoring servers.
Tue Apr  5 22:36:36 2016 - [info] Got  exit  code 1 (Not
master dead).
  
MySQL Replication
Health is NOT OK!


解决方案

[root@HE1 MHA]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog



或者这样

1
2
3
4
5
6
7
8
9
10
11
12
13
   Binlog found at  /log/mysql , up to mysql-bin.000009
Tue Apr  5 22:43:55 2016 - [info] Binlog setting check  done .
Tue Apr  5 22:43:55 2016 - [info] Checking SSH publickey authentication and checking recovery script configurations on all alive slave servers..
Tue Apr  5 22:43:55 2016 - [info]   Executing  command  : apply_diff_relay_logs -- command = test  --slave_user= 'root'  --slave_host=192.168.1.248 --slave_ip=192.168.1.248 --slave_port=4008 --workdir= /usr/local/mha  --target_version=5.6.16-log --manager_version=0.57 --relay_log_info= /data/mysql/relay-log .info  --relay_dir= /data/mysql/   --slave_pass=xxx
Tue Apr  5 22:43:55 2016 - [info]   Connecting to root@192.168.1.248(192.168.1.248:22).. 
mysqlbinlog: unknown variable  'default-character-set=utf8'
mysqlbinlog version  command  failed with rc 7:0, please verify PATH, LD_LIBRARY_PATH, and client options
  at  /usr/local/bin/apply_diff_relay_logs  line 493
Tue Apr  5 22:43:55 2016 - [error][ /usr/local/lib64/perl5/MHA/MasterMonitor .pm, ln205] Slaves settings check failed!
Tue Apr  5 22:43:55 2016 - [error][ /usr/local/lib64/perl5/MHA/MasterMonitor .pm, ln413] Slave configuration failed.
Tue Apr  5 22:43:55 2016 - [error][ /usr/local/lib64/perl5/MHA/MasterMonitor .pm, ln424] Error happened on checking configurations.  at  /usr/local/bin/masterha_check_repl  line 48
Tue Apr  5 22:43:55 2016 - [error][ /usr/local/lib64/perl5/MHA/MasterMonitor .pm, ln523] Error happened on monitoring servers.
Tue Apr  5 22:43:55 2016 - [info] Got  exit  code 1 (Not master dead).

 

解决方案

注释掉my.cnf中的

[client]

#default-character-set=utf8


遇到上述错误别慌张,看日志,根据报错来排查问题。


折腾半天,就为了这个OK


[root@HE4 mha4mysql-manager-0.57]# masterha_check_status --conf=/etc/mha/mha.conf

mha (pid:32726) is running(0:PING_OK), master:192.168.1.250



MaxScale2.0

Part1:写在最前

maxscalemariadb公司开发的一套数据库中间件,可以很方便的实现读写分离方案;并且提供了读写分离的负载均衡和高可用性保障。另外maxscale对于前端应用而言是透明的,我们可以很方便的将应用迁移到maxscale中实现读写分离方案,来分担主库的压力。maxscale也提供了sql语句的解析过滤功能。这里我们主要讲解maxscale的安装、配置以及注意事项。


wKiom1gcOXiwXdlZAACoNfhmWaU338.jpg

Part2:整体架构

wKiom1gcOaWBZT26AABfoiL5n9U039.jpg



Part3:安装

Maxscale配置很简单

[root@HE3 MHA]# yum -y install maxscale-2.0.1-2.centos.6.x86_64.rpm (只在Maxscale上执行)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
[root@HE3 ~] # cat /etc/maxscale.cnf
# MaxScale documentation on GitHub:
# https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Documentation-Contents.md
 
# Global parameters
#
# Number of threads is autodetected, uncomment for manual configuration
# Complete list of configuration options:
# https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Getting-Started/Configuration-Guide.md
 
[maxscale]
threads=auto
 
# Server definitions
#
# Set the address of the server to the network
# address of a MySQL server.
#
 
[server1]
type =server
address=192.168.1.248
port=3306
protocol=MySQLBackend
myweight=5
 
[server2]
type =server
address=192.168.1.249
port=3306
protocol=MySQLBackend
myweight=5
 
[server3]
type =server
address=192.168.1.100
port=3306
protocol=MySQLBackend
 
# Monitor for the servers
#
# This will keep MaxScale aware of the state of the servers.
# MySQL Monitor documentation:
# https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Monitors/MySQL-Monitor.md
 
[MySQL Monitor]
type =monitor
module=mysqlmon
servers=server1,server2,server3
user=mysync
passwd =MANAGER
monitor_interval=10000
 
# Service definitions
#
# Service Definition for a read-only service and
# a read/write splitting service.
#
 
# https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Routers/ReadConnRoute.md
 
#[Read-Only Service]                       ###只读服务
#type=service
#router=readconnroute
#servers=server1,server2,server3
#user=sys_admin
#passwd=MANAGER
#router_options=slave
 
# https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Routers/ReadWriteSplit.md
 
 
 
[Read-Write Service]                        ####写服务
type =service
router=readwritesplit
enable_root_user=1
servers=server1,server2,server3
user=sys_admin
passwd =MANAGER
weightby=myweight
router_options=slave_selection_criteria=LEAST_GLOBAL_CONNECTIONS
max_slave_connections=1
 
 
# https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Reference/MaxAdmin.md
 
[MaxAdmin Service]
type =service
router=cli
 
 
#[Read-Only Listener]
#type=listener
#service=Read-Only Service
#protocol=MySQLClient
#port=4008                                  ##读服务启动监听 端口4008
 
[Read-Write Listener]
type =listener
service=Read-Write Service
protocol=MySQLClient
port=4006                                   ####写服务启动监听 端口
 
[MaxAdmin Listener]
type =listener
service=MaxAdmin Service
protocol=maxscaled
port=6603                                   ###管理端口


[root@HE3 ~]# /etc/init.d/maxscale start

Starting MaxScale: maxscale (pid 28851) is running...      [  OK  ]

 

[root@HE3 ~]#  netstat -lntp |grep maxscale

tcp        0      0 0.0.0.0:6603                0.0.0.0:*                   LISTEN      29878/maxscale     

tcp        0      0 0.0.0.0:4006                0.0.0.0:*                   LISTEN      29878/maxscale     



[root@HE3 ~]# maxadmin -pmariadb list services

Services.

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

Service Name              | Router Module        | #Users | Total Sessions

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

Read-Only Service         | readconnroute        |      1 |     5

Read-Write Service        | readwritesplit       |      1 |    11

MaxAdmin Service          | cli                  |      2 |     3

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

 

[root@HE3 ~]# maxadmin -pmariadb list servers

Servers.

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

Server             | Address         | Port  | Connections | Status             

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

server1            | 192.168.1.248   |  3306 |           0 | Slave, Running

server2            | 192.168.1.249   |  3306 |           0 | Slave, Running

server3            | 192.168.1.250   |  3306 |           0 | Master, Running

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


至此,MHA+Maxscale的环境就完成了。



读写分离与负载均衡校验

Part1:读写分离

在Master构建相应的测试表

1
2
3
4
5
6
7
mysql>  select  from  helei;
+ --------+
| a      |
+ --------+
| HE3    |
+ --------+
rows  in  set  (0.00 sec)


在slave1插入数据HE1

1
2
3
4
5
6
7
mysql>  select  from  helei;
+ ------+
| a    |
+ ------+
| HE3  |
| HE1  |
+ ------+


在slave2插入数据HE2

1
2
3
4
5
6
7
mysql>  select  from  helei;
+ ------+
| a    |
+ ------+
| HE3  |
| HE2  |
+ ------+


现在链接4006读写分离端口,进行数据写入

1
2
3
4
5
6
7
8
9
10
11
[root@HE3 ~]#  mysql -h192.168.1.250 -P 4006 -usys_admin -pMANAGER maxscale -e "insert into helei values('写入');"
mysql: [Warning] Using a  password  on  the command line interface can be insecure.
[root@HE3 ~]#  mysql -h192.168.1.250 -P 4008 -usys_admin -pMANAGER maxscale -e "select * from helei;"
mysql: [Warning] Using a  password  on  the command line interface can be insecure.
+ --------+
| a      |
+ --------+
| HE3    |
| HE1    |
| 写入   |
+ --------+

可以看到主库插入完毕后从库已经同步完成,这条查询完成在了HE1(slave1)上


Part2:负载均衡

我们配置的read比例为1:1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@HE3 ~] # maxadmin -pmariadb show service "Read-Write Service"
Service 0xef5570
Service:                             Read-Write Service
Router:                              readwritesplit (0x7ff5e8fa6ec0)
State:                               Started
Number of router sessions:           15
Current no. of router sessions:      0
Number of queries forwarded:          41
Number of queries forwarded to master:2 (4.88%)
Number of queries forwarded to slave: 39 (95.12%)
Number of queries forwarded to all:   0 (0.00%)
Connection distribution based on myweight server parameter.
Server               Target %    Connections  Operations
                                Global  Router
server1              50.0%     0       0       0
server2              50.0%     0       0       0
server3              100.0%     0       0       0
Started:                             Thu Nov  3 23:46:27 2016
Root user access:                    Enabled
Backend databases:
192.168.1.248:3306  Protocol: MySQLBackend
192.168.1.249:3306  Protocol: MySQLBackend
192.168.1.100:3306  Protocol: MySQLBackend
Routing weight parameter:            myweight
Users data:                          0xf09370
Total connections:                   16
Currently connected:                 1



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
[root@HE3 ~] # for i in `seq 1 10`; do mysql -h 192.168.1.250 -P 4006 -usys_admin -pMANAGER maxscale -e "select @@hostname; select sleep(10)" 2>/dev/null & done
[root@HE3 ~] # +------------+
| @@ hostname  |
+------------+
| HE1        |
+------------+
+------------+
| @@ hostname  |
+------------+
| HE1        |
+------------+
+------------+
| @@ hostname  |
+------------+
| HE1        |
+------------+
+------------+
| @@ hostname  |
+------------+
| HE1        |
+------------+
+------------+
| @@ hostname  |
+------------+
| HE1        |
+------------+
+------------+
| @@ hostname  |
+------------+
| HE2        |
+------------+
+------------+
| @@ hostname  |
+------------+
| HE2        |
+------------+
+------------+
| @@ hostname  |
+------------+
| HE2        |
+------------+
+------------+
| @@ hostname  |
+------------+
| HE2        |
+------------+
+------------+
| @@ hostname  |
+------------+
| HE2        |
+------------+


OK!That's how it works!~



故障测试

Part1:stop slave故障

停止HE1的复制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
[root@HE1 ~]# mysql
-uroot -p
Enter  password :
Welcome  to  the MySQL
monitor.  Commands  end  with  or  \g.
Your MySQL
connection  id  is  74
Server version:
5.7.16-log MySQL Community Server (GPL)
  
Copyright (c) 2000,
2016, Oracle  and / or  its affiliates.  All  rights reserved.
  
Oracle  is  a
registered trademark  of  Oracle Corporation  and / or  its
affiliates. Other
names may be trademarks  of  their respective
owners.
  
Type  'help;'  or  '\h'
for  help. Type  '\c'  to  clear the  current  input statement.
  
mysql> stop
slave;
Query OK, 0  rows
affected (0.05 sec)
  
[root@HE3 ~]#
maxadmin -pmariadb list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server             | Address         | Port 
| Connections | Status             
-------------------+-----------------+-------+-------------+--------------------
server1            | 192.168.1.248   | 
3306 |           0 | Running
server2            | 192.168.1.249   | 
3306 |           0 | Slave,
Running
server3            | 192.168.1.250   | 
3306 |           0 | Master,
Running
-------------------+-----------------+-------+-------------+--------------------
  
[root@HE3 ~]#  mysql -h192.168.1.250 -P 4006 -usys_admin
-pMANAGER maxscale -e "select * from helei;"
mysql: [Warning]
Using a  password  on  the command line interface can be insecure.
+ --------+
| a      |
+ --------+
| HE3    |
| HE2    |
| 写入  
|
+ --------+
[root@HE3 ~]#  mysql -h192.168.1.250 -P 4006 -usys_admin
-pMANAGER maxscale -e "select * from helei;"
mysql: [Warning]
Using a  password  on  the command line interface can be insecure.
+ --------+
| a      |
+ --------+
| HE3    |
| HE2    |
| 写入  
|
+ --------+

 

可以看出,在slave1故障后,所有的读操作都进入了HE2(slave2);


 

 

 

恢复HE1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
  
mysql> start
slave;
Query OK, 0  rows
affected (0.00 sec)
  
  
[root@HE3 ~]#
maxadmin -pmariadb list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server             | Address         | Port 
| Connections | Status             
-------------------+-----------------+-------+-------------+--------------------
server1            | 192.168.1.248   | 
3306 |           0 | Slave,
Running
server2            | 192.168.1.249   | 
3306 |           0 | Slave,
Running
server3            | 192.168.1.250   | 
3306 |           0 | Master,
Running
-------------------+-----------------+-------+-------------+--------------------
  
验证
[root@HE3 ~]#  mysql -h192.168.1.250 -P 4006 -usys_admin
-pMANAGER maxscale -e "select * from helei;"
mysql: [Warning]
Using a  password  on  the command line interface can be insecure.
+ --------+
| a      |
+ --------+
| HE3    |
| HE2    |
| 写入  
|
+ --------+
[root@HE3 ~]#  mysql -h192.168.1.250 -P 4006 -usys_admin
-pMANAGER maxscale -e "select * from helei;"
mysql: [Warning]
Using a  password  on  the command line interface can be insecure.
+ --------+
| a      |
+ --------+
| HE3    |
| HE1    |
| 写入  
|
+ --------+

 

在HE1(slave1)恢复完成后,重新有了负载均衡。

 

 

 

 

Part2:mysql down故障

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
[root@HE1 ~]#
/etc/init.d/mysqld stop
Shutting down
MySQL..... SUCCESS!
  
停止HE1(slave)可以看到转发到了HE2上
  
[root@HE3 ~]#  maxadmin -pmariadb list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server             | Address         | Port 
| Connections | Status             
-------------------+-----------------+-------+-------------+--------------------
server1            | 192.168.1.248   | 
3306 |           0 | Down
server2            | 192.168.1.249   | 
3306 |           1 | Slave,
Running
server3            | 192.168.1.250   | 
3306 |           1 | Master,
Running
-------------------+-----------------+-------+-------------+--------------------
[root@HE3
~]# mysql -h192.168.1.250 -P 4006 -usys_admin -pMANAGER
mysql: [Warning]
Using a  password  on  the command line interface can be insecure.
Welcome  to  the MySQL
monitor.  Commands  end  with  or  \g.
Your MySQL
connection  id  is  28948
Server version:
5.5.5-10.0.0 2.0.1-maxscale MySQL Community Server (GPL)
  
Copyright (c) 2000,
2016, Oracle  and / or  its affiliates.  All  rights reserved.
  
Oracle  is  a
registered trademark  of  Oracle Corporation  and / or  its
affiliates. Other
names may be trademarks  of  their respective
owners.
  
Type  'help;'  or  '\h'
for  help. Type  '\c'  to  clear the  current  input statement.
  
mysql>  select
@@hostname;
+ ------------+
| @@hostname |
+ ------------+
| HE2        |
+ ------------+
1 row  in  set  (0.00
sec)
  
  
停掉2台slave,观察maxscale的状态
[root@HE3 ~]#
maxadmin -pmariadb list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server             | Address         | Port 
| Connections | Status             
-------------------+-----------------+-------+-------------+--------------------
server1            | 192.168.1.248   | 
3306 |           0 | Running
server2            | 192.168.1.249   | 
3306 |           0 | Running
server3            | 192.168.1.250   | 
3306 |           0 | Master, Stale
Status, Running
-------------------+-----------------+-------+-------------+--------------------



Warning:这里我并没有在

[MySQL Monitor]中配置detect_stale_master=true

可以看出,在maxscale2.0中,已经默认从库都停掉,也不影响


Part3:master故障

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[root@HE3 ~] # maxadmin -pmariadb list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server             | Address         | Port  | Connections | Status              
-------------------+-----------------+-------+-------------+--------------------
server1            | 192.168.1.248   |  3306 |           0 | Slave, Running
server2            | 192.168.1.249   |  3306 |           0 | Slave, Running
server3            | 192.168.1.100   |  3306 |           0 | Master, Running
-------------------+-----------------+-------+-------------+--------------------
[root@HE3 ~] # ps -ef|grep mysql
root     27709     1  0 Nov03 ?        00:00:00  /bin/sh  /usr/local/mysql/bin/mysqld_safe  --datadir= /data/mysql  --pid- file = /data/mysql/HE3 .pid
mysql    28415 27709  0 Nov03 ?        00:00:19  /usr/local/mysql/bin/mysqld  --basedir= /usr/local/mysql  --datadir= /data/mysql  --plugin- dir = /usr/local/mysql/lib/plugin  --user=mysql --log-error= /data/mysql/error .log -- open -files-limit=8192 --pid- file = /data/mysql/HE3 .pid --socket= /tmp/mysql .sock --port=3306
root     30794 28966  0 02:34 pts /1     00:00:00  grep  mysql
[root@HE3 ~] # kill -9 28415 27709
[root@HE3 ~] # maxadmin -pmariadb list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server             | Address         | Port  | Connections | Status              
-------------------+-----------------+-------+-------------+--------------------
server1            | 192.168.1.248   |  3306 |           0 | Slave, Running
server2            | 192.168.1.249   |  3306 |           0 | Slave, Running
server3            | 192.168.1.100   |  3306 |           0 | Master, Running
-------------------+-----------------+-------+-------------+--------------------
[root@HE3 ~] # maxadmin -pmariadb list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server             | Address         | Port  | Connections | Status              
-------------------+-----------------+-------+-------------+--------------------
server1            | 192.168.1.248   |  3306 |           0 | Master, Running
server2            | 192.168.1.249   |  3306 |           0 | Slave, Running
server3            | 192.168.1.100   |  3306 |           0 | Running
-------------------+-----------------+-------+-------------+--------------------

wKioL1gcWduRmrsgAADXaLF4VQ4363.png

可以看出,kill master的mysql进程后,MHA将slave1拉成新的master,Maxsale也识别了这一状态。



Java Druid注意事项

------------以下文章取材于贺春旸技术博客-------------------

http://hcymysql.blog.51cto.com/5223301/1869414

现象:

程序会不定时的出现连接错误,问题bug的异常信息如下:

The last packet successfully received from the server was 116 milliseconds ago.  The last packet sent successfully to the server was 115 milliseconds ago.

java.sql.SQLException: No database selected

 

但通过客户端sqlyog/navicat连接均为正常。

----------------------------------------------------------------------

另:maxscale1.4.3有时还会出现挂起现象,4006端口直接关闭。后我们用了watch命令后台跑监控

watch -d /bin/bash /root/sh/restart_maxsacle.sh

1
2
3
4
5
6
7
#!/bin/bash
 
netstat  -ntlp |  grep  maxscale |  grep  4006 >  /dev/null  2>&1
 
if  [ $? - eq  1 ]; then
/etc/init .d /maxscale  start
fi


解决:5.6以下可以直接在url上配置:autoReconnect=true

对于5.6以上的只能在jdbc的链接池里设置:

wKiom1gcJ8eRZd5cAABCHLTCyQg422.png


第一个设置成ture,超时自动链接,对于mysql要把第二个设置成false,不启用缓存。

以上是开发需要注意的都是一些基本的配置。

 

其目的为:每次归还连接时执行select 'x'检测连接是否有效。 



——总结——

maxscale的核心就在于内个配置文件,根据不同的业务和架构,做好相应的配置,本文意在抛砖引玉,如果您有更全的配置文件,欢迎您分享给笔者。由于笔者的水平有限,编写时间也很仓促,文中难免会出现一些错误或者不准确的地方,不妥之处恳请读者批评指正。





 本文转自 dbapower 51CTO博客,原文链接:http://blog.51cto.com/suifu/1869520
,如需转载请自行联系原作者

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
22天前
|
关系型数据库 MySQL 数据库
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
|
11天前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
23天前
|
关系型数据库 MySQL 应用服务中间件
win7系统搭建PHP+Mysql+Apache环境+部署ecshop项目
这篇文章介绍了如何在Windows 7系统上搭建PHP、MySQL和Apache环境,并部署ECShop项目,包括安装配置步骤、解决常见问题以及使用XAMPP集成环境的替代方案。
35 1
win7系统搭建PHP+Mysql+Apache环境+部署ecshop项目
|
25天前
|
运维 容灾 关系型数据库
MySQL高可用方案--Xenon全解
MySQL高可用方案--Xenon全解
|
1月前
|
存储 关系型数据库 MySQL
"Linux环境下MySQL数据库名及表名大小写敏感性设置详解:从配置到影响,确保数据库操作的准确与高效"
【8月更文挑战第9天】在Linux环境中,MySQL数据库名及表名的大小写敏感性是一项重要配置。默认情况下,MySQL在Linux上区分大小写,但这可通过配置文件 `/etc/my.cnf` 中的 `lower_case_table_names` 参数调整。该参数设为0时,名称存储时保持原样,查询时不区分大小写;设为1则全部转换为小写。通过编辑配置文件并重启MySQL服务,可根据需求灵活控制名称的大小写敏感性,确保数据一致性和应用兼容性。
55 3
|
22天前
|
SQL 关系型数据库 MySQL
orchestrator搭建mysql高可用
orchestrator搭建mysql高可用
14 0
|
22天前
|
缓存 关系型数据库 MySQL
如何实现mysql高可用集群
如何实现mysql高可用集群
13 0
|
25天前
|
安全 关系型数据库 MySQL
【MySQL】Orchestrator最简单的 mysql 高可用方案最细细细细~
【MySQL】Orchestrator最简单的 mysql 高可用方案最细细细细~
|
1月前
|
缓存 关系型数据库 MySQL
MySQL调优秘籍曝光!从索引到事务,全方位解锁高可用秘诀,让你的数据库性能飞起来!
【8月更文挑战第6天】MySQL是顶级关系型数据库之一,其性能直接影响应用的高可用性与用户体验。本文聚焦MySQL的高性能调优,从索引设计到事务管理,逐一解析。介绍如何构建高效索引,如联合索引`CREATE INDEX idx_order_customer ON orders(order_id, customer_id);`,以及索引覆盖查询等技术。
66 0
|
23天前
|
SQL 关系型数据库 MySQL
【揭秘】MySQL binlog日志与GTID:如何让数据库备份恢复变得轻松简单?
【8月更文挑战第22天】MySQL的binlog日志记录数据变更,用于恢复、复制和点恢复;GTID为每笔事务分配唯一ID,简化复制和恢复流程。开启binlog和GTID后,可通过`mysqldump`进行逻辑备份,包含binlog位置信息,或用`xtrabackup`做物理备份。恢复时,使用`mysql`命令执行备份文件,或通过`innobackupex`恢复物理备份。GTID模式下的主从复制配置更简便。
107 2