ETL tool of Oracle

Oracle has 4 ETL tools:

  • ODI: the one from Sunopsis. This is the future.
  • OWB: the old OWB (without the new ODI functions), available with Oracle DB. Aka “Basic ETL”.
  • ODIEE: bundled license of OWB & ODI. EE stands for “Enterprise Edition”.
  • OWBEE: modified OWB, with the new ODI functions. EE stands for “Enterprise ETL”, not “Enterprise Edition”

https://docs.oracle.com/cd/B19306_01/server.102/b14223/ettover.htm

https://www.oracle.com/tools/downloads/apex-v191-downloads.html

Crawl dữ liệu với selenium

Mình vẫn hay phải crawl dữ liệu chơi chơi để làm một số công việc tự động. Ví dụ crawl vài trang blog hoặc web về IT để đưa lên máy đọc sách để đọc. Ngôn ngữ sử dụng thì trước là C#, sau là NodeJS và gần đây nhất là Python.

Mình gặp một vấn đề khi crawl là một số trường hợp không thể lấy được dữ liệu. Lần gần đây nhất mà mình tạm bỏ qua đó là trang Kipalog, mình không lấy được số lượt lưu trữ của mỗi bài viết. Khi load HTML thì các thuộc tính của nó không chứa dữ liệu. Hoặc 1 blog khác thì không lấy được các comment của bài viết…

Cũng nghe từ lâu rồi nhưng nay phải note lại để nghiên cứu làm thử. Đó là sử dụng selenium để crawl dữ liệu với những trang web sử dụng ajax để load dữ liệu, có capcha hoặc trang bắt phải login…

Selenium thường được biết đến là một môi trường test tự động cho trình duyệt web. Khi mình cần test website tự động thì cần dùng đến công cụ này… Mình sẽ tìm hiểu để triển khai thử việc test và crawl dữ liệu với Selenium.

Sức mạnh của Index trong Database

Việc nghe nói về tác dụng của Index trong quá trình Turning Database nói chung và Oracle nói riêng từ rất lâu. Việc cảm nhận thấy được tốc độ truy vấn, các chỉ số liên quan tới quá trình Turning như I/O… trong quá trình thực thi thấy rất rõ ràng. Những việc này mình thấy được do những người khác chỉ, bản thân thấy được trước và sau quá trình người khác đánh Index để sử dụng. Về tầm quan trọng và sức mạnh của Index trong Database là không cần bàn cãi.

Vừa rồi mình có phải build một luồng nghiệp vụ hoàn toàn mới cho một quy trình nghiệp vụ mới. Cụ thể là mỗi một khách hàng mới cần phải có một mã OTP để nhắn tin xác thực số điện thoại. Mã OTP là ngẫu nhiên, có thể là chữ hoặc số.
Sau khi phân tích và họp, hệ thống sẽ sinh trước mã OTP. Mỗi mã OTP gồm 5 ký tự có thể có cả chữ hoặc số. Toàn bộ các mã OTP này được sinh ra và lưu vào 1 bảng, hàng ngày hệ thống sẽ quét các khách hàng mới và tiến hành cập nhật ngẫu nhiên vào bảng này. Bảng này sẽ có (10+26)(10+26)(10+26)(10+26)(10+26) = 60 triệu dòng.
Hàng ngày có dưới 1000 khách hàng mới nên hệ thống xử lý cũng hơi chậm nhưng không có gì đáng ngại khi lấy ngẫu nhiên các mã OTP để cập nhật khách hàng, lấy ngẫu nhiên mỗi mã OTP mất hơn 1s.

