Skip to content

Oracle

OracleにGoで接続するイメージの軽量化

go-oci8を使ったイメージの、oraclelinux8をベースイメージにしたやつが1.25GBにもなったので、もっと小さくならないか試してみた。

golang:1-bullseyeをベースにした場合、rpmが使えないのでOracleInstantClient関連のzipを展開する方法でやって、1.32GB。増えてる。

Read more

OracleにGoで接続する3

昨日は、mattn/go-oci8: Oracle driver for Go using database/sqlsijms/go-ora: Pure go oracle clientを使ったサンプルをコンテナ上でgo runして動かしていた。

今日はgo buildでバイナリにして実行できるようにしてみる。

何もオプション付けずにビルドしたら、どちらも問題なし。

バイナリサイズを小さくしようと、-ldflags="-s -w -extldflags \"-static\""をつけたところ、go-oraは大丈夫。go-oci8はNGだった。

Read more

OracleサーバーのDockerイメージ

docker-images/OracleDatabase/SingleInstance at main · oracle/docker-imagesはクライアント側みたいにビルド済みイメージが用意されていないのかな、と思ったらOracle Container Registryにそれらしいものを見つけた。

Home > Database > express

$ docker pull container-registry.oracle.com/database/express:latest

サイズやばい

$ docker images | grep ora
oraclelinux                                      8            3bbe8a2c4b82   9 days ago     226MB
oraclelinux                                      8-slim       1fcc1e6dda05   3 weeks ago    101MB
container-registry.oracle.com/database/express   latest       e986fd612413   2 months ago   11.2GB
$ docker run -d container-registry.oracle.com/database/express

$ docker ps
CONTAINER ID   IMAGE                                            COMMAND                  CREATED          STATUS                             PORTS     NAMES
b9c64bc970d7   container-registry.oracle.com/database/express   "/bin/sh -c 'exec $O…"   56 seconds ago   Up 55 seconds (health: starting)             wizardly_dijkstra

$ docker ps
CONTAINER ID   IMAGE                                            COMMAND                  CREATED              STATUS                        PORTS     NAMES
b9c64bc970d7   container-registry.oracle.com/database/express   "/bin/sh -c 'exec $O…"   About a minute ago   Up About a minute (healthy)             wizardly_dijkstra

Statusがhalthyになるまで1分くらいかかった。

Read more

OracleにGoで接続する

前の記事でsqlplusで接続できたので、Goのプログラムから接続してみる。

instantclientベースでGoをインストールするDockerfile作成

FROM ghcr.io/oracle/oraclelinux8-instantclient:21

RUN yum install -y wget tar

RUN wget https://go.dev/dl/go1.18.3.linux-amd64.tar.gz

RUN rm -rf /usr/local/go && tar -C /usr/local -xzf go1.18.3.linux-amd64.tar.gz

ENV PATH="${PATH}:/usr/local/go/bin"

CMD [ "go", "version" ]

docker-composeもそれを使うように修正

version: '3'
services:
  db:
    image: container-registry.oracle.com/database/express
    ports:
      - 1521:1521
    environment:
      - ORACLE_PWD=OraclePwd

  cli:
    build: .
    image: oraclegocli
    tty: true
    command: bash

sijms/go-oraのサンプルファイルを拝借。 importの所はv2に修正。

sh-4.4# vi main.go
sh-4.4# go mod tidy
go: finding module for package github.com/sijms/go-ora/v2
go: downloading github.com/sijms/go-ora/v2 v2.4.24
go: found github.com/sijms/go-ora/v2 in github.com/sijms/go-ora/v2 v2.4.24
sh-4.4# go run main.go  oracle://system:OraclePwd@db:1521/XE

Successfully connected.

接続はできているみたいだけど、SQLの実行結果が表示されない。。

Read more

OracleにGoで接続する2

mattn/go-oci8: Oracle driver for Go using database/sqlでやってみる。

