搜尋此網誌

顯示具有 DATABASE 標籤的文章。 顯示所有文章
顯示具有 DATABASE 標籤的文章。 顯示所有文章

2022年6月19日 星期日

考核的當下我感覺我不是面對考核官員,而是面對著十幾年前的我

自己是沒有定期更新內容的習慣..... 但這陣子因為工作上的因素,想了想也跟 MariaDB 這個軟體一起工作了三年時光。

2022/6/15這一天讓我在客戶的生產環境下通過了考驗,有感而發......對自己寫一點紀錄吧。


十幾年前我老是羨慕為何有些公司能夠提供永遠不會打烊的軟體服務,

拜當今疫情關係,網路上充滿免費的活動與課程,

現在我也能夠輕易打造出來,而且居然還能在客戶面前一步一步表演MariaDB的災害復原。


考核的當下我感覺我不是面對考核官員,而是面對著十幾年前的我。有感而發......對自己寫下了此文。

同時... 我思考著這場旅途似乎在靠近終點站,該思考下一條成長動能的新旅途。



I am not in the habit of updating my page on a regular basis..... 

I have been working with MariaDB for 3 years now, 

but I think I passed the test in a customer's production environment on 2022/6/15. 

I was inspired in the moment... I'd like to write a little record for myself. 


A decade ago I was always envious of how some companies could offer software services that never closed, 

and thanks to the current epidemic, the internet is full of free events and courses. 


At the time of the appraisal I felt like I was not facing an appraisal officer, 

but the person I was over 10 years ago. 


I was inspired in the moment. I wrote this article to myself. 

Meanwhile... I think about how this journey seems to be approaching the end of the line, 

and how it is time to think about the next journey of growth momentum.



The knowledge that has allowed me to grow is here for those who are interested to share it

https://galeracluster.com/library/documentation/weighted-quorum.html

https://severalnines.com/database-blog/multiple-data-center-setups-using-galera-cluster-mysql-or-mariadb


2022年6月5日 星期日

MariaDb 歲修保養維護 - 模式二:資料庫叢集服務全面停止

很重要請先參照備份與還原章節實施備份,再繼續往下。

尤其是選擇要將叢集成員全部停機的歲修保養方式

如果一定要將叢集成員全部停機亦可,不過非常不推薦,除非遭遇到不可抗力之因素。


以下假設由 4 台 MariaDB 組成了  Galery Cluster


服務全停的【關閉】順序:

  • 關閉MariaDB服務指令是:systemctl stop mariadb

  • 依權重順序關機,第四台 → 第三台 → 第二台 → 第一台

  • 關機過程中,間隔請等待至少五秒,讓投票機制完善。

  • 待全部依序關閉服務後,查看所有節點grastate.dat內容,執行:

    cat /var/lib/mysql/grastate.dat

  • 看到狀態:第一台服務節點的seqno 值最大,唯獨第一台服務節點的safe_to_bootstrap值為1。表示下次開機順序該節點必須為最優先,務必記錄下來。

  • 截至為止已經可以將全部資料庫節點進行關機。



