Mô hình của tớ gồm 4 máy ảo VirtualBox Node 1: management node, địa chỉ 192.168.56.205 Node 2: sql node, địa chỉ 192.168.56.206 Node 3: data node 1, địa chỉ 192.168.56.207 Node 4: data node 2, địa chỉ 192.168.56.208
- Sử dụng Centos 6.4, 32 bits - Linux kernel 2.6.32-358.el6.i686 - Phiên bản MySQL Cluster MySQL-Cluster-gpl-7.3.6-2.el6.i686.rpm-bundle.tar - RAM 128MB - Đã tắt firewall iptables trên tất cả 4 máy: service iptables stop - Đã disable selinux
- Trên cả 4 node, tớ đều cài gói MySQL-Cluster-server-gpl-7.3.6-2.el6.i686.rpm và MySQL-Cluster-shared-compat-gpl-7.3.6-2.el6.i686.rpm - Riêng trên node 2 - sql node, tớ còn bổ sung thêm gói cài MySQL-Cluster-client-gpl-7.3.6-2.el6.i686.rpm
Trên node 1 - management node - Tớ tạo thư mục /var/lib/mysql-cluster, gán quyền sở hữu mysql:mysql - Thiết lập file cấu hình /var/lib/mysql-cluster/config.ini có nội dung: [ndbd default] NoOfReplicas=2 DataMemory=80M IndexMemory=18M [tcp default] portnumber=2202 [ndb_mgmd] hostname=192.168.56.205 datadir=/var/lib/mysql-cluster [ndbd] hostname=192.168.56.207 datadir=/usr/local/mysql/data [ndbd] hostname=192.168.56.208 datadir=/usr/local/mysql/data [mysqld] hostname=192.168.56.206 Trên node 2 - sql node [mysqld] datadir = /var/lib/mysql port = 3306 log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid ndbcluster [mysql_cluster] ndb-connectstring=192.168.56.205 Trên node 3 và node 4 - các data node - Tạo thư mục /usr/local/mysql/data, gán quyền sở hữu mysql:mysql - Cấu hình /etc/my.cnf như sau: [mysqld] ndbcluster [mysql_cluster] ndb-connectstring=192.168.56.205
Tại management node, tớ chạy: ndb_mgmd -f /var/lib/mysql-cluster/config.ini Lần lượt trên các data node 1 và 2, tớ chạy ndbd Cuối cùng trên sql node, tớ chạy mysqld_safe &
ndb_mgm> show Connected to Management Server at: localhost:1186 Cluster Configuration [ndbd(NDB)] 2 node(s) id=2 (not connected, accepting connect from 192.168.56.207) id=3 @192.168.56.208 (mysql-5.6.19 ndb-7.3.6, starting, Nodegroup: 0) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.56.205 (mysql-5.6.19 ndb-7.3.6) [mysqld(API)] 1 node(s) id=4 (not connected, accepting connect from any host)
Có bạn nào hứng thú trả lời mấy câu hỏi này không nhỉ?Câu hỏi của anh quanta có ai trả lời không ạ ? Bây giờ em cũng muốn thu thập các thống kê kiểu này từ wireshark mà không biết cách ?]]>e. Có bao nhiêu requests xảy ra trong một giây, một phút, 5 phút đi từ cùng một IP và có cùng một User-Agent? f. Có bao nhiêu User-Agents khác nhau đi từ một IP trong một khoản thời gian nào đó?
explorer88 wrote:[1]: telnet client không gửi FIN, ^C được gửi đi và FIN sau đó gửi bởi server, client không có TIME_WAIT [2]: sock client gửi FIN, client có trạng thái TIME_WAIT Mr.Khoai wrote:
Tại bước 3, khi tắt client thì client sẽ gửi FIN, nhận ack, server cũng gửi FIN lại, client trả lời bằng ack rồi rơi vào trạng thái TIME_WAIT.Vậy nghĩ là trạng thái TIME_WAIT là của client.
explorer88 wrote:[1]: Vì gửi FIN nên server có trạng thái TIME_WAIT, nhưng server đồng thời vẫn LISTEN, kill server, không còn trạng thái LISTEN nhưng vẫn còn TIME_WAIT (Ở trạng thái TIME_WAIT, socket đó không có gắn với một process nào cả nên không kill được), start server, server lại LISTEN, TIME_WAIT của socket cũ vẫn còn đó, stop server thì mất LISTEN, còn TIME_WAIT thì cứ hết 2MSL thì biến mất. Lúc đầu em cứ tưởng đây là tác động của tcp_tw_reuse nhưng kiểm tra nữa thì tcp_tw_reuse=0 hay =1 thì case này vẫn thế. [2]: Vì không gửi FIN nên server không có trạng thái TIME_WAIT, kill sock server, không có trạng thái gì hết, start sock server, server lại LISTEN, stop không có trạng thái gì. Riêng với sock server em thử chạy với tham số -A (SO_REUSEADDR) thì tính năng reuse được thể hiện (cũng bất kể tcp_tw_reuse =0 hay =1). Khi ấy kiểm tra thì em thấy sock server vừa LISTEN vừa có socket cũ ở trạng thái TIME_WAIT như trong case với telnet server. Sau cuộc kiểm tra, em thấy cư xử của telnet server hơi lạ, cần xem xét thêm, còn hiệu lực của tcp_tw_reuse em vẫn chẳng thấy đâu cả :(]]>
Tại bước 4, kill server, server chết luôn, server không có phục vụ client nào từ trước khi kill nên em chẳng thấy có trạng thái gì cả.Vậy nghĩa là server sẽ không thấy trạng thái TIME_WAIT. Mình thử start/stop nhiều lần coi server của mình có trạng thái gì không? Sau đó, mình thử dùng lại chương trình sock rồi start/stop nhiều lần coi sao.
Chưa cần mở source ra đọc đâu. Bạn thử chạy `tcpdump` trong 2 trường hợp rồi so sánh xem.Anh có phải decrypt ssh payload ra không ạ ? Em tcpdump cả hai trường hợp rồi nhìn từ tầng tcp xuống thấy không có gì đặc biệt, data trong ssh bị mã hoá hết em không đọc được. Khác duy nhất giữa hai lần tcpdump là với trường hợp có thông báo Received message too long thì client sẽ send FIN để kết thúc phiên. Anh bật mí thêm được không, em bí rồi :(]]>
Bash attempts to determine when it is being run with its standard input connected to a network connection, as when executed by the remote shell daemon, usually rshd, or the secure shell daemon sshd. If bash determines it is being run in this fashion, it reads and executes commands from ~/.bashrc--> Khi chạy sftp một remote bash được mở ra nhận data input từ network connection. Bash này là một non-interactive, non-login shell và chỉ đọc ~/.bashrc. Khi đọc đến file này, gặp các output từ echo, stfp thấy bối rối nên nó ném exception và kết thúc. Còn lý do tại sao nó bối rối thì chắc nằm trong mã nguồn của nó. Vài thông tin bổ sung hi vọng giúp ích cho bạn.]]>
echo "test123test" > ~/input.txt
#!/bin/bash echo "pid = $$" exec 0<"/home/username/input.txt" read -p "Enter name: " test echo "--->$test<----" exit 0
Hello explorer88, Bạn thử ghi dữ liệu vào fd 0 của script bằng cách nào? Vô hiệu là vô hiệu sao? khoaiHôm nay lặp lại thí nghiệm em thử echo "text" > /proc/PID/fd/0 hay mở file 0 ra bằng vi rồi ghi thẳng lên thì thấy dữ liệu đẩy thẳng vào terminal của em. Không hiểu sao trước mình làm gì mà không được nhỉ :D Kiếm tra thì thấy các file 0,1,2 đều là symbolic link trỏ đến terminal mà em đang chạy script nên việc dữ liệu hiển thị thế là đúng rồi. Nhưng ở đây em thấy có một điều lạ là em đẩy dữ liệu vào có dấu xuống dòng echo -e "test\n" hay echo -e "test\n\r" thì script của em vẫn không kết thúc lệnh đọc dữ liệu. Code:
#!/bin/bash echo "pid = $$" read -p "Enter name: " test echo $test exit 0
Tại vì độ trễ của Network nên tcp không thể đóng kết nối ngay lập tức để chờ những gói tin còn lại nếu có, nó phải chờ một khoảng thời gian time-out để đống kết nối hoàn toàn (CLOSED) sau khi connection đã ở tình trạng close (TIME_WAIT). Theo như tài liệu thì net.ipv4.tcp_tw_reuse=1 sử dụng connection ở trạng thái TIME_WAIT để phục vụ new connection. Nếu vậy, - B1: telnet đến một con server port 80. ===>>> 1 connection ESTABLISHED - B2: ngắt kết nối. ===>>> TIME_WAIT - B3: connect lại tới server port 80. ===>>> tạo 1 connection ESTABLISHED mới và connection cũ vẫn ở trong tình trạng TIME_WAIT Đáng lẽ tại B3, connection TIME_WAIT phải đc sử dụng để phục vụ connection mới chứ nhỉ. :(Tại bước 3, bạn từ client lại request đến server thì OS phía client cấp cho bạn một ephemeral port ngẫu nhiên khác với port đang trong trạng thái TIME_WAIT nên bạn thấy có một connection ESTABLISHED còn connection cũ vẫn ở trong tình trạng TIME_WAIT. Bạn có thể dùng sock để ép client sử dụng một port xác định mà bạn muốn: sock -b<client port> <server ip> <server port> Download: http://www.icir.org/christian/sock.html]]>
explorer88, Thật ra lý thuyết vẫn đúng, mà bạn cũng đúng. Lý do là bạn đang đòi "reuse" hai thứ khác nhau. Nếu bạn có vỉtualbox hay vmware player thì hãy thử như sau: 1. Máy thật là máy A, dùng để chạy server. Máy ảo là máy B, dùng để chạy client. 2. Không thay đổi cấu hình gì hết, thử chạy server trên máy A. 3. Dùng client từ máy B connect vào máy A, phải đảm bảo là connect được. 4. Ngắt kết nổi. Chạy netstat trên máy B để thấy TIME_WAIT 5. Kill server, chạy netstat trên máy A. Bạn có thấy status gì lạ không? 6. Thử restart server coi được không? Túm lại, mình thử nghĩ TIME_WAIT là status gì, tại sao phải có TIME_WAIT status. Nếu mình muốn server của mình stop rồi start liền thì làm sao? khoai PS: Câu hỏi khá hay mà không ai thèm trả lời :(Chào anh Khoai. Em lập topic đã lâu cứ tưởng không còn ai trả lời nữa. Hôm qua đi dạo thấy chủ đề này có reply thì quay lại thử nghiệm tiếp :D TIME_WAIT status là trạng thái chỉ có ở endpoint thực hiện active close trên cơ sở hai đầu đã phải thực hiện bắt tay ba bước thành công. Tóm tắt sơ qua quá trình thì như sau: Endpoint (client hoặc server) muốn đóng kết nối. Nó gửi FIN. Lúc này endpoint rơi vào trạng thái FIN_WAIT_1 có nghĩa là đã gửi yêu cầu đóng nhưng đang đợi xác nhận từ đầu còn lại. Nếu nhận được ack từ đầu còn lại thì endpoint này sẽ chuyển tiếp sang trạng thái FIN_WAIT_2 có nghĩa là kết nối đang ở trạng thái half close. Endpoint này chắc chắn sẽ không còn gửi dữ liệu ra nữa, nó chỉ còn có nhiệm vụ nhận dữ liệu từ đầu kia và xác nhận bằng cách trả lời ack cho đầu kia. Đầu kia vẫn có thể tiếp tục nói chuyện. Khi nào đầu còn lại gửi FIN để yêu cầu đóng kết nối hoàn toàn thì endpoint này sẽ ack cho gói FIN đó rồi chuyển sang trạng thái TIME_WAIT. Lý do phải có TIME_WAIT vì cần đảm bảo ack gửi đi đến được đầu còn lại. Trạng thái TIME_WAIT mang nghĩa là endpoint đã gửi ack rồi và nó sẽ có nhiệm vụ đợi để đảm bảo gói ack nó gửi không bị thất lạc. Để chắc chắn được điều này, endpoint sẽ phải chờ một khoảng thời gian là 2MSL = 2*Maximum Segment Length. Quãng thời gian này kéo dài khoảng 2-4 phút. Trong quãng thời gian này nếu gói ack bị thất lạc thì đầu kia sẽ phải truyền lại FIN. Nếu không có trạng thái TIME_WAIT, endpoint này gửi ack xong rồi CLOSED luôn thì đầu kia có thể không nhận được ack sẽ gửi lại FIN đến. Tình huống lúc này sẽ diễn ra là đầu kia gửi FIN đến một socket không tồn tại (do bị đóng trước đó) hoặc endpoint này không biết FIN này thuộc về connection nào. Trong cả hai trường hợp thì endpoint đều trả lời bằng RST làm đóng luôn kết nối từ đầu kia. Như phân tích thì nếu không có trạng thái TIME_WAIT, một hành vi đóng kết nối thông thường có thể dẫn đến phát sinh gói RST. Bình thường, TCP không cho phép các hành vi sử dụng các port đang nằm trong TIME_WAIT. Để thực hiện điều này thì em tìm thấy có hai cách là: điều chỉnh giá trị tcp_tw_reuse hoặc tcp_tw_recycle. Theo đánh giá từ tài liệu thì tcp_tw_cycle gặp vấn đề trong môi trường NAT và load balancing nên tcp_tw_reuse là lựa chọn an toàn hơn. Em thử nghiệm điều chỉnh tcp_tw_recycle thì thấy có hiệu lực nhưng riêng với tcp_tw_reuse thì vẫn chưa được. Em tìm hiểu mãi rồi mà vẫn không thấy mình làm sai ở đâu :( Còn chuyện anh hỏi stop và start server thì em chưa trả lời được vì em có kiểm tra thì thấy khá ngộ là: Em thử chạy một telnet server trên máy thật, cho một con client kết nối từ máy ảo. Kết nối đã hình thành rồi. Em thử stop dịch vụ telnet thì em kiểm tra trên wireshark thì thấy server chẳng gửi ra gì cả. Kiêm tra netstat thì thấy server port 23 cũng chẳng còn Từ client trên máy ảo em vẫn truyền dữ liệu đi, bắt trên wireshark thấy server vẫn trả lời Em thử đóng client thì thấy quá trình đóng kết nối 4 bước vẫn đầy đủ. Server muốn start stop bao nhiêu lần cũng được, kết nối từ client vẫn không bị mất. Em không hiểu được điều gì diễn ra ở cuộc kiểm tra trên nên chưa trả lời anh được ạ. Giờ đến thí nghiệm mà anh đề nghị: Tại bước 3, khi tắt client thì client sẽ gửi FIN, nhận ack, server cũng gửi FIN lại, client trả lời bằng ack rồi rơi vào trạng thái TIME_WAIT. Tại bước 4, kill server, server chết luôn, server không có phục vụ client nào từ trước khi kill nên em chẳng thấy có trạng thái gì cả. Tại bước 5, chạy server lại được luôn. Nhưng anh ơi, server lúc này có rơi vào trạng thái TIME_WAIT nên chạy được luôn mà. Hiện tại em vẫn chưa thể thấy được hiệu lực của tcp_tw_reuse anh ạ :(]]>
explorer88 wrote:Em tìm hiểu thì biết: Double quote sẽ cho phép bash diễn dịch các ký tự đặc biệt như $ * @ trong string. Còn single quote sẽ ngăn cản sự diễn dịch của bash lên các ký tự đặc biệt đó. Thay vì phải dùng backslash character để escape các ký tự đặc biệt này trong double quote thì chỉ cần bao ngoài string bằng single quote. Em đã chạy thử lại ví dụ với double quote Code:
... sử dụng one-line bash script trực tiếp không cần đến test2.sh nữa thì #!/bin/bash export test=123 bash -c 'echo $test' cũng cho ra kết quả đúng như lý thuyết nhưng có một điểm lạ là string đằng sau bash -c phải đặt trong single quote chứ nếu đặt trong double quote dù có export hay không có export thì giá trị test vẫn được in ra. Em đang dùng bash shell version 4.2.24(1)-release (i686-pc-linux-gnu).Có khi nào `test` env variable vẫn đang có giá trị là "123" do bạn chạy `export` từ ngoài command line từ trước rồi không. Thử tìm hiểu xem: với bash, single quotes với double quotes khác nhau như nào.
#!/bin/bash export test=123 bash -c "echo $test"
#!/bin/bash export test=123 echo "pid of parent shell = $$" bash -c "echo pid of new shell = $$ and value of test var = $test"
#!/bin/bash export test=123 echo "pid of parent shell = $$" bash -c 'echo pid of new shell = $$ and value of test var = $test'
#!/bin/bash export test=123 bash echo $test
#!/bin/bash export test=123 bash "test2.sh" # lệnh tương đương sh "test2.sh"
#!/bin/bash echo "$test"
sock -v -s 9999
telnet 127.0.0.1 9999
netstat -aon | grep 9999
sysctl -w net.ipv4.tcp_tw_reuse=1 sysctl -p
export test=123 bash echo $test
#!/bin/bash export test=123 bash echo $test