【MongoDB】 複数バージョンをスキップしてバージョンアップをしたい

MongoDBをそろそろバージョンアップしないとなー、と思っていたら幾星霜、とうとうやる気になったらなんと3.4から7.0まで上げないといけない、とかいう状況に遭遇した場合、

通常は ローリングアップデート でやるんだろうけれども、そうするとえーと、

3.4 → 3.6 → 4.0 → 4.2 → 4.4 → 5.0 → 6.0 → 7.0

と、なんとまあ、七回もバージョンアップを繰り返さなきゃいけなくなります。

で、ふつうは、じゃあダウンタイムは許容するとしてダンプ&リストアで何とかならないのか、と思いますよね。

でもどこをさがしてもなんか”ダンプ&リストアで何とか”なるのかどうか公式ドキュメントだとよくわからない。

https://www.mongodb.com/community/forums/t/dump-and-restore-between-version-3-6-and-5-0/168933

には

If downtime is acceptable and you have a large number of major releases to upgrade through, you can also consider a migration using mongodump and mongorestore.

とあるものの、

will encounter different issues depending on the provenance of your data

とかあるし、ちょっと心配ですが、まあきちんとテストすれば、というかローリングアップデートしたからといってテストしないわけでもないし、こっちの方が楽かなーと思います。

ちなみにこちらでは docker 使って複数バージョン間バージョンアップを自動化するという力業が紹介されてて、なるほどすごいなーという感じです。

https://stackoverflow.com/questions/37833561/restoring-the-database-dump-of-an-older-version-of-mongo-to-a-new-version-of-mon

【influxdb-1.8】 autogenに無期限に溜まったデータを削除する

何も考えず influxdb の運用を始めてしまい、 /var/lib/influxdb/data/xxx/autogen/ にがっつり昔のデータが溜まってきて、なんかディスクが一杯だし昼頃サーバに負荷がかかるなーとお悩みの諸兄
ALTER RETENTION POLICY "autogen" ON "xxx" DURATION 800d
で autogen の保存期限を無期限から800日に変更できます。 上記のクエリを発行してから1時間程度で、実際にディスクからデータも削除されて、すっきりです。

【bash】 ディレクトリ下の全rarファイルをzipに変換する

変換する、というか展開して、zipに固め直します。

#!/bin/sh

for dir in *.rar;
do
    echo $dir
    bn="${dir%.*}"
    echo $bn
    mkdir "${bn}"
    cd "${bn}"
    unrar e "../${dir}"
    cd ..
    zip -r "${bn}".zip ./"${bn}"/
done

展開したファイルは消してません。
unrarとかzipとかは先にインストールしておきましょう。

【kafka】 kafkaの中身が見たいとき

trifectaを使います。

バイナリがあるので、ビルドは必要ありません。

wget https://github.com/ldaniels528/trifecta/releases/download/v0.22.0rc8-0.9.0.1/trifecta-cli-0.22.0rc8b-0.9.0.1.bin.jar
wget https://github.com/ldaniels528/trifecta/releases/download/v0.22.0rc8-0.9.0.1/trifecta-ui-0.22.0rc8b-0.9.0.1.zip
unzip trifecta-ui-0.22.0rc8b-0.9.0.1.zip
cd trifecta-ui-0.22.0rc8b-0.9.0.1/bin/
./trifecta-ui &

設定が必要なら、$HOME/.trifecta/config.properties を適当に編集して./trifecta-ui &を起動し直します。

ブラウザで hostname:9000 にアクセスします。

“Observe”のタブからkafkaの中身を見れます。

【debezium/kafka】 kafkaに外部から繋ぎたいとき

デフォルトだとkafka:9092に外から繋げません(たぶん)。

docker-compose.yamlに

kafka:
    (snip)
    environment:
        ADVERTISED_LISTENERS: "PLAINTEXT://xxx.xxx.xxx.xxx:9092"

xxx.xxx.xxx.xxxに外部から接続したい、ホストのアドレスを入れるとつながるようになります。

上記のようにした場合は、SECURITY_PROTOCOL_CONFIGをPLAINTEXTにして繋ぐのをお忘れなく。

【ESXi6.5】 VMware Host Client および ssh接続でvmを複製する

vmOSが CentOS 7.6-1810 での例

ESXiは6.5

ESXiにsshログインする

cd /vmfs/volumes/datastore1
mkdir NEW_VM_NAME
cd NEW_VM_NAME
vmkfstools -i "/vmfs/volumes/datastore1/NAME_OF_VM_COPY_FROM/NAME_OF_VM_COPY_FROM_0.vmdk" -d thin "NEW_VM_NAME_0.vmdk"
cp ../NAME_OF_VM_COPY_FROM/NAME_OF_VM_COPY_FROM.vm* .
mv NAME_OF_VM_COPY_FROM.vmx NEW_VM_NAME.vmx
mv NAME_OF_VM_COPY_FROM.vmsd NEW_VM_NAME.vmsd
cp ../NAME_OF_VM_COPY_FROM/NAME_OF_VM_COPY_FROM.nvram NEW_VM_NAME.nvram
sed -i s/NAME_OF_VM_COPY_FROM/NEW_VM_NAME/g NEW_VM_NAME.vmx

