Bài viết này tôi nghiệm ra sau một số lần làm việc trên cơ sở dữ liệu Postgres.
Nó chỉ mang tính kinh nghiệm chứ không tập trung vào vấn đề kỹ thuật.
Tất cả các nội dung đều đã đảm bảo là hoạt động chính xác như tác giả mong muốn.
1. Làm thế nào để copy dữ liệu từ 1 bảng sang 1 bảng khác.
Trên công cụ pgAdmin đi kèm bộ cài postgress (Link download) bạn có thể dùng query tool để chạy lệnh sau:
INSERT INTO table_name
[ ( column_name [, ...] ) ]
query
Ví dụ:
INSERT INTO books (id, title, author_id, subject_id)
SELECT nextval('book_ids'), title, author_id, subject_id
FROM book_queue WHERE approved;
Xem thêm tại: http://www.commandprompt.com/ppbook/x5504
Phần Insert from other tables
2. Cast kiểu giá trị trong postgres
Để cast từ string sang integer trong postgres ta dùng hàm cast theo cấu trúc sau:
cast( var1 as int)
Nếu muốn xử lý trong trường hợp xâu là rỗng (không phải null) thì dùng lệnh sau:
cast( nullif(var1, '') as int)
3. Sinh chuỗi UUID cho bảng trong Postgres
Để sinh chuỗi UUID cho bảng trong Postgres ta sử dụng extension đi kèm bộ cài.
Để kiểm tra xem extension này có đang chạy không ta thử bằng truy vấn sau:
Select uuid_in(md5(random()::text || now()::text)::cstring);
Nếu có kết quả đầu ra là một uuid thì ok, nếu không thì phải cài extension này bằng lênh:
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
Xem thêm
Bài đăng nổi bật
Hướng dẫn thay đổi thư mục root mặc định của Docker trên Linux
Hoàn cảnh: người viết gặp một trường hợp như này Được team hạ tầng cấp cho một máy chủ gồm 2 phân vùng lưu trữ, 1 phân vùng 20GB được gắn và...
26 tháng 4, 2015
05 tháng 3, 2015
Sinh key bằng OpenSSL trên Ubuntu
1. Tạo Private key
Chạy lệnh sau:
Chạy lệnh:
Chạy lệnh sau:
Chạy lệnh sau:
openssl genrsa -des3 -out www.example.com.key 1024
Trong đó:
- www.example.com.key: đầu ra của lệnh, là key cần sinh
- 1024: là độ dài của key
Chạy lệnh:
openssl req -new -key www.example.com.key -out www.example.com.csr
Trong đó:
- www.example.com.key : là private key được sinh ở phần 1
- www.example.com.csr: là đầu ra của lệnh
Chạy lệnh sau:
openssl x509 -req -days 365 -in www.example.com.csr -signkey www.example.com.key -out www.example.com.crtTrong đó:
- 365: là số ngày hiệu lực của chứng chỉ.
- www.example.com.csr: là csr sinh ra ở bước 2.
- www.example.com.key: là private key sinh ra ở bước 1.
26 tháng 12, 2014
Whitelist, blacklist trong Zimbra
Bài viết này tôi sẽ tập trung vào việc hướng dẫn các bạn các cách thiết lập whitelist và blacklist trong phiên bản Zimbra 8.x
1. Hướng dẫn cách đưa địa chỉ thư local vào whitelist.
Để đưa tên miền nội bộ vào whitelist (Không bị đưa vào thư mục spam) ta làm như sau:
- Giả sử tên miền nội bộ có tên là domain.com
- Ta thêm dòng sau vào trong tập tin /opt/zimbra/conf/amavisd.conf.in:
"domain.com" => -10.0,
- Thêm nội dung sau vào tập tin /opt/zimbra/conf/amavis.conf.in:
read_hash(\%whitelist_sender, ‘/opt/zimbra/whitelist’);
read_hash(\%blacklist_sender, ‘/opt/zimbra/blacklist’);
read_hash(\%spam_lovers, ‘/opt/zimbra/spamlovers’);
- Tạo tập tin /opt/zimbra/whitelist với nội dung:
domain.com
- Thêm vào tập tin /opt/zimbra/conf/spamassassin/local.cf nội dung sau:
trusted_networks your_ip
Lưu ý thay your_ip bằng ip tương ứng của bạn
- Khởi động lại các dịch vụ bằng lênh sau:
zmmtactl restart
zmamavisdctl restart
zmcontrol restart
2. Đưa địa chỉ thư nội bộ ra khỏi bộ quét virus, spam.
Để đưa địa chỉ thư nội bộ ra khỏi bộ quét virus, spam (Không bị kiểm tra nữa) ta làm như sau:
- Chỉnh nội dung tham số amavis_originating_bypass_sa thành true và chạy lệnh zmamavisdctl restart
- Một khi đã được bật, tất cả các thư được gửi từ địa chỉ nằm trong dải trustednetwork sẽ không bị đưa qua bộ lọc nữa.
Xem thêm tại đây
1. Hướng dẫn cách đưa địa chỉ thư local vào whitelist.
Để đưa tên miền nội bộ vào whitelist (Không bị đưa vào thư mục spam) ta làm như sau:
- Giả sử tên miền nội bộ có tên là domain.com
- Ta thêm dòng sau vào trong tập tin /opt/zimbra/conf/amavisd.conf.in:
"domain.com" => -10.0,
- Thêm nội dung sau vào tập tin /opt/zimbra/conf/amavis.conf.in:
read_hash(\%whitelist_sender, ‘/opt/zimbra/whitelist’);
read_hash(\%blacklist_sender, ‘/opt/zimbra/blacklist’);
read_hash(\%spam_lovers, ‘/opt/zimbra/spamlovers’);
- Tạo tập tin /opt/zimbra/whitelist với nội dung:
domain.com
- Thêm vào tập tin /opt/zimbra/conf/spamassassin/local.cf nội dung sau:
trusted_networks your_ip
Lưu ý thay your_ip bằng ip tương ứng của bạn
- Khởi động lại các dịch vụ bằng lênh sau:
zmmtactl restart
zmamavisdctl restart
zmcontrol restart
2. Đưa địa chỉ thư nội bộ ra khỏi bộ quét virus, spam.
Để đưa địa chỉ thư nội bộ ra khỏi bộ quét virus, spam (Không bị kiểm tra nữa) ta làm như sau:
- Chỉnh nội dung tham số amavis_originating_bypass_sa thành true và chạy lệnh zmamavisdctl restart
- Một khi đã được bật, tất cả các thư được gửi từ địa chỉ nằm trong dải trustednetwork sẽ không bị đưa qua bộ lọc nữa.
Xem thêm tại đây
28 tháng 10, 2014
Các plugin tốt dành cho Notepad++
1. Compare:
Được sử dụng để so sánh 2 văn bản.
Plugin sẽ hỗ trợ đánh dấu các vị trí có sự khác biêt: bị xóa, nội dung không khớp, có nội dung mới,...
2. JSTool
Là công cụ hỗ trợ thao tác với các dữ liệu có định dạng JSON.
Tool sẽ giúp người lập trình định dạng lại dữ liệu để thuận tiện cho việc thao tác.
3. XML Tools
Là công cụ hỗ trợ định dạng lại dữ liệu XML để thuận tiện cho người phát triển.
4. Plugin Manager
Là công cụ hỗ trợ việc tìm kiếm và cài đặt các plugin khác nhau cho Notepad++
5. MIME Tools
Là công cụ hỗ trợ thao tác với các dữ liệu theo chuẩn MIME.
Chức năng của nó bao gồm: encode/decode chuẩn base64,...
Được sử dụng để so sánh 2 văn bản.
Plugin sẽ hỗ trợ đánh dấu các vị trí có sự khác biêt: bị xóa, nội dung không khớp, có nội dung mới,...
2. JSTool
Là công cụ hỗ trợ thao tác với các dữ liệu có định dạng JSON.
Tool sẽ giúp người lập trình định dạng lại dữ liệu để thuận tiện cho việc thao tác.
3. XML Tools
Là công cụ hỗ trợ định dạng lại dữ liệu XML để thuận tiện cho người phát triển.
4. Plugin Manager
Là công cụ hỗ trợ việc tìm kiếm và cài đặt các plugin khác nhau cho Notepad++
5. MIME Tools
Là công cụ hỗ trợ thao tác với các dữ liệu theo chuẩn MIME.
Chức năng của nó bao gồm: encode/decode chuẩn base64,...
13 tháng 9, 2014
fstab trong Linux
Fstab là gì? Hiểu nôm na nó là một tập tin hỗ trợ việc quản lý gắn kết (mount) và sử dụng các phân vùng của hệ điều hành.
Trong bài viết này, tôi sẽ giới thiệu cho bạn cách để làm chủ tập tin cấu hình này, tất nhiên là chỉ với những kiến thức nằm trong tầm hiểu biết của cá nhân tôi.
Cấu trúc chung của một fstab bao gồm các dòng có nội dung như sau:
Trong đó:
Device: là thiết bị hoặc phân vùng (có thể là đường dẫn của tập tin đại diện hoặc UUID của đối tượng), device được ở đây còn có thể là thiết bị mạng, phân vùng chia sẻ,...
Có thể xem thông tin UUID của thiết bị bằng lệnh: sudo blkid
Một ổ phân vùng thường có đường dẫn dạng: /dev/sdxy
Hoặc có dạng LABEL=label
Hoặc các dạng ổ mạng, chia sẻ:
File System Type: định dạng của thiết bị, có thể là:
Pass: định nghĩa thứ tự để ứng dụng fsck kiểm tra thiết bị nếu gặp lỗi trong quá trình khởi động, thường sẽ là 2, 1 chỉ nên dùng cho phân vùng root, 0 có nghĩa là tắt
Dưới đây là một ví dụ về nội dung tập tin fstab:
Trong bài viết này, tôi sẽ giới thiệu cho bạn cách để làm chủ tập tin cấu hình này, tất nhiên là chỉ với những kiến thức nằm trong tầm hiểu biết của cá nhân tôi.
Cấu trúc chung của một fstab bao gồm các dòng có nội dung như sau:
[Device] [Mount Point] [File System Type] [Options] [Dump] [Pass]
Trong đó:
Device: là thiết bị hoặc phân vùng (có thể là đường dẫn của tập tin đại diện hoặc UUID của đối tượng), device được ở đây còn có thể là thiết bị mạng, phân vùng chia sẻ,...
Có thể xem thông tin UUID của thiết bị bằng lệnh: sudo blkid
Một ổ phân vùng thường có đường dẫn dạng: /dev/sdxy
Hoặc có dạng LABEL=label
Hoặc các dạng ổ mạng, chia sẻ:
- Samba: //server/share
- NFS: //server:/share
- SSHFS : sshfs#user@server:/share
File System Type: định dạng của thiết bị, có thể là:
- auto
- vfat: dành cho các phân vùng có định dạng FAT
- ntfs, ntfs-3g: dành cho các phân vùng có định dạng NTFS
- ext2, ext3, ext4, jfs, reiserfs
- udf, iso9660: dành cho các ổ đĩa CD, DVD,
- swap.
- sync/async: tất cả các thao tác đọc, ghi trên thiết bị phải ở dạng đồng bộ/bất đồng bộ
- auto: tự động gắn kết phân vùng khi khởi động hệ điều hành.
- noauto: không tự động gắn kết phân vùng khi khởi động hệ điều hành.
- dev/nodev: tùy chọn này hiểu nôm na là cho phép hoặc không cho phép coi một node nằm ngoài thư mục /dev/ là một thiết bị (ví dụ nếu dùng nodev thì hệ điều hành sẽ coi việc định nghĩa thiết bị tại đường dẫn /home/dev/sda là bất hợp pháp).
- exec/noexec: cho phép hoặc không cho phép thực thi một tập tin có quyền exec trên thiết bị này.
- suid/nosuid: cho phép hoặc không cho phép các thao tác với các bit suid hoặc sgid
- ro: thiết bị ở dạng chỉ đọc.
- rw: thiết bị ở dạng đọc và ghi.
- user: cho phép người dùng có thể gắn kết ổ này, tùy chọn này sẽ tự động thực thi các tùy chọn rw, suid, exec, auto, nouser và async
- nouser: chỉ cho phép người dùng root gắn kết ổ, tùy chọn này tương ứng với tùy chọn defaults.
- defaults: bao tương ứng với các tùy chọn rw, suid, dev, exec, auto, nouser, async.
- _netdev: đây là một thiết bị mạng, chỉ thực hiện gắn kết sau khi khởi động card mạng. Chỉ có hiệu lực với các định dạng nfs và fstype.
Pass: định nghĩa thứ tự để ứng dụng fsck kiểm tra thiết bị nếu gặp lỗi trong quá trình khởi động, thường sẽ là 2, 1 chỉ nên dùng cho phân vùng root, 0 có nghĩa là tắt
Dưới đây là một ví dụ về nội dung tập tin fstab:
# /etc/fstab: static file system information. # #Và đây là một ví dụ về tập tin fstab quản lý một thiết bị mạng:proc /proc proc defaults 0 0 # /dev/sda5 UUID=be35a709-c787-4198-a903-d5fdc80ab2f8 / ext3 relatime,errors=remount-ro 0 1 # /dev/sda6 UUID=cee15eca-5b2e-48ad-9735-eae5ac14bc90 none swap sw 0 0 /dev/scd0 /media/cdrom0 udf,iso9660 user,noauto,exec,utf8 0 0
# FAT ~ Linux calls FAT file systems vfat) # /dev/hda1 UUID=12102C02102CEB83 /media/windows vfat auto,users,uid=1000,gid=100,dmask=027,fmask=137,utf8 0 0 # NTFS ~ Use ntfs-3g for write access (rw) # /dev/hda1 UUID=12102C02102CEB83 /media/windows ntfs-3g auto,users,uid=1000,gid=100,dmask=027,fmask=137,utf8 0 0 # Zip Drives ~ Linux recognizes ZIP drives as sdx'''4''' # Separate Home # /dev/sda7 UUID=413eee0c-61ff-4cb7-a299-89d12b075093 /home ext3 nodev,nosuid,relatime 0 2 # Data partition # /dev/sda8 UUID=3f8c5321-7181-40b3-a867-9c04a6cd5f2f /media/data ext3 relatime,noexec 0 2 # Samba //server/share /media/samba cifs user=user,uid=1000,gid=100 0 0 # "Server" = Samba server (by IP or name if you have an entry for the server in your hosts file # "share" = name of the shared directory # "user" = your samba user # This set up will ask for a password when mounting the samba share. If you do not want to enter a password, use a credentials file. # replace "user=user" with "credentials=/etc/samba/credentials" In the credentials file put two lines # username=user # password=password # make the file owned by root and ro by root (sudo chown root.root /etc/samba/credentials && sudo chmod 400 /etc/samba/credentials) # NFS Server:/share /media/nfs nfs rsize=8192 and wsize=8192,noexec,nosuid # "Server" = Samba server (by IP or name if you have an entry for the server in your hosts file # "share" = name of the shared directory #SSHFS sshfs#user@server:/share fuse user,allow_other 0 0 # "Server" = Samba server (by IP or name if you have an entry for the server in your hosts file # "share" = name of the shared directory
14 tháng 8, 2014
HA (High Avaibility) trong Linux với Heartbeat
Bài viết này tôi chỉ tập trung vào giải thích nguyên tắc hoạt động của Heartbeat khi được sử dụng để xây dựng giải pháp HA trên môi trường Linux.
Trước khi đi vào bài viết, có lẽ bạn nên xem qua bài viết IP ảo trong môi trường Linux để biết thêm một số khái niệm.
Về cơ bản, nguyên tắc hoạt động của Heartbeat là:
Giả sử ta có 2 máy chủ thành phần là A và B.
A có 2 card mạng:
eth0 - 10.0.0.10
eth1 - 192.168.1.2
B có 2 card mạng:
eth0 - 10.0.0.11
eth1 - 192.168.1.3
Ta cho hai card mạng eth1 của A và B thông với nhau để thực hiện nhiệm vụ đồng bộ dữ liệu (do DRBD thực hiện) đồng thời đây cũng là card mạng mà Heartbeat sử dụng để kiểm tra dịch vụ.
Hai card mạng eth0 kết nối ra internet.
Người dùng bên ngoài sẽ sử dụng dịch vụ tại địa chỉ IP 10.0.0.12 ( Bạn lưu ý thông số này và thông số của 2 card eth0 của 2 máy nhé )
Khi chạy Heartbeat, hệ thống sẽ tiến hành tạo ra một địa chỉ IP ảo là 10.0.0.12 cho hệ thống. Giả sử ta thiết lập cho nó hoạt động với card mạng eth0. Khi đó nếu ta gõ lệnh ifconfig eth0 thì sẽ thấy như sau:
Eth0:0 Link encap:Ethernet HWaddr 00:02:A5:4C:AF:8E
inet addr:10.0.0.12 Bcast:10.77.231.255 Mask:255.255.248.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Base address:0×5000 Memory:f7fe0000-f8000000
Như vậy, tại một thời điểm, Heartbeat sẽ chỉ gán địa chỉ IP này cho một máy trong cụm máy chủ HA, nếu máy chủ chính gặp lỗi nó sẽ chuyển địa chỉ này sang máy chủ dự phòng. ( Có một điểm tôi thắc mắc nhưng chưa xác nhận qua thực tế là liệu Heartbeat có thể hoạt động với các máy chủ có một card mạng hay không? - Bạn đọc nào có thời gian thử xác nhận lại giúp tôi xem.)
Trước khi đi vào bài viết, có lẽ bạn nên xem qua bài viết IP ảo trong môi trường Linux để biết thêm một số khái niệm.
Về cơ bản, nguyên tắc hoạt động của Heartbeat là:
- Theo dõi trạng thái của các máy chủ thành phần.
- Xác định một máy chủ thành phần gặp sự cố thông qua cơ chế tương tự như "ping" - ping không thấy thì coi như chết.
- Nếu máy chủ chính gặp sự cố, Heartbeat sẽ tiến hành gọi dịch vụ thay thế trên máy chủ dự phòng.
Giả sử ta có 2 máy chủ thành phần là A và B.
A có 2 card mạng:
eth0 - 10.0.0.10
eth1 - 192.168.1.2
B có 2 card mạng:
eth0 - 10.0.0.11
eth1 - 192.168.1.3
Ta cho hai card mạng eth1 của A và B thông với nhau để thực hiện nhiệm vụ đồng bộ dữ liệu (do DRBD thực hiện) đồng thời đây cũng là card mạng mà Heartbeat sử dụng để kiểm tra dịch vụ.
Hai card mạng eth0 kết nối ra internet.
Người dùng bên ngoài sẽ sử dụng dịch vụ tại địa chỉ IP 10.0.0.12 ( Bạn lưu ý thông số này và thông số của 2 card eth0 của 2 máy nhé )
Khi chạy Heartbeat, hệ thống sẽ tiến hành tạo ra một địa chỉ IP ảo là 10.0.0.12 cho hệ thống. Giả sử ta thiết lập cho nó hoạt động với card mạng eth0. Khi đó nếu ta gõ lệnh ifconfig eth0 thì sẽ thấy như sau:
Eth0:0 Link encap:Ethernet HWaddr 00:02:A5:4C:AF:8E
inet addr:10.0.0.12 Bcast:10.77.231.255 Mask:255.255.248.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Base address:0×5000 Memory:f7fe0000-f8000000
Như vậy, tại một thời điểm, Heartbeat sẽ chỉ gán địa chỉ IP này cho một máy trong cụm máy chủ HA, nếu máy chủ chính gặp lỗi nó sẽ chuyển địa chỉ này sang máy chủ dự phòng. ( Có một điểm tôi thắc mắc nhưng chưa xác nhận qua thực tế là liệu Heartbeat có thể hoạt động với các máy chủ có một card mạng hay không? - Bạn đọc nào có thời gian thử xác nhận lại giúp tôi xem.)
07 tháng 7, 2014
Một số ví dụ về cấu hình sử dụng log4j
Lưu ý, nội dung bài viết chỉ sử dụng cho mục đích tác giả tham khảo cho các lần sử dụng sau vì lý do có nhiều thứ quá tác giả không nhớ hết được nên tự ghi note ra đây. Bạn đọc nào thấy hữu ích thì có thể đọc còn không thì vui lòng bỏ qua nhé.
Khi sử dụng log4j, tôi chủ yếu tập trung sử dụng 2 tính năng là ghi ra màn hình console hoặc ghi ra tập tin.
Để sử dụng log4j trong java, bạn tạo tập tin log4j.properties và đặt nó vào thư mục gốc của package (đơn giản là tạo file và dán nó vào thư mục src).
Để log4j ghi thông tin ra màn hình bạn cấu hình như sau:
Để log4j ghi thông tin ra tập tin bạn cấu hình như sau:
Bạn có thể tham khảo thêm thông tin về cách cấu hình log4j tại đường link sau:
http://www.tutorialspoint.com/log4j/log4j_configuration.htm
http://logging.apache.org/log4j/1.2/manual.html
Khi sử dụng log4j, tôi chủ yếu tập trung sử dụng 2 tính năng là ghi ra màn hình console hoặc ghi ra tập tin.
Để sử dụng log4j trong java, bạn tạo tập tin log4j.properties và đặt nó vào thư mục gốc của package (đơn giản là tạo file và dán nó vào thư mục src).
Để log4j ghi thông tin ra màn hình bạn cấu hình như sau:
Trong đó INFO là cấp độ ghi log, stdout để báo cho log4j ghi thông tin ra màn hình.# Root logger option log4j.rootLogger=INFO, stdout # Direct log messages to stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
Để log4j ghi thông tin ra tập tin bạn cấu hình như sau:
Trong đó, INFO là cấp độ ghi log, và file để báo cho log4j ghi thông tin ra tập tin.# Root logger option log4j.rootLogger=INFO, file # Direct log messages to a log file log4j.appender.file=org.apache.log4j.RollingFileAppender #Redirect to Tomcat logs folder #log4j.appender.file.File=${catalina.home}/logs/logging.log log4j.appender.file.File=C:\\logigng.log log4j.appender.file.MaxFileSize=10MB log4j.appender.file.MaxBackupIndex=10 log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
Bạn có thể tham khảo thêm thông tin về cách cấu hình log4j tại đường link sau:
http://www.tutorialspoint.com/log4j/log4j_configuration.htm
http://logging.apache.org/log4j/1.2/manual.html
Đăng ký:
Bài đăng (Atom)