服務全停的【啟動】順序:
  • 根據上次關閉服務結果所指定的節點作為第一台。

  • 第一台資料庫節點手動修改 /etc/my.cnf.d/server.cnf檔案:暫時調整為
    wsrep_cluster_address='gcomm://'。

  • 第一台資料庫節點的/var/lib/mysql/grastate.dat檔案safe_to_bootstrap: 1。

  • 第一台資料庫節點執行啟動 systemctl start mariadb

  • 第一台資料庫節點確認結果,執行:
    mysql -uroot -p1qaz2wsx -e "SHOW STATUS LIKE 'wsrep%';" | grep wsrep_ready

    mysql -uroot -p1qaz2wsx -e "SHOW STATUS LIKE 'wsrep%';" | grep wsrep_cluster_size

    第一台資料庫節點畫面上要看到如下:
    wsrep_ready     ON
    wsrep_cluster_size      1

    註:如果發生沒有辦法啟動,肯定是背景中還有Mariadb的服務沒有關閉,可以執行:netstat -ntlp,查出mariadbd的 process id,然後執行kill -9 id號碼來關閉Mariadb的服務。



  • 第二台資料庫節點執行啟動

    systemctl start mariadb

  • 第二台資料庫節點確認結果,執行:

    mysql -uroot -p1qaz2wsx -e "SHOW STATUS LIKE 'wsrep%';" | grep wsrep_ready

    mysql -uroot -p1qaz2wsx -e "SHOW STATUS LIKE 'wsrep%';" | grep wsrep_cluster_size


  • 第二台資料庫節點畫面上要看到如下:

    wsrep_ready     ON
    wsrep_cluster_size      2

    註:如果發生沒有辦法啟動,肯定是背景中還有Mariadb的服務沒有關閉,可以執行:netstat -ntlp,查出mariadbd的 process id,然後執行kill -9 id號碼來關閉Mariadb的服務。




  • 第三台資料庫節點執行啟動

    systemctl start mariadb

  • 第三台資料庫節點確認結果,執行:

    mysql -uroot -p1qaz2wsx -e "SHOW STATUS LIKE 'wsrep%';" | grep wsrep_ready

    mysql -uroot -p1qaz2wsx -e "SHOW STATUS LIKE 'wsrep%';" | grep wsrep_cluster_size


  • 第三台資料庫節點畫面上要看到如下:
    wsrep_ready     ON
    wsrep_cluster_size      3

    註:如果發生沒有辦法啟動,肯定是背景中還有Mariadb的服務沒有關閉,可以執行:netstat -ntlp,查出mariadbd的 process id,然後執行kill -9 id號碼來關閉Mariadb的服務。



  • 第四台資料庫節點執行啟動

    systemctl start mariadb
  • 第四台資料庫節點確認結果,執行:

    mysql -uroot -p1qaz2wsx -e "SHOW STATUS LIKE 'wsrep%';" | grep wsrep_ready

    mysql -uroot -p1qaz2wsx -e "SHOW STATUS LIKE 'wsrep%';" | grep wsrep_cluster_size

  • 第四台資料庫節點畫面上要看到如下:
    wsrep_ready     ON
    wsrep_cluster_size      4

    註:如果發生沒有辦法啟動,肯定是背景中還有Mariadb的服務沒有關閉,可以執行:netstat -ntlp,查出mariadbd的 process id,然後執行kill -9 id號碼來關閉Mariadb的服務。

  • 回到第一台資料庫節點,修改 /etc/my.cnf.d/server.cnf檔案:
    調整為 wsrep_cluster_address='gcomm://所有其他節點的IP以逗號隔開'
    調整好之後,已不需要再重啟服務。

- 完成  -

MariaDB 歲修保養維護 - 模式一:資料庫叢集服務不停止

很重要! 請先參照備份與還原章節實施備份,再繼續往下。
尤其是選擇要將叢集成員全部停機的歲修保養方式

如果一定要將叢集成員全部停機亦可,不過非常不推薦,除非遭遇到不可抗力之因素。


以下假設由 4 台 MariaDB 組成了  Galery Cluster


相對而言,服務不停止情況下的作業方式為最簡單,

原則:最晚加入群集的節點為最優先關機進行歲修保養。

方法:分辨出最早(領頭羊)與最晚的群集內節點,那要如何找出來呢?

查找資料庫叢集各台成員的 /var/log/mariadb/mariadb.log 檔案內容尾部(注意:是內容的尾)
參考以下示意圖:


… () …

View:

  id: 1c06ce49-bcd3-11ec-b14e-8b8dee207a31:1172

  status: primary

  protocol_version: 4

  capabilities: MULTI-MASTER, CERTIFICATION, PARALLEL_APPLYING, REPLAY, ISOLATION, PAUSE, CAUSAL_READ, INCREMENTAL_WS, UNORDERED, PREORDERED, STREAMING, NBO

  final: no

  own_index: 1

  members(3):

        0: 07b735c5-c5f1-11ec-960f-dfe621728932, node3

        1: ce7be80b-c5f0-11ec-97f3-633bd2a0f1e8, node2

        2: f3284315-c633-11ec-8919-96b52b18760a, node1

        3: 01b775c5-c5f1-12ec-ab0f-dfe621246932c, node4

… () …


從 LOG 內容得知:


示意圖內的Node3 可被視為領頭羊,領頭羊節點是機器之間投票是推選出來的,不是開機愈久就是領頭羊。示意圖內的Node4可被視為最晚加入,成為叢集成員身份的時間最短。

