在大陸使用 Ubuntu 安裝套件的加速技巧

shtzeng Posted in Research,Tags: , , , ,
0

在大陸使用 Ubuntu 安裝套件時,
總是會覺得很慢,
慢一下還好,持續的慢就會想殺人了 (遞刀子
不查還好,一查不得了,
cn.archive.ubuntu.com 居然 CNAME 到 us,

;; ANSWER SECTION:
cn.archive.ubuntu.com. 600 IN CNAME us.archive.ubuntu.com.
us.archive.ubuntu.com. 60 IN A 91.189.91.24
us.archive.ubuntu.com. 60 IN A 91.189.91.23
us.archive.ubuntu.com. 60 IN A 91.189.91.26
us.archive.ubuntu.com. 60 IN A 91.189.91.14

然後大陸到 canonical 的 routing 其實也不是很好,
到底~到底~是哪個王八蛋,難道都沒有好用的機器?
網路上找了一下,清華大學開源軟體鏡像站維護的不錯,
這時候去修改 /etc/apt/source.list 把網址都換成 mirror.tuna.tsinghua.edu.cn 就可以了,
跑一次 apt update 把本機的資料庫更新一下,
下載安裝就可以享受到飛快的速度了 ~~~


在處理 python 套件安裝時也一樣悲劇,
這時候就加上 “-i https://pypi.tuna.tsinghua.edu.cn/simple” 參數來加速
像是這樣

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple m3u8

速度馬上就飛起來了

幹,是中國網路太差好嗎 >_<

在 Ubuntu 14.04 更新 jenkins

shtzeng Posted in Research,Tags: , ,
0

軟體要定期更新
才能保持沒有bug
雖然說也常常用最新版就壞掉了XD
這邊來說在 Ubuntu 14.04 上面更新 jenkins 的問題
jenkins 在某個版本之後 從 java7 改到 java8
但是 Ubuntu 14.04 官方不支援 java8
從官方的 apt-get 上怎麼升都弄不上去
所以就要自己想辦法啦

1. 安裝 ppa
sudo add-apt-repository ppa:openjdk-r/ppa
2. 更新啊更新
sudo apt-get update
3. 安裝新的 java8
sudo apt-get install openjdk-8-jre-headless
4. java 改 link
將 /etc/alternatives/java -> /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java 改成 /etc/alternatives/java -> /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
5. 升級 jenkins
sudo apt-get install jenkins
6. 升級/修正 jenkins 套件
進 jenkins 把能按的該按的都按一按,又是一尾活龍

-完-

轉換 Upstart 到 Systemd

shtzeng Posted in Research,Tags: , ,
0

終於有時間寫 blog 了 (汗
應該說最近都在轉換東西,沒有新的技術可以玩

不確定什麼時候,應該是 Ubuntu 16.04 LTS 或附近,決不是 Ubuntu 14.04 LTS 就對了,系統就預設從 Upstart 系統更換到 Systemd 系統
聽說 Systemd 更厲害更快速,但是沒有比較好寫,指令也比較長 T_T
之前會抗拒使用 Ubuntu 16.04 LTS 是因為 Systemd 系統,感覺非常的陌生
不過呢,都是得轉換的,就嘗試著把 Upstart 的設定檔改成 Systemd 的設定檔了

大概簡介一下
最初期的是 SysV
使用的是 /etc/init.d/ 下的設定檔
拜託,很難寫 XD

再來是使用了一陣子的 Upsatrt
設定檔在 /etc/init/ 下
只要將必要的狀況敘述清楚即可
甚至不用自己考慮 pid 之類的
使用上也是很方便,start xxx,stop xxx
對就是這麼無腦

最後就是新的 Systemd
設定檔在 /lib/systemd/system/ 下
在 /etc/system.d/system/ 會有一些檔案,用來描述什麼時候啟動結束之類的,就像 /etc/rcX.d 一樣
使用上呢都得要 systemctl 開頭,什麼 systemctl start xxx,什麼 systemctl stop xxx 的,按 tab 想要打快一點還不行,因為會有 sysctl 很類似會卡住 (棍

算了,抱怨歸抱怨,還是得要用
直接用範例講解比較快
如果原本 Upstart 有一隻設定檔 /etc/init/bigtree.conf

description "BigTree"
author "Big Tree "

start on runlevel [2345]
stop on runlevel [!2345]

respawn
respawn limit 20 5

script
  export NODE_ENV=production
  export PORT=8080
  exec node /tmp/bigtree.js
end script

轉換成 Systemd /lib/systemd/system/bigtree.service

[Unit]
Description=Big Tree

[Service]
Type=simple
Environment="NODE_ENV=production"
Environment="PORT=8080"
ExecStart=/bin/sh -ec "exec node /tmp/bigtree.js"
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=bigtree.target

加上 /etc/systemd/system/bigtree.target

[Install]
WantedBy=multi-user.target

先注意的是,副檔名有改變,Upstart 使用 conf 但 Systemd 使用 service
對照的部分
Unit 對到描述部分
Service 對到 Script 部分,也有包含 respawn 等
Install 掌管 enable 跟 disable 的部分
檔案都正確後,執行 systemctl enable bigtree 就會幫你產生 /etc/systemd/system/bigtree.target.wants/bigtree.service 到 /lib/systemd/system/bigtree.service 的 soft link,這樣就可以開機時啟動

還有其他參數
因為我沒用到,就沒寫了
請參考https://wiki.ubuntu.com/SystemdForUpstartUsers

剩下的,我也不是很熟
剛教~沒讀~

使用 Azure PowerShell 修改 AD User 密碼不過期

shtzeng Posted in Research, 系統設定,Tags: , , , , ,
0

放一個國慶日,一早來就被 Azure 炸到
我們家的 jenkins 怎麼推不動 ansible 了
%e8%9e%a2%e5%b9%95%e5%bf%ab%e7%85%a7-2016-10-11-%e4%b8%8a%e5%8d%8810-39-27
查了一陣子發現 ansible 用的 azure  ad 帳號密碼過期需要重設
由於這是 api 用的帳號密碼
過於頻繁重設會讓管理者比較麻煩(要改很多job設定)
所以就去搜尋了一番
結論都是….要用 Azure PowerShell 去改設定
他媽的又是 Portal 又是 CLI 又是 PowerShell 的
三國鼎立不會很煩嗎
suck suck suck

還是要來說一下使用流程
第一是 windows 環境
然後下載 PowerShell 安裝檔安裝
教學網頁在這裡
下載連結在這裡
這是一個漫長的等待流程
再來下在 AD Moudle for PowerShell 安裝
教學網頁在這裡
下載連結在這裡
裝完後打開 AD Module 建立的捷徑
輸入 Connect-MsolService 後登入 AD 帳號,通常是 [email protected] 這個
檢查帳號設定 Get-MSOLUser -UserPrincipalName [email protected] | Select PasswordNeverExpires ,False 就是三個月密碼會過期,要換密碼喔~
設定密碼不過期 Set-MsolUser -UserPrincipalName [email protected] -PasswordNeverExpires $true
如果跟你說你沒權限,請登入 Classic 的網頁,將該使用者權限調大一點
教學網頁在這裡

整個做完之後還是覺得
suck suck suck

MongoDB 建置及調教

shtzeng Posted in Research,Tags: ,
0

人很懶
做過的事情
參考過的資料
沒留下來就會煙飛雲滅 XD

這邊要補的是當初怎麼建的 MongoDB
第一部分是安裝 MongoDB,我是用 Percona 版本的
先把 Percona 的 key 加入

apt-key adv --keyserver keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A

再來是加 source list 讓 apt 可以抓的到
在 /etc/apt/sources.list.d/percona.list 加上 (假設我是用 Ubuntu 14.04 LTS)

#
deb http://repo.percona.com/apt trusty main
deb-src http://repo.percona.com/apt trusty main

然後更新並安裝

apt-get update
apt-get install percona-server-mongodb-32

改設定檔,我是用 rocksdb engine

storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true
  engine: rocksdb
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log
processManagement:
  fork: true
  pidFilePath: /var/run/mongod.pid
net:
  port: 27017
  bindIp: 0.0.0.0

到這邊就大功告成了, MongoDB 裝好了
安裝的部分可以參考各 blog
再來就是系統調教的部分了
首先要增加 /etc/init/mongo_vm_settings.conf ,讓 THP 預設關掉 (這是官方強烈建議關掉的)

# Ubuntu upstart file at /etc/init/mongod_vm_settings.conf

start on runlevel [2345]
stop on runlevel [!2345]

script
  echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
  echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
end script

再來是 /etc/sysctl.d/20-mongodb.conf,其中 vm.swappiness 建議是為 0 關掉,但因為存在一些 bug ,設定成超小的 1% 比較保險

vm.swappiness = 1
vm.dirty_ratio = 10
vm.dirty_background_ratio = 3
vm.dirty_expire_centisecs = 12000
net.core.somaxconn = 4096
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_time = 120
net.ipv4.tcp_max_syn_backlog = 4096

然後設定 /etc/security/limits.d/mongod.conf ,方便跑起來的時候不會檔案不夠開之類的

mongod       soft        nproc        64000
mongod       hard        nproc        64000
mongod       soft        nofile       64000
mongod       hard        nofile       64000

最後設定硬碟檔案區塊大小

# set deadline scheduler and 16kb read-ahead for /dev/xvda
ACTION=="add|change", KERNEL=="xvda", ATTR{queue/scheduler}="deadline", ATTR{bdi/read_ahead_kb}="16"

這樣就解決了XD
調教部分可以參考https://www.percona.com/blog/2016/08/12/tuning-linux-for-mongodb/
又把一個事情記完了 XD

Munin Plugin for MongoDB

shtzeng Posted in Research,Tags: , ,
0

所謂的凡走過必留下痕跡
不留痕跡很難找到當初設定的方法的

簡單來說,執行完下面的指令就加好 plugin 了,我的環境是 Ubuntu 14.04.5 LTS devil
 

sudo apt-get install python-pip build-essential python-dev git -y
sudo pip install pymongo
git clone https://github.com/comerford/mongo-munin.git /tmp/mongo-munin
sudo cp /tmp/mongo-munin/mongo_* /usr/share/munin/plugins
sudo ln -sf /usr/share/munin/plugins/mongo_btree /etc/munin/plugins/mongo_btree
sudo ln -sf /usr/share/munin/plugins/mongo_conn /etc/munin/plugins/mongo_conn
sudo ln -sf /usr/share/munin/plugins/mongo_lock /etc/munin/plugins/mongo_lock
sudo ln -sf /usr/share/munin/plugins/mongo_mem /etc/munin/plugins/mongo_mem
sudo ln -sf /usr/share/munin/plugins/mongo_ops /etc/munin/plugins/mongo_ops
sudo ln -sf /usr/share/munin/plugins/mongo_docs /etc/munin/plugins/mongo_docs
sudo chmod +x /usr/share/munin/plugins/mongo_*

來源參考https://github.com/comerford/mongo-munin的README

Modify Json file

shtzeng Posted in Research,Tags: , ,
0

最近在陪著弄 nodejs 的東西
有個任務就是隨著不同環境就 deploy 不同設定
這要是普通的檔案就簡單了
可是 nodejs 是 json 格式的
瞎攪和是不行的

我們有以下原始資料 origin.json

{
  "key_c": {
    "key_c_b": "value_c_b",
    "key_c_a": "value_c_a"
  },
  "key_b": {
    "key_b_a": "value_b_a"
  },
  "key_a": "value_a"
}

然後想要修改的資料 modify.json

{
  "key_d": "new_value_d",
  "key_c": {
    "key_c_c": "add_value_c_b",
    "key_c_a": "modify_value_c_a"
  },
  "key_b": {
    "key_b_b": "add_value_b_a"
  },
  "key_a": "modify_value_a"
}

一開始一直在琢磨 jq 的方法
摸來摸去最多也只做得到

jq -s add modify.json origin.json
{
  "key_d": "new_value_d",
  "key_c": {
    "key_c_b": "value_c_b",
    "key_c_a": "value_c_a"
  },
  "key_b": {
    "key_b_a": "value_b_a"
  },
  "key_a": "value_a"
}

有值的都無法覆蓋
好吧,其實上面的方法是錯的
應該要是指令反過來比較趨近我們想要的

jq -s add origin.json modify.json
{
  "key_d": "new_value_d",
  "key_c": {
    "key_c_c": "add_value_c_b",
    "key_c_a": "modify_value_c_a"
  },
  "key_b": {
    "key_b_b": "add_value_b_a"
  },
  "key_a": "modify_value_a"
}

這也不對啊,原本的值都不見了,而我只想修改某些項目
後來找到了這個方法,安裝 npm 的 json

npm install -g json

之後就可以用 json 來處理這個問題了

cat origin.json modify.json | json --deep-merge
{
  "key_a": "modify_value_a",
  "key_b": {
    "key_b_a": "value_b_a",
    "key_b_b": "add_value_b_a"
  },
  "key_c": {
    "key_c_a": "modify_value_c_a",
    "key_c_b": "value_c_b",
    "key_c_c": "add_value_c_b"
  },
  "key_d": "new_value_d"
}

看起來就比較對了
要修改的修改
要新增的新增

Json 真是博大精深超難搞的
我還是敬而遠之吧 XD

要再廣再深

shtzeng Posted in Research, 碎碎念,Tags: ,
0

最近吃飯聊天,有一些人都以為我原本DB方面很厲害,
但他們都不相信,我是個剛畢業剛當完兵沒有任何玩過DB經驗的新鮮人。

以前大學時後當學聯會資訊部長時代,我曾自學PHP寫一些網站,
順便嘗試接一些小case,現在想想那時候真的是雷死人了。
每天就是掛在PHP官網上查function怎麼用,然後一直google一些基本DB語法,
只會三個用法,SELECT、INSERT、DELETE,會WHERE但其他都不會,
什麼JOIN、GROUP BY蝦米鬼的。

來上班以後,第一件事是學語法,phpmyadmin不要用,看著command line想著,
幹我都不會,還不能在XX面前被發現Orz遇到第二件事是VIEW,那是什麼,能吃嗎?
懵懵懂懂下被帶著ALTER VIEW了,幹我連ALTER是啥都不知道。
沒有習慣訂閱blog,在XX唸了四次以後,開始隨便找了一家feedly來訂blog看。
什麼是Percona XtraDB Cluster?什麼是DB Schema?為什麼會有slow query?
PostgreSQL是什麼?踏馬的就慢慢學阿,很多東西就是不會,
一直翻MySQL文件學來的,認真學會真的會懂了,雖然我還是很不懂XD

目前工作經歷快滿九個月了,我自認為我還是很弱,經歷不夠,所以還得要繼續加油。
久久一篇文章的,找時間要把Percona Live 2014的投影片整理一下,看得好累。

貢獻太少貢獻太少….

shtzeng Posted in Research
0

說我的東西可能像是作業習題一樣的case

那我只好再找東西ref.
讓他可以打敗原本的結果 xd
也不用全打敗….因為那應該可以博班畢業了
我應該可以做到部分打敗….

剛剛看到有趣的 art. 讓我有靈感 ^___^