一键快速登录WiseCloud MySQL数据库的方法


1、背景
数据库是计算机系统持久化数据的重要载体,睿云智合公司的容器云管理平台WiseCloud也用到了数据库。在云计算时代,MySQL是云端数据库的不二选择。

一个好的计算机系统,应该通过用户界面、服务接口调用等方式使用数据,用户直接操纵数据库的机会很少。但是在有一些场景下,有些用户不得不直接操纵数据库。例如:研发同事为了测试软件功能而预先置入测试数据;交付同事为了安装或升级系统、处理第三方系统的脏数据;客户管理员处理遗留系统的脏数据。
操纵MySQL数据库的工具有很多,可以根据实际需要选用,可以归入两类:图形界面客户端和字符界面客户端。

使用图形界面客户端,例如SQLyog、MySQL Workbench等,能方便连接MySQL数据库,利用图形界面的列表框、菜单和按钮,进行数据的增删查改和数据库管理工作。

MySQL图形工具有优点,也有局限性。例如:安装MySQL图形工具需要Windows或者macOS等图形桌面,但是在生产环境下,自备电脑不能方便地接入生产网络,MySQL图形工具也就无用武之地了。又如:用MySQL图形工具配置数据库连接时,需要知道数据库连接参数四元组:数据库IP、端口、用户名和密码,而这些参数并不是随时随地能获得的,给维护工作增加了难度,维护门槛较高。
字符界面的mysql命令工具在Shell命令行下运行,能随时随地获得并安装,也不依赖于图形桌面环境,所以深得运维工程师的喜爱。

本文介绍的方法,以mysql命令为基础,不需要预先知道数据库连接四元组,就能一键(执行一条Shell命令)快速登录WiseCloud/MySQL数据库,相比图形工具而言更加灵活、方便。
对此话题感兴趣的话,或者想利用它来提高工作效率,不妨进来看一看。

2、一键登录MySQL脚本
2.1 实现技术原理
本文所说的一键登录到MySQL方法利用了Kubernetes(以下简称K8s)和Docker的一些特性,或者说信息暴露特性来实现。
K8s与Docker容器之间传递参数利用了容器进程的环境变量作为中介。也就是说K8s把Docker容器运行时需要的参数以一组环境变量的形式传递给容器进程,容器进程从环境变量获得参数,动态配置运行时系统。
对WiseCloud而言,连接数据库的四元组也在传递给容器的环境变量之列。如果预先知道四元组的变量名就能取得四元组变量值,然后调用mysql命令快速地登录到MySQL数据库。当然,mysql客户端和MySQL服务器之间的网络互通是登录的前提条件。
Docker命令的子命令inspect能查询到容器的所有环境变量,然后用grep命令过滤出带DB前缀特征值的环境变量,就是数据库四元组。
docker inspect container_id/container_name | grep DB
原理理清楚了,就可以动手写脚本了。

2.2 编写Shell脚本
Shell脚本要做以下几件事:
S1. 查询wisecloud-controller命名空间下是否存在预定名称或者命令的应用Pod。这个脚本实际上查询带有关键词orchestration的应用Pod。这一步是检查脚本是否运行在WiseCloud集群节点上,严格意义讲不是完全必要的,但有了这一步的话信息更丰富。以下命令输出结果是Pod名称。
kubectl -n wisecloud-controller get pod -o wide | grep orchestration | awk '{print $1}'


S2. 查询是否存在预定名称(特征模式)的应用容器。docker命令在运行容器的主机上执行才有效,不能跨主机执行。以下命令输出结果是一条容器ID记录。
docker ps | grep app-orch | awk '{print $1}' | tail -1


S3. 查询容器进程的运行时参数,并过滤出符合特征串DB的环境变量,并格式化为“export DB_USER=username”形式。以下命令输出结果是MySQL四元组。
docker inspect $docker_container_id | grep DB | awk '{print $1}' | awk -F '[",]' '{print "export " $2}'


S4. 利用S3步骤的四元组,连接、登录到MySQL数据库。登录成功后进入SQL提示符,默认数据库是环境变量DB_NAME指定的。
mysql --host="$DB_URL" --port="$DB_PORT" --user="$DB_USER" --password="$DB_PASSWORD" --database="$DB_NAME"


2.3 安装脚本
方式一:
登录到wisecloud-controller三台主机的任意一台,一般是其中的第一台主机。执行以下命令,安装部署Shell脚本:
mkdir -p /root/solomonxu/mysql-login
cd /root/solomonxu/mysql-login
vi mysql-login.sh

输入脚本源代码

chmod a+x mysql-login.sh


方式二:
从github.com下载脚本,安装到本地主机的当前目录下。
wget https://raw.githubusercontent.com/solomonxu/mysql-utils/master/bin/mysql-login.sh; chmod a+x mysql-login.sh


2.4 脚本源代码
#!/usr/bin/bash

check and install mysql client

mysql_cmd=`which mysql`
echo mysql_cmd=$mysql_cmd
if [ -z "$mysql_cmd" ]; then
echo "MySQL not installed on this host. Start to install mysql now..."
yum install -y mysql
fi

define variables

pattern1=orchestration
pattern2=app-orch

get some pod of wisecloud