Nhưng hôm vừa rồi, hệ thống cần đồng bộ gần 100.000 khách hàng mới vào và cũng có yêu cầu xác thực nên phải lấy ngẫu nhiên từng đó mã OTP. Việc này khi chạy thì đúng là không ổn chút nào. Nếu để chạy bình thường thì phải vài ngày mới có thể chạy xong, như vậy không đảm bảo tiến độ. Tình thế này buộc mình phải xem lại phương thức lấy ngẫu nhiên mã OTP. Vì không muốn thay đổi quy tắc lấy ngẫu nhiên nên mình tập trung vào tối ưu câu truy vấn. Khi kiểm tra độ phức tạp và I/O của câu lệnh lấy thì mình thấy việc lấy mã OTP rất nặng. Phải thôi, lấy ngẫu nhiên 1 trong 60 triệu dòng mà phải loại đi những mã OTP đã qua sử dụng thì khá nặng rồi.
Mình kiểm tra thì đúng là mình chưa đánh Index cho bảng này, thế là việc đầu tiên mình tiến hành đánh Index và đo lại thì hiệu quả thật không ngờ. Tốc độ lấy mã OTP của một khác hàng giảm xuống còn ~0.0016s. Mình chạy cho 100.000 khách hàng mất chưa tới 3 phút là xong. Công việc hàng ngày khoảng 1000 khách hàng thì chưa tới 2s đã chạy xong.

Sử dụng Index còn cần phải quan tâm đến quá trình Insert, Update dữ liệu. Nhưng hệ thống mình thì trường đánh Index này chỉ sinh ra một lần và không có thao tác update vào trường Index nên không phải quan tâm đến nó. Sau việc này đúng là mình đã thực sự bị thuyết phục bởi sức mạnh của Index trong Database. Bài học sau này cần vận dụng nhiều hơn tới Index trong quá trình triển khai hệ thống.

Install wordpress on LAMP with CentOS

Trong khuôn khổ việc tìm hiểu và sử dụng APACHE, NGINX bước đầu mình sẽ dựng trước một blog wordpress trên server CentOS. Việc cài đặt sẽ thực hiện trên máy ảo CentOS dựng trên máy cá nhân của mình. Vừa rồi hệ thống bắt buộc sử dụng proxy để ra ngoài Internt nên mình bị chững lại để giải quyết. Giải pháp đã được cập nhật tại bài này.

Step 1: Installing Remi Repository on CentOS

yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm

Step 2: Config using default php 7

 yum install yum-utils
 yum-config-manager --disable remi-php54
 yum-config-manager --enable remi-php73

Step 3: Install LAMP: Linux, Apache, Mariadb (No using MySQL), PHP

 # yum install httpd mariadb mariadb-server php php-common php-mysql php-gd php-xml php-mbstring php-mcrypt
 #  systemctl start mariadb
 #  mysql_secure_installation
 #  systemctl enable mariadb
 #  systemctl start httpd
 #  systemctl enable httpd

Step 4: Create database for Worpress.

 mysql -u root -p
 CREATE DATABASE wordpress;
 CREATE USER [email protected] IDENTIFIED BY "secure_password";
 GRANT ALL ON wordpress.* TO [email protected];
 FLUSH PRIVILEGES;
 exit;

Step 5: Prepare for install Worpress

Go to http://wordpress.org, download last version Worpress
Using terminal go to folder downloaded:

 cd /home/pktuy/download
 tar -xvzf wordpress.version.tar.gz -C /var/www/html
 chown -R apache /var/www/html/wordpress

Step 6:(maybe not) Creating Apache Virtual Host for WordPress

vim /etc/httpd/conf/httpd.conf

Add line:

<-VirtualHost *:80->
   ServerAdmin [email protected]
   DocumentRoot /var/www/html/wordpress
   ServerName tecminttest.com
   ServerAlias www.tecminttest.com
   ErrorLog /var/log/httpd/tecminttest-error-log
   CustomLog /var/log/httpd/tecminttest-acces-log common 
</VirtualHost->

Restart apache:

systemctl restart httpd

Step 7: Install blog WordPress

Access htt://localhost and next…

Config Proxy for YUM of CentOS

Công ty mình mới bắt đầu áp dụng quy tắc mọi máy tính ra Internet đều phải sử dụng proxy. Nói chung không vấn đề gì lắm về việc thiết lập proxy cho máy mình đang sử dụng là Window. Đơn giản nhất là vào mục cài đặt của GoogleChorme tìm Proxy thì cài đặt được luôn cho cả máy tính (cấu hình của Window).

