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

2021年4月22日 星期四

[PHP] 下載 Maxmind GeoIP Legacy Databases 和 ngx_http_geoip_module 相關處理 @ macOS 11.2, PHP 7.3.24

由於 Maxmind 在推 GeoIP2 ,不開放 .dat 的 GeoIP DB 了,以前下載位置:

  • http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
  • http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
現在官方都說要改用 GeoLite2 DB ,其格式:
  • GeoIP2 Binary (.mmdb)
  • GeoIP2 CSV 
目前先偷懶不處理 nginx ,因為 nginx 採用 GeoIP Legacy Databases。

有找到一個網站 https://www.miyuru.lk/geoiplegacy,從中下載:
連續動作:

% php -v
WARNING: PHP is not recommended
PHP is included in macOS for compatibility with legacy software.
Future versions of macOS will not include PHP.
PHP 7.3.24-(to be removed in future macOS) (cli) (built: Dec 21 2020 21:33:25) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.24, Copyright (c) 1998-2018 Zend Technologies

% php composer.phar require geoip/geoip:~1.16

% wget https://dl.miyuru.lk/geoip/maxmind/city/maxmind4.dat.gz
% gunzip -d maxmind4.dat.gz

% cat test-ip-via-geoip.php
<?php
require 'vendor/autoload.php';
$gi = geoip_open("maxmind4.dat",GEOIP_STANDARD);
$country = geoip_country_code_by_addr($gi, $argv[1]);
echo "lookup [".$argv[1]."], result: [$country]\n";

% php test-ip-via-geoip.php 8.8.8.8
lookup [8.8.8.8], result: [US]

% nslookup tw.yahoo.com
Server: 8.8.8.8
Address: 8.8.8.8#53

Non-authoritative answer:
tw.yahoo.com canonical name = atsv2-fp-shed.wg1.b.yahoo.com.
Name: atsv2-fp-shed.wg1.b.yahoo.com
Address: 180.222.102.201
Name: atsv2-fp-shed.wg1.b.yahoo.com
Address: 180.222.102.202

% php test-ip-via-geoip.php 180.222.102.202
lookup [180.222.102.202], result: [IN]

% curl ipinfo.io/180.222.102.202
{
  "ip": "180.222.102.202",
  "hostname": "media-router-fp74.prod.media.vip.tp2.yahoo.com",
  "city": "Taoyuan City",
  "region": "Taiwan",
  "country": "TW",
  "loc": "24.9937,121.2970",
  "org": "AS24506 YAHOO! TAIWAN",
  "timezone": "Asia/Taipei",
  "readme": "https://ipinfo.io/missingauth"
}

% nslookup facebook.com
Server: 8.8.8.8
Address: 8.8.8.8#53

Non-authoritative answer:
Name: facebook.com
Address: 31.13.87.36

% curl ipinfo.io/31.13.87.36
{
  "ip": "31.13.87.36",
  "hostname": "edge-star-mini-shv-01-tpe1.facebook.com",
  "city": "Hong Kong",
  "region": "Central and Western",
  "country": "HK",
  "loc": "22.2783,114.1747",
  "org": "AS32934 Facebook, Inc.",
  "timezone": "Asia/Hong_Kong",
  "readme": "https://ipinfo.io/missingauth"
}

% nslookup www.gov.tw
Server: 8.8.8.8
Address: 8.8.8.8#53

Non-authoritative answer:
Name: www.gov.tw
Address: 223.200.155.55

% php test-ip-via-geoip.php 223.200.155.55
lookup [223.200.155.55], result: [TW]

% curl ipinfo.io/223.200.155.55
{
  "ip": "223.200.155.55",
  "hostname": "223-200-155-55.hinet-ip.hinet.net",
  "city": "Hualien City",
  "region": "Taiwan",
  "country": "TW",
  "loc": "23.9769,121.6044",
  "org": "AS4782 Data Communication Business Group",
  "timezone": "Asia/Taipei",
  "readme": "https://ipinfo.io/missingauth"
}