pod_names=`kubectl -n wisecloud-controller get pod -o wide | grep $pattern1 | awk '{print $1}'`
echo pod_names=$pod_names
if [ -z "$pod_names" ]; then
echo "Pod with pattern "$pattern1"* not found. Please check if this shell run on correct K8s cluter with wisecloud-controller."
exit 1
fi

get containter pod of wisecloud

docker_container_id=`docker ps | grep $pattern2 | awk '{print $1}' | tail -1`
echo docker_container_id=$docker_container_id
if [ -z "$docker_container_id" ]; then
echo "Container with pattern ${pattern2}* not found on this host. Please login to other hosts with wisecloud-controller, then run this shell again."
exit 2
fi

get mysql config from environment variables of container

`docker inspect $docker_container_id | grep DB | awk '{print $1}' | awk -F '[",]' '{print "export " $2}'`

echo "DB_URL=$DB_URL DB_PORT=$DB_PORT DB_USER=$DB_USER DB_PASSWORD=$DB_PASSWORD DB_NAME=$DB_NAME"

echo DB_URL=$DB_URL
echo DB_PORT=$DB_PORT
echo DB_USER=$DB_USER
echo DB_PASSWORD=$DB_PASSWORD
echo DB_NAME=$DB_NAME
if [[ -z "$DB_URL" ]] || [[ -z "$DB_PORT" ]] || [[ -z "$DB_USER" ]] || [[ -z "$DB_PASSWORD" ]]; then
echo "Some MYSQL config($DB_URL $DB_PORT $DB_USER $DB_PASSWORD) not found."
exit 3
fi

mysql login

echo "Try to login to MYSQL database now. The default database is $DB_NAME. If you want to use other database, please input 'use dbname;'."
echo
mysql --host="$DB_URL" --port="$DB_PORT" --user="$DB_USER" --password="$DB_PASSWORD" --database="$DB_NAME"


3、安装MySQL客户端
这个脚本依赖于MySQL客户端,如果没有安装mysql命令的话,这个脚本会自动下载安装mysql命令。脚本会自动执行下面的命令:
yum install -y mysql


4、测试脚本
4.1 运行脚本
先确定WiseCloud的三台controller节点的IP地址,SSH登录此前已经安装本脚本的主机。
进入脚本所在目录,运行Shell脚本,进入SQL提示符。
./mysql-login.sh


脚本运行的效果如下:
[root@dev-8 mysql-login]# ./mysql-login.sh 
mysql_cmd=/usr/bin/mysql
pod_names=orchestration-74b676fb48-v2g78
docker_container_id=415138cd402f
DB_URL=192.168.1.xx
DB_PORT=3307
DB_USER=wise2c
DB_PASSWORD=xxyyzz
DB_NAME=orchestration
Try to login to MYSQL database now. The default database is orchestration. If you want to use other database, please input 'use dbname;'.

Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 44407
Server version: 5.7.18-log MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [orchestration]>


4.2 SQL验证
输入SQL语句查询任意一个表的记录数,验证是否登录成功。SQL语句如下:
select count(*) from application;


预期的SQL执行结果如下:
MySQL [orchestration]> select count(*) from application;
+----------+
| count(*) |
+----------+
|       31 |
+----------+
1 row in set (0.00 sec)


5、结语
这个脚本安装在阿里云dev开发环境,在某金融业大客户运行环境也安装了脚本副本。本脚本在这些环境通过测试,运行正常。
mysql客户端登录到数据库的方法也有很多,关键是获得数据库连接四元组,不同的方法有各自的适用场景。本文介绍方法的优点是自动获得连接四元组,使用门槛比较低。
专业技术人员理解本文的技术原理后,也可以做一些本地化工作,适应不同的应用场景,例如用于WiseCloud之外的运行环境。本文的源代码完全是免费的,要是您利用了本文的源代码,不妨告诉我 xumeng@wise2c.com,微信solomonxu9999。如果您同意的话,也许我会吸收合理成分纳入下一个版本。

原文链接:https://mp.weixin.qq.com/s/CcWhQ6bwOd8zfCfqTNMHxw

关于睿云智合

深圳睿云智合科技有限公司成立于2012年,总部位于深圳,并分别在成都、深圳设立了研发中心,北京、上海设立了分支机构,核心骨干人员全部为来自金融、科技行业知名企业资深业务专家、技术专家。早期专注于为中国金融保险等大型企业提供创新技术、电子商务、CRM等领域专业咨询服务。

自2016年始,在率先将容器技术引进到中国保险行业客户后,公司组建了专业的容器技术产品研发和实施服务团队,旨在帮助中国金融行业客户将容器创新技术应用于企业信息技术支持业务发展的基础能力改善与提升,成为中国金融保险行业容器技术服务领导品牌。

此外,凭借多年来在呼叫中心领域的业务经验与技术积累,睿云智合率先在业界推出基于开源软交换平台FreeSwitch的微服务架构多媒体数字化业务平台,将语音、视频、webchat、微信、微博等多种客户接触渠道集成,实现客户统一接入、精准识别、智能路由的CRM策略,并以容器化治理来支持平台的全应用生命周期管理,显著提升了数字化业务处理的灵活、高效、弹性、稳定等特性,为帮助传统企业向“以客户为中心”的数字化业务转型提供完美的一站式整体解决方案。
微信图片_20190802172740.png

0 个评论

要回复文章请先登录注册