Nhưng tất cả các máy ảo mình đã tạo trước đó thì đều không truy cập được Internet mặc dù mình đã sử dụng các cấu hình NAT… Sau đó nghĩ rằng cũng phải cài đặt Proxy cho nó như máy vật lý thì máy ảo Window thì cài đặt thành công.

Nhưng đối với máy ảo CentOS thì gặp vấn đề. Việc thường xuyên phải sử dụng command line để cài đặt các gói phần mềm thì đều không thể được. Khi thiết lập proxy cho trình duyệt Firefox thì vào được bình thường nhưng các lệnh YUM thì không thể sử dụng để kết nối internet được. Về sau có một anh đội Network nói sơ qua thì mình mới chỉ thiết lập ở Firefox thì YUM không được, phải thiết lập ở sâu trong config mới đảm bảo được.

Như vậy, để truy cập được Internet thông qua Proxy thì phải thực hiện như sau:

Muốn vào Internet bằng trình duyệt

Cấu hình proxy cho trình duyệt, cụ thể ở đây là Firefox. Nói chung cái này cài đặt rất đơn giản và chỉ cần cài đặt ở Firefox.

Muốn sử dụng các câu lệnh cài đặt phần mềm

Muốn sử dụng các câu lệnh cài đặt phần mềm, YUM, cài đặt… thì phải cấu hình bên trong hệ điều hành CentOS.

Đầu tiên là: Enable proxy for yum in configuration file.

Hoặc đội Network sẽ cung cấp tài khoản và địa chỉ Proxy dùng chung hoặc nếu toàn bộ hệ thống sử dụng join domain thì dùng chính tài khoản join domain để thiết lập proxy.

Để xem config hiện tại:

cat /etc/yum.conf

Để sửa config sử dụng:

sudo vi /etc/yum.conf

Cấu hình proxy thì thêm 3 dòng sau:

 proxy=http://hnoproxy01:8080
proxy_username=user_u
proxy_password=pass_u

Using profile proxy (User specific)

Xem config hiện tại:

cat ~/.bash_profile

Chỉnh sửa config:

vi ~/.bash_profile hoặc sudo vi ~/.bash_profile

Thêm 2 dòng sau vào profile:

http_proxy="http://user_u:[email protected]:8080"
export http_proxy

Alternate way to configure proxy settings for yum command

Xem cấu hình:

cat /etc/environment

Sửa cấu hình:

sudo vi /etc/environment

Thêm các dòng sau vào file cấu hình:

 export http_proxy=http://user_u:[email protected]:8080
 export https_proxy=http://user_u:[email protected]:8080
 export ftp_proxy=http://user_u:[email protected]:8080
 export no_proxy=127.0.0.1,localhost

Thế là xong, thử cập nhật lại các repo:

yum repolist

Hoặc cập nhật luôn hệ điều hành:

sudo yum install update

Một điều lưu ý xương máu mà mình phải trả giá bằng rất nhiều thời gian là ban đầu mình sử dụng tài khoản proxy dùng chung của Network. Trong các config thì tài khoản ngăn cách địa chỉ proxy bằng ký tự @, mà trong mật khẩu chứa @ nên hệ thống hiểu sai. Khi mình sử dụng tài khoản join domain của mình không có ký tự @ thì được.

Reverse proxy vs Forward proxy

Proxy hay Proxy Server làm nhiệm vụ đứng giữa client và web server ứng dụng. Nó có vai trò bảo vệ client hoặc webserver tùy theo loại của chúng. Có 2 loại proxy là Reverse proxy vs Forward proxy:

1- Forward proxy thường được sử dụng trong các doanh nghiệp. Nó cùng với với tường lửa, router để bảo vệ, kiểm soát người dùng ra ngoài Internet. Proxy này ghi log, cho phép người dùng được truy cập các trang web nào, thời điểm nào… Đảm bảo tính ẩn danh của người dùng trước các web ghi lại thông tin người truy cập.

