MySQL高可用新玩法之MGR+Consul

前面的文章有提到過利用consul+mha實現mysql的高可用,以及利用consul+sentinel實現redis的高可用,具體的請查看:http://www.cnblogs.com/gomysql/p/8010552.html。本次給你們帶來mysql高可用的新玩法,利用mysql 5.7的mgr+consul實現,至於mgr是什麼,有什麼優點,如何搭建這裏就不說了,你們本身google,我這裏就是介紹利用mgr+consul實現高可用及故障自動切換。至於consul是什麼能夠參考前面的文章。html

環境:mgr至少須要3個節點。數據庫版本:mysql 5.7.19node

我這裏使用單主模式。mysql

192.168.100.78
192.168.100.75
192.168.100.74redis

mgr搭建完成之後查看狀態:sql

[root@localhost][performance_schema]> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-----------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST     | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+
| group_replication_applier | 8e4d93b8-4dd1-11e8-8306-6c92bf7e18e2 | ym_DB_16_100075 |        3306 | ONLINE       |
| group_replication_applier | 9062a0ef-4dd1-11e8-8822-6c92bf744dd6 | ym_DB_15_100074 |        3306 | ONLINE       |
| group_replication_applier | 9a7e7cd5-4dd1-11e8-b28c-6c92bf7e0d2e | ym_DB_19_100078 |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+

查看主節點是哪一個(個人環境是單主,官方也是推薦使用單主)shell

[root@localhost][performance_schema]> select * from  performance_schema.replication_group_members where member_id =(select variable_value from performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member');
+---------------------------+--------------------------------------+-----------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST     | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+
| group_replication_applier | 8e4d93b8-4dd1-11e8-8306-6c92bf7e18e2 | ym_DB_16_100075 |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+
1 row in set (0.00 sec)

能夠看見我目前的主節點是100.75。到此mgr環境ok。下面到部署consul,前面的文章提到過,須要服務發現的機器都須要安裝consul客戶端,也就是3臺服務器都須要安裝。其中涉及到2個檢查腳本(腳本不夠完善,好比複製延時是否進行註冊)。
主節點檢查腳本:數據庫

#!/bin/bash
port=$1
user="root"
passwod="123"

comm="/usr/local/mysql/bin/mysql -u$user -h 127.0.0.1 -P $port -p$passwod"
value=`$comm -Nse "select 1"`
primary_member=`$comm -Nse "select variable_value from performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member'"`
server_uuid=`$comm -Nse "select variable_value from performance_schema.global_variables where VARIABLE_NAME='server_uuid';"`


# 判斷mysql是否存活
if [ -z $value ]
then
   echo "mysql $port is down....."
   exit 2
fi


# 判斷節點狀態
node_state=`$comm -Nse "select MEMBER_STATE from performance_schema.replication_group_members where MEMBER_ID='$server_uuid'"`
if [ $node_state != "ONLINE" ]
then
   echo "MySQL $port state is not online...."
   exit 2
fi


# 判斷是否是主節點
if [[ $server_uuid == $primary_member ]]
then
   echo "MySQL $port  Instance is master ........"
   exit 0
else
   echo "MySQL $port  Instance is slave ........"
   exit 2
fi
View Code

從節點檢查腳本:json

#!/bin/bash
port=$1
user="root"
passwod="123"

comm="/usr/local/mysql/bin/mysql -u$user -h 127.0.0.1 -P $port -p$passwod"
value=`$comm -Nse "select 1"`
primary_member=`$comm -Nse "select variable_value from performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member'"`
server_uuid=`$comm -Nse "select variable_value from performance_schema.global_variables where VARIABLE_NAME='server_uuid';"`


# 判斷mysql是否存活
if [ -z $value ]
then
   echo "mysql $port is down....."
   exit 2
fi

# 判斷節點狀態
node_state=`$comm -Nse "select MEMBER_STATE from performance_schema.replication_group_members where MEMBER_ID='$server_uuid'"`
if [ $node_state != "ONLINE" ]
then
   echo "MySQL $port state is not online...."
   exit 2
fi


# 判斷是否是主節點
if [[ $server_uuid != $primary_member ]]
then
   echo "MySQL $port  Instance is slave ........"
   exit 0
else
   node_num=`$comm -Nse "select count(*) from  performance_schema.replication_group_members"`
   # 判斷若是沒有任何從節點,主節點也註冊從角色服務。
   if [ $node_num -eq 1 ]
   then
       echo "MySQL $port  Instance is slave ........"
       exit 0
   else
       echo "MySQL $port  Instance is master ........"
       exit 2
   fi
fi
View Code

其中一臺服務器的consul配置文件,有master和slave,以下:bash

[root@ym_DB_16_100075 conf]# cat payment-3306-mydb-ser.json 
{
  "services": [
    {
      "name": "payment-3306-mydb-ser",
      "tags": [
        "充值-3306"
      ],
      "address": "192.168.100.75",
      "port": 3306,
      "checks": [
        {
          "script": "/usr/local/consul/shell/check_mysql_mgr_master.sh 3306",
          "interval": "15s"
        }
      ]
    }
  ]
}
View Code
[root@ym_DB_16_100075 conf]# cat r-payment-3306-mydb-ser.json 
{
  "services": [
    {
      "name": "r-payment-3306-mydb-ser",
      "tags": [
        "充值-3306"
      ],
      "address": "192.168.100.75",
      "port": 3306,
      "checks": [
        {
          "script": "/usr/local/consul/shell/check_mysql_mgr_slave.sh 3306",
          "interval": "15s"
        }
      ]
    }
  ]
}
View Code

其餘兩臺服務器配置文件同樣,只是"address"改爲對應服務器的地址就完事。啓動consul。ping其中一個域名,好比:payment-3306-mydb-ser.service.consul,那麼返回的是主節點的ip,由於這個域名是寫的。若是ping r-payment-3306-mydb-ser.service.consul,那麼返回的是另外兩個從節點的ip。服務器

從上面能夠看到寫的域名解析到的主節點,讀的域名解析到了2個從節點,從節點能夠實現負載均衡的效果。

故障測試:

1. 把主節點停掉,查看寫的域名payment-3306-mydb-ser.service.consul會解析到哪裏。

[root@localhost][(none)]> select * from  performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-----------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST     | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+
| group_replication_applier | 9062a0ef-4dd1-11e8-8822-6c92bf744dd6 | ym_DB_15_100074 |        3306 | ONLINE       |
| group_replication_applier | 9a7e7cd5-4dd1-11e8-b28c-6c92bf7e0d2e | ym_DB_19_100078 |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+
2 rows in set (0.00 sec)

停掉之後發現以前的100.75主節點已經被移除,已經自動選出新的節點:

[root@localhost][(none)]> select * from  performance_schema.replication_group_members where member_id =(select variable_value from performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member');
+---------------------------+--------------------------------------+-----------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST     | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+
| group_replication_applier | 9062a0ef-4dd1-11e8-8822-6c92bf744dd6 | ym_DB_15_100074 |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-----------------+-------------+--------------+

能夠看到如今的主節點已是100.74,那麼咱們看看域名payment-3306-mydb-ser.service.consul解析到哪裏:

能夠看到沒有問題,正常。再看看讀域名:r-payment-3306-mydb-ser.service.consul

能夠看到一切正常。後續檢查腳本能夠判斷是否延時,若是延時就不註冊服務。

相關文章
相關標籤/搜索