mysql-kube は、Kubernetes 上で MariaDB(MySQL) の Pod を立ち上げ稼働させるための マイクロサービス です。
本リポジトリには、必要なマニフェストファイルが入っています。
また、本リポジトリには、MySQLの初期設定と、Pod立ち上げ後のテーブルの作成に関する手順が含まれています。
AIONでは、MySQLは主に、エッジアプリケーションで発生した静的なデータを保持・維持するために用いられます。
-
OS: Linux OS
-
CPU: ARM/AMD/Intel
-
Kubernetes
mysql-kube は、下記の黄色い枠の部分のリソースです。
以下の手順でKubernetes上にMySQLのPodを立ち上げます。
[1] 以下コマンドを実行してください
※ make install-default は、本レポジトリの Makefile 内にて定義されている独自の コマンドです。
$ make install-default PV_SIZE=1Gi USER_NAME=${MYSQL_USER} USER_PASSWORD=${MYSQL_PASSWORD}
PV_SIZE 任意のストレージサイズ
MYSQL_USER: 任意の「MySQLユーザ名」
MYSQL_PASSWORD: 任意の「MySQLパスワード」
[2] 以下コマンドでMySQLのPodが正常に起動している事を確認してください
$ kubectl get po | grep mysql
(※オプション)初期データを投入したい場合、[1] の事前に mysql_init内に初期データ挿入用のSQLファイルを配置してください
$ mkdir mysql_init
$ cp 初期データ挿入用のSQLファイルパス mysql_init/
上記 MySQL の Pod 立ち上げ により、以下の通りにマニフェストファイルが作成されます。
- ポート: 3306
- コンテナイメージ: mariadb:10.6
- volumeのマウント場所
- persistentVolume:
- コンテナ: /var/lib/mysql
- hostOS: /mnt/mysql_data
- initdb:
- コンテナ: /docker-entrypoint-initdb.d
- hostOS: /mnt/mysql_init
- persistentVolume:
- タイムゾーン: Asia/Tokyo
Kubernetes Pod 上で MySQLデータベースを立ち上げます。(下記の例では、データベースだけでなく、アプリケーションのコアテーブルを含む形でデータベースを立ち上げています)
$ kubectl exec -i <mysql-pods> -- /bin/sh -c "mysql -u <username> -p<password> --default-character-set=utf8" < ./sql/ui-backend-for-omotebako.sql
<mysql-pods>
、<username>
および<password>
はセットアップ環境に合わせて変えること
MySQLデータベースに、アプリケーションのテーブルを作成します。
$ cd /path/to/calendar-module-kube-sql
$ kubectl exec -i <mysql-pods> -- /bin/sh -c "mysql -u <username> -p<password> --default-character-set=utf8 -D Omotebako" < ./calendar-module-kube-sql.sql
<mysql-pods>
、<username>
および<password>
はセットアップ環境に合わせて変えること
エッジ環境はスペックの制限があるため、機能性とパフォーマンスのバランスに優れているMariaDB(MySQL)を採用しています。
RDBMSにはSQLite、SQL ServerやPostgreSQLなどがあります。
- SQLite: 軽量で手頃だが、大規模なシステムでは機能不十分
- PostgreSQL: 高性能だが、処理コストが高い
MariaDB(MySQL)はSQL ServerやPostgreSQLの中間に位置し、高速で実用性が高いため、LatonaおよびAIONではエッジ環境で採用されています。
以下、MariaDBの特徴です。
MariaDBはMySQLから派生したもので、MySQLと高い互換性があります。
《MySQLとMariaDBの違い》
MariaDB | MySQL | |
---|---|---|
ライセンス | オープンソース(GPL) | オープンソース(プロプライエタリ・ライセンス) |
管理 | コミュニティによる管理 | Oracle社によるベンダー管理 |
シェア | Linuxディストリビューションでの採用など急速に伸びている | 非常に高い |
セキュリティ(暗号化機能) | 暗号化の対象が多い | 暗号化は限られている |
パフォーマンス | 高い | MariaDBには劣る |
堅牢性 | 高い | 普通 |
クラスター構成 | 対応 | 非対応 |
MariaDB(MySQL)は、リレーショナルデータベースです。 リレーショナルデータベースとは、データベース(DB)におけるデータを扱う方法の1つで、主に2つの特徴があります。
- データは2次元(行×列)の表(テーブル)形式で表現
- 「キー」を利用して、複数の表を結合(リレーション)して利用可能
データを2次元の表に分割し、また複数の表を様々な手法で結合して使うことで、複雑なデータを柔軟に扱うことができます。
MariaDB(MySQL)の利点は以下の通りです。
- システム規模が大きくなっても対応できる拡張性
- さまざまなテーブルタイプのデータを統合できる柔軟性
- 大規模なデータにも耐えうるような高速動作
- データを保護するためのセキュリティ機能(データベースにアクセスするためのアクセス制限、盗み見防止のデータ暗号機能、Webサイトなどを安全に接続するためのセキュリティ技術など)
トランザクションとはDBシステムで実行される処理のまとまり、または作業単位のことです。
トランザクションを使うと複数のクエリをまとめて1つの処理として扱うことができます。
- 処理の途中でエラーになって処理を取り消したいような場合:「ロールバック; roll back」をすることで、そのトランザクションによる痕跡を消去してデータベースを一貫した状態(そのトランザクションを開始する前の状態)にリストアできます。
- あるトランザクションの全操作が完了した場合:そのトランザクションはシステムによって「コミット; commit」され、DBに加えられた更新内容が恒久的なものとなります。コミットされたトランザクションがロールバックされることはありません。
MariaDB(MySQL)では、トランザクション処理を行うことで、MariaDB(MySQL)のテーブルにデータを保存などをする際に、他のユーザーからのアクセスを出来ないようにテーブルをロックしています。
MySQL Workbenchとは、MySQLの公式サイトにてMySQL Serverと共に無料で配布されている、 データ・モデリング、SQL 開発、およびサーバー設定、ユーザー管理、バックアップなどの包括的な管理ツールのことです。 コマンドラインではなくビジュアル操作(GUI)に対応しています。 MySQL Workbench は Windows、Linux、Mac OS X で利用可能です。
- データベース設計:新規にER図が作成できるほか、既存のデータベースからER図を逆に生成することも可能です。
- データベース開発:SQLのクエリ作成や実行だけでなく、最適化を直感的な操作で行えるビジュアル表示に対応しています。さらにSQLエディタにはカラーハイライト表示や自動補完機能のほか、SQLの実行履歴表示やSQLステートメントの再利用、オブジェクトブラウザにも対応しており、SQLエディタとしてもとても優秀な開発ツールです。
- データベース管理:ヴィジュアルコンソールによってデータベースの可視性が高められており、MySQLの管理をより容易にする工夫が凝らされています。さらにビジュアル・パフォーマンス・ダッシュボードの実装により、パフォーマンス指標を一目で確認できます。
kubernetes内のmysqlを操作するにはpodに入る必要があります。
- 作成したkubernetesのpod名取得
kubectl get pod
- kubernetes環境に入る
kubectl exec -it [POD_NAME] bash
mysql -u[USER_NAME] -p[PASSWORD]
- Databaseの作成(同じ名前のDatabaseがなければ作成)
CREATE DATABASE IF NOT EXISTS [DATABASE_NAME] default character set utf8 ;
- Tableの作成
CREATE TABLE [DATABASE_NAME].[TABLE_NAME] (
[COLUMN_NAME] [DATA_TYPE] [OPTION]
);
- recordの挿入
INSERT INTO `[DATABASE_NAME]` (`[COLUMN_NAME1]`, `[COLUMN_NAME2]`, `[COLUMN_NAME3]`)
VALUES
('[VALUE1]','[VALUE2]','[VALUE3]');
- Databaseの削除
DROP DATABASE [DATABASE_NAME];
- Tableの削除
DROP TABLE [DATABASE_NAME].[TABLE_NAME];
- columnの条件に該当するrecordの削除
DELETE FROM [DATABASE_NAME].[TABLE_NAME] WHERE [COLUMN_NAME]="[VALUE]";
- データの全件取得
SELECT *
FROM [DATABASE_NAME].[TABLE_NAME];
- 特定の列のデータ取得
SELECT [row_name]
FROM [DATABASE_NAME].[TABLE_NAME];
SELECT [row_name1], [row_name2], ... [row_name100]
FROM [DATABASE_NAME].[TABLE_NAME];
- 条件を指定してデータ取得
SELECT *
FROM [DATABASE_NAME].[TABLE_NAME]
WHERE [row_name]=[value];
SELECT *
FROM [DATABASE_NAME].[TABLE_NAME]
WHERE [row_name1]=[value1]
AND [row_name2]=[value2];
- データベース名:Users
- テーブル名:Address
id | name | address |
---|---|---|
1 | sato | tokyo |
2 | tanaka | osaka |
3 | yamada | aichi |
- Databaseの作成(同じ名前のDatabaseがなければ作成)
CREATE DATABASE IF NOT EXISTS Users default character set utf8
- Tableの作成
CREATE TABLE Users.Address (
id int AUTO_INCREMENT,
name varchar(20) NOT NULL DEFAULT '',
address varchar(70) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
);
- recordの挿入
INSERT INTO Address VALUES (NULL, 'kato', 'nagasaki');
id | name | address |
---|---|---|
1 | sato | tokyo |
2 | tanaka | osaka |
3 | yamada | aichi |
4 | kato | nagasaki |
- Databaseの削除
DROP DATABASE Users;
- Tableの削除
DROP TABLE Users.Address;
- columnの条件に該当するrecordの削除
DELETE FROM Users.Address WHERE name="tanaka";
id | name | address |
---|---|---|
1 | sato | tokyo |
3 | yamada | aichi |
- 全件取得
SELECT * FROM Users.Address;
id | name | address |
---|---|---|
1 | sato | tokyo |
2 | tanaka | osaka |
3 | yamada | aichi |
- 列指定
SELECT id, name FROM Users.Address;
id | name |
---|---|
1 | sato |
2 | tanaka |
3 | yamada |
- 条件指定
SELECT * FROM Users.Address WHERE id=1;
id | name | address |
---|---|---|
1 | sato | tokyo |
SELECT * FROM Users.Address WHERE id=2 AND name="tanaka";
id | name | address |
---|---|---|
2 | tanaka | osaka |