sh-4.4# go run go-oci8/main.go 
# pkg-config --cflags  -- oci8
pkg-config: exec: "pkg-config": executable file not found in $PATH
sh-4.4# yum install -y pkgconfig
sh-4.4# go run go-oci8/main.go 
# pkg-config --cflags  -- oci8
Package oci8 was not found in the pkg-config search path.
Perhaps you should add the directory containing `oci8.pc'
to the PKG_CONFIG_PATH environment variable
Package 'oci8', required by 'virtual:world', not found
pkg-config: exit status 1

とりあえずmain.goと同じところにoci8.pcを作成。中身はExamples

sh-4.4# export PKG_CONFIG_PATH=.
sh-4.4# go run go-oci8/main.go 
# github.com/mattn/go-oci8
cgo: C compiler "gcc" not found: exec: "gcc": executable file not found in $PATH
sh-4.4# yum install -y gcc
sh-4.4# go run go-oci8/main.go 
# github.com/mattn/go-oci8
In file included from vendor/github.com/mattn/go-oci8/c_helpers.go:3:
./oci8.go.h:1:10: fatal error: oci.h: No such file or directory
 #include <oci.h>
          ^~~~~~~
compilation terminated.
sh-4.4# find / | grep oci.h
/usr/include/oracle/21/client64/oci.h

oci8.pcのincludedirを/usr/include/oracle/21/client64に変更。

Read more

OracleのDockerイメージ

oracle/docker-images: Official source for Docker configurations, images, and examples of Dockerfiles for Oracle products and projects にまとめられている。

サーバー側:docker-images/OracleDatabase at main · oracle/docker-images

クライアント側:docker-images/OracleInstantClient at main · oracle/docker-images

ベースイメージはOraclelinux - Official Image | Docker Hubが使われている(結構でかい)。

$ docker images | grep ora
oraclelinux              8            3bbe8a2c4b82   6 days ago     226MB
oraclelinux              8-slim       1fcc1e6dda05   3 weeks ago    101MB

OCHaCafe Premium#1:Oracle Cloudで考える高可用性アーキテクチャ

OCHaCafe Premium#1:Oracle Cloudで考える高可用性アーキテクチャ

https://ochacafe.connpass.com/event/152768/

番外編の第1回。高可用性の話です。

18:30 受付開始 

19:00 オープニング

19:10 セッション開始

  • https://speakerdeck.com/mmarukaw/oracleclouddekao-erugao-ke-yong-xing-akitekutiya
  • データセンター電源障害の話から
  • OCIはまだ日本に来てから日が浅いこともあり、大規模障害はまだない。
    • 海外ではあった
  • Design For Failure
    • サーバーは落ちる前提で考える
    • クラウドベンダーの保証はSLAの範囲内まで
    • アプリケーションの最終責任はユーザーが負う
    • 高可用性のためのコストと複雑性を、軽減できるリスクに対してバランスを取る
  • 高可用性とは
    • システムが継続して可動できる能力が高いこと
    • クラウドでもオンプレのときと考え方は同じ
    • クラウドの特性として高可用性を比較的低コストで実現できる
  • 障害のレベル
    • 機器障害
      • プロセスだったりハードウェアだったり
    • サイト障害
      • DCレベル
    • 広域災害
      • 地域まるごと
  • クラウドのリソースが備える特性を活かす
    • 本質的に堅牢なOCIリソース
      • オブジェクトストレージ
        • 耐障害性、安価、各種サービスとの連携
      • ロードバランサー
        • トラフィックの高可用性
        • サイトレベルの耐障害性
      • OKE(K8s)
        • クラスタとノードプールの自己回復
      • Exadata Cloud ServiceとAutonomous Database
        • Oracle Databaseの高可用性プラクティスが詰め込まれている
        • RACでスケール
      • OCI DNS
        • グローバルレベルの耐障害性
    • ユーザーに寄る高可用性実装を支援する
      • リソース配置
        • リージョン
        • 可用性ドメイン(AD)
          • データセンター
          • 東京はまだ1つなので、AZ障害イコールリージョン障害
          • データセンター間の通信は低レーテンシー
        • フォルト・ドメイン
          • DC内のサーバラック群をグループ化したもの
          • 仮想サーバーを別々の物理サーバーに配置したいときに有効
      • リソースの有効範囲
        • グローバル>リージョン>可用性ドメイン>フォルト・ドメイン
        • リージョンレベルのリソース(VCN)でリージョンまたぎをしたいときはピアリングをする必要がある
        • リージョナルサブネットというのがある

19:43 10分休憩

ビール投入

Read more