以下敘述先以Node4做為歲修保養對象:
  • 至Node4資料庫節點上,正式關閉MariaDB服務指令是:

    systemctl stop mariadb

  • 將Node4資料庫節點關機進行歲修或保養等其他。

  • 完成後將Node4資料庫節點開機

  • 確認Node4資料庫節點有是否成功加入MariaDB Galera叢集內,執行:

    mysql -uroot -p1qaz2wsx -e "SHOW STATUS LIKE 'wsrep%';" | grep wsrep_ready


  • Node 4資料庫節點畫面上要看到如下:

    wsrep_ready     ON

    如果無法得到以上資訊,表示沒有啟動成功。

  • 嘗試Node4資料庫節點,執行:

    mysql -uroot -p1qaz2wsx -e "SHOW STATUS LIKE 'wsrep%';" | grep wsrep_cluster_size

    Node 4資料庫節點畫面上要看到如下:

    wsrep_cluster_size      4

    如果無法得到以上資訊,表示沒有啟動成功,檢查Node4資料庫節點
    查看/etc/my.cnf.d/server.cnf檔案內容的 wsrep_cluster_address='gcomm://….'。

    其IP順序不能指向自己,必須要指向正在運行的其他資料庫節點。

  • 在Node4資料庫節點成功重新加入叢集之後,依此類推:Node1 → Node2 → Node 3,逐步完成資料庫節點歲修保養。




