MongoDBレプリケーション+シャーディング

 

https://changineer.info/server/nosql/nosql_mongo_sharding.html

前提
OS : Rocky Linux 9.1
MongoDB version : 6.0.3

mmm190 : mongos
mmm191 : MongoDB(config) primary
mmm192 : MongoDB(config) secondary
mmm193 : MongoDB(config) secondary
mmm194 : MongoDB(Shard#1) primary
mmm195 : MongoDB(Shard#1) secondary
mmm196 : MongoDB(Shard#1) secondary
mmm197 : MongoDB(Shard#2) primary
mmm198 : MongoDB(Shard#2) secondary
mmm199 : MongoDB(Shard#2) secondary

 

-- 1. MongoDBインストール[全ノードで実施]

vim /etc/yum.repos.d/mongodb-org-6.0.repo

[mongodb-org-6.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/6.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-6.0.asc


dnf install -y mongodb-org

 

systemctl enable mongod
systemctl restart mongod
systemctl status mongod

mongod --version

-- 2. Config Server設定[mmm191,mmm192,mmm193で実施]

vim /etc/mongod.conf

bindIp: 0.0.0.0

replication:
  replSetName: rs01
  oplogSizeMB: 1024

sharding:
  clusterRole: configsvr


systemctl restart mongod

-- 3. Config Server構築[mmm191で実施]

mongosh

rs.initiate(
  {
    _id: "rs01",
    configsvr: true,
    members: [
      { _id : 0, host : "192.168.137.191:27017", priority : 4 },
      { _id : 1, host : "192.168.137.192:27017", priority : 2 },
      { _id : 2, host : "192.168.137.193:27017", priority : 1 }
    ]
  }
)

rs.conf()
rs.status();

-- 4. Shard#1 設定[mmm194,mmm195,mmm196で実施]

vim /etc/mongod.conf

bindIp: 0.0.0.0

replication:
  replSetName: rs02
  oplogSizeMB: 1024

sharding:
  clusterRole: shardsvr

systemctl restart mongod

-- 5. Shard#1 構築[mmm194で実施]

mongosh

rs.initiate(
  {
    _id: "rs02",
    members: [
      { _id : 0, host : "192.168.137.194:27017", priority : 4 },
      { _id : 1, host : "192.168.137.195:27017", priority : 2 },
      { _id : 2, host : "192.168.137.196:27017", priority : 1 }
    ]
  }
)

rs.conf()
rs.status();


-- 6. Shard#2 設定[mmm197,mmm198,mmm199で実施]

vim /etc/mongod.conf

bindIp: 0.0.0.0

replication:
  replSetName: rs03
  oplogSizeMB: 1024

sharding:
  clusterRole: shardsvr

systemctl restart mongod

-- 7. Shard#2 構築[mmm197で実施]

mongosh

rs.initiate(
  {
    _id: "rs03",
    members: [
      { _id : 0, host : "192.168.137.197:27017", priority : 4 },
      { _id : 1, host : "192.168.137.198:27017", priority : 2 },
      { _id : 2, host : "192.168.137.199:27017", priority : 1 }
    ]
  }
)

rs.conf()
rs.status();

-- 8. mongos 設定[mmm190で実施]

vim /etc/mongos.conf

net:
  bindIp: 127.0.0.1

sharding:
  configDB: rs01/192.168.137.191:27017,192.168.137.192:27017,192.168.137.193:27017


systemctl stop mongod
systemctl disable mongod

mongos --config /etc/mongos.conf

 

-- 9. クラスタへシャード追加[mmm190で実施]

別ターミナルから実行

mongosh


sh.status()


sh.addShard("rs02/192.168.137.194:27017,192.168.137.195:27017,192.168.137.196:27017")
sh.addShard("rs03/192.168.137.197:27017,192.168.137.198:27017,192.168.137.199:27017")

sh.status()


-- 10. 動作確認[mmm190で実施]


db.dropDatabase()
sh.shardCollection("test.tab1" , { col1 : "hashed"})
db.tab1.getIndexes()

db.tab1.insertMany([
   { col1: -10, col2: "val1" },
   { col1:   0, col2: "val2" },
   { col1:  10, col2: "val3" }
]);

sh.status();

db.tab1.find({col1: -10}).explain()
db.tab1.find({col1:  10}).explain()


mmm191,mmm194,mmm197を強制停止して再実行

killall mongod
ps -ef | grep mongod

 

 

 

 

Redisレプリケーション+シャーディング

https://changineer.info/server/nosql/nosql_redis_cluster.html

前提
OS : Rocky Linux 9.1
Redis version : 6.2.7

mmm191 : Redis master(Shard#1)
mmm192 : Redis master(Shard#2)
mmm193 : Redis master(Shard#3)
mmm194 : Redis replica(Shard#1)
mmm195 : Redis replica(Shard#2)
mmm196 : Redis replica(Shard#3)

 

-- 1. Redisインストール[mmm191,mmm192,mmm193,mmm194,mmm195,mmm196で実施]

dnf install -y redis

redis-server --version


-- 2. Redisシャード設定[mmm191,mmm192,mmm193,mmm194,mmm195,mmm196で実施]


vim /etc/redis/redis.conf


bind 127.0.0.1 -::1

bind 0.0.0.0


# cluster-enabled yes

cluster-enabled yes

# cluster-config-file nodes-6379.conf

cluster-config-file nodes-6379.conf

# cluster-node-timeout 15000

cluster-node-timeout 15000

appendonly no

appendonly yes

systemctl enable redis
systemctl restart redis
systemctl status redis

 

tail /var/log/redis/redis.log 


-- 3. Redisシャード構築[mmm191で実施]

redis-cli --cluster create \
192.168.137.191:6379 \
192.168.137.192:6379 \
192.168.137.193:6379 \
192.168.137.194:6379 \
192.168.137.195:6379 \
192.168.137.196:6379 \
--cluster-replicas 1


redis-cli -c


cluster info
cluster nodes


-- 4. 動作確認[mmm191,mmm192,mmm193,mmm194,mmm195,mmm196で実施]

redis-cli -c

set key1 val1
set key2 val2
set key3 val3
set key4 val4
set key5 val5
set key6 val6

get key1
get key2
get key3
get key4
get key5
get key6

 

killall redis-server
ps -ef | grep redis

systemctl stop redis
systemctl start redis

redis-cli -c cluster nodes

redis-cli -c get key1


mmm191を強制停止 -> replicaの中からmasterが選出されmasterが3台になる
mmm191を復旧 -> replicaとして組み込まれる


masterを元のノードに戻したい場合、手動フェイルオーバーをreplicaで実行する

redis-cli -c cluster failover

 

 

 

{GCP Cloud Storage}ターボ レプリケーション

 

https://cloud.google.com/storage/docs/turbo-replication?hl=ja
https://cloud.google.com/storage/docs/locations?hl=ja


ターボ レプリケーションは Cloud Storage の機能で、挿入、書き換え、コピー、作成などのオペレーションに関連して
新しく作成された Cloud Storage オブジェクトをそのサイズに関係なく、15 分以内に別のリージョンへ複製するように設計されています。


下記4種類のバケットを作成

①Multi-region
EU -> 欧州連合の加盟国内のデータセンター

②Dual-region(デフォルトレプリケーション)
US-EAST1 -> サウスカロライナ
US-WEST1 -> オレゴン


③Dual-region(ターボレプリケーション)
ASIA-EAST1 -> 台湾
ASIA-SOUTHEAST1 -> シンガポール

④Region
ASIA-NORTHEAST1 -> 東京


-- 1. 前作業

gcloud init
gcloud auth list

gcloud --version

gcloud projects create project01-9999999 \
--name="project01"

gcloud config list
gcloud config set project project01-9999999
gcloud config set compute/region asia-northeast1 --quiet
gcloud config set compute/zone asia-northeast1-a --quiet

gcloud beta billing accounts list
gcloud beta billing projects link project01-9999999 --billing-account=111111-111111-111111

gcloud services enable compute.googleapis.com --project project01-9999999

gcloud components update


-- 2. マルチリージョン バケットを作成する
EU -> 欧州連合の加盟国内のデータセンター

gsutil mb -l EU gs://bucket12301/

gsutil ls -Lb gs://bucket12301

-- 3. デュアルリージョン バケットを作成する(デフォルトレプリケーション)
US-EAST1 -> サウスカロライナ
US-WEST1 -> オレゴン


gsutil mb -l US --placement US-EAST1,US-WEST1 gs://bucket12302/

gsutil ls -Lb gs://bucket12302


-- 4. デュアルリージョン バケットを作成する(ターボレプリケーション)
ASIA-EAST1 -> 台湾
ASIA-SOUTHEAST1 -> シンガポール


gsutil mb -l ASIA --placement ASIA-EAST1,ASIA-SOUTHEAST1 gs://bucket12303/

gsutil ls -Lb gs://bucket12303


gsutil rpo set ASYNC_TURBO gs://bucket12303/

gsutil rpo get gs://bucket12303/

-- 5. シングルリージョン バケットを作成する
ASIA-NORTHEAST1 -> 東京

gsutil mb -l ASIA-NORTHEAST1 gs://bucket12304/

gsutil ls -Lb gs://bucket12304


-- 6. クリーンアップ


gsutil rm -r gs://bucket12301
gsutil rm -r gs://bucket12302
gsutil rm -r gs://bucket12303
gsutil rm -r gs://bucket12304
gsutil ls


gcloud projects list

gcloud projects delete project01-9999999 \
--quiet

 

 

{Azure Storage}ブロック BLOB のオブジェクト レプリケーションを構成する



https://learn.microsoft.com/ja-jp/azure/storage/blobs/object-replication-configure?tabs=azure-cli
https://learn.microsoft.com/ja-jp/azure/storage/blobs/object-replication-overview


オブジェクトのレプリケーションでは、ソース アカウントと宛先アカウントの両方で BLOB のバージョン管理が有効になっている必要があります。
また、ソース アカウントで BLOB の変更フィードが有効になっている必要もあります。

 

-- 1. 前作業

az login --use-device-code
az account show

az version

az configure --list-defaults
az configure --defaults location=japaneast
az configure --list-defaults

az group create \
--name rg9999999 \
--location japaneast


az group list
az upgrade


-- 2. ストレージアカウントの作成

az storage account create \
--resource-group rg9999999 \
--name st12301 \
--access-tier Hot \
--kind StorageV2 \
--sku Standard_LRS

az storage account create \
--resource-group rg9999999 \
--name st12302 \
--access-tier Hot \
--kind StorageV2 \
--sku Standard_LRS


az storage account list \
--resource-group rg9999999


-- 3. ソースストレージアカウントでBLOBのバージョン管理と変更フィードを有効にする

az storage account blob-service-properties update \
--resource-group rg9999999 \
--account-name st12301 \
--enable-versioning true \
--enable-change-feed true

az storage account blob-service-properties show \
--resource-group rg9999999 \
--account-name st12301

-- 4. 宛先ストレージアカウントでBLOBのバージョン管理を有効にする

az storage account blob-service-properties update \
--resource-group rg9999999 \
--account-name st12302 \
--enable-versioning true


az storage account blob-service-properties show \
--resource-group rg9999999 \
--account-name st12302

 

-- 5. コンテナーの作成

key01=$(az storage account keys list \
--account-name st12301 \
--resource-group rg9999999 \
--output json \
--query [0].value | tr -d '"')

echo $key01

key02=$(az storage account keys list \
--account-name st12302 \
--resource-group rg9999999 \
--output json \
--query [0].value | tr -d '"')

echo $key02


az storage container create \
--name container01 \
--account-name st12301 \
--public-access off \
--account-key $key01

az storage container create \
--name container02 \
--account-name st12302 \
--public-access off \
--account-key $key02

az storage container list \
--account-name st12301 \
--account-key $key01

az storage container list \
--account-name st12302 \
--account-key $key02

 


-- 6. 宛先ストレージアカウントにレプリケーションポリシーを作成

az storage account or-policy create \
--account-name st12302 \
--resource-group rg9999999 \
--source-account st12301 \
--destination-account st12302 \
--source-container container01 \
--destination-container container02

az storage account or-policy list \
--account-name st12302 \
--resource-group rg9999999

az storage account or-policy show \
--account-name st12302 \
--resource-group rg9999999 \
--policy-id 11111111-1111-1111-1111-111111111111

 

-- 7. ソースストレージアカウントにレプリケーションポリシーを作成


az storage account or-policy show \
--resource-group rg9999999 \
--account-name st12302 \
--policy-id 11111111-1111-1111-1111-111111111111 > policy.json

cat policy.json


az storage account or-policy create \
--resource-group rg9999999 \
--account-name st12301 \
--policy @policy.json

 

az storage account or-policy list \
--account-name st12301 \
--resource-group rg9999999


az storage account or-policy show \
--account-name st12301 \
--resource-group rg9999999 \
--policy-id 11111111-1111-1111-1111-111111111111

 

-- 8. ソースストレージアカウントのコンテナーにオブジェクトをアップロード

echo test > test.txt

az storage blob upload \
--account-name st12301 \
--container-name container01 \
--name test.txt \
--file test.txt \
--account-key $key01

 

az storage blob list \
--account-name st12301 \
--container-name container01 \
--output table \
--account-key $key01


az storage blob list \
--account-name st12302 \
--container-name container02 \
--output table \
--account-key $key02

 

-- 9. BLOB のレプリケーションの状態を確認する

az storage blob show \
--account-name st12301 \
--container-name container01 \
--name test.txt \
--account-key $key01


az storage blob show \
--account-name st12301 \
--container-name container01 \
--name test.txt \
--account-key $key01 \
--query 'objectReplicationSourceProperties.rules.status' \
--output tsv

 

-- 10. クリーンアップ

az storage account delete \
--resource-group rg9999999 \
--name st12301 \
--yes

az storage account delete \
--resource-group rg9999999 \
--name st12302 \
--yes

az group list
az group delete \
--name rg9999999 \
--yes

 

Redisシャーディング

 

https://changineer.info/server/nosql/nosql_redis_cluster.html
https://qiita.com/keitatata/items/44678ad472e61a4606c5

 

前提
OS : Rocky Linux 9.1
Redis version : 6.2.7

mmm191 : Redis master(Shard#1)
mmm192 : Redis master(Shard#2)
mmm193 : Redis master(Shard#3)


Note that the minimal cluster that works as expected must contain at least three master nodes.


-- 1. Redisインストール[mmm191,mmm192,mmm193で実施]

dnf install -y redis

redis-server --version


-- 2. Redisシャード設定[mmm191,mmm192,mmm193で実施]


vim /etc/redis/redis.conf


bind 127.0.0.1 -::1

bind 0.0.0.0


# cluster-enabled yes

cluster-enabled yes

# cluster-config-file nodes-6379.conf

cluster-config-file nodes-6379.conf

# cluster-node-timeout 15000

cluster-node-timeout 15000

appendonly no

appendonly yes

systemctl enable redis
systemctl restart redis
systemctl status redis

 

tail /var/log/redis/redis.log 


-- 3. Redisシャード構築[mmm191で実施]

redis-cli --cluster create \
192.168.137.191:6379 \
192.168.137.192:6379 \
192.168.137.193:6379 \
--cluster-replicas 0


redis-cli -c


cluster info
cluster nodes


-- 4. 動作確認[mmm191,mmm192,mmm193で実施]

redis-cli -c

set key1 val1
set key2 val2
set key3 val3

get key1
get key2
get key3