2- Reverse proxy thì ngược lại, nó tiến hành bảo vệ web server trước các client. Nó tiến hành ghi log, đứng trước bảo vệ các webserver đằng sau, ngăn không cho client gửi yêu cầu tới webserver trực tiếp. Nó cũng đóng vai trò như các bộ điều hướng, kiểm soát các client để phân bổ tới các ứng dụng định sẵn. Hơn nữa Reverse proxy có thể đóng thêm vai trò cân bằng tải (Load Balancer)

Tìm hiểu tiếp phần này thấy có khá nhiều thứ hay ho. Ta mở rộng thêm các khái niệm về Load Balancer, High-Availability đi kèm là HAProxy và Keepalived.

Đối với Apache thì có các module Proxy, module HAProxy, module Keepalived để làm Cân bằng tải.
Chuyên biệt hơn ta có Piranha Load Balancer, với cấu hình trực quan để làm Load Balancer.

Ta cũng có thể sử dụng NGINX làm proxy cho Apache.

Một số link tham khảo thêm Reverse proxy vs Forward proxy:
https://tech.bizflycloud.vn/tong-quan-ve-haproxy-va-load-balancing-20180712085354307.htm
http://congdonglinux.vn/piranha-load-balancer/
https://anninhmang.edu.vn/cau-hinh-high-available-load-balancer-voi-haproxy-va-keepalived/
https://vicloud.vn/community/huong-dan-su-dung-apache-nhu-mot-reverse-proxy-bang-cong-cu-mod-proxy-tren-centos-7-376.html
https://thachpham.com/linux-webserver/nginx-reverse-proxy-cho-apache.html
https://kipalog.com/posts/Web-Server—Tan-man-PHP-Handler-va-Apache

WordPress Framework

WordPress Framework là nền tảng xây dựng nên các theme nói chung. Nghĩa là theme WordPress không cần xây dựng từ đầu mà có thể base trên một theme nào đó sử dụng WordPress Framework. Cái này có free và có trả phí. có thể làm theme, plugin…

Cần nghiên cứu để sửa theme cho blog.

Nếu bạn là một Hosting Provider để đáp ứng nhu cầu trên thì bạn nên quan tâm đến control Plesk. Plesk có thể đáp ứng nhu cầu của bạn.

C10K problem – Vấn đề C10K

Vấn đề C10K là vấn đề cần giải quyết cho webserver với 10.000 kết nối cùng một lúc. Cho tới bây giờ thì bài toán được nới rộng hơn tới hàng triệu kết nối cùng một lúc.

NGINX webserver

NGINX là một webserver mã nguồn mở ban đầu được thiết kế để giải quyết bài toán C10K (sử dụng kiến trúc hướng sự kiện, bất đồng bộ) thay cho Apache sử dụng kiến trúc tạo thread cho mỗi request.

Nhưng ngày nay NGINX còn được phát triển để dùng làm reverse proxy, HTTP load balancer và email proxy như IMAP, POP3, và SMTP.

Apache vs Apache Tomcat

Cũng hay tiếp xúc với phần này nhưng để nhìn nhận rõ xem sự khác nhau giữa Apache và Apache Tomcat thì mình chưa tìm hiểu kỹ.

Cả 2 phần mềm này đều được điều hành và phát triển bởi Apache Software Foundation. Nhưng cả hai đều là miễn phí và nguồn mở, chiếm phần lớn về thị phần webserver trên toàn thế giới.

Theo mình nắm được thì:

Apache là webserver hỗ trợ http và https, được sử dụng cho các website tĩnh (???) được viết bằng C dạng Module có hỗ trợ cho các ngôn ngữ lập trình để dựng ứng dụng như PHP, Python, Perl…

Apache Tomcat được viết bằng JAVA tạo riêng cho các app Java. Nó được coi là container chứa Servlet/JSP.

Apache là cơ bản, đa nền tảng, được sử dụng phổ biến nhưng hiệu suất khi có số lượng kết nối cùng lúc lớn thì kém hiệu quả. So với NGINX mới phát triển thì hiệu suất cao hơn nhiều, giải quyết được bài toán hàng chục ngàn kết nối cùng một lúc. Vấn đề hàng chục ngàn kết nối cùng lúc là vấn đề C10K.