2015年10月18日 星期日

Bash 筆記 - 使用 s3fs、mysqldump、find 透過 s3 定期備份 MySQL 資料庫資料

由於資料庫恰好有 timestamp 這個數值,除設計完 incremental backup 方式後(Bash 筆記 - 使用時間區間備份 MySQL 資料表),而備份好的資料又感到麻煩,所以就往 s3 丟吧!而 s3 的丟法就用 s3fs 來執行。

流程:
  1. 執行 db incremental backup
  2. 使用 s3fs 掛載 s3 空間
  3. 確認 s3 是否已有資料,若沒有則複製過去
其中我把 db backup 的(tar.bz2)產物都有做一次 checksum (tar.bz2.md5),因此判斷是否已在 s3 上時,可以判斷 checksum file 即可:

mkdir -p /data/fuse-tmp/my-s3-bucket
mkdir -p /data/s3/my-s3-bucket
touch /data/s3/my-s3-bucket.password
s3fs my-s3-bucket /data/s3/my-s3-bucket -d -o use_cache=/data/fuse-tmp -o passwd_file=/data/s3/my-s3-bucket.password

find /data/db/ -name "*.bz2" -exec bash -c "test -e {}.md5 && test ! -e /data/s3/my-s3-bucket/\`basename {}\`.md5 && echo 'upload {} , {}.md5 ... ' && time cp {} {}.md5 /data/s3/smy-s3-bucket/ && echo 'done' " \;

sync;sync;sync

fusermount -u /data/s3/my-s3-bucket


其中,/data/db 是擺放一堆 db.sql.tar.bz2 跟 db.sql.tar.bz2.md5 的位置,而我讓備份過程中最後產出 db.sql.tar.bz2.md5 檔,因此先判斷 /data/db/db.sql.tar.bz2.md5 是否產生也代表備份流程是否跑完,接著才檢查 /data/s3/my-s3-bucket/db.sql.tar.bz2.md5 資料來決定是否要上傳到 s3 。

最後,s3 還可以開啟版本控制,這樣可以避免不小心蓋掉檔案的問題 :) 達成完整可自動化的備份方案

2014年11月5日 星期三

[Linux] MySQL Server 5.6 更換 DB Location @ Ubuntu 14.04

在 AWS EC2 叫機器出來時,大多都會用 EBS 來擴充空間,對於 mysql server 預設裝在 /var/lib/mysql 時,就容易碰到空間不足的時候。解法:手動更換 mysql db location 吧 :P

順便把 EBS 處理過程也都列一列,假設已經新增並掛載 EBS 空間:

$ sudo lsblk
NAME    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
...
xvdb    202:16   0     4G  0 disk /mnt
xvdc    202:32   0   500G  0 disk

$ sudo file -s /dev/xvdc
$ sudo mkfs -t ext3 /dev/xvdc
$ sudo mkdir /data
$ sudo mount -t ext3 /dev/xvdc /data
$ sudo chmod 777 /da
$ sudo vim /etc/fstab
/dev/xvdc /data ext3 defaults,nofail 0 2


處理 MySQL Server:

$ sudo apt-get install mysql-server-5.6
$ sudo service mysql stop
$ sudo mv /var/lib/mysql /data/mysql
$ sudo ln -s /data/mysql /var/lib/mysql
$ sudo vim /etc/apparmor.d/usr.sbin.mysqld
  /var/lib/mysql/ r,
  /var/lib/mysql/** rwk,
  /var/log/mysql/ r,
  /var/log/mysql/* rw,

  /data/mysql r,
  /data/mysql** rwk,
  /data/mysql r,
  /data/mysql* rwk,
$ sudo service apparmor restart
$ sudo service mysql start

2014年3月26日 星期三

[Linux] 透過 MySQL Replication 之 Master Slave 切換進行 DB server 移機 @ Ubuntu 12.04

事情的緣由是想要進行 DB server 的升級,做法有不少種,而最重要的是要將 down time 降低。由於未來有考慮把 DB server 移到 AWS RDB 上頭,參考 AWS RDB 的 import/export 方式,故選擇從 replication slave 來摸摸。

建立 Replication Slave 的流程:
  1. 將原先的 db1 server 調整成可以成為 master db 的功能
    • $ vim /etc/mysql/my.cnf
      • 拿掉 bind-address 127.0.0.1
      • 指定 server-id = 1
      • 指定 log_bin = /var/log/mysql/mysql-bin.log
      • innodb_flush_log_at_trx_commit=1
      • sync_binlog=1
    • $ sudo service mysql restart
  2. 在 master db 上建立 replication slave 存取權限
    • master:mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'repl_password';
  3. 在 master db 上匯出資料
    • master:mysql> FLUSH TABLES WITH READ LOCK;
    • master:mysql> SHOW MASTER STATUS;
    • $ mysqldump -u root -p --all-databases --lock-all-tables > all.sql
    • master:mysql> UNLOCK TABLES;
    • 想辦法把 all.sql 弄到 slave db server
  4. 在 db2 server 設定可以成為 slave db 功能
    • $ vim /etc/mysql/my.cnf
      • 拿掉 bind-address 127.0.0.1
      • 指定 server-id = 2
      • 指定 log_bin = /var/log/mysql/mysql-bin.log
    • $ sudo service mysql restart
  5. 在 db server 匯入 master db 的資料
    • 從 master db server 取得 all.sql
    • $ mysql -u root -p < all.sql
  6. 在 slave db 設定 master db 資訊
    • slave:mysql> CHANGE MASTER TO
      MASTER_HOST='MasterDBIP',
      MASTER_USER='repl',
      MASTER_PASSWORD='repl_password',
      MASTER_LOG_FILE='File',
      MASTER_LOG_POS=Position;
    • slave:mysql> START SLAVE;
    • slave:mysql> SHOW MASTER STATUS;
    • slave:mysql> SHOW SLAVE STATUS;
如此一來,就可以看到 Slave 跟 Master 一直保持同步了,可以用一些指令,如 SELECT count(*) FROM TABLE; 來比較看看。

以上就是架設 MySQL Replication Slave 的流程,接下來是進行 DB Server 移機的過程,目的就是將上述的 db1 server 下線,並改用 db2 server 當 master,有點像是把 switch slave server to master 的味道,過程:
  1. 鎖住 db1 server
    • db1:mysql> FLUSH TABLES WITH READ LOCK;
  2. 確認 db2 server 資料有 sync
  3. 在 db2 server 取消 slave 行為
    • db2:mysql> STOP SLAVE;
    • db2:mysql> RESET SLAVE;
  4. 將所有相關的 application 的 db 連線導到 db2 server
透過上述 MySQL Replication 移機的方式,所造成的 down time 會小很多。另外,更好的解法是先處理好 primary key (例如 2N 與 2N+1)的問題,然後先把 application db 切到 db2,過一陣子後再把 db1 shutdown ,就可以避免資料遺失問題。

最後補充一下,在 Master DB Server 新增帳號時,在 Slave DB server 並沒有 sync ,解法除了一開始在設定 Slave 前就把帳號建立好外,另一種解法就是讓 Slave DB 先暫停 Slave 角色,接著新增完帳號再重回 Slave 角色,而新資料又可以從 Master sync 回來。
  1. slave:mysql> STOP SLAVE;
  2. slave:mysql> 新增使用者;
  3. slave:mysql> START SLAVE;
關於新增帳號的問題是在於要把 db2(Slave) 轉成 Master 時,需要更新帳號能夠存取 db2 的權限,然而透過上述 mysqldump -u root -p --all-databases --lock-all-tables 更新方式,db2 裡的資料都是以 db1 的環境去設定的。