データストアブラウザから新機材の.vmxファイルを右クリックし、仮想マシンの登録

ネットワークカードを削除し、また同一のものを作成する(macアドレスが”自動”になってれば不要)

vm起動時、コピーしたのか移動したのか聞かれるので、コピーと答える

vmを起動したら以下のコマンドでホスト名とipアドレスを変更する

vi /etc/hostname
vi /etc/sysconfig/network-scripts/ifcfg-ens192

以上

【CentOS7】 ESXiでrootパーティションの容量を増やす

CentOS 7.6-1810 での例

この方法では、拡張したいパーティションの末尾を変更して拡張するため、fdisk -l とし、当該パーティションが当該ディスクの一番後ろのパーティションであることを確認しておきます。私の環境の場合、/dev/sda2 でした。

確認したら、ESXi側でディスクの容量を増やしておきます。

vmをリブートして、 fdisk /dev/sda とし、拡張したいパーティションを削除し、同じ番号でディスクの最後まで使い切ったパーティションを作成します。pで確認、wで保存するのを忘れずに。

vmをリブートします。

pvresize /dev/sda2
lvextend -l +100%FREE /dev/centos/root
xfs_growfs /dev/mapper/centos-root

と続けて実行します。

以上。

【iptables】 CentOS6でkeepalivedが両マスタ(スプリットブレイン)になってしまうのを解消する

CentOS6でkeepalivedを複数台にインストールして、起動して /var/log/messages を見てみたら、各サーバで Entering MASTER STATE になったまま、一向に Entering BACKUP STATE になる気配がない。
ip a コマンドを叩くと各サーバで仮想ipがバインドされてしまっている。

という問題の原因は、おそらく iptables の設定で、VRRPパケットが REJECT されてしまい、VRRPパケットがサーバ間で疏通してないからです。

iptables-save コマンドでiptablesの設定を確認し、 -A INPUT -p vrrp -j ACCEPT-A INPUT -j REJECT ...(--reject-with icmp-host-prohibited とか)より上に入っているようにします。
-A OUTPUT -p vrrp -j ACCEPT も必要です。

具体的には

iptables -D INPUT -j REJECT --reject-with icmp-host-prohibited
iptables -A INPUT -p vrrp -j ACCEPT
iptables -A OUTPUT -p vrrp -j ACCEPT
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited
iptables-save   (設定を表示して確認)

service iptables save   (設定をセーブ)

service iptables restart

という感じになるかと思います。

ちなみにVRRPはプロトコル番号112のIPプロトコルで、UDP(プロトコル番号17),TCP(プロトコル番号6),ICMP(プロトコル番号1) とは別のプロトコルですので、TCPやUDPなどは内部セグメントで全部通してるのになんで疏通しないのかな、と思いがちですね。

【CentOS7】 MongoDBを2.6から3系にアップデートする

いろいろと面倒なことはせず、サクッとダンプ&リストアでやっつけます。

バックアップ&古いの削除

service mongod stop
mkdir mddump
mongodump --dbpath /var/lib/mongo ./mddump
mkdir mdbackup
mv /var/lib/mongo ./mdbackup/
yum remove mongo*     

3.2インストール

vi /etc/yum.repos.d/mongodb-org-3.2.repo とし、内容を

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

とします。
もっと新しいバージョンにしたい方は https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/ をご参照ください。

yum install mongodb-org mongodb-org-server を実行します。

vi /etc/mongod.conf とし、17行目のコメントを外した上で

engine: wiredTiger

とします。engineという文字列の前に行頭から半角空白が二個入っているようにします。コロンの後ろのスペースも必要です。

リストア

service mongod start
mongorestore ./mddump

以上~

シェルスクリプトをshcを用いてバイナリ化して難読化する

shcはシェルスクリプトを難読化のためにバイナリ化するアプリケーションです。

詳しくはこちら
http://www.datsi.fi.upm.es/~frosal/sources/shc.html

shcのダウンロードとコンパイル

$ wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9b.tgz
$ tar xfzv shc-3.8.9b.tgz
$ cd shc-3.8.9b/
$ make

テスト

vi a.sh

#!/bin/sh
echo "1234hoge#"

./shc -v -f a.sh でコンパイル。
./a.sh.x で動くかどうか確認。
a.sh.xをバイナリエディタで確認し、難読化されているか確認してみてください。

メモ

できあがったa.sh.xはセキュリティのため、他の機材では動かないと思います。
shcに -r オプションをつければ、他の機材でも動くバイナリを作れます。