MariaDB 資料庫叢集的保護機制

 (原文:https://galeracluster.com/2016/11/introducing-the-safe-to-bootstrap-feature-in-galera-cluster )

資料庫叢集MariaDB Galera Cluster 的設計是朝服務啟動之後就永不停止,在平時的運作上不需要關閉整座叢集。然而實際運維過程上有可能遭遇到意外,例如被無預警斷網、停電等等。因此為了因應各種無預警狀況,導入了一項被稱為【Safe-To-Bootstrap】的管制機制。


其原理是當一個健康叢集所有成員(資料庫節點)均處於服務運作狀態時,每一台節點的【Safe-To-Bootstrap】值被設置為0,而健康叢集運行過程會推選出領頭羊(Primary) 節點,只有按順序將領頭羊節點留在最後一台關機者,該領頭羊的【Safe-To-Bootstrap】才會被設置為1。而被設置為1者,並且在所有節點重新復原啟動過程中,【還必須】是第一台開機啟動者,這樣叢集才能夠自動的恢復起來


在此引用名詞【柵欄】形容用來阻擋資料庫成員脫離了MariaDB Galera Cluster後獨自對外提供服務,導致發生比災難更大的災難。也就是資料庫發生腦裂現象(split-brain)。資料被打散個別儲存於MariaDB Galera Cluster之內與外,嚴重程度到無法重新復原。為阻止此現象,透過【柵欄】設計,阻擋資料庫服務節點於不正常關閉停止後服務又被自動啟動,如此降低發生腦裂現象風險。


而這樣的刻意設計安排,目的是希望經由人員介入判斷後再排除障礙使其恢復MariaDB Galera Cluster服務。現實中有很高的機率在搶時間恢復服務壓力下,直接啟動所有的資料庫節點服務。而這樣的行為,如果不阻擋很容易演變人為介入的資料庫腦裂現象。而這就常演變為服務中斷時間愈來愈久。


MariaDB 資料庫備份與還原



一、MariaDB資料庫資料備份

由於資料會依據使用量逐漸擴增,目錄空間是需要額外考量的課題。
請事先安排好備份資料的目錄,不要占用到CENTOS作業系統的空間而導致系統不穩定。資料備份命令如下:

mysqldump --single-transaction  --quick  -u$u -p$pwd  omnistore  > $target  &&  gzip $target

(1)$u $pwd 分別代入 root1qaz2wsx,請依需求自行變更。
(2)$target 代入路徑與檔名,例如 /tmp/backup.sql,請依需求自行變更。
(3):上述命令會將備份資料ZIP壓縮起來,請依需求自行變更。
(4):盡可能安排於離峰時間進行資料庫備份作業


二、 MariaDB資料庫資料還原

建議要還原資料之前,MariaDB Galera Cluster 均已經建立好。在第一台節點上
執行資料還原命令如下

mysql -u$u -p$pwd  omnistore  < $target

(1)$u $pwd 分別代入 root1qaz2wsx,請依需求自行變更。
(2)$target 代入路徑與檔名,例如 /tmp/backup.sql,請依需求自行變更。


三、 透過第三方軟體進行備份

可參考官網推薦的 mydump 工具
https://mariadb.com/kb/en/mariadb-backups-overview-for-sql-server-users/




安裝 MariaDB

嗯.... 因工作因素,經常要安裝 MariaDB,整理以下常用資訊


MariaDB 版本 10.x.x

安裝:

可以先到這裡決定好要下載自己喜歡的平台版本

我個人習慣都是在 CentOS上,因為企業客戶大都受限於資安法規因素,選擇上偏向於合規居多。

https://mariadb.org/download/?t=repo-config


不知道攻城獅是否注意到 台灣有新增一個 MIRROR SITE 了,速度很快

tw1.mirror.blendbyte.net

大部分SE工程師不太在意,但是如果要常常製作 OFF-LINE TAR 安裝包去客戶端安裝的人

沒遇過客戶端不能連接INTERNET 的 SE 攻城獅 算是很幸福的!


我個人的安裝習慣是

yum install -y MariaDB-server MariaDB-common MariaDB-backup MariaDB-client


啟動參數:

以下也是我個人的習慣

先從第一台資料庫節點開始設定,執行以下命令:

cp /etc/my.cnf.d/server.cnf  /etc/my.cnf.d/server.cnf.bak

編輯vi /etc/my.cnf.d/server.cnf

找到 [mysqld] 以後,加入以下:


#datadir=/var/lib/mysql            #保留日後使用

#socket=/var/lib/mysql/mysql.sock   #保留日後使用

#pid-file=/run/mariadb/mariadb.pid  #保留日後使用

# query_cache_type=0/1/DEMAND   #保留日後使用

query_cache_type=DEMAND

query_cache_size=8864000

log-error=/var/log/mariadb/mariadb.log

slow_query_log_file=/var/log/mariadb/slow-mariadb.log

long_query_time=2

bind-address=0.0.0.0

lower_case_table_names=1

collation-server=utf8mb4_unicode_ci

init-connect='SET NAMES utf8mb4'

character-set-server=utf8mb4

skip-name-resolve

max_connections=819200        # 開最大讓系統會動態自行調節

max_connect_errors=1000

max_allowed_packet=4096M

connect_timeout=15

innodb_buffer_pool_size=8G

innodb_buffer_pool_instances=16

innodb_buffer_pool_chunk_size=128M

innodb_fast_shutdown=0


存檔後、執行以下命令啟動MariaDB資料庫:

mkdir -p /var/log/mariadb/

touch /var/log/mariadb/mariadb.log

touch /var/log/mysqld.log

touch /var/run/mysqld.pid

chmod 666 /var/log/mysqld.log

chmod 666 /var/run/mysqld.pid

chown -R mysql:mysql /var/log/mariadb

systemctl disable firewalld; systemctl stop firewalld

systemctl enable mariadb

systemctl restart mariadb

systemctl status -l mariadb


確認Mariadb LOG 檔案紀錄狀態結果:

cat /var/log/mariadb/mariadb.log


設定資料庫 root 帳號的登入密碼,假設密碼為 1qaz2wsx

mysql -h localhost -u root

FLUSH PRIVILEGES;

ALTER USER 'root'@'%' IDENTIFIED BY '1qaz2wsx';

ALTER USER 'root'@'localhost' IDENTIFIED BY '1qaz2wsx';

FLUSH PRIVILEGES;

SHOW GRANTS;

exit


將資料庫設定開放 root 連線,執行以下命令:

mysql -h localhost -u root

FLUSH PRIVILEGES;

GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY '1qaz2wsx' WITH GRANT OPTION;

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '1qaz2wsx' WITH GRANT OPTION;

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost.localdomain' IDENTIFIED BY '1qaz2wsx' WITH GRANT OPTION;

FLUSH PRIVILEGES;

exit


確定第一台資料庫服務正確啟動之後,其他資料庫節點仿照上述步驟逐一完成相關設定與啟動。




2018年1月18日 星期四

MS SQL Server 更改資料庫為單一使用者模式,或取消單一使用者模式



----------------
管理者操作
----------------
USE master;
GO

--將資料庫 AdventureWorks 更改為單一使用者模式
ALTER DATABASE AdventureWorks
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
GO

--將資料庫 AdventureWorks 更改為唯獨
ALTER DATABASE AdventureWorks
SET READ_ONLY;
GO

--將資料庫AdventureWorks 更改為非單一使用者模式
ALTER DATABASE AdventureWorks
SET MULTI_USER;
GO

參考:
http://technet.microsoft.com/zh-tw/library/ms345598.aspx

2017年5月26日 星期五

Mariadb Galera Cluster Replication


建立 Mariadb 的叢集備援環境
架構:
Node1: 192.168.1.251
Node2: 192.168.1.252
Proxy: 192.168.1.253



Node1 與 Node2 均為 Primary 身份運作,彼此相互備援。
前端 HTTP Server 透過 MySQL Router(Proxy) 可以連結到後端的 DB Server
當 叢集裡 有任一 Node 失能,Proxy 自動避開維持運作。

1. 每一台 LINUX 都先關閉 SELINUX
---
vi /etc/selinux/config
SELINUX=disabled

REBOOT OS!

2. 開始安裝 Node
---
vi /etc/yum.repos.d/mariadb.repo

# MariaDB 10.3 CentOS repository list - created 2017-05-25 07:20 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org//10.3//centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

存檔。

查該 OS 內是否已有安裝 mariadb
rpm -qa | grep mariadb

如果有,移除OS內既有的 mariadb
rpm -ev --nodeps mariadb-libs-5.5.52-1.el7.x86_64 mariadb-5.5.52-1.el7.x86_64 mariadb-server-5.5.52-1.el7.x86_64

預先準備一些相關工具
yum -y install rsync nmap lsof perl-DBI nc

安裝(10.1版以上的 Mariadb , 其 Galera Cluster是包含在裡面的,如果是5.5或10.0則需要安裝galera cluster版)
yum -y install MariaDB-server MariaDB-client

(如果是5.5或10.0則需要安裝galera cluster版)
yum -y install MariaDB-Galera-server MariaDB-client galera

systemctl start mariadb

如果需要設定 DB 的 root密碼,例如:
mysqladmin -u root password '1qaz2wsx'
或者修改舊密碼
mysqladmin -u root -p  password

建立 Cluster 之間的共同 MySQL User,用來認證使用,
建立名稱為 cluster 使用者,密碼為 1234,針對 % 跟 localhost 同時建立。
先進入Node_1: MySQL Console.
$ mysql -u root -p
登入密碼之後輸入以下
GRANT USAGE ON *.* to cluster@'%' IDENTIFIED BY '1234';
GRANT ALL PRIVILEGES on *.* to cluster@'%';
GRANT USAGE ON *.* to cluster@'localhost' IDENTIFIED BY '1234';
GRANT ALL PRIVILEGES on *.* to cluster@'localhost';
flush privileges;

以上是安裝 Node1, 接下來 Node2 如以上順序安裝好。


設定 Galera Cluster Server
---
總共兩台 Galera Server,IP 分別是:
Node_1: 192.168.1.251
Node_2: 192.168.1.252


在 192.168.1.251 建立 Galera 設定檔
並且將 cluster address 設定為 192.168.1.252
vi /etc/my.cnf.d/server.cnf
[galera]
# Mandatory settings
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name='my_wsrep_cluster'
wsrep_cluster_address='gcomm://192.168.1.252:4567'
binlog_format=row
wsrep_node_name='db-1'
wsrep_sst_auth=cluster:1234
wsrep_sst_method=rsync
bind-address=0.0.0.0

存檔。
重新啟動 mysqld 會看到 listen 4567 port
systemctl restart mariadb

確認
netstat -anlp | grep -e 4567 -e 3306

以上完成 Node1 的設置。

---
在 192.168.1.252 建立 Galera 設定檔
並且將 cluster address 設定為 192.168.1.251
vi /etc/my.cnf.d/server.cnf

[galera]
# Mandatory settings
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name='my_wsrep_cluster'
wsrep_cluster_address='gcomm://192.168.1.251:4567'
binlog_format=row
wsrep_node_name='db-1'
wsrep_sst_auth=cluster:1234
wsrep_sst_method=rsync
bind-address=0.0.0.0


重新啟動 mysqld 會看到 listen 4567 port
systemctl restart mariadb

確認
netstat -anlp | grep -e 4567 -e 3306

以上完成 Node2 的設置。

---
驗證 Cluster 設置是否成功
mysql -e "SHOW STATUS LIKE 'wsrep%';"

看到結果,有一個非常重要的數值,
wsrep_ready,正確值是 ON,

另外看 wsrep_cluster_size 是否跟設置 Node 的數量相同,
以上這兩個如果都正確,那就表示設定成功。
當 Node 01 關機時,資料還是在 Node 2 繼續運作,
等到 Node 01 恢復上線後,資料又會從 Node 02 同步複製過來。


要增加新 Node 時:
修改設定檔
vi /etc/my.cnf.d/server.cnf

[galera]
# Mandatory settings
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name='my_wsrep_cluster'
wsrep_cluster_address='gcomm://192.168.1.251:4567'
binlog_format=row
wsrep_node_name='db-1'
wsrep_sst_auth=cluster:1234
wsrep_sst_method=rsync
bind-address=0.0.0.0


實際測試看看:
在 node-1 執行
mysql -uroot -e 'CREATE DATABASE gc_test;'

在 node-2 執行
mysql -uroot -e 'SHOW DATABASES;'
應該看到複製過來的 gc_test

或者是利用 Navicat GUI工具來測試
https://www.navicat.com/cht


安裝 Proxy
---
MySQL Router (Download)
安裝   mysql-router-2.1.3-1.el7.x86_64.rpm mysql-router-debuginfo-2.1.3-1.el7.x86_64
yum -y localinstall mysql-router-2.1.3-1.el7.x86_64.rpm mysql-router-debuginfo-2.1.3-1.el7.x86_64


修改設置
vi /etc/mysqlrouter/mysqlrouter.conf


[logger]
level = info
之後,加入以下:

[routing:read_write]
bind_address = 0.0.0.0
bind_port = 7001
destinations = 192.168.1.251:3306,192.168.1.252:3306
mode = read-write



啟動
systemctl start mysqlrouter
systemctl status mysqlrouter


確認
netstat -anlp | grep -e 7001 -e 7002


接下來利用 Navicat  GUI 工具來測試
https://www.navicat.com/cht


- The End -



2017年3月10日 星期五

Mongodb 建立有 security 機制的同步備份設定

第1步最重要, DNS 沒有設定合理, 同步備份就無法開始。Primary主機就找不到 Member

1. 每台電腦都必須 setup hostname and dns record
vi /etc/hosts
add IP and domain name

2. 每台電腦都必須
echo "syncme" > /etc/mongod.key
chown mongod:mongod /etc/mongod.key

3. 每台電腦都必須
vi /etc/mongod.conf

security:
  authorization: enabled
  keyFile: /etc/mongod.key

replication:
  oplogSizeMB: 10240
  replSetName: rs1

systemctl restart mongod


4. 回到 Primary 主機上
mongo --authenticationDatabase=admin -u root -p password --host 127.0.0.1

初使化 replSet
rs.initiate()

確認
rs.status()
會看到PRIMARY字眼,表示初始化完成

加入第2台DB
rs.add("192.168.1.2:27017")
加入第3台DB
rs.add("192.168.1.3:27017")
依此類推


- The End -

2017年3月8日 星期三

CentOS下用 rinetd 做 port forwarding

Windows下的 port forwarding 一般用的是自带的 nat 和 porttunnel、portmap
Linux 下透過 rinetd
工具主页: http://www.boutell.com/rinetd/
安裝步驟:

mkdir rinetd
cd rinetd
wget http://www.boutell.com/rinetd/http/rinetd.tar.gz
tar zxvf rinetd.tar.gz
cd rinetd
cp rinetd.c rinetd.c.bak
sed -i 's/65536/65535/g' rinetd.c
make
make install

如果有發生錯誤訊息,就依提示建立目錄後,重新make install
完畢。

設定範例:
把 1.1.1.1 的 11 PORT映射到 2.2.2.2 的 3389 ,設定文件如下
vi  /etc/rinetd.conf

1.1.1.1 11 2.2.2.1 3389
1.1.1.1 12 2.2.2.2 3389
1.1.1.1 13 2.2.2.3 22
1.1.1.1 14 2.2.2.4 80
allow *.*.*.*
logfile /var/log/rinetd.log

存檔離開後,啟動步驟:
pkill rinetd
rinetd -c /etc/rinetd.conf

查看執行狀態
netstat -antup


--- 阿里雲 Windows 方式 範例 ---
1. 開啟 CMD

2. netsh interface portproxy add v4tov4 listenaddress=ECS服务器的公网IP地址 listenport=3717 connectaddress=云数据库MongoDB的连接地址 connectport=3717

3. netsh interface portproxy add v4tov4 listenaddress=ECS服务器的公网IP地址 listenport=3717 connectaddress=云数据库MongoDB的连接地址 connectport=3717

4. 要查看當前的映射:
netsh interface portproxy show all

5. 要删除不需要的映射:
netsh interface portproxy delete v4tov4 listenaddress=ECS公网服务器的公网IP地址 listenport=3717


6. 要驗證:
在本地 MongoDB shell 连接 ECS Windows 服务器后进行数据写入和查询验证,ECS Windows 服务器的 IP 是1.1.1.1,即 telnet 1.1.1.1 3717



- The End -

2017年3月3日 星期五

以 mongod --repair 修復DB資料

先停止 mongod 的服務,

語法: mongod --dbpath DB資料匣 --repair --repairpath 修復後的DB資料匣

範例: mongod --dbpath /data/db --repair --repairpath /data/db0


修復期間,會在 DB資料匣 建立一個 mongod.lock 以防止 MONGO 服務啟動
修復完畢,會自動被刪除掉。
要注意的是,修復好的DB 必須要注意其擁有者權限是否被更動為 root 了
不然 MONGO 服務就會啟動失敗,一旦啟動失敗 立刻查看 LOG 最後的紀錄原因。


參考資料

- THE END -


2017年1月5日 星期四

MongoDB 3.x 啟用連線認證

先參考
https://scalegrid.io/blog/configuring-mongodb-cr-authentication-as-default-on-mongodb-3-x/

以及這篇 另外 Bugj問題這篇(MongoDB - admin user not authorized)


先新增管理員

切換到admin資料庫
use admin

新增使用者
db.createUser(
   {
     user: "superuser",
     pwd: "xxxxxxxxxx",
     roles: [ { role: "root", db: "admin" } ]
   }
)

新增唯獨權限的使用者 將來管理方便
use admin
db.createUser(
   {
     user: "reader",
     pwd: "reader1234567",
     roles: [ { role: "readAnyDatabase", db: "admin" } ]
   }
)

啟用 MongoDB 的帳密連線
vi /etc/mongod.conf

security:
  authorization: enabled

然後重啟
systemctl restart mongod 


還沒結束!!!
因為Mongodb 啟用連線認證之後,所以備份的資料結構都改變了,
如果另一台MongoDB不調整認證方式,會導致資料恢復失敗,所以:

連線進去
mongo --authenticationDatabase=admin -u superuser -p xxxxxxxxxx 

執行以下指令:
db.adminCommand({authSchemaUpgrade: 1});

確認出現 OK 的提示之後,日後進行 Data Restore 才不會出現以下
the users and roles collections in the dump have an incompatible auth version with target server: cannot restore users of auth version 5 to a server of auth version 3

官方文件參考

- The End -

2016年12月13日 星期二

BananaPI M2Ultra 香蕉派跑 MongoDB

四年前好奇香蕉派與樹莓派有什麼差異,就買了一張來玩玩看。當時單核心CPU的樹莓已經很轟動了,就試試看標榜雙核CPU的香蕉吧。結果一次就喜歡上了,雖然經過幾年下來,也是有買 RASPBERRY PI 3 MODEL B 來用。

可是最近要測試 MongoDB , 就發現 RAM 不太夠用了。最近看到香蕉派M2Ultra這款有2GB的RAM,且還內建8GB 的 eMMC flash,就上掏寶下單了。後來測試MongoDB的心得,效能還真的很不錯。打算再買M64繼續試試看。

拆開前樣子


從紙盒拆開的樣子


拿出壓克力

拿出香蕉派 M2U

組合好的樣子

為了接上 SSD HD, 還跑了一趟光華去買了這個 DC 接頭。


最後,
MongoDB 運行時候資料讀寫過程中,CPU 的4個核心都同時運作,實在很滿意。希望開機 IMAGE 更新可以再更快一些。

一樣很好奇播放 MP4 影片的效能,當我接上了4年前買的 INTEL SSD 之後,看到以前第一代香蕉幫我傳回來的影片,立刻播放看看,果然很順暢。

另外,因為板子上內建了8GB 的 eMMC flash,所以可以透過 dd 指令,將 image 拷入當做硬碟開機的概念。整個過程大約要17分鐘,我是將 image 先放進USB裡, 然後再從 USB 拷進 eMMC flash 的。現在不用插記憶卡也能開機,簡直跟一般電腦沒什麼兩樣了。

例如:
先用 sudo fdisk -l 找到 emmc 的裝置名稱,通常是 /dev/mmcblk1
接下來將 image 燒錄至 emmc 裡面:

sudo dd if=ubuntu-mate-15.10-desktop-armhf-raspberry-pi-2-bpi-m3-sd-emmc-20151203.img of=/dev/mmcblk1 bs=10MB
(參考這裡 http://droidspa.blogspot.tw/search/label/Banana%20PI

至於一開始的記憶卡,我推薦購買 U3 規格的 16GB 卡片來用,價格帶已經讓一般人容易入手了,image 的寫入速度快了一倍以上,開機速度也加快許多。


2016年11月15日 星期二

創建 mongodb 的 pid

在 centos 底下,創建 mongodb 的 pid
不然每次要找 mongo 都很不好找到。

ln -s /var/lib/mongo/mongod.lock /var/run/mongodb.pid


- END -

2016年8月30日 星期二

查出 MongoDB 各個 DB 或 collection 的 size

查出 MongoDB 各個 DB 的 size
在 shell 底下,執行以下
db.adminCommand( { listDatabases: 1 } )


查出 MongoDB 各個 collection 的 size
在 shell 底下,執行以下

var collectionNames = db.getCollectionNames(), stats = [];
collectionNames.forEach(function (n) { stats.push(db[n].stats()); });
stats = stats.sort(function(a, b) { return b['size'] - a['size']; });
for (var c in stats) { print(stats[c]['ns'] + ": " + stats[c]['size'] + " (" + stats[c]['storageSize'] + ")"); }

Example output (first metric is size, second is storageSize)

2016年8月6日 星期六

mongodb backup and restore


全部DataBase
(有規劃 replication) 在 linux 底下範例:
mongodump --host 127.0.0.1 --port 27017 --oplog --out /var2/db_backup/

(無規劃 replication) 在 linux 底下範例:
mongodump --host 127.0.0.1 --port 27017 --out /var2/db_backup/


在 linux 底下範例:
(有規劃 replication) 在 linux 底下範例:
mongorestore  --oplogReplay -h 127.0.0.1 /var2/db_backup

(無規劃 replication) 在 linux 底下範例:
mongorestore --drop -h 127.0.0.1 /tmp/db_backup




特定 Database
mongodb 在 linux 底下 backup 範例:
mongodump  -h 127.0.0.1 -d Octavius -o ./Octavius-backup


mongodb 在 linux 底下 restore 範例:
mongorestore --drop -h 127.0.0.1 -d Octavius  /tmp/db/Octavius



Windows版的 MongoDB
mongodb 在 dos 底下 backup 範例:
mongodump --drop /h 127.0.0.1 /d Octavius --out E:\TEMP\db\Octavius


mongodb 在 dos 底下 restore 範例:
mongorestore --drop /h 127.0.0.1:27017 /d Octavius --out E:\TEMP\db\Octavius



有設定帳密審核的 linux 底下
先去官網下載整套mongo,不要使用 yum 下載的版本,因為帳密永遠核不通過
假設帳密已經存在 admin 這個database裡面

mongodump --host 127.0.0.1 --port 27017 --authenticationDatabase=admin -u username -p userpassword --oplog --out /var2/db_backup/

mongorestore --drop -h 127.0.0.1 --port 27017 --authenticationDatabase=admin -u username -p userpassword  /var2/db_backup/



2016年8月1日 星期一

MongoDB Log Rotation

參考 https://docs.mongodb.com/manual/tutorial/rotate-log-files/

由於 LOG SIZE 愈來愈大,導致讀取LOG緩慢
透過 Log Rotation,可以立刻以新的檔案名稱繼續寫LOG
舊的Log 檔名自動會被備標註 日期期間

登入 mongo  之後

use admin
db.runCommand( { logRotate : 1 } )

即可



2016年7月30日 星期六

改變 MongoDB 的 ReplicaSet heartbeat timeout


由於兩岸網路不穩定,影響 MongoDB  的 replica set 效能

heartbeatIntervalMillis 預設是 2000 微秒,我將它放大3倍
heartbeat timeout 預設是 10 秒,我將它放大3倍


先用 rs.conf(); 看一下內容,在最尾巴的 settings 裡面會呈現出來

config = rs.conf()
config.settings.heartbeatIntervalMillis=6000
config.settings.heartbeatTimeoutSecs=30
rs.reconfig(config, {force : true})




搜尋此網誌